aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/ppc
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2018-05-31 11:11:57 +0200
committerMyles Borins <mylesborins@google.com>2018-06-01 09:58:27 +0200
commit352a525eb984b8fa2d6f0f6fd68395e6a080bba4 (patch)
treea105ae93f8fd8f533cce19a429f1b6e95d6e11ca /deps/v8/src/ppc
parentfaf449ca0490f5371dc6cbbc94a87eb697b00fcc (diff)
downloadandroid-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.h23
-rw-r--r--deps/v8/src/ppc/assembler-ppc.cc38
-rw-r--r--deps/v8/src/ppc/assembler-ppc.h9
-rw-r--r--deps/v8/src/ppc/code-stubs-ppc.cc49
-rw-r--r--deps/v8/src/ppc/codegen-ppc.cc1
-rw-r--r--deps/v8/src/ppc/constants-ppc.h4
-rw-r--r--deps/v8/src/ppc/frame-constants-ppc.h24
-rw-r--r--deps/v8/src/ppc/macro-assembler-ppc.cc127
-rw-r--r--deps/v8/src/ppc/macro-assembler-ppc.h34
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, &current_pc);
+
+ bind(&current_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,