summaryrefslogtreecommitdiff
path: root/deps/v8/src/arm/macro-assembler-arm.cc
diff options
context:
space:
mode:
authorMyles Borins <mylesborins@google.com>2018-04-10 21:39:51 -0400
committerJames M Snell <jasnell@gmail.com>2018-04-16 16:02:46 -0700
commit9daebb48d6f0ca63e72197a69e46c8ab43bc5d02 (patch)
tree8605276308c8b4e3597516961266bae1af57557a /deps/v8/src/arm/macro-assembler-arm.cc
parent7d2814e7903155e61f244ae70721da1531cbcaec (diff)
downloadnode-new-9daebb48d6f0ca63e72197a69e46c8ab43bc5d02.tar.gz
deps: update V8 to 6.6.346.23
PR-URL: https://github.com/nodejs/node/pull/19201 Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'deps/v8/src/arm/macro-assembler-arm.cc')
-rw-r--r--deps/v8/src/arm/macro-assembler-arm.cc165
1 files changed, 103 insertions, 62 deletions
diff --git a/deps/v8/src/arm/macro-assembler-arm.cc b/deps/v8/src/arm/macro-assembler-arm.cc
index 30190d3f34..3a96b640a2 100644
--- a/deps/v8/src/arm/macro-assembler-arm.cc
+++ b/deps/v8/src/arm/macro-assembler-arm.cc
@@ -18,6 +18,7 @@
#include "src/double.h"
#include "src/external-reference-table.h"
#include "src/frames-inl.h"
+#include "src/instruction-stream.h"
#include "src/objects-inl.h"
#include "src/register-configuration.h"
#include "src/runtime/runtime.h"
@@ -241,22 +242,6 @@ void TurboAssembler::Ret(int drop, Condition cond) {
Ret(cond);
}
-
-void MacroAssembler::Swap(Register reg1,
- Register reg2,
- Register scratch,
- Condition cond) {
- if (scratch == no_reg) {
- eor(reg1, reg1, Operand(reg2), LeaveCC, cond);
- eor(reg2, reg2, Operand(reg1), LeaveCC, cond);
- eor(reg1, reg1, Operand(reg2), LeaveCC, cond);
- } else {
- mov(scratch, reg1, LeaveCC, cond);
- mov(reg1, reg2, LeaveCC, cond);
- mov(reg2, scratch, LeaveCC, cond);
- }
-}
-
void TurboAssembler::Call(Label* target) { bl(target); }
void TurboAssembler::Push(Handle<HeapObject> handle) {
@@ -305,27 +290,34 @@ void TurboAssembler::Move(QwNeonRegister dst, QwNeonRegister src) {
}
}
-void TurboAssembler::Swap(DwVfpRegister srcdst0, DwVfpRegister srcdst1) {
- if (srcdst0 == srcdst1) return; // Swapping aliased registers emits nothing.
+void TurboAssembler::Swap(Register srcdst0, Register srcdst1) {
+ DCHECK(srcdst0 != srcdst1);
+ UseScratchRegisterScope temps(this);
+ Register scratch = temps.Acquire();
+ mov(scratch, srcdst0);
+ mov(srcdst0, srcdst1);
+ mov(srcdst1, scratch);
+}
+void TurboAssembler::Swap(DwVfpRegister srcdst0, DwVfpRegister srcdst1) {
+ DCHECK(srcdst0 != srcdst1);
DCHECK(VfpRegisterIsAvailable(srcdst0));
DCHECK(VfpRegisterIsAvailable(srcdst1));
if (CpuFeatures::IsSupported(NEON)) {
vswp(srcdst0, srcdst1);
} else {
- DCHECK_NE(srcdst0, kScratchDoubleReg);
- DCHECK_NE(srcdst1, kScratchDoubleReg);
- vmov(kScratchDoubleReg, srcdst0);
+ UseScratchRegisterScope temps(this);
+ DwVfpRegister scratch = temps.AcquireD();
+ vmov(scratch, srcdst0);
vmov(srcdst0, srcdst1);
- vmov(srcdst1, kScratchDoubleReg);
+ vmov(srcdst1, scratch);
}
}
void TurboAssembler::Swap(QwNeonRegister srcdst0, QwNeonRegister srcdst1) {
- if (srcdst0 != srcdst1) {
- vswp(srcdst0, srcdst1);
- }
+ DCHECK(srcdst0 != srcdst1);
+ vswp(srcdst0, srcdst1);
}
void MacroAssembler::Mls(Register dst, Register src1, Register src2,
@@ -817,11 +809,14 @@ void TurboAssembler::VmovExtended(int dst_code, int src_code) {
int dst_offset = dst_code & 1;
int src_offset = src_code & 1;
if (CpuFeatures::IsSupported(NEON)) {
+ UseScratchRegisterScope temps(this);
+ DwVfpRegister scratch = temps.AcquireD();
// On Neon we can shift and insert from d-registers.
if (src_offset == dst_offset) {
// Offsets are the same, use vdup to copy the source to the opposite lane.
- vdup(Neon32, kScratchDoubleReg, src_d_reg, src_offset);
- src_d_reg = kScratchDoubleReg;
+ vdup(Neon32, scratch, src_d_reg, src_offset);
+ // Here we are extending the lifetime of scratch.
+ src_d_reg = scratch;
src_offset = dst_offset ^ 1;
}
if (dst_offset) {
@@ -842,27 +837,30 @@ void TurboAssembler::VmovExtended(int dst_code, int src_code) {
// Without Neon, use the scratch registers to move src and/or dst into
// s-registers.
- int scratchSCode = kScratchDoubleReg.low().code();
- int scratchSCode2 = kScratchDoubleReg2.low().code();
+ UseScratchRegisterScope temps(this);
+ LowDwVfpRegister d_scratch = temps.AcquireLowD();
+ LowDwVfpRegister d_scratch2 = temps.AcquireLowD();
+ int s_scratch_code = d_scratch.low().code();
+ int s_scratch_code2 = d_scratch2.low().code();
if (src_code < SwVfpRegister::kNumRegisters) {
// src is an s-register, dst is not.
- vmov(kScratchDoubleReg, dst_d_reg);
- vmov(SwVfpRegister::from_code(scratchSCode + dst_offset),
+ vmov(d_scratch, dst_d_reg);
+ vmov(SwVfpRegister::from_code(s_scratch_code + dst_offset),
SwVfpRegister::from_code(src_code));
- vmov(dst_d_reg, kScratchDoubleReg);
+ vmov(dst_d_reg, d_scratch);
} else if (dst_code < SwVfpRegister::kNumRegisters) {
// dst is an s-register, src is not.
- vmov(kScratchDoubleReg, src_d_reg);
+ vmov(d_scratch, src_d_reg);
vmov(SwVfpRegister::from_code(dst_code),
- SwVfpRegister::from_code(scratchSCode + src_offset));
+ SwVfpRegister::from_code(s_scratch_code + src_offset));
} else {
// Neither src or dst are s-registers. Both scratch double registers are
// available when there are 32 VFP registers.
- vmov(kScratchDoubleReg, src_d_reg);
- vmov(kScratchDoubleReg2, dst_d_reg);
- vmov(SwVfpRegister::from_code(scratchSCode + dst_offset),
- SwVfpRegister::from_code(scratchSCode2 + src_offset));
- vmov(dst_d_reg, kScratchQuadReg.high());
+ vmov(d_scratch, src_d_reg);
+ vmov(d_scratch2, dst_d_reg);
+ vmov(SwVfpRegister::from_code(s_scratch_code + dst_offset),
+ SwVfpRegister::from_code(s_scratch_code2 + src_offset));
+ vmov(dst_d_reg, d_scratch2);
}
}
@@ -870,11 +868,13 @@ void TurboAssembler::VmovExtended(int dst_code, const MemOperand& src) {
if (dst_code < SwVfpRegister::kNumRegisters) {
vldr(SwVfpRegister::from_code(dst_code), src);
} else {
+ UseScratchRegisterScope temps(this);
+ LowDwVfpRegister scratch = temps.AcquireLowD();
// TODO(bbudge) If Neon supported, use load single lane form of vld1.
- int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1);
- vmov(kScratchDoubleReg, DwVfpRegister::from_code(dst_code / 2));
+ int dst_s_code = scratch.low().code() + (dst_code & 1);
+ vmov(scratch, DwVfpRegister::from_code(dst_code / 2));
vldr(SwVfpRegister::from_code(dst_s_code), src);
- vmov(DwVfpRegister::from_code(dst_code / 2), kScratchDoubleReg);
+ vmov(DwVfpRegister::from_code(dst_code / 2), scratch);
}
}
@@ -883,8 +883,10 @@ void TurboAssembler::VmovExtended(const MemOperand& dst, int src_code) {
vstr(SwVfpRegister::from_code(src_code), dst);
} else {
// TODO(bbudge) If Neon supported, use store single lane form of vst1.
- int src_s_code = kScratchDoubleReg.low().code() + (src_code & 1);
- vmov(kScratchDoubleReg, DwVfpRegister::from_code(src_code / 2));
+ UseScratchRegisterScope temps(this);
+ LowDwVfpRegister scratch = temps.AcquireLowD();
+ int src_s_code = scratch.low().code() + (src_code & 1);
+ vmov(scratch, DwVfpRegister::from_code(src_code / 2));
vstr(SwVfpRegister::from_code(src_s_code), dst);
}
}
@@ -938,9 +940,11 @@ void TurboAssembler::ReplaceLane(QwNeonRegister dst, QwNeonRegister src,
void TurboAssembler::LslPair(Register dst_low, Register dst_high,
Register src_low, Register src_high,
- Register scratch, Register shift) {
+ Register shift) {
DCHECK(!AreAliased(dst_high, src_low));
DCHECK(!AreAliased(dst_high, shift));
+ UseScratchRegisterScope temps(this);
+ Register scratch = temps.Acquire();
Label less_than_32;
Label done;
@@ -984,9 +988,11 @@ void TurboAssembler::LslPair(Register dst_low, Register dst_high,
void TurboAssembler::LsrPair(Register dst_low, Register dst_high,
Register src_low, Register src_high,
- Register scratch, Register shift) {
+ Register shift) {
DCHECK(!AreAliased(dst_low, src_high));
DCHECK(!AreAliased(dst_low, shift));
+ UseScratchRegisterScope temps(this);
+ Register scratch = temps.Acquire();
Label less_than_32;
Label done;
@@ -1031,9 +1037,11 @@ void TurboAssembler::LsrPair(Register dst_low, Register dst_high,
void TurboAssembler::AsrPair(Register dst_low, Register dst_high,
Register src_low, Register src_high,
- Register scratch, Register shift) {
+ Register shift) {
DCHECK(!AreAliased(dst_low, src_high));
DCHECK(!AreAliased(dst_low, shift));
+ UseScratchRegisterScope temps(this);
+ Register scratch = temps.Acquire();
Label less_than_32;
Label done;
@@ -1362,13 +1370,30 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
const ParameterCount& expected,
const ParameterCount& actual) {
- Label skip_hook;
+ Label skip_hook, call_hook;
+
+ ExternalReference debug_is_active =
+ ExternalReference::debug_is_active_address(isolate());
+ mov(r4, Operand(debug_is_active));
+ ldrsb(r4, MemOperand(r4));
+ cmp(r4, Operand(0));
+ b(eq, &skip_hook);
+
ExternalReference debug_hook_avtive =
ExternalReference::debug_hook_on_function_call_address(isolate());
mov(r4, Operand(debug_hook_avtive));
ldrsb(r4, MemOperand(r4));
cmp(r4, Operand(0));
+ b(ne, &call_hook);
+
+ ldr(r4, FieldMemOperand(fun, JSFunction::kSharedFunctionInfoOffset));
+ ldr(r4, FieldMemOperand(r4, SharedFunctionInfo::kDebugInfoOffset));
+ JumpIfSmi(r4, &skip_hook);
+ ldr(r4, FieldMemOperand(r4, DebugInfo::kFlagsOffset));
+ tst(r4, Operand(Smi::FromInt(DebugInfo::kBreakAtEntry)));
b(eq, &skip_hook);
+
+ bind(&call_hook);
{
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
@@ -1426,7 +1451,7 @@ void MacroAssembler::InvokeFunctionCode(Register function, Register new_target,
// We call indirectly through the code field in the function to
// allow recompilation to take effect without changing any of the
// call sites.
- Register code = r4;
+ Register code = kJavaScriptCallCodeStartRegister;
ldr(code, FieldMemOperand(function, JSFunction::kCodeOffset));
add(code, code, Operand(Code::kHeaderSize - kHeapObjectTag));
if (flag == CALL_FUNCTION) {
@@ -1480,14 +1505,6 @@ void MacroAssembler::InvokeFunction(Register function,
InvokeFunctionCode(r1, no_reg, expected, actual, flag);
}
-void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
- const ParameterCount& expected,
- const ParameterCount& actual,
- InvokeFlag flag) {
- Move(r1, function);
- InvokeFunction(r1, expected, actual, flag);
-}
-
void MacroAssembler::MaybeDropFrames() {
// Check whether we need to drop frames to restart a function on the stack.
ExternalReference restart_fp =
@@ -1615,13 +1632,22 @@ void MacroAssembler::TryDoubleToInt32Exact(Register result,
void TurboAssembler::TryInlineTruncateDoubleToI(Register result,
DwVfpRegister double_input,
Label* done) {
- LowDwVfpRegister double_scratch = kScratchDoubleReg;
- vcvt_s32_f64(double_scratch.low(), double_input);
- vmov(result, double_scratch.low());
-
UseScratchRegisterScope temps(this);
- Register scratch = temps.Acquire();
+ SwVfpRegister single_scratch = SwVfpRegister::no_reg();
+ if (temps.CanAcquireVfp<SwVfpRegister>()) {
+ single_scratch = temps.AcquireS();
+ } else {
+ // Re-use the input as a scratch register. However, we can only do this if
+ // the input register is d0-d15 as there are no s32+ registers.
+ DCHECK_LT(double_input.code(), LowDwVfpRegister::kNumRegisters);
+ LowDwVfpRegister double_scratch =
+ LowDwVfpRegister::from_code(double_input.code());
+ single_scratch = double_scratch.low();
+ }
+ vcvt_s32_f64(single_scratch, double_input);
+ vmov(result, single_scratch);
+ Register scratch = temps.Acquire();
// If result is not saturated (0x7FFFFFFF or 0x80000000), we are done.
sub(scratch, result, Operand(1));
cmp(scratch, Operand(0x7FFFFFFE));
@@ -1704,6 +1730,12 @@ void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin,
Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
}
+void MacroAssembler::JumpToInstructionStream(const InstructionStream* stream) {
+ int32_t bytes_address = reinterpret_cast<int32_t>(stream->bytes());
+ mov(kOffHeapTrampolineRegister, Operand(bytes_address, RelocInfo::NONE));
+ Jump(kOffHeapTrampolineRegister);
+}
+
void MacroAssembler::IncrementCounter(StatsCounter* counter, int value,
Register scratch1, Register scratch2) {
DCHECK_GT(value, 0);
@@ -2275,6 +2307,15 @@ bool AreAliased(Register reg1,
}
#endif
+void TurboAssembler::ComputeCodeStartAddress(Register dst) {
+ // We can use the register pc - 8 for the address of the current instruction.
+ sub(dst, pc, Operand(pc_offset() + TurboAssembler::kPcLoadDelta));
+}
+
+void TurboAssembler::ResetSpeculationPoisonRegister() {
+ mov(kSpeculationPoisonRegister, Operand(-1));
+}
+
} // namespace internal
} // namespace v8