Path: blob/main/cranelift/codegen/src/isa/riscv64/inst/emit_tests.rs
1693 views
use crate::isa::riscv64::inst::*;1use crate::isa::riscv64::lower::isle::generated_code::FpuOPWidth;2use std::borrow::Cow;34fn fa7() -> Reg {5f_reg(17)6}78#[test]9fn test_riscv64_binemit() {10struct TestUnit {11inst: Inst,12assembly: &'static str,13code: TestEncoding,14}1516struct TestEncoding(Cow<'static, str>);1718impl From<&'static str> for TestEncoding {19fn from(value: &'static str) -> Self {20Self(value.into())21}22}2324impl From<u32> for TestEncoding {25fn from(value: u32) -> Self {26let value = value.swap_bytes();27let value = format!("{value:08X}");28Self(value.into())29}30}3132impl TestUnit {33fn new(inst: Inst, assembly: &'static str, code: impl Into<TestEncoding>) -> Self {34let code = code.into();35Self {36inst,37assembly,38code,39}40}41}4243let mut insns = Vec::<TestUnit>::with_capacity(500);4445insns.push(TestUnit::new(Inst::Ret {}, "ret", 0x00008067));4647insns.push(TestUnit::new(48Inst::Mov {49rd: writable_fa0(),50rm: fa1(),51ty: F32,52},53"fmv.s fa0,fa1",540x20b58553,55));5657insns.push(TestUnit::new(58Inst::Mov {59rd: writable_fa0(),60rm: fa1(),61ty: F64,62},63"fmv.d fa0,fa1",640x22b58553,65));6667insns.push(TestUnit::new(68Inst::AluRRImm12 {69alu_op: AluOPRRI::Brev8,70rd: writable_a1(),71rs: a0(),72imm12: Imm12::ZERO,73},74"brev8 a1,a0",750x68755593,76));77insns.push(TestUnit::new(78Inst::AluRRImm12 {79alu_op: AluOPRRI::Rev8,80rd: writable_a1(),81rs: a0(),82imm12: Imm12::ZERO,83},84"rev8 a1,a0",850x6b855593,86));8788//89insns.push(TestUnit::new(90Inst::AluRRImm12 {91alu_op: AluOPRRI::Bclri,92rd: writable_a1(),93rs: a0(),94imm12: Imm12::from_i16(5),95},96"bclri a1,a0,5",970x48551593,98));99insns.push(TestUnit::new(100Inst::AluRRImm12 {101alu_op: AluOPRRI::Bexti,102rd: writable_a1(),103rs: a0(),104imm12: Imm12::from_i16(5),105},106"bexti a1,a0,5",1070x48555593,108));109110insns.push(TestUnit::new(111Inst::AluRRImm12 {112alu_op: AluOPRRI::Binvi,113rd: writable_a1(),114rs: a0(),115imm12: Imm12::from_i16(5),116},117"binvi a1,a0,5",1180x68551593,119));120121insns.push(TestUnit::new(122Inst::AluRRImm12 {123alu_op: AluOPRRI::Bseti,124rd: writable_a1(),125rs: a0(),126imm12: Imm12::from_i16(5),127},128"bseti a1,a0,5",1290x28551593,130));131132insns.push(TestUnit::new(133Inst::AluRRImm12 {134alu_op: AluOPRRI::Rori,135rd: writable_a1(),136rs: a0(),137imm12: Imm12::from_i16(5),138},139"rori a1,a0,5",1400x60555593,141));142insns.push(TestUnit::new(143Inst::AluRRImm12 {144alu_op: AluOPRRI::Roriw,145rd: writable_a1(),146rs: a0(),147imm12: Imm12::from_i16(5),148},149"roriw a1,a0,5",1500x6055559b,151));152153insns.push(TestUnit::new(154Inst::AluRRImm12 {155alu_op: AluOPRRI::SlliUw,156rd: writable_a1(),157rs: a0(),158imm12: Imm12::from_i16(5),159},160"slli.uw a1,a0,5",1610x855159b,162));163164insns.push(TestUnit::new(165Inst::AluRRImm12 {166alu_op: AluOPRRI::Clz,167rd: writable_a1(),168rs: a0(),169imm12: Imm12::ZERO,170},171"clz a1,a0",1720x60051593,173));174175insns.push(TestUnit::new(176Inst::AluRRImm12 {177alu_op: AluOPRRI::Clzw,178rd: writable_a1(),179rs: a0(),180imm12: Imm12::ZERO,181},182"clzw a1,a0",1830x6005159b,184));185186insns.push(TestUnit::new(187Inst::AluRRImm12 {188alu_op: AluOPRRI::Cpop,189rd: writable_a1(),190rs: a0(),191imm12: Imm12::ZERO,192},193"cpop a1,a0",1940x60251593,195));196197insns.push(TestUnit::new(198Inst::AluRRImm12 {199alu_op: AluOPRRI::Cpopw,200rd: writable_a1(),201rs: a0(),202imm12: Imm12::ZERO,203},204"cpopw a1,a0",2050x6025159b,206));207208insns.push(TestUnit::new(209Inst::AluRRImm12 {210alu_op: AluOPRRI::Ctz,211rd: writable_a1(),212rs: a0(),213imm12: Imm12::ZERO,214},215"ctz a1,a0",2160x60151593,217));218219insns.push(TestUnit::new(220Inst::AluRRImm12 {221alu_op: AluOPRRI::Ctzw,222rd: writable_a1(),223rs: a0(),224imm12: Imm12::ZERO,225},226"ctzw a1,a0",2270x6015159b,228));229230insns.push(TestUnit::new(231Inst::AluRRImm12 {232alu_op: AluOPRRI::Sextb,233rd: writable_a1(),234rs: a0(),235imm12: Imm12::ZERO,236},237"sext.b a1,a0",2380x60451593,239));240insns.push(TestUnit::new(241Inst::AluRRImm12 {242alu_op: AluOPRRI::Sexth,243rd: writable_a1(),244rs: a0(),245imm12: Imm12::ZERO,246},247"sext.h a1,a0",2480x60551593,249));250insns.push(TestUnit::new(251Inst::AluRRImm12 {252alu_op: AluOPRRI::Zexth,253rd: writable_a1(),254rs: a0(),255imm12: Imm12::ZERO,256},257"zext.h a1,a0",2580x80545bb,259));260insns.push(TestUnit::new(261Inst::AluRRImm12 {262alu_op: AluOPRRI::Orcb,263rd: writable_a1(),264rs: a0(),265imm12: Imm12::ZERO,266},267"orc.b a1,a0",2680x28755593,269));270271insns.push(TestUnit::new(272Inst::AluRRR {273alu_op: AluOPRRR::Adduw,274rd: writable_a1(),275rs1: a0(),276rs2: zero_reg(),277},278"zext.w a1,a0",2790x80505bb,280));281282insns.push(TestUnit::new(283Inst::AluRRR {284alu_op: AluOPRRR::Adduw,285rd: writable_a1(),286rs1: a0(),287rs2: a1(),288},289"add.uw a1,a0,a1",2900x08b505bb,291));292293insns.push(TestUnit::new(294Inst::AluRRR {295alu_op: AluOPRRR::Andn,296rd: writable_a1(),297rs1: a0(),298rs2: zero_reg(),299},300"andn a1,a0,zero",3010x400575b3,302));303insns.push(TestUnit::new(304Inst::AluRRR {305alu_op: AluOPRRR::Bclr,306rd: writable_a1(),307rs1: a0(),308rs2: zero_reg(),309},310"bclr a1,a0,zero",3110x480515b3,312));313314insns.push(TestUnit::new(315Inst::AluRRR {316alu_op: AluOPRRR::Bext,317rd: writable_a1(),318rs1: a0(),319rs2: zero_reg(),320},321"bext a1,a0,zero",3220x480555b3,323));324325insns.push(TestUnit::new(326Inst::AluRRR {327alu_op: AluOPRRR::Binv,328rd: writable_a1(),329rs1: a0(),330rs2: zero_reg(),331},332"binv a1,a0,zero",3330x680515b3,334));335insns.push(TestUnit::new(336Inst::AluRRR {337alu_op: AluOPRRR::Bset,338rd: writable_a1(),339rs1: a0(),340rs2: zero_reg(),341},342"bset a1,a0,zero",3430x280515b3,344));345346insns.push(TestUnit::new(347Inst::AluRRR {348alu_op: AluOPRRR::Clmul,349rd: writable_a1(),350rs1: a0(),351rs2: zero_reg(),352},353"clmul a1,a0,zero",3540xa0515b3,355));356357insns.push(TestUnit::new(358Inst::AluRRR {359alu_op: AluOPRRR::Clmulh,360rd: writable_a1(),361rs1: a0(),362rs2: zero_reg(),363},364"clmulh a1,a0,zero",3650xa0535b3,366));367368insns.push(TestUnit::new(369Inst::AluRRR {370alu_op: AluOPRRR::Clmulr,371rd: writable_a1(),372rs1: a0(),373rs2: zero_reg(),374},375"clmulr a1,a0,zero",3760xa0525b3,377));378379insns.push(TestUnit::new(380Inst::AluRRR {381alu_op: AluOPRRR::Max,382rd: writable_a1(),383rs1: a0(),384rs2: zero_reg(),385},386"max a1,a0,zero",3870xa0565b3,388));389390insns.push(TestUnit::new(391Inst::AluRRR {392alu_op: AluOPRRR::Maxu,393rd: writable_a1(),394rs1: a0(),395rs2: zero_reg(),396},397"maxu a1,a0,zero",3980xa0575b3,399));400401insns.push(TestUnit::new(402Inst::AluRRR {403alu_op: AluOPRRR::Min,404rd: writable_a1(),405rs1: a0(),406rs2: zero_reg(),407},408"min a1,a0,zero",4090xa0545b3,410));411412insns.push(TestUnit::new(413Inst::AluRRR {414alu_op: AluOPRRR::Minu,415rd: writable_a1(),416rs1: a0(),417rs2: zero_reg(),418},419"minu a1,a0,zero",4200xa0555b3,421));422423insns.push(TestUnit::new(424Inst::AluRRR {425alu_op: AluOPRRR::Orn,426rd: writable_a1(),427rs1: a0(),428rs2: zero_reg(),429},430"orn a1,a0,zero",4310x400565b3,432));433434insns.push(TestUnit::new(435Inst::AluRRR {436alu_op: AluOPRRR::Rol,437rd: writable_a1(),438rs1: a0(),439rs2: zero_reg(),440},441"rol a1,a0,zero",4420x600515b3,443));444445insns.push(TestUnit::new(446Inst::AluRRR {447alu_op: AluOPRRR::Rolw,448rd: writable_a1(),449rs1: a0(),450rs2: zero_reg(),451},452"rolw a1,a0,zero",4530x600515bb,454));455insns.push(TestUnit::new(456Inst::AluRRR {457alu_op: AluOPRRR::Ror,458rd: writable_a1(),459rs1: a0(),460rs2: zero_reg(),461},462"ror a1,a0,zero",4630x600555b3,464));465insns.push(TestUnit::new(466Inst::AluRRR {467alu_op: AluOPRRR::Rorw,468rd: writable_a1(),469rs1: a0(),470rs2: zero_reg(),471},472"rorw a1,a0,zero",4730x600555bb,474));475insns.push(TestUnit::new(476Inst::AluRRR {477alu_op: AluOPRRR::Sh1add,478rd: writable_a1(),479rs1: a0(),480rs2: zero_reg(),481},482"sh1add a1,a0,zero",4830x200525b3,484));485486insns.push(TestUnit::new(487Inst::AluRRR {488alu_op: AluOPRRR::Sh1adduw,489rd: writable_a1(),490rs1: a0(),491rs2: zero_reg(),492},493"sh1add.uw a1,a0,zero",4940x200525bb,495));496insns.push(TestUnit::new(497Inst::AluRRR {498alu_op: AluOPRRR::Sh2add,499rd: writable_a1(),500rs1: a0(),501rs2: zero_reg(),502},503"sh2add a1,a0,zero",5040x200545b3,505));506insns.push(TestUnit::new(507Inst::AluRRR {508alu_op: AluOPRRR::Sh2adduw,509rd: writable_a1(),510rs1: a0(),511rs2: zero_reg(),512},513"sh2add.uw a1,a0,zero",5140x200545bb,515));516insns.push(TestUnit::new(517Inst::AluRRR {518alu_op: AluOPRRR::Sh3add,519rd: writable_a1(),520rs1: a0(),521rs2: zero_reg(),522},523"sh3add a1,a0,zero",5240x200565b3,525));526insns.push(TestUnit::new(527Inst::AluRRR {528alu_op: AluOPRRR::Sh3adduw,529rd: writable_a1(),530rs1: a0(),531rs2: zero_reg(),532},533"sh3add.uw a1,a0,zero",5340x200565bb,535));536insns.push(TestUnit::new(537Inst::AluRRR {538alu_op: AluOPRRR::Xnor,539rd: writable_a1(),540rs1: a0(),541rs2: zero_reg(),542},543"xnor a1,a0,zero",5440x400545b3,545));546547// Zbkb548insns.push(TestUnit::new(549Inst::AluRRR {550alu_op: AluOPRRR::Pack,551rd: writable_a1(),552rs1: a0(),553rs2: zero_reg(),554},555"pack a1,a0,zero",5560x080545b3,557));558insns.push(TestUnit::new(559Inst::AluRRR {560alu_op: AluOPRRR::Packw,561rd: writable_a1(),562rs1: a0(),563rs2: zero_reg(),564},565"packw a1,a0,zero",5660x080545bb,567));568insns.push(TestUnit::new(569Inst::AluRRR {570alu_op: AluOPRRR::Packh,571rd: writable_a1(),572rs1: a0(),573rs2: zero_reg(),574},575"packh a1,a0,zero",5760x080575b3,577));578579//580insns.push(TestUnit::new(581Inst::AluRRR {582alu_op: AluOPRRR::Add,583rd: writable_fp_reg(),584rs1: fp_reg(),585rs2: zero_reg(),586},587"add fp,fp,zero",5880x40433,589));590insns.push(TestUnit::new(591Inst::AluRRImm12 {592alu_op: AluOPRRI::Addi,593rd: writable_fp_reg(),594rs: stack_reg(),595imm12: Imm12::maybe_from_u64(100).unwrap(),596},597"addi fp,sp,100",5980x6410413,599));600insns.push(TestUnit::new(601Inst::Lui {602rd: writable_zero_reg(),603imm: Imm20::from_i32(120),604},605"lui zero,120",6060x78037,607));608insns.push(TestUnit::new(609Inst::Auipc {610rd: writable_zero_reg(),611imm: Imm20::from_i32(120),612},613"auipc zero,120",6140x78017,615));616617insns.push(TestUnit::new(618Inst::Jalr {619rd: writable_a0(),620base: a0(),621offset: Imm12::from_i16(100),622},623"jalr a0,100(a0)",6240x6450567,625));626627insns.push(TestUnit::new(628Inst::Load {629rd: writable_a0(),630op: LoadOP::Lb,631flags: MemFlags::new(),632from: AMode::RegOffset(a1(), 100),633},634"lb a0,100(a1)",6350x6458503,636));637insns.push(TestUnit::new(638Inst::Load {639rd: writable_a0(),640op: LoadOP::Lh,641flags: MemFlags::new(),642from: AMode::RegOffset(a1(), 100),643},644"lh a0,100(a1)",6450x6459503,646));647648insns.push(TestUnit::new(649Inst::Load {650rd: writable_a0(),651op: LoadOP::Lw,652flags: MemFlags::new(),653from: AMode::RegOffset(a1(), 100),654},655"lw a0,100(a1)",6560x645a503,657));658659insns.push(TestUnit::new(660Inst::Load {661rd: writable_a0(),662op: LoadOP::Ld,663flags: MemFlags::new(),664from: AMode::RegOffset(a1(), 100),665},666"ld a0,100(a1)",6670x645b503,668));669insns.push(TestUnit::new(670Inst::Load {671rd: Writable::from_reg(fa0()),672op: LoadOP::Flw,673flags: MemFlags::new(),674from: AMode::RegOffset(a1(), 100),675},676"flw fa0,100(a1)",6770x645a507,678));679680insns.push(TestUnit::new(681Inst::Load {682rd: Writable::from_reg(fa0()),683op: LoadOP::Fld,684flags: MemFlags::new(),685from: AMode::RegOffset(a1(), 100),686},687"fld fa0,100(a1)",6880x645b507,689));690insns.push(TestUnit::new(691Inst::Store {692to: AMode::SPOffset(100),693op: StoreOP::Sb,694flags: MemFlags::new(),695src: a0(),696},697"sb a0,100(sp)",6980x6a10223,699));700insns.push(TestUnit::new(701Inst::Store {702to: AMode::SPOffset(100),703op: StoreOP::Sh,704flags: MemFlags::new(),705src: a0(),706},707"sh a0,100(sp)",7080x6a11223,709));710insns.push(TestUnit::new(711Inst::Store {712to: AMode::SPOffset(100),713op: StoreOP::Sw,714flags: MemFlags::new(),715src: a0(),716},717"sw a0,100(sp)",7180x6a12223,719));720insns.push(TestUnit::new(721Inst::Store {722to: AMode::SPOffset(100),723op: StoreOP::Sd,724flags: MemFlags::new(),725src: a0(),726},727"sd a0,100(sp)",7280x6a13223,729));730insns.push(TestUnit::new(731Inst::Store {732to: AMode::SPOffset(100),733op: StoreOP::Fsw,734flags: MemFlags::new(),735src: fa0(),736},737"fsw fa0,100(sp)",7380x6a12227,739));740insns.push(TestUnit::new(741Inst::Store {742to: AMode::SPOffset(100),743op: StoreOP::Fsd,744flags: MemFlags::new(),745src: fa0(),746},747"fsd fa0,100(sp)",7480x6a13227,749));750insns.push(TestUnit::new(751Inst::AluRRImm12 {752alu_op: AluOPRRI::Addi,753rd: writable_a0(),754rs: a0(),755imm12: Imm12::from_i16(100),756},757"addi a0,a0,100",7580x6450513,759));760insns.push(TestUnit::new(761Inst::AluRRImm12 {762alu_op: AluOPRRI::Slti,763rd: writable_a0(),764rs: a0(),765imm12: Imm12::from_i16(100),766},767"slti a0,a0,100",7680x6452513,769));770insns.push(TestUnit::new(771Inst::AluRRImm12 {772alu_op: AluOPRRI::SltiU,773rd: writable_a0(),774rs: a0(),775imm12: Imm12::from_i16(100),776},777"sltiu a0,a0,100",7780x6453513,779));780insns.push(TestUnit::new(781Inst::AluRRImm12 {782alu_op: AluOPRRI::Xori,783rd: writable_a0(),784rs: a0(),785imm12: Imm12::from_i16(100),786},787"xori a0,a0,100",7880x6454513,789));790insns.push(TestUnit::new(791Inst::AluRRImm12 {792alu_op: AluOPRRI::Andi,793rd: writable_a0(),794rs: a0(),795imm12: Imm12::from_i16(100),796},797"andi a0,a0,100",7980x6457513,799));800insns.push(TestUnit::new(801Inst::AluRRImm12 {802alu_op: AluOPRRI::Slli,803rd: writable_a0(),804rs: a0(),805imm12: Imm12::from_i16(5),806},807"slli a0,a0,5",8080x551513,809));810insns.push(TestUnit::new(811Inst::AluRRImm12 {812alu_op: AluOPRRI::Srli,813rd: writable_a0(),814rs: a0(),815imm12: Imm12::from_i16(5),816},817"srli a0,a0,5",8180x555513,819));820insns.push(TestUnit::new(821Inst::AluRRImm12 {822alu_op: AluOPRRI::Srai,823rd: writable_a0(),824rs: a0(),825imm12: Imm12::from_i16(5),826},827"srai a0,a0,5",8280x40555513,829));830insns.push(TestUnit::new(831Inst::AluRRImm12 {832alu_op: AluOPRRI::Addiw,833rd: writable_a0(),834rs: a0(),835imm12: Imm12::from_i16(120),836},837"addiw a0,a0,120",8380x785051b,839));840insns.push(TestUnit::new(841Inst::AluRRImm12 {842alu_op: AluOPRRI::Slliw,843rd: writable_a0(),844rs: a0(),845imm12: Imm12::from_i16(5),846},847"slliw a0,a0,5",8480x55151b,849));850insns.push(TestUnit::new(851Inst::AluRRImm12 {852alu_op: AluOPRRI::SrliW,853rd: writable_a0(),854rs: a0(),855imm12: Imm12::from_i16(5),856},857"srliw a0,a0,5",8580x55551b,859));860insns.push(TestUnit::new(861Inst::AluRRImm12 {862alu_op: AluOPRRI::Sraiw,863rd: writable_a0(),864rs: a0(),865imm12: Imm12::from_i16(5),866},867"sraiw a0,a0,5",8680x4055551b,869));870871insns.push(TestUnit::new(872Inst::AluRRImm12 {873alu_op: AluOPRRI::Sraiw,874rd: writable_a0(),875rs: a0(),876imm12: Imm12::from_i16(5),877},878"sraiw a0,a0,5",8790x4055551b,880));881insns.push(TestUnit::new(882Inst::AluRRR {883alu_op: AluOPRRR::Add,884rd: writable_a0(),885rs1: a0(),886rs2: a1(),887},888"add a0,a0,a1",8890xb50533,890));891insns.push(TestUnit::new(892Inst::AluRRR {893alu_op: AluOPRRR::Sub,894rd: writable_a0(),895rs1: a0(),896rs2: a1(),897},898"sub a0,a0,a1",8990x40b50533,900));901insns.push(TestUnit::new(902Inst::AluRRR {903alu_op: AluOPRRR::Sll,904rd: writable_a0(),905rs1: a0(),906rs2: a1(),907},908"sll a0,a0,a1",9090xb51533,910));911912insns.push(TestUnit::new(913Inst::AluRRR {914alu_op: AluOPRRR::Slt,915rd: writable_a0(),916rs1: a0(),917rs2: a1(),918},919"slt a0,a0,a1",9200xb52533,921));922insns.push(TestUnit::new(923Inst::AluRRR {924alu_op: AluOPRRR::SltU,925rd: writable_a0(),926rs1: a0(),927rs2: a1(),928},929"sltu a0,a0,a1",9300xb53533,931));932insns.push(TestUnit::new(933Inst::AluRRR {934alu_op: AluOPRRR::Xor,935rd: writable_a0(),936rs1: a0(),937rs2: a1(),938},939"xor a0,a0,a1",9400xb54533,941));942insns.push(TestUnit::new(943Inst::AluRRR {944alu_op: AluOPRRR::Srl,945rd: writable_a0(),946rs1: a0(),947rs2: a1(),948},949"srl a0,a0,a1",9500xb55533,951));952insns.push(TestUnit::new(953Inst::AluRRR {954alu_op: AluOPRRR::Sra,955rd: writable_a0(),956rs1: a0(),957rs2: a1(),958},959"sra a0,a0,a1",9600x40b55533,961));962insns.push(TestUnit::new(963Inst::AluRRR {964alu_op: AluOPRRR::Or,965rd: writable_a0(),966rs1: a0(),967rs2: a1(),968},969"or a0,a0,a1",9700xb56533,971));972insns.push(TestUnit::new(973Inst::AluRRR {974alu_op: AluOPRRR::And,975rd: writable_a0(),976rs1: a0(),977rs2: a1(),978},979"and a0,a0,a1",9800xb57533,981));982insns.push(TestUnit::new(983Inst::AluRRR {984alu_op: AluOPRRR::Addw,985rd: writable_a0(),986rs1: a0(),987rs2: a1(),988},989"addw a0,a0,a1",9900xb5053b,991));992insns.push(TestUnit::new(993Inst::AluRRR {994alu_op: AluOPRRR::Subw,995rd: writable_a0(),996rs1: a0(),997rs2: a1(),998},999"subw a0,a0,a1",10000x40b5053b,1001));1002insns.push(TestUnit::new(1003Inst::AluRRR {1004alu_op: AluOPRRR::Sllw,1005rd: writable_a0(),1006rs1: a0(),1007rs2: a1(),1008},1009"sllw a0,a0,a1",10100xb5153b,1011));1012insns.push(TestUnit::new(1013Inst::AluRRR {1014alu_op: AluOPRRR::Srlw,1015rd: writable_a0(),1016rs1: a0(),1017rs2: a1(),1018},1019"srlw a0,a0,a1",10200xb5553b,1021));1022insns.push(TestUnit::new(1023Inst::AluRRR {1024alu_op: AluOPRRR::Sraw,1025rd: writable_a0(),1026rs1: a0(),1027rs2: a1(),1028},1029"sraw a0,a0,a1",10300x40b5553b,1031));10321033insns.push(TestUnit::new(1034Inst::AluRRR {1035alu_op: AluOPRRR::Mul,1036rd: writable_a0(),1037rs1: a0(),1038rs2: a1(),1039},1040"mul a0,a0,a1",10410x2b50533,1042));10431044insns.push(TestUnit::new(1045Inst::AluRRR {1046alu_op: AluOPRRR::Mulh,1047rd: writable_a0(),1048rs1: a0(),1049rs2: a1(),1050},1051"mulh a0,a0,a1",10520x2b51533,1053));1054insns.push(TestUnit::new(1055Inst::AluRRR {1056alu_op: AluOPRRR::Mulhsu,1057rd: writable_a0(),1058rs1: a0(),1059rs2: a1(),1060},1061"mulhsu a0,a0,a1",10620x2b52533,1063));1064insns.push(TestUnit::new(1065Inst::AluRRR {1066alu_op: AluOPRRR::Mulhu,1067rd: writable_a0(),1068rs1: a0(),1069rs2: a1(),1070},1071"mulhu a0,a0,a1",10720x2b53533,1073));1074insns.push(TestUnit::new(1075Inst::AluRRR {1076alu_op: AluOPRRR::Div,1077rd: writable_a0(),1078rs1: a0(),1079rs2: a1(),1080},1081"div a0,a0,a1",10820x2b54533,1083));1084insns.push(TestUnit::new(1085Inst::AluRRR {1086alu_op: AluOPRRR::DivU,1087rd: writable_a0(),1088rs1: a0(),1089rs2: a1(),1090},1091"divu a0,a0,a1",10920x2b55533,1093));1094insns.push(TestUnit::new(1095Inst::AluRRR {1096alu_op: AluOPRRR::Rem,1097rd: writable_a0(),1098rs1: a0(),1099rs2: a1(),1100},1101"rem a0,a0,a1",11020x2b56533,1103));1104insns.push(TestUnit::new(1105Inst::AluRRR {1106alu_op: AluOPRRR::RemU,1107rd: writable_a0(),1108rs1: a0(),1109rs2: a1(),1110},1111"remu a0,a0,a1",11120x2b57533,1113));11141115insns.push(TestUnit::new(1116Inst::AluRRR {1117alu_op: AluOPRRR::Mulw,1118rd: writable_a0(),1119rs1: a0(),1120rs2: a1(),1121},1122"mulw a0,a0,a1",11230x2b5053b,1124));1125insns.push(TestUnit::new(1126Inst::AluRRR {1127alu_op: AluOPRRR::Divw,1128rd: writable_a0(),1129rs1: a0(),1130rs2: a1(),1131},1132"divw a0,a0,a1",11330x2b5453b,1134));1135insns.push(TestUnit::new(1136Inst::AluRRR {1137alu_op: AluOPRRR::Remw,1138rd: writable_a0(),1139rs1: a0(),1140rs2: a1(),1141},1142"remw a0,a0,a1",11430x2b5653b,1144));1145insns.push(TestUnit::new(1146Inst::AluRRR {1147alu_op: AluOPRRR::Remuw,1148rd: writable_a0(),1149rs1: a0(),1150rs2: a1(),1151},1152"remuw a0,a0,a1",11530x2b5753b,1154));11551156//1157insns.push(TestUnit::new(1158Inst::FpuRRR {1159frm: FRM::RNE,1160width: FpuOPWidth::S,1161alu_op: FpuOPRRR::Fadd,1162rd: writable_fa0(),1163rs1: fa0(),1164rs2: fa1(),1165},1166"fadd.s fa0,fa0,fa1,rne",11670xb50553,1168));1169insns.push(TestUnit::new(1170Inst::FpuRRR {1171frm: FRM::RTZ,1172width: FpuOPWidth::S,1173alu_op: FpuOPRRR::Fsub,1174rd: writable_fa0(),1175rs1: fa0(),1176rs2: fa1(),1177},1178"fsub.s fa0,fa0,fa1,rtz",11790x8b51553,1180));1181insns.push(TestUnit::new(1182Inst::FpuRRR {1183frm: FRM::RUP,1184width: FpuOPWidth::S,1185alu_op: FpuOPRRR::Fmul,1186rd: writable_fa0(),1187rs1: fa0(),1188rs2: fa1(),1189},1190"fmul.s fa0,fa0,fa1,rup",11910x10b53553,1192));1193insns.push(TestUnit::new(1194Inst::FpuRRR {1195frm: FRM::Fcsr,1196width: FpuOPWidth::S,1197alu_op: FpuOPRRR::Fdiv,1198rd: writable_fa0(),1199rs1: fa0(),1200rs2: fa1(),1201},1202"fdiv.s fa0,fa0,fa1,fcsr",12030x18b57553,1204));1205insns.push(TestUnit::new(1206Inst::FpuRRR {1207frm: FRM::RNE,1208width: FpuOPWidth::S,1209alu_op: FpuOPRRR::Fsgnj,1210rd: writable_fa0(),1211rs1: fa0(),1212rs2: fa1(),1213},1214"fsgnj.s fa0,fa0,fa1",12150x20b50553,1216));1217insns.push(TestUnit::new(1218Inst::FpuRRR {1219frm: FRM::RTZ,1220width: FpuOPWidth::S,1221alu_op: FpuOPRRR::Fsgnjn,1222rd: writable_fa0(),1223rs1: fa0(),1224rs2: fa1(),1225},1226"fsgnjn.s fa0,fa0,fa1",12270x20b51553,1228));12291230insns.push(TestUnit::new(1231Inst::FpuRRR {1232frm: FRM::RDN,1233width: FpuOPWidth::S,1234alu_op: FpuOPRRR::Fsgnjx,1235rd: writable_fa0(),1236rs1: fa0(),1237rs2: fa1(),1238},1239"fsgnjx.s fa0,fa0,fa1",12400x20b52553,1241));1242insns.push(TestUnit::new(1243Inst::FpuRRR {1244frm: FRM::RNE,1245width: FpuOPWidth::S,1246alu_op: FpuOPRRR::Fmin,1247rd: writable_fa0(),1248rs1: fa0(),1249rs2: fa1(),1250},1251"fmin.s fa0,fa0,fa1",12520x28b50553,1253));12541255insns.push(TestUnit::new(1256Inst::FpuRRR {1257frm: FRM::RTZ,1258width: FpuOPWidth::S,1259alu_op: FpuOPRRR::Fmax,1260rd: writable_fa0(),1261rs1: fa0(),1262rs2: fa1(),1263},1264"fmax.s fa0,fa0,fa1",12650x28b51553,1266));1267insns.push(TestUnit::new(1268Inst::FpuRRR {1269frm: FRM::RDN,1270width: FpuOPWidth::S,1271alu_op: FpuOPRRR::Feq,1272rd: writable_a0(),1273rs1: fa0(),1274rs2: fa1(),1275},1276"feq.s a0,fa0,fa1",12770xa0b52553,1278));1279insns.push(TestUnit::new(1280Inst::FpuRRR {1281frm: FRM::RTZ,1282width: FpuOPWidth::S,1283alu_op: FpuOPRRR::Flt,1284rd: writable_a0(),1285rs1: fa0(),1286rs2: fa1(),1287},1288"flt.s a0,fa0,fa1",12890xa0b51553,1290));1291insns.push(TestUnit::new(1292Inst::FpuRRR {1293frm: FRM::RNE,1294width: FpuOPWidth::S,1295alu_op: FpuOPRRR::Fle,1296rd: writable_a0(),1297rs1: fa0(),1298rs2: fa1(),1299},1300"fle.s a0,fa0,fa1",13010xa0b50553,1302));13031304//1305insns.push(TestUnit::new(1306Inst::FpuRRR {1307frm: FRM::Fcsr,1308width: FpuOPWidth::D,1309alu_op: FpuOPRRR::Fadd,1310rd: writable_fa0(),1311rs1: fa0(),1312rs2: fa1(),1313},1314"fadd.d fa0,fa0,fa1,fcsr",13150x2b57553,1316));1317insns.push(TestUnit::new(1318Inst::FpuRRR {1319frm: FRM::Fcsr,1320width: FpuOPWidth::D,1321alu_op: FpuOPRRR::Fsub,1322rd: writable_fa0(),1323rs1: fa0(),1324rs2: fa1(),1325},1326"fsub.d fa0,fa0,fa1,fcsr",13270xab57553,1328));1329insns.push(TestUnit::new(1330Inst::FpuRRR {1331frm: FRM::Fcsr,1332width: FpuOPWidth::D,1333alu_op: FpuOPRRR::Fmul,1334rd: writable_fa0(),1335rs1: fa0(),1336rs2: fa1(),1337},1338"fmul.d fa0,fa0,fa1,fcsr",13390x12b57553,1340));1341insns.push(TestUnit::new(1342Inst::FpuRRR {1343frm: FRM::Fcsr,1344width: FpuOPWidth::D,1345alu_op: FpuOPRRR::Fdiv,1346rd: writable_fa0(),1347rs1: fa0(),1348rs2: fa1(),1349},1350"fdiv.d fa0,fa0,fa1,fcsr",13510x1ab57553,1352));1353insns.push(TestUnit::new(1354Inst::FpuRRR {1355frm: FRM::RNE,1356width: FpuOPWidth::D,1357alu_op: FpuOPRRR::Fsgnj,1358rd: writable_fa0(),1359rs1: fa0(),1360rs2: fa1(),1361},1362"fsgnj.d fa0,fa0,fa1",13630x22b50553,1364));1365insns.push(TestUnit::new(1366Inst::FpuRRR {1367frm: FRM::RTZ,1368width: FpuOPWidth::D,1369alu_op: FpuOPRRR::Fsgnjn,1370rd: writable_fa0(),1371rs1: fa0(),1372rs2: fa1(),1373},1374"fsgnjn.d fa0,fa0,fa1",13750x22b51553,1376));13771378insns.push(TestUnit::new(1379Inst::FpuRRR {1380frm: FRM::RDN,1381width: FpuOPWidth::D,1382alu_op: FpuOPRRR::Fsgnjx,1383rd: writable_fa0(),1384rs1: fa0(),1385rs2: fa1(),1386},1387"fsgnjx.d fa0,fa0,fa1",13880x22b52553,1389));1390insns.push(TestUnit::new(1391Inst::FpuRRR {1392frm: FRM::RNE,1393width: FpuOPWidth::D,1394alu_op: FpuOPRRR::Fmin,1395rd: writable_fa0(),1396rs1: fa0(),1397rs2: fa1(),1398},1399"fmin.d fa0,fa0,fa1",14000x2ab50553,1401));14021403insns.push(TestUnit::new(1404Inst::FpuRRR {1405frm: FRM::RTZ,1406width: FpuOPWidth::D,1407alu_op: FpuOPRRR::Fmax,1408rd: writable_fa0(),1409rs1: fa0(),1410rs2: fa1(),1411},1412"fmax.d fa0,fa0,fa1",14130x2ab51553,1414));1415insns.push(TestUnit::new(1416Inst::FpuRRR {1417frm: FRM::RDN,1418width: FpuOPWidth::D,1419alu_op: FpuOPRRR::Feq,1420rd: writable_a0(),1421rs1: fa0(),1422rs2: fa1(),1423},1424"feq.d a0,fa0,fa1",14250xa2b52553,1426));1427insns.push(TestUnit::new(1428Inst::FpuRRR {1429frm: FRM::RTZ,1430width: FpuOPWidth::D,1431alu_op: FpuOPRRR::Flt,1432rd: writable_a0(),1433rs1: fa0(),1434rs2: fa1(),1435},1436"flt.d a0,fa0,fa1",14370xa2b51553,1438));1439insns.push(TestUnit::new(1440Inst::FpuRRR {1441frm: FRM::RNE,1442width: FpuOPWidth::D,1443alu_op: FpuOPRRR::Fle,1444rd: writable_a0(),1445rs1: fa0(),1446rs2: fa1(),1447},1448"fle.d a0,fa0,fa1",14490xa2b50553,1450));14511452//1453insns.push(TestUnit::new(1454Inst::FpuRR {1455frm: FRM::RNE,1456width: FpuOPWidth::S,1457alu_op: FpuOPRR::Fsqrt,1458rd: writable_fa0(),1459rs: fa1(),1460},1461"fsqrt.s fa0,fa1,rne",14620x58058553,1463));1464insns.push(TestUnit::new(1465Inst::FpuRR {1466frm: FRM::Fcsr,1467width: FpuOPWidth::S,1468alu_op: FpuOPRR::FcvtWFmt,1469rd: writable_a0(),1470rs: fa1(),1471},1472"fcvt.w.s a0,fa1,fcsr",14730xc005f553,1474));14751476insns.push(TestUnit::new(1477Inst::FpuRR {1478frm: FRM::Fcsr,1479width: FpuOPWidth::S,1480alu_op: FpuOPRR::FcvtWuFmt,1481rd: writable_a0(),1482rs: fa1(),1483},1484"fcvt.wu.s a0,fa1,fcsr",14850xc015f553,1486));1487insns.push(TestUnit::new(1488Inst::FpuRR {1489frm: FRM::RNE,1490width: FpuOPWidth::S,1491alu_op: FpuOPRR::FmvXFmt,1492rd: writable_a0(),1493rs: fa1(),1494},1495"fmv.x.w a0,fa1",14960xe0058553,1497));1498insns.push(TestUnit::new(1499Inst::FpuRR {1500frm: FRM::RTZ,1501width: FpuOPWidth::S,1502alu_op: FpuOPRR::Fclass,1503rd: writable_a0(),1504rs: fa1(),1505},1506"fclass.s a0,fa1",15070xe0059553,1508));15091510insns.push(TestUnit::new(1511Inst::FpuRR {1512frm: FRM::Fcsr,1513width: FpuOPWidth::S,1514alu_op: FpuOPRR::FcvtFmtW,1515rd: writable_fa0(),1516rs: a0(),1517},1518"fcvt.s.w fa0,a0,fcsr",15190xd0057553,1520));1521insns.push(TestUnit::new(1522Inst::FpuRR {1523frm: FRM::Fcsr,1524width: FpuOPWidth::S,1525alu_op: FpuOPRR::FcvtFmtWu,1526rd: writable_fa0(),1527rs: a0(),1528},1529"fcvt.s.wu fa0,a0,fcsr",15300xd0157553,1531));15321533insns.push(TestUnit::new(1534Inst::FpuRR {1535frm: FRM::RNE,1536width: FpuOPWidth::S,1537alu_op: FpuOPRR::FmvFmtX,1538rd: writable_fa0(),1539rs: a0(),1540},1541"fmv.w.x fa0,a0",15420xf0050553,1543));1544insns.push(TestUnit::new(1545Inst::FpuRR {1546frm: FRM::Fcsr,1547width: FpuOPWidth::S,1548alu_op: FpuOPRR::FcvtLFmt,1549rd: writable_a0(),1550rs: fa0(),1551},1552"fcvt.l.s a0,fa0,fcsr",15530xc0257553,1554));1555insns.push(TestUnit::new(1556Inst::FpuRR {1557frm: FRM::Fcsr,1558width: FpuOPWidth::S,1559alu_op: FpuOPRR::FcvtLuFmt,1560rd: writable_a0(),1561rs: fa0(),1562},1563"fcvt.lu.s a0,fa0,fcsr",15640xc0357553,1565));1566insns.push(TestUnit::new(1567Inst::FpuRR {1568frm: FRM::Fcsr,1569width: FpuOPWidth::S,1570alu_op: FpuOPRR::FcvtFmtL,1571rd: writable_fa0(),1572rs: a0(),1573},1574"fcvt.s.l fa0,a0,fcsr",15750xd0257553,1576));1577insns.push(TestUnit::new(1578Inst::FpuRR {1579frm: FRM::Fcsr,1580width: FpuOPWidth::S,1581alu_op: FpuOPRR::FcvtFmtLu,1582rd: writable_fa0(),1583rs: a0(),1584},1585"fcvt.s.lu fa0,a0,fcsr",15860xd0357553,1587));15881589insns.push(TestUnit::new(1590Inst::FpuRR {1591frm: FRM::Fcsr,1592width: FpuOPWidth::D,1593alu_op: FpuOPRR::Fsqrt,1594rd: writable_fa0(),1595rs: fa1(),1596},1597"fsqrt.d fa0,fa1,fcsr",15980x5a05f553,1599));1600insns.push(TestUnit::new(1601Inst::FpuRR {1602frm: FRM::Fcsr,1603width: FpuOPWidth::D,1604alu_op: FpuOPRR::FcvtWFmt,1605rd: writable_a0(),1606rs: fa1(),1607},1608"fcvt.w.d a0,fa1,fcsr",16090xc205f553,1610));16111612insns.push(TestUnit::new(1613Inst::FpuRR {1614frm: FRM::Fcsr,1615width: FpuOPWidth::D,1616alu_op: FpuOPRR::FcvtWuFmt,1617rd: writable_a0(),1618rs: fa1(),1619},1620"fcvt.wu.d a0,fa1,fcsr",16210xc215f553,1622));1623insns.push(TestUnit::new(1624Inst::FpuRR {1625frm: FRM::RNE,1626width: FpuOPWidth::D,1627alu_op: FpuOPRR::FmvXFmt,1628rd: writable_a0(),1629rs: fa1(),1630},1631"fmv.x.d a0,fa1",16320xe2058553,1633));1634insns.push(TestUnit::new(1635Inst::FpuRR {1636frm: FRM::RTZ,1637width: FpuOPWidth::D,1638alu_op: FpuOPRR::Fclass,1639rd: writable_a0(),1640rs: fa1(),1641},1642"fclass.d a0,fa1",16430xe2059553,1644));16451646insns.push(TestUnit::new(1647Inst::FpuRR {1648frm: FRM::Fcsr,1649width: FpuOPWidth::S,1650alu_op: FpuOPRR::FcvtSD,1651rd: writable_fa0(),1652rs: fa0(),1653},1654"fcvt.s.d fa0,fa0,fcsr",16550x40157553,1656));1657insns.push(TestUnit::new(1658Inst::FpuRR {1659frm: FRM::RNE,1660width: FpuOPWidth::D,1661alu_op: FpuOPRR::FcvtFmtWu,1662rd: writable_fa0(),1663rs: a0(),1664},1665"fcvt.d.wu fa0,a0,rne",16660xd2150553,1667));16681669insns.push(TestUnit::new(1670Inst::FpuRR {1671frm: FRM::RNE,1672width: FpuOPWidth::D,1673alu_op: FpuOPRR::FmvFmtX,1674rd: writable_fa0(),1675rs: a0(),1676},1677"fmv.d.x fa0,a0",16780xf2050553,1679));1680insns.push(TestUnit::new(1681Inst::FpuRR {1682frm: FRM::Fcsr,1683width: FpuOPWidth::D,1684alu_op: FpuOPRR::FcvtLFmt,1685rd: writable_a0(),1686rs: fa0(),1687},1688"fcvt.l.d a0,fa0,fcsr",16890xc2257553,1690));1691insns.push(TestUnit::new(1692Inst::FpuRR {1693frm: FRM::Fcsr,1694width: FpuOPWidth::D,1695alu_op: FpuOPRR::FcvtLuFmt,1696rd: writable_a0(),1697rs: fa0(),1698},1699"fcvt.lu.d a0,fa0,fcsr",17000xc2357553,1701));1702insns.push(TestUnit::new(1703Inst::FpuRR {1704frm: FRM::Fcsr,1705width: FpuOPWidth::D,1706alu_op: FpuOPRR::FcvtFmtL,1707rd: writable_fa0(),1708rs: a0(),1709},1710"fcvt.d.l fa0,a0,fcsr",17110xd2257553,1712));1713insns.push(TestUnit::new(1714Inst::FpuRR {1715frm: FRM::Fcsr,1716width: FpuOPWidth::D,1717alu_op: FpuOPRR::FcvtFmtLu,1718rd: writable_fa0(),1719rs: a0(),1720},1721"fcvt.d.lu fa0,a0,fcsr",17220xd2357553,1723));1724//////////////////////17251726insns.push(TestUnit::new(1727Inst::FpuRRRR {1728frm: FRM::RNE,1729width: FpuOPWidth::S,1730alu_op: FpuOPRRRR::Fmadd,1731rd: writable_fa0(),1732rs1: fa0(),1733rs2: fa1(),1734rs3: fa7(),1735},1736"fmadd.s fa0,fa0,fa1,fa7,rne",17370x88b50543,1738));1739insns.push(TestUnit::new(1740Inst::FpuRRRR {1741frm: FRM::Fcsr,1742width: FpuOPWidth::S,1743alu_op: FpuOPRRRR::Fmsub,1744rd: writable_fa0(),1745rs1: fa0(),1746rs2: fa1(),1747rs3: fa7(),1748},1749"fmsub.s fa0,fa0,fa1,fa7,fcsr",17500x88b57547,1751));1752insns.push(TestUnit::new(1753Inst::FpuRRRR {1754frm: FRM::Fcsr,1755width: FpuOPWidth::S,1756alu_op: FpuOPRRRR::Fnmsub,1757rd: writable_fa0(),1758rs1: fa0(),1759rs2: fa1(),1760rs3: fa7(),1761},1762"fnmsub.s fa0,fa0,fa1,fa7,fcsr",17630x88b5754b,1764));1765insns.push(TestUnit::new(1766Inst::FpuRRRR {1767frm: FRM::Fcsr,1768width: FpuOPWidth::S,1769alu_op: FpuOPRRRR::Fnmadd,1770rd: writable_fa0(),1771rs1: fa0(),1772rs2: fa1(),1773rs3: fa7(),1774},1775"fnmadd.s fa0,fa0,fa1,fa7,fcsr",17760x88b5754f,1777));17781779insns.push(TestUnit::new(1780Inst::FpuRRRR {1781frm: FRM::Fcsr,1782width: FpuOPWidth::D,1783alu_op: FpuOPRRRR::Fmadd,1784rd: writable_fa0(),1785rs1: fa0(),1786rs2: fa1(),1787rs3: fa7(),1788},1789"fmadd.d fa0,fa0,fa1,fa7,fcsr",17900x8ab57543,1791));1792insns.push(TestUnit::new(1793Inst::FpuRRRR {1794frm: FRM::Fcsr,1795width: FpuOPWidth::D,1796alu_op: FpuOPRRRR::Fmsub,1797rd: writable_fa0(),1798rs1: fa0(),1799rs2: fa1(),1800rs3: fa7(),1801},1802"fmsub.d fa0,fa0,fa1,fa7,fcsr",18030x8ab57547,1804));1805insns.push(TestUnit::new(1806Inst::FpuRRRR {1807frm: FRM::Fcsr,1808width: FpuOPWidth::D,1809alu_op: FpuOPRRRR::Fnmsub,1810rd: writable_fa0(),1811rs1: fa0(),1812rs2: fa1(),1813rs3: fa7(),1814},1815"fnmsub.d fa0,fa0,fa1,fa7,fcsr",18160x8ab5754b,1817));1818insns.push(TestUnit::new(1819Inst::FpuRRRR {1820frm: FRM::Fcsr,1821width: FpuOPWidth::D,1822alu_op: FpuOPRRRR::Fnmadd,1823rd: writable_fa0(),1824rs1: fa0(),1825rs2: fa1(),1826rs3: fa7(),1827},1828"fnmadd.d fa0,fa0,fa1,fa7,fcsr",18290x8ab5754f,1830));18311832insns.push(TestUnit::new(1833Inst::Atomic {1834op: AtomicOP::LrW,1835rd: writable_a0(),1836addr: a1(),1837src: zero_reg(),1838amo: AMO::Relax,1839},1840"lr.w a0,(a1)",18410x1005a52f,1842));1843insns.push(TestUnit::new(1844Inst::Atomic {1845op: AtomicOP::ScW,1846rd: writable_a0(),1847addr: a1(),1848src: a2(),1849amo: AMO::Release,1850},1851"sc.w.rl a0,a2,(a1)",18520x1ac5a52f,1853));1854insns.push(TestUnit::new(1855Inst::Atomic {1856op: AtomicOP::AmoswapW,1857rd: writable_a0(),1858addr: a1(),1859src: a2(),1860amo: AMO::Acquire,1861},1862"amoswap.w.aq a0,a2,(a1)",18630xcc5a52f,1864));18651866insns.push(TestUnit::new(1867Inst::Atomic {1868op: AtomicOP::AmoaddW,1869rd: writable_a0(),1870addr: a1(),1871src: a2(),1872amo: AMO::SeqCst,1873},1874"amoadd.w.aqrl a0,a2,(a1)",18750x6c5a52f,1876));1877insns.push(TestUnit::new(1878Inst::Atomic {1879op: AtomicOP::AmoxorW,1880rd: writable_a0(),1881addr: a1(),1882src: a2(),1883amo: AMO::Relax,1884},1885"amoxor.w a0,a2,(a1)",18860x20c5a52f,1887));1888insns.push(TestUnit::new(1889Inst::Atomic {1890op: AtomicOP::AmoandW,1891rd: writable_a0(),1892addr: a1(),1893src: a2(),1894amo: AMO::Relax,1895},1896"amoand.w a0,a2,(a1)",18970x60c5a52f,1898));18991900insns.push(TestUnit::new(1901Inst::Atomic {1902op: AtomicOP::AmoorW,1903rd: writable_a0(),1904addr: a1(),1905src: a2(),1906amo: AMO::Relax,1907},1908"amoor.w a0,a2,(a1)",19090x40c5a52f,1910));1911insns.push(TestUnit::new(1912Inst::Atomic {1913op: AtomicOP::AmominW,1914rd: writable_a0(),1915addr: a1(),1916src: a2(),1917amo: AMO::Relax,1918},1919"amomin.w a0,a2,(a1)",19200x80c5a52f,1921));1922insns.push(TestUnit::new(1923Inst::Atomic {1924op: AtomicOP::AmomaxW,1925rd: writable_a0(),1926addr: a1(),1927src: a2(),1928amo: AMO::Relax,1929},1930"amomax.w a0,a2,(a1)",19310xa0c5a52f,1932));1933insns.push(TestUnit::new(1934Inst::Atomic {1935op: AtomicOP::AmominuW,1936rd: writable_a0(),1937addr: a1(),1938src: a2(),1939amo: AMO::Relax,1940},1941"amominu.w a0,a2,(a1)",19420xc0c5a52f,1943));1944insns.push(TestUnit::new(1945Inst::Atomic {1946op: AtomicOP::AmomaxuW,1947rd: writable_a0(),1948addr: a1(),1949src: a2(),1950amo: AMO::Relax,1951},1952"amomaxu.w a0,a2,(a1)",19530xe0c5a52f,1954));19551956insns.push(TestUnit::new(1957Inst::Atomic {1958op: AtomicOP::LrD,1959rd: writable_a0(),1960addr: a1(),1961src: zero_reg(),1962amo: AMO::Relax,1963},1964"lr.d a0,(a1)",19650x1005b52f,1966));1967insns.push(TestUnit::new(1968Inst::Atomic {1969op: AtomicOP::ScD,1970rd: writable_a0(),1971addr: a1(),1972src: a2(),1973amo: AMO::Relax,1974},1975"sc.d a0,a2,(a1)",19760x18c5b52f,1977));19781979insns.push(TestUnit::new(1980Inst::Atomic {1981op: AtomicOP::AmoswapD,1982rd: writable_a0(),1983addr: a1(),1984src: a2(),1985amo: AMO::Relax,1986},1987"amoswap.d a0,a2,(a1)",19880x8c5b52f,1989));19901991insns.push(TestUnit::new(1992Inst::Atomic {1993op: AtomicOP::AmoaddD,1994rd: writable_a0(),1995addr: a1(),1996src: a2(),1997amo: AMO::Relax,1998},1999"amoadd.d a0,a2,(a1)",20000xc5b52f,2001));2002insns.push(TestUnit::new(2003Inst::Atomic {2004op: AtomicOP::AmoxorD,2005rd: writable_a0(),2006addr: a1(),2007src: a2(),2008amo: AMO::Relax,2009},2010"amoxor.d a0,a2,(a1)",20110x20c5b52f,2012));2013insns.push(TestUnit::new(2014Inst::Atomic {2015op: AtomicOP::AmoandD,2016rd: writable_a0(),2017addr: a1(),2018src: a2(),2019amo: AMO::Relax,2020},2021"amoand.d a0,a2,(a1)",20220x60c5b52f,2023));20242025insns.push(TestUnit::new(2026Inst::Atomic {2027op: AtomicOP::AmoorD,2028rd: writable_a0(),2029addr: a1(),2030src: a2(),2031amo: AMO::Relax,2032},2033"amoor.d a0,a2,(a1)",20340x40c5b52f,2035));2036insns.push(TestUnit::new(2037Inst::Atomic {2038op: AtomicOP::AmominD,2039rd: writable_a0(),2040addr: a1(),2041src: a2(),2042amo: AMO::Relax,2043},2044"amomin.d a0,a2,(a1)",20450x80c5b52f,2046));2047insns.push(TestUnit::new(2048Inst::Atomic {2049op: AtomicOP::AmomaxD,2050rd: writable_a0(),2051addr: a1(),2052src: a2(),2053amo: AMO::Relax,2054},2055"amomax.d a0,a2,(a1)",20560xa0c5b52f,2057));2058insns.push(TestUnit::new(2059Inst::Atomic {2060op: AtomicOP::AmominuD,2061rd: writable_a0(),2062addr: a1(),2063src: a2(),2064amo: AMO::Relax,2065},2066"amominu.d a0,a2,(a1)",20670xc0c5b52f,2068));2069insns.push(TestUnit::new(2070Inst::Atomic {2071op: AtomicOP::AmomaxuD,2072rd: writable_a0(),2073addr: a1(),2074src: a2(),2075amo: AMO::Relax,2076},2077"amomaxu.d a0,a2,(a1)",20780xe0c5b52f,2079));20802081/////////2082insns.push(TestUnit::new(2083Inst::Fence {2084pred: 1,2085succ: 1 << 1,2086},2087"fence w,r",20880x120000f,2089));2090insns.push(TestUnit::new(Inst::EBreak {}, "ebreak", 0x100073));20912092insns.push(TestUnit::new(2093Inst::FpuRRR {2094alu_op: FpuOPRRR::Fsgnj,2095width: FpuOPWidth::S,2096frm: FRM::RNE,2097rd: writable_fa0(),2098rs1: fa1(),2099rs2: fa1(),2100},2101"fmv.s fa0,fa1",21020x20b58553,2103));2104insns.push(TestUnit::new(2105Inst::FpuRRR {2106alu_op: FpuOPRRR::Fsgnj,2107width: FpuOPWidth::D,2108frm: FRM::RNE,2109rd: writable_fa0(),2110rs1: fa1(),2111rs2: fa1(),2112},2113"fmv.d fa0,fa1",21140x22b58553,2115));21162117insns.push(TestUnit::new(2118Inst::FpuRRR {2119alu_op: FpuOPRRR::Fsgnjn,2120width: FpuOPWidth::S,2121frm: FRM::RTZ,2122rd: writable_fa0(),2123rs1: fa1(),2124rs2: fa1(),2125},2126"fneg.s fa0,fa1",21270x20b59553,2128));2129insns.push(TestUnit::new(2130Inst::FpuRRR {2131alu_op: FpuOPRRR::Fsgnjn,2132width: FpuOPWidth::D,2133frm: FRM::RTZ,2134rd: writable_fa0(),2135rs1: fa1(),2136rs2: fa1(),2137},2138"fneg.d fa0,fa1",21390x22b59553,2140));21412142insns.push(TestUnit::new(2143Inst::Fli {2144width: FpuOPWidth::H,2145rd: writable_fa0(),2146imm: FliConstant::new(3),2147},2148"fli.h fa0,2^-15",21490xf4118553,2150));21512152insns.push(TestUnit::new(2153Inst::Fli {2154width: FpuOPWidth::S,2155rd: writable_fa0(),2156imm: FliConstant::new(0),2157},2158"fli.s fa0,-1.0",21590xf0100553,2160));21612162insns.push(TestUnit::new(2163Inst::Fli {2164width: FpuOPWidth::D,2165rd: writable_fa0(),2166imm: FliConstant::new(13),2167},2168"fli.d fa0,0.625",21690xf2168553,2170));21712172let (flags, isa_flags) = make_test_flags();2173let emit_info = EmitInfo::new(flags, isa_flags);21742175for unit in insns.iter() {2176println!("Riscv64: {:?}, {}", unit.inst, unit.assembly);2177// Check the printed text is as expected.2178let actual_printing = unit.inst.print_with_state(&mut EmitState::default());2179assert_eq!(unit.assembly, actual_printing);2180let mut buffer = MachBuffer::new();2181unit.inst2182.emit(&mut buffer, &emit_info, &mut Default::default());2183let buffer = buffer.finish(&Default::default(), &mut Default::default());2184let actual_encoding = buffer.stringify_code_bytes();21852186assert_eq!(actual_encoding, unit.code.0);2187}2188}21892190fn make_test_flags() -> (settings::Flags, super::super::riscv_settings::Flags) {2191let b = settings::builder();2192let flags = settings::Flags::new(b.clone());2193let b2 = super::super::riscv_settings::builder();2194let isa_flags = super::super::riscv_settings::Flags::new(&flags, &b2);2195(flags, isa_flags)2196}21972198#[test]2199fn riscv64_worst_case_instruction_size() {2200let (flags, isa_flags) = make_test_flags();2201let emit_info = EmitInfo::new(flags, isa_flags);22022203// These are all candidate instructions with potential to generate a lot of bytes.2204let mut candidates: Vec<MInst> = vec![];22052206candidates.push(Inst::Popcnt {2207sum: writable_a0(),2208tmp: writable_a0(),2209step: writable_a0(),2210rs: a0(),2211ty: I64,2212});22132214candidates.push(Inst::Cltz {2215sum: writable_a0(),2216tmp: writable_a0(),2217step: writable_a0(),2218rs: a0(),2219leading: true,2220ty: I64,2221});22222223candidates.push(Inst::Brev8 {2224rd: writable_a0(),2225tmp: writable_a0(),2226step: writable_a0(),2227tmp2: writable_a0(),2228rs: a0(),2229ty: I64,2230});22312232candidates.push(Inst::AtomicCas {2233offset: a0(),2234t0: writable_a0(),2235dst: writable_a0(),2236e: a0(),2237addr: a0(),2238v: a0(),2239ty: I64,2240});22412242candidates.push(Inst::AtomicCas {2243offset: a0(),2244t0: writable_a0(),2245dst: writable_a0(),2246e: a0(),2247addr: a0(),2248v: a0(),2249ty: I16,2250});22512252candidates.extend(2253crate::ir::AtomicRmwOp::all()2254.iter()2255.map(|op| Inst::AtomicRmwLoop {2256op: *op,2257offset: a0(),2258dst: writable_a1(),2259ty: I16,2260p: a1(),2261x: a2(),2262t0: writable_a0(),2263}),2264);22652266// Return Call Indirect and BrTable are the largest instructions possible. However they2267// emit their own island, so we don't account them here.22682269let mut max: (u32, MInst) = (0, Inst::Nop0);2270for i in candidates {2271let mut buffer = MachBuffer::new();2272let mut emit_state = Default::default();2273i.emit(&mut buffer, &emit_info, &mut emit_state);2274let buffer = buffer.finish(&Default::default(), &mut Default::default());2275let length = buffer.data().len() as u32;2276if length > max.0 {2277let length = buffer.data().len() as u32;2278max = (length, i.clone());2279}2280println!("insn:{i:?} length: {length}");2281}2282println!("calculate max size is {} , inst is {:?}", max.0, max.1);2283assert!(max.0 <= Inst::worst_case_size());2284}228522862287