x64: port atomic_rmw to ISLE (#4389)
* x64: port `atomic_rmw` to ISLE This change ports `atomic_rmw` to ISLE for the x64 backend. It does not change the lowering in any way, though it seems possible that the fixed regs need not be as fixed and that there are opportunities for single instruction lowerings. It does rename `inst_common::AtomicRmwOp` to `MachAtomicRmwOp` to disambiguate with the IR enum with the same name. * x64: remove remaining hardcoded register constraints for `atomic_rmw` * x64: use `SyntheticAmode` in `AtomicRmwSeq` * review: add missing reg collector for amode * review: collect memory registers in the 'late' phase
This commit is contained in:
@@ -2,7 +2,10 @@
|
||||
|
||||
// Pull in the ISLE generated code.
|
||||
pub(crate) mod generated_code;
|
||||
use crate::machinst::{InputSourceInst, Reg, Writable};
|
||||
use crate::{
|
||||
ir::AtomicRmwOp,
|
||||
machinst::{InputSourceInst, Reg, Writable},
|
||||
};
|
||||
use generated_code::MInst;
|
||||
|
||||
// Types that the generated ISLE code uses via `use super::*`.
|
||||
@@ -23,7 +26,7 @@ use crate::{
|
||||
},
|
||||
},
|
||||
machinst::{
|
||||
isle::*, AtomicRmwOp, InsnInput, InsnOutput, LowerCtx, VCodeConstant, VCodeConstantData,
|
||||
isle::*, InsnInput, InsnOutput, LowerCtx, MachAtomicRmwOp, VCodeConstant, VCodeConstantData,
|
||||
},
|
||||
};
|
||||
use std::boxed::Box;
|
||||
@@ -565,6 +568,11 @@ where
|
||||
fn zero_offset(&mut self) -> Offset32 {
|
||||
Offset32::new(0)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn atomic_rmw_op_to_mach_atomic_rmw_op(&mut self, op: &AtomicRmwOp) -> MachAtomicRmwOp {
|
||||
MachAtomicRmwOp::from(*op)
|
||||
}
|
||||
}
|
||||
|
||||
// Since x64 doesn't have 8x16 shifts and we must use a 16x8 shift instead, we
|
||||
|
||||
Reference in New Issue
Block a user