Handy enumeration for flag calculation helper functions (xer_ca, ov)
*/
enum {
- PPC_FLAG_OP_ADD, // addc, addo, addic
- PPC_FLAG_OP_ADDE, // adde, addeo
- PPC_FLAG_OP_ADDME, // addme, addmeo
- PPC_FLAG_OP_ADDZE, // addze, addzeo
- PPC_FLAG_OP_DIVW, // divwo
- PPC_FLAG_OP_DIVWU, // divwuo
- PPC_FLAG_OP_MULLW, // mullwo
- PPC_FLAG_OP_NEG, // nego
- PPC_FLAG_OP_SUBF, // subfo
- PPC_FLAG_OP_SUBFC, // subfc, subfco
- PPC_FLAG_OP_SUBFE, // subfe, subfeo
- PPC_FLAG_OP_SUBFI, // subfic
- PPC_FLAG_OP_SUBFME, // subfme, subfmeo
- PPC_FLAG_OP_SUBZE, // subfze, subfzeo
- PPC_FLAG_OP_SHR // srawi
+ PPC32G_FLAG_OP_ADD, // addc, addo, addic
+ PPC32G_FLAG_OP_ADDE, // adde, addeo
+ PPC32G_FLAG_OP_ADDME, // addme, addmeo
+ PPC32G_FLAG_OP_ADDZE, // addze, addzeo
+ PPC32G_FLAG_OP_DIVW, // divwo
+ PPC32G_FLAG_OP_DIVWU, // divwuo
+ PPC32G_FLAG_OP_MULLW, // mullwo
+ PPC32G_FLAG_OP_NEG, // nego
+ PPC32G_FLAG_OP_SUBF, // subfo
+ PPC32G_FLAG_OP_SUBFC, // subfc, subfco
+ PPC32G_FLAG_OP_SUBFE, // subfe, subfeo
+ PPC32G_FLAG_OP_SUBFI, // subfic
+ PPC32G_FLAG_OP_SUBFME, // subfme, subfmeo
+ PPC32G_FLAG_OP_SUBZE, // subfze, subfzeo
+ PPC32G_FLAG_OP_SHR // srawi
};
ULong ul_tmp=0;
switch (op) {
- case PPC_FLAG_OP_ADD: // addo, addc
- case PPC_FLAG_OP_ADDE: // addeo
+ case PPC32G_FLAG_OP_ADD: // addo, addc
+ case PPC32G_FLAG_OP_ADDE: // addeo
return ((arg1^arg2^-1) & (arg1^res) & (1<<31)) ? 1:0;
// i.e. ((both_same_sign) & (sign_changed) & (sign_mask))
- case PPC_FLAG_OP_ADDME: // addmeo
+ case PPC32G_FLAG_OP_ADDME: // addmeo
return ((arg1) & (arg1 ^ res) & (1<<31)) ? 1:0;
// i.e. (neg & (sign_changed) & sign_mask)
- case PPC_FLAG_OP_ADDZE: // addzeo
+ case PPC32G_FLAG_OP_ADDZE: // addzeo
return ((arg1^(-1)) & (arg1 ^ res) & (1<<31)) ? 1:0;
// i.e. (pos & (sign_changed) & sign_mask)
- case PPC_FLAG_OP_DIVW: // divwo
+ case PPC32G_FLAG_OP_DIVW: // divwo
return ((arg1 == INT32_MIN && arg2 == -1) || arg2 == 0) ? 1:0;
- case PPC_FLAG_OP_DIVWU: // divwuo
+ case PPC32G_FLAG_OP_DIVWU: // divwuo
return (arg2 == 0) ? 1:0;
- case PPC_FLAG_OP_MULLW: // mullwo
+ case PPC32G_FLAG_OP_MULLW: // mullwo
ul_tmp = (ULong)arg1 * (ULong)arg2;
return (res != res) ? 1:0;
- case PPC_FLAG_OP_NEG: // nego
+ case PPC32G_FLAG_OP_NEG: // nego
return (arg1 == 0x80000000) ? 1:0;
- case PPC_FLAG_OP_SUBF: // subfo
- case PPC_FLAG_OP_SUBFC: // subfco
- case PPC_FLAG_OP_SUBFE: // subfeo
+ case PPC32G_FLAG_OP_SUBF: // subfo
+ case PPC32G_FLAG_OP_SUBFC: // subfco
+ case PPC32G_FLAG_OP_SUBFE: // subfeo
return (((~arg1)^arg2^(-1)) & ((~arg1)^res) & (1<<31)) ? 1:0;
- case PPC_FLAG_OP_SUBFME: // subfmeo
+ case PPC32G_FLAG_OP_SUBFME: // subfmeo
return ((~arg1) & ((~arg1)^res) & (1<<31)) ? 1:0;
- case PPC_FLAG_OP_SUBZE: // subfzeo
+ case PPC32G_FLAG_OP_SUBZE: // subfzeo
return (((~arg1)^(-1)) & ((~arg1)^res) & (1<<31)) ? 1:0;
default:
UInt arg1, UInt arg2, UChar ca )
{
switch (op) {
- case PPC_FLAG_OP_ADD: // addc, addco, addic
- case PPC_FLAG_OP_ADDZE: // addze, addzeo
+ case PPC32G_FLAG_OP_ADD: // addc, addco, addic
+ case PPC32G_FLAG_OP_ADDZE: // addze, addzeo
return (res < arg1) ? 1:0;
- case PPC_FLAG_OP_ADDE: // adde, addeo
+ case PPC32G_FLAG_OP_ADDE: // adde, addeo
return (res < arg1 || (ca==1 && res==arg1)) ? 1:0;
- case PPC_FLAG_OP_ADDME: // addme, addmeo
+ case PPC32G_FLAG_OP_ADDME: // addme, addmeo
return (arg1 != 0) ? 1:0;
- case PPC_FLAG_OP_SUBFC: // subfc, subfco
- case PPC_FLAG_OP_SUBFI: // subfic
- case PPC_FLAG_OP_SUBZE: // subfze, subfzeo
+ case PPC32G_FLAG_OP_SUBFC: // subfc, subfco
+ case PPC32G_FLAG_OP_SUBFI: // subfic
+ case PPC32G_FLAG_OP_SUBZE: // subfze, subfzeo
return (res <= arg2) ? 1:0;
- case PPC_FLAG_OP_SUBFE: // subfe, subfeo
+ case PPC32G_FLAG_OP_SUBFE: // subfe, subfeo
return ((res < arg2) || (ca == 1 && res == arg2)) ? 1:0;
- case PPC_FLAG_OP_SUBFME: // subfme, subfmeo
+ case PPC32G_FLAG_OP_SUBFME: // subfme, subfmeo
return (res != -1) ? 1:0;
- case PPC_FLAG_OP_SHR: // srawi
+ case PPC32G_FLAG_OP_SHR: // srawi
// res = arg1 >> arg2
return (arg1 < 0 && (arg1 & arg2) != 0) ? 1:0;
case 0x0D: // addic (Add Immediate Carrying)
assign( Rd, binop( Iop_Add32, mkexpr(Ra), mkU32(EXTS_SIMM) ) );
- mk_ppc32g_set_xer_ca( PPC_FLAG_OP_ADD, Rd, Ra, Rb );
+ mk_ppc32g_set_xer_ca( PPC32G_FLAG_OP_ADD, Rd, Ra, Rb );
DIP("addic %i,%i,0x%x\n", Rd_addr, Ra_addr, SIMM_16);
break;
case 0x0E: // addic. (Add Immediate Carrying and Record)
assign( Rd, binop( Iop_Add32, mkexpr(Ra), mkU32(EXTS_SIMM) ) );
- mk_ppc32g_set_xer_ca( PPC_FLAG_OP_ADD, Rd, Ra, Rb );
+ mk_ppc32g_set_xer_ca( PPC32G_FLAG_OP_ADD, Rd, Ra, Rb );
setFlags_CR0_Result( Rd );
DIP("addic. %i,%i,0x%x\n", Rd_addr, Ra_addr, SIMM_16);
case 0x10A: // add (Add)
assign( Rd, binop(Iop_Add32, mkexpr(Ra), mkexpr(Rb)) );
if (flag_Rc) { setFlags_CR0_Result( Rd ); }
- if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC_FLAG_OP_ADD, Rd, Ra, Rb ); }
+ if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC32G_FLAG_OP_ADD, Rd, Ra, Rb ); }
DIP("add%s%s %i,%i,%i\n",
flag_OE ? "o" : "", flag_Rc ? "." : "",
case 0x00A: // addc (Add Carrying)
assign( Rd, binop(Iop_Add32, mkexpr(Ra), mkexpr(Rb)) );
if (flag_Rc) { setFlags_CR0_Result( Rd ); }
- mk_ppc32g_set_xer_ca( PPC_FLAG_OP_ADD, Rd, Ra, Rb );
- if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC_FLAG_OP_ADD, Rd, Ra, Rb ); }
+ mk_ppc32g_set_xer_ca( PPC32G_FLAG_OP_ADD, Rd, Ra, Rb );
+ if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC32G_FLAG_OP_ADD, Rd, Ra, Rb ); }
DIP("addc%s%s %i,%i,%i\n",
flag_OE ? "o" : "", flag_Rc ? "." : "",
mkexpr(tmp)) );
if (flag_Rc) { setFlags_CR0_Result( Rd ); }
- mk_ppc32g_set_xer_ca( PPC_FLAG_OP_ADDE, Rd, Ra, Rb );
- if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC_FLAG_OP_ADDE, Rd, Ra, Rb ); }
+ mk_ppc32g_set_xer_ca( PPC32G_FLAG_OP_ADDE, Rd, Ra, Rb );
+ if (flag_OE) { mk_ppc32g_set_xer_ov_so( PPC32G_FLAG_OP_ADDE, Rd, Ra, Rb ); }
DIP("adde%s%s %i,%i,%i\n",
flag_OE ? "o" : "", flag_Rc ? "." : "",