OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 union conversion { | 48 union conversion { |
49 double d; | 49 double d; |
50 uint32_t u[2]; | 50 uint32_t u[2]; |
51 } c; | 51 } c; |
52 c.u[0] = *reinterpret_cast<uint32_t*>(p); | 52 c.u[0] = *reinterpret_cast<uint32_t*>(p); |
53 c.u[1] = *reinterpret_cast<uint32_t*>(p + 4); | 53 c.u[1] = *reinterpret_cast<uint32_t*>(p + 4); |
54 return c.d; | 54 return c.d; |
55 #endif // V8_HOST_CAN_READ_UNALIGNED | 55 #endif // V8_HOST_CAN_READ_UNALIGNED |
56 } | 56 } |
57 | 57 |
| 58 static inline float32x4_value_t read_float32x4_value(Address p) { |
| 59 return Memory::float32x4_at(p); |
| 60 } |
| 61 |
| 62 static inline int32x4_value_t read_int32x4_value(Address p) { |
| 63 return Memory::int32x4_at(p); |
| 64 } |
58 | 65 |
59 class FrameDescription; | 66 class FrameDescription; |
60 class TranslationIterator; | 67 class TranslationIterator; |
61 class DeoptimizedFrameInfo; | 68 class DeoptimizedFrameInfo; |
62 | 69 |
63 template<typename T> | 70 template<typename T> |
64 class HeapNumberMaterializationDescriptor BASE_EMBEDDED { | 71 class HeapNumberMaterializationDescriptor BASE_EMBEDDED { |
65 public: | 72 public: |
66 HeapNumberMaterializationDescriptor(T destination, double value) | 73 HeapNumberMaterializationDescriptor(T destination, double value) |
67 : destination_(destination), value_(value) { } | 74 : destination_(destination), value_(value) { } |
68 | 75 |
69 T destination() const { return destination_; } | 76 T destination() const { return destination_; } |
70 double value() const { return value_; } | 77 double value() const { return value_; } |
71 | 78 |
72 private: | 79 private: |
73 T destination_; | 80 T destination_; |
74 double value_; | 81 double value_; |
75 }; | 82 }; |
76 | 83 |
77 | 84 |
| 85 template<typename T> |
| 86 class Float32x4MaterializationDescriptor BASE_EMBEDDED { |
| 87 public: |
| 88 Float32x4MaterializationDescriptor(T destination, float32x4_value_t value) |
| 89 : destination_(destination), value_(value) { } |
| 90 |
| 91 T destination() const { return destination_; } |
| 92 float32x4_value_t value() const { return value_; } |
| 93 |
| 94 private: |
| 95 T destination_; |
| 96 float32x4_value_t value_; |
| 97 }; |
| 98 |
| 99 |
| 100 template<typename T> |
| 101 class Int32x4MaterializationDescriptor BASE_EMBEDDED { |
| 102 public: |
| 103 Int32x4MaterializationDescriptor(T destination, int32x4_value_t value) |
| 104 : destination_(destination), value_(value) { } |
| 105 |
| 106 T destination() const { return destination_; } |
| 107 int32x4_value_t value() const { return value_; } |
| 108 |
| 109 private: |
| 110 T destination_; |
| 111 int32x4_value_t value_; |
| 112 }; |
| 113 |
| 114 |
78 class ObjectMaterializationDescriptor BASE_EMBEDDED { | 115 class ObjectMaterializationDescriptor BASE_EMBEDDED { |
79 public: | 116 public: |
80 ObjectMaterializationDescriptor( | 117 ObjectMaterializationDescriptor( |
81 Address slot_address, int frame, int length, int duplicate, bool is_args) | 118 Address slot_address, int frame, int length, int duplicate, bool is_args) |
82 : slot_address_(slot_address), | 119 : slot_address_(slot_address), |
83 jsframe_index_(frame), | 120 jsframe_index_(frame), |
84 object_length_(length), | 121 object_length_(length), |
85 duplicate_object_(duplicate), | 122 duplicate_object_(duplicate), |
86 is_arguments_(is_args) { } | 123 is_arguments_(is_args) { } |
87 | 124 |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 | 379 |
343 unsigned ComputeIncomingArgumentSize(JSFunction* function) const; | 380 unsigned ComputeIncomingArgumentSize(JSFunction* function) const; |
344 unsigned ComputeOutgoingArgumentSize() const; | 381 unsigned ComputeOutgoingArgumentSize() const; |
345 | 382 |
346 Object* ComputeLiteral(int index) const; | 383 Object* ComputeLiteral(int index) const; |
347 | 384 |
348 void AddObjectStart(intptr_t slot_address, int argc, bool is_arguments); | 385 void AddObjectStart(intptr_t slot_address, int argc, bool is_arguments); |
349 void AddObjectDuplication(intptr_t slot, int object_index); | 386 void AddObjectDuplication(intptr_t slot, int object_index); |
350 void AddObjectTaggedValue(intptr_t value); | 387 void AddObjectTaggedValue(intptr_t value); |
351 void AddObjectDoubleValue(double value); | 388 void AddObjectDoubleValue(double value); |
| 389 void AddObjectFloat32x4Value(float32x4_value_t value); |
| 390 void AddObjectInt32x4Value(int32x4_value_t value); |
352 void AddDoubleValue(intptr_t slot_address, double value); | 391 void AddDoubleValue(intptr_t slot_address, double value); |
| 392 void AddFloat32x4Value(intptr_t slot_address, float32x4_value_t value); |
| 393 void AddInt32x4Value(intptr_t slot_address, int32x4_value_t value); |
353 | 394 |
354 bool ArgumentsObjectIsAdapted(int object_index) { | 395 bool ArgumentsObjectIsAdapted(int object_index) { |
355 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); | 396 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); |
356 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; | 397 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; |
357 return jsframe_has_adapted_arguments_[reverse_jsframe_index]; | 398 return jsframe_has_adapted_arguments_[reverse_jsframe_index]; |
358 } | 399 } |
359 | 400 |
360 Handle<JSFunction> ArgumentsObjectFunction(int object_index) { | 401 Handle<JSFunction> ArgumentsObjectFunction(int object_index) { |
361 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); | 402 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); |
362 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; | 403 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 int output_count_; | 466 int output_count_; |
426 // Number of output js frames. | 467 // Number of output js frames. |
427 int jsframe_count_; | 468 int jsframe_count_; |
428 // Array of output frame descriptions. | 469 // Array of output frame descriptions. |
429 FrameDescription** output_; | 470 FrameDescription** output_; |
430 | 471 |
431 // Deferred values to be materialized. | 472 // Deferred values to be materialized. |
432 List<Object*> deferred_objects_tagged_values_; | 473 List<Object*> deferred_objects_tagged_values_; |
433 List<HeapNumberMaterializationDescriptor<int> > | 474 List<HeapNumberMaterializationDescriptor<int> > |
434 deferred_objects_double_values_; | 475 deferred_objects_double_values_; |
| 476 List<Float32x4MaterializationDescriptor<int> > |
| 477 deferred_objects_float32x4_values_; |
| 478 List<Int32x4MaterializationDescriptor<int> > |
| 479 deferred_objects_int32x4_values_; |
435 List<ObjectMaterializationDescriptor> deferred_objects_; | 480 List<ObjectMaterializationDescriptor> deferred_objects_; |
436 List<HeapNumberMaterializationDescriptor<Address> > deferred_heap_numbers_; | 481 List<HeapNumberMaterializationDescriptor<Address> > deferred_heap_numbers_; |
| 482 List<Float32x4MaterializationDescriptor<Address> > deferred_float32x4s_; |
| 483 List<Int32x4MaterializationDescriptor<Address> > deferred_int32x4s_; |
437 | 484 |
438 // Output frame information. Only used during heap object materialization. | 485 // Output frame information. Only used during heap object materialization. |
439 List<Handle<JSFunction> > jsframe_functions_; | 486 List<Handle<JSFunction> > jsframe_functions_; |
440 List<bool> jsframe_has_adapted_arguments_; | 487 List<bool> jsframe_has_adapted_arguments_; |
441 | 488 |
442 // Materialized objects. Only used during heap object materialization. | 489 // Materialized objects. Only used during heap object materialization. |
443 List<Handle<Object> >* materialized_values_; | 490 List<Handle<Object> >* materialized_values_; |
444 List<Handle<Object> >* materialized_objects_; | 491 List<Handle<Object> >* materialized_objects_; |
445 int materialization_value_index_; | 492 int materialization_value_index_; |
446 int materialization_object_index_; | 493 int materialization_object_index_; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 | 535 |
489 intptr_t GetFrameSlot(unsigned offset) { | 536 intptr_t GetFrameSlot(unsigned offset) { |
490 return *GetFrameSlotPointer(offset); | 537 return *GetFrameSlotPointer(offset); |
491 } | 538 } |
492 | 539 |
493 double GetDoubleFrameSlot(unsigned offset) { | 540 double GetDoubleFrameSlot(unsigned offset) { |
494 intptr_t* ptr = GetFrameSlotPointer(offset); | 541 intptr_t* ptr = GetFrameSlotPointer(offset); |
495 return read_double_value(reinterpret_cast<Address>(ptr)); | 542 return read_double_value(reinterpret_cast<Address>(ptr)); |
496 } | 543 } |
497 | 544 |
| 545 float32x4_value_t GetFloat32x4FrameSlot(unsigned offset) { |
| 546 intptr_t* ptr = GetFrameSlotPointer(offset); |
| 547 return read_float32x4_value(reinterpret_cast<Address>(ptr)); |
| 548 } |
| 549 |
| 550 int32x4_value_t GetInt32x4FrameSlot(unsigned offset) { |
| 551 intptr_t* ptr = GetFrameSlotPointer(offset); |
| 552 return read_int32x4_value(reinterpret_cast<Address>(ptr)); |
| 553 } |
| 554 |
498 void SetFrameSlot(unsigned offset, intptr_t value) { | 555 void SetFrameSlot(unsigned offset, intptr_t value) { |
499 *GetFrameSlotPointer(offset) = value; | 556 *GetFrameSlotPointer(offset) = value; |
500 } | 557 } |
501 | 558 |
502 void SetCallerPc(unsigned offset, intptr_t value); | 559 void SetCallerPc(unsigned offset, intptr_t value); |
503 | 560 |
504 void SetCallerFp(unsigned offset, intptr_t value); | 561 void SetCallerFp(unsigned offset, intptr_t value); |
505 | 562 |
506 intptr_t GetRegister(unsigned n) const { | 563 intptr_t GetRegister(unsigned n) const { |
507 #if DEBUG | 564 #if DEBUG |
508 // This convoluted ASSERT is needed to work around a gcc problem that | 565 // This convoluted ASSERT is needed to work around a gcc problem that |
509 // improperly detects an array bounds overflow in optimized debug builds | 566 // improperly detects an array bounds overflow in optimized debug builds |
510 // when using a plain ASSERT. | 567 // when using a plain ASSERT. |
511 if (n >= ARRAY_SIZE(registers_)) { | 568 if (n >= ARRAY_SIZE(registers_)) { |
512 ASSERT(false); | 569 ASSERT(false); |
513 return 0; | 570 return 0; |
514 } | 571 } |
515 #endif | 572 #endif |
516 return registers_[n]; | 573 return registers_[n]; |
517 } | 574 } |
518 | 575 |
519 double GetDoubleRegister(unsigned n) const { | 576 double GetDoubleRegister(unsigned n) const { |
520 ASSERT(n < ARRAY_SIZE(double_registers_)); | 577 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
521 return double_registers_[n]; | 578 return xmm_registers_[n].d[0]; |
| 579 } |
| 580 |
| 581 float32x4_value_t GetFloat32x4Register(unsigned n) const { |
| 582 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
| 583 return xmm_registers_[n].f; |
| 584 } |
| 585 |
| 586 int32x4_value_t GetInt32x4Register(unsigned n) const { |
| 587 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
| 588 return xmm_registers_[n].u; |
| 589 } |
| 590 |
| 591 xmm_value_t GetXMMRegister(unsigned n) const { |
| 592 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
| 593 return xmm_registers_[n]; |
522 } | 594 } |
523 | 595 |
524 void SetRegister(unsigned n, intptr_t value) { | 596 void SetRegister(unsigned n, intptr_t value) { |
525 ASSERT(n < ARRAY_SIZE(registers_)); | 597 ASSERT(n < ARRAY_SIZE(registers_)); |
526 registers_[n] = value; | 598 registers_[n] = value; |
527 } | 599 } |
528 | 600 |
529 void SetDoubleRegister(unsigned n, double value) { | 601 void SetDoubleRegister(unsigned n, double value) { |
530 ASSERT(n < ARRAY_SIZE(double_registers_)); | 602 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
531 double_registers_[n] = value; | 603 xmm_registers_[n].d[0] = value; |
| 604 } |
| 605 |
| 606 void SetXMMRegister(unsigned n, xmm_value_t value) { |
| 607 ASSERT(n < ARRAY_SIZE(xmm_registers_)); |
| 608 xmm_registers_[n] = value; |
532 } | 609 } |
533 | 610 |
534 intptr_t GetTop() const { return top_; } | 611 intptr_t GetTop() const { return top_; } |
535 void SetTop(intptr_t top) { top_ = top; } | 612 void SetTop(intptr_t top) { top_ = top; } |
536 | 613 |
537 intptr_t GetPc() const { return pc_; } | 614 intptr_t GetPc() const { return pc_; } |
538 void SetPc(intptr_t pc) { pc_ = pc; } | 615 void SetPc(intptr_t pc) { pc_ = pc; } |
539 | 616 |
540 intptr_t GetFp() const { return fp_; } | 617 intptr_t GetFp() const { return fp_; } |
541 void SetFp(intptr_t fp) { fp_ = fp; } | 618 void SetFp(intptr_t fp) { fp_ = fp; } |
(...skipping 18 matching lines...) Expand all Loading... |
560 // Get the expression stack height for a unoptimized frame. | 637 // Get the expression stack height for a unoptimized frame. |
561 unsigned GetExpressionCount(); | 638 unsigned GetExpressionCount(); |
562 | 639 |
563 // Get the expression stack value for an unoptimized frame. | 640 // Get the expression stack value for an unoptimized frame. |
564 Object* GetExpression(int index); | 641 Object* GetExpression(int index); |
565 | 642 |
566 static int registers_offset() { | 643 static int registers_offset() { |
567 return OFFSET_OF(FrameDescription, registers_); | 644 return OFFSET_OF(FrameDescription, registers_); |
568 } | 645 } |
569 | 646 |
570 static int double_registers_offset() { | 647 static int xmm_registers_offset() { |
571 return OFFSET_OF(FrameDescription, double_registers_); | 648 return OFFSET_OF(FrameDescription, xmm_registers_); |
572 } | 649 } |
573 | 650 |
574 static int frame_size_offset() { | 651 static int frame_size_offset() { |
575 return OFFSET_OF(FrameDescription, frame_size_); | 652 return OFFSET_OF(FrameDescription, frame_size_); |
576 } | 653 } |
577 | 654 |
578 static int pc_offset() { | 655 static int pc_offset() { |
579 return OFFSET_OF(FrameDescription, pc_); | 656 return OFFSET_OF(FrameDescription, pc_); |
580 } | 657 } |
581 | 658 |
(...skipping 11 matching lines...) Expand all Loading... |
593 | 670 |
594 private: | 671 private: |
595 static const uint32_t kZapUint32 = 0xbeeddead; | 672 static const uint32_t kZapUint32 = 0xbeeddead; |
596 | 673 |
597 // Frame_size_ must hold a uint32_t value. It is only a uintptr_t to | 674 // Frame_size_ must hold a uint32_t value. It is only a uintptr_t to |
598 // keep the variable-size array frame_content_ of type intptr_t at | 675 // keep the variable-size array frame_content_ of type intptr_t at |
599 // the end of the structure aligned. | 676 // the end of the structure aligned. |
600 uintptr_t frame_size_; // Number of bytes. | 677 uintptr_t frame_size_; // Number of bytes. |
601 JSFunction* function_; | 678 JSFunction* function_; |
602 intptr_t registers_[Register::kNumRegisters]; | 679 intptr_t registers_[Register::kNumRegisters]; |
603 double double_registers_[DoubleRegister::kMaxNumRegisters]; | 680 xmm_value_t xmm_registers_[XMMRegister::kMaxNumRegisters]; |
604 intptr_t top_; | 681 intptr_t top_; |
605 intptr_t pc_; | 682 intptr_t pc_; |
606 intptr_t fp_; | 683 intptr_t fp_; |
607 intptr_t context_; | 684 intptr_t context_; |
608 StackFrame::Type type_; | 685 StackFrame::Type type_; |
609 Smi* state_; | 686 Smi* state_; |
610 | 687 |
611 // Continuation is the PC where the execution continues after | 688 // Continuation is the PC where the execution continues after |
612 // deoptimizing. | 689 // deoptimizing. |
613 intptr_t continuation_; | 690 intptr_t continuation_; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 V(SETTER_STUB_FRAME) \ | 772 V(SETTER_STUB_FRAME) \ |
696 V(ARGUMENTS_ADAPTOR_FRAME) \ | 773 V(ARGUMENTS_ADAPTOR_FRAME) \ |
697 V(COMPILED_STUB_FRAME) \ | 774 V(COMPILED_STUB_FRAME) \ |
698 V(DUPLICATED_OBJECT) \ | 775 V(DUPLICATED_OBJECT) \ |
699 V(ARGUMENTS_OBJECT) \ | 776 V(ARGUMENTS_OBJECT) \ |
700 V(CAPTURED_OBJECT) \ | 777 V(CAPTURED_OBJECT) \ |
701 V(REGISTER) \ | 778 V(REGISTER) \ |
702 V(INT32_REGISTER) \ | 779 V(INT32_REGISTER) \ |
703 V(UINT32_REGISTER) \ | 780 V(UINT32_REGISTER) \ |
704 V(DOUBLE_REGISTER) \ | 781 V(DOUBLE_REGISTER) \ |
| 782 V(FLOAT32x4_REGISTER) \ |
| 783 V(INT32x4_REGISTER) \ |
705 V(STACK_SLOT) \ | 784 V(STACK_SLOT) \ |
706 V(INT32_STACK_SLOT) \ | 785 V(INT32_STACK_SLOT) \ |
707 V(UINT32_STACK_SLOT) \ | 786 V(UINT32_STACK_SLOT) \ |
708 V(DOUBLE_STACK_SLOT) \ | 787 V(DOUBLE_STACK_SLOT) \ |
| 788 V(FLOAT32x4_STACK_SLOT) \ |
| 789 V(INT32x4_STACK_SLOT) \ |
709 V(LITERAL) | 790 V(LITERAL) |
710 | 791 |
711 | 792 |
712 class Translation BASE_EMBEDDED { | 793 class Translation BASE_EMBEDDED { |
713 public: | 794 public: |
714 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, | 795 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, |
715 enum Opcode { | 796 enum Opcode { |
716 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) | 797 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) |
717 LAST = LITERAL | 798 LAST = LITERAL |
718 }; | 799 }; |
(...skipping 18 matching lines...) Expand all Loading... |
737 void BeginConstructStubFrame(int literal_id, unsigned height); | 818 void BeginConstructStubFrame(int literal_id, unsigned height); |
738 void BeginGetterStubFrame(int literal_id); | 819 void BeginGetterStubFrame(int literal_id); |
739 void BeginSetterStubFrame(int literal_id); | 820 void BeginSetterStubFrame(int literal_id); |
740 void BeginArgumentsObject(int args_length); | 821 void BeginArgumentsObject(int args_length); |
741 void BeginCapturedObject(int length); | 822 void BeginCapturedObject(int length); |
742 void DuplicateObject(int object_index); | 823 void DuplicateObject(int object_index); |
743 void StoreRegister(Register reg); | 824 void StoreRegister(Register reg); |
744 void StoreInt32Register(Register reg); | 825 void StoreInt32Register(Register reg); |
745 void StoreUint32Register(Register reg); | 826 void StoreUint32Register(Register reg); |
746 void StoreDoubleRegister(DoubleRegister reg); | 827 void StoreDoubleRegister(DoubleRegister reg); |
| 828 void StoreFloat32x4Register(Float32x4Register reg); |
| 829 void StoreInt32x4Register(Float32x4Register reg); |
747 void StoreStackSlot(int index); | 830 void StoreStackSlot(int index); |
748 void StoreInt32StackSlot(int index); | 831 void StoreInt32StackSlot(int index); |
749 void StoreUint32StackSlot(int index); | 832 void StoreUint32StackSlot(int index); |
750 void StoreDoubleStackSlot(int index); | 833 void StoreDoubleStackSlot(int index); |
| 834 void StoreFloat32x4StackSlot(int index); |
| 835 void StoreInt32x4StackSlot(int index); |
751 void StoreLiteral(int literal_id); | 836 void StoreLiteral(int literal_id); |
752 void StoreArgumentsObject(bool args_known, int args_index, int args_length); | 837 void StoreArgumentsObject(bool args_known, int args_index, int args_length); |
753 | 838 |
754 Zone* zone() const { return zone_; } | 839 Zone* zone() const { return zone_; } |
755 | 840 |
756 static int NumberOfOperandsFor(Opcode opcode); | 841 static int NumberOfOperandsFor(Opcode opcode); |
757 | 842 |
758 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) | 843 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) |
759 static const char* StringFor(Opcode opcode); | 844 static const char* StringFor(Opcode opcode); |
760 #endif | 845 #endif |
761 | 846 |
762 // A literal id which refers to the JSFunction itself. | 847 // A literal id which refers to the JSFunction itself. |
763 static const int kSelfLiteralId = -239; | 848 static const int kSelfLiteralId = -239; |
764 | 849 |
765 private: | 850 private: |
766 TranslationBuffer* buffer_; | 851 TranslationBuffer* buffer_; |
767 int index_; | 852 int index_; |
768 Zone* zone_; | 853 Zone* zone_; |
769 }; | 854 }; |
770 | 855 |
771 | 856 |
772 class SlotRef BASE_EMBEDDED { | 857 class SlotRef BASE_EMBEDDED { |
773 public: | 858 public: |
774 enum SlotRepresentation { | 859 enum SlotRepresentation { |
775 UNKNOWN, | 860 UNKNOWN, |
776 TAGGED, | 861 TAGGED, |
777 INT32, | 862 INT32, |
778 UINT32, | 863 UINT32, |
779 DOUBLE, | 864 DOUBLE, |
| 865 FLOAT32x4, |
| 866 INT32x4, |
780 LITERAL | 867 LITERAL |
781 }; | 868 }; |
782 | 869 |
783 SlotRef() | 870 SlotRef() |
784 : addr_(NULL), representation_(UNKNOWN) { } | 871 : addr_(NULL), representation_(UNKNOWN) { } |
785 | 872 |
786 SlotRef(Address addr, SlotRepresentation representation) | 873 SlotRef(Address addr, SlotRepresentation representation) |
787 : addr_(addr), representation_(representation) { } | 874 : addr_(addr), representation_(representation) { } |
788 | 875 |
789 SlotRef(Isolate* isolate, Object* literal) | 876 SlotRef(Isolate* isolate, Object* literal) |
(...skipping 20 matching lines...) Expand all Loading... |
810 } else { | 897 } else { |
811 return isolate->factory()->NewNumber(static_cast<double>(value)); | 898 return isolate->factory()->NewNumber(static_cast<double>(value)); |
812 } | 899 } |
813 } | 900 } |
814 | 901 |
815 case DOUBLE: { | 902 case DOUBLE: { |
816 double value = read_double_value(addr_); | 903 double value = read_double_value(addr_); |
817 return isolate->factory()->NewNumber(value); | 904 return isolate->factory()->NewNumber(value); |
818 } | 905 } |
819 | 906 |
| 907 case FLOAT32x4: { |
| 908 float32x4_value_t value = read_float32x4_value(addr_); |
| 909 return isolate->factory()->NewFloat32x4(value); |
| 910 } |
| 911 |
| 912 case INT32x4: { |
| 913 int32x4_value_t value = read_int32x4_value(addr_); |
| 914 return isolate->factory()->NewInt32x4(value); |
| 915 } |
| 916 |
820 case LITERAL: | 917 case LITERAL: |
821 return literal_; | 918 return literal_; |
822 | 919 |
823 default: | 920 default: |
824 UNREACHABLE(); | 921 UNREACHABLE(); |
825 return Handle<Object>::null(); | 922 return Handle<Object>::null(); |
826 } | 923 } |
827 } | 924 } |
828 | 925 |
829 static Vector<SlotRef> ComputeSlotMappingForArguments( | 926 static Vector<SlotRef> ComputeSlotMappingForArguments( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 Object** expression_stack_; | 1027 Object** expression_stack_; |
931 int source_position_; | 1028 int source_position_; |
932 | 1029 |
933 friend class Deoptimizer; | 1030 friend class Deoptimizer; |
934 }; | 1031 }; |
935 #endif | 1032 #endif |
936 | 1033 |
937 } } // namespace v8::internal | 1034 } } // namespace v8::internal |
938 | 1035 |
939 #endif // V8_DEOPTIMIZER_H_ | 1036 #endif // V8_DEOPTIMIZER_H_ |
OLD | NEW |