use super::sparc_register_info::*;
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u32)]
pub enum SparcOpcode {
ADD = 0,
ADDcc,
ADDC,
ADDCcc,
SUB,
SUBcc,
SUBC,
SUBCcc,
MULX,
SDIVX,
UDIVX,
SMUL,
UMUL,
SDIV,
UDIV,
TADDcc,
TSUBcc,
TADDCCTV,
TSUBCCTV,
AND = 20,
ANDcc,
ANDN,
ANDNcc,
OR,
ORcc,
ORN,
ORNcc,
XOR,
XORcc,
XNOR,
XNORcc,
SLL = 40,
SRL,
SRA,
SLLX,
SRLX,
SRAX,
LD = 50,
LDUB,
LDUH,
LDSB,
LDSH,
LDD,
LDSTUB,
LDSW,
LDX,
ST = 60,
STB,
STH,
STD,
STX,
BA = 70,
BN,
BNE,
BE,
BG,
BLE,
BGE,
BL,
BGU,
BLEU,
BCC, BCS, BPOS,
BNEG,
BVC,
BVS,
FBA = 90,
FBN,
FBU,
FBG,
FBL,
FBGE,
FBLE,
FBE,
FBNE,
FBO,
FBUE,
FBGEU,
FBLEU,
BRZ = 110,
BRNZ,
BRLEZ,
BRLZ,
BRGEZ,
BRGZ,
CALL = 120,
JMPL,
RET,
RETL,
SAVE,
RESTORE,
SETHI = 130,
NOP,
RDY,
WRY,
RDPSR,
WRPSR,
RDWIM,
WRWIM,
RDTBR,
WRTBR,
FLUSH,
STBAR,
MEMBAR,
IFLUSH,
FADDS = 150,
FADDD,
FSUBS,
FSUBD,
FMULS,
FMULD,
FDIVS,
FDIVD,
FSQRTS,
FSQRTD,
FITOS,
FITOD,
FSTOI,
FDTOI,
FMOVS,
FMOVD,
FNEGS,
FNEGD,
FABSS,
FABSD,
FCMPS = 170,
FCMPD,
FCMPES,
FCMPED,
FSTOD = 178,
FDTOS,
FSTOX,
FDTOX,
FXTOS,
FXTOD,
ADDXC,
ADDXccc,
UMULXHI,
MOVcc,
MOVr,
MOVFcc,
FMOVcc,
FAND,
FANDNOT,
FOR,
FORNOT,
FXOR,
FXNOR,
FNAND,
FNOR,
FORNOT1,
FORNOT2,
FANDNOT1,
FANDNOT2,
FZERO,
FONE,
FSRC1,
FSRC2,
FNOT1,
FNOT2,
FPADD16,
FPADD16S,
FPADD32,
FPADD32S,
FPSUB16,
FPSUB16S,
FPSUB32,
FPSUB32S,
FPMUL8X16,
FPMUL8X16AU,
FPMUL8X16AL,
FPMUL8SUX16,
FPMUL8ULX16,
FPMULD8SUX16,
FPMULD8ULX16,
FEXPAND,
FPMERGE,
FALIGNDATA,
BSHUFFLE,
PDIST,
EDGE8,
EDGE8L,
EDGE8N,
EDGE8LN,
EDGE16,
EDGE16L,
EDGE16N,
EDGE16LN,
EDGE32,
EDGE32L,
EDGE32N,
EDGE32LN,
ARRAY8,
ARRAY16,
ARRAY32,
BLKLD,
BLKST,
LDFSR,
STFSR,
LDSHORT_F,
STSHORT_F,
CASA,
CASXA,
SWAP,
LDSTUB_V9,
PREFETCH,
PREFETCHA,
FLUSHW,
IMPDEP1,
IMPDEP2,
DONE,
RETRY,
SIR,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SparcOperandType {
RegDef,
RegUse1,
RegUse2,
RegBase,
RegStore,
Simm13,
UImm13,
UImm22,
Disp30,
Disp22,
Disp19,
CondCode,
BPredict,
FpReg,
}
#[derive(Debug, Clone)]
pub struct SparcInstrDesc {
pub opcode: SparcOpcode,
pub mnemonic: String,
pub is_terminator: bool,
pub is_branch: bool,
pub is_call: bool,
pub is_return: bool,
pub may_load: bool,
pub may_store: bool,
pub has_side_effects: bool,
pub is_compare: bool,
pub is_commutative: bool,
pub is_cond_branch: bool,
pub operand_types: Vec<SparcOperandType>,
pub format_type: u8,
}
pub struct SparcInstrInfo {
pub desc_map: HashMap<SparcOpcode, SparcInstrDesc>,
}
impl SparcInstrInfo {
pub fn new() -> Self {
let mut info = SparcInstrInfo {
desc_map: HashMap::new(),
};
info.register_all();
info
}
pub fn get_desc(&self, opcode: SparcOpcode) -> Option<&SparcInstrDesc> {
self.desc_map.get(&opcode)
}
pub fn get_mnemonic(&self, opcode: SparcOpcode) -> String {
self.desc_map
.get(&opcode)
.map(|d| d.mnemonic.clone())
.unwrap_or_else(|| "INVALID".into())
}
fn add(
&mut self,
opcode: SparcOpcode,
mnemonic: &str,
is_terminator: bool,
is_branch: bool,
is_call: bool,
is_return: bool,
may_load: bool,
may_store: bool,
has_side_effects: bool,
is_compare: bool,
is_commutative: bool,
is_cond_branch: bool,
operand_types: Vec<SparcOperandType>,
format_type: u8,
) {
self.desc_map.insert(
opcode,
SparcInstrDesc {
opcode,
mnemonic: mnemonic.to_string(),
is_terminator,
is_branch,
is_call,
is_return,
may_load,
may_store,
has_side_effects,
is_compare,
is_commutative,
is_cond_branch,
operand_types,
format_type,
},
);
}
fn register_all(&mut self) {
use SparcOperandType::*;
let f3_alu = vec![RegDef, RegUse1, RegUse2];
let f3_alu_comm = vec![RegDef, RegUse1, RegUse2];
self.add(
SparcOpcode::ADD,
"add",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ADDcc,
"addcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ADDC,
"addc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ADDCcc,
"addccc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::SUB,
"sub",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::SUBcc,
"subcc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::SUBC,
"subc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::SUBCcc,
"subccc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::MULX,
"mulx",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::SDIVX,
"sdivx",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::UDIVX,
"udivx",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::SMUL,
"smul",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::UMUL,
"umul",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::SDIV,
"sdiv",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::UDIV,
"udiv",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::TADDcc,
"taddcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::TSUBcc,
"tsubcc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::TADDCCTV,
"taddcctv",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::TSUBCCTV,
"tsubcctv",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::AND,
"and",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ANDcc,
"andcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ANDN,
"andn",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::ANDNcc,
"andncc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::OR,
"or",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ORcc,
"orcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::ORN,
"orn",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::ORNcc,
"orncc",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu.clone(),
3,
);
self.add(
SparcOpcode::XOR,
"xor",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::XORcc,
"xorcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::XNOR,
"xnor",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::XNORcc,
"xnorcc",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_alu_comm.clone(),
3,
);
let f3_shift = vec![RegDef, RegUse1, RegUse2];
self.add(
SparcOpcode::SLL,
"sll",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
self.add(
SparcOpcode::SRL,
"srl",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
self.add(
SparcOpcode::SRA,
"sra",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
self.add(
SparcOpcode::SLLX,
"sllx",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
self.add(
SparcOpcode::SRLX,
"srlx",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
self.add(
SparcOpcode::SRAX,
"srax",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_shift.clone(),
3,
);
let f3_load = vec![RegDef, RegBase, RegUse2];
self.add(
SparcOpcode::LD,
"ld",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDUB,
"ldub",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDUH,
"lduh",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDSB,
"ldsb",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDSH,
"ldsh",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDD,
"ldd",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDSTUB,
"ldstub",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDSW,
"ldsw",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::LDX,
"ldx",
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
f3_load.clone(),
3,
);
let f3_store = vec![RegStore, RegBase, RegUse2];
self.add(
SparcOpcode::ST,
"st",
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
f3_store.clone(),
3,
);
self.add(
SparcOpcode::STB,
"stb",
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
f3_store.clone(),
3,
);
self.add(
SparcOpcode::STH,
"sth",
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
f3_store.clone(),
3,
);
self.add(
SparcOpcode::STD,
"std",
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
f3_store.clone(),
3,
);
self.add(
SparcOpcode::STX,
"stx",
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
f3_store.clone(),
3,
);
let f2_branch = vec![CondCode, Disp22, BPredict];
self.add(
SparcOpcode::BA,
"ba",
true,
true,
false,
false,
false,
false,
false,
false,
false,
false,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BN,
"bn",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BNE,
"bne",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BE,
"be",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BG,
"bg",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BLE,
"ble",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BGE,
"bge",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BL,
"bl",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BGU,
"bgu",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BLEU,
"bleu",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BCC,
"bcc",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BCS,
"bcs",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BPOS,
"bpos",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BNEG,
"bneg",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BVC,
"bvc",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::BVS,
"bvs",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBA,
"fba",
true,
true,
false,
false,
false,
false,
false,
false,
false,
false,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBN,
"fbn",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBU,
"fbu",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBG,
"fbg",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBL,
"fbl",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBGE,
"fbge",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBLE,
"fble",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBE,
"fbe",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
self.add(
SparcOpcode::FBNE,
"fbne",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f2_branch.clone(),
2,
);
let f3_br = vec![RegUse1, Disp22, BPredict];
self.add(
SparcOpcode::BRZ,
"brz",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::BRNZ,
"brnz",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::BRLEZ,
"brlez",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::BRLZ,
"brlz",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::BRGEZ,
"brgez",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::BRGZ,
"brgz",
true,
true,
false,
false,
false,
false,
false,
false,
false,
true,
f3_br.clone(),
3,
);
self.add(
SparcOpcode::CALL,
"call",
false,
false,
true,
false,
false,
false,
false,
false,
false,
false,
vec![Disp30],
1,
);
self.add(
SparcOpcode::JMPL,
"jmpl",
true,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, RegBase, RegUse2],
3,
);
self.add(
SparcOpcode::RET,
"ret",
true,
false,
false,
true,
false,
false,
false,
false,
false,
false,
vec![],
3,
);
self.add(
SparcOpcode::RETL,
"retl",
true,
false,
false,
true,
false,
false,
false,
false,
false,
false,
vec![],
3,
);
self.add(
SparcOpcode::SAVE,
"save",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::RESTORE,
"restore",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_alu_comm.clone(),
3,
);
self.add(
SparcOpcode::SETHI,
"sethi",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, UImm22],
2,
);
self.add(
SparcOpcode::NOP,
"nop",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![],
3,
);
self.add(
SparcOpcode::RDY,
"rd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, RegUse1],
3,
);
self.add(
SparcOpcode::WRY,
"wr",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![RegUse1, RegUse1, RegUse2],
3,
);
self.add(
SparcOpcode::FLUSH,
"flush",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
f3_load.clone(),
3,
);
self.add(
SparcOpcode::STBAR,
"stbar",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![],
3,
);
self.add(
SparcOpcode::MEMBAR,
"membar",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![UImm13],
3,
);
let f3_fpu_3r = vec![FpReg, FpReg, FpReg];
let f3_fpu_2r = vec![FpReg, FpReg];
self.add(
SparcOpcode::FADDS,
"fadds",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FADDD,
"faddd",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FSUBS,
"fsubs",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FSUBD,
"fsubd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FMULS,
"fmuls",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FMULD,
"fmuld",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FDIVS,
"fdivs",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FDIVD,
"fdivd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_3r.clone(),
3,
);
self.add(
SparcOpcode::FSQRTS,
"fsqrts",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FSQRTD,
"fsqrtd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FITOS,
"fitos",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FITOD,
"fitod",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FSTOI,
"fstoi",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FDTOI,
"fdtoi",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FMOVS,
"fmovs",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FMOVD,
"fmovd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FNEGS,
"fnegs",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FNEGD,
"fnegd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FABSS,
"fabss",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FABSD,
"fabsd",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
let f3_fcmp = vec![FpReg, FpReg];
self.add(
SparcOpcode::FCMPS,
"fcmps",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
f3_fcmp.clone(),
3,
);
self.add(
SparcOpcode::FCMPD,
"fcmpd",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
f3_fcmp.clone(),
3,
);
self.add(
SparcOpcode::FCMPES,
"fcmpes",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
f3_fcmp.clone(),
3,
);
self.add(
SparcOpcode::FCMPED,
"fcmped",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
f3_fcmp.clone(),
3,
);
self.add(
SparcOpcode::FSTOD,
"fstod",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FDTOS,
"fdtos",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FSTOX,
"fstox",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FDTOX,
"fdtox",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FXTOS,
"fxtos",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
self.add(
SparcOpcode::FXTOD,
"fxtod",
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
f3_fpu_2r.clone(),
3,
);
let vis_logical: Vec<(&str, SparcOpcode)> = vec![
("fand", SparcOpcode::FAND),
("fandnot", SparcOpcode::FANDNOT),
("for", SparcOpcode::FOR),
("fornot", SparcOpcode::FORNOT),
("fxor", SparcOpcode::FXOR),
("fxnor", SparcOpcode::FXNOR),
("fnand", SparcOpcode::FNAND),
("fnor", SparcOpcode::FNOR),
("fornot1", SparcOpcode::FORNOT1),
("fornot2", SparcOpcode::FORNOT2),
("fandnot1", SparcOpcode::FANDNOT1),
("fandnot2", SparcOpcode::FANDNOT2),
("fzero", SparcOpcode::FZERO),
("fone", SparcOpcode::FONE),
("fsrc1", SparcOpcode::FSRC1),
("fsrc2", SparcOpcode::FSRC2),
("fnot1", SparcOpcode::FNOT1),
("fnot2", SparcOpcode::FNOT2),
];
for (mn, op) in vis_logical {
self.add(
op,
mn,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, RegUse1, RegUse2],
2,
);
}
let vis_arith: Vec<(&str, SparcOpcode)> = vec![
("fpadd16", SparcOpcode::FPADD16),
("fpadd16s", SparcOpcode::FPADD16S),
("fpadd32", SparcOpcode::FPADD32),
("fpadd32s", SparcOpcode::FPADD32S),
("fpsub16", SparcOpcode::FPSUB16),
("fpsub16s", SparcOpcode::FPSUB16S),
("fpsub32", SparcOpcode::FPSUB32),
("fpsub32s", SparcOpcode::FPSUB32S),
("fpmul8x16", SparcOpcode::FPMUL8X16),
("fpmul8x16au", SparcOpcode::FPMUL8X16AU),
("fpmul8x16al", SparcOpcode::FPMUL8X16AL),
("fpmul8sux16", SparcOpcode::FPMUL8SUX16),
("fpmul8ulx16", SparcOpcode::FPMUL8ULX16),
("fpmuld8sux16", SparcOpcode::FPMULD8SUX16),
("fpmuld8ulx16", SparcOpcode::FPMULD8ULX16),
("fexpand", SparcOpcode::FEXPAND),
("fpmerge", SparcOpcode::FPMERGE),
("faligndata", SparcOpcode::FALIGNDATA),
("bshuffle", SparcOpcode::BSHUFFLE),
("pdist", SparcOpcode::PDIST),
];
for (mn, op) in vis_arith {
self.add(
op,
mn,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, RegUse1, RegUse2],
2,
);
}
let vis_edge: Vec<(&str, SparcOpcode)> = vec![
("edge8", SparcOpcode::EDGE8),
("edge8l", SparcOpcode::EDGE8L),
("edge8n", SparcOpcode::EDGE8N),
("edge8ln", SparcOpcode::EDGE8LN),
("edge16", SparcOpcode::EDGE16),
("edge16l", SparcOpcode::EDGE16L),
("edge16n", SparcOpcode::EDGE16N),
("edge16ln", SparcOpcode::EDGE16LN),
("edge32", SparcOpcode::EDGE32),
("edge32l", SparcOpcode::EDGE32L),
("edge32n", SparcOpcode::EDGE32N),
("edge32ln", SparcOpcode::EDGE32LN),
("array8", SparcOpcode::ARRAY8),
("array16", SparcOpcode::ARRAY16),
("array32", SparcOpcode::ARRAY32),
];
for (mn, op) in vis_edge {
self.add(
op,
mn,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
vec![RegDef, RegUse1, RegUse2],
2,
);
}
self.add(
SparcOpcode::BLKLD,
"ldda",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
vec![RegDef, RegBase],
3,
);
self.add(
SparcOpcode::BLKST,
"stda",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
vec![RegBase, RegStore],
3,
);
self.add(
SparcOpcode::LDFSR,
"ldfsr",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
vec![RegDef, RegBase],
3,
);
self.add(
SparcOpcode::STFSR,
"stfsr",
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
vec![RegBase, RegStore],
3,
);
self.add(
SparcOpcode::CASA,
"casa",
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
vec![RegDef, RegBase, RegStore],
3,
);
self.add(
SparcOpcode::CASXA,
"casxa",
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
vec![RegDef, RegBase, RegStore],
3,
);
self.add(
SparcOpcode::SWAP,
"swap",
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
vec![RegDef, RegBase, RegStore],
3,
);
self.add(
SparcOpcode::PREFETCH,
"prefetch",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
vec![RegBase],
3,
);
self.add(
SparcOpcode::PREFETCHA,
"prefetcha",
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
vec![RegBase],
3,
);
self.add(
SparcOpcode::FLUSHW,
"flushw",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
self.add(
SparcOpcode::IMPDEP1,
"impdep1",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
self.add(
SparcOpcode::IMPDEP2,
"impdep2",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
self.add(
SparcOpcode::DONE,
"done",
true,
false,
false,
true,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
self.add(
SparcOpcode::RETRY,
"retry",
true,
false,
false,
true,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
self.add(
SparcOpcode::SIR,
"sir",
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
vec![],
2,
);
}
}