Simplify "unimplemented" operation error message (#5429)
Now that all operations are implemented in ISLE, simplify Rust code by providing a generic error message if any operation is not implemented in ISLE. Done across all targets.
This commit is contained in:
@@ -15,7 +15,6 @@ use crate::isa::aarch64::inst::*;
|
|||||||
use crate::isa::aarch64::AArch64Backend;
|
use crate::isa::aarch64::AArch64Backend;
|
||||||
use crate::machinst::lower::*;
|
use crate::machinst::lower::*;
|
||||||
use crate::machinst::{Reg, Writable};
|
use crate::machinst::{Reg, Writable};
|
||||||
use crate::CodegenError;
|
|
||||||
use crate::CodegenResult;
|
use crate::CodegenResult;
|
||||||
use crate::{machinst::*, trace};
|
use crate::{machinst::*, trace};
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
@@ -751,224 +750,19 @@ impl LowerBackend for AArch64Backend {
|
|||||||
return Ok(temp_regs);
|
return Ok(temp_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
let op = ctx.data(ir_inst).opcode();
|
|
||||||
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
||||||
Some(ctx.output_ty(ir_inst, 0))
|
Some(ctx.output_ty(ir_inst, 0))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
match op {
|
|
||||||
Opcode::Iconst
|
|
||||||
| Opcode::Null
|
|
||||||
| Opcode::F32const
|
|
||||||
| Opcode::F64const
|
|
||||||
| Opcode::GetFramePointer
|
|
||||||
| Opcode::GetStackPointer
|
|
||||||
| Opcode::GetReturnAddress
|
|
||||||
| Opcode::Iadd
|
|
||||||
| Opcode::Isub
|
|
||||||
| Opcode::UaddSat
|
|
||||||
| Opcode::SaddSat
|
|
||||||
| Opcode::UsubSat
|
|
||||||
| Opcode::SsubSat
|
|
||||||
| Opcode::Ineg
|
|
||||||
| Opcode::Imul
|
|
||||||
| Opcode::Umulhi
|
|
||||||
| Opcode::Smulhi
|
|
||||||
| Opcode::Udiv
|
|
||||||
| Opcode::Sdiv
|
|
||||||
| Opcode::Urem
|
|
||||||
| Opcode::Srem
|
|
||||||
| Opcode::Uextend
|
|
||||||
| Opcode::Sextend
|
|
||||||
| Opcode::Bnot
|
|
||||||
| Opcode::Band
|
|
||||||
| Opcode::Bor
|
|
||||||
| Opcode::Bxor
|
|
||||||
| Opcode::BandNot
|
|
||||||
| Opcode::BorNot
|
|
||||||
| Opcode::BxorNot
|
|
||||||
| Opcode::Ishl
|
|
||||||
| Opcode::Ushr
|
|
||||||
| Opcode::Sshr
|
|
||||||
| Opcode::Rotr
|
|
||||||
| Opcode::Rotl
|
|
||||||
| Opcode::Bitrev
|
|
||||||
| Opcode::Clz
|
|
||||||
| Opcode::Cls
|
|
||||||
| Opcode::Ctz
|
|
||||||
| Opcode::Bswap
|
|
||||||
| Opcode::Popcnt
|
|
||||||
| Opcode::Load
|
|
||||||
| Opcode::Uload8
|
|
||||||
| Opcode::Sload8
|
|
||||||
| Opcode::Uload16
|
|
||||||
| Opcode::Sload16
|
|
||||||
| Opcode::Uload32
|
|
||||||
| Opcode::Sload32
|
|
||||||
| Opcode::Sload8x8
|
|
||||||
| Opcode::Uload8x8
|
|
||||||
| Opcode::Sload16x4
|
|
||||||
| Opcode::Uload16x4
|
|
||||||
| Opcode::Sload32x2
|
|
||||||
| Opcode::Uload32x2
|
|
||||||
| Opcode::Store
|
|
||||||
| Opcode::Istore8
|
|
||||||
| Opcode::Istore16
|
|
||||||
| Opcode::Istore32
|
|
||||||
| Opcode::StackAddr
|
|
||||||
| Opcode::DynamicStackAddr
|
|
||||||
| Opcode::AtomicRmw
|
|
||||||
| Opcode::AtomicCas
|
|
||||||
| Opcode::AtomicLoad
|
|
||||||
| Opcode::AtomicStore
|
|
||||||
| Opcode::Fence
|
|
||||||
| Opcode::Nop
|
|
||||||
| Opcode::Select
|
|
||||||
| Opcode::SelectSpectreGuard
|
|
||||||
| Opcode::Bitselect
|
|
||||||
| Opcode::Vselect
|
|
||||||
| Opcode::IsNull
|
|
||||||
| Opcode::IsInvalid
|
|
||||||
| Opcode::Ireduce
|
|
||||||
| Opcode::Bmask
|
|
||||||
| Opcode::Bitcast
|
|
||||||
| Opcode::Return
|
|
||||||
| Opcode::Icmp
|
|
||||||
| Opcode::Fcmp
|
|
||||||
| Opcode::Debugtrap
|
|
||||||
| Opcode::Trap
|
|
||||||
| Opcode::ResumableTrap
|
|
||||||
| Opcode::FuncAddr
|
|
||||||
| Opcode::SymbolValue
|
|
||||||
| Opcode::Call
|
|
||||||
| Opcode::CallIndirect
|
|
||||||
| Opcode::GetPinnedReg
|
|
||||||
| Opcode::SetPinnedReg
|
|
||||||
| Opcode::Vconst
|
|
||||||
| Opcode::Extractlane
|
|
||||||
| Opcode::Insertlane
|
|
||||||
| Opcode::Splat
|
|
||||||
| Opcode::ScalarToVector
|
|
||||||
| Opcode::VallTrue
|
|
||||||
| Opcode::VanyTrue
|
|
||||||
| Opcode::VhighBits
|
|
||||||
| Opcode::Shuffle
|
|
||||||
| Opcode::Swizzle
|
|
||||||
| Opcode::Isplit
|
|
||||||
| Opcode::Iconcat
|
|
||||||
| Opcode::Smax
|
|
||||||
| Opcode::Umax
|
|
||||||
| Opcode::Umin
|
|
||||||
| Opcode::Smin
|
|
||||||
| Opcode::IaddPairwise
|
|
||||||
| Opcode::WideningPairwiseDotProductS
|
|
||||||
| Opcode::Fadd
|
|
||||||
| Opcode::Fsub
|
|
||||||
| Opcode::Fmul
|
|
||||||
| Opcode::Fdiv
|
|
||||||
| Opcode::Fmin
|
|
||||||
| Opcode::Fmax
|
|
||||||
| Opcode::FminPseudo
|
|
||||||
| Opcode::FmaxPseudo
|
|
||||||
| Opcode::Sqrt
|
|
||||||
| Opcode::Fneg
|
|
||||||
| Opcode::Fabs
|
|
||||||
| Opcode::Fpromote
|
|
||||||
| Opcode::Fdemote
|
|
||||||
| Opcode::Ceil
|
|
||||||
| Opcode::Floor
|
|
||||||
| Opcode::Trunc
|
|
||||||
| Opcode::Nearest
|
|
||||||
| Opcode::Fma
|
|
||||||
| Opcode::Fcopysign
|
|
||||||
| Opcode::FcvtToUint
|
|
||||||
| Opcode::FcvtToSint
|
|
||||||
| Opcode::FcvtFromUint
|
|
||||||
| Opcode::FcvtFromSint
|
|
||||||
| Opcode::FcvtToUintSat
|
|
||||||
| Opcode::FcvtToSintSat
|
|
||||||
| Opcode::UaddOverflowTrap
|
|
||||||
| Opcode::IaddCout
|
|
||||||
| Opcode::Iabs
|
|
||||||
| Opcode::AvgRound
|
|
||||||
| Opcode::Snarrow
|
|
||||||
| Opcode::Unarrow
|
|
||||||
| Opcode::Uunarrow
|
|
||||||
| Opcode::SwidenLow
|
|
||||||
| Opcode::SwidenHigh
|
|
||||||
| Opcode::UwidenLow
|
|
||||||
| Opcode::UwidenHigh
|
|
||||||
| Opcode::TlsValue
|
|
||||||
| Opcode::SqmulRoundSat
|
|
||||||
| Opcode::FcvtLowFromSint
|
|
||||||
| Opcode::FvpromoteLow
|
|
||||||
| Opcode::Fvdemote
|
|
||||||
| Opcode::ExtractVector => {
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: inst = `{}`, type = `{:?}`",
|
"not implemented in ISLE: inst = `{}`, type = `{:?}`",
|
||||||
ctx.dfg().display_inst(ir_inst),
|
ctx.dfg().display_inst(ir_inst),
|
||||||
ty
|
ty
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Opcode::StackLoad
|
|
||||||
| Opcode::StackStore
|
|
||||||
| Opcode::DynamicStackStore
|
|
||||||
| Opcode::DynamicStackLoad => {
|
|
||||||
panic!("Direct stack memory access not supported; should not be used by Wasm");
|
|
||||||
}
|
|
||||||
Opcode::HeapLoad | Opcode::HeapStore | Opcode::HeapAddr => {
|
|
||||||
panic!("heap access instructions should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::TableAddr => {
|
|
||||||
panic!("table_addr should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::Trapz | Opcode::Trapnz | Opcode::ResumableTrapnz => {
|
|
||||||
panic!(
|
|
||||||
"trapz / trapnz / resumable_trapnz should have been removed by legalization!"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Opcode::GlobalValue => {
|
|
||||||
panic!("global_value should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::Jump | Opcode::Brz | Opcode::Brnz | Opcode::BrTable => {
|
|
||||||
panic!("Branch opcode reached non-branch lowering logic!");
|
|
||||||
}
|
|
||||||
Opcode::IaddImm
|
|
||||||
| Opcode::ImulImm
|
|
||||||
| Opcode::UdivImm
|
|
||||||
| Opcode::SdivImm
|
|
||||||
| Opcode::UremImm
|
|
||||||
| Opcode::SremImm
|
|
||||||
| Opcode::IrsubImm
|
|
||||||
| Opcode::IaddCin
|
|
||||||
| Opcode::IaddCarry
|
|
||||||
| Opcode::IsubBin
|
|
||||||
| Opcode::IsubBout
|
|
||||||
| Opcode::IsubBorrow
|
|
||||||
| Opcode::BandImm
|
|
||||||
| Opcode::BorImm
|
|
||||||
| Opcode::BxorImm
|
|
||||||
| Opcode::RotlImm
|
|
||||||
| Opcode::RotrImm
|
|
||||||
| Opcode::IshlImm
|
|
||||||
| Opcode::UshrImm
|
|
||||||
| Opcode::SshrImm
|
|
||||||
| Opcode::IcmpImm => {
|
|
||||||
panic!("ALU+imm and ALU+carry ops should not appear here!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::Vconcat | Opcode::Vsplit => {
|
|
||||||
return Err(CodegenError::Unsupported(format!(
|
|
||||||
"Unimplemented lowering: {}",
|
|
||||||
op
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lower_branch_group(
|
fn lower_branch_group(
|
||||||
&self,
|
&self,
|
||||||
ctx: &mut Lower<Inst>,
|
ctx: &mut Lower<Inst>,
|
||||||
@@ -993,7 +787,7 @@ impl LowerBackend for AArch64Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: branch = `{}`",
|
"not implemented in ISLE: branch = `{}`",
|
||||||
ctx.dfg().display_inst(branches[0]),
|
ctx.dfg().display_inst(branches[0]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,8 +55,9 @@ impl LowerBackend for Riscv64Backend {
|
|||||||
assert!(temp_regs.len() == 0);
|
assert!(temp_regs.len() == 0);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: branch = `{}`",
|
"not implemented in ISLE: branch = `{}`",
|
||||||
ctx.dfg().display_inst(branches[0]),
|
ctx.dfg().display_inst(branches[0]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,221 +20,17 @@ impl LowerBackend for S390xBackend {
|
|||||||
return Ok(temp_regs);
|
return Ok(temp_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
let op = ctx.data(ir_inst).opcode();
|
|
||||||
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
||||||
Some(ctx.output_ty(ir_inst, 0))
|
Some(ctx.output_ty(ir_inst, 0))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
match op {
|
|
||||||
Opcode::Nop
|
|
||||||
| Opcode::Iconst
|
|
||||||
| Opcode::F32const
|
|
||||||
| Opcode::F64const
|
|
||||||
| Opcode::Vconst
|
|
||||||
| Opcode::Null
|
|
||||||
| Opcode::Isplit
|
|
||||||
| Opcode::Iconcat
|
|
||||||
| Opcode::Iadd
|
|
||||||
| Opcode::Isub
|
|
||||||
| Opcode::UaddSat
|
|
||||||
| Opcode::SaddSat
|
|
||||||
| Opcode::UsubSat
|
|
||||||
| Opcode::SsubSat
|
|
||||||
| Opcode::IaddPairwise
|
|
||||||
| Opcode::Smin
|
|
||||||
| Opcode::Umin
|
|
||||||
| Opcode::Smax
|
|
||||||
| Opcode::Umax
|
|
||||||
| Opcode::AvgRound
|
|
||||||
| Opcode::Iabs
|
|
||||||
| Opcode::Ineg
|
|
||||||
| Opcode::Imul
|
|
||||||
| Opcode::Umulhi
|
|
||||||
| Opcode::Smulhi
|
|
||||||
| Opcode::WideningPairwiseDotProductS
|
|
||||||
| Opcode::SqmulRoundSat
|
|
||||||
| Opcode::Udiv
|
|
||||||
| Opcode::Urem
|
|
||||||
| Opcode::Sdiv
|
|
||||||
| Opcode::Srem
|
|
||||||
| Opcode::Ishl
|
|
||||||
| Opcode::Ushr
|
|
||||||
| Opcode::Sshr
|
|
||||||
| Opcode::Rotr
|
|
||||||
| Opcode::Rotl
|
|
||||||
| Opcode::Ireduce
|
|
||||||
| Opcode::Uextend
|
|
||||||
| Opcode::Sextend
|
|
||||||
| Opcode::Snarrow
|
|
||||||
| Opcode::Unarrow
|
|
||||||
| Opcode::Uunarrow
|
|
||||||
| Opcode::SwidenLow
|
|
||||||
| Opcode::SwidenHigh
|
|
||||||
| Opcode::UwidenLow
|
|
||||||
| Opcode::UwidenHigh
|
|
||||||
| Opcode::Bnot
|
|
||||||
| Opcode::Band
|
|
||||||
| Opcode::Bor
|
|
||||||
| Opcode::Bxor
|
|
||||||
| Opcode::BandNot
|
|
||||||
| Opcode::BorNot
|
|
||||||
| Opcode::BxorNot
|
|
||||||
| Opcode::Bitselect
|
|
||||||
| Opcode::Vselect
|
|
||||||
| Opcode::Bmask
|
|
||||||
| Opcode::Bitrev
|
|
||||||
| Opcode::Bswap
|
|
||||||
| Opcode::Clz
|
|
||||||
| Opcode::Cls
|
|
||||||
| Opcode::Ctz
|
|
||||||
| Opcode::Popcnt
|
|
||||||
| Opcode::Fadd
|
|
||||||
| Opcode::Fsub
|
|
||||||
| Opcode::Fmul
|
|
||||||
| Opcode::Fdiv
|
|
||||||
| Opcode::Fmin
|
|
||||||
| Opcode::Fmax
|
|
||||||
| Opcode::FminPseudo
|
|
||||||
| Opcode::FmaxPseudo
|
|
||||||
| Opcode::Sqrt
|
|
||||||
| Opcode::Fneg
|
|
||||||
| Opcode::Fabs
|
|
||||||
| Opcode::Fpromote
|
|
||||||
| Opcode::Fdemote
|
|
||||||
| Opcode::FvpromoteLow
|
|
||||||
| Opcode::Fvdemote
|
|
||||||
| Opcode::Ceil
|
|
||||||
| Opcode::Floor
|
|
||||||
| Opcode::Trunc
|
|
||||||
| Opcode::Nearest
|
|
||||||
| Opcode::Fma
|
|
||||||
| Opcode::Fcopysign
|
|
||||||
| Opcode::FcvtFromUint
|
|
||||||
| Opcode::FcvtFromSint
|
|
||||||
| Opcode::FcvtLowFromSint
|
|
||||||
| Opcode::FcvtToUint
|
|
||||||
| Opcode::FcvtToSint
|
|
||||||
| Opcode::FcvtToUintSat
|
|
||||||
| Opcode::FcvtToSintSat
|
|
||||||
| Opcode::Splat
|
|
||||||
| Opcode::Swizzle
|
|
||||||
| Opcode::Shuffle
|
|
||||||
| Opcode::Insertlane
|
|
||||||
| Opcode::Extractlane
|
|
||||||
| Opcode::ScalarToVector
|
|
||||||
| Opcode::VhighBits
|
|
||||||
| Opcode::Bitcast
|
|
||||||
| Opcode::Load
|
|
||||||
| Opcode::Uload8
|
|
||||||
| Opcode::Sload8
|
|
||||||
| Opcode::Uload16
|
|
||||||
| Opcode::Sload16
|
|
||||||
| Opcode::Uload32
|
|
||||||
| Opcode::Sload32
|
|
||||||
| Opcode::Uload8x8
|
|
||||||
| Opcode::Sload8x8
|
|
||||||
| Opcode::Uload16x4
|
|
||||||
| Opcode::Sload16x4
|
|
||||||
| Opcode::Uload32x2
|
|
||||||
| Opcode::Sload32x2
|
|
||||||
| Opcode::Store
|
|
||||||
| Opcode::Istore8
|
|
||||||
| Opcode::Istore16
|
|
||||||
| Opcode::Istore32
|
|
||||||
| Opcode::AtomicRmw
|
|
||||||
| Opcode::AtomicCas
|
|
||||||
| Opcode::AtomicLoad
|
|
||||||
| Opcode::AtomicStore
|
|
||||||
| Opcode::Fence
|
|
||||||
| Opcode::Icmp
|
|
||||||
| Opcode::Fcmp
|
|
||||||
| Opcode::VanyTrue
|
|
||||||
| Opcode::VallTrue
|
|
||||||
| Opcode::IsNull
|
|
||||||
| Opcode::IsInvalid
|
|
||||||
| Opcode::Select
|
|
||||||
| Opcode::SelectSpectreGuard
|
|
||||||
| Opcode::Trap
|
|
||||||
| Opcode::ResumableTrap
|
|
||||||
| Opcode::Trapz
|
|
||||||
| Opcode::Trapnz
|
|
||||||
| Opcode::ResumableTrapnz
|
|
||||||
| Opcode::Debugtrap
|
|
||||||
| Opcode::UaddOverflowTrap
|
|
||||||
| Opcode::Call
|
|
||||||
| Opcode::CallIndirect
|
|
||||||
| Opcode::Return
|
|
||||||
| Opcode::StackAddr
|
|
||||||
| Opcode::FuncAddr
|
|
||||||
| Opcode::SymbolValue
|
|
||||||
| Opcode::TlsValue
|
|
||||||
| Opcode::GetFramePointer
|
|
||||||
| Opcode::GetStackPointer
|
|
||||||
| Opcode::GetReturnAddress => {
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: inst = `{}`, type = `{:?}`",
|
"not implemented in ISLE: inst = `{}`, type = `{:?}`",
|
||||||
ctx.dfg().display_inst(ir_inst),
|
ctx.dfg().display_inst(ir_inst),
|
||||||
ty
|
ty
|
||||||
)
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::GetPinnedReg
|
|
||||||
| Opcode::SetPinnedReg
|
|
||||||
| Opcode::Vsplit
|
|
||||||
| Opcode::Vconcat
|
|
||||||
| Opcode::DynamicStackLoad
|
|
||||||
| Opcode::DynamicStackStore
|
|
||||||
| Opcode::DynamicStackAddr
|
|
||||||
| Opcode::ExtractVector => {
|
|
||||||
unreachable!(
|
|
||||||
"TODO: not yet implemented in ISLE: inst = `{}`, type = `{:?}`",
|
|
||||||
ctx.dfg().display_inst(ir_inst),
|
|
||||||
ty
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::StackLoad | Opcode::StackStore => {
|
|
||||||
panic!("Direct stack memory access not supported; should not be used by Wasm");
|
|
||||||
}
|
|
||||||
Opcode::HeapLoad | Opcode::HeapStore | Opcode::HeapAddr => {
|
|
||||||
panic!("heap access instructions should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::TableAddr => {
|
|
||||||
panic!("table_addr should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::GlobalValue => {
|
|
||||||
panic!("global_value should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
Opcode::Jump | Opcode::Brz | Opcode::Brnz | Opcode::BrTable => {
|
|
||||||
panic!("Branch opcode reached non-branch lowering logic!");
|
|
||||||
}
|
|
||||||
Opcode::IaddImm
|
|
||||||
| Opcode::ImulImm
|
|
||||||
| Opcode::UdivImm
|
|
||||||
| Opcode::SdivImm
|
|
||||||
| Opcode::UremImm
|
|
||||||
| Opcode::SremImm
|
|
||||||
| Opcode::IrsubImm
|
|
||||||
| Opcode::IaddCin
|
|
||||||
| Opcode::IaddCout
|
|
||||||
| Opcode::IaddCarry
|
|
||||||
| Opcode::IsubBin
|
|
||||||
| Opcode::IsubBout
|
|
||||||
| Opcode::IsubBorrow
|
|
||||||
| Opcode::BandImm
|
|
||||||
| Opcode::BorImm
|
|
||||||
| Opcode::BxorImm
|
|
||||||
| Opcode::RotlImm
|
|
||||||
| Opcode::RotrImm
|
|
||||||
| Opcode::IshlImm
|
|
||||||
| Opcode::UshrImm
|
|
||||||
| Opcode::SshrImm
|
|
||||||
| Opcode::IcmpImm => {
|
|
||||||
panic!("ALU+imm and ALU+carry ops should not appear here!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_branch_group(
|
fn lower_branch_group(
|
||||||
@@ -261,8 +57,9 @@ impl LowerBackend for S390xBackend {
|
|||||||
assert!(temp_regs.len() == 0);
|
assert!(temp_regs.len() == 0);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: branch = `{}`",
|
"not implemented in ISLE: branch = `{}`",
|
||||||
ctx.dfg().display_inst(branches[0]),
|
ctx.dfg().display_inst(branches[0]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,237 +304,19 @@ impl LowerBackend for X64Backend {
|
|||||||
return Ok(temp_regs);
|
return Ok(temp_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
let op = ctx.data(ir_inst).opcode();
|
|
||||||
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
let ty = if ctx.num_outputs(ir_inst) > 0 {
|
||||||
Some(ctx.output_ty(ir_inst, 0))
|
Some(ctx.output_ty(ir_inst, 0))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
match op {
|
|
||||||
Opcode::Iconst
|
|
||||||
| Opcode::F32const
|
|
||||||
| Opcode::F64const
|
|
||||||
| Opcode::Null
|
|
||||||
| Opcode::Iadd
|
|
||||||
| Opcode::IaddCout
|
|
||||||
| Opcode::SaddSat
|
|
||||||
| Opcode::UaddSat
|
|
||||||
| Opcode::Isub
|
|
||||||
| Opcode::SsubSat
|
|
||||||
| Opcode::UsubSat
|
|
||||||
| Opcode::AvgRound
|
|
||||||
| Opcode::Band
|
|
||||||
| Opcode::Bor
|
|
||||||
| Opcode::Bxor
|
|
||||||
| Opcode::Imul
|
|
||||||
| Opcode::BandNot
|
|
||||||
| Opcode::Iabs
|
|
||||||
| Opcode::Smax
|
|
||||||
| Opcode::Umax
|
|
||||||
| Opcode::Smin
|
|
||||||
| Opcode::Umin
|
|
||||||
| Opcode::Bnot
|
|
||||||
| Opcode::Bitselect
|
|
||||||
| Opcode::Vselect
|
|
||||||
| Opcode::Ushr
|
|
||||||
| Opcode::Sshr
|
|
||||||
| Opcode::Ishl
|
|
||||||
| Opcode::Rotl
|
|
||||||
| Opcode::Rotr
|
|
||||||
| Opcode::Ineg
|
|
||||||
| Opcode::Trap
|
|
||||||
| Opcode::ResumableTrap
|
|
||||||
| Opcode::UaddOverflowTrap
|
|
||||||
| Opcode::Clz
|
|
||||||
| Opcode::Ctz
|
|
||||||
| Opcode::Popcnt
|
|
||||||
| Opcode::Bitrev
|
|
||||||
| Opcode::Bswap
|
|
||||||
| Opcode::IsNull
|
|
||||||
| Opcode::IsInvalid
|
|
||||||
| Opcode::Uextend
|
|
||||||
| Opcode::Sextend
|
|
||||||
| Opcode::Ireduce
|
|
||||||
| Opcode::Debugtrap
|
|
||||||
| Opcode::WideningPairwiseDotProductS
|
|
||||||
| Opcode::Fadd
|
|
||||||
| Opcode::Fsub
|
|
||||||
| Opcode::Fmul
|
|
||||||
| Opcode::Fdiv
|
|
||||||
| Opcode::Fmin
|
|
||||||
| Opcode::Fmax
|
|
||||||
| Opcode::FminPseudo
|
|
||||||
| Opcode::FmaxPseudo
|
|
||||||
| Opcode::Sqrt
|
|
||||||
| Opcode::Fpromote
|
|
||||||
| Opcode::FvpromoteLow
|
|
||||||
| Opcode::Fdemote
|
|
||||||
| Opcode::Fvdemote
|
|
||||||
| Opcode::Fma
|
|
||||||
| Opcode::Icmp
|
|
||||||
| Opcode::Fcmp
|
|
||||||
| Opcode::Load
|
|
||||||
| Opcode::Uload8
|
|
||||||
| Opcode::Sload8
|
|
||||||
| Opcode::Uload16
|
|
||||||
| Opcode::Sload16
|
|
||||||
| Opcode::Uload32
|
|
||||||
| Opcode::Sload32
|
|
||||||
| Opcode::Sload8x8
|
|
||||||
| Opcode::Uload8x8
|
|
||||||
| Opcode::Sload16x4
|
|
||||||
| Opcode::Uload16x4
|
|
||||||
| Opcode::Sload32x2
|
|
||||||
| Opcode::Uload32x2
|
|
||||||
| Opcode::Store
|
|
||||||
| Opcode::Istore8
|
|
||||||
| Opcode::Istore16
|
|
||||||
| Opcode::Istore32
|
|
||||||
| Opcode::AtomicRmw
|
|
||||||
| Opcode::AtomicCas
|
|
||||||
| Opcode::AtomicLoad
|
|
||||||
| Opcode::AtomicStore
|
|
||||||
| Opcode::Fence
|
|
||||||
| Opcode::FuncAddr
|
|
||||||
| Opcode::SymbolValue
|
|
||||||
| Opcode::Return
|
|
||||||
| Opcode::Call
|
|
||||||
| Opcode::CallIndirect
|
|
||||||
| Opcode::GetFramePointer
|
|
||||||
| Opcode::GetStackPointer
|
|
||||||
| Opcode::GetReturnAddress
|
|
||||||
| Opcode::Select
|
|
||||||
| Opcode::SelectSpectreGuard
|
|
||||||
| Opcode::FcvtFromSint
|
|
||||||
| Opcode::FcvtLowFromSint
|
|
||||||
| Opcode::FcvtFromUint
|
|
||||||
| Opcode::FcvtToUint
|
|
||||||
| Opcode::FcvtToSint
|
|
||||||
| Opcode::FcvtToUintSat
|
|
||||||
| Opcode::FcvtToSintSat
|
|
||||||
| Opcode::IaddPairwise
|
|
||||||
| Opcode::UwidenHigh
|
|
||||||
| Opcode::UwidenLow
|
|
||||||
| Opcode::SwidenHigh
|
|
||||||
| Opcode::SwidenLow
|
|
||||||
| Opcode::Snarrow
|
|
||||||
| Opcode::Unarrow
|
|
||||||
| Opcode::Bitcast
|
|
||||||
| Opcode::Fabs
|
|
||||||
| Opcode::Fneg
|
|
||||||
| Opcode::Fcopysign
|
|
||||||
| Opcode::Ceil
|
|
||||||
| Opcode::Floor
|
|
||||||
| Opcode::Nearest
|
|
||||||
| Opcode::Trunc
|
|
||||||
| Opcode::StackAddr
|
|
||||||
| Opcode::Udiv
|
|
||||||
| Opcode::Urem
|
|
||||||
| Opcode::Sdiv
|
|
||||||
| Opcode::Srem
|
|
||||||
| Opcode::Umulhi
|
|
||||||
| Opcode::Smulhi
|
|
||||||
| Opcode::GetPinnedReg
|
|
||||||
| Opcode::SetPinnedReg
|
|
||||||
| Opcode::Vconst
|
|
||||||
| Opcode::Insertlane
|
|
||||||
| Opcode::Shuffle
|
|
||||||
| Opcode::Swizzle
|
|
||||||
| Opcode::Extractlane
|
|
||||||
| Opcode::ScalarToVector
|
|
||||||
| Opcode::Splat
|
|
||||||
| Opcode::VanyTrue
|
|
||||||
| Opcode::VallTrue
|
|
||||||
| Opcode::VhighBits
|
|
||||||
| Opcode::Iconcat
|
|
||||||
| Opcode::Isplit
|
|
||||||
| Opcode::TlsValue
|
|
||||||
| Opcode::SqmulRoundSat
|
|
||||||
| Opcode::Uunarrow
|
|
||||||
| Opcode::Nop
|
|
||||||
| Opcode::Bmask => {
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: inst = `{}`, type = `{:?}`",
|
"not implemented in ISLE: inst = `{}`, type = `{:?}`",
|
||||||
ctx.dfg().display_inst(ir_inst),
|
ctx.dfg().display_inst(ir_inst),
|
||||||
ty
|
ty
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::DynamicStackAddr => unimplemented!("DynamicStackAddr"),
|
|
||||||
|
|
||||||
// Unimplemented opcodes below. These are not currently used by Wasm
|
|
||||||
// lowering or other known embeddings, but should be either supported or
|
|
||||||
// removed eventually
|
|
||||||
Opcode::ExtractVector => {
|
|
||||||
unimplemented!("ExtractVector not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::Cls => unimplemented!("Cls not supported"),
|
|
||||||
|
|
||||||
Opcode::BorNot | Opcode::BxorNot => {
|
|
||||||
unimplemented!("or-not / xor-not opcodes not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::Vsplit | Opcode::Vconcat => {
|
|
||||||
unimplemented!("Vector split/concat ops not implemented.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::IaddImm
|
|
||||||
| Opcode::ImulImm
|
|
||||||
| Opcode::UdivImm
|
|
||||||
| Opcode::SdivImm
|
|
||||||
| Opcode::UremImm
|
|
||||||
| Opcode::SremImm
|
|
||||||
| Opcode::IrsubImm
|
|
||||||
| Opcode::IaddCin
|
|
||||||
| Opcode::IaddCarry
|
|
||||||
| Opcode::IsubBin
|
|
||||||
| Opcode::IsubBout
|
|
||||||
| Opcode::IsubBorrow
|
|
||||||
| Opcode::BandImm
|
|
||||||
| Opcode::BorImm
|
|
||||||
| Opcode::BxorImm
|
|
||||||
| Opcode::RotlImm
|
|
||||||
| Opcode::RotrImm
|
|
||||||
| Opcode::IshlImm
|
|
||||||
| Opcode::UshrImm
|
|
||||||
| Opcode::SshrImm
|
|
||||||
| Opcode::IcmpImm => {
|
|
||||||
panic!("ALU+imm and ALU+carry ops should not appear here!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::StackLoad
|
|
||||||
| Opcode::StackStore
|
|
||||||
| Opcode::DynamicStackStore
|
|
||||||
| Opcode::DynamicStackLoad => {
|
|
||||||
panic!("Direct stack memory access not supported; should have been legalized");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::GlobalValue => {
|
|
||||||
panic!("global_value should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::HeapLoad | Opcode::HeapStore | Opcode::HeapAddr => {
|
|
||||||
panic!("heap access instructions should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::TableAddr => {
|
|
||||||
panic!("table_addr should have been removed by legalization!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Opcode::Trapz | Opcode::Trapnz | Opcode::ResumableTrapnz => {
|
|
||||||
panic!(
|
|
||||||
"trapz / trapnz / resumable_trapnz should have been removed by legalization!"
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Opcode::Jump | Opcode::Brz | Opcode::Brnz | Opcode::BrTable => {
|
|
||||||
panic!("Branch opcode reached non-branch lowering logic!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lower_branch_group(
|
fn lower_branch_group(
|
||||||
&self,
|
&self,
|
||||||
ctx: &mut Lower<Inst>,
|
ctx: &mut Lower<Inst>,
|
||||||
@@ -559,7 +341,7 @@ impl LowerBackend for X64Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unreachable!(
|
unreachable!(
|
||||||
"implemented in ISLE: branch = `{}`",
|
"not implemented in ISLE: branch = `{}`",
|
||||||
ctx.dfg().display_inst(branches[0]),
|
ctx.dfg().display_inst(branches[0]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user