fun execute(var inst : InstOp, inum) { val ftime = inst.ftime; if(ftime <= 0?cvt(uchar)) { inst.ftype = 6 ?cvt(uchar); return false; } if(inst.trap) { if(inum > 0) return false; } if(!srcs_ready(inst.srcq,inum)) return false; val ftype = inst.ftype; if(!fu_alloc(ftype)) return false; ftime = ftime - 1?cvt(uchar); inst.ftime = ftime; if(ftime > 0?cvt(uchar)) return false; if(!fu_finish(ftype,inst,inum)) return false; fun i1_src(ii) { return rmap_read(inst.srcq[+ii],inum)?cvt(uchar); } fun i2_src(ii) { return rmap_read(inst.srcq[+ii],inum)?cvt(ushort); } fun i4_src(ii) { return rmap_read(inst.srcq[+ii],inum)?cvt(ulong); } fun x8_src(ii) { return rmap_read(inst.srcq[+ii],inum)?cvt(ullong); } fun i8_src(ii) { return ((rmap_read(inst.srcq[+ii],inum)<<32) | (rmap_read(inst.srcq[+(ii+1)],inum)&0xffffffff?ext(64))); } fun f4_src(ii) { return rmap_read(inst.srcq[+ii],inum)?bits(32)?cast(float); } fun f8_src(ii) { return ((rmap_read(inst.srcq[+(ii+1)],inum)&0xffffffff?ext(64)) | (rmap_read(inst.srcq[+ii],inum)<<32))?cast(double); } fun cc_src(ii) { return rmap_read(inst.srcq[+ii],inum)?cvt(cc); } fun dest(outnum,value) { rmap_write(outnum,value,inum); } fun ddest(outnum,value) { rmap_write(outnum,value?cast(unsigned[64])?bits(32,63),inum); rmap_write(outnum+1,value?cast(unsigned[64])?bits(32),inum); } fun trap(tnum) { if(tnum == 3) { flush_windows(CWP,CANRESTORE); CANSAVE = (8 - 2)?cvt(cwp_t); CANRESTORE = 0?cvt(cwp_t); } else { trap_sparc(tnum+256,CWP,CANRESTORE); } is_trap = false; } val ccr; switch(inst.op?cvt(ulong)) { case 0 : ; case 1 : if(_z(x8_src(0)) != inst.taken) rollback = true; case 2 : if(_lez(x8_src(0)) != inst.taken) rollback = true; case 3 : if(_lz(x8_src(0)) != inst.taken) rollback = true; case 4 : if(_nz(x8_src(0)) != inst.taken) rollback = true; case 5 : if(_gz(x8_src(0)) != inst.taken) rollback = true; case 6 : if(_gez(x8_src(0)) != inst.taken) rollback = true; case 7 : if(f_u(cc_src(0)) != inst.taken) rollback = true; case 8 : if(f_g(cc_src(0)) != inst.taken) rollback = true; case 9 : if(f_ug(cc_src(0)) != inst.taken) rollback = true; case 10 : if(f_l(cc_src(0)) != inst.taken) rollback = true; case 11 : if(f_ul(cc_src(0)) != inst.taken) rollback = true; case 12 : if(f_lg(cc_src(0)) != inst.taken) rollback = true; case 13 : if(f_ne(cc_src(0)) != inst.taken) rollback = true; case 14 : if(f_e(cc_src(0)) != inst.taken) rollback = true; case 15 : if(f_ue(cc_src(0)) != inst.taken) rollback = true; case 16 : if(f_ge(cc_src(0)) != inst.taken) rollback = true; case 17 : if(f_uge(cc_src(0)) != inst.taken) rollback = true; case 18 : if(f_le(cc_src(0)) != inst.taken) rollback = true; case 19 : if(f_ule(cc_src(0)) != inst.taken) rollback = true; case 20 : if(f_o(cc_src(0)) != inst.taken) rollback = true; case 21 : if(i_ne(cc_src(0)) != inst.taken) rollback = true; case 22 : if(i_e(cc_src(0)) != inst.taken) rollback = true; case 23 : if(i_g(cc_src(0)) != inst.taken) rollback = true; case 24 : if(i_le(cc_src(0)) != inst.taken) rollback = true; case 25 : if(i_ge(cc_src(0)) != inst.taken) rollback = true; case 26 : if(i_l(cc_src(0)) != inst.taken) rollback = true; case 27 : if(i_gu(cc_src(0)) != inst.taken) rollback = true; case 28 : if(i_leu(cc_src(0)) != inst.taken) rollback = true; case 29 : if(i_cc(cc_src(0)) != inst.taken) rollback = true; case 30 : if(i_cs(cc_src(0)) != inst.taken) rollback = true; case 31 : if(i_pos(cc_src(0)) != inst.taken) rollback = true; case 32 : if(i_neg(cc_src(0)) != inst.taken) rollback = true; case 33 : if(i_vc(cc_src(0)) != inst.taken) rollback = true; case 34 : if(i_vs(cc_src(0)) != inst.taken) rollback = true; case 35 : dest(0,x8_src(0)); case 36 : if(i_ne(cc_src(0))) dest(0,x8_src(1)); case 37 : if(i_e(cc_src(0))) dest(0,x8_src(1)); case 38 : if(i_g(cc_src(0))) dest(0,x8_src(1)); case 39 : if(i_le(cc_src(0))) dest(0,x8_src(1)); case 40 : if(i_ge(cc_src(0))) dest(0,x8_src(1)); case 41 : if(i_l(cc_src(0))) dest(0,x8_src(1)); case 42 : if(i_gu(cc_src(0))) dest(0,x8_src(1)); case 43 : if(i_leu(cc_src(0))) dest(0,x8_src(1)); case 44 : if(i_cc(cc_src(0))) dest(0,x8_src(1)); case 45 : if(i_cs(cc_src(0))) dest(0,x8_src(1)); case 46 : if(i_pos(cc_src(0))) dest(0,x8_src(1)); case 47 : if(i_neg(cc_src(0))) dest(0,x8_src(1)); case 48 : if(i_vc(cc_src(0))) dest(0,x8_src(1)); case 49 : if(i_vs(cc_src(0))) dest(0,x8_src(1)); case 50 : if(f_u(cc_src(0))) dest(0,x8_src(1)); case 51 : if(f_g(cc_src(0))) dest(0,x8_src(1)); case 52 : if(f_ug(cc_src(0))) dest(0,x8_src(1)); case 53 : if(f_l(cc_src(0))) dest(0,x8_src(1)); case 54 : if(f_ul(cc_src(0))) dest(0,x8_src(1)); case 55 : if(f_lg(cc_src(0))) dest(0,x8_src(1)); case 56 : if(f_ne(cc_src(0))) dest(0,x8_src(1)); case 57 : if(f_e(cc_src(0))) dest(0,x8_src(1)); case 58 : if(f_ue(cc_src(0))) dest(0,x8_src(1)); case 59 : if(f_ge(cc_src(0))) dest(0,x8_src(1)); case 60 : if(f_uge(cc_src(0))) dest(0,x8_src(1)); case 61 : if(f_le(cc_src(0))) dest(0,x8_src(1)); case 62 : if(f_ule(cc_src(0))) dest(0,x8_src(1)); case 63 : if(f_o(cc_src(0))) dest(0,x8_src(1)); case 64 : if(_z(x8_src(0))) dest(0,x8_src(1)); case 65 : if(_lez(x8_src(0))) dest(0,x8_src(1)); case 66 : if(_lz(x8_src(0))) dest(0,x8_src(1)); case 67 : if(_nz(x8_src(0))) dest(0,x8_src(1)); case 68 : if(_gz(x8_src(0))) dest(0,x8_src(1)); case 69 : if(_gez(x8_src(0))) dest(0,x8_src(1)); case 70 : trap(i4_src(0)); case 71 : if(i_ne(cc_src(0))) trap(i4_src(1)); case 72 : if(i_e(cc_src(0))) trap(i4_src(1)); case 73 : if(i_g(cc_src(0))) trap(i4_src(1)); case 74 : if(i_le(cc_src(0))) trap(i4_src(1)); case 75 : if(i_ge(cc_src(0))) trap(i4_src(1)); case 76 : if(i_l(cc_src(0))) trap(i4_src(1)); case 77 : if(i_gu(cc_src(0))) trap(i4_src(1)); case 78 : if(i_leu(cc_src(0))) trap(i4_src(1)); case 79 : if(i_cc(cc_src(0))) trap(i4_src(1)); case 80 : if(i_cs(cc_src(0))) trap(i4_src(1)); case 81 : if(i_pos(cc_src(0))) trap(i4_src(1)); case 82 : if(i_neg(cc_src(0))) trap(i4_src(1)); case 83 : if(i_vc(cc_src(0))) trap(i4_src(1)); case 84 : if(i_vs(cc_src(0))) trap(i4_src(1)); case 85 : dest(0, x8_src(0) + x8_src(1)); case 89 : dest(0, x8_src(0) - x8_src(1)); case 93 : dest(0, x8_src(0) & x8_src(1)); case 95 : dest(0, x8_src(0) & ~x8_src(1)); case 97 : dest(0, x8_src(0) | x8_src(1)); case 99 : dest(0, x8_src(0) | ~x8_src(1)); case 101 : dest(0, x8_src(0) ^ x8_src(1)); case 103 : dest(0, x8_src(0) ^ ~x8_src(1)); case 86 : dest(0, (x8_src(0) + x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 90 : dest(0, (x8_src(0) - x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 94 : dest(0, (x8_src(0) & x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 96 : dest(0, (x8_src(0) & ~x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 98 : dest(0, (x8_src(0) | x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 100 : dest(0, (x8_src(0) | ~x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 102 : dest(0, (x8_src(0) ^ x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 104 : dest(0, (x8_src(0) ^ ~x8_src(1))?cc(ccr)); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 87 : dest(0, x8_src(0) + x8_src(1) + cc_src(2)?bit(0)?ext(64)); case 91 : dest(0, x8_src(0) - x8_src(1) - cc_src(2)?bit(0)?ext(64)); case 88 : val ccr2 = 0x00?cvt(cc); val x1 = x8_src(0); val x2 = x8_src(1); val xx = ((x1 + x2)?cc(ccr2) + cc_src(2)?bit(0)?ext(64))?cc(ccr); dest(0, xx); dest(1, ((ccr?bits(8) & 0b11011101) | (ccr2?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(unsigned[64])); case 92 : val ccr2 = 0x00?cvt(cc); val x1 = x8_src(0); val x2 = x8_src(1); val xx = ((x1 - x2)?cc(ccr2) - cc_src(2)?bit(0)?ext(64))?cc(ccr); dest(0, xx); dest(1, ((ccr?bits(8) & 0b11011101) | (ccr2?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(unsigned[64])); case 105 : dest(0, x8_src(0) * x8_src(1)); case 107 : dest(0, x8_src(0) / x8_src(1)); case 106 : dest(0, (+x8_src(0) / +x8_src(1)) ? cast(unsigned[64])); case 108 : dest(0, x8_src(0) << x8_src(1)?bits(5)); case 109 : dest(0, i4_src(0) >> x8_src(1)?bits(5)); case 110 : dest(0, (+i4_src(0) >> x8_src(1)?bits(5)) ? sext(64)); case 111 : dest(0, x8_src(0) << x8_src(1)?bits(6)); case 112 : dest(0, x8_src(0) >> x8_src(1)?bits(6)); case 113 : dest(0, (+x8_src(0) >> x8_src(1)?bits(6)) ? cast(unsigned[64])); case 114 : val x1 = x8_src(0); val x2 = x8_src(1); dest(0, (x1 + x2)?cc(ccr)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) ccr = (ccr?bits(8) | 0x02)?cvt(cc); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 115 : val x1 = x8_src(0); val x2 = x8_src(1); dest(0, (x1 + x2)?cc(ccr)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) ccr = (ccr?bits(8) | 0x02)?cvt(cc); dest(1, ccr?bits(8)?cvt(unsigned[64])); if(ccr?bit(1)) trap(0x23?ext(32) ); case 116 : val x1 = x8_src(0); val x2 = x8_src(1); dest(0, (x1 - x2)?cc(ccr)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) ccr = (ccr?bits(8) | 0x02)?cvt(cc); dest(1, ccr?bits(8)?cvt(unsigned[64])); case 117 : val x1 = x8_src(0); val x2 = x8_src(1); dest(0, (x1 - x2)?cc(ccr)); if(x1?bits(2)!=0b00 || x2?bits(2)!=0b00) ccr = (ccr?bits(8) | 0x02)?cvt(cc); dest(1, ccr?bits(8)?cvt(unsigned[64])); if(ccr?bit(1)) trap(0x23?ext(32) ); case 118 : val xx = (x8_src(0)<<32) | (x8_src(1)&((-1)?ext(64))); dest(0, u_div32(xx,x8_src(2),ccr)); case 119 : val xx = (x8_src(0)<<32) | (x8_src(1)&((-1)?ext(64))); dest(0, s_div32(xx,x8_src(2),ccr)); case 120 : val xx = (x8_src(0)&((-1)?ext(64))) * (x8_src(1)&((-1)?ext(64))); dest(0, xx >> 32); dest(1, xx?bits(32)?sext(64)); case 121 : val xx = +x8_src(0)?bits(32)?sext(64) * +x8_src(1)?bits(32)?sext(64); dest(0, xx >> 32); dest(1, xx?bits(32)?sext(64)); case 122 : val xx = (x8_src(0)<<32) | (x8_src(1)&((-1)?ext(64))); xx = u_div32(xx,x8_src(2),ccr); dest(0, xx); dest(1, get_div_mul_cc(xx,ccr)); case 123 : val xx = (x8_src(0)<<32) | (x8_src(1)&((-1)?ext(64))); xx = s_div32(xx,x8_src(2),ccr); dest(0, xx); dest(1, get_div_mul_cc(xx,ccr)); case 126 : val y0 = x8_src(0)?bit(0); ccr = cc_src(3); dest(0, (x8_src(0)>>1) | ((x8_src(1)&1?ext(64))<<31)); val xx = (i4_src(1)>>1) | ((ccr?bit(3)^ccr?bit(1))?ext(32)<<31); if(y0) dest(1, (xx + i4_src(2)?bits(32))?cc(ccr)); else dest(1, (xx + 0)?cc(ccr)); dest(2, ccr?bits(8)); case 127 : val xx = x8_src(0); val ii=0; val count=0?ext(64); while(ii < 64) { count = count + ((xx >> ii) & 0x1?ext(64)); ii = ii + 1; } dest(0, count); case 128 : cache_flush(); case 129 : trap(3); case 130 : dest(0, x8_src(0)); case 131 : dest(0, x8_src(0) ^ x8_src(1)); case 133 : dest(0, f4_src(0) + f4_src(1)); case 134 : ddest(0, f8_src(0) + f8_src(2)); case 135 : dest(0, f4_src(0) - f4_src(1)); case 136 : ddest(0, f8_src(0) - f8_src(2)); case 137 : (f4_src(0) - f4_src(1))?cc(ccr); dest(0, ccr?bits(8)); case 138 : (f8_src(0) - f8_src(2))?cc(ccr); dest(0, ccr?bits(8)); case 139 : (f4_src(0) - f4_src(1))?cc(ccr); dest(0, ccr?bits(8)); if(f_u(ccr)) trap(0x21?ext(32) ); case 140 : (f8_src(0) - f8_src(2))?cc(ccr); dest(0, ccr?bits(8)); if(f_u(ccr)) trap(0x21?ext(32) ); case 141 : ddest(0, f4_src(0)?cvt(signed[64])); case 142 : ddest(0, f8_src(0)?cvt(signed[64])); case 143 : dest(0, f4_src(0)?cvt(signed[32])); case 144 : dest(0, f8_src(0)?cvt(signed[32])); case 145 : ddest(0, f4_src(0)?cvt(double)); case 146 : dest(0, i8_src(0)?cast(signed[_])?cvt(float)); case 147 : ddest(0, i8_src(0)?cast(signed[_])?cvt(double)); case 148 : dest(0, i4_src(0)?cast(signed[_])?cvt(float)); case 149 : ddest(0, i4_src(0)?cast(signed[_])?cvt(double)); case 150 : dest(0, f8_src(0)?cvt(float)); case 151 : dest(0, f4_src(0)); case 152 : ddest(0, f8_src(0)); case 153 : dest(0, -f4_src(0)); case 154 : ddest(0, -f8_src(0)); case 155 : if(f4_src(0) < 0?cvt(float)) dest(0, -f4_src(0)); else dest(0, f4_src(0)); case 156 : if(f8_src(0) < 0?cvt(double)) ddest(0, -f8_src(0)); else ddest(0, f8_src(0)); case 157 : dest(0, f4_src(0) * f4_src(1)); case 158 : ddest(0, f8_src(0) * f8_src(2)); case 159 : dest(0, f4_src(0) / f4_src(1)); case 160 : ddest(0, f8_src(0) / f8_src(2)); case 161 : ddest(0, f4_src(0)?cvt(double) * f4_src(1)?cvt(double)); case 162 : dest(0, sqrt(f4_src(0))); case 163 : ddest(0, sqrt(f8_src(0))); case 164 : dest(0, M1s(x8_src(0) + x8_src(1))); case 165 : dest(0, M2s(x8_src(0) + x8_src(1))); case 166 : dest(0, M4s(x8_src(0) + x8_src(1))); case 167 : dest(0, M1(x8_src(0) + x8_src(1))); case 168 : dest(0, M2(x8_src(0) + x8_src(1))); case 169 : dest(0, M4(x8_src(0) + x8_src(1))); case 170 : dest(0, M8(x8_src(0) + x8_src(1))); case 171 : val xx = M8(x8_src(0) + x8_src(1)); dest(0, xx >> 32); dest(1, xx & (-1)?ext(64)); case 174 : M1(x8_src(0) + x8_src(1), i1_src(2)); case 175 : M2(x8_src(0) + x8_src(1), i2_src(2)); case 176 : M4(x8_src(0) + x8_src(1), i4_src(2)); case 177 : M8(x8_src(0) + x8_src(1), x8_src(2)); case 178 : M8(x8_src(0) + x8_src(1), i8_src(2)); case 181 : val aa = x8_src(0); val xx = M4(aa); if((x8_src(1)&(-1)?ext(64)) == xx) M4(aa,i4_src(2)); dest(0, xx); case 182 : val aa = x8_src(0); val xx = M8(aa); if(x8_src(1) == xx) M8(aa,x8_src(2)); dest(0, xx); case 183 : val aa = x8_src(0) + x8_src(1); dest(0, M1(aa)); M1(aa,0xff); case 184 : val aa = x8_src(0) + x8_src(1); val xx = M4(aa); M4(aa,i4_src(2)); dest(0, xx); case 172 : set_FSR4(M4(x8_src(0)+x8_src(1))?bits(32)); is_trap = false; case 173 : set_FSR8(M8(x8_src(0)+x8_src(1))); is_trap = false; case 179 : M4(x8_src(0)+x8_src(1),get_FSR4()); is_trap = false; case 180 : M8(x8_src(0)+x8_src(1),get_FSR8()); is_trap = false; case 185 : dest(0, x8_src(0) + x8_src(1)); if(inst.trap) { save_regs(CWP0,CANRESTORE); CANSAVE = (CANRESTORE?cvt(ulong) - 1)?cvt(cwp_t); CANRESTORE = 1?cvt(cwp_t); is_trap = false; } case 186 : dest(0, x8_src(0) + x8_src(1)); if(inst.trap) { restore_regs(CWP0); if(CANSAVE?cvt(ulong) < 8 -2) CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); is_trap = false; } case 187 : val npc = (x8_src(0) + x8_src(1))?cvt(stream)?static; if(inst.trap) { restore_regs(CWP0); if(CANSAVE?cvt(ulong) < 8 -2) CANSAVE = (CANSAVE?cvt(ulong) + 1)?cvt(cwp_t); is_trap = false; } if(instq?length() == inum+1) nPC = npc; else { assert(instq?length() == inum+2); instq[-1].npc = npc; PC = npc; if(!instq[-1].taken) nPC = PC + 4; } case 188 : val npc = (x8_src(0) + x8_src(1))?cvt(stream)?static; if(instq?length() == inum+1) nPC = npc; else { assert(instq?length() == inum+2); instq[-1].npc = npc; PC = npc; if(!instq[-1].taken) nPC = PC + 4; } case 189 : no_instruction(); is_trap = false; } return true; }