diff options
Diffstat (limited to 'deps/v8/src/compiler/arm/code-generator-arm.cc')
-rw-r--r-- | deps/v8/src/compiler/arm/code-generator-arm.cc | 394 |
1 files changed, 363 insertions, 31 deletions
diff --git a/deps/v8/src/compiler/arm/code-generator-arm.cc b/deps/v8/src/compiler/arm/code-generator-arm.cc index a721f6a3be..82039c8d2e 100644 --- a/deps/v8/src/compiler/arm/code-generator-arm.cc +++ b/deps/v8/src/compiler/arm/code-generator-arm.cc @@ -474,7 +474,8 @@ void CodeGenerator::AssemblePopArgumentsAdaptorFrame(Register args_reg, // Check if current frame is an arguments adaptor frame. __ ldr(scratch1, MemOperand(fp, StandardFrameConstants::kContextOffset)); - __ cmp(scratch1, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); + __ cmp(scratch1, + Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); __ b(ne, &done); // Load arguments count from current arguments adaptor frame (note, it @@ -737,10 +738,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( case kArchDeoptimize: { int deopt_state_id = BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); - Deoptimizer::BailoutType bailout_type = - Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); - CodeGenResult result = AssembleDeoptimizerCall( - deopt_state_id, bailout_type, current_source_position_); + CodeGenResult result = + AssembleDeoptimizerCall(deopt_state_id, current_source_position_); if (result != kSuccess) return result; break; } @@ -1545,12 +1544,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1)); break; } - case kArmFloat32x4Eq: { + case kArmFloat32x4Equal: { __ vceq(i.OutputSimd128Register(), i.InputSimd128Register(0), i.InputSimd128Register(1)); break; } - case kArmFloat32x4Ne: { + case kArmFloat32x4NotEqual: { Simd128Register dst = i.OutputSimd128Register(); __ vceq(dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); __ vmvn(dst, dst); @@ -1578,6 +1577,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ vcvt_u32_f32(i.OutputSimd128Register(), i.InputSimd128Register(0)); break; } + case kArmInt32x4Neg: { + __ vneg(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kArmInt32x4ShiftLeftByScalar: { + __ vshl(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt5(1)); + break; + } + case kArmInt32x4ShiftRightByScalar: { + __ vshr(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt5(1)); + break; + } case kArmInt32x4Add: { __ vadd(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), i.InputSimd128Register(1)); @@ -1588,23 +1601,337 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1)); break; } - case kArmInt32x4Eq: { + case kArmInt32x4Mul: { + __ vmul(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt32x4Min: { + __ vmin(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt32x4Max: { + __ vmax(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt32x4Equal: { __ vceq(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), i.InputSimd128Register(1)); break; } - case kArmInt32x4Ne: { + case kArmInt32x4NotEqual: { Simd128Register dst = i.OutputSimd128Register(); __ vceq(Neon32, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); __ vmvn(dst, dst); break; } - case kArmSimd32x4Select: { - // Select is a ternary op, so we need to move one input into the - // destination. Use vtst to canonicalize the 'boolean' input #0. - __ vtst(Neon32, i.OutputSimd128Register(), i.InputSimd128Register(0), - i.InputSimd128Register(0)); + case kArmInt32x4GreaterThan: { + __ vcgt(NeonS32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt32x4GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonS32, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint32x4ShiftRightByScalar: { + __ vshr(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt5(1)); + break; + } + case kArmUint32x4Min: { + __ vmin(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint32x4Max: { + __ vmax(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint32x4GreaterThan: { + __ vcgt(NeonU32, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint32x4GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonU32, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Splat: { + __ vdup(Neon16, i.OutputSimd128Register(), i.InputRegister(0)); + break; + } + case kArmInt16x8ExtractLane: { + __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS16, + i.InputInt8(1)); + break; + } + case kArmInt16x8ReplaceLane: { + __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputRegister(2), NeonS16, i.InputInt8(1)); + break; + } + case kArmInt16x8Neg: { + __ vneg(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kArmInt16x8ShiftLeftByScalar: { + __ vshl(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt4(1)); + break; + } + case kArmInt16x8ShiftRightByScalar: { + __ vshr(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt4(1)); + break; + } + case kArmInt16x8Add: { + __ vadd(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8AddSaturate: { + __ vqadd(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Sub: { + __ vsub(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8SubSaturate: { + __ vqsub(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Mul: { + __ vmul(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Min: { + __ vmin(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Max: { + __ vmax(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8Equal: { + __ vceq(Neon16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8NotEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vceq(Neon16, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + __ vmvn(dst, dst); + break; + } + case kArmInt16x8GreaterThan: { + __ vcgt(NeonS16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt16x8GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonS16, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8ShiftRightByScalar: { + __ vshr(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt4(1)); + break; + } + case kArmUint16x8AddSaturate: { + __ vqadd(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8SubSaturate: { + __ vqsub(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8Min: { + __ vmin(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8Max: { + __ vmax(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8GreaterThan: { + __ vcgt(NeonU16, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint16x8GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonU16, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Splat: { + __ vdup(Neon8, i.OutputSimd128Register(), i.InputRegister(0)); + break; + } + case kArmInt8x16ExtractLane: { + __ ExtractLane(i.OutputRegister(), i.InputSimd128Register(0), NeonS8, + i.InputInt8(1)); + break; + } + case kArmInt8x16ReplaceLane: { + __ ReplaceLane(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputRegister(2), NeonS8, i.InputInt8(1)); + break; + } + case kArmInt8x16Neg: { + __ vneg(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kArmInt8x16ShiftLeftByScalar: { + __ vshl(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt3(1)); + break; + } + case kArmInt8x16ShiftRightByScalar: { + __ vshr(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt3(1)); + break; + } + case kArmInt8x16Add: { + __ vadd(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16AddSaturate: { + __ vqadd(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Sub: { + __ vsub(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16SubSaturate: { + __ vqsub(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Mul: { + __ vmul(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Min: { + __ vmin(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Max: { + __ vmax(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16Equal: { + __ vceq(Neon8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16NotEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vceq(Neon8, dst, i.InputSimd128Register(0), i.InputSimd128Register(1)); + __ vmvn(dst, dst); + break; + } + case kArmInt8x16GreaterThan: { + __ vcgt(NeonS8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmInt8x16GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonS8, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16ShiftRightByScalar: { + __ vshr(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputInt3(1)); + break; + } + case kArmUint8x16AddSaturate: { + __ vqadd(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16SubSaturate: { + __ vqsub(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16Min: { + __ vmin(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16Max: { + __ vmax(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16GreaterThan: { + __ vcgt(NeonU8, i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmUint8x16GreaterThanOrEqual: { + Simd128Register dst = i.OutputSimd128Register(); + __ vcge(NeonU8, dst, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmSimd128And: { + __ vand(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmSimd128Or: { + __ vorr(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmSimd128Xor: { + __ veor(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kArmSimd128Not: { + __ vmvn(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kArmSimd32x4Select: + case kArmSimd16x8Select: + case kArmSimd8x16Select: { + // vbsl clobbers the mask input so make sure it was DefineSameAsFirst. + DCHECK(i.OutputSimd128Register().is(i.InputSimd128Register(0))); __ vbsl(i.OutputSimd128Register(), i.InputSimd128Register(1), i.InputSimd128Register(2)); break; @@ -1708,8 +2035,8 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr, void Generate() final { ArmOperandConverter i(gen_, instr_); - Runtime::FunctionId trap_id = static_cast<Runtime::FunctionId>( - i.InputInt32(instr_->InputCount() - 1)); + Builtins::Name trap_id = + static_cast<Builtins::Name>(i.InputInt32(instr_->InputCount() - 1)); bool old_has_frame = __ has_frame(); if (frame_elided_) { __ set_has_frame(true); @@ -1719,14 +2046,11 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr, if (frame_elided_) { __ set_has_frame(old_has_frame); } - if (FLAG_debug_code) { - __ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap)); - } } private: - void GenerateCallToTrap(Runtime::FunctionId trap_id) { - if (trap_id == Runtime::kNumFunctions) { + void GenerateCallToTrap(Builtins::Name trap_id) { + if (trap_id == Builtins::builtin_count) { // We cannot test calls to the runtime in cctest/test-run-wasm. // Therefore we emit a call to C here instead of a call to the runtime. // We use the context register as the scratch register, because we do @@ -1735,15 +2059,20 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr, __ CallCFunction( ExternalReference::wasm_call_trap_callback_for_testing(isolate()), 0); + __ LeaveFrame(StackFrame::WASM_COMPILED); + __ Ret(); } else { - __ Move(cp, isolate()->native_context()); gen_->AssembleSourcePosition(instr_); - __ CallRuntime(trap_id); + __ Call(handle(isolate()->builtins()->builtin(trap_id), isolate()), + RelocInfo::CODE_TARGET); + ReferenceMap* reference_map = + new (gen_->zone()) ReferenceMap(gen_->zone()); + gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0, + Safepoint::kNoLazyDeopt); + if (FLAG_debug_code) { + __ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap)); + } } - ReferenceMap* reference_map = - new (gen_->zone()) ReferenceMap(gen_->zone()); - gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0, - Safepoint::kNoLazyDeopt); } bool frame_elided_; @@ -1799,16 +2128,19 @@ void CodeGenerator::AssembleArchTableSwitch(Instruction* instr) { } CodeGenerator::CodeGenResult CodeGenerator::AssembleDeoptimizerCall( - int deoptimization_id, Deoptimizer::BailoutType bailout_type, - SourcePosition pos) { + int deoptimization_id, SourcePosition pos) { + DeoptimizeKind deoptimization_kind = GetDeoptimizationKind(deoptimization_id); + DeoptimizeReason deoptimization_reason = + GetDeoptimizationReason(deoptimization_id); + Deoptimizer::BailoutType bailout_type = + deoptimization_kind == DeoptimizeKind::kSoft ? Deoptimizer::SOFT + : Deoptimizer::EAGER; Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( isolate(), deoptimization_id, bailout_type); // TODO(turbofan): We should be able to generate better code by sharing the // actual final call site and just bl'ing to it here, similar to what we do // in the lithium backend. if (deopt_entry == nullptr) return kTooManyDeoptimizationBailouts; - DeoptimizeReason deoptimization_reason = - GetDeoptimizationReason(deoptimization_id); __ RecordDeoptReason(deoptimization_reason, pos, deoptimization_id); __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); __ CheckConstPool(false, false); |