| 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_ARM_CODE_STUBS_ARM_H_ | 5 #ifndef V8_ARM_CODE_STUBS_ARM_H_ |
| 6 #define V8_ARM_CODE_STUBS_ARM_H_ | 6 #define V8_ARM_CODE_STUBS_ARM_H_ |
| 7 | 7 |
| 8 #include "src/code-stubs.h" | |
| 9 | |
| 10 namespace v8 { | 8 namespace v8 { |
| 11 namespace internal { | 9 namespace internal { |
| 12 | 10 |
| 13 | 11 |
| 14 void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code); | 12 void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code); |
| 15 | 13 |
| 16 | 14 |
| 17 class StringHelper : public AllStatic { | 15 class StringHelper : public AllStatic { |
| 18 public: | 16 public: |
| 19 // Generate code for copying a large number of characters. This function | 17 // Generate code for copying a large number of characters. This function |
| 20 // is allowed to spend extra time setting up conditions to make copying | 18 // is allowed to spend extra time setting up conditions to make copying |
| 21 // faster. Copying of overlapping regions is not supported. | 19 // faster. Copying of overlapping regions is not supported. |
| 22 // Dest register ends at the position after the last character written. | 20 // Dest register ends at the position after the last character written. |
| 23 static void GenerateCopyCharacters(MacroAssembler* masm, | 21 static void GenerateCopyCharacters(MacroAssembler* masm, |
| 24 Register dest, | 22 Register dest, |
| 25 Register src, | 23 Register src, |
| 26 Register count, | 24 Register count, |
| 27 Register scratch, | 25 Register scratch, |
| 28 String::Encoding encoding); | 26 String::Encoding encoding); |
| 29 | 27 |
| 30 | |
| 31 // Generate string hash. | 28 // Generate string hash. |
| 32 static void GenerateHashInit(MacroAssembler* masm, | 29 static void GenerateHashInit(MacroAssembler* masm, |
| 33 Register hash, | 30 Register hash, |
| 34 Register character); | 31 Register character); |
| 35 | 32 |
| 36 static void GenerateHashAddCharacter(MacroAssembler* masm, | 33 static void GenerateHashAddCharacter(MacroAssembler* masm, |
| 37 Register hash, | 34 Register hash, |
| 38 Register character); | 35 Register character); |
| 39 | 36 |
| 40 static void GenerateHashGetHash(MacroAssembler* masm, | 37 static void GenerateHashGetHash(MacroAssembler* masm, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 Register the_heap_number, Register scratch) | 76 Register the_heap_number, Register scratch) |
| 80 : PlatformCodeStub(isolate) { | 77 : PlatformCodeStub(isolate) { |
| 81 minor_key_ = IntRegisterBits::encode(the_int.code()) | | 78 minor_key_ = IntRegisterBits::encode(the_int.code()) | |
| 82 HeapNumberRegisterBits::encode(the_heap_number.code()) | | 79 HeapNumberRegisterBits::encode(the_heap_number.code()) | |
| 83 ScratchRegisterBits::encode(scratch.code()); | 80 ScratchRegisterBits::encode(scratch.code()); |
| 84 } | 81 } |
| 85 | 82 |
| 86 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); | 83 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); |
| 87 | 84 |
| 88 private: | 85 private: |
| 89 virtual inline Major MajorKey() const FINAL OVERRIDE; | |
| 90 | |
| 91 void Generate(MacroAssembler* masm); | 86 void Generate(MacroAssembler* masm); |
| 92 | 87 |
| 93 Register the_int() const { | 88 Register the_int() const { |
| 94 return Register::from_code(IntRegisterBits::decode(minor_key_)); | 89 return Register::from_code(IntRegisterBits::decode(minor_key_)); |
| 95 } | 90 } |
| 96 | 91 |
| 97 Register the_heap_number() const { | 92 Register the_heap_number() const { |
| 98 return Register::from_code(HeapNumberRegisterBits::decode(minor_key_)); | 93 return Register::from_code(HeapNumberRegisterBits::decode(minor_key_)); |
| 99 } | 94 } |
| 100 | 95 |
| 101 Register scratch() const { | 96 Register scratch() const { |
| 102 return Register::from_code(ScratchRegisterBits::decode(minor_key_)); | 97 return Register::from_code(ScratchRegisterBits::decode(minor_key_)); |
| 103 } | 98 } |
| 104 | 99 |
| 105 // Minor key encoding in 16 bits. | 100 // Minor key encoding in 16 bits. |
| 106 class IntRegisterBits: public BitField<int, 0, 4> {}; | 101 class IntRegisterBits: public BitField<int, 0, 4> {}; |
| 107 class HeapNumberRegisterBits: public BitField<int, 4, 4> {}; | 102 class HeapNumberRegisterBits: public BitField<int, 4, 4> {}; |
| 108 class ScratchRegisterBits: public BitField<int, 8, 4> {}; | 103 class ScratchRegisterBits: public BitField<int, 8, 4> {}; |
| 109 | 104 |
| 110 DISALLOW_COPY_AND_ASSIGN(WriteInt32ToHeapNumberStub); | 105 DEFINE_CODE_STUB(WriteInt32ToHeapNumber, PlatformCodeStub); |
| 111 }; | 106 }; |
| 112 | 107 |
| 113 | 108 |
| 114 class RecordWriteStub: public PlatformCodeStub { | 109 class RecordWriteStub: public PlatformCodeStub { |
| 115 public: | 110 public: |
| 116 RecordWriteStub(Isolate* isolate, | 111 RecordWriteStub(Isolate* isolate, |
| 117 Register object, | 112 Register object, |
| 118 Register value, | 113 Register value, |
| 119 Register address, | 114 Register address, |
| 120 RememberedSetAction remembered_set_action, | 115 RememberedSetAction remembered_set_action, |
| 121 SaveFPRegsMode fp_mode) | 116 SaveFPRegsMode fp_mode) |
| 122 : PlatformCodeStub(isolate), | 117 : PlatformCodeStub(isolate), |
| 123 regs_(object, // An input reg. | 118 regs_(object, // An input reg. |
| 124 address, // An input reg. | 119 address, // An input reg. |
| 125 value) { // One scratch reg. | 120 value) { // One scratch reg. |
| 126 minor_key_ = ObjectBits::encode(object.code()) | | 121 minor_key_ = ObjectBits::encode(object.code()) | |
| 127 ValueBits::encode(value.code()) | | 122 ValueBits::encode(value.code()) | |
| 128 AddressBits::encode(address.code()) | | 123 AddressBits::encode(address.code()) | |
| 129 RememberedSetActionBits::encode(remembered_set_action) | | 124 RememberedSetActionBits::encode(remembered_set_action) | |
| 130 SaveFPRegsModeBits::encode(fp_mode); | 125 SaveFPRegsModeBits::encode(fp_mode); |
| 131 } | 126 } |
| 132 | 127 |
| 128 RecordWriteStub(uint32_t key, Isolate* isolate) |
| 129 : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} |
| 130 |
| 133 enum Mode { | 131 enum Mode { |
| 134 STORE_BUFFER_ONLY, | 132 STORE_BUFFER_ONLY, |
| 135 INCREMENTAL, | 133 INCREMENTAL, |
| 136 INCREMENTAL_COMPACTION | 134 INCREMENTAL_COMPACTION |
| 137 }; | 135 }; |
| 138 | 136 |
| 139 virtual bool SometimesSetsUpAFrame() { return false; } | 137 virtual bool SometimesSetsUpAFrame() { return false; } |
| 140 | 138 |
| 141 static void PatchBranchIntoNop(MacroAssembler* masm, int pos) { | 139 static void PatchBranchIntoNop(MacroAssembler* masm, int pos) { |
| 142 masm->instr_at_put(pos, (masm->instr_at(pos) & ~B27) | (B24 | B20)); | 140 masm->instr_at_put(pos, (masm->instr_at(pos) & ~B27) | (B24 | B20)); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 Register scratch1_; | 248 Register scratch1_; |
| 251 | 249 |
| 252 friend class RecordWriteStub; | 250 friend class RecordWriteStub; |
| 253 }; | 251 }; |
| 254 | 252 |
| 255 enum OnNoNeedToInformIncrementalMarker { | 253 enum OnNoNeedToInformIncrementalMarker { |
| 256 kReturnOnNoNeedToInformIncrementalMarker, | 254 kReturnOnNoNeedToInformIncrementalMarker, |
| 257 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker | 255 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker |
| 258 }; | 256 }; |
| 259 | 257 |
| 260 virtual inline Major MajorKey() const FINAL OVERRIDE; | 258 virtual inline Major MajorKey() const FINAL OVERRIDE { return RecordWrite; } |
| 261 | 259 |
| 262 void Generate(MacroAssembler* masm); | 260 void Generate(MacroAssembler* masm); |
| 263 void GenerateIncremental(MacroAssembler* masm, Mode mode); | 261 void GenerateIncremental(MacroAssembler* masm, Mode mode); |
| 264 void CheckNeedsToInformIncrementalMarker( | 262 void CheckNeedsToInformIncrementalMarker( |
| 265 MacroAssembler* masm, | 263 MacroAssembler* masm, |
| 266 OnNoNeedToInformIncrementalMarker on_no_need, | 264 OnNoNeedToInformIncrementalMarker on_no_need, |
| 267 Mode mode); | 265 Mode mode); |
| 268 void InformIncrementalMarker(MacroAssembler* masm); | 266 void InformIncrementalMarker(MacroAssembler* masm); |
| 269 | 267 |
| 270 void Activate(Code* code) { | 268 void Activate(Code* code) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 // keep the code which called into native pinned in the memory. Currently the | 307 // keep the code which called into native pinned in the memory. Currently the |
| 310 // simplest approach is to generate such stub early enough so it can never be | 308 // simplest approach is to generate such stub early enough so it can never be |
| 311 // moved by GC | 309 // moved by GC |
| 312 class DirectCEntryStub: public PlatformCodeStub { | 310 class DirectCEntryStub: public PlatformCodeStub { |
| 313 public: | 311 public: |
| 314 explicit DirectCEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) {} | 312 explicit DirectCEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) {} |
| 315 void Generate(MacroAssembler* masm); | 313 void Generate(MacroAssembler* masm); |
| 316 void GenerateCall(MacroAssembler* masm, Register target); | 314 void GenerateCall(MacroAssembler* masm, Register target); |
| 317 | 315 |
| 318 private: | 316 private: |
| 319 virtual inline Major MajorKey() const FINAL OVERRIDE; | |
| 320 | |
| 321 bool NeedsImmovableCode() { return true; } | 317 bool NeedsImmovableCode() { return true; } |
| 322 | 318 |
| 323 DISALLOW_COPY_AND_ASSIGN(DirectCEntryStub); | 319 DEFINE_CODE_STUB(DirectCEntry, PlatformCodeStub); |
| 324 }; | 320 }; |
| 325 | 321 |
| 326 | 322 |
| 327 class NameDictionaryLookupStub: public PlatformCodeStub { | 323 class NameDictionaryLookupStub: public PlatformCodeStub { |
| 328 public: | 324 public: |
| 329 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; | 325 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; |
| 330 | 326 |
| 331 NameDictionaryLookupStub(Isolate* isolate, LookupMode mode) | 327 NameDictionaryLookupStub(Isolate* isolate, LookupMode mode) |
| 332 : PlatformCodeStub(isolate) { | 328 : PlatformCodeStub(isolate) { |
| 333 minor_key_ = LookupModeBits::encode(mode); | 329 minor_key_ = LookupModeBits::encode(mode); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 358 static const int kTotalProbes = 20; | 354 static const int kTotalProbes = 20; |
| 359 | 355 |
| 360 static const int kCapacityOffset = | 356 static const int kCapacityOffset = |
| 361 NameDictionary::kHeaderSize + | 357 NameDictionary::kHeaderSize + |
| 362 NameDictionary::kCapacityIndex * kPointerSize; | 358 NameDictionary::kCapacityIndex * kPointerSize; |
| 363 | 359 |
| 364 static const int kElementsStartOffset = | 360 static const int kElementsStartOffset = |
| 365 NameDictionary::kHeaderSize + | 361 NameDictionary::kHeaderSize + |
| 366 NameDictionary::kElementsStartIndex * kPointerSize; | 362 NameDictionary::kElementsStartIndex * kPointerSize; |
| 367 | 363 |
| 368 virtual inline Major MajorKey() const FINAL OVERRIDE; | |
| 369 | |
| 370 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } | 364 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } |
| 371 | 365 |
| 372 class LookupModeBits: public BitField<LookupMode, 0, 1> {}; | 366 class LookupModeBits: public BitField<LookupMode, 0, 1> {}; |
| 373 | 367 |
| 374 DISALLOW_COPY_AND_ASSIGN(NameDictionaryLookupStub); | 368 DEFINE_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); |
| 375 }; | 369 }; |
| 376 | 370 |
| 377 } } // namespace v8::internal | 371 } } // namespace v8::internal |
| 378 | 372 |
| 379 #endif // V8_ARM_CODE_STUBS_ARM_H_ | 373 #endif // V8_ARM_CODE_STUBS_ARM_H_ |
| OLD | NEW |