OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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_IA32_CODE_STUBS_IA32_H_ | 5 #ifndef V8_X87_CODE_STUBS_X87_H_ |
6 #define V8_IA32_CODE_STUBS_IA32_H_ | 6 #define V8_X87_CODE_STUBS_X87_H_ |
7 | 7 |
8 #include "macro-assembler.h" | 8 #include "macro-assembler.h" |
9 #include "ic-inl.h" | 9 #include "ic-inl.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 | 13 |
14 | 14 |
15 void ArrayNativeCode(MacroAssembler* masm, | 15 void ArrayNativeCode(MacroAssembler* masm, |
16 bool construct_call, | 16 bool construct_call, |
17 Label* call_generic_code); | 17 Label* call_generic_code); |
18 | 18 |
19 | 19 |
20 class StoreBufferOverflowStub: public PlatformCodeStub { | 20 class StoreBufferOverflowStub: public PlatformCodeStub { |
21 public: | 21 public: |
22 StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp) | 22 explicit StoreBufferOverflowStub(Isolate* isolate) |
23 : PlatformCodeStub(isolate), save_doubles_(save_fp) { } | 23 : PlatformCodeStub(isolate) { } |
24 | 24 |
25 void Generate(MacroAssembler* masm); | 25 void Generate(MacroAssembler* masm); |
26 | 26 |
27 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); | 27 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); |
28 virtual bool SometimesSetsUpAFrame() { return false; } | 28 virtual bool SometimesSetsUpAFrame() { return false; } |
29 | 29 |
30 private: | 30 private: |
31 SaveFPRegsMode save_doubles_; | |
32 | |
33 Major MajorKey() { return StoreBufferOverflow; } | 31 Major MajorKey() { return StoreBufferOverflow; } |
34 int MinorKey() { return (save_doubles_ == kSaveFPRegs) ? 1 : 0; } | 32 int MinorKey() { return 0; } |
35 }; | 33 }; |
36 | 34 |
37 | 35 |
38 class StringHelper : public AllStatic { | 36 class StringHelper : public AllStatic { |
39 public: | 37 public: |
40 // Generate code for copying characters using the rep movs instruction. | 38 // Generate code for copying characters using the rep movs instruction. |
41 // Copies ecx characters from esi to edi. Copying of overlapping regions is | 39 // Copies ecx characters from esi to edi. Copying of overlapping regions is |
42 // not supported. | 40 // not supported. |
43 static void GenerateCopyCharactersREP(MacroAssembler* masm, | 41 static void GenerateCopyCharactersREP(MacroAssembler* masm, |
44 Register dest, // Must be edi. | 42 Register dest, // Must be edi. |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 LookupMode mode_; | 174 LookupMode mode_; |
177 }; | 175 }; |
178 | 176 |
179 | 177 |
180 class RecordWriteStub: public PlatformCodeStub { | 178 class RecordWriteStub: public PlatformCodeStub { |
181 public: | 179 public: |
182 RecordWriteStub(Isolate* isolate, | 180 RecordWriteStub(Isolate* isolate, |
183 Register object, | 181 Register object, |
184 Register value, | 182 Register value, |
185 Register address, | 183 Register address, |
186 RememberedSetAction remembered_set_action, | 184 RememberedSetAction remembered_set_action) |
187 SaveFPRegsMode fp_mode) | |
188 : PlatformCodeStub(isolate), | 185 : PlatformCodeStub(isolate), |
189 object_(object), | 186 object_(object), |
190 value_(value), | 187 value_(value), |
191 address_(address), | 188 address_(address), |
192 remembered_set_action_(remembered_set_action), | 189 remembered_set_action_(remembered_set_action), |
193 save_fp_regs_mode_(fp_mode), | |
194 regs_(object, // An input reg. | 190 regs_(object, // An input reg. |
195 address, // An input reg. | 191 address, // An input reg. |
196 value) { // One scratch reg. | 192 value) { // One scratch reg. |
197 } | 193 } |
198 | 194 |
199 enum Mode { | 195 enum Mode { |
200 STORE_BUFFER_ONLY, | 196 STORE_BUFFER_ONLY, |
201 INCREMENTAL, | 197 INCREMENTAL, |
202 INCREMENTAL_COMPACTION | 198 INCREMENTAL_COMPACTION |
203 }; | 199 }; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 !ecx.is(address_orig_)) { | 320 !ecx.is(address_orig_)) { |
325 masm->pop(ecx); | 321 masm->pop(ecx); |
326 } | 322 } |
327 if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_); | 323 if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_); |
328 } | 324 } |
329 | 325 |
330 // If we have to call into C then we need to save and restore all caller- | 326 // If we have to call into C then we need to save and restore all caller- |
331 // saved registers that were not already preserved. The caller saved | 327 // saved registers that were not already preserved. The caller saved |
332 // registers are eax, ecx and edx. The three scratch registers (incl. ecx) | 328 // registers are eax, ecx and edx. The three scratch registers (incl. ecx) |
333 // will be restored by other means so we don't bother pushing them here. | 329 // will be restored by other means so we don't bother pushing them here. |
334 void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) { | 330 void SaveCallerSaveRegisters(MacroAssembler* masm) { |
335 if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->push(eax); | 331 if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->push(eax); |
336 if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->push(edx); | 332 if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->push(edx); |
337 if (mode == kSaveFPRegs) { | |
338 masm->sub(esp, | |
339 Immediate(kDoubleSize * (XMMRegister::kMaxNumRegisters - 1))); | |
340 // Save all XMM registers except XMM0. | |
341 for (int i = XMMRegister::kMaxNumRegisters - 1; i > 0; i--) { | |
342 XMMRegister reg = XMMRegister::from_code(i); | |
343 masm->movsd(Operand(esp, (i - 1) * kDoubleSize), reg); | |
344 } | |
345 } | |
346 } | 333 } |
347 | 334 |
348 inline void RestoreCallerSaveRegisters(MacroAssembler*masm, | 335 inline void RestoreCallerSaveRegisters(MacroAssembler*masm) { |
349 SaveFPRegsMode mode) { | |
350 if (mode == kSaveFPRegs) { | |
351 // Restore all XMM registers except XMM0. | |
352 for (int i = XMMRegister::kMaxNumRegisters - 1; i > 0; i--) { | |
353 XMMRegister reg = XMMRegister::from_code(i); | |
354 masm->movsd(reg, Operand(esp, (i - 1) * kDoubleSize)); | |
355 } | |
356 masm->add(esp, | |
357 Immediate(kDoubleSize * (XMMRegister::kMaxNumRegisters - 1))); | |
358 } | |
359 if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->pop(edx); | 336 if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->pop(edx); |
360 if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->pop(eax); | 337 if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->pop(eax); |
361 } | 338 } |
362 | 339 |
363 inline Register object() { return object_; } | 340 inline Register object() { return object_; } |
364 inline Register address() { return address_; } | 341 inline Register address() { return address_; } |
365 inline Register scratch0() { return scratch0_; } | 342 inline Register scratch0() { return scratch0_; } |
366 inline Register scratch1() { return scratch1_; } | 343 inline Register scratch1() { return scratch1_; } |
367 | 344 |
368 private: | 345 private: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 OnNoNeedToInformIncrementalMarker on_no_need, | 381 OnNoNeedToInformIncrementalMarker on_no_need, |
405 Mode mode); | 382 Mode mode); |
406 void InformIncrementalMarker(MacroAssembler* masm); | 383 void InformIncrementalMarker(MacroAssembler* masm); |
407 | 384 |
408 Major MajorKey() { return RecordWrite; } | 385 Major MajorKey() { return RecordWrite; } |
409 | 386 |
410 int MinorKey() { | 387 int MinorKey() { |
411 return ObjectBits::encode(object_.code()) | | 388 return ObjectBits::encode(object_.code()) | |
412 ValueBits::encode(value_.code()) | | 389 ValueBits::encode(value_.code()) | |
413 AddressBits::encode(address_.code()) | | 390 AddressBits::encode(address_.code()) | |
414 RememberedSetActionBits::encode(remembered_set_action_) | | 391 RememberedSetActionBits::encode(remembered_set_action_); |
415 SaveFPRegsModeBits::encode(save_fp_regs_mode_); | |
416 } | 392 } |
417 | 393 |
418 void Activate(Code* code) { | 394 void Activate(Code* code) { |
419 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); | 395 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); |
420 } | 396 } |
421 | 397 |
422 class ObjectBits: public BitField<int, 0, 3> {}; | 398 class ObjectBits: public BitField<int, 0, 3> {}; |
423 class ValueBits: public BitField<int, 3, 3> {}; | 399 class ValueBits: public BitField<int, 3, 3> {}; |
424 class AddressBits: public BitField<int, 6, 3> {}; | 400 class AddressBits: public BitField<int, 6, 3> {}; |
425 class RememberedSetActionBits: public BitField<RememberedSetAction, 9, 1> {}; | 401 class RememberedSetActionBits: public BitField<RememberedSetAction, 9, 1> {}; |
426 class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 10, 1> {}; | |
427 | 402 |
428 Register object_; | 403 Register object_; |
429 Register value_; | 404 Register value_; |
430 Register address_; | 405 Register address_; |
431 RememberedSetAction remembered_set_action_; | 406 RememberedSetAction remembered_set_action_; |
432 SaveFPRegsMode save_fp_regs_mode_; | |
433 RegisterAllocation regs_; | 407 RegisterAllocation regs_; |
434 }; | 408 }; |
435 | 409 |
436 | 410 |
437 } } // namespace v8::internal | 411 } } // namespace v8::internal |
438 | 412 |
439 #endif // V8_IA32_CODE_STUBS_IA32_H_ | 413 #endif // V8_X87_CODE_STUBS_X87_H_ |
OLD | NEW |