riscv64: Delete CSR Instructions (#6267)
This commit is contained in:
@@ -227,13 +227,6 @@
|
|||||||
(x ValueRegs)
|
(x ValueRegs)
|
||||||
(y ValueRegs)
|
(y ValueRegs)
|
||||||
(ty Type))
|
(ty Type))
|
||||||
;; risc-v csr operations.
|
|
||||||
(Csr
|
|
||||||
(csr_op CsrOP)
|
|
||||||
(rd WritableReg)
|
|
||||||
(rs OptionReg)
|
|
||||||
(imm OptionUimm5)
|
|
||||||
(csr CsrAddress))
|
|
||||||
;; an integer compare.
|
;; an integer compare.
|
||||||
(Icmp
|
(Icmp
|
||||||
(cc IntCC)
|
(cc IntCC)
|
||||||
@@ -369,15 +362,6 @@
|
|||||||
(Trunc)
|
(Trunc)
|
||||||
))
|
))
|
||||||
|
|
||||||
(type CsrOP (enum
|
|
||||||
(Csrrw)
|
|
||||||
(Csrrs)
|
|
||||||
(Csrrc)
|
|
||||||
(Csrrwi)
|
|
||||||
(Csrrsi)
|
|
||||||
(Csrrci)
|
|
||||||
))
|
|
||||||
|
|
||||||
(type IntSelectOP (enum
|
(type IntSelectOP (enum
|
||||||
(Smax)
|
(Smax)
|
||||||
(Umax)
|
(Umax)
|
||||||
@@ -716,7 +700,6 @@
|
|||||||
(type Imm20 (primitive Imm20))
|
(type Imm20 (primitive Imm20))
|
||||||
(type Imm3 (primitive Imm3))
|
(type Imm3 (primitive Imm3))
|
||||||
(type BranchTarget (primitive BranchTarget))
|
(type BranchTarget (primitive BranchTarget))
|
||||||
(type CsrAddress (primitive CsrAddress))
|
|
||||||
(type OptionFloatRoundingMode (primitive OptionFloatRoundingMode))
|
(type OptionFloatRoundingMode (primitive OptionFloatRoundingMode))
|
||||||
(type VecU8 (primitive VecU8))
|
(type VecU8 (primitive VecU8))
|
||||||
(type AMO (primitive AMO))
|
(type AMO (primitive AMO))
|
||||||
|
|||||||
@@ -1639,77 +1639,6 @@ impl IntSelectOP {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
pub enum CsrAddress {
|
|
||||||
Fcsr = 0x3,
|
|
||||||
Vstart = 0x8,
|
|
||||||
Vxsat = 0x9,
|
|
||||||
Vxrm = 0xa,
|
|
||||||
Vcsr = 0xf,
|
|
||||||
Vl = 0xc20,
|
|
||||||
Vtype = 0xc21,
|
|
||||||
Vlenb = 0xc22,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl std::fmt::Debug for CsrAddress {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
||||||
write!(f, "0x{:x}", self.as_u32())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for CsrAddress {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
||||||
write!(f, "0x{:x}", self.as_u32())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl CsrAddress {
|
|
||||||
pub(crate) fn as_u32(self) -> u32 {
|
|
||||||
self as u32
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CsrOP {
|
|
||||||
pub(crate) fn op_name(self) -> &'static str {
|
|
||||||
match self {
|
|
||||||
CsrOP::Csrrw => "csrrw",
|
|
||||||
CsrOP::Csrrs => "csrrs",
|
|
||||||
CsrOP::Csrrc => "csrrc",
|
|
||||||
CsrOP::Csrrwi => "csrrwi",
|
|
||||||
CsrOP::Csrrsi => "csrrsi",
|
|
||||||
CsrOP::Csrrci => "csrrci",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) const fn need_rs(self) -> bool {
|
|
||||||
match self {
|
|
||||||
CsrOP::Csrrw | CsrOP::Csrrs | CsrOP::Csrrc => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub(crate) const fn op_code(self) -> u32 {
|
|
||||||
0b1110011
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn funct3(self) -> u32 {
|
|
||||||
match self {
|
|
||||||
CsrOP::Csrrw => 0b001,
|
|
||||||
CsrOP::Csrrs => 0b010,
|
|
||||||
CsrOP::Csrrc => 0b011,
|
|
||||||
CsrOP::Csrrwi => 0b101,
|
|
||||||
CsrOP::Csrrsi => 0b110,
|
|
||||||
CsrOP::Csrrci => 0b110,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn rs1(self, rs: Option<Reg>, zimm: OptionUimm5) -> u32 {
|
|
||||||
if self.need_rs() {
|
|
||||||
reg_to_gpr_num(rs.unwrap())
|
|
||||||
} else {
|
|
||||||
zimm.unwrap().bits()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///Atomic Memory ordering.
|
///Atomic Memory ordering.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub enum AMO {
|
pub enum AMO {
|
||||||
|
|||||||
@@ -445,7 +445,6 @@ impl Inst {
|
|||||||
| Inst::Select { .. }
|
| Inst::Select { .. }
|
||||||
| Inst::AtomicCas { .. }
|
| Inst::AtomicCas { .. }
|
||||||
| Inst::IntSelect { .. }
|
| Inst::IntSelect { .. }
|
||||||
| Inst::Csr { .. }
|
|
||||||
| Inst::Icmp { .. }
|
| Inst::Icmp { .. }
|
||||||
| Inst::SelectReg { .. }
|
| Inst::SelectReg { .. }
|
||||||
| Inst::FcvtToInt { .. }
|
| Inst::FcvtToInt { .. }
|
||||||
@@ -1662,23 +1661,6 @@ impl MachInstEmit for Inst {
|
|||||||
gen_move(&dst, &y, sink, state);
|
gen_move(&dst, &y, sink, state);
|
||||||
sink.bind_label(label_done, &mut state.ctrl_plane);
|
sink.bind_label(label_done, &mut state.ctrl_plane);
|
||||||
}
|
}
|
||||||
&Inst::Csr {
|
|
||||||
csr_op,
|
|
||||||
rd,
|
|
||||||
rs,
|
|
||||||
imm,
|
|
||||||
csr,
|
|
||||||
} => {
|
|
||||||
let rs = rs.map(|r| allocs.next(r));
|
|
||||||
let rd = allocs.next_writable(rd);
|
|
||||||
let x = csr_op.op_code()
|
|
||||||
| reg_to_gpr_num(rd.to_reg()) << 7
|
|
||||||
| csr_op.funct3() << 12
|
|
||||||
| csr_op.rs1(rs, imm) << 15
|
|
||||||
| csr.as_u32() << 20;
|
|
||||||
|
|
||||||
sink.put4(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
&Inst::SelectReg {
|
&Inst::SelectReg {
|
||||||
condition,
|
condition,
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ pub(crate) type VecWritableReg = Vec<Writable<Reg>>;
|
|||||||
|
|
||||||
use crate::isa::riscv64::lower::isle::generated_code::MInst;
|
use crate::isa::riscv64::lower::isle::generated_code::MInst;
|
||||||
pub use crate::isa::riscv64::lower::isle::generated_code::{
|
pub use crate::isa::riscv64::lower::isle::generated_code::{
|
||||||
AluOPRRI, AluOPRRR, AtomicOP, CsrOP, FClassResult, FFlagsException, FenceFm, FloatRoundOP,
|
AluOPRRI, AluOPRRR, AtomicOP, FClassResult, FFlagsException, FenceFm, FloatRoundOP,
|
||||||
FloatSelectOP, FpuOPRR, FpuOPRRR, FpuOPRRRR, IntSelectOP, LoadOP, MInst as Inst, StoreOP, FRM,
|
FloatSelectOP, FpuOPRR, FpuOPRRR, FpuOPRRRR, IntSelectOP, LoadOP, MInst as Inst, StoreOP, FRM,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -521,13 +521,6 @@ fn riscv64_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut Operan
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&Inst::Csr { rd, rs, .. } => {
|
|
||||||
if let Some(rs) = rs {
|
|
||||||
collector.reg_use(rs);
|
|
||||||
}
|
|
||||||
collector.reg_def(rd);
|
|
||||||
}
|
|
||||||
|
|
||||||
&Inst::Icmp { rd, a, b, .. } => {
|
&Inst::Icmp { rd, a, b, .. } => {
|
||||||
collector.reg_uses(a.regs());
|
collector.reg_uses(a.regs());
|
||||||
collector.reg_uses(b.regs());
|
collector.reg_uses(b.regs());
|
||||||
@@ -1313,21 +1306,6 @@ impl Inst {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&Inst::Csr {
|
|
||||||
csr_op,
|
|
||||||
rd,
|
|
||||||
rs,
|
|
||||||
imm,
|
|
||||||
csr,
|
|
||||||
} => {
|
|
||||||
let rs = rs.map_or("".into(), |r| format_reg(r, allocs));
|
|
||||||
let rd = format_reg(rd.to_reg(), allocs);
|
|
||||||
if csr_op.need_rs() {
|
|
||||||
format!("{} {},{},{}", csr_op.op_name(), rd, csr, rs)
|
|
||||||
} else {
|
|
||||||
format!("{} {},{},{}", csr_op.op_name(), rd, csr, imm.unwrap())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&Inst::FpuRRRR {
|
&Inst::FpuRRRR {
|
||||||
alu_op,
|
alu_op,
|
||||||
rd,
|
rd,
|
||||||
|
|||||||
Reference in New Issue
Block a user