OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 // Leaves rdx and rax unchanged. SmiOperands assumes both are smis. | 267 // Leaves rdx and rax unchanged. SmiOperands assumes both are smis. |
268 // NumberOperands assumes both are smis or heap numbers. | 268 // NumberOperands assumes both are smis or heap numbers. |
269 static void LoadSSE2SmiOperands(MacroAssembler* masm); | 269 static void LoadSSE2SmiOperands(MacroAssembler* masm); |
270 static void LoadSSE2NumberOperands(MacroAssembler* masm); | 270 static void LoadSSE2NumberOperands(MacroAssembler* masm); |
271 static void LoadSSE2UnknownOperands(MacroAssembler* masm, | 271 static void LoadSSE2UnknownOperands(MacroAssembler* masm, |
272 Label* not_numbers); | 272 Label* not_numbers); |
273 | 273 |
274 // Takes the operands in rdx and rax and loads them as integers in rax | 274 // Takes the operands in rdx and rax and loads them as integers in rax |
275 // and rcx. | 275 // and rcx. |
276 static void LoadAsIntegers(MacroAssembler* masm, | 276 static void LoadAsIntegers(MacroAssembler* masm, |
277 Label* operand_conversion_failure); | 277 Label* operand_conversion_failure, |
| 278 Register heap_number_map); |
| 279 // As above, but we know the operands to be numbers. In that case, |
| 280 // conversion can't fail. |
| 281 static void LoadNumbersAsIntegers(MacroAssembler* masm); |
278 }; | 282 }; |
279 | 283 |
280 | 284 |
281 // ----------------------------------------------------------------------------- | 285 // ----------------------------------------------------------------------------- |
282 // CodeGenerator implementation. | 286 // CodeGenerator implementation. |
283 | 287 |
284 CodeGenerator::CodeGenerator(MacroAssembler* masm) | 288 CodeGenerator::CodeGenerator(MacroAssembler* masm) |
285 : deferred_(8), | 289 : deferred_(8), |
286 masm_(masm), | 290 masm_(masm), |
287 info_(NULL), | 291 info_(NULL), |
(...skipping 9633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9921 | 9925 |
9922 void FloatingPointHelper::LoadSSE2SmiOperands(MacroAssembler* masm) { | 9926 void FloatingPointHelper::LoadSSE2SmiOperands(MacroAssembler* masm) { |
9923 __ SmiToInteger32(kScratchRegister, rdx); | 9927 __ SmiToInteger32(kScratchRegister, rdx); |
9924 __ cvtlsi2sd(xmm0, kScratchRegister); | 9928 __ cvtlsi2sd(xmm0, kScratchRegister); |
9925 __ SmiToInteger32(kScratchRegister, rax); | 9929 __ SmiToInteger32(kScratchRegister, rax); |
9926 __ cvtlsi2sd(xmm1, kScratchRegister); | 9930 __ cvtlsi2sd(xmm1, kScratchRegister); |
9927 } | 9931 } |
9928 | 9932 |
9929 | 9933 |
9930 void FloatingPointHelper::LoadSSE2NumberOperands(MacroAssembler* masm) { | 9934 void FloatingPointHelper::LoadSSE2NumberOperands(MacroAssembler* masm) { |
| 9935 if (FLAG_debug_code) { |
| 9936 // Both arguments can not be smis. That case is handled by smi-only code. |
| 9937 Label ok; |
| 9938 __ JumpIfNotBothSmi(rax, rdx, &ok); |
| 9939 __ Abort("Both arguments smi but not handled by smi-code."); |
| 9940 __ bind(&ok); |
| 9941 } |
9931 Label load_smi_rdx, load_nonsmi_rax, load_smi_rax, done; | 9942 Label load_smi_rdx, load_nonsmi_rax, load_smi_rax, done; |
9932 // Load operand in rdx into xmm0. | 9943 // Load operand in rdx into xmm0. |
9933 __ JumpIfSmi(rdx, &load_smi_rdx); | 9944 __ JumpIfSmi(rdx, &load_smi_rdx); |
9934 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); | 9945 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); |
9935 // Load operand in rax into xmm1. | 9946 // Load operand in rax into xmm1. |
9936 __ JumpIfSmi(rax, &load_smi_rax); | 9947 __ JumpIfSmi(rax, &load_smi_rax); |
9937 __ bind(&load_nonsmi_rax); | 9948 __ bind(&load_nonsmi_rax); |
9938 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); | 9949 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); |
9939 __ jmp(&done); | 9950 __ jmp(&done); |
9940 | 9951 |
9941 __ bind(&load_smi_rdx); | 9952 __ bind(&load_smi_rdx); |
9942 __ SmiToInteger32(kScratchRegister, rdx); | 9953 __ SmiToInteger32(kScratchRegister, rdx); |
9943 __ cvtlsi2sd(xmm0, kScratchRegister); | 9954 __ cvtlsi2sd(xmm0, kScratchRegister); |
9944 __ JumpIfNotSmi(rax, &load_nonsmi_rax); | 9955 __ jmp(&load_nonsmi_rax); |
9945 | 9956 |
9946 __ bind(&load_smi_rax); | 9957 __ bind(&load_smi_rax); |
9947 __ SmiToInteger32(kScratchRegister, rax); | 9958 __ SmiToInteger32(kScratchRegister, rax); |
9948 __ cvtlsi2sd(xmm1, kScratchRegister); | 9959 __ cvtlsi2sd(xmm1, kScratchRegister); |
9949 | 9960 |
9950 __ bind(&done); | 9961 __ bind(&done); |
9951 } | 9962 } |
9952 | 9963 |
9953 | 9964 |
9954 void FloatingPointHelper::LoadSSE2UnknownOperands(MacroAssembler* masm, | 9965 void FloatingPointHelper::LoadSSE2UnknownOperands(MacroAssembler* masm, |
(...skipping 22 matching lines...) Expand all Loading... |
9977 __ bind(&load_smi_rax); | 9988 __ bind(&load_smi_rax); |
9978 __ SmiToInteger32(kScratchRegister, rax); | 9989 __ SmiToInteger32(kScratchRegister, rax); |
9979 __ cvtlsi2sd(xmm1, kScratchRegister); | 9990 __ cvtlsi2sd(xmm1, kScratchRegister); |
9980 __ bind(&done); | 9991 __ bind(&done); |
9981 } | 9992 } |
9982 | 9993 |
9983 | 9994 |
9984 // Input: rdx, rax are the left and right objects of a bit op. | 9995 // Input: rdx, rax are the left and right objects of a bit op. |
9985 // Output: rax, rcx are left and right integers for a bit op. | 9996 // Output: rax, rcx are left and right integers for a bit op. |
9986 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, | 9997 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, |
9987 Label* conversion_failure) { | 9998 Label* conversion_failure, |
| 9999 Register heap_number_map) { |
9988 // Check float operands. | 10000 // Check float operands. |
9989 Label arg1_is_object, check_undefined_arg1; | 10001 Label arg1_is_object, check_undefined_arg1; |
9990 Label arg2_is_object, check_undefined_arg2; | 10002 Label arg2_is_object, check_undefined_arg2; |
9991 Label load_arg2, done; | 10003 Label load_arg2, done; |
9992 | 10004 |
9993 __ JumpIfNotSmi(rdx, &arg1_is_object); | 10005 __ JumpIfNotSmi(rdx, &arg1_is_object); |
9994 __ SmiToInteger32(rdx, rdx); | 10006 __ SmiToInteger32(rdx, rdx); |
9995 __ jmp(&load_arg2); | 10007 __ jmp(&load_arg2); |
9996 | 10008 |
9997 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). | 10009 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). |
9998 __ bind(&check_undefined_arg1); | 10010 __ bind(&check_undefined_arg1); |
9999 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); | 10011 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); |
10000 __ j(not_equal, conversion_failure); | 10012 __ j(not_equal, conversion_failure); |
10001 __ movl(rdx, Immediate(0)); | 10013 __ movl(rdx, Immediate(0)); |
10002 __ jmp(&load_arg2); | 10014 __ jmp(&load_arg2); |
10003 | 10015 |
10004 __ bind(&arg1_is_object); | 10016 __ bind(&arg1_is_object); |
10005 __ movq(rbx, FieldOperand(rdx, HeapObject::kMapOffset)); | 10017 __ cmpq(FieldOperand(rdx, HeapObject::kMapOffset), heap_number_map); |
10006 __ CompareRoot(rbx, Heap::kHeapNumberMapRootIndex); | |
10007 __ j(not_equal, &check_undefined_arg1); | 10018 __ j(not_equal, &check_undefined_arg1); |
10008 // Get the untagged integer version of the edx heap number in rcx. | 10019 // Get the untagged integer version of the edx heap number in rcx. |
10009 IntegerConvert(masm, rdx, rdx); | 10020 IntegerConvert(masm, rdx, rdx); |
10010 | 10021 |
10011 // Here rdx has the untagged integer, rax has a Smi or a heap number. | 10022 // Here rdx has the untagged integer, rax has a Smi or a heap number. |
10012 __ bind(&load_arg2); | 10023 __ bind(&load_arg2); |
10013 // Test if arg2 is a Smi. | 10024 // Test if arg2 is a Smi. |
10014 __ JumpIfNotSmi(rax, &arg2_is_object); | 10025 __ JumpIfNotSmi(rax, &arg2_is_object); |
10015 __ SmiToInteger32(rax, rax); | 10026 __ SmiToInteger32(rax, rax); |
10016 __ movl(rcx, rax); | 10027 __ movl(rcx, rax); |
10017 __ jmp(&done); | 10028 __ jmp(&done); |
10018 | 10029 |
10019 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). | 10030 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). |
10020 __ bind(&check_undefined_arg2); | 10031 __ bind(&check_undefined_arg2); |
10021 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); | 10032 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); |
10022 __ j(not_equal, conversion_failure); | 10033 __ j(not_equal, conversion_failure); |
10023 __ movl(rcx, Immediate(0)); | 10034 __ movl(rcx, Immediate(0)); |
10024 __ jmp(&done); | 10035 __ jmp(&done); |
10025 | 10036 |
10026 __ bind(&arg2_is_object); | 10037 __ bind(&arg2_is_object); |
10027 __ movq(rbx, FieldOperand(rax, HeapObject::kMapOffset)); | 10038 __ cmpq(FieldOperand(rax, HeapObject::kMapOffset), heap_number_map); |
10028 __ CompareRoot(rbx, Heap::kHeapNumberMapRootIndex); | |
10029 __ j(not_equal, &check_undefined_arg2); | 10039 __ j(not_equal, &check_undefined_arg2); |
10030 // Get the untagged integer version of the eax heap number in ecx. | 10040 // Get the untagged integer version of the eax heap number in ecx. |
10031 IntegerConvert(masm, rcx, rax); | 10041 IntegerConvert(masm, rcx, rax); |
10032 __ bind(&done); | 10042 __ bind(&done); |
10033 __ movl(rax, rdx); | 10043 __ movl(rax, rdx); |
10034 } | 10044 } |
10035 | 10045 |
10036 | 10046 |
| 10047 // Input: rdx, rax are the left and right objects of a bit op. |
| 10048 // Output: rax, rcx are left and right integers for a bit op. |
| 10049 void FloatingPointHelper::LoadNumbersAsIntegers(MacroAssembler* masm) { |
| 10050 if (FLAG_debug_code) { |
| 10051 // Both arguments can not be smis. That case is handled by smi-only code. |
| 10052 Label ok; |
| 10053 __ JumpIfNotBothSmi(rax, rdx, &ok); |
| 10054 __ Abort("Both arguments smi but not handled by smi-code."); |
| 10055 __ bind(&ok); |
| 10056 } |
| 10057 // Check float operands. |
| 10058 Label done; |
| 10059 Label rax_is_object; |
| 10060 Label rdx_is_object; |
| 10061 Label rax_is_smi; |
| 10062 Label rdx_is_smi; |
| 10063 |
| 10064 __ JumpIfNotSmi(rdx, &rdx_is_object); |
| 10065 __ SmiToInteger32(rdx, rdx); |
| 10066 |
| 10067 __ bind(&rax_is_object); |
| 10068 IntegerConvert(masm, rcx, rax); // Uses rdi, rcx and rbx. |
| 10069 __ jmp(&done); |
| 10070 |
| 10071 __ bind(&rdx_is_object); |
| 10072 IntegerConvert(masm, rdx, rdx); // Uses rdi, rcx and rbx. |
| 10073 __ JumpIfNotSmi(rax, &rax_is_object); |
| 10074 __ bind(&rax_is_smi); |
| 10075 __ SmiToInteger32(rcx, rax); |
| 10076 |
| 10077 __ bind(&done); |
| 10078 __ movl(rax, rdx); |
| 10079 } |
| 10080 |
| 10081 |
10037 const char* GenericBinaryOpStub::GetName() { | 10082 const char* GenericBinaryOpStub::GetName() { |
10038 if (name_ != NULL) return name_; | 10083 if (name_ != NULL) return name_; |
10039 const int len = 100; | 10084 const int len = 100; |
10040 name_ = Bootstrapper::AllocateAutoDeletedArray(len); | 10085 name_ = Bootstrapper::AllocateAutoDeletedArray(len); |
10041 if (name_ == NULL) return "OOM"; | 10086 if (name_ == NULL) return "OOM"; |
10042 const char* op_name = Token::Name(op_); | 10087 const char* op_name = Token::Name(op_); |
10043 const char* overwrite_name; | 10088 const char* overwrite_name; |
10044 switch (mode_) { | 10089 switch (mode_) { |
10045 case NO_OVERWRITE: overwrite_name = "Alloc"; break; | 10090 case NO_OVERWRITE: overwrite_name = "Alloc"; break; |
10046 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; | 10091 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10480 case Token::MOD: { | 10525 case Token::MOD: { |
10481 // For MOD we go directly to runtime in the non-smi case. | 10526 // For MOD we go directly to runtime in the non-smi case. |
10482 break; | 10527 break; |
10483 } | 10528 } |
10484 case Token::BIT_OR: | 10529 case Token::BIT_OR: |
10485 case Token::BIT_AND: | 10530 case Token::BIT_AND: |
10486 case Token::BIT_XOR: | 10531 case Token::BIT_XOR: |
10487 case Token::SAR: | 10532 case Token::SAR: |
10488 case Token::SHL: | 10533 case Token::SHL: |
10489 case Token::SHR: { | 10534 case Token::SHR: { |
10490 Label skip_allocation, non_smi_result; | 10535 Label skip_allocation, non_smi_shr_result; |
10491 FloatingPointHelper::LoadAsIntegers(masm, &call_runtime); | 10536 Register heap_number_map = r9; |
| 10537 __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
| 10538 if (static_operands_type_.IsNumber()) { |
| 10539 if (FLAG_debug_code) { |
| 10540 // Assert at runtime that inputs are only numbers. |
| 10541 __ AbortIfNotNumber(rdx); |
| 10542 __ AbortIfNotNumber(rax); |
| 10543 } |
| 10544 FloatingPointHelper::LoadNumbersAsIntegers(masm); |
| 10545 } else { |
| 10546 FloatingPointHelper::LoadAsIntegers(masm, |
| 10547 &call_runtime, |
| 10548 heap_number_map); |
| 10549 } |
10492 switch (op_) { | 10550 switch (op_) { |
10493 case Token::BIT_OR: __ orl(rax, rcx); break; | 10551 case Token::BIT_OR: __ orl(rax, rcx); break; |
10494 case Token::BIT_AND: __ andl(rax, rcx); break; | 10552 case Token::BIT_AND: __ andl(rax, rcx); break; |
10495 case Token::BIT_XOR: __ xorl(rax, rcx); break; | 10553 case Token::BIT_XOR: __ xorl(rax, rcx); break; |
10496 case Token::SAR: __ sarl_cl(rax); break; | 10554 case Token::SAR: __ sarl_cl(rax); break; |
10497 case Token::SHL: __ shll_cl(rax); break; | 10555 case Token::SHL: __ shll_cl(rax); break; |
10498 case Token::SHR: __ shrl_cl(rax); break; | 10556 case Token::SHR: { |
| 10557 __ shrl_cl(rax); |
| 10558 // Check if result is negative. This can only happen for a shift |
| 10559 // by zero. |
| 10560 __ testl(rax, rax); |
| 10561 __ j(negative, &non_smi_shr_result); |
| 10562 break; |
| 10563 } |
10499 default: UNREACHABLE(); | 10564 default: UNREACHABLE(); |
10500 } | 10565 } |
10501 if (op_ == Token::SHR) { | 10566 |
10502 // Check if result is negative. This can only happen for a shift | 10567 STATIC_ASSERT(kSmiValueSize == 32); |
10503 // by zero, which also doesn't update the sign flag. | 10568 // Tag smi result and return. |
10504 __ testl(rax, rax); | |
10505 __ j(negative, &non_smi_result); | |
10506 } | |
10507 __ JumpIfNotValidSmiValue(rax, &non_smi_result); | |
10508 // Tag smi result, if possible, and return. | |
10509 __ Integer32ToSmi(rax, rax); | 10569 __ Integer32ToSmi(rax, rax); |
10510 GenerateReturn(masm); | 10570 GenerateReturn(masm); |
10511 | 10571 |
10512 // All ops except SHR return a signed int32 that we load in | 10572 // All bit-ops except SHR return a signed int32 that can be |
10513 // a HeapNumber. | 10573 // returned immediately as a smi. |
10514 if (op_ != Token::SHR && non_smi_result.is_linked()) { | 10574 // We might need to allocate a HeapNumber if we shift a negative |
10515 __ bind(&non_smi_result); | 10575 // number right by zero (i.e., convert to UInt32). |
| 10576 if (op_ == Token::SHR) { |
| 10577 ASSERT(non_smi_shr_result.is_linked()); |
| 10578 __ bind(&non_smi_shr_result); |
10516 // Allocate a heap number if needed. | 10579 // Allocate a heap number if needed. |
10517 __ movsxlq(rbx, rax); // rbx: sign extended 32-bit result | 10580 __ movl(rbx, rax); // rbx holds result value (uint32 value as int64). |
10518 switch (mode_) { | 10581 switch (mode_) { |
10519 case OVERWRITE_LEFT: | 10582 case OVERWRITE_LEFT: |
10520 case OVERWRITE_RIGHT: | 10583 case OVERWRITE_RIGHT: |
10521 // If the operand was an object, we skip the | 10584 // If the operand was an object, we skip the |
10522 // allocation of a heap number. | 10585 // allocation of a heap number. |
10523 __ movq(rax, Operand(rsp, mode_ == OVERWRITE_RIGHT ? | 10586 __ movq(rax, Operand(rsp, mode_ == OVERWRITE_RIGHT ? |
10524 1 * kPointerSize : 2 * kPointerSize)); | 10587 1 * kPointerSize : 2 * kPointerSize)); |
10525 __ JumpIfNotSmi(rax, &skip_allocation); | 10588 __ JumpIfNotSmi(rax, &skip_allocation); |
10526 // Fall through! | 10589 // Fall through! |
10527 case NO_OVERWRITE: | 10590 case NO_OVERWRITE: |
10528 __ AllocateHeapNumber(rax, rcx, &call_runtime); | 10591 // Allocate heap number in new space. |
| 10592 // Not using AllocateHeapNumber macro in order to reuse |
| 10593 // already loaded heap_number_map. |
| 10594 __ AllocateInNewSpace(HeapNumber::kSize, |
| 10595 rax, |
| 10596 rcx, |
| 10597 no_reg, |
| 10598 &call_runtime, |
| 10599 TAG_OBJECT); |
| 10600 // Set the map. |
| 10601 if (FLAG_debug_code) { |
| 10602 __ AbortIfNotRootValue(heap_number_map, |
| 10603 Heap::kHeapNumberMapRootIndex, |
| 10604 "HeapNumberMap register clobbered."); |
| 10605 } |
| 10606 __ movq(FieldOperand(rax, HeapObject::kMapOffset), |
| 10607 heap_number_map); |
10529 __ bind(&skip_allocation); | 10608 __ bind(&skip_allocation); |
10530 break; | 10609 break; |
10531 default: UNREACHABLE(); | 10610 default: UNREACHABLE(); |
10532 } | 10611 } |
10533 // Store the result in the HeapNumber and return. | 10612 // Store the result in the HeapNumber and return. |
10534 __ movq(Operand(rsp, 1 * kPointerSize), rbx); | 10613 __ cvtqsi2sd(xmm0, rbx); |
10535 __ fild_s(Operand(rsp, 1 * kPointerSize)); | 10614 __ movsd(FieldOperand(rax, HeapNumber::kValueOffset), xmm0); |
10536 __ fstp_d(FieldOperand(rax, HeapNumber::kValueOffset)); | |
10537 GenerateReturn(masm); | 10615 GenerateReturn(masm); |
10538 } | 10616 } |
10539 | 10617 |
10540 // SHR should return uint32 - go to runtime for non-smi/negative result. | |
10541 if (op_ == Token::SHR) { | |
10542 __ bind(&non_smi_result); | |
10543 } | |
10544 break; | 10618 break; |
10545 } | 10619 } |
10546 default: UNREACHABLE(); break; | 10620 default: UNREACHABLE(); break; |
10547 } | 10621 } |
10548 } | 10622 } |
10549 | 10623 |
10550 // If all else fails, use the runtime system to get the correct | 10624 // If all else fails, use the runtime system to get the correct |
10551 // result. If arguments was passed in registers now place them on the | 10625 // result. If arguments was passed in registers now place them on the |
10552 // stack in the correct order below the return address. | 10626 // stack in the correct order below the return address. |
10553 __ bind(&call_runtime); | 10627 __ bind(&call_runtime); |
(...skipping 12 matching lines...) Expand all Loading... |
10566 rhs = rdx; | 10640 rhs = rdx; |
10567 } else { | 10641 } else { |
10568 lhs = rdx; | 10642 lhs = rdx; |
10569 rhs = rax; | 10643 rhs = rax; |
10570 } | 10644 } |
10571 | 10645 |
10572 // Test for string arguments before calling runtime. | 10646 // Test for string arguments before calling runtime. |
10573 Label not_strings, both_strings, not_string1, string1, string1_smi2; | 10647 Label not_strings, both_strings, not_string1, string1, string1_smi2; |
10574 | 10648 |
10575 // If this stub has already generated FP-specific code then the arguments | 10649 // If this stub has already generated FP-specific code then the arguments |
10576 // are already in rdx, rax | 10650 // are already in rdx and rax. |
10577 if (!ShouldGenerateFPCode() && !HasArgsInRegisters()) { | 10651 if (!ShouldGenerateFPCode() && !HasArgsInRegisters()) { |
10578 GenerateLoadArguments(masm); | 10652 GenerateLoadArguments(masm); |
10579 } | 10653 } |
10580 | 10654 |
10581 Condition is_smi; | 10655 Condition is_smi; |
10582 is_smi = masm->CheckSmi(lhs); | 10656 is_smi = masm->CheckSmi(lhs); |
10583 __ j(is_smi, ¬_string1); | 10657 __ j(is_smi, ¬_string1); |
10584 __ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, r8); | 10658 __ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, r8); |
10585 __ j(above_equal, ¬_string1); | 10659 __ j(above_equal, ¬_string1); |
10586 | 10660 |
(...skipping 1260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11847 } | 11921 } |
11848 | 11922 |
11849 #endif | 11923 #endif |
11850 | 11924 |
11851 | 11925 |
11852 #undef __ | 11926 #undef __ |
11853 | 11927 |
11854 } } // namespace v8::internal | 11928 } } // namespace v8::internal |
11855 | 11929 |
11856 #endif // V8_TARGET_ARCH_X64 | 11930 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |