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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 // Returns information for computing the number key. | 197 // Returns information for computing the number key. |
198 virtual Major MajorKey() const = 0; | 198 virtual Major MajorKey() const = 0; |
199 uint32_t MinorKey() const { return minor_key_; } | 199 uint32_t MinorKey() const { return minor_key_; } |
200 | 200 |
201 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } | 201 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } |
202 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } | 202 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } |
203 virtual Code::StubType GetStubType() { | 203 virtual Code::StubType GetStubType() { |
204 return Code::NORMAL; | 204 return Code::NORMAL; |
205 } | 205 } |
206 | 206 |
207 friend OStream& operator<<(OStream& os, const CodeStub& s) { | 207 friend std::ostream& operator<<(std::ostream& os, const CodeStub& s) { |
208 s.PrintName(os); | 208 s.PrintName(os); |
209 return os; | 209 return os; |
210 } | 210 } |
211 | 211 |
212 Isolate* isolate() const { return isolate_; } | 212 Isolate* isolate() const { return isolate_; } |
213 | 213 |
214 protected: | 214 protected: |
215 CodeStub(uint32_t key, Isolate* isolate) | 215 CodeStub(uint32_t key, Isolate* isolate) |
216 : minor_key_(MinorKeyFromKey(key)), isolate_(isolate) {} | 216 : minor_key_(MinorKeyFromKey(key)), isolate_(isolate) {} |
217 | 217 |
218 // Generates the assembler code for the stub. | 218 // Generates the assembler code for the stub. |
219 virtual Handle<Code> GenerateCode() = 0; | 219 virtual Handle<Code> GenerateCode() = 0; |
220 | 220 |
221 // Returns whether the code generated for this stub needs to be allocated as | 221 // Returns whether the code generated for this stub needs to be allocated as |
222 // a fixed (non-moveable) code object. | 222 // a fixed (non-moveable) code object. |
223 virtual bool NeedsImmovableCode() { return false; } | 223 virtual bool NeedsImmovableCode() { return false; } |
224 | 224 |
225 virtual void PrintName(OStream& os) const; // NOLINT | 225 virtual void PrintName(std::ostream& os) const; // NOLINT |
226 virtual void PrintBaseName(OStream& os) const; // NOLINT | 226 virtual void PrintBaseName(std::ostream& os) const; // NOLINT |
227 virtual void PrintState(OStream& os) const { ; } // NOLINT | 227 virtual void PrintState(std::ostream& os) const { ; } // NOLINT |
228 | 228 |
229 // Computes the key based on major and minor. | 229 // Computes the key based on major and minor. |
230 uint32_t GetKey() { | 230 uint32_t GetKey() { |
231 DCHECK(static_cast<int>(MajorKey()) < NUMBER_OF_IDS); | 231 DCHECK(static_cast<int>(MajorKey()) < NUMBER_OF_IDS); |
232 return MinorKeyBits::encode(MinorKey()) | MajorKeyBits::encode(MajorKey()); | 232 return MinorKeyBits::encode(MinorKey()) | MajorKeyBits::encode(MajorKey()); |
233 } | 233 } |
234 | 234 |
235 uint32_t minor_key_; | 235 uint32_t minor_key_; |
236 | 236 |
237 private: | 237 private: |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 bool HasArgsInRegisters() const { return (flags() & kArgsInRegisters) != 0; } | 699 bool HasArgsInRegisters() const { return (flags() & kArgsInRegisters) != 0; } |
700 | 700 |
701 bool HasCallSiteInlineCheck() const { | 701 bool HasCallSiteInlineCheck() const { |
702 return (flags() & kCallSiteInlineCheck) != 0; | 702 return (flags() & kCallSiteInlineCheck) != 0; |
703 } | 703 } |
704 | 704 |
705 bool ReturnTrueFalseObject() const { | 705 bool ReturnTrueFalseObject() const { |
706 return (flags() & kReturnTrueFalseObject) != 0; | 706 return (flags() & kReturnTrueFalseObject) != 0; |
707 } | 707 } |
708 | 708 |
709 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT | 709 virtual void PrintName(std::ostream& os) const OVERRIDE; // NOLINT |
710 | 710 |
711 class FlagBits : public BitField<Flags, 0, 3> {}; | 711 class FlagBits : public BitField<Flags, 0, 3> {}; |
712 | 712 |
713 DEFINE_PLATFORM_CODE_STUB(Instanceof, PlatformCodeStub); | 713 DEFINE_PLATFORM_CODE_STUB(Instanceof, PlatformCodeStub); |
714 }; | 714 }; |
715 | 715 |
716 | 716 |
717 enum AllocationSiteOverrideMode { | 717 enum AllocationSiteOverrideMode { |
718 DONT_OVERRIDE, | 718 DONT_OVERRIDE, |
719 DISABLE_ALLOCATION_SITES, | 719 DISABLE_ALLOCATION_SITES, |
(...skipping 10 matching lines...) Expand all Loading... |
730 explicit ArrayConstructorStub(Isolate* isolate); | 730 explicit ArrayConstructorStub(Isolate* isolate); |
731 | 731 |
732 private: | 732 private: |
733 ArgumentCountKey argument_count() const { | 733 ArgumentCountKey argument_count() const { |
734 return ArgumentCountBits::decode(minor_key_); | 734 return ArgumentCountBits::decode(minor_key_); |
735 } | 735 } |
736 | 736 |
737 void GenerateDispatchToArrayStub(MacroAssembler* masm, | 737 void GenerateDispatchToArrayStub(MacroAssembler* masm, |
738 AllocationSiteOverrideMode mode); | 738 AllocationSiteOverrideMode mode); |
739 | 739 |
740 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT | 740 virtual void PrintName(std::ostream& os) const OVERRIDE; // NOLINT |
741 | 741 |
742 class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {}; | 742 class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {}; |
743 | 743 |
744 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); | 744 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); |
745 DEFINE_PLATFORM_CODE_STUB(ArrayConstructor, PlatformCodeStub); | 745 DEFINE_PLATFORM_CODE_STUB(ArrayConstructor, PlatformCodeStub); |
746 }; | 746 }; |
747 | 747 |
748 | 748 |
749 class InternalArrayConstructorStub: public PlatformCodeStub { | 749 class InternalArrayConstructorStub: public PlatformCodeStub { |
750 public: | 750 public: |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 int arg_count() const { return state().arg_count(); } | 816 int arg_count() const { return state().arg_count(); } |
817 | 817 |
818 CallICState state() const { | 818 CallICState state() const { |
819 return CallICState(static_cast<ExtraICState>(minor_key_)); | 819 return CallICState(static_cast<ExtraICState>(minor_key_)); |
820 } | 820 } |
821 | 821 |
822 // Code generation helpers. | 822 // Code generation helpers. |
823 void GenerateMiss(MacroAssembler* masm); | 823 void GenerateMiss(MacroAssembler* masm); |
824 | 824 |
825 private: | 825 private: |
826 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 826 virtual void PrintState(std::ostream& os) const OVERRIDE; // NOLINT |
827 | 827 |
828 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunctionWithFeedback); | 828 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunctionWithFeedback); |
829 DEFINE_PLATFORM_CODE_STUB(CallIC, PlatformCodeStub); | 829 DEFINE_PLATFORM_CODE_STUB(CallIC, PlatformCodeStub); |
830 }; | 830 }; |
831 | 831 |
832 | 832 |
833 class CallIC_ArrayStub: public CallICStub { | 833 class CallIC_ArrayStub: public CallICStub { |
834 public: | 834 public: |
835 CallIC_ArrayStub(Isolate* isolate, const CallICState& state_in) | 835 CallIC_ArrayStub(Isolate* isolate, const CallICState& state_in) |
836 : CallICStub(isolate, state_in) {} | 836 : CallICStub(isolate, state_in) {} |
837 | 837 |
838 virtual InlineCacheState GetICState() const FINAL OVERRIDE { | 838 virtual InlineCacheState GetICState() const FINAL OVERRIDE { |
839 return MONOMORPHIC; | 839 return MONOMORPHIC; |
840 } | 840 } |
841 | 841 |
842 private: | 842 private: |
843 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 843 virtual void PrintState(std::ostream& os) const OVERRIDE; // NOLINT |
844 | 844 |
845 DEFINE_PLATFORM_CODE_STUB(CallIC_Array, CallICStub); | 845 DEFINE_PLATFORM_CODE_STUB(CallIC_Array, CallICStub); |
846 }; | 846 }; |
847 | 847 |
848 | 848 |
849 // TODO(verwaest): Translate to hydrogen code stub. | 849 // TODO(verwaest): Translate to hydrogen code stub. |
850 class FunctionPrototypeStub : public PlatformCodeStub { | 850 class FunctionPrototypeStub : public PlatformCodeStub { |
851 public: | 851 public: |
852 explicit FunctionPrototypeStub(Isolate* isolate) | 852 explicit FunctionPrototypeStub(Isolate* isolate) |
853 : PlatformCodeStub(isolate) {} | 853 : PlatformCodeStub(isolate) {} |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 } | 1155 } |
1156 | 1156 |
1157 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { | 1157 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { |
1158 return static_cast<ExtraICState>(sub_minor_key()); | 1158 return static_cast<ExtraICState>(sub_minor_key()); |
1159 } | 1159 } |
1160 | 1160 |
1161 BinaryOpICState state() const { | 1161 BinaryOpICState state() const { |
1162 return BinaryOpICState(isolate(), GetExtraICState()); | 1162 return BinaryOpICState(isolate(), GetExtraICState()); |
1163 } | 1163 } |
1164 | 1164 |
1165 virtual void PrintState(OStream& os) const FINAL OVERRIDE; // NOLINT | 1165 virtual void PrintState(std::ostream& os) const FINAL OVERRIDE; // NOLINT |
1166 | 1166 |
1167 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1167 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
1168 static const int kLeft = 0; | 1168 static const int kLeft = 0; |
1169 static const int kRight = 1; | 1169 static const int kRight = 1; |
1170 | 1170 |
1171 private: | 1171 private: |
1172 static void GenerateAheadOfTime(Isolate* isolate, | 1172 static void GenerateAheadOfTime(Isolate* isolate, |
1173 const BinaryOpICState& state); | 1173 const BinaryOpICState& state); |
1174 | 1174 |
1175 DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp); | 1175 DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp); |
(...skipping 24 matching lines...) Expand all Loading... |
1200 } | 1200 } |
1201 | 1201 |
1202 virtual InlineCacheState GetICState() const OVERRIDE { | 1202 virtual InlineCacheState GetICState() const OVERRIDE { |
1203 return state().GetICState(); | 1203 return state().GetICState(); |
1204 } | 1204 } |
1205 | 1205 |
1206 virtual ExtraICState GetExtraICState() const OVERRIDE { | 1206 virtual ExtraICState GetExtraICState() const OVERRIDE { |
1207 return static_cast<ExtraICState>(minor_key_); | 1207 return static_cast<ExtraICState>(minor_key_); |
1208 } | 1208 } |
1209 | 1209 |
1210 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 1210 virtual void PrintState(std::ostream& os) const OVERRIDE; // NOLINT |
1211 | 1211 |
1212 private: | 1212 private: |
1213 BinaryOpICState state() const { | 1213 BinaryOpICState state() const { |
1214 return BinaryOpICState(isolate(), static_cast<ExtraICState>(minor_key_)); | 1214 return BinaryOpICState(isolate(), static_cast<ExtraICState>(minor_key_)); |
1215 } | 1215 } |
1216 | 1216 |
1217 static void GenerateAheadOfTime(Isolate* isolate, | 1217 static void GenerateAheadOfTime(Isolate* isolate, |
1218 const BinaryOpICState& state); | 1218 const BinaryOpICState& state); |
1219 | 1219 |
1220 DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite); | 1220 DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 } | 1276 } |
1277 | 1277 |
1278 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1278 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
1279 static const int kLeft = 0; | 1279 static const int kLeft = 0; |
1280 static const int kRight = 1; | 1280 static const int kRight = 1; |
1281 | 1281 |
1282 private: | 1282 private: |
1283 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; | 1283 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; |
1284 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; | 1284 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; |
1285 | 1285 |
1286 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT | 1286 virtual void PrintBaseName(std::ostream& os) const OVERRIDE; // NOLINT |
1287 | 1287 |
1288 DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd); | 1288 DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd); |
1289 DEFINE_HYDROGEN_CODE_STUB(StringAdd, HydrogenCodeStub); | 1289 DEFINE_HYDROGEN_CODE_STUB(StringAdd, HydrogenCodeStub); |
1290 }; | 1290 }; |
1291 | 1291 |
1292 | 1292 |
1293 class CompareICStub : public PlatformCodeStub { | 1293 class CompareICStub : public PlatformCodeStub { |
1294 public: | 1294 public: |
1295 CompareICStub(Isolate* isolate, Token::Value op, CompareICState::State left, | 1295 CompareICStub(Isolate* isolate, Token::Value op, CompareICState::State left, |
1296 CompareICState::State right, CompareICState::State state) | 1296 CompareICState::State right, CompareICState::State state) |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1388 void UpdateStatus(Handle<Object> object); | 1388 void UpdateStatus(Handle<Object> object); |
1389 | 1389 |
1390 bool IsMonomorphic() const { return state().Contains(MONOMORPHIC_MAP); } | 1390 bool IsMonomorphic() const { return state().Contains(MONOMORPHIC_MAP); } |
1391 | 1391 |
1392 NilValue nil_value() const { return NilValueBits::decode(sub_minor_key()); } | 1392 NilValue nil_value() const { return NilValueBits::decode(sub_minor_key()); } |
1393 | 1393 |
1394 void ClearState() { | 1394 void ClearState() { |
1395 set_sub_minor_key(TypesBits::update(sub_minor_key(), 0)); | 1395 set_sub_minor_key(TypesBits::update(sub_minor_key(), 0)); |
1396 } | 1396 } |
1397 | 1397 |
1398 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 1398 virtual void PrintState(std::ostream& os) const OVERRIDE; // NOLINT |
1399 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT | 1399 virtual void PrintBaseName(std::ostream& os) const OVERRIDE; // NOLINT |
1400 | 1400 |
1401 private: | 1401 private: |
1402 CompareNilICStub(Isolate* isolate, NilValue nil, | 1402 CompareNilICStub(Isolate* isolate, NilValue nil, |
1403 InitializationState init_state) | 1403 InitializationState init_state) |
1404 : HydrogenCodeStub(isolate, init_state) { | 1404 : HydrogenCodeStub(isolate, init_state) { |
1405 set_sub_minor_key(NilValueBits::encode(nil)); | 1405 set_sub_minor_key(NilValueBits::encode(nil)); |
1406 } | 1406 } |
1407 | 1407 |
1408 enum CompareNilType { | 1408 enum CompareNilType { |
1409 UNDEFINED, | 1409 UNDEFINED, |
1410 NULL_TYPE, | 1410 NULL_TYPE, |
1411 MONOMORPHIC_MAP, | 1411 MONOMORPHIC_MAP, |
1412 GENERIC, | 1412 GENERIC, |
1413 NUMBER_OF_TYPES | 1413 NUMBER_OF_TYPES |
1414 }; | 1414 }; |
1415 | 1415 |
1416 // At most 6 different types can be distinguished, because the Code object | 1416 // At most 6 different types can be distinguished, because the Code object |
1417 // only has room for a single byte to hold a set and there are two more | 1417 // only has room for a single byte to hold a set and there are two more |
1418 // boolean flags we need to store. :-P | 1418 // boolean flags we need to store. :-P |
1419 STATIC_ASSERT(NUMBER_OF_TYPES <= 6); | 1419 STATIC_ASSERT(NUMBER_OF_TYPES <= 6); |
1420 | 1420 |
1421 class State : public EnumSet<CompareNilType, byte> { | 1421 class State : public EnumSet<CompareNilType, byte> { |
1422 public: | 1422 public: |
1423 State() : EnumSet<CompareNilType, byte>(0) { } | 1423 State() : EnumSet<CompareNilType, byte>(0) { } |
1424 explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { } | 1424 explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { } |
1425 }; | 1425 }; |
1426 friend OStream& operator<<(OStream& os, const State& s); | 1426 friend std::ostream& operator<<(std::ostream& os, const State& s); |
1427 | 1427 |
1428 State state() const { return State(TypesBits::decode(sub_minor_key())); } | 1428 State state() const { return State(TypesBits::decode(sub_minor_key())); } |
1429 | 1429 |
1430 class NilValueBits : public BitField<NilValue, 0, 1> {}; | 1430 class NilValueBits : public BitField<NilValue, 0, 1> {}; |
1431 class TypesBits : public BitField<byte, 1, NUMBER_OF_TYPES> {}; | 1431 class TypesBits : public BitField<byte, 1, NUMBER_OF_TYPES> {}; |
1432 | 1432 |
1433 friend class CompareNilIC; | 1433 friend class CompareNilIC; |
1434 | 1434 |
1435 DEFINE_CALL_INTERFACE_DESCRIPTOR(CompareNil); | 1435 DEFINE_CALL_INTERFACE_DESCRIPTOR(CompareNil); |
1436 DEFINE_HYDROGEN_CODE_STUB(CompareNilIC, HydrogenCodeStub); | 1436 DEFINE_HYDROGEN_CODE_STUB(CompareNilIC, HydrogenCodeStub); |
1437 }; | 1437 }; |
1438 | 1438 |
1439 | 1439 |
1440 OStream& operator<<(OStream& os, const CompareNilICStub::State& s); | 1440 std::ostream& operator<<(std::ostream& os, const CompareNilICStub::State& s); |
1441 | 1441 |
1442 | 1442 |
1443 class CEntryStub : public PlatformCodeStub { | 1443 class CEntryStub : public PlatformCodeStub { |
1444 public: | 1444 public: |
1445 CEntryStub(Isolate* isolate, int result_size, | 1445 CEntryStub(Isolate* isolate, int result_size, |
1446 SaveFPRegsMode save_doubles = kDontSaveFPRegs) | 1446 SaveFPRegsMode save_doubles = kDontSaveFPRegs) |
1447 : PlatformCodeStub(isolate) { | 1447 : PlatformCodeStub(isolate) { |
1448 minor_key_ = SaveDoublesBits::encode(save_doubles == kSaveFPRegs); | 1448 minor_key_ = SaveDoublesBits::encode(save_doubles == kSaveFPRegs); |
1449 DCHECK(result_size == 1 || result_size == 2); | 1449 DCHECK(result_size == 1 || result_size == 2); |
1450 #ifdef _WIN64 | 1450 #ifdef _WIN64 |
(...skipping 27 matching lines...) Expand all Loading... |
1478 public: | 1478 public: |
1479 JSEntryStub(Isolate* isolate, StackFrame::Type type) | 1479 JSEntryStub(Isolate* isolate, StackFrame::Type type) |
1480 : PlatformCodeStub(isolate) { | 1480 : PlatformCodeStub(isolate) { |
1481 DCHECK(type == StackFrame::ENTRY || type == StackFrame::ENTRY_CONSTRUCT); | 1481 DCHECK(type == StackFrame::ENTRY || type == StackFrame::ENTRY_CONSTRUCT); |
1482 minor_key_ = StackFrameTypeBits::encode(type); | 1482 minor_key_ = StackFrameTypeBits::encode(type); |
1483 } | 1483 } |
1484 | 1484 |
1485 private: | 1485 private: |
1486 virtual void FinishCode(Handle<Code> code); | 1486 virtual void FinishCode(Handle<Code> code); |
1487 | 1487 |
1488 virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT | 1488 virtual void PrintName(std::ostream& os) const OVERRIDE { // NOLINT |
1489 os << (type() == StackFrame::ENTRY ? "JSEntryStub" | 1489 os << (type() == StackFrame::ENTRY ? "JSEntryStub" |
1490 : "JSConstructEntryStub"); | 1490 : "JSConstructEntryStub"); |
1491 } | 1491 } |
1492 | 1492 |
1493 StackFrame::Type type() const { | 1493 StackFrame::Type type() const { |
1494 return StackFrameTypeBits::decode(minor_key_); | 1494 return StackFrameTypeBits::decode(minor_key_); |
1495 } | 1495 } |
1496 | 1496 |
1497 class StackFrameTypeBits : public BitField<StackFrame::Type, 0, 5> {}; | 1497 class StackFrameTypeBits : public BitField<StackFrame::Type, 0, 5> {}; |
1498 | 1498 |
(...skipping 25 matching lines...) Expand all Loading... |
1524 } | 1524 } |
1525 | 1525 |
1526 private: | 1526 private: |
1527 Type type() const { return TypeBits::decode(minor_key_); } | 1527 Type type() const { return TypeBits::decode(minor_key_); } |
1528 | 1528 |
1529 void GenerateReadElement(MacroAssembler* masm); | 1529 void GenerateReadElement(MacroAssembler* masm); |
1530 void GenerateNewStrict(MacroAssembler* masm); | 1530 void GenerateNewStrict(MacroAssembler* masm); |
1531 void GenerateNewSloppyFast(MacroAssembler* masm); | 1531 void GenerateNewSloppyFast(MacroAssembler* masm); |
1532 void GenerateNewSloppySlow(MacroAssembler* masm); | 1532 void GenerateNewSloppySlow(MacroAssembler* masm); |
1533 | 1533 |
1534 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT | 1534 virtual void PrintName(std::ostream& os) const OVERRIDE; // NOLINT |
1535 | 1535 |
1536 class TypeBits : public BitField<Type, 0, 2> {}; | 1536 class TypeBits : public BitField<Type, 0, 2> {}; |
1537 | 1537 |
1538 DEFINE_PLATFORM_CODE_STUB(ArgumentsAccess, PlatformCodeStub); | 1538 DEFINE_PLATFORM_CODE_STUB(ArgumentsAccess, PlatformCodeStub); |
1539 }; | 1539 }; |
1540 | 1540 |
1541 | 1541 |
1542 class RegExpExecStub: public PlatformCodeStub { | 1542 class RegExpExecStub: public PlatformCodeStub { |
1543 public: | 1543 public: |
1544 explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { } | 1544 explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 private: | 1578 private: |
1579 int argc() const { return ArgcBits::decode(minor_key_); } | 1579 int argc() const { return ArgcBits::decode(minor_key_); } |
1580 int flags() const { return FlagBits::decode(minor_key_); } | 1580 int flags() const { return FlagBits::decode(minor_key_); } |
1581 | 1581 |
1582 bool CallAsMethod() const { | 1582 bool CallAsMethod() const { |
1583 return flags() == CALL_AS_METHOD || flags() == WRAP_AND_CALL; | 1583 return flags() == CALL_AS_METHOD || flags() == WRAP_AND_CALL; |
1584 } | 1584 } |
1585 | 1585 |
1586 bool NeedsChecks() const { return flags() != WRAP_AND_CALL; } | 1586 bool NeedsChecks() const { return flags() != WRAP_AND_CALL; } |
1587 | 1587 |
1588 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT | 1588 virtual void PrintName(std::ostream& os) const OVERRIDE; // NOLINT |
1589 | 1589 |
1590 // Minor key encoding in 32 bits with Bitfield <Type, shift, size>. | 1590 // Minor key encoding in 32 bits with Bitfield <Type, shift, size>. |
1591 class FlagBits : public BitField<CallFunctionFlags, 0, 2> {}; | 1591 class FlagBits : public BitField<CallFunctionFlags, 0, 2> {}; |
1592 class ArgcBits : public BitField<unsigned, 2, Code::kArgumentsBits> {}; | 1592 class ArgcBits : public BitField<unsigned, 2, Code::kArgumentsBits> {}; |
1593 STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); | 1593 STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); |
1594 | 1594 |
1595 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction); | 1595 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction); |
1596 DEFINE_PLATFORM_CODE_STUB(CallFunction, PlatformCodeStub); | 1596 DEFINE_PLATFORM_CODE_STUB(CallFunction, PlatformCodeStub); |
1597 }; | 1597 }; |
1598 | 1598 |
1599 | 1599 |
1600 class CallConstructStub: public PlatformCodeStub { | 1600 class CallConstructStub: public PlatformCodeStub { |
1601 public: | 1601 public: |
1602 CallConstructStub(Isolate* isolate, CallConstructorFlags flags) | 1602 CallConstructStub(Isolate* isolate, CallConstructorFlags flags) |
1603 : PlatformCodeStub(isolate) { | 1603 : PlatformCodeStub(isolate) { |
1604 minor_key_ = FlagBits::encode(flags); | 1604 minor_key_ = FlagBits::encode(flags); |
1605 } | 1605 } |
1606 | 1606 |
1607 virtual void FinishCode(Handle<Code> code) { | 1607 virtual void FinishCode(Handle<Code> code) { |
1608 code->set_has_function_cache(RecordCallTarget()); | 1608 code->set_has_function_cache(RecordCallTarget()); |
1609 } | 1609 } |
1610 | 1610 |
1611 private: | 1611 private: |
1612 CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); } | 1612 CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); } |
1613 | 1613 |
1614 bool RecordCallTarget() const { | 1614 bool RecordCallTarget() const { |
1615 return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0; | 1615 return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0; |
1616 } | 1616 } |
1617 | 1617 |
1618 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT | 1618 virtual void PrintName(std::ostream& os) const OVERRIDE; // NOLINT |
1619 | 1619 |
1620 class FlagBits : public BitField<CallConstructorFlags, 0, 1> {}; | 1620 class FlagBits : public BitField<CallConstructorFlags, 0, 1> {}; |
1621 | 1621 |
1622 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallConstruct); | 1622 DEFINE_CALL_INTERFACE_DESCRIPTOR(CallConstruct); |
1623 DEFINE_PLATFORM_CODE_STUB(CallConstruct, PlatformCodeStub); | 1623 DEFINE_PLATFORM_CODE_STUB(CallConstruct, PlatformCodeStub); |
1624 }; | 1624 }; |
1625 | 1625 |
1626 | 1626 |
1627 enum StringIndexFlags { | 1627 enum StringIndexFlags { |
1628 // Accepts smis or heap numbers. | 1628 // Accepts smis or heap numbers. |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 return AllocationSiteOverrideModeBits::decode(sub_minor_key()); | 2074 return AllocationSiteOverrideModeBits::decode(sub_minor_key()); |
2075 } | 2075 } |
2076 | 2076 |
2077 static void GenerateStubsAheadOfTime(Isolate* isolate); | 2077 static void GenerateStubsAheadOfTime(Isolate* isolate); |
2078 | 2078 |
2079 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 2079 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
2080 static const int kConstructor = 0; | 2080 static const int kConstructor = 0; |
2081 static const int kAllocationSite = 1; | 2081 static const int kAllocationSite = 1; |
2082 | 2082 |
2083 protected: | 2083 protected: |
2084 OStream& BasePrintName(OStream& os, const char* name) const; // NOLINT | 2084 std::ostream& BasePrintName(std::ostream& os, |
| 2085 const char* name) const; // NOLINT |
2085 | 2086 |
2086 private: | 2087 private: |
2087 // Ensure data fits within available bits. | 2088 // Ensure data fits within available bits. |
2088 STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1); | 2089 STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1); |
2089 | 2090 |
2090 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; | 2091 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; |
2091 class AllocationSiteOverrideModeBits: public | 2092 class AllocationSiteOverrideModeBits: public |
2092 BitField<AllocationSiteOverrideMode, 8, 1> {}; // NOLINT | 2093 BitField<AllocationSiteOverrideMode, 8, 1> {}; // NOLINT |
2093 | 2094 |
2094 DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub); | 2095 DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub); |
2095 }; | 2096 }; |
2096 | 2097 |
2097 | 2098 |
2098 class ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase { | 2099 class ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase { |
2099 public: | 2100 public: |
2100 ArrayNoArgumentConstructorStub( | 2101 ArrayNoArgumentConstructorStub( |
2101 Isolate* isolate, | 2102 Isolate* isolate, |
2102 ElementsKind kind, | 2103 ElementsKind kind, |
2103 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) | 2104 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) |
2104 : ArrayConstructorStubBase(isolate, kind, override_mode) { | 2105 : ArrayConstructorStubBase(isolate, kind, override_mode) { |
2105 } | 2106 } |
2106 | 2107 |
2107 private: | 2108 private: |
2108 virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT | 2109 virtual void PrintName(std::ostream& os) const OVERRIDE { // NOLINT |
2109 BasePrintName(os, "ArrayNoArgumentConstructorStub"); | 2110 BasePrintName(os, "ArrayNoArgumentConstructorStub"); |
2110 } | 2111 } |
2111 | 2112 |
2112 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructorConstantArgCount); | 2113 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructorConstantArgCount); |
2113 DEFINE_HYDROGEN_CODE_STUB(ArrayNoArgumentConstructor, | 2114 DEFINE_HYDROGEN_CODE_STUB(ArrayNoArgumentConstructor, |
2114 ArrayConstructorStubBase); | 2115 ArrayConstructorStubBase); |
2115 }; | 2116 }; |
2116 | 2117 |
2117 | 2118 |
2118 class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { | 2119 class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { |
2119 public: | 2120 public: |
2120 ArraySingleArgumentConstructorStub( | 2121 ArraySingleArgumentConstructorStub( |
2121 Isolate* isolate, | 2122 Isolate* isolate, |
2122 ElementsKind kind, | 2123 ElementsKind kind, |
2123 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) | 2124 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) |
2124 : ArrayConstructorStubBase(isolate, kind, override_mode) { | 2125 : ArrayConstructorStubBase(isolate, kind, override_mode) { |
2125 } | 2126 } |
2126 | 2127 |
2127 private: | 2128 private: |
2128 virtual void PrintName(OStream& os) const { // NOLINT | 2129 virtual void PrintName(std::ostream& os) const { // NOLINT |
2129 BasePrintName(os, "ArraySingleArgumentConstructorStub"); | 2130 BasePrintName(os, "ArraySingleArgumentConstructorStub"); |
2130 } | 2131 } |
2131 | 2132 |
2132 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); | 2133 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); |
2133 DEFINE_HYDROGEN_CODE_STUB(ArraySingleArgumentConstructor, | 2134 DEFINE_HYDROGEN_CODE_STUB(ArraySingleArgumentConstructor, |
2134 ArrayConstructorStubBase); | 2135 ArrayConstructorStubBase); |
2135 }; | 2136 }; |
2136 | 2137 |
2137 | 2138 |
2138 class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { | 2139 class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { |
2139 public: | 2140 public: |
2140 ArrayNArgumentsConstructorStub( | 2141 ArrayNArgumentsConstructorStub( |
2141 Isolate* isolate, | 2142 Isolate* isolate, |
2142 ElementsKind kind, | 2143 ElementsKind kind, |
2143 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) | 2144 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) |
2144 : ArrayConstructorStubBase(isolate, kind, override_mode) { | 2145 : ArrayConstructorStubBase(isolate, kind, override_mode) { |
2145 } | 2146 } |
2146 | 2147 |
2147 private: | 2148 private: |
2148 virtual void PrintName(OStream& os) const { // NOLINT | 2149 virtual void PrintName(std::ostream& os) const { // NOLINT |
2149 BasePrintName(os, "ArrayNArgumentsConstructorStub"); | 2150 BasePrintName(os, "ArrayNArgumentsConstructorStub"); |
2150 } | 2151 } |
2151 | 2152 |
2152 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); | 2153 DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); |
2153 DEFINE_HYDROGEN_CODE_STUB(ArrayNArgumentsConstructor, | 2154 DEFINE_HYDROGEN_CODE_STUB(ArrayNArgumentsConstructor, |
2154 ArrayConstructorStubBase); | 2155 ArrayConstructorStubBase); |
2155 }; | 2156 }; |
2156 | 2157 |
2157 | 2158 |
2158 class InternalArrayConstructorStubBase : public HydrogenCodeStub { | 2159 class InternalArrayConstructorStubBase : public HydrogenCodeStub { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2283 : HydrogenCodeStub(isolate) { | 2284 : HydrogenCodeStub(isolate) { |
2284 set_sub_minor_key(TypesBits::encode(static_cast<byte>(state)) | | 2285 set_sub_minor_key(TypesBits::encode(static_cast<byte>(state)) | |
2285 ResultModeBits::encode(RESULT_AS_SMI)); | 2286 ResultModeBits::encode(RESULT_AS_SMI)); |
2286 } | 2287 } |
2287 | 2288 |
2288 bool UpdateStatus(Handle<Object> object); | 2289 bool UpdateStatus(Handle<Object> object); |
2289 Types types() const { return Types(TypesBits::decode(sub_minor_key())); } | 2290 Types types() const { return Types(TypesBits::decode(sub_minor_key())); } |
2290 ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); } | 2291 ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); } |
2291 | 2292 |
2292 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } | 2293 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } |
2293 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 2294 virtual void PrintState(std::ostream& os) const OVERRIDE; // NOLINT |
2294 | 2295 |
2295 virtual bool SometimesSetsUpAFrame() { return false; } | 2296 virtual bool SometimesSetsUpAFrame() { return false; } |
2296 | 2297 |
2297 static Handle<Code> GetUninitialized(Isolate* isolate) { | 2298 static Handle<Code> GetUninitialized(Isolate* isolate) { |
2298 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); | 2299 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); |
2299 } | 2300 } |
2300 | 2301 |
2301 virtual ExtraICState GetExtraICState() const { return types().ToIntegral(); } | 2302 virtual ExtraICState GetExtraICState() const { return types().ToIntegral(); } |
2302 | 2303 |
2303 virtual InlineCacheState GetICState() const { | 2304 virtual InlineCacheState GetICState() const { |
(...skipping 11 matching lines...) Expand all Loading... |
2315 } | 2316 } |
2316 | 2317 |
2317 class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; | 2318 class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; |
2318 class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; | 2319 class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; |
2319 | 2320 |
2320 DEFINE_CALL_INTERFACE_DESCRIPTOR(ToBoolean); | 2321 DEFINE_CALL_INTERFACE_DESCRIPTOR(ToBoolean); |
2321 DEFINE_HYDROGEN_CODE_STUB(ToBoolean, HydrogenCodeStub); | 2322 DEFINE_HYDROGEN_CODE_STUB(ToBoolean, HydrogenCodeStub); |
2322 }; | 2323 }; |
2323 | 2324 |
2324 | 2325 |
2325 OStream& operator<<(OStream& os, const ToBooleanStub::Types& t); | 2326 std::ostream& operator<<(std::ostream& os, const ToBooleanStub::Types& t); |
2326 | 2327 |
2327 | 2328 |
2328 class ElementsTransitionAndStoreStub : public HydrogenCodeStub { | 2329 class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
2329 public: | 2330 public: |
2330 ElementsTransitionAndStoreStub(Isolate* isolate, ElementsKind from_kind, | 2331 ElementsTransitionAndStoreStub(Isolate* isolate, ElementsKind from_kind, |
2331 ElementsKind to_kind, bool is_jsarray, | 2332 ElementsKind to_kind, bool is_jsarray, |
2332 KeyedAccessStoreMode store_mode) | 2333 KeyedAccessStoreMode store_mode) |
2333 : HydrogenCodeStub(isolate) { | 2334 : HydrogenCodeStub(isolate) { |
2334 set_sub_minor_key(FromBits::encode(from_kind) | ToBits::encode(to_kind) | | 2335 set_sub_minor_key(FromBits::encode(from_kind) | ToBits::encode(to_kind) | |
2335 IsJSArrayBits::encode(is_jsarray) | | 2336 IsJSArrayBits::encode(is_jsarray) | |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2469 | 2470 |
2470 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR | 2471 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR |
2471 #undef DEFINE_PLATFORM_CODE_STUB | 2472 #undef DEFINE_PLATFORM_CODE_STUB |
2472 #undef DEFINE_HANDLER_CODE_STUB | 2473 #undef DEFINE_HANDLER_CODE_STUB |
2473 #undef DEFINE_HYDROGEN_CODE_STUB | 2474 #undef DEFINE_HYDROGEN_CODE_STUB |
2474 #undef DEFINE_CODE_STUB | 2475 #undef DEFINE_CODE_STUB |
2475 #undef DEFINE_CODE_STUB_BASE | 2476 #undef DEFINE_CODE_STUB_BASE |
2476 } } // namespace v8::internal | 2477 } } // namespace v8::internal |
2477 | 2478 |
2478 #endif // V8_CODE_STUBS_H_ | 2479 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |