diff options
Diffstat (limited to 'deps/v8/src/codegen/ppc')
-rw-r--r-- | deps/v8/src/codegen/ppc/assembler-ppc.cc | 6 | ||||
-rw-r--r-- | deps/v8/src/codegen/ppc/constants-ppc.h | 4 | ||||
-rw-r--r-- | deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc | 26 | ||||
-rw-r--r-- | deps/v8/src/codegen/ppc/macro-assembler-ppc.cc | 67 | ||||
-rw-r--r-- | deps/v8/src/codegen/ppc/macro-assembler-ppc.h | 14 |
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(®ular_invoke); - Handle<Code> adaptor = BUILTIN_CODE(isolate(), ArgumentsAdaptorTrampoline); - if (flag == CALL_FUNCTION) { - Call(adaptor); - b(done); - } else { - Jump(adaptor, RelocInfo::CODE_TARGET); - } -#endif bind(®ular_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); |