sem call { set_op(new_inst,0 ,0 ,0 ); Rx_dest(new_inst,15); rmap_write(0,PC?addr,instq?length()); nPC2 = PC + disp30?sext(32)<<2; new_inst.taken = true; is_call = true; }; sem jmpl { set_op(new_inst,188 ,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); rmap_write(0,PC?addr,instq?length()); new_inst.taken = true; is_jmpl = true; }; sem retrn { set_op(new_inst,187 ,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; window_restore(new_inst); new_inst.taken = true; is_jmpl = true; }; sem [ brz brlez brlz brnz brgz brgez ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); val target = PC+(d16hi?sext(32)<<16)|(d16lo?ext(32)<<2); new_inst.srcq?push_back(literal_src(target?addr)); if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; } is_ccti = true; } where Op in [ 1 2 3 4 5 6 ]; sem [ fba ba ] { set_op(new_inst,0 ,0 ,0 ); nPC2 = PC + disp22?sext(32)<<2; new_inst.taken = true; if(a) { nPC = nPC2; nPC2 = nPC + 4; } }; sem [ fbpa bpa ] { set_op(new_inst,0 ,0 ,0 ); nPC2 = PC + disp19?sext(32)<<2; new_inst.taken = true; if(a) { nPC = nPC2; nPC2 = nPC + 4; } }; sem [ fbn fbpn bn bpn ] { set_op(new_inst,0 ,0 ,0 ); if(a) { nPC = nPC2; nPC2 = nPC + 4; } }; sem [ fbu fbg fbug fbl fbul fblg fbne fbe fbue fbge fbuge fble fbule fbo ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(10 ,0)); val target = PC+disp22?sext(32)<<2; new_inst.srcq?push_back(literal_src(target?addr)); if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; } else if(a) { nPC = nPC2; nPC2 = nPC + 4; } is_ccti = true; } where Op in [ 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ]; sem [ fbpu fbpg fbpug fbpl fbpul fbplg fbpne fbpe fbpue fbpge fbpuge fbple fbpule fbpo ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(10 ,bpccr)); val target = PC+disp19?sext(32)<<2; new_inst.srcq?push_back(literal_src(target?addr)); if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; } else if(a) { nPC = nPC2; nPC2 = nPC + 4; } is_ccti = true; } where Op in [ 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ]; sem [ bne be bg ble bge bl bgu bleu bcc bcs bpos bneg bvc bvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,0)); val target = PC+disp22?sext(32)<<2; new_inst.srcq?push_back(literal_src(target?addr)); if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; } else if(a) { nPC = nPC2; nPC2 = nPC + 4; } is_ccti = true; } where Op in [ 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ]; sem [ bpne bpe bpg bple bpge bpl bpgu bpleu bpcc bpcs bppos bpneg bpvc bpvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,bpcc1)); val target = PC+disp19?sext(32)<<2; new_inst.srcq?push_back(literal_src(target?addr)); if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; } else if(a) { nPC = nPC2; nPC2 = nPC + 4; } is_ccti = true; } where Op in [ 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ]; sem [ fmovfsn fmovfdn fmovsn fmovdn] { set_op(new_inst,0 ,0 ,0 ); }; sem [ fmovfsa fmovsa ] { set_op(new_inst,35 ,1 ,1); F4_src(new_inst,rs2); F4_dest(new_inst,rd); }; sem [ fmovfda fmovda ] { set_op(new_inst,35 ,1 ,1); F8_src(new_inst,rs2); F8_dest(new_inst,rd); }; sem [ fmovsne fmovse fmovsg fmovsle fmovsge fmovsl fmovsgu fmovsleu fmovscc fmovscs fmovspos fmovsneg fmovsvc fmovsvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,bpcc1)); F4_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [ 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ]; sem [ fmovdne fmovde fmovdg fmovdle fmovdge fmovdl fmovdgu fmovdleu fmovdcc fmovdcs fmovdpos fmovdneg fmovdvc fmovdvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,bpcc1)); F8_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [ 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ]; sem [ fmovfsu fmovfsg fmovfsug fmovfsl fmovfsul fmovfslg fmovfsne fmovfse fmovfsue fmovfsge fmovfsuge fmovfsle fmovfsule fmovfso ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(10 ,bpccr)); F4_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [ 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ]; sem [ fmovfdu fmovfdg fmovfdug fmovfdl fmovfdul fmovfdlg fmovfdne fmovfde fmovfdue fmovfdge fmovfduge fmovfdle fmovfdule fmovfdo ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(10 ,bpccr)); F8_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [ 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ]; sem [ fmovrsz fmovrslez fmovrslz fmovrsnz fmovrsgz fmovrsgez ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); F4_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [64 65 66 67 68 69 ]; sem [ fmovrdz fmovrdlez fmovrdlz fmovrdnz fmovrdgz fmovrdgez ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); F8_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [64 65 66 67 68 69 ]; sem [ mova movfa ] { set_op(new_inst,35 ,1 ,1); Rx_src(new_inst,rs2); Rx_dest(new_inst,rd); }; sem [ movne move movg movle movge movl movgu movleu movcc movcs movpos movneg movvc movvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,bpcc1)); Rx_src(new_inst,rs2); Rx_dest(new_inst,rd); } where Op in [ 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ]; sem [ movfu movfg movfug movfl movful movflg movfne movfe movfue movfge movfuge movfle movfule movfo ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(10 ,bpccr)); Rx_src(new_inst,rs2); Rx_dest(new_inst,rd); } where Op in [ 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ]; sem [ movrz movrlez movrlz movrnz movrgz movrgez ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); Rx_src(new_inst,rs2); Rx_dest(new_inst,rd); } where Op in [64 65 66 67 68 69 ]; sem tn { set_op(new_inst,0 ,0 ,0 ); }; sem ta { set_op(new_inst,70 ,1 ,1); if(i) new_inst.srcq?push_back(literal_src(sw_trap)); else Rx_src(new_inst,rs2); is_trap = true; }; sem [ tne te tg tle tge tl tgu tleu tcc tcs tpos tneg tvc tvs ] { set_op(new_inst,Op,1 ,1); new_inst.srcq?push_back(rmap_src(9 ,bpcc1)); if(i) new_inst.srcq?push_back(literal_src(sw_trap)); else Rx_src(new_inst,rs2); is_trap = true; } where Op in [ 71 72 73 74 75 76 77 78 79 80 81 82 83 84 ]; sem [ add sub and andn or orn xor xnor sll srl sra sllx srlx srax mulx sdivx udivx ] { set_op(new_inst,Op,1 ,ft); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); } where Op in [ 85 89 93 95 97 99 101 103 108 109 110 111 112 113 105 106 107 ], ft in [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 10 10 ]; sem [ addcc subcc andcc andncc orcc orncc xorcc xnorcc ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.destq?push_back(rmap_dest(9 ,0)); } where Op in [ 86 90 94 96 98 100 102 104 ]; sem [ addc subc ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.srcq?push_back(rmap_src(9 ,0)); } where Op in [ 87 91 ]; sem [ addccc subccc taddcc taddcctv tsubcc tsubcctv ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.srcq?push_back(rmap_src(9 ,0)); new_inst.destq?push_back(rmap_dest(9 ,0)); } where Op in [ 88 92 114 115 116 117 ]; sem [ udiv sdiv ] { set_op(new_inst,Op,1 ,10); new_inst.srcq?push_back(rmap_src(11 ,0)); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); } where Op in [118 119 ]; sem [ umul smul ] { set_op(new_inst,Op,1 ,2); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; new_inst.destq?push_back(rmap_dest(11 ,0)); Rx_dest(new_inst,rd); } where Op in [120 121 ]; sem [ udivcc sdivcc ] { set_op(new_inst,Op,1 ,10); new_inst.srcq?push_back(rmap_src(11 ,0)); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.destq?push_back(rmap_dest(9 ,0)); } where Op in [122 123 ]; sem [ umulcc smulcc ] { set_op(new_inst,Op,1 ,2); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; new_inst.destq?push_back(rmap_dest(11 ,0)); Rx_dest(new_inst,rd); new_inst.destq?push_back(rmap_dest(9 ,0)); } where Op in [124 125 ]; sem mulscc { set_op(new_inst,126 ,1 ,1); new_inst.srcq?push_back(rmap_src(11 ,0)); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; new_inst.srcq?push_back(rmap_src(9 ,0)); new_inst.destq?push_back(rmap_dest(11 ,0)); Rx_dest(new_inst,rd); new_inst.destq?push_back(rmap_dest(9 ,0)); }; sem popc { set_op(new_inst,127 ,1 ,1); Rx_src(new_inst,rs1); Rx_dest(new_inst,rd); }; sem flush { set_op(new_inst,0 ,0 ,0 ); }; sem flushw { set_op(new_inst,129 ,0 ,0 ); is_trap = true; }; sem rd { set_op(new_inst,130 ,1 ,1); switch(rs1?ext(32)) { case 0: new_inst.srcq?push_back(rmap_src(11 ,0)); case 2: new_inst.srcq?push_back(rmap_src(9 ,0)); case 5: new_inst.srcq?push_back(literal_src(PC?addr)); case 15: assert(rd?ext(32)==0); new_inst.op = 0 ?cvt(ushort); default: assert(false); } Rx_dest(new_inst,rd); }; sem wr { set_op(new_inst,131 ,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; switch(rd?ext(32)) { case 0: new_inst.destq?push_back(rmap_dest(11 ,0)); case 2: new_inst.destq?push_back(rmap_dest(9 ,0)); default: assert(false); } }; sem [ save restore ] { set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; adjust_window(new_inst); Rx_dest(new_inst,rd); } where adjust_window in [ window_save window_restore ], Op in [ 185 186 ]; sem sethi { set_op(new_inst,0 ,0 ,0 ); val literal = imm22?ext(64) << 10; new_inst.srcq?push_back(literal_src(literal)); Rx_dest(new_inst,rd); rmap_write(0,literal,instq?length()); }; sem [ fadds fsubs fmuls fdivs ] { set_op(new_inst,Op,2 ,ft); F4_src(new_inst,rs1); F4_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [ 133 135 157 159 ], ft in [ 1 1 2 10 ]; sem [ faddd fsubd fmuld fdivd ] { set_op(new_inst,Op,2 ,ft); F8_src(new_inst,rs1); F8_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [ 134 136 158 160 ], ft in [ 1 1 5 23 ]; sem fsmuld { set_op(new_inst,161 ,2 ,2); F4_src(new_inst,rs1); F4_src(new_inst,rs2); F8_dest(new_inst,rd); }; sem [ fcmps fcmpes ] { set_op(new_inst,Op,2 ,1); F4_src(new_inst,rs1); F4_src(new_inst,rs2); new_inst.destq?push_back(rmap_dest(10 ,cond)); } where Op in [ 137 139 ]; sem [ fcmpd fcmped ] { set_op(new_inst,Op,2 ,1); F8_src(new_inst,rs1); F8_src(new_inst,rs2); new_inst.destq?push_back(rmap_dest(10 ,cond)); } where Op in [ 138 140 ]; sem [ fstox fitod fstod ] { set_op(new_inst,Op,2 ,1); F4_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [ 141 149 145 ]; sem [ fdtox fxtod fmovd fnegd fabsd fsqrtd ] { set_op(new_inst,Op,2 ,1); F8_src(new_inst,rs2); F8_dest(new_inst,rd); } where Op in [ 142 147 152 154 156 163 ]; sem [ fxtos fdtos fdtoi ] { set_op(new_inst,Op,2 ,1); F8_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [ 146 150 144 ]; sem [ fitos fstoi fmovs fnegs fabss fsqrts ] { set_op(new_inst,Op,2 ,1); F4_src(new_inst,rs2); F4_dest(new_inst,rd); } where Op in [ 148 143 151 153 155 162 ]; sem [ ldf ldfa ] { set_op(new_inst,169 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; F4_dest(new_inst,rd); new_inst.align = 2?cvt(uchar); }; sem [ lddf lddfa ] { set_op(new_inst,171 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; F8_dest(new_inst,rd); new_inst.align = 3?cvt(uchar); }; sem [ ldsb ldsh ldsw ldub lduh lduw ldx ldsba ldsha ldswa lduba lduha lduwa ldxa ] { set_op(new_inst,Op,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.align = align?cvt(uchar); } where Op in [ 164 165 166 167 168 169 170 164 165 166 167 168 169 170 ], align in [ 0 1 2 0 1 2 3 0 1 2 0 1 2 3 ]; sem [ ldd ldda ] { set_op(new_inst,171 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; R8_dest(new_inst,rd); new_inst.align = 3?cvt(uchar); }; sem [ stf stfa ] { set_op(new_inst,176 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; F4_src(new_inst,rd); new_inst.align = 2?cvt(uchar); }; sem [ stdf stdfa ] { set_op(new_inst,178 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; F8_src(new_inst,rd); new_inst.align = 3?cvt(uchar); }; sem [ stb sth stw stx ] { set_op(new_inst,Op,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_src(new_inst,rd); new_inst.align = align?cvt(uchar); } where Op in [ 174 175 176 177 ], align in [ 0 1 2 3 ]; sem [ std stda ] { set_op(new_inst,178 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; R8_src(new_inst,rd); new_inst.align = 3?cvt(uchar); }; sem casa { set_op(new_inst,181 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_src(new_inst,rd); Rx_dest(new_inst,rd); new_inst.align = 2?cvt(uchar); }; sem casxa { set_op(new_inst,182 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; R8_src(new_inst,rd); R8_dest(new_inst,rd); new_inst.align = 3?cvt(uchar); }; sem [ ldstub ldstuba ] { set_op(new_inst,183 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd); new_inst.align = 0?cvt(uchar); }; sem [ prefetch prefetcha ] { set_op(new_inst,0 ,3 ,0 ); }; sem [ swap swapa ] { set_op(new_inst,184 ,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_src(new_inst,rd); Rx_dest(new_inst,rd); new_inst.align = 2?cvt(uchar); }; sem [ ldfsr ldxfsr ] { set_op(new_inst,Op,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; new_inst.destq?push_back(rmap_dest(12 ,0)); new_inst.align = align?cvt(uchar); is_trap = true; } where Op in [ 172 173 ], align in [ 2 3 ]; sem [ stfsr stxfsr ] { set_op(new_inst,Op,3 ,1); Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; new_inst.srcq?push_back(rmap_src(12 ,0)); new_inst.align = align?cvt(uchar); is_trap = true; } where Op in [ 179 180 ], align in [ 2 3 ];