Message ID | 1481053210-26821-2-git-send-email-joserz@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On Tue, Dec 06, 2016 at 05:40:04PM -0200, Jose Ricardo Ziviani wrote: > A function to check if all digits of a given BCD number is valid is > here presented because more instructions will need to reuse the > same code. > > Signed-off-by: Jose Ricardo Ziviani <joserz@linux.vnet.ibm.com> I've applied this patch to ppc-for-2.9, the rest still have comments on them. > --- > target-ppc/int_helper.c | 27 ++++++++++++++++++++------- > 1 file changed, 20 insertions(+), 7 deletions(-) > > diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c > index 7030f61..7989b1f 100644 > --- a/target-ppc/int_helper.c > +++ b/target-ppc/int_helper.c > @@ -2596,6 +2596,24 @@ static void bcd_put_digit(ppc_avr_t *bcd, uint8_t digit, int n) > } > } > > +static bool bcd_is_valid(ppc_avr_t *bcd) > +{ > + int i; > + int invalid = 0; > + > + if (bcd_get_sgn(bcd) == 0) { > + return false; > + } > + > + for (i = 1; i < 32; i++) { > + bcd_get_digit(bcd, i, &invalid); > + if (unlikely(invalid)) { > + return false; > + } > + } > + return true; > +} > + > static int bcd_cmp_zero(ppc_avr_t *bcd) > { > if (bcd->u64[HI_IDX] == 0 && (bcd->u64[LO_IDX] >> 4) == 0) { > @@ -3013,18 +3031,13 @@ uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps) > > 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; > - } > + if (bcd_is_valid(b) == false) { > + return CRF_SO; > } > > return bcd_cmp_zero(r);
diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c index 7030f61..7989b1f 100644 --- a/target-ppc/int_helper.c +++ b/target-ppc/int_helper.c @@ -2596,6 +2596,24 @@ static void bcd_put_digit(ppc_avr_t *bcd, uint8_t digit, int n) } } +static bool bcd_is_valid(ppc_avr_t *bcd) +{ + int i; + int invalid = 0; + + if (bcd_get_sgn(bcd) == 0) { + return false; + } + + for (i = 1; i < 32; i++) { + bcd_get_digit(bcd, i, &invalid); + if (unlikely(invalid)) { + return false; + } + } + return true; +} + static int bcd_cmp_zero(ppc_avr_t *bcd) { if (bcd->u64[HI_IDX] == 0 && (bcd->u64[LO_IDX] >> 4) == 0) { @@ -3013,18 +3031,13 @@ uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps) 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; - } + if (bcd_is_valid(b) == false) { + return CRF_SO; } return bcd_cmp_zero(r);
A function to check if all digits of a given BCD number is valid is here presented because more instructions will need to reuse the same code. Signed-off-by: Jose Ricardo Ziviani <joserz@linux.vnet.ibm.com> --- target-ppc/int_helper.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-)