diff options
Diffstat (limited to 'deps/v8/src/ppc/assembler-ppc.cc')
-rw-r--r-- | deps/v8/src/ppc/assembler-ppc.cc | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/deps/v8/src/ppc/assembler-ppc.cc b/deps/v8/src/ppc/assembler-ppc.cc index ac03ce6949..147fb59aae 100644 --- a/deps/v8/src/ppc/assembler-ppc.cc +++ b/deps/v8/src/ppc/assembler-ppc.cc @@ -453,7 +453,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { // pointer in a register. Register dst = Register::from_code(instr_at(pos + kInstrSize)); int32_t offset = target_pos + (Code::kHeaderSize - kHeapObjectTag); - CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos), 2, + CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 2, CodePatcher::DONT_FLUSH); patcher.masm()->bitwise_mov32(dst, offset); break; @@ -464,7 +464,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { Register dst = Register::from_code((operands >> 21) & 0x1f); Register base = Register::from_code((operands >> 16) & 0x1f); int32_t offset = target_pos + SIGN_EXT_IMM16(operands & kImm16Mask); - CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos), 2, + CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 2, CodePatcher::DONT_FLUSH); patcher.masm()->bitwise_add32(dst, base, offset); break; @@ -472,7 +472,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { case kUnboundMovLabelAddrOpcode: { // Load the address of the label in a register. Register dst = Register::from_code(instr_at(pos + kInstrSize)); - CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos), + CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), kMovInstructionsNoConstantPool, CodePatcher::DONT_FLUSH); // Keep internal references relative until EmitRelocations. @@ -480,7 +480,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { break; } case kUnboundJumpTableEntryOpcode: { - CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos), + CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), kPointerSize / kInstrSize, CodePatcher::DONT_FLUSH); // Keep internal references relative until EmitRelocations. patcher.masm()->dp(target_pos); @@ -1844,7 +1844,10 @@ void Assembler::mtxer(Register src) { } -void Assembler::mcrfs(int bf, int bfa) { +void Assembler::mcrfs(CRegister cr, FPSCRBit bit) { + DCHECK(static_cast<int>(bit) < 32); + int bf = cr.code(); + int bfa = bit / CRWIDTH; emit(EXT4 | MCRFS | bf * B23 | bfa * B18); } @@ -2163,6 +2166,18 @@ void Assembler::fcfid(const DoubleRegister frt, const DoubleRegister frb, } +void Assembler::fcfidu(const DoubleRegister frt, const DoubleRegister frb, + RCBit rc) { + emit(EXT4 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); +} + + +void Assembler::fcfidus(const DoubleRegister frt, const DoubleRegister frb, + RCBit rc) { + emit(EXT3 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); +} + + void Assembler::fcfids(const DoubleRegister frt, const DoubleRegister frb, RCBit rc) { emit(EXT3 | FCFID | frt.code() * B21 | frb.code() * B11 | rc); @@ -2181,6 +2196,18 @@ void Assembler::fctidz(const DoubleRegister frt, const DoubleRegister frb, } +void Assembler::fctidu(const DoubleRegister frt, const DoubleRegister frb, + RCBit rc) { + emit(EXT4 | FCTIDU | frt.code() * B21 | frb.code() * B11 | rc); +} + + +void Assembler::fctiduz(const DoubleRegister frt, const DoubleRegister frb, + RCBit rc) { + emit(EXT4 | FCTIDUZ | frt.code() * B21 | frb.code() * B11 | rc); +} + + void Assembler::fsel(const DoubleRegister frt, const DoubleRegister fra, const DoubleRegister frc, const DoubleRegister frb, RCBit rc) { @@ -2195,6 +2222,20 @@ void Assembler::fneg(const DoubleRegister frt, const DoubleRegister frb, } +void Assembler::mtfsb0(FPSCRBit bit, RCBit rc) { + DCHECK(static_cast<int>(bit) < 32); + int bt = bit; + emit(EXT4 | MTFSB0 | bt * B21 | rc); +} + + +void Assembler::mtfsb1(FPSCRBit bit, RCBit rc) { + DCHECK(static_cast<int>(bit) < 32); + int bt = bit; + emit(EXT4 | MTFSB1 | bt * B21 | rc); +} + + void Assembler::mtfsfi(int bf, int immediate, RCBit rc) { emit(EXT4 | MTFSFI | bf * B23 | immediate * B12 | rc); } @@ -2299,6 +2340,7 @@ void Assembler::GrowBuffer(int needed) { // Set up new buffer. desc.buffer = NewArray<byte>(desc.buffer_size); + desc.origin = this; desc.instr_size = pc_offset(); desc.reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); @@ -2377,7 +2419,7 @@ void Assembler::EmitRelocations() { RelocInfo::Mode rmode = it->rmode(); Address pc = buffer_ + it->position(); Code* code = NULL; - RelocInfo rinfo(pc, rmode, it->data(), code); + RelocInfo rinfo(isolate(), pc, rmode, it->data(), code); // Fix up internal references now that they are guaranteed to be bound. if (RelocInfo::IsInternalReference(rmode)) { @@ -2387,7 +2429,8 @@ void Assembler::EmitRelocations() { } else if (RelocInfo::IsInternalReferenceEncoded(rmode)) { // mov sequence intptr_t pos = reinterpret_cast<intptr_t>(target_address_at(pc, code)); - set_target_address_at(pc, code, buffer_ + pos, SKIP_ICACHE_FLUSH); + set_target_address_at(isolate(), pc, code, buffer_ + pos, + SKIP_ICACHE_FLUSH); } reloc_info_writer.Write(&rinfo); |