X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fv8%2Fsrc%2Fia32%2Fdeoptimizer-ia32.cc;h=2e372e4c6572ed611de94b72b72f48e9042847c5;hb=15927f25adb9a3ab0cdaa767e320c42a358cf73c;hp=f40e23c0f3519c05373b17368e59634855f3e26b;hpb=ec4c776d4102ef29aa949f70cae1243edbfc9ef5;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/v8/src/ia32/deoptimizer-ia32.cc b/src/v8/src/ia32/deoptimizer-ia32.cc index f40e23c..2e372e4 100644 --- a/src/v8/src/ia32/deoptimizer-ia32.cc +++ b/src/v8/src/ia32/deoptimizer-ia32.cc @@ -182,8 +182,9 @@ void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) { } input_->SetRegister(esp.code(), reinterpret_cast(frame->sp())); input_->SetRegister(ebp.code(), reinterpret_cast(frame->fp())); + simd128_value_t zero = {{0.0, 0.0}}; for (int i = 0; i < XMMRegister::kMaxNumAllocatableRegisters; i++) { - input_->SetDoubleRegister(i, 0.0); + input_->SetSIMD128Register(i, zero); } // Fill the frame content from the actual data on the frame. @@ -203,10 +204,10 @@ void Deoptimizer::SetPlatformCompiledStubRegisters( } -void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) { +void Deoptimizer::CopySIMD128Registers(FrameDescription* output_frame) { for (int i = 0; i < XMMRegister::kMaxNumAllocatableRegisters; ++i) { - double double_value = input_->GetDoubleRegister(i); - output_frame->SetDoubleRegister(i, double_value); + simd128_value_t xmm_value = input_->GetSIMD128Register(i); + output_frame->SetSIMD128Register(i, xmm_value); } } @@ -233,19 +234,19 @@ void Deoptimizer::EntryGenerator::Generate() { // Save all general purpose registers before messing with them. const int kNumberOfRegisters = Register::kNumRegisters; - const int kDoubleRegsSize = kDoubleSize * - XMMRegister::kMaxNumAllocatableRegisters; - __ sub(esp, Immediate(kDoubleRegsSize)); + const int kXMMRegsSize = kSIMD128Size * + XMMRegister::kMaxNumAllocatableRegisters; + __ sub(esp, Immediate(kXMMRegsSize)); for (int i = 0; i < XMMRegister::kMaxNumAllocatableRegisters; ++i) { XMMRegister xmm_reg = XMMRegister::FromAllocationIndex(i); - int offset = i * kDoubleSize; - __ movsd(Operand(esp, offset), xmm_reg); + int offset = i * kSIMD128Size; + __ movups(Operand(esp, offset), xmm_reg); } __ pushad(); const int kSavedRegistersAreaSize = kNumberOfRegisters * kPointerSize + - kDoubleRegsSize; + kXMMRegsSize; // Get the bailout id from the stack. __ mov(ebx, Operand(esp, kSavedRegistersAreaSize)); @@ -283,13 +284,13 @@ void Deoptimizer::EntryGenerator::Generate() { __ pop(Operand(ebx, offset)); } - int double_regs_offset = FrameDescription::double_registers_offset(); + int xmm_regs_offset = FrameDescription::simd128_registers_offset(); // Fill in the double input registers. for (int i = 0; i < XMMRegister::kMaxNumAllocatableRegisters; ++i) { - int dst_offset = i * kDoubleSize + double_regs_offset; - int src_offset = i * kDoubleSize; - __ movsd(xmm0, Operand(esp, src_offset)); - __ movsd(Operand(ebx, dst_offset), xmm0); + int dst_offset = i * kSIMD128Size + xmm_regs_offset; + int src_offset = i * kSIMD128Size; + __ movups(xmm0, Operand(esp, src_offset)); + __ movups(Operand(ebx, dst_offset), xmm0); } // Clear FPU all exceptions. @@ -298,7 +299,7 @@ void Deoptimizer::EntryGenerator::Generate() { __ fnclex(); // Remove the bailout id, return address and the double registers. - __ add(esp, Immediate(kDoubleRegsSize + 2 * kPointerSize)); + __ add(esp, Immediate(kXMMRegsSize + 2 * kPointerSize)); // Compute a pointer to the unwinding limit in register ecx; that is // the first stack slot not part of the input frame. @@ -370,8 +371,8 @@ void Deoptimizer::EntryGenerator::Generate() { // In case of a failed STUB, we have to restore the XMM registers. for (int i = 0; i < XMMRegister::kMaxNumAllocatableRegisters; ++i) { XMMRegister xmm_reg = XMMRegister::FromAllocationIndex(i); - int src_offset = i * kDoubleSize + double_regs_offset; - __ movsd(xmm_reg, Operand(ebx, src_offset)); + int src_offset = i * kSIMD128Size + xmm_regs_offset; + __ movups(xmm_reg, Operand(ebx, src_offset)); } // Push state, pc, and continuation from the last output frame. @@ -424,6 +425,18 @@ void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { } +double FrameDescription::GetDoubleRegister(unsigned n) const { + DCHECK(n < arraysize(simd128_registers_)); + return simd128_registers_[n].d[0]; +} + + +void FrameDescription::SetDoubleRegister(unsigned n, double value) { + DCHECK(n < arraysize(simd128_registers_)); + simd128_registers_[n].d[0] = value; +} + + #undef __