target-ppc: Implement bcdcpsgn. instruction
bcdcpsgn.: Decimal copy sign. Given two registers vra and vrb, it copies the vra value with vrb sign to the result register vrt. 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
c85bc7dd90
commit
c3025c3b0a
|
@ -379,6 +379,7 @@ DEF_HELPER_3(bcdcfz, i32, avr, avr, i32)
|
||||||
DEF_HELPER_3(bcdctz, i32, avr, avr, i32)
|
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_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)
|
||||||
|
|
|
@ -2920,6 +2920,29 @@ uint32_t helper_bcdctsq(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
|
||||||
return cr;
|
return cr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int invalid = 0;
|
||||||
|
|
||||||
|
if (bcd_get_sgn(a) == 0 || bcd_get_sgn(b) == 0) {
|
||||||
|
return CRF_SO;
|
||||||
|
}
|
||||||
|
|
||||||
|
*r = *a;
|
||||||
|
bcd_put_digit(r, b->u8[BCD_DIG_BYTE(0)] & 0xF, 0);
|
||||||
|
|
||||||
|
for (i = 1; i < 32; i++) {
|
||||||
|
bcd_get_digit(a, i, &invalid);
|
||||||
|
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_BCD(bcdcpsgn);
|
||||||
|
|
||||||
static void gen_xpnd04_1(DisasContext *ctx)
|
static void gen_xpnd04_1(DisasContext *ctx)
|
||||||
{
|
{
|
||||||
|
@ -1056,6 +1057,8 @@ GEN_VXFORM_DUAL(vsubuhm, PPC_ALTIVEC, PPC_NONE, \
|
||||||
bcdsub, PPC_NONE, PPC2_ALTIVEC_207)
|
bcdsub, PPC_NONE, PPC2_ALTIVEC_207)
|
||||||
GEN_VXFORM_DUAL(vsubuhs, PPC_ALTIVEC, PPC_NONE, \
|
GEN_VXFORM_DUAL(vsubuhs, PPC_ALTIVEC, PPC_NONE, \
|
||||||
bcdsub, PPC_NONE, PPC2_ALTIVEC_207)
|
bcdsub, PPC_NONE, PPC2_ALTIVEC_207)
|
||||||
|
GEN_VXFORM_DUAL(vaddshs, PPC_ALTIVEC, PPC_NONE, \
|
||||||
|
bcdcpsgn, PPC_NONE, PPC2_ISA300)
|
||||||
|
|
||||||
static void gen_vsbox(DisasContext *ctx)
|
static void gen_vsbox(DisasContext *ctx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -131,7 +131,7 @@ GEN_VXFORM_DUAL(vaddubs, vmul10uq, 0, 8, PPC_ALTIVEC, PPC_NONE),
|
||||||
GEN_VXFORM_DUAL(vadduhs, vmul10euq, 0, 9, PPC_ALTIVEC, PPC_NONE),
|
GEN_VXFORM_DUAL(vadduhs, vmul10euq, 0, 9, PPC_ALTIVEC, PPC_NONE),
|
||||||
GEN_VXFORM(vadduws, 0, 10),
|
GEN_VXFORM(vadduws, 0, 10),
|
||||||
GEN_VXFORM(vaddsbs, 0, 12),
|
GEN_VXFORM(vaddsbs, 0, 12),
|
||||||
GEN_VXFORM(vaddshs, 0, 13),
|
GEN_VXFORM_DUAL(vaddshs, bcdcpsgn, 0, 13, PPC_ALTIVEC, PPC_NONE),
|
||||||
GEN_VXFORM(vaddsws, 0, 14),
|
GEN_VXFORM(vaddsws, 0, 14),
|
||||||
GEN_VXFORM_DUAL(vsububs, bcdadd, 0, 24, PPC_ALTIVEC, PPC_NONE),
|
GEN_VXFORM_DUAL(vsububs, bcdadd, 0, 24, PPC_ALTIVEC, PPC_NONE),
|
||||||
GEN_VXFORM_DUAL(vsubuhs, bcdsub, 0, 25, PPC_ALTIVEC, PPC_NONE),
|
GEN_VXFORM_DUAL(vsubuhs, bcdsub, 0, 25, PPC_ALTIVEC, PPC_NONE),
|
||||||
|
|
Loading…
Reference in a new issue