IRTemp tmpRs32 = newTemp(Ity_I32);
assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
- assign(tmpClz32, unop(Iop_Clz32, mkexpr(tmpRs32)));
+ assign(tmpClz32, unop(Iop_ClzNat32, mkexpr(tmpRs32)));
putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClz32), True));
} else {
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32, getIReg(rs))));
+ putIReg(rd, unop(Iop_ClzNat32, getIReg(rs)));
}
} else {
ILLEGAL_INSTRUCTON;
IRTemp tmpRs32 = newTemp(Ity_I32);
assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, mkexpr(tmpRs32), mkU32(0xffffffff)));
- assign(tmpClo32, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32, unop(Iop_Not32, mkexpr(tmpRs32)))));
+ assign(tmpClo32, unop(Iop_ClzNat32,
+ unop(Iop_Not32, mkexpr(tmpRs32))));
putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClo32), True));
break;
} else {
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0xffffffff)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32,
- unop(Iop_Not32, getIReg(rs)))));
+ putIReg(rd, unop(Iop_ClzNat32,
+ unop(Iop_Not32, getIReg(rs))));
}
} else {
ILLEGAL_INSTRUCTON;
case 1:
DIP("dclz r%u, r%u", rd, rs);
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ64, getIReg(rs), mkU64(0)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU64(0x00000040),
- unop(Iop_Clz64, getIReg(rs))));
+ putIReg(rd, unop(Iop_ClzNat64, getIReg(rs)));
break;
}
case 1:
DIP("dclo r%u, r%u", rd, rs);
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ64, getIReg(rs),
- mkU64(0xffffffffffffffffULL)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU64(0x40),
- unop(Iop_Clz64, unop(Iop_Not64,
- getIReg(rs)))));
+ putIReg(rd, unop(Iop_ClzNat64,
+ unop(Iop_Not64, getIReg(rs))));
break;
}
IRTemp tmpRs32 = newTemp(Ity_I32);
assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
- assign(tmpClz32, unop(Iop_Clz32, mkexpr(tmpRs32)));
+ assign(tmpClz32, unop(Iop_ClzNat32, mkexpr(tmpRs32)));
putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClz32), True));
} else {
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32, getIReg(rs))));
+ putIReg(rd, unop(Iop_ClzNat32, getIReg(rs)));
}
break;
IRTemp tmpRs32 = newTemp(Ity_I32);
assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, mkexpr(tmpRs32), mkU32(0xffffffff)));
- assign(tmpClo32, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32, unop(Iop_Not32, mkexpr(tmpRs32)))));
+ assign(tmpClo32, unop(Iop_ClzNat32,
+ unop(Iop_Not32, mkexpr(tmpRs32))));
putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClo32), True));
break;
} else {
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0xffffffff)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU32(0x00000020),
- unop(Iop_Clz32,
- unop(Iop_Not32, getIReg(rs)))));
+ putIReg(rd, unop(Iop_ClzNat32, unop(Iop_Not32, getIReg(rs))));
break;
}
}
case 0x24: /* Count Leading Zeros in Doubleword - DCLZ; MIPS64 */
DIP("dclz r%u, r%u", rd, rs);
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ64, getIReg(rs), mkU64(0)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU64(0x00000040),
- unop(Iop_Clz64, getIReg(rs))));
+ putIReg(rd, unop(Iop_ClzNat64, getIReg(rs)));
break;
case 0x25: /* Count Leading Ones in Doubleword - DCLO; MIPS64 */
DIP("dclo r%u, r%u", rd, rs);
- t1 = newTemp(Ity_I1);
- assign(t1, binop(Iop_CmpEQ64, getIReg(rs),
- mkU64(0xffffffffffffffffULL)));
- putIReg(rd, IRExpr_ITE(mkexpr(t1),
- mkU64(0x40),
- unop(Iop_Clz64, unop(Iop_Not64,
- getIReg(rs)))));
+ putIReg(rd, unop(Iop_ClzNat64, unop(Iop_Not64, getIReg(rs))));
break;
default:
{ DEFOP(Iop_MullU16, UNDEF_LEFT), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 =0, .mips64 = 0 },
{ DEFOP(Iop_MullU32, UNDEF_LEFT), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 =0, .mips64 = 1 }, // mips asserts
{ DEFOP(Iop_MullU64, UNDEF_LEFT), .s390x = 1, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 1 }, // ppc32, mips assert
- { DEFOP(Iop_Clz64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 1 }, // ppc32 asserts
- { DEFOP(Iop_Clz32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 =1, .mips64 = 1 },
+ { DEFOP(Iop_Clz64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 0 }, // ppc32 asserts
+ { DEFOP(Iop_Clz32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 =0, .mips64 = 0 },
{ DEFOP(Iop_Ctz64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 =0, .mips64 = 0 },
{ DEFOP(Iop_Ctz32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 =0, .mips64 = 0 },
- { DEFOP(Iop_ClzNat64, UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 0 }, // ppc32 asserts
- { DEFOP(Iop_ClzNat32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 1, .arm = 0, .ppc64 = 1, .ppc32 = 1, .mips32 =0, .mips64 = 0 },
+ { DEFOP(Iop_ClzNat64, UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 1 }, // ppc32 asserts
+ { DEFOP(Iop_ClzNat32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 1, .arm = 0, .ppc64 = 1, .ppc32 = 1, .mips32 =1, .mips64 = 1 },
{ DEFOP(Iop_CtzNat64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 0 },
{ DEFOP(Iop_CtzNat32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 1, .mips32 =0, .mips64 = 0 },
{ DEFOP(Iop_PopCount64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 =0, .mips64 = 0 },