| Index: src/deoptimizer.h
|
| diff --git a/src/deoptimizer.h b/src/deoptimizer.h
|
| index f518546018bfcbab66a7ac7ee8f7dcaca269082f..c4a995f420958ec71c773cfc1ed37a7ea70c1310 100644
|
| --- a/src/deoptimizer.h
|
| +++ b/src/deoptimizer.h
|
| @@ -55,6 +55,13 @@ static inline double read_double_value(Address p) {
|
| #endif // V8_HOST_CAN_READ_UNALIGNED
|
| }
|
|
|
| +static inline float32x4_value_t read_float32x4_value(Address p) {
|
| + return Memory::float32x4_at(p);
|
| +}
|
| +
|
| +static inline int32x4_value_t read_int32x4_value(Address p) {
|
| + return Memory::int32x4_at(p);
|
| +}
|
|
|
| class FrameDescription;
|
| class TranslationIterator;
|
| @@ -75,6 +82,36 @@ class HeapNumberMaterializationDescriptor BASE_EMBEDDED {
|
| };
|
|
|
|
|
| +template<typename T>
|
| +class Float32x4MaterializationDescriptor BASE_EMBEDDED {
|
| + public:
|
| + Float32x4MaterializationDescriptor(T destination, float32x4_value_t value)
|
| + : destination_(destination), value_(value) { }
|
| +
|
| + T destination() const { return destination_; }
|
| + float32x4_value_t value() const { return value_; }
|
| +
|
| + private:
|
| + T destination_;
|
| + float32x4_value_t value_;
|
| +};
|
| +
|
| +
|
| +template<typename T>
|
| +class Int32x4MaterializationDescriptor BASE_EMBEDDED {
|
| + public:
|
| + Int32x4MaterializationDescriptor(T destination, int32x4_value_t value)
|
| + : destination_(destination), value_(value) { }
|
| +
|
| + T destination() const { return destination_; }
|
| + int32x4_value_t value() const { return value_; }
|
| +
|
| + private:
|
| + T destination_;
|
| + int32x4_value_t value_;
|
| +};
|
| +
|
| +
|
| class ObjectMaterializationDescriptor BASE_EMBEDDED {
|
| public:
|
| ObjectMaterializationDescriptor(
|
| @@ -349,7 +386,11 @@ class Deoptimizer : public Malloced {
|
| void AddObjectDuplication(intptr_t slot, int object_index);
|
| void AddObjectTaggedValue(intptr_t value);
|
| void AddObjectDoubleValue(double value);
|
| + void AddObjectFloat32x4Value(float32x4_value_t value);
|
| + void AddObjectInt32x4Value(int32x4_value_t value);
|
| void AddDoubleValue(intptr_t slot_address, double value);
|
| + void AddFloat32x4Value(intptr_t slot_address, float32x4_value_t value);
|
| + void AddInt32x4Value(intptr_t slot_address, int32x4_value_t value);
|
|
|
| bool ArgumentsObjectIsAdapted(int object_index) {
|
| ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index);
|
| @@ -432,8 +473,14 @@ class Deoptimizer : public Malloced {
|
| List<Object*> deferred_objects_tagged_values_;
|
| List<HeapNumberMaterializationDescriptor<int> >
|
| deferred_objects_double_values_;
|
| + List<Float32x4MaterializationDescriptor<int> >
|
| + deferred_objects_float32x4_values_;
|
| + List<Int32x4MaterializationDescriptor<int> >
|
| + deferred_objects_int32x4_values_;
|
| List<ObjectMaterializationDescriptor> deferred_objects_;
|
| List<HeapNumberMaterializationDescriptor<Address> > deferred_heap_numbers_;
|
| + List<Float32x4MaterializationDescriptor<Address> > deferred_float32x4s_;
|
| + List<Int32x4MaterializationDescriptor<Address> > deferred_int32x4s_;
|
|
|
| // Output frame information. Only used during heap object materialization.
|
| List<Handle<JSFunction> > jsframe_functions_;
|
| @@ -495,6 +542,16 @@ class FrameDescription {
|
| return read_double_value(reinterpret_cast<Address>(ptr));
|
| }
|
|
|
| + float32x4_value_t GetFloat32x4FrameSlot(unsigned offset) {
|
| + intptr_t* ptr = GetFrameSlotPointer(offset);
|
| + return read_float32x4_value(reinterpret_cast<Address>(ptr));
|
| + }
|
| +
|
| + int32x4_value_t GetInt32x4FrameSlot(unsigned offset) {
|
| + intptr_t* ptr = GetFrameSlotPointer(offset);
|
| + return read_int32x4_value(reinterpret_cast<Address>(ptr));
|
| + }
|
| +
|
| void SetFrameSlot(unsigned offset, intptr_t value) {
|
| *GetFrameSlotPointer(offset) = value;
|
| }
|
| @@ -517,8 +574,23 @@ class FrameDescription {
|
| }
|
|
|
| double GetDoubleRegister(unsigned n) const {
|
| - ASSERT(n < ARRAY_SIZE(double_registers_));
|
| - return double_registers_[n];
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + return xmm_registers_[n].d[0];
|
| + }
|
| +
|
| + float32x4_value_t GetFloat32x4Register(unsigned n) const {
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + return xmm_registers_[n].f;
|
| + }
|
| +
|
| + int32x4_value_t GetInt32x4Register(unsigned n) const {
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + return xmm_registers_[n].u;
|
| + }
|
| +
|
| + xmm_value_t GetXMMRegister(unsigned n) const {
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + return xmm_registers_[n];
|
| }
|
|
|
| void SetRegister(unsigned n, intptr_t value) {
|
| @@ -527,8 +599,13 @@ class FrameDescription {
|
| }
|
|
|
| void SetDoubleRegister(unsigned n, double value) {
|
| - ASSERT(n < ARRAY_SIZE(double_registers_));
|
| - double_registers_[n] = value;
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + xmm_registers_[n].d[0] = value;
|
| + }
|
| +
|
| + void SetXMMRegister(unsigned n, xmm_value_t value) {
|
| + ASSERT(n < ARRAY_SIZE(xmm_registers_));
|
| + xmm_registers_[n] = value;
|
| }
|
|
|
| intptr_t GetTop() const { return top_; }
|
| @@ -567,8 +644,8 @@ class FrameDescription {
|
| return OFFSET_OF(FrameDescription, registers_);
|
| }
|
|
|
| - static int double_registers_offset() {
|
| - return OFFSET_OF(FrameDescription, double_registers_);
|
| + static int xmm_registers_offset() {
|
| + return OFFSET_OF(FrameDescription, xmm_registers_);
|
| }
|
|
|
| static int frame_size_offset() {
|
| @@ -600,7 +677,7 @@ class FrameDescription {
|
| uintptr_t frame_size_; // Number of bytes.
|
| JSFunction* function_;
|
| intptr_t registers_[Register::kNumRegisters];
|
| - double double_registers_[DoubleRegister::kMaxNumRegisters];
|
| + xmm_value_t xmm_registers_[XMMRegister::kMaxNumRegisters];
|
| intptr_t top_;
|
| intptr_t pc_;
|
| intptr_t fp_;
|
| @@ -702,10 +779,14 @@ class TranslationIterator BASE_EMBEDDED {
|
| V(INT32_REGISTER) \
|
| V(UINT32_REGISTER) \
|
| V(DOUBLE_REGISTER) \
|
| + V(FLOAT32x4_REGISTER) \
|
| + V(INT32x4_REGISTER) \
|
| V(STACK_SLOT) \
|
| V(INT32_STACK_SLOT) \
|
| V(UINT32_STACK_SLOT) \
|
| V(DOUBLE_STACK_SLOT) \
|
| + V(FLOAT32x4_STACK_SLOT) \
|
| + V(INT32x4_STACK_SLOT) \
|
| V(LITERAL)
|
|
|
|
|
| @@ -744,10 +825,14 @@ class Translation BASE_EMBEDDED {
|
| void StoreInt32Register(Register reg);
|
| void StoreUint32Register(Register reg);
|
| void StoreDoubleRegister(DoubleRegister reg);
|
| + void StoreFloat32x4Register(Float32x4Register reg);
|
| + void StoreInt32x4Register(Float32x4Register reg);
|
| void StoreStackSlot(int index);
|
| void StoreInt32StackSlot(int index);
|
| void StoreUint32StackSlot(int index);
|
| void StoreDoubleStackSlot(int index);
|
| + void StoreFloat32x4StackSlot(int index);
|
| + void StoreInt32x4StackSlot(int index);
|
| void StoreLiteral(int literal_id);
|
| void StoreArgumentsObject(bool args_known, int args_index, int args_length);
|
|
|
| @@ -777,6 +862,8 @@ class SlotRef BASE_EMBEDDED {
|
| INT32,
|
| UINT32,
|
| DOUBLE,
|
| + FLOAT32x4,
|
| + INT32x4,
|
| LITERAL
|
| };
|
|
|
| @@ -817,6 +904,16 @@ class SlotRef BASE_EMBEDDED {
|
| return isolate->factory()->NewNumber(value);
|
| }
|
|
|
| + case FLOAT32x4: {
|
| + float32x4_value_t value = read_float32x4_value(addr_);
|
| + return isolate->factory()->NewFloat32x4(value);
|
| + }
|
| +
|
| + case INT32x4: {
|
| + int32x4_value_t value = read_int32x4_value(addr_);
|
| + return isolate->factory()->NewInt32x4(value);
|
| + }
|
| +
|
| case LITERAL:
|
| return literal_;
|
|
|
|
|