Index: src/ppc/code-stubs-ppc.h |
diff --git a/src/arm/code-stubs-arm.h b/src/ppc/code-stubs-ppc.h |
similarity index 76% |
copy from src/arm/code-stubs-arm.h |
copy to src/ppc/code-stubs-ppc.h |
index f7456ef8a77ea589ea6e8ce138161f2ca31d2b8d..d8a4a7aaa62dd1891da98e283fe8c179546c01a5 100644 |
--- a/src/arm/code-stubs-arm.h |
+++ b/src/ppc/code-stubs-ppc.h |
@@ -1,9 +1,12 @@ |
// Copyright 2012 the V8 project authors. All rights reserved. |
+// |
+// Copyright IBM Corp. 2012, 2013. All rights reserved. |
+// |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef V8_ARM_CODE_STUBS_ARM_H_ |
-#define V8_ARM_CODE_STUBS_ARM_H_ |
+#ifndef V8_PPC_CODE_STUBS_PPC_H_ |
+#define V8_PPC_CODE_STUBS_PPC_H_ |
#include "src/ic-inl.h" |
@@ -49,14 +52,17 @@ class StringHelper : public AllStatic { |
// Generate string hash. |
static void GenerateHashInit(MacroAssembler* masm, |
Register hash, |
- Register character); |
+ Register character, |
+ Register scratch); |
static void GenerateHashAddCharacter(MacroAssembler* masm, |
Register hash, |
- Register character); |
+ Register character, |
+ Register scratch); |
static void GenerateHashGetHash(MacroAssembler* masm, |
- Register hash); |
+ Register hash, |
+ Register scratch); |
private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper); |
@@ -86,8 +92,7 @@ class StringCompareStub: public PlatformCodeStub { |
Register right, |
Register scratch1, |
Register scratch2, |
- Register scratch3, |
- Register scratch4); |
+ Register scratch3); |
// Compares two flat ASCII strings for equality and returns result |
// in r0. |
@@ -95,8 +100,7 @@ class StringCompareStub: public PlatformCodeStub { |
Register left, |
Register right, |
Register scratch1, |
- Register scratch2, |
- Register scratch3); |
+ Register scratch2); |
private: |
virtual Major MajorKey() const { return StringCompare; } |
@@ -108,49 +112,10 @@ class StringCompareStub: public PlatformCodeStub { |
Register right, |
Register length, |
Register scratch1, |
- Register scratch2, |
Label* chars_not_equal); |
}; |
-// This stub can convert a signed int32 to a heap number (double). It does |
-// not work for int32s that are in Smi range! No GC occurs during this stub |
-// so you don't have to set up the frame. |
-class WriteInt32ToHeapNumberStub : public PlatformCodeStub { |
- public: |
- WriteInt32ToHeapNumberStub(Isolate* isolate, |
- Register the_int, |
- Register the_heap_number, |
- Register scratch) |
- : PlatformCodeStub(isolate), |
- the_int_(the_int), |
- the_heap_number_(the_heap_number), |
- scratch_(scratch) { } |
- |
- static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); |
- |
- private: |
- Register the_int_; |
- Register the_heap_number_; |
- Register scratch_; |
- |
- // Minor key encoding in 16 bits. |
- class IntRegisterBits: public BitField<int, 0, 4> {}; |
- class HeapNumberRegisterBits: public BitField<int, 4, 4> {}; |
- class ScratchRegisterBits: public BitField<int, 8, 4> {}; |
- |
- Major MajorKey() const { return WriteInt32ToHeapNumber; } |
- int MinorKey() const { |
- // Encode the parameters in a unique 16 bit value. |
- return IntRegisterBits::encode(the_int_.code()) |
- | HeapNumberRegisterBits::encode(the_heap_number_.code()) |
- | ScratchRegisterBits::encode(scratch_.code()); |
- } |
- |
- void Generate(MacroAssembler* masm); |
-}; |
- |
- |
class RecordWriteStub: public PlatformCodeStub { |
public: |
RecordWriteStub(Isolate* isolate, |
@@ -179,31 +144,32 @@ class RecordWriteStub: public PlatformCodeStub { |
virtual bool SometimesSetsUpAFrame() { return false; } |
static void PatchBranchIntoNop(MacroAssembler* masm, int pos) { |
- masm->instr_at_put(pos, (masm->instr_at(pos) & ~B27) | (B24 | B20)); |
- ASSERT(Assembler::IsTstImmediate(masm->instr_at(pos))); |
+ masm->instr_at_put(pos, (masm->instr_at(pos) & ~kBOfieldMask) | BT); |
+ // roohack ASSERT(Assembler::IsTstImmediate(masm->instr_at(pos))); |
} |
static void PatchNopIntoBranch(MacroAssembler* masm, int pos) { |
- masm->instr_at_put(pos, (masm->instr_at(pos) & ~(B24 | B20)) | B27); |
- ASSERT(Assembler::IsBranch(masm->instr_at(pos))); |
+ masm->instr_at_put(pos, (masm->instr_at(pos) & ~kBOfieldMask) | BF); |
+ // roohack ASSERT(Assembler::IsBranch(masm->instr_at(pos))); |
} |
static Mode GetMode(Code* stub) { |
- Instr first_instruction = Assembler::instr_at(stub->instruction_start()); |
- Instr second_instruction = Assembler::instr_at(stub->instruction_start() + |
+ Instr first_instruction = Assembler::instr_at(stub->instruction_start() + |
Assembler::kInstrSize); |
+ Instr second_instruction = Assembler::instr_at(stub->instruction_start() + |
+ (Assembler::kInstrSize*2)); |
- if (Assembler::IsBranch(first_instruction)) { |
+ if (BF == (first_instruction & kBOfieldMask)) { |
return INCREMENTAL; |
} |
- ASSERT(Assembler::IsTstImmediate(first_instruction)); |
+ // roohack ASSERT(Assembler::IsTstImmediate(first_instruction)); |
- if (Assembler::IsBranch(second_instruction)) { |
+ if (BF == (second_instruction & kBOfieldMask)) { |
return INCREMENTAL_COMPACTION; |
} |
- ASSERT(Assembler::IsTstImmediate(second_instruction)); |
+ // roohack ASSERT(Assembler::IsTstImmediate(second_instruction)); |
return STORE_BUFFER_ONLY; |
} |
@@ -216,21 +182,22 @@ class RecordWriteStub: public PlatformCodeStub { |
case STORE_BUFFER_ONLY: |
ASSERT(GetMode(stub) == INCREMENTAL || |
GetMode(stub) == INCREMENTAL_COMPACTION); |
- PatchBranchIntoNop(&masm, 0); |
+ |
PatchBranchIntoNop(&masm, Assembler::kInstrSize); |
+ PatchBranchIntoNop(&masm, Assembler::kInstrSize*2); |
break; |
case INCREMENTAL: |
ASSERT(GetMode(stub) == STORE_BUFFER_ONLY); |
- PatchNopIntoBranch(&masm, 0); |
+ PatchNopIntoBranch(&masm, Assembler::kInstrSize); |
break; |
case INCREMENTAL_COMPACTION: |
ASSERT(GetMode(stub) == STORE_BUFFER_ONLY); |
- PatchNopIntoBranch(&masm, Assembler::kInstrSize); |
+ PatchNopIntoBranch(&masm, Assembler::kInstrSize*2); |
break; |
} |
ASSERT(GetMode(stub) == mode); |
- CpuFeatures::FlushICache(stub->instruction_start(), |
- 2 * Assembler::kInstrSize); |
+ CpuFeatures::FlushICache(stub->instruction_start()+Assembler::kInstrSize, |
+ 2 * Assembler::kInstrSize); |
} |
private: |
@@ -264,18 +231,24 @@ class RecordWriteStub: public PlatformCodeStub { |
// saved registers that were not already preserved. The scratch registers |
// will be restored by other means so we don't bother pushing them here. |
void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) { |
- masm->stm(db_w, sp, (kCallerSaved | lr.bit()) & ~scratch1_.bit()); |
+ masm->mflr(r0); |
+ masm->push(r0); |
+ masm->MultiPush(kJSCallerSaved & ~scratch1_.bit()); |
if (mode == kSaveFPRegs) { |
- masm->SaveFPRegs(sp, scratch0_); |
+ // Save all volatile FP registers except d0. |
+ masm->SaveFPRegs(sp, 1, DoubleRegister::kNumVolatileRegisters - 1); |
} |
} |
inline void RestoreCallerSaveRegisters(MacroAssembler*masm, |
SaveFPRegsMode mode) { |
if (mode == kSaveFPRegs) { |
- masm->RestoreFPRegs(sp, scratch0_); |
+ // Restore all volatile FP registers except d0. |
+ masm->RestoreFPRegs(sp, 1, DoubleRegister::kNumVolatileRegisters - 1); |
} |
- masm->ldm(ia_w, sp, (kCallerSaved | lr.bit()) & ~scratch1_.bit()); |
+ masm->MultiPop(kJSCallerSaved & ~scratch1_.bit()); |
+ masm->pop(r0); |
+ masm->mtlr(r0); |
} |
inline Register object() { return object_; } |
@@ -319,11 +292,11 @@ class RecordWriteStub: public PlatformCodeStub { |
code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); |
} |
- class ObjectBits: public BitField<int, 0, 4> {}; |
- class ValueBits: public BitField<int, 4, 4> {}; |
- class AddressBits: public BitField<int, 8, 4> {}; |
- class RememberedSetActionBits: public BitField<RememberedSetAction, 12, 1> {}; |
- class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 13, 1> {}; |
+ class ObjectBits: public BitField<int, 0, 5> {}; |
+ class ValueBits: public BitField<int, 5, 5> {}; |
+ class AddressBits: public BitField<int, 10, 5> {}; |
+ class RememberedSetActionBits: public BitField<RememberedSetAction, 15, 1> {}; |
+ class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 16, 1> {}; |
Register object_; |
Register value_; |
@@ -402,20 +375,6 @@ class NameDictionaryLookupStub: public PlatformCodeStub { |
LookupMode mode_; |
}; |
- |
-class PlatformInterfaceDescriptor { |
- public: |
- explicit PlatformInterfaceDescriptor( |
- TargetAddressStorageMode storage_mode) |
- : storage_mode_(storage_mode) { } |
- |
- TargetAddressStorageMode storage_mode() { return storage_mode_; } |
- |
- private: |
- TargetAddressStorageMode storage_mode_; |
-}; |
- |
- |
} } // namespace v8::internal |
-#endif // V8_ARM_CODE_STUBS_ARM_H_ |
+#endif // V8_PPC_CODE_STUBS_PPC_H_ |