📄 iu.c
字号:
reg.xer &= ~XER_OV; if(v>>1) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);}voiddivw(ulong ir){ int rd, ra, rb; getarrr(ir); if(reg.r[rb] != 0 && ((ulong)reg.r[ra] != 0x80000000 || reg.r[rb] != -1)) reg.r[rd] = reg.r[ra]/reg.r[rb]; else if(ir & OE) reg.xer |= XER_SO | XER_OV; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);}voiddivwu(ulong ir){ int rd, ra, rb; getarrr(ir); if(reg.r[rb] != 0) reg.r[rd] = (ulong)reg.r[ra]/(ulong)reg.r[rb]; else if(ir & OE) reg.xer |= XER_SO | XER_OV; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);}voidmcrxr(ulong ir){ int rd, ra, rb; getarrr(ir); if(rd & 3 || ra != 0 || rb != 0 || ir & Rc) undef(ir); rd >>= 2; reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, reg.xer>>28); reg.xer &= ~(0xF<<28);}voidmtcrf(ulong ir){ int rs, crm, i; ulong m; if(ir & ((1<<20)|(1<<11)|Rc)) undef(ir); rs = (ir>>21)&0x1F; crm = (ir>>12)&0xFF; m = 0; for(i = 0x80; i; i >>= 1) { m <<= 4; if(crm & i) m |= 0xF; } reg.cr = (reg.cr & ~m) | (reg.r[rs] & m);}voidmfcr(ulong ir){ int rd, ra, rb; getarrr(ir); if(ra != 0 || rb != 0 || ir & Rc) undef(ir); reg.r[rd] = reg.cr;}voidmulhw(ulong ir){ int rd, ra, rb; getarrr(ir); reg.r[rd] = ((vlong)(long)reg.r[ra]*(long)reg.r[rb])>>32; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb); /* BUG: doesn't set OV */}voidmulhwu(ulong ir){ int rd, ra, rb; getarrr(ir); reg.r[rd] = ((uvlong)(ulong)reg.r[ra]*(ulong)reg.r[rb])>>32; if(ir & Rc) setcr(0, reg.r[rd]); /* not sure whether CR setting is signed or unsigned */ if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb); /* BUG: doesn't set OV */}voidmullw(ulong ir){ int rd, ra, rb; getarrr(ir); reg.r[rd] = (uvlong)(ulong)reg.r[ra]*(ulong)reg.r[rb]; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb); /* BUG: doesn't set OV */}voidmulli(ulong ir){ int rd, ra; long imm; getairr(ir); reg.r[rd] = (uvlong)(ulong)reg.r[ra]*(ulong)imm; if(trace) itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);}voidnand(ulong ir){ int rs, ra, rb; getlrrr(ir); reg.r[ra] = ~(reg.r[rs] & reg.r[rb]); if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidneg(ulong ir){ int rd, ra, rb; getarrr(ir); if(rb) undef(ir); if(ir & OE) reg.xer &= ~XER_OV; if((ulong)reg.r[ra] == 0x80000000) { if(ir & OE) reg.xer |= XER_SO | XER_OV; reg.r[rd] = reg.r[ra]; } else reg.r[rd] = -reg.r[ra]; if(ir & Rc) setcr(0, reg.r[rd]);}voidnor(ulong ir){ int rs, ra, rb; getlrrr(ir); reg.r[ra] = ~(reg.r[rs] | reg.r[rb]); if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidor(ulong ir){ int rs, ra, rb; getlrrr(ir); reg.r[ra] = reg.r[rs] | reg.r[rb]; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) { if(rs == rb) itrace("mr%s\tr%d,r%d", ir&1?".":"", ra, rs); else itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb); }}voidorc(ulong ir){ int rs, ra, rb; getlrrr(ir); reg.r[ra] = reg.r[rs] | ~reg.r[rb]; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidori(ulong ir){ int rs, ra; ulong imm; getlirr(ir); reg.r[ra] = reg.r[rs] | imm; if(trace) itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);}voidoris(ulong ir){ int rs, ra; ulong imm; getlirr(ir); reg.r[ra] = reg.r[rs] | (imm<<16); if(trace) itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);}static ulongmkmask(int mb, int me){ int i; ulong v; if(mb > me) return mkmask(0, me) | mkmask(mb, 31); v = 0; for(i=mb; i<=me; i++) v |= 1L << (31-i); /* don't need a loop, but i'm lazy */ return v;}static ulongrotl(ulong v, int sh){ if(sh == 0) return v; return (v<<sh) | (v>>(32-sh));}voidrlwimi(ulong ir){ int rs, ra, rb, sh; ulong m; getlrrr(ir); sh = rb; m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F); reg.r[ra] = (reg.r[ra] & ~m) | (rotl(reg.r[rs], sh) & m); if(trace) itrace("%s\tr%d,r%d,%d,#%lux", ci->name, ra, rs, sh, m); if(ir & 1) setcr(0, reg.r[ra]);}voidrlwinm(ulong ir){ int rs, ra, rb, sh; ulong m; getlrrr(ir); sh = rb; m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F); reg.r[ra] = rotl(reg.r[rs], sh) & m; if(trace) itrace("%s%s\tr%d,r%d,%d,#%lux", ci->name, ir&Rc?".":"", ra, rs, sh, m); if(ir & Rc) setcr(0, reg.r[ra]);}voidrlwnm(ulong ir){ int rs, ra, rb, sh; ulong m; getlrrr(ir); sh = reg.r[rb] & 0x1F; m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F); reg.r[ra] = rotl(reg.r[rs], sh) & m; if(trace) itrace("%s\tr%d,r%d,r%d,#%lux", ci->name, ra, rs, rb, m); if(ir & 1) setcr(0, reg.r[ra]);}voidslw(ulong ir){ int rs, ra, rb; long v; getlrrr(ir); v = reg.r[rb]; if((v & 0x20) == 0) { v &= 0x1F; reg.r[ra] = (ulong)reg.r[rs] << v; } else reg.r[ra] = 0; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidsraw(ulong ir){ int rs, ra, rb; long v; getlrrr(ir); v = reg.r[rb]; if((v & 0x20) == 0) { v &= 0x1F; if(reg.r[rs]&SIGNBIT && v) reg.r[ra] = reg.r[rs]>>v | ~((1<<(32-v))-1); else reg.r[ra] = reg.r[rs]>>v; } else reg.r[ra] = reg.r[rs]&SIGNBIT? ~0: 0; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidsrawi(ulong ir){ int rs, ra, rb; long v; getlrrr(ir); v = rb; if((v & 0x20) == 0) { v &= 0x1F; if(reg.r[rs]&SIGNBIT && v) reg.r[ra] = reg.r[rs]>>v | ~((1<<(32-v))-1); else reg.r[ra] = reg.r[rs]>>v; } else reg.r[ra] = reg.r[rs]&SIGNBIT? ~0: 0; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,$%d", ci->name, ir&1?".":"", ra, rs, v);}voidsrw(ulong ir){ int rs, ra, rb; long v; getlrrr(ir); v = reg.r[rb]; if((v & 0x20) == 0) reg.r[ra] = (ulong)reg.r[rs] >> (v&0x1F); else reg.r[ra] = 0; if(ir & Rc) setcr(0, reg.r[ra]); if(trace) itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);}voidsubf(ulong ir){ int rd, ra, rb; uvlong r; getarrr(ir); r = (uvlong)((ulong)~reg.r[ra]) + reg.r[rb] + 1; if(ir & OE) { reg.xer &= ~XER_OV; if(r >> 16) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);}voidsubfc(ulong ir){ int rd, ra, rb; ulong v; uvlong r; getarrr(ir); r = (uvlong)((ulong)~reg.r[ra]) + reg.r[rb] + 1; v = r>>32; reg.xer &= ~XER_CA; if(v) reg.xer |= XER_CA; if(ir & OE) { reg.xer &= ~XER_OV; if(v>>1) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);}voidsubfe(ulong ir){ int rd, ra, rb; ulong v; uvlong r; getarrr(ir); r = (uvlong)((ulong)~reg.r[ra]) + reg.r[rb] + (reg.xer&XER_CA)!=0; v = r>>32; reg.xer &= ~XER_CA; if(v) reg.xer |= XER_CA; if(ir & OE) { reg.xer &= ~XER_OV; if(v>>1) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);}voidsubfic(ulong ir){ int rd, ra; long imm; ulong v; uvlong r; getairr(ir); r = (uvlong)((ulong)~reg.r[ra]) + imm + 1; v = r>>32; reg.xer &= ~XER_CA; if(v) reg.xer |= XER_CA; reg.r[rd] = (ulong)r; if(trace) itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);}voidsubfme(ulong ir){ int rd, ra, rb; ulong v; uvlong r; getarrr(ir); if(rb) undef(ir); r = (uvlong)((ulong)~reg.r[ra]) + 0xFFFFFFFF + (reg.xer&XER_CA)!=0; v = r>>32; reg.xer &= ~XER_CA; if(v) reg.xer |= XER_CA; if(ir & OE) { reg.xer &= ~XER_OV; if(v>>1) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);}voidsubfze(ulong ir){ int rd, ra, rb; ulong v; uvlong r; getarrr(ir); if(rb) undef(ir); r = (uvlong)((ulong)~reg.r[ra]) + (reg.xer&XER_CA)!=0; v = r>>32; reg.xer &= ~XER_CA; if(v) reg.xer |= XER_CA; if(ir & OE) { reg.xer &= ~XER_OV; if(v>>1) reg.xer |= XER_SO | XER_OV; } reg.r[rd] = (ulong)r; if(ir & Rc) setcr(0, reg.r[rd]); if(trace) itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);}voidxor(ulong ir){ int rs, ra, rb; getlrrr(ir); reg.r[ra] = reg.r[rs] ^ reg.r[rb]; if(trace) itrace("%s\tr%d,r%d,r%d", ci->name, ra, rs, rb);}voidxori(ulong ir){ int rs, ra; ulong imm; getlirr(ir); reg.r[ra] = reg.r[rs] ^ imm; if(trace) itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);}voidxoris(ulong ir){ int rs, ra; ulong imm; getlirr(ir); reg.r[ra] = reg.r[rs] ^ (imm<<16); if(trace) itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);}voidlwz(ulong ir){ ulong ea; int ra, rd, upd; long imm; getairr(ir); ea = imm; upd = (ir&(1L<<26))!=0; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; } else { if(upd) undef(ir); } if(trace) itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea); reg.r[rd] = getmem_w(ea);}voidlwzx(ulong ir){ ulong ea; int rb, ra, rd, upd; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==55; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea); } else { if(upd) undef(ir); if(trace) itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea); } reg.r[rd] = getmem_w(ea);}voidlwarx(ulong ir){ lwzx(ir);}voidlbz(ulong ir){ ulong ea; int ra, rd, upd; long imm; getairr(ir); ea = imm; upd = (ir&(1L<<26))!=0; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; } else { if(upd) undef(ir); } if(trace) itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea); reg.r[rd] = getmem_b(ea);}voidlbzx(ulong ir){ ulong ea; int rb, ra, rd, upd; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==119; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea); } else { if(upd) undef(ir); if(trace) itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea); } reg.r[rd] = getmem_b(ea);}voidstw(ulong ir){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -