Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 1408983002: [x64] Make use of vxorpd when AVX is enabled. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/codegen-x64.cc ('k') | src/x64/lithium-gap-resolver-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/hydrogen-osr.h" 10 #include "src/hydrogen-osr.h"
(...skipping 1957 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 XMMRegister left_reg = ToDoubleRegister(left); 1968 XMMRegister left_reg = ToDoubleRegister(left);
1969 XMMRegister right_reg = ToDoubleRegister(right); 1969 XMMRegister right_reg = ToDoubleRegister(right);
1970 __ ucomisd(left_reg, right_reg); 1970 __ ucomisd(left_reg, right_reg);
1971 __ j(parity_even, &check_nan_left, Label::kNear); // At least one NaN. 1971 __ j(parity_even, &check_nan_left, Label::kNear); // At least one NaN.
1972 __ j(equal, &check_zero, Label::kNear); // left == right. 1972 __ j(equal, &check_zero, Label::kNear); // left == right.
1973 __ j(condition, &return_left, Label::kNear); 1973 __ j(condition, &return_left, Label::kNear);
1974 __ jmp(&return_right, Label::kNear); 1974 __ jmp(&return_right, Label::kNear);
1975 1975
1976 __ bind(&check_zero); 1976 __ bind(&check_zero);
1977 XMMRegister xmm_scratch = double_scratch0(); 1977 XMMRegister xmm_scratch = double_scratch0();
1978 __ xorps(xmm_scratch, xmm_scratch); 1978 __ Xorpd(xmm_scratch, xmm_scratch);
1979 __ ucomisd(left_reg, xmm_scratch); 1979 __ ucomisd(left_reg, xmm_scratch);
1980 __ j(not_equal, &return_left, Label::kNear); // left == right != 0. 1980 __ j(not_equal, &return_left, Label::kNear); // left == right != 0.
1981 // At this point, both left and right are either 0 or -0. 1981 // At this point, both left and right are either 0 or -0.
1982 if (operation == HMathMinMax::kMathMin) { 1982 if (operation == HMathMinMax::kMathMin) {
1983 __ orps(left_reg, right_reg); 1983 __ orps(left_reg, right_reg);
1984 } else { 1984 } else {
1985 // Since we operate on +0 and/or -0, addsd and andsd have the same effect. 1985 // Since we operate on +0 and/or -0, addsd and andsd have the same effect.
1986 __ addsd(left_reg, right_reg); 1986 __ addsd(left_reg, right_reg);
1987 } 1987 }
1988 __ jmp(&return_left, Label::kNear); 1988 __ jmp(&return_left, Label::kNear);
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
2121 EmitBranch(instr, not_zero); 2121 EmitBranch(instr, not_zero);
2122 } else if (r.IsSmi()) { 2122 } else if (r.IsSmi()) {
2123 DCHECK(!info()->IsStub()); 2123 DCHECK(!info()->IsStub());
2124 Register reg = ToRegister(instr->value()); 2124 Register reg = ToRegister(instr->value());
2125 __ testp(reg, reg); 2125 __ testp(reg, reg);
2126 EmitBranch(instr, not_zero); 2126 EmitBranch(instr, not_zero);
2127 } else if (r.IsDouble()) { 2127 } else if (r.IsDouble()) {
2128 DCHECK(!info()->IsStub()); 2128 DCHECK(!info()->IsStub());
2129 XMMRegister reg = ToDoubleRegister(instr->value()); 2129 XMMRegister reg = ToDoubleRegister(instr->value());
2130 XMMRegister xmm_scratch = double_scratch0(); 2130 XMMRegister xmm_scratch = double_scratch0();
2131 __ xorps(xmm_scratch, xmm_scratch); 2131 __ Xorpd(xmm_scratch, xmm_scratch);
2132 __ ucomisd(reg, xmm_scratch); 2132 __ ucomisd(reg, xmm_scratch);
2133 EmitBranch(instr, not_equal); 2133 EmitBranch(instr, not_equal);
2134 } else { 2134 } else {
2135 DCHECK(r.IsTagged()); 2135 DCHECK(r.IsTagged());
2136 Register reg = ToRegister(instr->value()); 2136 Register reg = ToRegister(instr->value());
2137 HType type = instr->hydrogen()->value()->type(); 2137 HType type = instr->hydrogen()->value()->type();
2138 if (type.IsBoolean()) { 2138 if (type.IsBoolean()) {
2139 DCHECK(!info()->IsStub()); 2139 DCHECK(!info()->IsStub());
2140 __ CompareRoot(reg, Heap::kTrueValueRootIndex); 2140 __ CompareRoot(reg, Heap::kTrueValueRootIndex);
2141 EmitBranch(instr, equal); 2141 EmitBranch(instr, equal);
2142 } else if (type.IsSmi()) { 2142 } else if (type.IsSmi()) {
2143 DCHECK(!info()->IsStub()); 2143 DCHECK(!info()->IsStub());
2144 __ SmiCompare(reg, Smi::FromInt(0)); 2144 __ SmiCompare(reg, Smi::FromInt(0));
2145 EmitBranch(instr, not_equal); 2145 EmitBranch(instr, not_equal);
2146 } else if (type.IsJSArray()) { 2146 } else if (type.IsJSArray()) {
2147 DCHECK(!info()->IsStub()); 2147 DCHECK(!info()->IsStub());
2148 EmitBranch(instr, no_condition); 2148 EmitBranch(instr, no_condition);
2149 } else if (type.IsHeapNumber()) { 2149 } else if (type.IsHeapNumber()) {
2150 DCHECK(!info()->IsStub()); 2150 DCHECK(!info()->IsStub());
2151 XMMRegister xmm_scratch = double_scratch0(); 2151 XMMRegister xmm_scratch = double_scratch0();
2152 __ xorps(xmm_scratch, xmm_scratch); 2152 __ Xorpd(xmm_scratch, xmm_scratch);
2153 __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset)); 2153 __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset));
2154 EmitBranch(instr, not_equal); 2154 EmitBranch(instr, not_equal);
2155 } else if (type.IsString()) { 2155 } else if (type.IsString()) {
2156 DCHECK(!info()->IsStub()); 2156 DCHECK(!info()->IsStub());
2157 __ cmpp(FieldOperand(reg, String::kLengthOffset), Immediate(0)); 2157 __ cmpp(FieldOperand(reg, String::kLengthOffset), Immediate(0));
2158 EmitBranch(instr, not_equal); 2158 EmitBranch(instr, not_equal);
2159 } else { 2159 } else {
2160 ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types(); 2160 ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types();
2161 // Avoid deopts in the case where we've never executed this path before. 2161 // Avoid deopts in the case where we've never executed this path before.
2162 if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 2162 if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2231 __ CmpInstanceType(map, SIMD128_VALUE_TYPE); 2231 __ CmpInstanceType(map, SIMD128_VALUE_TYPE);
2232 __ j(equal, instr->TrueLabel(chunk_)); 2232 __ j(equal, instr->TrueLabel(chunk_));
2233 } 2233 }
2234 2234
2235 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) { 2235 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) {
2236 // heap number -> false iff +0, -0, or NaN. 2236 // heap number -> false iff +0, -0, or NaN.
2237 Label not_heap_number; 2237 Label not_heap_number;
2238 __ CompareRoot(map, Heap::kHeapNumberMapRootIndex); 2238 __ CompareRoot(map, Heap::kHeapNumberMapRootIndex);
2239 __ j(not_equal, &not_heap_number, Label::kNear); 2239 __ j(not_equal, &not_heap_number, Label::kNear);
2240 XMMRegister xmm_scratch = double_scratch0(); 2240 XMMRegister xmm_scratch = double_scratch0();
2241 __ xorps(xmm_scratch, xmm_scratch); 2241 __ Xorpd(xmm_scratch, xmm_scratch);
2242 __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset)); 2242 __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset));
2243 __ j(zero, instr->FalseLabel(chunk_)); 2243 __ j(zero, instr->FalseLabel(chunk_));
2244 __ jmp(instr->TrueLabel(chunk_)); 2244 __ jmp(instr->TrueLabel(chunk_));
2245 __ bind(&not_heap_number); 2245 __ bind(&not_heap_number);
2246 } 2246 }
2247 2247
2248 if (!expected.IsGeneric()) { 2248 if (!expected.IsGeneric()) {
2249 // We've seen something for the first time -> deopt. 2249 // We've seen something for the first time -> deopt.
2250 // This can only happen if we are not generic already. 2250 // This can only happen if we are not generic already.
2251 DeoptimizeIf(no_condition, instr, Deoptimizer::kUnexpectedObject); 2251 DeoptimizeIf(no_condition, instr, Deoptimizer::kUnexpectedObject);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
2400 } 2400 }
2401 2401
2402 2402
2403 void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) { 2403 void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) {
2404 Representation rep = instr->hydrogen()->value()->representation(); 2404 Representation rep = instr->hydrogen()->value()->representation();
2405 DCHECK(!rep.IsInteger32()); 2405 DCHECK(!rep.IsInteger32());
2406 2406
2407 if (rep.IsDouble()) { 2407 if (rep.IsDouble()) {
2408 XMMRegister value = ToDoubleRegister(instr->value()); 2408 XMMRegister value = ToDoubleRegister(instr->value());
2409 XMMRegister xmm_scratch = double_scratch0(); 2409 XMMRegister xmm_scratch = double_scratch0();
2410 __ xorps(xmm_scratch, xmm_scratch); 2410 __ Xorpd(xmm_scratch, xmm_scratch);
2411 __ ucomisd(xmm_scratch, value); 2411 __ ucomisd(xmm_scratch, value);
2412 EmitFalseBranch(instr, not_equal); 2412 EmitFalseBranch(instr, not_equal);
2413 __ movmskpd(kScratchRegister, value); 2413 __ movmskpd(kScratchRegister, value);
2414 __ testl(kScratchRegister, Immediate(1)); 2414 __ testl(kScratchRegister, Immediate(1));
2415 EmitBranch(instr, not_zero); 2415 EmitBranch(instr, not_zero);
2416 } else { 2416 } else {
2417 Register value = ToRegister(instr->value()); 2417 Register value = ToRegister(instr->value());
2418 Handle<Map> map = masm()->isolate()->factory()->heap_number_map(); 2418 Handle<Map> map = masm()->isolate()->factory()->heap_number_map();
2419 __ CheckMap(value, map, instr->FalseLabel(chunk()), DO_SMI_CHECK); 2419 __ CheckMap(value, map, instr->FalseLabel(chunk()), DO_SMI_CHECK);
2420 __ cmpl(FieldOperand(value, HeapNumber::kExponentOffset), 2420 __ cmpl(FieldOperand(value, HeapNumber::kExponentOffset),
(...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3569 private: 3569 private:
3570 LMathAbs* instr_; 3570 LMathAbs* instr_;
3571 }; 3571 };
3572 3572
3573 DCHECK(instr->value()->Equals(instr->result())); 3573 DCHECK(instr->value()->Equals(instr->result()));
3574 Representation r = instr->hydrogen()->value()->representation(); 3574 Representation r = instr->hydrogen()->value()->representation();
3575 3575
3576 if (r.IsDouble()) { 3576 if (r.IsDouble()) {
3577 XMMRegister scratch = double_scratch0(); 3577 XMMRegister scratch = double_scratch0();
3578 XMMRegister input_reg = ToDoubleRegister(instr->value()); 3578 XMMRegister input_reg = ToDoubleRegister(instr->value());
3579 __ xorps(scratch, scratch); 3579 __ Xorpd(scratch, scratch);
3580 __ subsd(scratch, input_reg); 3580 __ subsd(scratch, input_reg);
3581 __ andps(input_reg, scratch); 3581 __ andps(input_reg, scratch);
3582 } else if (r.IsInteger32()) { 3582 } else if (r.IsInteger32()) {
3583 EmitIntegerMathAbs(instr); 3583 EmitIntegerMathAbs(instr);
3584 } else if (r.IsSmi()) { 3584 } else if (r.IsSmi()) {
3585 EmitSmiMathAbs(instr); 3585 EmitSmiMathAbs(instr);
3586 } else { // Tagged case. 3586 } else { // Tagged case.
3587 DeferredMathAbsTaggedHeapNumber* deferred = 3587 DeferredMathAbsTaggedHeapNumber* deferred =
3588 new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr); 3588 new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr);
3589 Register input_reg = ToRegister(instr->value()); 3589 Register input_reg = ToRegister(instr->value());
(...skipping 18 matching lines...) Expand all
3608 __ subq(output_reg, Immediate(1)); 3608 __ subq(output_reg, Immediate(1));
3609 DeoptimizeIf(overflow, instr, Deoptimizer::kMinusZero); 3609 DeoptimizeIf(overflow, instr, Deoptimizer::kMinusZero);
3610 } 3610 }
3611 __ roundsd(xmm_scratch, input_reg, kRoundDown); 3611 __ roundsd(xmm_scratch, input_reg, kRoundDown);
3612 __ cvttsd2si(output_reg, xmm_scratch); 3612 __ cvttsd2si(output_reg, xmm_scratch);
3613 __ cmpl(output_reg, Immediate(0x1)); 3613 __ cmpl(output_reg, Immediate(0x1));
3614 DeoptimizeIf(overflow, instr, Deoptimizer::kOverflow); 3614 DeoptimizeIf(overflow, instr, Deoptimizer::kOverflow);
3615 } else { 3615 } else {
3616 Label negative_sign, done; 3616 Label negative_sign, done;
3617 // Deoptimize on unordered. 3617 // Deoptimize on unordered.
3618 __ xorps(xmm_scratch, xmm_scratch); // Zero the register. 3618 __ Xorpd(xmm_scratch, xmm_scratch); // Zero the register.
3619 __ ucomisd(input_reg, xmm_scratch); 3619 __ ucomisd(input_reg, xmm_scratch);
3620 DeoptimizeIf(parity_even, instr, Deoptimizer::kNaN); 3620 DeoptimizeIf(parity_even, instr, Deoptimizer::kNaN);
3621 __ j(below, &negative_sign, Label::kNear); 3621 __ j(below, &negative_sign, Label::kNear);
3622 3622
3623 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { 3623 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
3624 // Check for negative zero. 3624 // Check for negative zero.
3625 Label positive_sign; 3625 Label positive_sign;
3626 __ j(above, &positive_sign, Label::kNear); 3626 __ j(above, &positive_sign, Label::kNear);
3627 __ movmskpd(output_reg, input_reg); 3627 __ movmskpd(output_reg, input_reg);
3628 __ testq(output_reg, Immediate(1)); 3628 __ testq(output_reg, Immediate(1));
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3744 // Check base for -Infinity. According to IEEE-754, double-precision 3744 // Check base for -Infinity. According to IEEE-754, double-precision
3745 // -Infinity has the highest 12 bits set and the lowest 52 bits cleared. 3745 // -Infinity has the highest 12 bits set and the lowest 52 bits cleared.
3746 __ movq(kScratchRegister, V8_INT64_C(0xFFF0000000000000)); 3746 __ movq(kScratchRegister, V8_INT64_C(0xFFF0000000000000));
3747 __ Movq(xmm_scratch, kScratchRegister); 3747 __ Movq(xmm_scratch, kScratchRegister);
3748 __ ucomisd(xmm_scratch, input_reg); 3748 __ ucomisd(xmm_scratch, input_reg);
3749 // Comparing -Infinity with NaN results in "unordered", which sets the 3749 // Comparing -Infinity with NaN results in "unordered", which sets the
3750 // zero flag as if both were equal. However, it also sets the carry flag. 3750 // zero flag as if both were equal. However, it also sets the carry flag.
3751 __ j(not_equal, &sqrt, Label::kNear); 3751 __ j(not_equal, &sqrt, Label::kNear);
3752 __ j(carry, &sqrt, Label::kNear); 3752 __ j(carry, &sqrt, Label::kNear);
3753 // If input is -Infinity, return Infinity. 3753 // If input is -Infinity, return Infinity.
3754 __ xorps(input_reg, input_reg); 3754 __ Xorpd(input_reg, input_reg);
3755 __ subsd(input_reg, xmm_scratch); 3755 __ subsd(input_reg, xmm_scratch);
3756 __ jmp(&done, Label::kNear); 3756 __ jmp(&done, Label::kNear);
3757 3757
3758 // Square root. 3758 // Square root.
3759 __ bind(&sqrt); 3759 __ bind(&sqrt);
3760 __ xorps(xmm_scratch, xmm_scratch); 3760 __ Xorpd(xmm_scratch, xmm_scratch);
3761 __ addsd(input_reg, xmm_scratch); // Convert -0 to +0. 3761 __ addsd(input_reg, xmm_scratch); // Convert -0 to +0.
3762 __ sqrtsd(input_reg, input_reg); 3762 __ sqrtsd(input_reg, input_reg);
3763 __ bind(&done); 3763 __ bind(&done);
3764 } 3764 }
3765 3765
3766 3766
3767 void LCodeGen::DoPower(LPower* instr) { 3767 void LCodeGen::DoPower(LPower* instr) {
3768 Representation exponent_type = instr->hydrogen()->right()->representation(); 3768 Representation exponent_type = instr->hydrogen()->right()->representation();
3769 // Having marked this as a call, we can use any registers. 3769 // Having marked this as a call, we can use any registers.
3770 // Just make sure that the input/output registers are the expected ones. 3770 // Just make sure that the input/output registers are the expected ones.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3808 3808
3809 MathExpGenerator::EmitMathExp(masm(), input, result, temp0, temp1, temp2); 3809 MathExpGenerator::EmitMathExp(masm(), input, result, temp0, temp1, temp2);
3810 } 3810 }
3811 3811
3812 3812
3813 void LCodeGen::DoMathLog(LMathLog* instr) { 3813 void LCodeGen::DoMathLog(LMathLog* instr) {
3814 DCHECK(instr->value()->Equals(instr->result())); 3814 DCHECK(instr->value()->Equals(instr->result()));
3815 XMMRegister input_reg = ToDoubleRegister(instr->value()); 3815 XMMRegister input_reg = ToDoubleRegister(instr->value());
3816 XMMRegister xmm_scratch = double_scratch0(); 3816 XMMRegister xmm_scratch = double_scratch0();
3817 Label positive, done, zero; 3817 Label positive, done, zero;
3818 __ xorps(xmm_scratch, xmm_scratch); 3818 __ Xorpd(xmm_scratch, xmm_scratch);
3819 __ ucomisd(input_reg, xmm_scratch); 3819 __ ucomisd(input_reg, xmm_scratch);
3820 __ j(above, &positive, Label::kNear); 3820 __ j(above, &positive, Label::kNear);
3821 __ j(not_carry, &zero, Label::kNear); 3821 __ j(not_carry, &zero, Label::kNear);
3822 __ pcmpeqd(input_reg, input_reg); 3822 __ pcmpeqd(input_reg, input_reg);
3823 __ jmp(&done, Label::kNear); 3823 __ jmp(&done, Label::kNear);
3824 __ bind(&zero); 3824 __ bind(&zero);
3825 ExternalReference ninf = 3825 ExternalReference ninf =
3826 ExternalReference::address_of_negative_infinity(); 3826 ExternalReference::address_of_negative_infinity();
3827 Operand ninf_operand = masm()->ExternalOperand(ninf); 3827 Operand ninf_operand = masm()->ExternalOperand(ninf);
3828 __ Movsd(input_reg, ninf_operand); 3828 __ Movsd(input_reg, ninf_operand);
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
4286 LOperand* key = instr->key(); 4286 LOperand* key = instr->key();
4287 if (kPointerSize == kInt32Size && !key->IsConstantOperand() && 4287 if (kPointerSize == kInt32Size && !key->IsConstantOperand() &&
4288 instr->hydrogen()->IsDehoisted()) { 4288 instr->hydrogen()->IsDehoisted()) {
4289 // Sign extend key because it could be a 32 bit negative value 4289 // Sign extend key because it could be a 32 bit negative value
4290 // and the dehoisted address computation happens in 64 bits 4290 // and the dehoisted address computation happens in 64 bits
4291 __ movsxlq(ToRegister(key), ToRegister(key)); 4291 __ movsxlq(ToRegister(key), ToRegister(key));
4292 } 4292 }
4293 if (instr->NeedsCanonicalization()) { 4293 if (instr->NeedsCanonicalization()) {
4294 XMMRegister xmm_scratch = double_scratch0(); 4294 XMMRegister xmm_scratch = double_scratch0();
4295 // Turn potential sNaN value into qNaN. 4295 // Turn potential sNaN value into qNaN.
4296 __ xorps(xmm_scratch, xmm_scratch); 4296 __ Xorpd(xmm_scratch, xmm_scratch);
4297 __ subsd(value, xmm_scratch); 4297 __ subsd(value, xmm_scratch);
4298 } 4298 }
4299 4299
4300 Operand double_store_operand = BuildFastArrayOperand( 4300 Operand double_store_operand = BuildFastArrayOperand(
4301 instr->elements(), 4301 instr->elements(),
4302 key, 4302 key,
4303 instr->hydrogen()->key()->representation(), 4303 instr->hydrogen()->key()->representation(),
4304 FAST_DOUBLE_ELEMENTS, 4304 FAST_DOUBLE_ELEMENTS,
4305 instr->base_offset()); 4305 instr->base_offset());
4306 4306
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
4917 __ Movsd(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset)); 4917 __ Movsd(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset));
4918 4918
4919 if (can_convert_undefined_to_nan) { 4919 if (can_convert_undefined_to_nan) {
4920 __ j(not_equal, &convert, Label::kNear); 4920 __ j(not_equal, &convert, Label::kNear);
4921 } else { 4921 } else {
4922 DeoptimizeIf(not_equal, instr, Deoptimizer::kNotAHeapNumber); 4922 DeoptimizeIf(not_equal, instr, Deoptimizer::kNotAHeapNumber);
4923 } 4923 }
4924 4924
4925 if (deoptimize_on_minus_zero) { 4925 if (deoptimize_on_minus_zero) {
4926 XMMRegister xmm_scratch = double_scratch0(); 4926 XMMRegister xmm_scratch = double_scratch0();
4927 __ xorps(xmm_scratch, xmm_scratch); 4927 __ Xorpd(xmm_scratch, xmm_scratch);
4928 __ ucomisd(xmm_scratch, result_reg); 4928 __ ucomisd(xmm_scratch, result_reg);
4929 __ j(not_equal, &done, Label::kNear); 4929 __ j(not_equal, &done, Label::kNear);
4930 __ movmskpd(kScratchRegister, result_reg); 4930 __ movmskpd(kScratchRegister, result_reg);
4931 __ testq(kScratchRegister, Immediate(1)); 4931 __ testq(kScratchRegister, Immediate(1));
4932 DeoptimizeIf(not_zero, instr, Deoptimizer::kMinusZero); 4932 DeoptimizeIf(not_zero, instr, Deoptimizer::kMinusZero);
4933 } 4933 }
4934 __ jmp(&done, Label::kNear); 4934 __ jmp(&done, Label::kNear);
4935 4935
4936 if (can_convert_undefined_to_nan) { 4936 if (can_convert_undefined_to_nan) {
4937 __ bind(&convert); 4937 __ bind(&convert);
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
5905 RecordSafepoint(Safepoint::kNoLazyDeopt); 5905 RecordSafepoint(Safepoint::kNoLazyDeopt);
5906 } 5906 }
5907 5907
5908 5908
5909 #undef __ 5909 #undef __
5910 5910
5911 } // namespace internal 5911 } // namespace internal
5912 } // namespace v8 5912 } // namespace v8
5913 5913
5914 #endif // V8_TARGET_ARCH_X64 5914 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/codegen-x64.cc ('k') | src/x64/lithium-gap-resolver-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698