OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 | 890 |
891 protected: | 891 protected: |
892 explicit HandlerStub(Isolate* isolate) : HICStub(isolate) { } | 892 explicit HandlerStub(Isolate* isolate) : HICStub(isolate) { } |
893 virtual int NotMissMinorKey() { return bit_field_; } | 893 virtual int NotMissMinorKey() { return bit_field_; } |
894 int bit_field_; | 894 int bit_field_; |
895 }; | 895 }; |
896 | 896 |
897 | 897 |
898 class LoadFieldStub: public HandlerStub { | 898 class LoadFieldStub: public HandlerStub { |
899 public: | 899 public: |
900 LoadFieldStub(Isolate* isolate, FieldIndex index) | 900 LoadFieldStub(Isolate* isolate, |
901 : HandlerStub(isolate), index_(index) { | 901 bool inobject, |
902 Initialize(Code::LOAD_IC); | 902 int index, Representation representation) |
| 903 : HandlerStub(isolate) { |
| 904 Initialize(Code::LOAD_IC, inobject, index, representation); |
903 } | 905 } |
904 | 906 |
905 virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 907 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
906 | 908 |
907 virtual void InitializeInterfaceDescriptor( | 909 virtual void InitializeInterfaceDescriptor( |
908 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 910 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
909 | 911 |
910 Representation representation() { | 912 Representation representation() { |
911 if (unboxed_double()) return Representation::Double(); | 913 if (unboxed_double()) return Representation::Double(); |
912 return Representation::Tagged(); | 914 return Representation::Tagged(); |
913 } | 915 } |
914 | 916 |
915 virtual Code::Kind kind() const { | 917 virtual Code::Kind kind() const { |
916 return KindBits::decode(bit_field_); | 918 return KindBits::decode(bit_field_); |
917 } | 919 } |
918 | 920 |
919 FieldIndex index() const { return index_; } | 921 bool is_inobject() { |
| 922 return InobjectBits::decode(bit_field_); |
| 923 } |
| 924 |
| 925 int offset() { |
| 926 int index = IndexBits::decode(bit_field_); |
| 927 int offset = index * kPointerSize; |
| 928 if (is_inobject()) return offset; |
| 929 return FixedArray::kHeaderSize + offset; |
| 930 } |
920 | 931 |
921 bool unboxed_double() { | 932 bool unboxed_double() { |
922 return index_.is_double(); | 933 return UnboxedDoubleBits::decode(bit_field_); |
923 } | 934 } |
924 | 935 |
925 virtual Code::StubType GetStubType() { return Code::FAST; } | 936 virtual Code::StubType GetStubType() { return Code::FAST; } |
926 | 937 |
927 protected: | 938 protected: |
928 explicit LoadFieldStub(Isolate* isolate); | 939 explicit LoadFieldStub(Isolate* isolate) : HandlerStub(isolate) { } |
929 | 940 |
930 void Initialize(Code::Kind kind) { | 941 void Initialize(Code::Kind kind, |
931 int property_index_key = index_.GetLoadFieldStubKey(); | 942 bool inobject, |
932 // Save a copy of the essence of the property index into the bit field to | 943 int index, |
933 // make sure that hashing of unique stubs works correctly.. | 944 Representation representation) { |
934 bit_field_ = KindBits::encode(kind) | | 945 bit_field_ = KindBits::encode(kind) |
935 EncodedLoadFieldByIndexBits::encode(property_index_key); | 946 | InobjectBits::encode(inobject) |
| 947 | IndexBits::encode(index) |
| 948 | UnboxedDoubleBits::encode(representation.IsDouble()); |
936 } | 949 } |
937 | 950 |
938 private: | 951 private: |
939 STATIC_ASSERT(KindBits::kSize == 4); | 952 STATIC_ASSERT(KindBits::kSize == 4); |
940 class EncodedLoadFieldByIndexBits: public BitField<int, 4, 13> {}; | 953 class InobjectBits: public BitField<bool, 4, 1> {}; |
| 954 class IndexBits: public BitField<int, 5, 11> {}; |
| 955 class UnboxedDoubleBits: public BitField<bool, 16, 1> {}; |
941 virtual CodeStub::Major MajorKey() { return LoadField; } | 956 virtual CodeStub::Major MajorKey() { return LoadField; } |
942 FieldIndex index_; | |
943 }; | 957 }; |
944 | 958 |
945 | 959 |
946 class StringLengthStub: public HandlerStub { | 960 class StringLengthStub: public HandlerStub { |
947 public: | 961 public: |
948 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) { | 962 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) { |
949 Initialize(Code::LOAD_IC); | 963 Initialize(Code::LOAD_IC); |
950 } | 964 } |
951 virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 965 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
952 virtual void InitializeInterfaceDescriptor( | 966 virtual void InitializeInterfaceDescriptor( |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1077 virtual void Generate(MacroAssembler* masm) V8_OVERRIDE; | 1091 virtual void Generate(MacroAssembler* masm) V8_OVERRIDE; |
1078 virtual Major MajorKey() V8_OVERRIDE { return CallApiGetter; } | 1092 virtual Major MajorKey() V8_OVERRIDE { return CallApiGetter; } |
1079 virtual int MinorKey() V8_OVERRIDE { return 0; } | 1093 virtual int MinorKey() V8_OVERRIDE { return 0; } |
1080 | 1094 |
1081 DISALLOW_COPY_AND_ASSIGN(CallApiGetterStub); | 1095 DISALLOW_COPY_AND_ASSIGN(CallApiGetterStub); |
1082 }; | 1096 }; |
1083 | 1097 |
1084 | 1098 |
1085 class KeyedLoadFieldStub: public LoadFieldStub { | 1099 class KeyedLoadFieldStub: public LoadFieldStub { |
1086 public: | 1100 public: |
1087 KeyedLoadFieldStub(Isolate* isolate, FieldIndex index) | 1101 KeyedLoadFieldStub(Isolate* isolate, |
1088 : LoadFieldStub(isolate, index) { | 1102 bool inobject, |
1089 Initialize(Code::KEYED_LOAD_IC); | 1103 int index, Representation representation) |
| 1104 : LoadFieldStub(isolate) { |
| 1105 Initialize(Code::KEYED_LOAD_IC, inobject, index, representation); |
1090 } | 1106 } |
1091 | 1107 |
1092 virtual void InitializeInterfaceDescriptor( | 1108 virtual void InitializeInterfaceDescriptor( |
1093 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 1109 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
1094 | 1110 |
1095 private: | 1111 private: |
1096 virtual CodeStub::Major MajorKey() { return KeyedLoadField; } | 1112 virtual CodeStub::Major MajorKey() { return KeyedLoadField; } |
1097 }; | 1113 }; |
1098 | 1114 |
1099 | 1115 |
(...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2459 | 2475 |
2460 | 2476 |
2461 class CallDescriptors { | 2477 class CallDescriptors { |
2462 public: | 2478 public: |
2463 static void InitializeForIsolate(Isolate* isolate); | 2479 static void InitializeForIsolate(Isolate* isolate); |
2464 }; | 2480 }; |
2465 | 2481 |
2466 } } // namespace v8::internal | 2482 } } // namespace v8::internal |
2467 | 2483 |
2468 #endif // V8_CODE_STUBS_H_ | 2484 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |