OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 GenericBinaryFlags flags, | 704 GenericBinaryFlags flags, |
705 TypeInfo operands_type = TypeInfo::Unknown()) | 705 TypeInfo operands_type = TypeInfo::Unknown()) |
706 : op_(op), | 706 : op_(op), |
707 mode_(mode), | 707 mode_(mode), |
708 flags_(flags), | 708 flags_(flags), |
709 args_in_registers_(false), | 709 args_in_registers_(false), |
710 args_reversed_(false), | 710 args_reversed_(false), |
711 static_operands_type_(operands_type), | 711 static_operands_type_(operands_type), |
712 runtime_operands_type_(BinaryOpIC::DEFAULT), | 712 runtime_operands_type_(BinaryOpIC::DEFAULT), |
713 name_(NULL) { | 713 name_(NULL) { |
714 use_sse3_ = CpuFeatures::IsSupported(SSE3); | |
715 ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); | 714 ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); |
716 } | 715 } |
717 | 716 |
718 GenericBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) | 717 GenericBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) |
719 : op_(OpBits::decode(key)), | 718 : op_(OpBits::decode(key)), |
720 mode_(ModeBits::decode(key)), | 719 mode_(ModeBits::decode(key)), |
721 flags_(FlagBits::decode(key)), | 720 flags_(FlagBits::decode(key)), |
722 args_in_registers_(ArgsInRegistersBits::decode(key)), | 721 args_in_registers_(ArgsInRegistersBits::decode(key)), |
723 args_reversed_(ArgsReversedBits::decode(key)), | 722 args_reversed_(ArgsReversedBits::decode(key)), |
724 use_sse3_(SSE3Bits::decode(key)), | |
725 static_operands_type_(TypeInfo::ExpandedRepresentation( | 723 static_operands_type_(TypeInfo::ExpandedRepresentation( |
726 StaticTypeInfoBits::decode(key))), | 724 StaticTypeInfoBits::decode(key))), |
727 runtime_operands_type_(type_info), | 725 runtime_operands_type_(type_info), |
728 name_(NULL) { | 726 name_(NULL) { |
729 } | 727 } |
730 | 728 |
731 // Generate code to call the stub with the supplied arguments. This will add | 729 // Generate code to call the stub with the supplied arguments. This will add |
732 // code at the call site to prepare arguments either in registers or on the | 730 // code at the call site to prepare arguments either in registers or on the |
733 // stack together with the actual call. | 731 // stack together with the actual call. |
734 void GenerateCall(MacroAssembler* masm, Register left, Register right); | 732 void GenerateCall(MacroAssembler* masm, Register left, Register right); |
735 void GenerateCall(MacroAssembler* masm, Register left, Smi* right); | 733 void GenerateCall(MacroAssembler* masm, Register left, Smi* right); |
736 void GenerateCall(MacroAssembler* masm, Smi* left, Register right); | 734 void GenerateCall(MacroAssembler* masm, Smi* left, Register right); |
737 | 735 |
738 Result GenerateCall(MacroAssembler* masm, | 736 Result GenerateCall(MacroAssembler* masm, |
739 VirtualFrame* frame, | 737 VirtualFrame* frame, |
740 Result* left, | 738 Result* left, |
741 Result* right); | 739 Result* right); |
742 | 740 |
743 private: | 741 private: |
744 Token::Value op_; | 742 Token::Value op_; |
745 OverwriteMode mode_; | 743 OverwriteMode mode_; |
746 GenericBinaryFlags flags_; | 744 GenericBinaryFlags flags_; |
747 bool args_in_registers_; // Arguments passed in registers not on the stack. | 745 bool args_in_registers_; // Arguments passed in registers not on the stack. |
748 bool args_reversed_; // Left and right argument are swapped. | 746 bool args_reversed_; // Left and right argument are swapped. |
749 bool use_sse3_; | |
750 | 747 |
751 // Number type information of operands, determined by code generator. | 748 // Number type information of operands, determined by code generator. |
752 TypeInfo static_operands_type_; | 749 TypeInfo static_operands_type_; |
753 | 750 |
754 // Operand type information determined at runtime. | 751 // Operand type information determined at runtime. |
755 BinaryOpIC::TypeInfo runtime_operands_type_; | 752 BinaryOpIC::TypeInfo runtime_operands_type_; |
756 | 753 |
757 char* name_; | 754 char* name_; |
758 | 755 |
759 const char* GetName(); | 756 const char* GetName(); |
760 | 757 |
761 #ifdef DEBUG | 758 #ifdef DEBUG |
762 void Print() { | 759 void Print() { |
763 PrintF("GenericBinaryOpStub %d (op %s), " | 760 PrintF("GenericBinaryOpStub %d (op %s), " |
764 "(mode %d, flags %d, registers %d, reversed %d, only_numbers %s)\n", | 761 "(mode %d, flags %d, registers %d, reversed %d, only_numbers %s)\n", |
765 MinorKey(), | 762 MinorKey(), |
766 Token::String(op_), | 763 Token::String(op_), |
767 static_cast<int>(mode_), | 764 static_cast<int>(mode_), |
768 static_cast<int>(flags_), | 765 static_cast<int>(flags_), |
769 static_cast<int>(args_in_registers_), | 766 static_cast<int>(args_in_registers_), |
770 static_cast<int>(args_reversed_), | 767 static_cast<int>(args_reversed_), |
771 static_operands_type_.ToString()); | 768 static_operands_type_.ToString()); |
772 } | 769 } |
773 #endif | 770 #endif |
774 | 771 |
775 // Minor key encoding in 18 bits TTNNNFRASOOOOOOOMM. | 772 // Minor key encoding in 18 bits TTNNNFRASOOOOOOOMM. |
776 class ModeBits: public BitField<OverwriteMode, 0, 2> {}; | 773 class ModeBits: public BitField<OverwriteMode, 0, 2> {}; |
777 class OpBits: public BitField<Token::Value, 2, 7> {}; | 774 class OpBits: public BitField<Token::Value, 2, 7> {}; |
778 class SSE3Bits: public BitField<bool, 9, 1> {}; | 775 // One bit free here (removed SSE3 bit) |
779 class ArgsInRegistersBits: public BitField<bool, 10, 1> {}; | 776 class ArgsInRegistersBits: public BitField<bool, 10, 1> {}; |
780 class ArgsReversedBits: public BitField<bool, 11, 1> {}; | 777 class ArgsReversedBits: public BitField<bool, 11, 1> {}; |
781 class FlagBits: public BitField<GenericBinaryFlags, 12, 1> {}; | 778 class FlagBits: public BitField<GenericBinaryFlags, 12, 1> {}; |
782 class StaticTypeInfoBits: public BitField<int, 13, 3> {}; | 779 class StaticTypeInfoBits: public BitField<int, 13, 3> {}; |
783 class RuntimeTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 16, 2> {}; | 780 class RuntimeTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 16, 2> {}; |
784 | 781 |
785 Major MajorKey() { return GenericBinaryOp; } | 782 Major MajorKey() { return GenericBinaryOp; } |
786 int MinorKey() { | 783 int MinorKey() { |
787 // Encode the parameters in a unique 18 bit value. | 784 // Encode the parameters in a unique 18 bit value. |
788 return OpBits::encode(op_) | 785 return OpBits::encode(op_) |
789 | ModeBits::encode(mode_) | 786 | ModeBits::encode(mode_) |
790 | FlagBits::encode(flags_) | 787 | FlagBits::encode(flags_) |
791 | SSE3Bits::encode(use_sse3_) | |
792 | ArgsInRegistersBits::encode(args_in_registers_) | 788 | ArgsInRegistersBits::encode(args_in_registers_) |
793 | ArgsReversedBits::encode(args_reversed_) | 789 | ArgsReversedBits::encode(args_reversed_) |
794 | StaticTypeInfoBits::encode( | 790 | StaticTypeInfoBits::encode( |
795 static_operands_type_.ThreeBitRepresentation()) | 791 static_operands_type_.ThreeBitRepresentation()) |
796 | RuntimeTypeInfoBits::encode(runtime_operands_type_); | 792 | RuntimeTypeInfoBits::encode(runtime_operands_type_); |
797 } | 793 } |
798 | 794 |
799 void Generate(MacroAssembler* masm); | 795 void Generate(MacroAssembler* masm); |
800 void GenerateSmiCode(MacroAssembler* masm, Label* slow); | 796 void GenerateSmiCode(MacroAssembler* masm, Label* slow); |
801 void GenerateLoadArguments(MacroAssembler* masm); | 797 void GenerateLoadArguments(MacroAssembler* masm); |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1046 return ObjectBits::encode(object_.code()) | | 1042 return ObjectBits::encode(object_.code()) | |
1047 AddressBits::encode(addr_.code()) | | 1043 AddressBits::encode(addr_.code()) | |
1048 ScratchBits::encode(scratch_.code()); | 1044 ScratchBits::encode(scratch_.code()); |
1049 } | 1045 } |
1050 }; | 1046 }; |
1051 | 1047 |
1052 | 1048 |
1053 } } // namespace v8::internal | 1049 } } // namespace v8::internal |
1054 | 1050 |
1055 #endif // V8_X64_CODEGEN_X64_H_ | 1051 #endif // V8_X64_CODEGEN_X64_H_ |
OLD | NEW |