diff options
author | Michaƫl Zasso <targos@protonmail.com> | 2018-05-31 11:11:57 +0200 |
---|---|---|
committer | Myles Borins <mylesborins@google.com> | 2018-06-01 09:58:27 +0200 |
commit | 352a525eb984b8fa2d6f0f6fd68395e6a080bba4 (patch) | |
tree | a105ae93f8fd8f533cce19a429f1b6e95d6e11ca /deps/v8/src/ppc | |
parent | faf449ca0490f5371dc6cbbc94a87eb697b00fcc (diff) | |
download | android-node-v8-352a525eb984b8fa2d6f0f6fd68395e6a080bba4.tar.gz android-node-v8-352a525eb984b8fa2d6f0f6fd68395e6a080bba4.tar.bz2 android-node-v8-352a525eb984b8fa2d6f0f6fd68395e6a080bba4.zip |
deps: update V8 to 6.7.288.43
PR-URL: https://github.com/nodejs/node/pull/19989
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matheus Marchini <matheus@sthima.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Diffstat (limited to 'deps/v8/src/ppc')
-rw-r--r-- | deps/v8/src/ppc/assembler-ppc-inl.h | 23 | ||||
-rw-r--r-- | deps/v8/src/ppc/assembler-ppc.cc | 38 | ||||
-rw-r--r-- | deps/v8/src/ppc/assembler-ppc.h | 9 | ||||
-rw-r--r-- | deps/v8/src/ppc/code-stubs-ppc.cc | 49 | ||||
-rw-r--r-- | deps/v8/src/ppc/codegen-ppc.cc | 1 | ||||
-rw-r--r-- | deps/v8/src/ppc/constants-ppc.h | 4 | ||||
-rw-r--r-- | deps/v8/src/ppc/frame-constants-ppc.h | 24 | ||||
-rw-r--r-- | deps/v8/src/ppc/macro-assembler-ppc.cc | 127 | ||||
-rw-r--r-- | deps/v8/src/ppc/macro-assembler-ppc.h | 34 |
9 files changed, 195 insertions, 114 deletions
diff --git a/deps/v8/src/ppc/assembler-ppc-inl.h b/deps/v8/src/ppc/assembler-ppc-inl.h index 166a854638..ae37b02a24 100644 --- a/deps/v8/src/ppc/assembler-ppc-inl.h +++ b/deps/v8/src/ppc/assembler-ppc-inl.h @@ -91,7 +91,8 @@ Address RelocInfo::target_address() { Address RelocInfo::target_address_address() { DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_) || - rmode_ == EMBEDDED_OBJECT || rmode_ == EXTERNAL_REFERENCE); + IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || + IsOffHeapTarget(rmode_)); if (FLAG_enable_embedded_constant_pool && Assembler::IsConstantPoolLoadStart(pc_)) { @@ -192,6 +193,19 @@ Address RelocInfo::target_external_reference() { return Assembler::target_address_at(pc_, constant_pool_); } +void RelocInfo::set_target_external_reference( + Address target, ICacheFlushMode icache_flush_mode) { + DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE); + Assembler::set_target_address_at(pc_, constant_pool_, target, + icache_flush_mode); +} + +void RelocInfo::set_wasm_code_table_entry(Address target, + ICacheFlushMode icache_flush_mode) { + DCHECK(rmode_ == RelocInfo::WASM_CODE_TABLE_ENTRY); + Assembler::set_target_address_at(pc_, constant_pool_, target, + icache_flush_mode); +} Address RelocInfo::target_runtime_entry(Assembler* origin) { DCHECK(IsRuntimeEntry(rmode_)); @@ -206,6 +220,11 @@ void RelocInfo::set_target_runtime_entry(Address target, set_target_address(target, write_barrier_mode, icache_flush_mode); } +Address RelocInfo::target_off_heap_target() { + DCHECK(IsOffHeapTarget(rmode_)); + return Assembler::target_address_at(pc_, constant_pool_); +} + void RelocInfo::WipeOut() { DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || @@ -237,6 +256,8 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { visitor->VisitInternalReference(host(), this); } else if (IsRuntimeEntry(mode)) { visitor->VisitRuntimeEntry(host(), this); + } else if (RelocInfo::IsOffHeapTarget(mode)) { + visitor->VisitOffHeapTarget(host(), this); } } diff --git a/deps/v8/src/ppc/assembler-ppc.cc b/deps/v8/src/ppc/assembler-ppc.cc index eb16e46505..d0a6389393 100644 --- a/deps/v8/src/ppc/assembler-ppc.cc +++ b/deps/v8/src/ppc/assembler-ppc.cc @@ -427,11 +427,11 @@ const int kEndOfChain = -4; enum { kUnboundMovLabelOffsetOpcode = 0 << 26, kUnboundAddLabelOffsetOpcode = 1 << 26, - kUnboundMovLabelAddrOpcode = 2 << 26, - kUnboundJumpTableEntryOpcode = 3 << 26 + kUnboundAddLabelLongOffsetOpcode = 2 << 26, + kUnboundMovLabelAddrOpcode = 3 << 26, + kUnboundJumpTableEntryOpcode = 4 << 26 }; - int Assembler::target_at(int pos) { Instr instr = instr_at(pos); // check which type of branch this is 16 or 26 bit offset @@ -448,6 +448,7 @@ int Assembler::target_at(int pos) { break; case kUnboundMovLabelOffsetOpcode: case kUnboundAddLabelOffsetOpcode: + case kUnboundAddLabelLongOffsetOpcode: case kUnboundMovLabelAddrOpcode: case kUnboundJumpTableEntryOpcode: link = SIGN_EXT_IMM26(instr & kImm26Mask); @@ -508,15 +509,21 @@ void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { patcher.bitwise_mov32(dst, offset); break; } + case kUnboundAddLabelLongOffsetOpcode: case kUnboundAddLabelOffsetOpcode: { // dst = base + position + immediate Instr operands = instr_at(pos + kInstrSize); - 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); - PatchingAssembler patcher(isolate_data(), - reinterpret_cast<byte*>(buffer_ + pos), 2); + Register dst = Register::from_code((operands >> 27) & 0x1F); + Register base = Register::from_code((operands >> 22) & 0x1F); + int32_t delta = (opcode == kUnboundAddLabelLongOffsetOpcode) + ? static_cast<int32_t>(instr_at(pos + 2 * kInstrSize)) + : (SIGN_EXT_IMM22(operands & kImm22Mask)); + int32_t offset = target_pos + delta; + PatchingAssembler patcher( + isolate_data(), reinterpret_cast<byte*>(buffer_ + pos), + 2 + static_cast<int32_t>(opcode == kUnboundAddLabelLongOffsetOpcode)); patcher.bitwise_add32(dst, base, offset); + if (opcode == kUnboundAddLabelLongOffsetOpcode) patcher.nop(); break; } case kUnboundMovLabelAddrOpcode: { @@ -1483,11 +1490,16 @@ void Assembler::add_label_offset(Register dst, Register base, Label* label, DCHECK_EQ(0, link & 3); link >>= 2; DCHECK(is_int26(link)); - DCHECK(is_int16(delta)); - BlockTrampolinePoolScope block_trampoline_pool(this); - emit(kUnboundAddLabelOffsetOpcode | (link & kImm26Mask)); - emit(dst.code() * B21 | base.code() * B16 | (delta & kImm16Mask)); + + emit((is_int22(delta) ? kUnboundAddLabelOffsetOpcode + : kUnboundAddLabelLongOffsetOpcode) | + (link & kImm26Mask)); + emit(dst.code() * B27 | base.code() * B22 | (delta & kImm22Mask)); + + if (!is_int22(delta)) { + emit(delta); + } } } @@ -2002,7 +2014,7 @@ void Assembler::GrowBuffer(int needed) { // Some internal data structures overflow for very large buffers, // they must ensure that kMaximalBufferSize is not too large. if (desc.buffer_size > kMaximalBufferSize) { - V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); + V8::FatalProcessOutOfMemory(nullptr, "Assembler::GrowBuffer"); } // Set up new buffer. diff --git a/deps/v8/src/ppc/assembler-ppc.h b/deps/v8/src/ppc/assembler-ppc.h index 271c6e69db..2ba8e38795 100644 --- a/deps/v8/src/ppc/assembler-ppc.h +++ b/deps/v8/src/ppc/assembler-ppc.h @@ -287,8 +287,8 @@ class Register : public RegisterBase<Register, kRegAfterLast> { explicit constexpr Register(int code) : RegisterBase(code) {} }; -static_assert(IS_TRIVIALLY_COPYABLE(Register) && - sizeof(Register) == sizeof(int), +ASSERT_TRIVIALLY_COPYABLE(Register); +static_assert(sizeof(Register) == sizeof(int), "Register can efficiently be passed by value"); #define DEFINE_REGISTER(R) \ @@ -329,8 +329,8 @@ class DoubleRegister : public RegisterBase<DoubleRegister, kDoubleAfterLast> { explicit constexpr DoubleRegister(int code) : RegisterBase(code) {} }; -static_assert(IS_TRIVIALLY_COPYABLE(DoubleRegister) && - sizeof(DoubleRegister) == sizeof(int), +ASSERT_TRIVIALLY_COPYABLE(DoubleRegister); +static_assert(sizeof(DoubleRegister) == sizeof(int), "DoubleRegister can efficiently be passed by value"); typedef DoubleRegister FloatRegister; @@ -450,7 +450,6 @@ class MemOperand BASE_EMBEDDED { explicit MemOperand(Register ra, Register rb); int32_t offset() const { - DCHECK(rb_ == no_reg); return offset_; } diff --git a/deps/v8/src/ppc/code-stubs-ppc.cc b/deps/v8/src/ppc/code-stubs-ppc.cc index 742d89a590..9fd9d4d87e 100644 --- a/deps/v8/src/ppc/code-stubs-ppc.cc +++ b/deps/v8/src/ppc/code-stubs-ppc.cc @@ -159,45 +159,32 @@ void MathPowStub::Generate(MacroAssembler* masm) { const Register scratch2 = r10; Label call_runtime, done, int_exponent; - if (exponent_type() == TAGGED) { - // Base is already in double_base. - __ UntagAndJumpIfSmi(scratch, exponent, &int_exponent); - __ lfd(double_exponent, - FieldMemOperand(exponent, HeapNumber::kValueOffset)); - } - - if (exponent_type() != INTEGER) { - // Detect integer exponents stored as double. - __ TryDoubleToInt32Exact(scratch, double_exponent, scratch2, - double_scratch); - __ beq(&int_exponent); + // Detect integer exponents stored as double. + __ TryDoubleToInt32Exact(scratch, double_exponent, scratch2, double_scratch); + __ beq(&int_exponent); - __ mflr(r0); - __ push(r0); - { - AllowExternalCallThatCantCauseGC scope(masm); - __ PrepareCallCFunction(0, 2, scratch); - __ MovToFloatParameters(double_base, double_exponent); - __ CallCFunction( - ExternalReference::power_double_double_function(isolate()), 0, 2); - } - __ pop(r0); - __ mtlr(r0); - __ MovFromFloatResult(double_result); - __ b(&done); + __ mflr(r0); + __ push(r0); + { + AllowExternalCallThatCantCauseGC scope(masm); + __ PrepareCallCFunction(0, 2, scratch); + __ MovToFloatParameters(double_base, double_exponent); + __ CallCFunction(ExternalReference::power_double_double_function(isolate()), + 0, 2); } + __ pop(r0); + __ mtlr(r0); + __ MovFromFloatResult(double_result); + __ b(&done); // Calculate power with integer exponent. __ bind(&int_exponent); // Get two copies of exponent in the registers scratch and exponent. - if (exponent_type() == INTEGER) { - __ mr(scratch, exponent); - } else { - // Exponent has previously been stored into scratch as untagged integer. - __ mr(exponent, scratch); - } + // Exponent has previously been stored into scratch as untagged integer. + __ mr(exponent, scratch); + __ fmr(double_scratch, double_base); // Back up base. __ li(scratch2, Operand(1)); __ ConvertIntToDouble(scratch2, double_result); diff --git a/deps/v8/src/ppc/codegen-ppc.cc b/deps/v8/src/ppc/codegen-ppc.cc index b54a44c6ed..a2a9013b1c 100644 --- a/deps/v8/src/ppc/codegen-ppc.cc +++ b/deps/v8/src/ppc/codegen-ppc.cc @@ -7,6 +7,7 @@ #include <memory> #include "src/codegen.h" +#include "src/isolate.h" #include "src/macro-assembler.h" #include "src/ppc/simulator-ppc.h" diff --git a/deps/v8/src/ppc/constants-ppc.h b/deps/v8/src/ppc/constants-ppc.h index bab4efe0ac..44749d4eb6 100644 --- a/deps/v8/src/ppc/constants-ppc.h +++ b/deps/v8/src/ppc/constants-ppc.h @@ -39,6 +39,9 @@ const int kLoadDoubleMaxReachBits = 15; // sign-extend the least significant 16-bits of value <imm> #define SIGN_EXT_IMM16(imm) ((static_cast<int>(imm) << 16) >> 16) +// sign-extend the least significant 22-bits of value <imm> +#define SIGN_EXT_IMM22(imm) ((static_cast<int>(imm) << 10) >> 10) + // sign-extend the least significant 26-bits of value <imm> #define SIGN_EXT_IMM26(imm) ((static_cast<int>(imm) << 6) >> 6) @@ -2596,6 +2599,7 @@ enum { kImm24Mask = (1 << 24) - 1, kOff16Mask = (1 << 16) - 1, kImm16Mask = (1 << 16) - 1, + kImm22Mask = (1 << 22) - 1, kImm26Mask = (1 << 26) - 1, kBOfieldMask = 0x1f << 21, kOpcodeMask = 0x3f << 26, diff --git a/deps/v8/src/ppc/frame-constants-ppc.h b/deps/v8/src/ppc/frame-constants-ppc.h index c822de877b..f91601c046 100644 --- a/deps/v8/src/ppc/frame-constants-ppc.h +++ b/deps/v8/src/ppc/frame-constants-ppc.h @@ -12,36 +12,38 @@ namespace internal { class EntryFrameConstants : public AllStatic { public: - static const int kCallerFPOffset = + static constexpr int kCallerFPOffset = -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); }; class ExitFrameConstants : public TypedFrameConstants { public: - static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); - static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); + static constexpr int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); + static constexpr int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); DEFINE_TYPED_FRAME_SIZES(2); // The caller fields are below the frame pointer on the stack. - static const int kCallerFPOffset = 0 * kPointerSize; + static constexpr int kCallerFPOffset = 0 * kPointerSize; // The calling JS function is below FP. - static const int kCallerPCOffset = 1 * kPointerSize; + static constexpr int kCallerPCOffset = 1 * kPointerSize; // FP-relative displacement of the caller's SP. It points just // below the saved PC. - static const int kCallerSPDisplacement = 2 * kPointerSize; + static constexpr int kCallerSPDisplacement = 2 * kPointerSize; }; class JavaScriptFrameConstants : public AllStatic { public: // FP-relative. - static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset; - static const int kLastParameterOffset = +2 * kPointerSize; - static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset; + static constexpr int kLocal0Offset = + StandardFrameConstants::kExpressionsOffset; + static constexpr int kLastParameterOffset = +2 * kPointerSize; + static constexpr int kFunctionOffset = + StandardFrameConstants::kFunctionOffset; // Caller SP-relative. - static const int kParam0Offset = -2 * kPointerSize; - static const int kReceiverOffset = -1 * kPointerSize; + static constexpr int kParam0Offset = -2 * kPointerSize; + static constexpr int kReceiverOffset = -1 * kPointerSize; }; } // namespace internal diff --git a/deps/v8/src/ppc/macro-assembler-ppc.cc b/deps/v8/src/ppc/macro-assembler-ppc.cc index 68efa84c72..7747c9a4a2 100644 --- a/deps/v8/src/ppc/macro-assembler-ppc.cc +++ b/deps/v8/src/ppc/macro-assembler-ppc.cc @@ -168,7 +168,7 @@ void TurboAssembler::Call(Register target) { } void MacroAssembler::CallJSEntry(Register target) { - DCHECK(target == ip); + CHECK(target == r5); Call(target); } @@ -825,7 +825,7 @@ void TurboAssembler::ShiftRightAlgPair(Register dst_low, Register dst_high, } #endif -void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress( +void TurboAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress( Register code_target_address) { lwz(kConstantPoolRegister, MemOperand(code_target_address, @@ -833,8 +833,24 @@ void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress( add(kConstantPoolRegister, kConstantPoolRegister, code_target_address); } +void TurboAssembler::LoadPC(Register dst) { + b(4, SetLK); + mflr(dst); +} + +void TurboAssembler::ComputeCodeStartAddress(Register dst) { + Label current_pc; + mov_label_addr(dst, ¤t_pc); + + bind(¤t_pc); + subi(dst, dst, Operand(pc_offset())); +} + void TurboAssembler::LoadConstantPoolPointerRegister() { - mov_label_addr(kConstantPoolRegister, ConstantPoolPosition()); + LoadPC(kConstantPoolRegister); + int32_t delta = -pc_offset() + 4; + add_label_offset(kConstantPoolRegister, kConstantPoolRegister, + ConstantPoolPosition(), delta); } void TurboAssembler::StubPrologue(StackFrame::Type type) { @@ -850,7 +866,6 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) { } void TurboAssembler::Prologue() { - DCHECK(base != no_reg); PushStandardFrame(r4); if (FLAG_enable_embedded_constant_pool) { // base contains prologue address @@ -1178,15 +1193,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected, void MacroAssembler::CheckDebugHook(Register fun, Register new_target, const ParameterCount& expected, const ParameterCount& actual) { - Label skip_hook, call_hook; - - ExternalReference debug_is_active = - ExternalReference::debug_is_active_address(isolate()); - mov(r7, Operand(debug_is_active)); - LoadByte(r7, MemOperand(r7), r0); - extsb(r7, r7); - CmpSmiLiteral(r7, Smi::kZero, r0); - beq(&skip_hook); + Label skip_hook; ExternalReference debug_hook_avtive = ExternalReference::debug_hook_on_function_call_address(isolate()); @@ -1194,17 +1201,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target, LoadByte(r7, MemOperand(r7), r0); extsb(r7, r7); CmpSmiLiteral(r7, Smi::kZero, r0); - bne(&call_hook); - - LoadP(r7, FieldMemOperand(fun, JSFunction::kSharedFunctionInfoOffset)); - LoadP(r7, FieldMemOperand(r7, SharedFunctionInfo::kDebugInfoOffset)); - JumpIfSmi(r7, &skip_hook); - LoadP(r7, FieldMemOperand(r7, DebugInfo::kFlagsOffset)); - SmiUntag(r0, r7); - andi(r0, r0, Operand(DebugInfo::kBreakAtEntry)); - beq(&skip_hook, cr0); + beq(&skip_hook); - bind(&call_hook); { FrameScope frame(this, has_frame() ? StackFrame::NONE : StackFrame::INTERNAL); @@ -1626,12 +1624,21 @@ void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin, Jump(stub.GetCode(), RelocInfo::CODE_TARGET); } -void MacroAssembler::JumpToInstructionStream(const InstructionStream* stream) { - intptr_t bytes_address = reinterpret_cast<intptr_t>(stream->bytes()); - mov(kOffHeapTrampolineRegister, Operand(bytes_address, RelocInfo::NONE)); +void MacroAssembler::JumpToInstructionStream(Address entry) { + mov(kOffHeapTrampolineRegister, + Operand(reinterpret_cast<intptr_t>(entry), RelocInfo::OFF_HEAP_TARGET)); Jump(kOffHeapTrampolineRegister); } +void MacroAssembler::LoadWeakValue(Register out, Register in, + Label* target_if_cleared) { + cmpi(in, Operand(kClearedWeakHeapObject)); + beq(target_if_cleared); + + mov(r0, Operand(~kWeakHeapObjectMask)); + and_(out, in, r0); +} + void MacroAssembler::IncrementCounter(StatsCounter* counter, int value, Register scratch1, Register scratch2) { DCHECK_GT(value, 0); @@ -1748,6 +1755,20 @@ void MacroAssembler::AssertFixedArray(Register object) { } } +void MacroAssembler::AssertConstructor(Register object) { + if (emit_debug_code()) { + STATIC_ASSERT(kSmiTag == 0); + TestIfSmi(object, r0); + Check(ne, AbortReason::kOperandIsASmiAndNotAConstructor, cr0); + push(object); + LoadP(object, FieldMemOperand(object, HeapObject::kMapOffset)); + lbz(object, FieldMemOperand(object, Map::kBitFieldOffset)); + andi(object, object, Operand(Map::IsConstructorBit::kMask)); + pop(object); + Check(ne, AbortReason::kOperandIsNotAConstructor, cr0); + } +} + void MacroAssembler::AssertFunction(Register object) { if (emit_debug_code()) { STATIC_ASSERT(kSmiTag == 0); @@ -2393,11 +2414,12 @@ void MacroAssembler::AndSmiLiteral(Register dst, Register src, Smi* smi, // Load a "pointer" sized value from the memory location void TurboAssembler::LoadP(Register dst, const MemOperand& mem, Register scratch) { + DCHECK_EQ(mem.rb(), no_reg); int offset = mem.offset(); if (!is_int16(offset)) { /* cannot use d-form */ - DCHECK(scratch != no_reg); + DCHECK_NE(scratch, no_reg); mov(scratch, Operand(offset)); LoadPX(dst, MemOperand(mem.ra(), scratch)); } else { @@ -2805,8 +2827,8 @@ void TurboAssembler::SwapP(Register src, MemOperand dst, Register scratch) { if (dst.rb() != r0) DCHECK(!AreAliased(src, dst.rb(), scratch)); DCHECK(!AreAliased(src, scratch)); mr(scratch, src); - LoadP(src, dst); - StoreP(scratch, dst); + LoadP(src, dst, r0); + StoreP(scratch, dst, r0); } void TurboAssembler::SwapP(MemOperand src, MemOperand dst, Register scratch_0, @@ -2816,10 +2838,25 @@ void TurboAssembler::SwapP(MemOperand src, MemOperand dst, Register scratch_0, if (dst.ra() != r0) DCHECK(!AreAliased(dst.ra(), scratch_0, scratch_1)); if (dst.rb() != r0) DCHECK(!AreAliased(dst.rb(), scratch_0, scratch_1)); DCHECK(!AreAliased(scratch_0, scratch_1)); - LoadP(scratch_0, src); - LoadP(scratch_1, dst); - StoreP(scratch_0, dst); - StoreP(scratch_1, src); + if (is_int16(src.offset()) || is_int16(dst.offset())) { + if (!is_int16(src.offset())) { + // swap operand + MemOperand temp = src; + src = dst; + dst = temp; + } + LoadP(scratch_1, dst, scratch_0); + LoadP(scratch_0, src); + StoreP(scratch_1, src); + StoreP(scratch_0, dst, scratch_1); + } else { + LoadP(scratch_1, dst, scratch_0); + push(scratch_1); + LoadP(scratch_0, src, scratch_1); + StoreP(scratch_0, dst, scratch_1); + pop(scratch_1); + StoreP(scratch_1, src, scratch_0); + } } void TurboAssembler::SwapFloat32(DoubleRegister src, DoubleRegister dst, @@ -2835,18 +2872,18 @@ void TurboAssembler::SwapFloat32(DoubleRegister src, MemOperand dst, DoubleRegister scratch) { DCHECK(!AreAliased(src, scratch)); fmr(scratch, src); - LoadSingle(src, dst); - StoreSingle(scratch, dst); + LoadSingle(src, dst, r0); + StoreSingle(scratch, dst, r0); } void TurboAssembler::SwapFloat32(MemOperand src, MemOperand dst, DoubleRegister scratch_0, DoubleRegister scratch_1) { DCHECK(!AreAliased(scratch_0, scratch_1)); - LoadSingle(scratch_0, src); - LoadSingle(scratch_1, dst); - StoreSingle(scratch_0, dst); - StoreSingle(scratch_1, src); + LoadSingle(scratch_0, src, r0); + LoadSingle(scratch_1, dst, r0); + StoreSingle(scratch_0, dst, r0); + StoreSingle(scratch_1, src, r0); } void TurboAssembler::SwapDouble(DoubleRegister src, DoubleRegister dst, @@ -2862,18 +2899,18 @@ void TurboAssembler::SwapDouble(DoubleRegister src, MemOperand dst, DoubleRegister scratch) { DCHECK(!AreAliased(src, scratch)); fmr(scratch, src); - LoadDouble(src, dst); - StoreDouble(scratch, dst); + LoadDouble(src, dst, r0); + StoreDouble(scratch, dst, r0); } void TurboAssembler::SwapDouble(MemOperand src, MemOperand dst, DoubleRegister scratch_0, DoubleRegister scratch_1) { DCHECK(!AreAliased(scratch_0, scratch_1)); - LoadDouble(scratch_0, src); - LoadDouble(scratch_1, dst); - StoreDouble(scratch_0, dst); - StoreDouble(scratch_1, src); + LoadDouble(scratch_0, src, r0); + LoadDouble(scratch_1, dst, r0); + StoreDouble(scratch_0, dst, r0); + StoreDouble(scratch_1, src, r0); } #ifdef DEBUG diff --git a/deps/v8/src/ppc/macro-assembler-ppc.h b/deps/v8/src/ppc/macro-assembler-ppc.h index f4d9afd47f..db2a4039bd 100644 --- a/deps/v8/src/ppc/macro-assembler-ppc.h +++ b/deps/v8/src/ppc/macro-assembler-ppc.h @@ -216,6 +216,8 @@ class TurboAssembler : public Assembler { Register scratch = no_reg); void LoadSingleU(DoubleRegister dst, const MemOperand& mem, Register scratch = no_reg); + void LoadPC(Register dst); + void ComputeCodeStartAddress(Register dst); void StoreDouble(DoubleRegister src, const MemOperand& mem, Register scratch = no_reg); @@ -504,10 +506,18 @@ class TurboAssembler : public Assembler { void Move(Register dst, Register src, Condition cond = al); void Move(DoubleRegister dst, DoubleRegister src); - void SmiUntag(Register reg, RCBit rc = LeaveRC) { SmiUntag(reg, reg, rc); } + void SmiUntag(Register reg, RCBit rc = LeaveRC, int scale = 0) { + SmiUntag(reg, reg, rc, scale); + } - void SmiUntag(Register dst, Register src, RCBit rc = LeaveRC) { - ShiftRightArithImm(dst, src, kSmiShift, rc); + void SmiUntag(Register dst, Register src, RCBit rc = LeaveRC, int scale = 0) { + if (scale > kSmiShift) { + ShiftLeftImm(dst, src, Operand(scale - kSmiShift), rc); + } else if (scale < kSmiShift) { + ShiftRightArithImm(dst, src, kSmiShift - scale, rc); + } else { + // do nothing + } } // --------------------------------------------------------------------------- // Bit testing/extraction @@ -641,6 +651,10 @@ class TurboAssembler : public Assembler { void CallStubDelayed(CodeStub* stub); void LoadConstantPoolPointerRegister(); + + // Loads the constant pool pointer (kConstantPoolRegister). + void LoadConstantPoolPointerRegisterFromCodeTargetAddress( + Register code_target_address); void AbortConstantPoolBuilding() { #ifdef DEBUG // Avoid DCHECK(!is_linked()) failure in ~Label() @@ -735,10 +749,6 @@ class MacroAssembler : public TurboAssembler { void PushSafepointRegisters(); void PopSafepointRegisters(); - // Loads the constant pool pointer (kConstantPoolRegister). - void LoadConstantPoolPointerRegisterFromCodeTargetAddress( - Register code_target_address); - // Flush the I-cache from asm code. You should use CpuFeatures::FlushICache // from C. // Does not handle errors. @@ -933,7 +943,11 @@ class MacroAssembler : public TurboAssembler { bool builtin_exit_frame = false); // Generates a trampoline to jump to the off-heap instruction stream. - void JumpToInstructionStream(const InstructionStream* stream); + void JumpToInstructionStream(Address entry); + + // --------------------------------------------------------------------------- + // In-place weak references. + void LoadWeakValue(Register out, Register in, Label* target_if_cleared); // --------------------------------------------------------------------------- // StatsCounter support @@ -995,6 +1009,10 @@ class MacroAssembler : public TurboAssembler { // Abort execution if argument is not a FixedArray, enabled via --debug-code. void AssertFixedArray(Register object); + // Abort execution if argument is not a Constructor, enabled via --debug-code. + void AssertConstructor(Register object); + + // Abort execution if argument is not a JSFunction, enabled via --debug-code. void AssertFunction(Register object); // Abort execution if argument is not a JSBoundFunction, |