| 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 ff2a80e676f41b237cc06e71479658da74b53324..6c56211798112bb96c029c5e654aec9011947329 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)); | 
| -    DCHECK(Assembler::IsTstImmediate(masm->instr_at(pos))); | 
| +    masm->instr_at_put(pos, (masm->instr_at(pos) & ~kBOfieldMask) | BT); | 
| +    // roohack DCHECK(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); | 
| -    DCHECK(Assembler::IsBranch(masm->instr_at(pos))); | 
| +    masm->instr_at_put(pos, (masm->instr_at(pos) & ~kBOfieldMask) | BF); | 
| +    // roohack DCHECK(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; | 
| } | 
|  | 
| -    DCHECK(Assembler::IsTstImmediate(first_instruction)); | 
| +    // roohack DCHECK(Assembler::IsTstImmediate(first_instruction)); | 
|  | 
| -    if (Assembler::IsBranch(second_instruction)) { | 
| +    if (BF == (second_instruction & kBOfieldMask)) { | 
| return INCREMENTAL_COMPACTION; | 
| } | 
|  | 
| -    DCHECK(Assembler::IsTstImmediate(second_instruction)); | 
| +    // roohack DCHECK(Assembler::IsTstImmediate(second_instruction)); | 
|  | 
| return STORE_BUFFER_ONLY; | 
| } | 
| @@ -216,21 +182,22 @@ class RecordWriteStub: public PlatformCodeStub { | 
| case STORE_BUFFER_ONLY: | 
| DCHECK(GetMode(stub) == INCREMENTAL || | 
| GetMode(stub) == INCREMENTAL_COMPACTION); | 
| -        PatchBranchIntoNop(&masm, 0); | 
| + | 
| PatchBranchIntoNop(&masm, Assembler::kInstrSize); | 
| +        PatchBranchIntoNop(&masm, Assembler::kInstrSize*2); | 
| break; | 
| case INCREMENTAL: | 
| DCHECK(GetMode(stub) == STORE_BUFFER_ONLY); | 
| -        PatchNopIntoBranch(&masm, 0); | 
| +        PatchNopIntoBranch(&masm, Assembler::kInstrSize); | 
| break; | 
| case INCREMENTAL_COMPACTION: | 
| DCHECK(GetMode(stub) == STORE_BUFFER_ONLY); | 
| -        PatchNopIntoBranch(&masm, Assembler::kInstrSize); | 
| +        PatchNopIntoBranch(&masm, Assembler::kInstrSize*2); | 
| break; | 
| } | 
| DCHECK(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_ | 
|  |