📄 integer.c
字号:
sword_t a = GPR(RA); sword_t b = GPR(RB); if(b == 0) { /* divide by 0 */ if(OE) { SET_XER_OV; SET_XER_SO; } } else { if(a == 0x80000000 && b == 0xffffffff) { if(OE) { SET_XER_OV; SET_XER_SO; } } else { sword_t result = a / b; GPR(RD) = result; if(OE) RESET_XER_OV; if(Rc) COMPUTE_CR0(result); } }}void divwux_impl(ppc_inst_t inst){ word_t a = GPR(RA); word_t b = GPR(RB); if(b == 0) { /* divide by 0 */ if(OE) { SET_XER_OV; SET_XER_SO; } } else { word_t result = a / b; GPR(RD) = result; if(OE) RESET_XER_OV; if(Rc) COMPUTE_CR0(result); }}void mulhwx_impl(ppc_inst_t inst){ sdword_t a = (sword_t) GPR(RA); sdword_t b = (sword_t) GPR(RB); sdword_t result = a * b; result = (result >> 32); GPR(RD) = (sword_t) result; if(Rc) COMPUTE_CR0(result);}void mulhwux_impl(ppc_inst_t inst){ dword_t a = GPR(RA); dword_t b = GPR(RB); dword_t result = a * b; result = (result >> 32); GPR(RD) = (word_t) result; if(Rc) COMPUTE_CR0(result);}void mullwx_impl(ppc_inst_t inst){ sword_t a = GPR(RA); sword_t b = GPR(RB); sdword_t result = a * b; GPR(RD) = (sword_t)(result & 0x00000000ffffffff); if(OE) { if(result & 0xffffffff00000000) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_SO; } } if(Rc) COMPUTE_CR0(result);}void negx_impl(ppc_inst_t inst){ word_t result = -GPR(RA); GPR(RD) = result; if(OE) { if(GPR(RA) == 0x80000000) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}void subfx_impl(ppc_inst_t inst){ word_t a = GPR(RA); word_t b = GPR(RB); word_t result = b - a; GPR(RD) = result; if(OE) { if(Underflow(b, a)) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}void subfcx_impl(ppc_inst_t inst){ word_t a = GPR(RA); word_t b = GPR(RB); word_t result = b - a; GPR(RD) = result; if(a == 0 || Carry(b, -a)) SET_XER_CA; else RESET_XER_CA; if(OE) { if(Underflow(b, a)) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}void subfex_impl(ppc_inst_t inst){ word_t a = ~GPR(RA); word_t b = GPR(RB); word_t c = XER_CA; word_t result = a + b + c; GPR(RD) = result; if(Carry(a, b) || Carry(a + b, c)) SET_XER_CA; else RESET_XER_CA; if(OE) { if(Overflow(b, a) || Overflow(b + a, c)) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}void subfmex_impl(ppc_inst_t inst){ word_t a = ~GPR(RA); word_t c = XER_CA; word_t result = a + c - 1; GPR(RD) = result; if(Carry(a, c - 1)) SET_XER_CA; else RESET_XER_CA; if(OE) { if(Overflow(a, c - 1)) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}void subfzex_impl(ppc_inst_t inst){ word_t a = ~GPR(RA); word_t c = XER_CA; word_t result = a + c; GPR(RD) = result; if(Carry(a, c)) SET_XER_CA; else RESET_XER_CA; if(OE) { if(Overflow(a, c)) { SET_XER_OV; SET_XER_SO; } else { RESET_XER_OV; } } if(Rc) COMPUTE_CR0(result);}char *addi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ if(RA) buf += sprintf(buf, "\tGPR(%u) = GPR(%u) + (%d);\n", RD, RA, SEXT16(IMM)); else buf += sprintf(buf, "\tGPR(%u) = %d;\n", RD, SEXT16(IMM)); return buf;}char *addic_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA); buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM)); buf += sprintf(buf, "\tGPR(%u) = a + b;\n", RD); buf += sprintf(buf, "\tif(Carry(a, b))\n"); buf += sprintf(buf, "\t\tSET_XER_CA;\n"); buf += sprintf(buf, "\telse\n"); buf += sprintf(buf, "\t\tRESET_XER_CA;\n"); return buf;}char *addicd_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA); buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM)); buf += sprintf(buf, "\tword_t result = a + b;\n"); buf += sprintf(buf, "\tGPR(%u) = result;\n", RD); buf += sprintf(buf, "\tif(Carry(a, b))\n"); buf += sprintf(buf, "\t\tSET_XER_CA;\n"); buf += sprintf(buf, "\telse\n"); buf += sprintf(buf, "\t\tRESET_XER_CA;\n"); buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;} char *addis_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ if(RA) buf += sprintf(buf, "\tGPR(%u) = GPR(%u) + (%d);\n", RD, RA, (SEXT16(IMM) << 16)); else buf += sprintf(buf, "\tGPR(%u) = %d;\n", RD, (SEXT16(IMM) << 16)); return buf;}char *andid_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = GPR(%u) & %u;\n", RS, IMM); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR0_LT; else RESET_CR0_LT;\n"); buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR0_GT; else RESET_CR0_GT;\n"); buf += sprintf(buf, "\tif(result == 0) SET_CR0_EQ; else RESET_CR0_EQ;\n"); buf += sprintf(buf, "\tif(XER_SO) SET_CR0_SO; else RESET_CR0_SO;\n"); return buf;}char *andisd_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = GPR(%u) & %u;\n", RS, (IMM << 16)); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR0_LT; else RESET_CR0_LT;\n"); buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR0_GT; else RESET_CR0_GT;\n"); buf += sprintf(buf, "\tif(result == 0) SET_CR0_EQ; else RESET_CR0_EQ;\n"); buf += sprintf(buf, "\tif(XER_SO) SET_CR0_SO; else RESET_CR0_SO;\n"); return buf;}char *cmpi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = GPR(%u) - (%d);\n", RA, SEXT16(IMM)); buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(result == 0) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD); return buf;}char *cmpli_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA); buf += sprintf(buf, "\tword_t b = %u;\n", IMM); buf += sprintf(buf, "\tif(a < b) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(a > b) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(a == b) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD); return buf;}char *mulli_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tGPR(%u) = GPR(%u) * (%d);\n", RD, RA, SEXT16(IMM)); return buf;} char *ori_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tGPR(%u) = GPR(%u) | %u;\n", RA, RS, IMM); return buf;}char *oris_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tGPR(%u) = GPR(%u) | %u;\n", RA, RS, (IMM << 16)); return buf;}char *subfic_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA); buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM)); buf += sprintf(buf, "\tGPR(%u) = b - a;\n", RD); buf += sprintf(buf, "\tif(a == 0 || Carry(-a, b)) SET_XER_CA; else RESET_XER_CA;\n"); return buf;}char *twi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tabort();\n"); return buf;}char *xori_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tGPR(%u) = GPR(%u) ^ %u;\n", RA, RS, IMM); return buf;}char *xoris_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tGPR(%u) = GPR(%u) ^ %u;\n", RA, RS, (IMM << 16)); return buf;}char *rlwimix_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), %u);\n", RS, SH); buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME); buf += sprintf(buf, "\tword_t result = (r & m) | (GPR(%u) & (~m));\n", RA); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *rlwinmx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), %u);\n", RS, SH); buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME); buf += sprintf(buf, "\tword_t result = r & m;\n"); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *rlwnmx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), GPR(%u) & 0x1f);\n", RS, RB); buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME); buf += sprintf(buf, "\tword_t result = r & m;\n"); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *andx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tUInt32 result = GPR(%u) & GPR(%u);\n", RS, RB); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *andcx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = GPR(%u) & (~GPR(%u));\n", RS, RB); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *cmp_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = GPR(%u) - GPR(%u);\n", RA, RB); buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(result == 0) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD); return buf;}char *cmpl_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA); buf += sprintf(buf, "\tword_t b = GPR(%u);\n", RB); buf += sprintf(buf, "\tif(a < b) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(a > b) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(a == b) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD); buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD); return buf;}char *cntlzwx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t n = 0;\n"); buf += sprintf(buf, "\tword_t m = 1 << 31;\n"); buf += sprintf(buf, "\twhile(n < 32)\n"); buf += sprintf(buf, "\t{\n"); buf += sprintf(buf, "\t\tif(GPR(%u) & m) break;\n", RS); buf += sprintf(buf, "\t\tm >>= 1;\n"); buf += sprintf(buf, "\t\tn++;\n"); buf += sprintf(buf, "\t}\n"); buf += sprintf(buf, "\tGPR(%u) = n;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(n);\n"); return buf;}char *eqvx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = ~(GPR(%u) ^ GPR(%u));\n", RS, RB); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *extsbx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = (word_t)(sword_t)(sbyte_t)(byte_t) GPR(%u);\n", RS); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}char *extshx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){ buf += sprintf(buf, "\tword_t result = (word_t)(sword_t)(shalfword_t)(halfword_t) GPR(%u);\n", RS); buf += sprintf(buf, "\tGPR(%u) = result;\n", RA); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n"); return buf;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -