📄 iu.c
字号:
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) #%lux=#%lux (%ld)", ci->name, rd, imm, ra, ea, reg.r[rd], reg.r[rd]); putmem_w(ea, reg.r[rd]);}voidstwx(ulong ir){ ulong ea; int ra, rd, upd, rb; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==183; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; if(trace) itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)", ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]); } else { if(upd) undef(ir); if(trace) itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)", ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]); } putmem_w(ea, reg.r[rd]);}voidstwcx(ulong ir){ ulong ea; int ra, rd, rb; if((ir & Rc) == 0) undef(ir); getarrr(ir); ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)", ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]); } else { if(trace) itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)", ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]); } putmem_w(ea, reg.r[rd]); /* assume a reservation exists; store succeeded */ setcr(0, 0);}voidstb(ulong ir){ ulong ea; int ra, rd, upd, v; 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); } v = reg.r[rd] & 0xFF; if(trace) itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)", ci->name, rd, imm, ra, ea, v, v); putmem_b(ea, v);}voidstbx(ulong ir){ ulong ea; int ra, rd, upd, rb, v; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==247; v = reg.r[rd] & 0xFF; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; if(trace) itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)", ci->name, rd, ra, rb, ea, v, v); } else { if(upd) undef(ir); if(trace) itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)", ci->name, rd, rb, ea, v, v); } putmem_b(ea, v);}voidlhz(ulong ir){ ulong ea; int imm, ra, rd, upd; 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_h(ea);}voidlhzx(ulong ir){ ulong ea; int rb, ra, rd, upd; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==311; 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_h(ea);}voidlha(ulong ir){ ulong ea; int imm, ra, rd, upd; 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] = (short)getmem_h(ea);}voidlhax(ulong ir){ ulong ea; int rb, ra, rd, upd; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==311; 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] = (short)getmem_h(ea);}voidlhbrx(ulong ir){ ulong ea; int rb, ra, rd; ulong v; getarrr(ir); ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea); } else { if(trace) itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea); } v = getmem_h(ea); reg.r[rd] = ((v&0xFF)<<8)|(v&0xFF);}voidsth(ulong ir){ ulong ea; int imm, ra, rd, upd, v; 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); } v = reg.r[rd] & 0xFFFF; if(trace) itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)", ci->name, rd, imm, ra, ea, v, v); putmem_h(ea, v);}voidsthx(ulong ir){ ulong ea; int ra, rd, upd, rb, v; getarrr(ir); ea = reg.r[rb]; upd = getxo(ir)==247; v = reg.r[rd] & 0xFFFF; if(ra) { ea += reg.r[ra]; if(upd) reg.r[ra] = ea; if(trace) itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)", ci->name, rd, ra, rb, ea, v, v); } else { if(upd) undef(ir); if(trace) itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)", ci->name, rd, rb, ea, v, v); } putmem_h(ea, v);}voidsthbrx(ulong ir){ ulong ea; int ra, rd, rb; ulong v; getarrr(ir); ea = reg.r[rb]; v = reg.r[rd]; v = ((v&0xFF)<<8)|(v&0xFF); if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)", ci->name, rd, ra, rb, ea, v, v); } else { if(trace) itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)", ci->name, rd, rb, ea, v, v); } putmem_h(ea, v);}voidlwbrx(ulong ir){ ulong ea; int rb, ra, rd, i; ulong v; getarrr(ir); if(ir & Rc) undef(ir); ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea); } else { if(trace) itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea); } v = 0; for(i = 0; i < 4; i++) v = v>>8 | getmem_b(ea++); /* assume unaligned load is allowed */ reg.r[rd] = v;}voidstwbrx(ulong ir){ ulong ea; int rb, ra, rd, i; ulong v; getarrr(ir); if(ir & Rc) undef(ir); ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea); } else { if(trace) itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea); } v = 0; for(i = 0; i < 4; i++) { putmem_b(ea++, v & 0xFF); /* assume unaligned store is allowed */ v >>= 8; }}voidlswi(ulong ir){ ulong ea; int rb, ra, rd, n, i, r, b; getarrr(ir); if(ir & Rc) undef(ir); n = rb; if(n == 0) n = 32; ea = 0; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea); } else { if(trace) itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n); } i = -1; r = rd-1; while(--n >= 0) { if(i < 0) { r = (r+1)&0x1F; if(ra == 0 || r != ra) reg.r[r] = 0; i = 24; } b = getmem_b(ea++); if(ra == 0 || r != ra) reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i); i -= 8; }}voidlswx(ulong ir){ ulong ea; int rb, ra, rd, n, i, r, b; getarrr(ir); if(ir & Rc) undef(ir); n = reg.xer & 0x7F; ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n); } else { if(trace) itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n); } i = -1; r = rd-1; while(--n >= 0) { if(i < 0) { r = (r+1)&0x1F; if((ra == 0 || r != ra) && r != rb) reg.r[r] = 0; i = 24; } b = getmem_b(ea++); if((ra == 0 || r != ra) && r != rb) reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i); i -= 8; }}voidstswx(ulong ir){ ulong ea; int rb, ra, rd, n, i, r; getarrr(ir); if(ir & Rc) undef(ir); n = reg.xer & 0x7F; ea = reg.r[rb]; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n); } else { if(trace) itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n); } i = -1; r = rd-1; while(--n >= 0) { if(i < 0) { r = (r+1)&0x1F; i = 24; } putmem_b(ea++, (reg.r[r]>>i)&0xFF); i -= 8; }}voidstswi(ulong ir){ ulong ea; int rb, ra, rd, n, i, r; getarrr(ir); if(ir & Rc) undef(ir); n = rb; if(n == 0) n = 32; ea = 0; if(ra) { ea += reg.r[ra]; if(trace) itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea); } else { if(trace) itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n); } i = -1; r = rd-1; while(--n >= 0) { if(i < 0) { r = (r+1)&0x1F; i = 24; } putmem_b(ea++, (reg.r[r]>>i)&0xFF); i -= 8; }}voidlmw(ulong ir){ ulong ea; int ra, rd, r; long imm; getairr(ir); ea = imm; if(ra) ea += reg.r[ra]; if(trace) itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea); for(r = rd; r <= 31; r++) { if(r != 0 && r != rd) reg.r[rd] = getmem_w(ea); ea += 4; }}voidstmw(ulong ir){ ulong ea; int ra, rd, r; long imm; getairr(ir); ea = imm; if(ra) ea += reg.r[ra]; if(trace) itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea); for(r = rd; r <= 31; r++) { putmem_w(ea, reg.r[rd]); ea += 4; }}voidtwi(ulong ir){ int rd, ra; long a, imm; getairr(ir); a = reg.r[ra]; if(trace) itrace("twi\t#%.2x,r%d,$0x%lux (%ld)", rd, ra, imm, imm); if(a < imm && rd&0x10 || a > imm && rd&0x08 || a == imm && rd&0x04 || (ulong)a < imm && rd&0x02 || (ulong)a > imm && rd&0x01) { Bprint(bioout, "program_exception (trap type)\n"); longjmp(errjmp, 0); }}voidtw(ulong ir){ int rd, ra, rb; long a, b; getarrr(ir); a = reg.r[ra]; b = reg.r[rb]; if(trace) itrace("tw\t#%.2x,r%d,r%d", rd, ra, rb); if(a < b && rd&0x10 || a > b && rd&0x08 || a == b && rd&0x04 || (ulong)a < b && rd&0x02 || (ulong)a > b && rd&0x01) { Bprint(bioout, "program_exception (trap type)\n"); longjmp(errjmp, 0); }}voidsync(ulong ir){ USED(ir); if(trace) itrace("sync");}voidicbi(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbf(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbst(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbt(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbtst(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbz(ulong ir){ int rd, ra, rb; if(ir & Rc) undef(ir); getarrr(ir); USED(rd); if(trace) itrace("%s\tr%d,r%d", ci->name, ra, rb);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -