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 ];