summaryrefslogtreecommitdiff
path: root/deps/v8/src/codegen/ppc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/codegen/ppc')
-rw-r--r--deps/v8/src/codegen/ppc/assembler-ppc.cc6
-rw-r--r--deps/v8/src/codegen/ppc/constants-ppc.h4
-rw-r--r--deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc26
-rw-r--r--deps/v8/src/codegen/ppc/macro-assembler-ppc.cc67
-rw-r--r--deps/v8/src/codegen/ppc/macro-assembler-ppc.h14
5 files changed, 88 insertions, 29 deletions
diff --git a/deps/v8/src/codegen/ppc/assembler-ppc.cc b/deps/v8/src/codegen/ppc/assembler-ppc.cc
index ff1835f435..02e50e5fa3 100644
--- a/deps/v8/src/codegen/ppc/assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/assembler-ppc.cc
@@ -110,6 +110,12 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
supported_ |= (1u << FPR_GPR_MOV);
#endif
#endif
+
+ // Set a static value on whether Simd is supported.
+ // This variable is only used for certain archs to query SupportWasmSimd128()
+ // at runtime in builtins using an extern ref. Other callers should use
+ // CpuFeatures::SupportWasmSimd128().
+ CpuFeatures::supports_wasm_simd_128_ = CpuFeatures::SupportsWasmSimd128();
}
void CpuFeatures::PrintTarget() {
diff --git a/deps/v8/src/codegen/ppc/constants-ppc.h b/deps/v8/src/codegen/ppc/constants-ppc.h
index d26b686861..31bbb48044 100644
--- a/deps/v8/src/codegen/ppc/constants-ppc.h
+++ b/deps/v8/src/codegen/ppc/constants-ppc.h
@@ -2393,6 +2393,8 @@ using Instr = uint32_t;
V(vbpermq, VBPERMQ, 0x1000054C)
#define PPC_VX_OPCODE_C_FORM_LIST(V) \
+ /* Vector Unpack Low Signed Word */ \
+ V(vupklsw, VUPKLSW, 0x100006CE) \
/* Vector Unpack High Signed Word */ \
V(vupkhsw, VUPKHSW, 0x1000064E) \
/* Vector Unpack Low Signed Halfword */ \
@@ -2559,8 +2561,6 @@ using Instr = uint32_t;
V(vupkhpx, VUPKHPX, 0x1000034E) \
/* Vector Unpack Low Pixel */ \
V(vupklpx, VUPKLPX, 0x100003CE) \
- /* Vector Unpack Low Signed Word */ \
- V(vupklsw, VUPKLSW, 0x100006CE) \
/* Vector AES Cipher */ \
V(vcipher, VCIPHER, 0x10000508) \
/* Vector AES Cipher Last */ \
diff --git a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
index ba8da6e0a8..ed304e80fc 100644
--- a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
+++ b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc
@@ -86,6 +86,15 @@ const Register ApiGetterDescriptor::CallbackRegister() { return r6; }
const Register GrowArrayElementsDescriptor::ObjectRegister() { return r3; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return r6; }
+const Register BaselineLeaveFrameDescriptor::ParamsSizeRegister() {
+ // TODO(v8:11421): Implement on this platform.
+ UNREACHABLE();
+}
+const Register BaselineLeaveFrameDescriptor::WeightRegister() {
+ // TODO(v8:11421): Implement on this platform.
+ UNREACHABLE();
+}
+
// static
const Register TypeConversionDescriptor::ArgumentRegister() { return r3; }
@@ -209,21 +218,22 @@ void CompareDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers);
}
+void Compare_BaselineDescriptor::InitializePlatformSpecific(
+ CallInterfaceDescriptorData* data) {
+ // TODO(v8:11421): Implement on this platform.
+ InitializePlatformUnimplemented(data, kParameterCount);
+}
+
void BinaryOpDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {r4, r3};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
-void ArgumentsAdaptorDescriptor::InitializePlatformSpecific(
+void BinaryOp_BaselineDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
- Register registers[] = {
- r4, // JSFunction
- r6, // the new target
- r3, // actual number of arguments
- r5, // expected number of arguments
- };
- data->InitializePlatformSpecific(arraysize(registers), registers);
+ // TODO(v8:11421): Implement on this platform.
+ InitializePlatformUnimplemented(data, kParameterCount);
}
void ApiCallbackDescriptor::InitializePlatformSpecific(
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
index c5d52e0444..e78130ee42 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
@@ -429,6 +429,21 @@ void TurboAssembler::MultiPushDoubles(RegList dregs, Register location) {
}
}
+void TurboAssembler::MultiPushV128(RegList dregs, Register location) {
+ int16_t num_to_push = base::bits::CountPopulation(dregs);
+ int16_t stack_offset = num_to_push * kSimd128Size;
+
+ subi(location, location, Operand(stack_offset));
+ for (int16_t i = Simd128Register::kNumRegisters - 1; i >= 0; i--) {
+ if ((dregs & (1 << i)) != 0) {
+ Simd128Register dreg = Simd128Register::from_code(i);
+ stack_offset -= kSimd128Size;
+ li(ip, Operand(stack_offset));
+ StoreSimd128(dreg, MemOperand(location, ip), r0, kScratchSimd128Reg);
+ }
+ }
+}
+
void TurboAssembler::MultiPopDoubles(RegList dregs, Register location) {
int16_t stack_offset = 0;
@@ -442,6 +457,20 @@ void TurboAssembler::MultiPopDoubles(RegList dregs, Register location) {
addi(location, location, Operand(stack_offset));
}
+void TurboAssembler::MultiPopV128(RegList dregs, Register location) {
+ int16_t stack_offset = 0;
+
+ for (int16_t i = 0; i < Simd128Register::kNumRegisters; i++) {
+ if ((dregs & (1 << i)) != 0) {
+ Simd128Register dreg = Simd128Register::from_code(i);
+ li(ip, Operand(stack_offset));
+ LoadSimd128(dreg, MemOperand(location, ip), r0, kScratchSimd128Reg);
+ stack_offset += kSimd128Size;
+ }
+ }
+ addi(location, location, Operand(stack_offset));
+}
+
void TurboAssembler::LoadRoot(Register destination, RootIndex index,
Condition cond) {
DCHECK(cond == al);
@@ -1391,7 +1420,6 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
DCHECK_EQ(actual_parameter_count, r3);
DCHECK_EQ(expected_parameter_count, r5);
-#ifdef V8_NO_ARGUMENTS_ADAPTOR
// If the expected parameter count is equal to the adaptor sentinel, no need
// to push undefined value as arguments.
mov(r0, Operand(kDontAdaptArgumentsSentinel));
@@ -1441,24 +1469,12 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
bind(&stack_overflow);
{
- FrameScope frame(this, StackFrame::MANUAL);
+ FrameScope frame(this,
+ has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
CallRuntime(Runtime::kThrowStackOverflow);
bkpt(0);
}
-#else
- // Check whether the expected and actual arguments count match. If not,
- // setup registers according to contract with ArgumentsAdaptorTrampoline.
- cmp(expected_parameter_count, actual_parameter_count);
- beq(&regular_invoke);
- Handle<Code> adaptor = BUILTIN_CODE(isolate(), ArgumentsAdaptorTrampoline);
- if (flag == CALL_FUNCTION) {
- Call(adaptor);
- b(done);
- } else {
- Jump(adaptor, RelocInfo::CODE_TARGET);
- }
-#endif
bind(&regular_invoke);
}
@@ -1641,6 +1657,18 @@ void MacroAssembler::CompareInstanceType(Register map, Register type_reg,
cmpi(type_reg, Operand(type));
}
+void MacroAssembler::CompareInstanceTypeRange(Register map, Register type_reg,
+ InstanceType lower_limit,
+ InstanceType higher_limit) {
+ DCHECK_LT(lower_limit, higher_limit);
+ UseScratchRegisterScope temps(this);
+ Register scratch = temps.Acquire();
+ LoadHalfWord(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
+ mov(scratch, Operand(lower_limit));
+ sub(scratch, type_reg, scratch);
+ cmpli(scratch, Operand(higher_limit - lower_limit));
+}
+
void MacroAssembler::CompareRoot(Register obj, RootIndex index) {
DCHECK(obj != r0);
LoadRoot(r0, index);
@@ -1983,9 +2011,11 @@ void MacroAssembler::AssertFunction(Register object) {
TestIfSmi(object, r0);
Check(ne, AbortReason::kOperandIsASmiAndNotAFunction, cr0);
push(object);
- CompareObjectType(object, object, object, JS_FUNCTION_TYPE);
+ LoadMap(object, object);
+ CompareInstanceTypeRange(object, object, FIRST_JS_FUNCTION_TYPE,
+ LAST_JS_FUNCTION_TYPE);
pop(object);
- Check(eq, AbortReason::kOperandIsNotAFunction);
+ Check(le, AbortReason::kOperandIsNotAFunction);
}
}
@@ -3307,7 +3337,8 @@ void TurboAssembler::CallCodeObject(Register code_object) {
Call(code_object);
}
-void TurboAssembler::JumpCodeObject(Register code_object) {
+void TurboAssembler::JumpCodeObject(Register code_object, JumpMode jump_mode) {
+ DCHECK_EQ(JumpMode::kJump, jump_mode);
LoadCodeObjectEntry(code_object, code_object);
Jump(code_object);
}
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
index 1b97c23128..5da219ba84 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
@@ -298,6 +298,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void MultiPushDoubles(RegList dregs, Register location = sp);
void MultiPopDoubles(RegList dregs, Register location = sp);
+ void MultiPushV128(RegList dregs, Register location = sp);
+ void MultiPopV128(RegList dregs, Register location = sp);
+
// Calculate how much stack space (in bytes) are required to store caller
// registers excluding those specified in the arguments.
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
@@ -440,7 +443,8 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void LoadEntryFromBuiltinIndex(Register builtin_index);
void LoadCodeObjectEntry(Register destination, Register code_object) override;
void CallCodeObject(Register code_object) override;
- void JumpCodeObject(Register code_object) override;
+ void JumpCodeObject(Register code_object,
+ JumpMode jump_mode = JumpMode::kJump) override;
void CallBuiltinByIndex(Register builtin_index) override;
void CallForDeoptimization(Builtins::Name target, int deopt_id, Label* exit,
@@ -873,6 +877,14 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
// sets the flags and leaves the object type in the type_reg register.
void CompareInstanceType(Register map, Register type_reg, InstanceType type);
+ // Compare instance type ranges for a map (lower_limit and higher_limit
+ // inclusive).
+ //
+ // Always use unsigned comparisons: ls for a positive result.
+ void CompareInstanceTypeRange(Register map, Register type_reg,
+ InstanceType lower_limit,
+ InstanceType higher_limit);
+
// Compare the object in a register to a value from the root list.
// Uses the ip register as scratch.
void CompareRoot(Register obj, RootIndex index);