sem call { nPC2 = PC + disp30?sext(32)<<2; Rx(15,PC?addr?ext(64)); }; sem jmpl { nPC2 = (Rx(rs1) + get_src2(i,rs2,simm13) )?cvt(stream); Rx(rd,PC?addr?ext(64)); }; sem retrn { nPC2 = (Rx(rs1) + get_src2(i,rs2,simm13) )?cvt(stream); if(CANRESTORE?cvt(ulong) > 0) { CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); CANRESTORE = (CANRESTORE?cvt(ulong) - 1)?cvt(cwp_t); } else { restore_regs(CWP); if(CANSAVE?cvt(ulong) < 8 -2) CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); } CWP = ((CWP?cvt(ulong) + 8 - 1) % 8 )?bits(5); }; sem [ brz brlez brlz brnz brgz brgez ] { if(test(Rx(rs1),0?cvt(ullong))) nPC2 = PC + ((d16hi?sext(32)<<16) | (d16lo?ext(32)<<2)); else if(a) annul(); } where test in [ == <= < != > >= ]; sem [ fba ba ] { nPC2 = PC + disp22?sext(32)<<2; if(a) annul(); }; sem [ fbpa bpa ] { nPC2 = PC + disp19?sext(32)<<2; if(a) annul(); }; sem [ fbn fbpn bn bpn ] { if(a) annul(); }; sem [ fbu fbg fbug fbl fbul fblg fbne fbe fbue fbge fbuge fble fbule fbo ] { if(cond(0)) nPC2 = PC + disp22?sext(32)<<2; else if(a) annul(); } where cond in [ f_u f_g f_ug f_l f_ul f_lg f_ne f_e f_ue f_ge f_uge f_le f_ule f_o ]; sem [ fbpu fbpg fbpug fbpl fbpul fbplg fbpne fbpe fbpue fbpge fbpuge fbple fbpule fbpo ] { if(cond(bpccr)) nPC2 = PC + disp19?sext(32)<<2; else if(a) annul(); } where cond in [ f_u f_g f_ug f_l f_ul f_lg f_ne f_e f_ue f_ge f_uge f_le f_ule f_o ]; sem [ bne be bg ble bge bl bgu bleu bcc bcs bpos bneg bvc bvs ] { if(cond) nPC2 = PC + disp22?sext(32)<<2; else if(a) annul(); } where cond in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ bpne bpe bpg bple bpge bpl bpgu bpleu bpcc bpcs bppos bpneg bpvc bpvs ] { if(bpcc1) { if(cond_xcc) nPC2 = PC + disp19?sext(32)<<2; else if(a) annul(); } else if(cond_icc) nPC2 = PC + disp19?sext(32)<<2; else if(a) annul(); } where cond_xcc in [ (! CCR?bit(6) ) (CCR?bit(6) ) (!(CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) ))) (CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) )) (!(CCR?bit(7) ^ CCR?bit(5) )) (CCR?bit(7) ^ CCR?bit(5) ) (!(CCR?bit(4) | CCR?bit(6) )) (CCR?bit(4) | CCR?bit(6) ) (! CCR?bit(4) ) (CCR?bit(4) ) (! CCR?bit(7) ) (CCR?bit(7) ) (! CCR?bit(5) ) (CCR?bit(5) ) ], cond_icc in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ fmovfsa fmovfda fmovsa fmovda ] { fd(rd,fs(rs2)); } where fs in [ F4 F8 F4 F8 ], fd in [ F4 F8 F4 F8 ]; sem [ fmovsne fmovse fmovsg fmovsle fmovsge fmovsl fmovsgu fmovsleu fmovscc fmovscs fmovspos fmovsneg fmovsvc fmovsvs ] { if(bpcc1) { if(cond_xcc) F4(rd,F4(rs2)); } else if(cond_icc) F4(rd,F4(rs2)); } where cond_xcc in [ (! CCR?bit(6) ) (CCR?bit(6) ) (!(CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) ))) (CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) )) (!(CCR?bit(7) ^ CCR?bit(5) )) (CCR?bit(7) ^ CCR?bit(5) ) (!(CCR?bit(4) | CCR?bit(6) )) (CCR?bit(4) | CCR?bit(6) ) (! CCR?bit(4) ) (CCR?bit(4) ) (! CCR?bit(7) ) (CCR?bit(7) ) (! CCR?bit(5) ) (CCR?bit(5) ) ], cond_icc in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ fmovdne fmovde fmovdg fmovdle fmovdge fmovdl fmovdgu fmovdleu fmovdcc fmovdcs fmovdpos fmovdneg fmovdvc fmovdvs ] { if(bpcc1) { if(cond_xcc) F8(rd,F8(rs2)); } else if(cond_icc) F8(rd,F8(rs2)); } where cond_xcc in [ (! CCR?bit(6) ) (CCR?bit(6) ) (!(CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) ))) (CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) )) (!(CCR?bit(7) ^ CCR?bit(5) )) (CCR?bit(7) ^ CCR?bit(5) ) (!(CCR?bit(4) | CCR?bit(6) )) (CCR?bit(4) | CCR?bit(6) ) (! CCR?bit(4) ) (CCR?bit(4) ) (! CCR?bit(7) ) (CCR?bit(7) ) (! CCR?bit(5) ) (CCR?bit(5) ) ], cond_icc in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ fmovfsu fmovfsg fmovfsug fmovfsl fmovfsul fmovfslg fmovfsne fmovfse fmovfsue fmovfsge fmovfsuge fmovfsle fmovfsule fmovfso ] { if(cond(bpccr)) F4(rd,F4(rs2)); } where cond in [ f_u f_g f_ug f_l f_ul f_lg f_ne f_e f_ue f_ge f_uge f_le f_ule f_o ]; sem [ fmovfdu fmovfdg fmovfdug fmovfdl fmovfdul fmovfdlg fmovfdne fmovfde fmovfdue fmovfdge fmovfduge fmovfdle fmovfdule fmovfdo ] { if(cond(bpccr)) F8(rd,F8(rs2)); } where cond in [ f_u f_g f_ug f_l f_ul f_lg f_ne f_e f_ue f_ge f_uge f_le f_ule f_o ]; sem [ fmovrsz fmovrslez fmovrslz fmovrsnz fmovrsgz fmovrsgez ] { if(test(Rx(rs1),0?cvt(ullong))) F4(rd,F4(rs2)); } where test in [ == <= < != > >= ]; sem [ fmovrdz fmovrdlez fmovrdlz fmovrdnz fmovrdgz fmovrdgez ] { if(test(Rx(rs1),0?cvt(ullong))) F8(rd,F8(rs2)); } where test in [ == <= < != > >= ]; sem [ mova movfa ] { Rx(rd,Rx(rs2)); }; sem [ movne move movg movle movge movl movgu movleu movcc movcs movpos movneg movvc movvs ] { if(bpcc1) { if(cond_xcc) Rx(rd,Rx(rs2)); } else if(cond_icc) Rx(rd,Rx(rs2)); } where cond_xcc in [ (! CCR?bit(6) ) (CCR?bit(6) ) (!(CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) ))) (CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) )) (!(CCR?bit(7) ^ CCR?bit(5) )) (CCR?bit(7) ^ CCR?bit(5) ) (!(CCR?bit(4) | CCR?bit(6) )) (CCR?bit(4) | CCR?bit(6) ) (! CCR?bit(4) ) (CCR?bit(4) ) (! CCR?bit(7) ) (CCR?bit(7) ) (! CCR?bit(5) ) (CCR?bit(5) ) ], cond_icc in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ movfu movfg movfug movfl movful movflg movfne movfe movfue movfge movfuge movfle movfule movfo ] { if(cond(bpccr)) Rx(rd,Rx(rs2)); } where cond in [ f_u f_g f_ug f_l f_ul f_lg f_ne f_e f_ue f_ge f_uge f_le f_ule f_o ]; sem [ movrz movrlez movrlz movrnz movrgz movrgez ] { if(test(Rx(rs1),0?cvt(ullong))) Rx(rd,Rx(rs2)); } where test in [ == <= < != > >= ]; sem ta { _trap(i,rs2,sw_trap) ; }; sem [ tne te tg tle tge tl tgu tleu tcc tcs tpos tneg tvc tvs ] { if(bpcc1) { if(cond_xcc) _trap(i,rs2,sw_trap) ; } else if(cond_icc) _trap(i,rs2,sw_trap) ; } where cond_xcc in [ (! CCR?bit(6) ) (CCR?bit(6) ) (!(CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) ))) (CCR?bit(6) |(CCR?bit(7) ^ CCR?bit(5) )) (!(CCR?bit(7) ^ CCR?bit(5) )) (CCR?bit(7) ^ CCR?bit(5) ) (!(CCR?bit(4) | CCR?bit(6) )) (CCR?bit(4) | CCR?bit(6) ) (! CCR?bit(4) ) (CCR?bit(4) ) (! CCR?bit(7) ) (CCR?bit(7) ) (! CCR?bit(5) ) (CCR?bit(5) ) ], cond_icc in [ (! CCR?bit(2) ) (CCR?bit(2) ) (!(CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) ))) (CCR?bit(2) |(CCR?bit(3) ^ CCR?bit(1) )) (!(CCR?bit(3) ^ CCR?bit(1) )) (CCR?bit(3) ^ CCR?bit(1) ) (!(CCR?bit(0) | CCR?bit(2) )) (CCR?bit(0) | CCR?bit(2) ) (! CCR?bit(0) ) (CCR?bit(0) ) (! CCR?bit(3) ) (CCR?bit(3) ) (! CCR?bit(1) ) (CCR?bit(1) ) ]; sem [ add sub and or xor ] { Rx(rd, op(Rx(rs1),get_src2(i,rs2,simm13) )); } where op in [ + - & | ^ ]; sem [ addcc subcc andcc orcc xorcc ] { Rx(rd, op(Rx(rs1),get_src2(i,rs2,simm13) )?cc(CCR)); } where op in [ + - & | ^ ]; sem addc { Rx(rd, Rx(rs1) + get_src2(i,rs2,simm13) + (CCR?bit(0)?ext(64)) ); }; sem subc { Rx(rd, Rx(rs1) - get_src2(i,rs2,simm13) - (CCR?bit(0)?ext(64)) ); }; sem addccc { val ccr = 0x00?cvt(cc); val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; val xx = ((x1 + x2)?cc(ccr) + (CCR?bit(0)?ext(64)) )?cc(CCR); CCR = ((CCR?bits(8) & 0b11011101) | (ccr?bits(8) & 0x11) | (((x1?bit(31)==x2?bit(31))&&(xx?bit(31)!=x1?bit(31)))?ext(8)<<1) | (((x1?bit(63)==x2?bit(63))&&(xx?bit(63)!=x1?bit(63)))?ext(8)<<5)) ? cvt(cc); Rx(rd, xx); }; sem subccc { val ccr = 0x00?cvt(cc); val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; val xx = ((x1 - x2)?cc(ccr) - (CCR?bit(0)?ext(64)) )?cc(CCR); CCR = ((CCR?bits(8) & 0b11011101) | (ccr?bits(8) & 0x11) | (((x1?bit(31)!=x2?bit(31))&&(xx?bit(31)!=x1?bit(31)))?ext(8)<<1) | (((x1?bit(63)!=x2?bit(63))&&(xx?bit(63)!=x1?bit(63)))?ext(8)<<5)) ? cvt(cc); Rx(rd, xx); }; sem [ andn orn xnor ] { Rx(rd, op(Rx(rs1),~get_src2(i,rs2,simm13) )); } where op in [ & | ^ ]; sem [ andncc orncc xnorcc ] { Rx(rd, op(Rx(rs1),~get_src2(i,rs2,simm13) )?cc(CCR)); } where op in [ & | ^ ]; sem [ mulx udivx ] { Rx(rd, op(Rx(rs1),get_src2(i,rs2,simm13) )); } where op in [ * / ]; sem sdivx { Rx(rd,(+Rx(rs1) / + get_src2(i,rs2,simm13) )?cast(ullong)); }; sem sll { Rx(rd, Rx(rs1) << get_src2(i,rs2,simm13) ?bits(5)); }; sem srl { R4(rd, R4(rs1) >> get_src2(i,rs2,simm13) ?bits(5)); }; sem sra { Rx(rd,(+R4(rs1) >> get_src2(i,rs2,simm13) ?bits(5))?sext(64)); }; sem sllx { Rx(rd, Rx(rs1) << get_src2(i,rs2,simm13) ?bits(6)); }; sem srlx { Rx(rd, Rx(rs1) >> get_src2(i,rs2,simm13) ?bits(6)); }; sem srax { Rx(rd,(+Rx(rs1) >> get_src2(i,rs2,simm13) ?bits(6))?cast(ullong)); }; sem taddcc { val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; Rx(rd, (x1 + x2)?cc(CCR)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) CCR = (CCR?bits(8) | 0x02)?cvt(cc); }; sem taddcctv { val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; Rx(rd, (x1 + x2)?cc(CCR)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) CCR = (CCR?bits(8) | 0x02)?cvt(cc); if(CCR?bit(1)) trap_sparc(0x23?ext(32) ,CWP,CANRESTORE); }; sem tsubcc { val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; Rx(rd, (x1 - x2)?cc(CCR)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) CCR = (CCR?bits(8) | 0x02)?cvt(cc); }; sem tsubcctv { val x1 = Rx(rs1); val x2 = get_src2(i,rs2,simm13) ; Rx(rd, (x1 - x2)?cc(CCR)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) CCR = (CCR?bits(8) | 0x02)?cvt(cc); if(CCR?bit(1)) trap_sparc(0x23?ext(32) ,CWP,CANRESTORE); }; sem [ udiv sdiv ] { val ccr = 0x00; val xx = ((Y?ext(64)<<32) | R4(rs1)?ext(64)); if(i) xx = _div(xx,simm13?sext(32)?ext(64),ccr); else xx = _div(xx,R4(rs2)?ext(64),ccr); Rx(rd,xx); } where _div in [u_div32 s_div32]; sem umul { val xx = (Rx(rs1)&0xffffffff?ext(64)) * (get_src2(i,rs2,simm13) &0xffffffff?ext(64)); Y = (xx >> 32)?bits(32); R4(rd,xx?bits(32)); }; sem smul { val xx = +Rx(rs1)?bits(32)?sext(64) * + get_src2(i,rs2,simm13) ?bits(32)?sext(64); Y = (xx >> 32)?bits(32); R4(rd,xx?bits(32)); }; sem [ udivcc sdivcc ] { val ccr = 0x00; val xx = ((Y?ext(64)<<32) | R4(rs1)?ext(64)); if(i) xx = _div(xx,simm13?sext(32),ccr); else xx = _div(xx,R4(rs2),ccr); CCR = get_div_mul_cc(xx,ccr)?cvt(cc); Rx(rd,xx); } where _div in [u_div32 s_div32]; sem umulcc { val xx = (Rx(rs1)&0xffffffff?ext(64)) * (get_src2(i,rs2,simm13) &0xffffffff?ext(64)); CCR = get_div_mul_cc(xx,0x00)?cvt(cc); Y = (xx >> 32)?bits(32); R4(rd,xx?bits(32)); }; sem smulcc { val xx = (+Rx(rs1)?bits(32)?sext(64) * + get_src2(i,rs2,simm13) ?bits(32)?sext(64))?cast(ullong); CCR = get_div_mul_cc(xx,0x00)?cvt(cc); Y = (xx >> 32)?bits(32); R4(rd,xx?bits(32)); }; sem mulscc { val y0 = Y?bit(0); Y = (Y>>1) | (R4(rs1)?bit(0)?ext(32)<<31); val xx = (R4(rs1)>>1) | ((CCR?bit(3)^CCR?bit(1))?ext(32)<<31); if(y0) R4(rd, (xx + get_src2(i,rs2,simm13) ?bits(32))?cc(CCR)); else R4(rd,(xx+0)?cc(CCR)); }; sem popc { val xx = Rx(rs2); val ii=0; val count=0?ext(64); while(ii < 64) { count = count + ((xx >> ii) & 0x1?ext(64)); ii = ii + 1; } Rx(rd,count); }; sem flushw { _flushw() ; }; sem rd { switch(rs1?ext(32)) { case 0: Rx(rd,Y?ext(64)); case 2: Rx(rd,CCR?bits(8)?ext(64)); case 5: Rx(rd,PC?addr?ext(64)); case 15: assert(rd?ext(32)==0); default: assert(false); } }; sem wr { switch(rd?ext(32)) { case 0: Y = (Rx(rs1) ^ get_src2(i,rs2,simm13) )?bits(32); case 2: CCR = (Rx(rs1) ^ get_src2(i,rs2,simm13) )?cvt(cc); default: assert(false); } }; sem save { val xx = Rx(rs1) + get_src2(i,rs2,simm13) ; if(CANSAVE?cvt(ulong) <= 0) { save_regs(CWP,CANRESTORE); CANSAVE = CANRESTORE; CANRESTORE = 0?cvt(cwp_t); } CWP = ((CWP?cvt(ulong) + 1) % 8 )?bits(5); CANSAVE = (CANSAVE?cvt(ulong) - 1)?cvt(cwp_t); CANRESTORE = (CANRESTORE?cvt(ulong) + 1)?cvt(cwp_t); Rx(rd,xx); }; sem restore { val xx = Rx(rs1) + get_src2(i,rs2,simm13) ; if(CANRESTORE?cvt(ulong) > 0) { CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); CANRESTORE = (CANRESTORE?cvt(ulong) - 1)?cvt(cwp_t); } else { restore_regs(CWP); if(CANSAVE?cvt(ulong) < 8 -2) CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); } CWP = ((CWP?cvt(ulong) + 8 - 1) % 8 )?bits(5); Rx(rd,xx); }; sem sethi { Rx(rd,imm22?ext(64)<<10); }; sem [ fadds fsubs fmuls fdivs ] { F4(rd, op(F4(rs1),F4(rs2))); } where op in [ + - * / ]; sem [ faddd fsubd fmuld fdivd ] { F8(rd, op(F8(rs1),F8(rs2))); } where op in [ + - * / ]; sem [ fcmps fcmpd ] { (f(rs1)-f(rs2))?cc(fcc[cond]); } where f in [F4 F8]; sem [ fcmpes fcmped ] { (f(rs1)-f(rs2))?cc(fcc[cond]); if(f_u(cond)) trap_sparc(0x21?ext(32) ,CWP,CANRESTORE); } where f in [F4 F8]; sem fstox { F8(rd,F4(rs2)?cvt(llong)?cast(ullong)); }; sem fdtox { F8(rd,F8(rs2)?cvt(llong)?cast(ullong)); }; sem fstoi { F4(rd,F4(rs2)?cvt(long)?cast(ulong)); }; sem fdtoi { F4(rd,F8(rs2)?cvt(long)?cast(ulong)); }; sem fstod { F8(rd,F4(rs2)?cvt(double)); }; sem fxtos { F4(rd,F8(rs2)?cast(llong)?cvt(float)); }; sem fxtod { F8(rd,F8(rs2)?cast(llong)?cvt(double)); }; sem fitos { F4(rd,F4(rs2)?cast(long)?cvt(float)); }; sem fitod { F8(rd,F4(rs2)?cast(long)?cvt(double)); }; sem fdtos { F4(rd,F8(rs2)?cvt(float)); }; sem [ fmovs fmovd ] { fd(rd,fs(rs2)); } where fs in [F4 F8], fd in [F4 F8]; sem [ fnegs fnegd ] { fd(rd,-fs(rs2)); } where fs in [F4 F8], fd in [F4 F8]; sem [ fabss fabsd ] { if(fs(rs2)<z) fd(rd,-fs(rs2)); else fd(rd,fs(rs2)); } where fs in [F4 F8], fd in [F4 F8], z in [ (0?cvt(float)) (0?cvt(double)) ]; sem fsmuld { F8(rd, F4(rs1)?cvt(double) * F4(rs2)?cvt(double)); }; sem [fsqrts fsqrtd] {fd(rd,sqrt(fs(rs2)));} where fs in [F4 F8], fd in [F4 F8]; sem [ ldf lddf ldfa lddfa ldsb ldsh ldsw ldub lduh lduw ldx ldd ldsba ldsha ldswa lduba lduha lduwa ldxa ldda ] { r(rd, m(Rx(rs1) + get_src2(i,rs2,simm13) )); } where r in [ F4 F8 F4 F8 Rx Rx Rx Rx Rx Rx Rx R8 Rx Rx Rx Rx Rx Rx Rx R8 ], m in [ M4 M8 M4 M8 M1s M2s M4s M1 M2 M4 M8 M8 M1s M2s M4s M1 M2 M4 M8 M8 ]; sem [ stf stdf stb sth stw stx std stfa stdfa stba stha stwa stxa stda ] { m(Rx(rs1) + get_src2(i,rs2,simm13) , r(rd)); } where r in [ F4 F8 Rx Rx Rx Rx R8 F4 F8 Rx Rx Rx Rx R8 ], m in [ M4 M8 M1 M2 M4 M8 M8 M4 M8 M1 M2 M4 M8 M8 ]; sem [ casa casxa ] { val aa = Rx(rs1); val xx = ms(aa); if(rsrc(rs2)?ext(64) == xx) md(aa,rsrc(rd)); rdest(rd,xx); } where rsrc in [R4 Rx], rdest in [R4 Rx], ms in [M4 M8], md in [M4 M8]; sem [ ldstub ldstuba ] { val aa=Rx(rs1)+ get_src2(i,rs2,simm13) ; Rx(rd,M1(aa)); M1(aa,0xff); }; sem [ swap swapa ] { val aa = Rx(rs1) + get_src2(i,rs2,simm13) ; val xx = M4(aa); M4(aa,R4(rd)); R4(rd,xx); }; sem ldfsr { set_FSR4(M4(Rx(rs1) + get_src2(i,rs2,simm13) )?bits(32)); }; sem ldxfsr { set_FSR8(M8(Rx(rs1) + get_src2(i,rs2,simm13) )); }; sem [ stfsr stxfsr ] { m(Rx(rs1) + get_src2(i,rs2,simm13) , r()); } where r in [ get_FSR4 get_FSR8 ], m in [ M4 M8 ];