mirror of
https://github.com/qemu/qemu.git
synced 2024-12-12 13:13:51 +08:00
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(bcdctsq, i32, 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(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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
|
@ -991,6 +991,7 @@ GEN_BCD2(bcdcfz)
|
||||
GEN_BCD2(bcdctz)
|
||||
GEN_BCD2(bcdcfsq)
|
||||
GEN_BCD2(bcdctsq)
|
||||
GEN_BCD2(bcdsetsgn)
|
||||
GEN_BCD(bcdcpsgn);
|
||||
|
||||
static void gen_xpnd04_1(DisasContext *ctx)
|
||||
@ -1014,6 +1015,9 @@ static void gen_xpnd04_1(DisasContext *ctx)
|
||||
case 7:
|
||||
gen_bcdcfn(ctx);
|
||||
break;
|
||||
case 31:
|
||||
gen_bcdsetsgn(ctx);
|
||||
break;
|
||||
default:
|
||||
gen_invalid(ctx);
|
||||
break;
|
||||
@ -1038,12 +1042,16 @@ static void gen_xpnd04_2(DisasContext *ctx)
|
||||
case 7:
|
||||
gen_bcdcfn(ctx);
|
||||
break;
|
||||
case 31:
|
||||
gen_bcdsetsgn(ctx);
|
||||
break;
|
||||
default:
|
||||
gen_invalid(ctx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GEN_VXFORM_DUAL(vsubcuw, PPC_ALTIVEC, PPC_NONE, \
|
||||
xpnd04_1, PPC_NONE, PPC2_ISA300)
|
||||
GEN_VXFORM_DUAL(vsubsws, PPC_ALTIVEC, PPC_NONE, \
|
||||
|
Loading…
Reference in New Issue
Block a user