X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fv8%2Fsrc%2Fdeoptimizer.h;h=7c426b90119baf065eaf6bc7e0fb802931c66a94;hb=cb22b7ee5e7e6fb35ab4a8fe4fef33212fa7815a;hp=1a6f668d8f3c99bea2019298493f3df6d6bfbd9e;hpb=3d4b1238397d7c77f040bf34449d2dc9eddca101;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/v8/src/deoptimizer.h b/src/v8/src/deoptimizer.h index 1a6f668..7c426b9 100644 --- a/src/v8/src/deoptimizer.h +++ b/src/v8/src/deoptimizer.h @@ -32,6 +32,9 @@ static inline double read_double_value(Address p) { #endif // V8_HOST_CAN_READ_UNALIGNED } +static inline simd128_value_t read_simd128_value(Address p) { + return *reinterpret_cast(p); +} class FrameDescription; class TranslationIterator; @@ -52,6 +55,21 @@ class HeapNumberMaterializationDescriptor BASE_EMBEDDED { }; +template +class SIMD128MaterializationDescriptor BASE_EMBEDDED { + public: + SIMD128MaterializationDescriptor(T destination, simd128_value_t value) + : destination_(destination), value_(value) { } + + T destination() const { return destination_; } + simd128_value_t value() const { return value_; } + + private: + T destination_; + simd128_value_t value_; +}; + + class ObjectMaterializationDescriptor BASE_EMBEDDED { public: ObjectMaterializationDescriptor( @@ -330,7 +348,10 @@ class Deoptimizer : public Malloced { void AddObjectDuplication(intptr_t slot, int object_index); void AddObjectTaggedValue(intptr_t value); void AddObjectDoubleValue(double value); + void AddObjectSIMD128Value(simd128_value_t value, int translation_opcode); void AddDoubleValue(intptr_t slot_address, double value); + void AddSIMD128Value(intptr_t slot_address, simd128_value_t value, + int translation_opcode); bool ArgumentsObjectIsAdapted(int object_index) { ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); @@ -379,9 +400,9 @@ class Deoptimizer : public Malloced { void SetPlatformCompiledStubRegisters(FrameDescription* output_frame, CodeStubInterfaceDescriptor* desc); - // Fill the given output frame's double registers with the original values - // from the input frame's double registers. - void CopyDoubleRegisters(FrameDescription* output_frame); + // Fill the given output frame's simd128 registers with the original values + // from the input frame's simd128 registers. + void CopySIMD128Registers(FrameDescription* output_frame); // Determines whether the input frame contains alignment padding by looking // at the dynamic alignment state slot inside the frame. @@ -409,8 +430,17 @@ class Deoptimizer : public Malloced { List deferred_objects_tagged_values_; List > deferred_objects_double_values_; + List > + deferred_objects_float32x4_values_; + List > + deferred_objects_float64x2_values_; + List > + deferred_objects_int32x4_values_; List deferred_objects_; List > deferred_heap_numbers_; + List > deferred_float32x4s_; + List > deferred_float64x2s_; + List > deferred_int32x4s_; // Key for lookup of previously materialized objects Address stack_fp_; @@ -477,6 +507,11 @@ class FrameDescription { return read_double_value(reinterpret_cast
(ptr)); } + simd128_value_t GetSIMD128FrameSlot(unsigned offset) { + intptr_t* ptr = GetFrameSlotPointer(offset); + return read_simd128_value(reinterpret_cast
(ptr)); + } + void SetFrameSlot(unsigned offset, intptr_t value) { *GetFrameSlotPointer(offset) = value; } @@ -500,9 +535,11 @@ class FrameDescription { return registers_[n]; } - double GetDoubleRegister(unsigned n) const { - ASSERT(n < ARRAY_SIZE(double_registers_)); - return double_registers_[n]; + double GetDoubleRegister(unsigned n) const; + + simd128_value_t GetSIMD128Register(unsigned n) const { + ASSERT(n < ARRAY_SIZE(simd128_registers_)); + return simd128_registers_[n]; } void SetRegister(unsigned n, intptr_t value) { @@ -510,9 +547,11 @@ class FrameDescription { registers_[n] = value; } - void SetDoubleRegister(unsigned n, double value) { - ASSERT(n < ARRAY_SIZE(double_registers_)); - double_registers_[n] = value; + void SetDoubleRegister(unsigned n, double value); + + void SetSIMD128Register(unsigned n, simd128_value_t value) { + ASSERT(n < ARRAY_SIZE(simd128_registers_)); + simd128_registers_[n] = value; } intptr_t GetTop() const { return top_; } @@ -556,8 +595,8 @@ class FrameDescription { return OFFSET_OF(FrameDescription, registers_); } - static int double_registers_offset() { - return OFFSET_OF(FrameDescription, double_registers_); + static int simd128_registers_offset() { + return OFFSET_OF(FrameDescription, simd128_registers_); } static int frame_size_offset() { @@ -589,7 +628,7 @@ class FrameDescription { uintptr_t frame_size_; // Number of bytes. JSFunction* function_; intptr_t registers_[Register::kNumRegisters]; - double double_registers_[DoubleRegister::kMaxNumRegisters]; + simd128_value_t simd128_registers_[SIMD128Register::kMaxNumRegisters]; intptr_t top_; intptr_t pc_; intptr_t fp_; @@ -688,10 +727,16 @@ class TranslationIterator BASE_EMBEDDED { V(INT32_REGISTER) \ V(UINT32_REGISTER) \ V(DOUBLE_REGISTER) \ + V(FLOAT32x4_REGISTER) \ + V(FLOAT64x2_REGISTER) \ + V(INT32x4_REGISTER) \ V(STACK_SLOT) \ V(INT32_STACK_SLOT) \ V(UINT32_STACK_SLOT) \ V(DOUBLE_STACK_SLOT) \ + V(FLOAT32x4_STACK_SLOT) \ + V(FLOAT64x2_STACK_SLOT) \ + V(INT32x4_STACK_SLOT) \ V(LITERAL) @@ -730,10 +775,12 @@ class Translation BASE_EMBEDDED { void StoreInt32Register(Register reg); void StoreUint32Register(Register reg); void StoreDoubleRegister(DoubleRegister reg); + void StoreSIMD128Register(SIMD128Register reg, Opcode opcode); void StoreStackSlot(int index); void StoreInt32StackSlot(int index); void StoreUint32StackSlot(int index); void StoreDoubleStackSlot(int index); + void StoreSIMD128StackSlot(int index, Opcode opcode); void StoreLiteral(int literal_id); void StoreArgumentsObject(bool args_known, int args_index, int args_length); @@ -763,6 +810,9 @@ class SlotRef BASE_EMBEDDED { INT32, UINT32, DOUBLE, + FLOAT32x4, + FLOAT64x2, + INT32x4, LITERAL, DEFERRED_OBJECT, // Object captured by the escape analysis. // The number of nested objects can be obtained