target-ppc: Implement bcdsetsgn. instruction
bcdsetsgn.: Decimal set sign. This instruction copies the register value to the result register but adjust the signal according to the preferred sign value. Signed-off-by: Jose Ricardo Ziviani <joserz@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
c3025c3b0a
commit
466a3f9ca3
|
@ -380,6 +380,7 @@ DEF_HELPER_3(bcdctz, i32, avr, avr, i32)
|
||||||
DEF_HELPER_3(bcdcfsq, i32, avr, avr, i32)
|
DEF_HELPER_3(bcdcfsq, i32, avr, avr, i32)
|
||||||
DEF_HELPER_3(bcdctsq, i32, avr, avr, i32)
|
DEF_HELPER_3(bcdctsq, i32, avr, avr, i32)
|
||||||
DEF_HELPER_4(bcdcpsgn, i32, avr, avr, avr, i32)
|
DEF_HELPER_4(bcdcpsgn, i32, avr, avr, avr, i32)
|
||||||
|
DEF_HELPER_3(bcdsetsgn, i32, avr, avr, i32)
|
||||||
|
|
||||||
DEF_HELPER_2(xsadddp, void, env, i32)
|
DEF_HELPER_2(xsadddp, void, env, i32)
|
||||||
DEF_HELPER_2(xssubdp, void, env, i32)
|
DEF_HELPER_2(xssubdp, void, env, i32)
|
||||||
|
|
|
@ -2943,6 +2943,25 @@ uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
|
||||||
return bcd_cmp_zero(r);
|
return bcd_cmp_zero(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t helper_bcdsetsgn(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int invalid = 0;
|
||||||
|
int sgnb = bcd_get_sgn(b);
|
||||||
|
|
||||||
|
*r = *b;
|
||||||
|
bcd_put_digit(r, bcd_preferred_sgn(sgnb, ps), 0);
|
||||||
|
|
||||||
|
for (i = 1; i < 32; i++) {
|
||||||
|
bcd_get_digit(b, i, &invalid);
|
||||||
|
if (unlikely(invalid)) {
|
||||||
|
return CRF_SO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bcd_cmp_zero(r);
|
||||||
|
}
|
||||||
|
|
||||||
void helper_vsbox(ppc_avr_t *r, ppc_avr_t *a)
|
void helper_vsbox(ppc_avr_t *r, ppc_avr_t *a)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -991,6 +991,7 @@ GEN_BCD2(bcdcfz)
|
||||||
GEN_BCD2(bcdctz)
|
GEN_BCD2(bcdctz)
|
||||||
GEN_BCD2(bcdcfsq)
|
GEN_BCD2(bcdcfsq)
|
||||||
GEN_BCD2(bcdctsq)
|
GEN_BCD2(bcdctsq)
|
||||||
|
GEN_BCD2(bcdsetsgn)
|
||||||
GEN_BCD(bcdcpsgn);
|
GEN_BCD(bcdcpsgn);
|
||||||
|
|
||||||
static void gen_xpnd04_1(DisasContext *ctx)
|
static void gen_xpnd04_1(DisasContext *ctx)
|
||||||
|
@ -1014,6 +1015,9 @@ static void gen_xpnd04_1(DisasContext *ctx)
|
||||||
case 7:
|
case 7:
|
||||||
gen_bcdcfn(ctx);
|
gen_bcdcfn(ctx);
|
||||||
break;
|
break;
|
||||||
|
case 31:
|
||||||
|
gen_bcdsetsgn(ctx);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gen_invalid(ctx);
|
gen_invalid(ctx);
|
||||||
break;
|
break;
|
||||||
|
@ -1038,12 +1042,16 @@ static void gen_xpnd04_2(DisasContext *ctx)
|
||||||
case 7:
|
case 7:
|
||||||
gen_bcdcfn(ctx);
|
gen_bcdcfn(ctx);
|
||||||
break;
|
break;
|
||||||
|
case 31:
|
||||||
|
gen_bcdsetsgn(ctx);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gen_invalid(ctx);
|
gen_invalid(ctx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GEN_VXFORM_DUAL(vsubcuw, PPC_ALTIVEC, PPC_NONE, \
|
GEN_VXFORM_DUAL(vsubcuw, PPC_ALTIVEC, PPC_NONE, \
|
||||||
xpnd04_1, PPC_NONE, PPC2_ISA300)
|
xpnd04_1, PPC_NONE, PPC2_ISA300)
|
||||||
GEN_VXFORM_DUAL(vsubsws, PPC_ALTIVEC, PPC_NONE, \
|
GEN_VXFORM_DUAL(vsubsws, PPC_ALTIVEC, PPC_NONE, \
|
||||||
|
|
Loading…
Reference in a new issue