| Index: src/x64/codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/codegen-x64.cc (revision 15486)
|
| +++ src/x64/codegen-x64.cc (working copy)
|
| @@ -53,6 +53,7 @@
|
|
|
|
|
| #define __ masm.
|
| +#define __k __
|
|
|
|
|
| UnaryMathFunction CreateTranscendentalFunction(TranscendentalCache::Type type) {
|
| @@ -75,18 +76,18 @@
|
| MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size));
|
| // xmm0: raw double input.
|
| // Move double input into registers.
|
| - __ push(rbx);
|
| - __ push(rdi);
|
| - __ movq(rbx, xmm0);
|
| - __ push(rbx);
|
| + __k push(rbx);
|
| + __k push(rdi);
|
| + __k movq(rbx, xmm0);
|
| + __k push(rbx);
|
| __ fld_d(Operand(rsp, 0));
|
| TranscendentalCacheStub::GenerateOperation(&masm, type);
|
| // The return value is expected to be in xmm0.
|
| __ fstp_d(Operand(rsp, 0));
|
| - __ pop(rbx);
|
| - __ movq(xmm0, rbx);
|
| - __ pop(rdi);
|
| - __ pop(rbx);
|
| + __k pop(rbx);
|
| + __k movq(xmm0, rbx);
|
| + __k pop(rdi);
|
| + __k pop(rbx);
|
| __ Ret();
|
|
|
| CodeDesc desc;
|
| @@ -110,13 +111,13 @@
|
| // xmm0: raw double input.
|
| XMMRegister input = xmm0;
|
| XMMRegister result = xmm1;
|
| - __ push(rax);
|
| - __ push(rbx);
|
| + __k push(rax);
|
| + __k push(rbx);
|
|
|
| MathExpGenerator::EmitMathExp(&masm, input, result, xmm2, rax, rbx);
|
|
|
| - __ pop(rbx);
|
| - __ pop(rax);
|
| + __k pop(rbx);
|
| + __k pop(rax);
|
| __ movsd(xmm0, result);
|
| __ Ret();
|
|
|
| @@ -213,7 +214,7 @@
|
| __ j(zero, &valid_result);
|
| __ fstp(0); // Drop result in st(0).
|
| int64_t kNaNValue = V8_INT64_C(0x7ff8000000000000);
|
| - __ movq(rcx, kNaNValue, RelocInfo::NONE64);
|
| + __k movq(rcx, kNaNValue, RelocInfo::NONE64);
|
| __ movq(Operand(rsp, kPointerSize), rcx);
|
| __ movsd(xmm0, Operand(rsp, kPointerSize));
|
| __ jmp(&return_result);
|
| @@ -305,9 +306,14 @@
|
| // Check backing store for COW-ness. For COW arrays we have to
|
| // allocate a new backing store.
|
| __ SmiToInteger32(r9, FieldOperand(r8, FixedDoubleArray::kLengthOffset));
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ CompareRoot(FieldOperand(r8, HeapObject::kMapOffset),
|
| Heap::kFixedCOWArrayMapRootIndex);
|
| __ j(equal, &new_backing_store);
|
| +#else
|
| + // Smi is 4-byte while double is 8-byte for X32.
|
| + __ jmp(&new_backing_store);
|
| +#endif
|
| // Check if the backing store is in new-space. If not, we need to allocate
|
| // a new one since the old one is in pointer-space.
|
| // If in new space, we can reuse the old backing store because it is
|
| @@ -340,7 +346,7 @@
|
| STATIC_ASSERT(FixedDoubleArray::kHeaderSize == FixedArray::kHeaderSize);
|
|
|
| Label loop, entry, convert_hole;
|
| - __ movq(r15, BitCast<int64_t, uint64_t>(kHoleNanInt64), RelocInfo::NONE64);
|
| + __k movq(r15, BitCast<int64_t, uint64_t>(kHoleNanInt64), RelocInfo::NONE64);
|
| // r15: the-hole NaN
|
| __ jmp(&entry);
|
|
|
| @@ -397,7 +403,7 @@
|
| __ Assert(equal, "object found in smi-only array");
|
| }
|
|
|
| - __ movq(FieldOperand(r14, r9, times_8, FixedDoubleArray::kHeaderSize), r15);
|
| + __k movq(FieldOperand(r14, r9, times_8, FixedDoubleArray::kHeaderSize), r15);
|
| __ bind(&entry);
|
| __ decq(r9);
|
| __ j(not_sign, &loop);
|
| @@ -443,7 +449,7 @@
|
| __ movq(FieldOperand(r11, FixedArray::kLengthOffset), r14);
|
|
|
| // Prepare for conversion loop.
|
| - __ movq(rsi, BitCast<int64_t, uint64_t>(kHoleNanInt64), RelocInfo::NONE64);
|
| + __k movq(rsi, BitCast<int64_t, uint64_t>(kHoleNanInt64), RelocInfo::NONE64);
|
| __ LoadRoot(rdi, Heap::kTheHoleValueRootIndex);
|
| // rsi: the-hole NaN
|
| // rdi: pointer to the-hole
|
| @@ -457,19 +463,19 @@
|
|
|
| // Box doubles into heap numbers.
|
| __ bind(&loop);
|
| - __ movq(r14, FieldOperand(r8,
|
| + __k movq(r14, FieldOperand(r8,
|
| r9,
|
| times_8,
|
| FixedDoubleArray::kHeaderSize));
|
| // r9 : current element's index
|
| // r14: current element
|
| - __ cmpq(r14, rsi);
|
| + __k cmpq(r14, rsi);
|
| __ j(equal, &convert_hole);
|
|
|
| // Non-hole double, copy value into a heap number.
|
| __ AllocateHeapNumber(rax, r15, &gc_required);
|
| // rax: new heap number
|
| - __ movq(FieldOperand(rax, HeapNumber::kValueOffset), r14);
|
| + __k movq(FieldOperand(rax, HeapNumber::kValueOffset), r14);
|
| __ movq(FieldOperand(r11,
|
| r9,
|
| times_pointer_size,
|
| @@ -653,20 +659,20 @@
|
| __ movq(temp2, double_scratch);
|
| __ subsd(double_scratch, result);
|
| __ movsd(result, Operand(kScratchRegister, 6 * kDoubleSize));
|
| - __ lea(temp1, Operand(temp2, 0x1ff800));
|
| - __ and_(temp2, Immediate(0x7ff));
|
| - __ shr(temp1, Immediate(11));
|
| + __k lea(temp1, Operand(temp2, 0x1ff800));
|
| + __k and_(temp2, Immediate(0x7ff));
|
| + __k shr(temp1, Immediate(11));
|
| __ mulsd(double_scratch, Operand(kScratchRegister, 5 * kDoubleSize));
|
| __ movq(kScratchRegister, ExternalReference::math_exp_log_table());
|
| - __ shl(temp1, Immediate(52));
|
| - __ or_(temp1, Operand(kScratchRegister, temp2, times_8, 0));
|
| + __k shl(temp1, Immediate(52));
|
| + __k or_(temp1, Operand(kScratchRegister, temp2, times_8, 0));
|
| __ movq(kScratchRegister, ExternalReference::math_exp_constants(0));
|
| __ subsd(double_scratch, input);
|
| __ movsd(input, double_scratch);
|
| __ subsd(result, double_scratch);
|
| __ mulsd(input, double_scratch);
|
| __ mulsd(result, input);
|
| - __ movq(input, temp1);
|
| + __k movq(input, temp1);
|
| __ mulsd(result, Operand(kScratchRegister, 7 * kDoubleSize));
|
| __ subsd(result, double_scratch);
|
| __ addsd(result, Operand(kScratchRegister, 8 * kDoubleSize));
|
| @@ -675,10 +681,15 @@
|
| __ bind(&done);
|
| }
|
|
|
| +#undef __k
|
| #undef __
|
|
|
|
|
| +#ifndef V8_TARGET_ARCH_X32
|
| static const int kNoCodeAgeSequenceLength = 6;
|
| +#else
|
| +static const int kNoCodeAgeSequenceLength = 17;
|
| +#endif
|
|
|
| static byte* GetNoCodeAgeSequence(uint32_t* length) {
|
| static bool initialized = false;
|
|
|