qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] target/ppc: use Vsr macros in BCD helpers
@ 2019-09-26 20:44 Mark Cave-Ayland
  2019-09-27 19:49 ` Richard Henderson
  2019-09-29  9:29 ` David Gibson
  0 siblings, 2 replies; 3+ messages in thread
From: Mark Cave-Ayland @ 2019-09-26 20:44 UTC (permalink / raw)
  To: qemu-devel, qemu-ppc, pc, david

This allows us to remove more endian-specific defines from int_helper.c.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 target/ppc/int_helper.c | 72 ++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 47 deletions(-)

diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c
index 46deb57a34..6d238b989d 100644
--- a/target/ppc/int_helper.c
+++ b/target/ppc/int_helper.c
@@ -2052,15 +2052,11 @@ void helper_vsubecuq(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
 #define NATIONAL_PLUS   0x2B
 #define NATIONAL_NEG    0x2D
 
-#if defined(HOST_WORDS_BIGENDIAN)
 #define BCD_DIG_BYTE(n) (15 - ((n) / 2))
-#else
-#define BCD_DIG_BYTE(n) ((n) / 2)
-#endif
 
 static int bcd_get_sgn(ppc_avr_t *bcd)
 {
-    switch (bcd->u8[BCD_DIG_BYTE(0)] & 0xF) {
+    switch (bcd->VsrB(BCD_DIG_BYTE(0)) & 0xF) {
     case BCD_PLUS_PREF_1:
     case BCD_PLUS_PREF_2:
     case BCD_PLUS_ALT_1:
@@ -2095,9 +2091,9 @@ static uint8_t bcd_get_digit(ppc_avr_t *bcd, int n, int *invalid)
 {
     uint8_t result;
     if (n & 1) {
-        result = bcd->u8[BCD_DIG_BYTE(n)] >> 4;
+        result = bcd->VsrB(BCD_DIG_BYTE(n)) >> 4;
     } else {
-       result = bcd->u8[BCD_DIG_BYTE(n)] & 0xF;
+       result = bcd->VsrB(BCD_DIG_BYTE(n)) & 0xF;
     }
 
     if (unlikely(result > 9)) {
@@ -2109,11 +2105,11 @@ static uint8_t bcd_get_digit(ppc_avr_t *bcd, int n, int *invalid)
 static void bcd_put_digit(ppc_avr_t *bcd, uint8_t digit, int n)
 {
     if (n & 1) {
-        bcd->u8[BCD_DIG_BYTE(n)] &= 0x0F;
-        bcd->u8[BCD_DIG_BYTE(n)] |= (digit << 4);
+        bcd->VsrB(BCD_DIG_BYTE(n)) &= 0x0F;
+        bcd->VsrB(BCD_DIG_BYTE(n)) |= (digit << 4);
     } else {
-        bcd->u8[BCD_DIG_BYTE(n)] &= 0xF0;
-        bcd->u8[BCD_DIG_BYTE(n)] |= digit;
+        bcd->VsrB(BCD_DIG_BYTE(n)) &= 0xF0;
+        bcd->VsrB(BCD_DIG_BYTE(n)) |= digit;
     }
 }
 
@@ -2228,21 +2224,21 @@ uint32_t helper_bcdadd(ppc_avr_t *r,  ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
 
     if (!invalid) {
         if (sgna == sgnb) {
-            result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgna, ps);
+            result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgna, ps);
             bcd_add_mag(&result, a, b, &invalid, &overflow);
             cr = bcd_cmp_zero(&result);
         } else {
             int magnitude = bcd_cmp_mag(a, b);
             if (magnitude > 0) {
-                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgna, ps);
+                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgna, ps);
                 bcd_sub_mag(&result, a, b, &invalid, &overflow);
                 cr = (sgna > 0) ? CRF_GT : CRF_LT;
             } else if (magnitude < 0) {
-                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgnb, ps);
+                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgnb, ps);
                 bcd_sub_mag(&result, b, a, &invalid, &overflow);
                 cr = (sgnb > 0) ? CRF_GT : CRF_LT;
             } else {
-                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(0, ps);
+                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(0, ps);
                 cr = CRF_EQ;
             }
         }
@@ -2353,15 +2349,15 @@ uint32_t helper_bcdcfz(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
     int zone_lead = ps ? 0xF : 0x3;
     int digit = 0;
     ppc_avr_t ret = { .u64 = { 0, 0 } };
-    int sgnb = b->u8[BCD_DIG_BYTE(0)] >> 4;
+    int sgnb = b->VsrB(BCD_DIG_BYTE(0)) >> 4;
 
     if (unlikely((sgnb < 0xA) && ps)) {
         invalid = 1;
     }
 
     for (i = 0; i < 16; i++) {
-        zone_digit = i ? b->u8[BCD_DIG_BYTE(i * 2)] >> 4 : zone_lead;
-        digit = b->u8[BCD_DIG_BYTE(i * 2)] & 0xF;
+        zone_digit = i ? b->VsrB(BCD_DIG_BYTE(i * 2)) >> 4 : zone_lead;
+        digit = b->VsrB(BCD_DIG_BYTE(i * 2)) & 0xF;
         if (unlikely(zone_digit != zone_lead || digit > 0x9)) {
             invalid = 1;
             break;
@@ -2407,7 +2403,7 @@ uint32_t helper_bcdctz(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
             break;
         }
 
-        ret.u8[BCD_DIG_BYTE(i * 2)] = zone_lead + digit;
+        ret.VsrB(BCD_DIG_BYTE(i * 2)) = zone_lead + digit;
     }
 
     if (ps) {
@@ -2519,7 +2515,7 @@ uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
     }
 
     *r = *a;
-    bcd_put_digit(r, b->u8[BCD_DIG_BYTE(0)] & 0xF, 0);
+    bcd_put_digit(r, b->VsrB(BCD_DIG_BYTE(0)) & 0xF, 0);
 
     for (i = 1; i < 32; i++) {
         bcd_get_digit(a, i, &invalid);
@@ -2549,11 +2545,7 @@ uint32_t helper_bcdsetsgn(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
 uint32_t helper_bcds(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
 {
     int cr;
-#if defined(HOST_WORDS_BIGENDIAN)
-    int i = a->s8[7];
-#else
-    int i = a->s8[8];
-#endif
+    int i = a->VsrSB(7);
     bool ox_flag = false;
     int sgnb = bcd_get_sgn(b);
     ppc_avr_t ret = *b;
@@ -2602,11 +2594,7 @@ uint32_t helper_bcdus(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
         }
     }
 
-#if defined(HOST_WORDS_BIGENDIAN)
-    i = a->s8[7];
-#else
-    i = a->s8[8];
-#endif
+    i = a->VsrSB(7);
     if (i >= 32) {
         ox_flag = true;
         ret.VsrD(1) = ret.VsrD(0) = 0;
@@ -2637,13 +2625,11 @@ uint32_t helper_bcdsr(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
     ppc_avr_t ret = *b;
     ret.VsrD(1) &= ~0xf;
 
-#if defined(HOST_WORDS_BIGENDIAN)
-    int i = a->s8[7];
-    ppc_avr_t bcd_one = { .u64 = { 0, 0x10 } };
-#else
-    int i = a->s8[8];
-    ppc_avr_t bcd_one = { .u64 = { 0x10, 0 } };
-#endif
+    int i = a->VsrSB(7);
+    ppc_avr_t bcd_one;
+
+    bcd_one.VsrD(0) = 0;
+    bcd_one.VsrD(1) = 0x10;
 
     if (bcd_is_valid(b) == false) {
         return CRF_SO;
@@ -2679,11 +2665,7 @@ uint32_t helper_bcdtrunc(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
 {
     uint64_t mask;
     uint32_t ox_flag = 0;
-#if defined(HOST_WORDS_BIGENDIAN)
-    int i = a->s16[3] + 1;
-#else
-    int i = a->s16[4] + 1;
-#endif
+    int i = a->VsrSH(3) + 1;
     ppc_avr_t ret = *b;
 
     if (bcd_is_valid(b) == false) {
@@ -2728,11 +2710,7 @@ uint32_t helper_bcdutrunc(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
         }
     }
 
-#if defined(HOST_WORDS_BIGENDIAN)
-    i = a->s16[3];
-#else
-    i = a->s16[4];
-#endif
+    i = a->VsrSH(3);
     if (i > 16 && i < 33) {
         mask = (uint64_t)-1 >> (128 - i * 4);
         if (ret.VsrD(0) & ~mask) {
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] target/ppc: use Vsr macros in BCD helpers
  2019-09-26 20:44 [PATCH] target/ppc: use Vsr macros in BCD helpers Mark Cave-Ayland
@ 2019-09-27 19:49 ` Richard Henderson
  2019-09-29  9:29 ` David Gibson
  1 sibling, 0 replies; 3+ messages in thread
From: Richard Henderson @ 2019-09-27 19:49 UTC (permalink / raw)
  To: Mark Cave-Ayland, qemu-devel, qemu-ppc, pc, david

On 9/26/19 1:44 PM, Mark Cave-Ayland wrote:
> This allows us to remove more endian-specific defines from int_helper.c.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>  target/ppc/int_helper.c | 72 ++++++++++++++---------------------------
>  1 file changed, 25 insertions(+), 47 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] target/ppc: use Vsr macros in BCD helpers
  2019-09-26 20:44 [PATCH] target/ppc: use Vsr macros in BCD helpers Mark Cave-Ayland
  2019-09-27 19:49 ` Richard Henderson
@ 2019-09-29  9:29 ` David Gibson
  1 sibling, 0 replies; 3+ messages in thread
From: David Gibson @ 2019-09-29  9:29 UTC (permalink / raw)
  To: Mark Cave-Ayland; +Cc: qemu-ppc, qemu-devel, pc

[-- Attachment #1: Type: text/plain, Size: 7297 bytes --]

On Thu, Sep 26, 2019 at 09:44:53PM +0100, Mark Cave-Ayland wrote:
> This allows us to remove more endian-specific defines from int_helper.c.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

Applied, thanks.

> ---
>  target/ppc/int_helper.c | 72 ++++++++++++++---------------------------
>  1 file changed, 25 insertions(+), 47 deletions(-)
> 
> diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c
> index 46deb57a34..6d238b989d 100644
> --- a/target/ppc/int_helper.c
> +++ b/target/ppc/int_helper.c
> @@ -2052,15 +2052,11 @@ void helper_vsubecuq(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
>  #define NATIONAL_PLUS   0x2B
>  #define NATIONAL_NEG    0x2D
>  
> -#if defined(HOST_WORDS_BIGENDIAN)
>  #define BCD_DIG_BYTE(n) (15 - ((n) / 2))
> -#else
> -#define BCD_DIG_BYTE(n) ((n) / 2)
> -#endif
>  
>  static int bcd_get_sgn(ppc_avr_t *bcd)
>  {
> -    switch (bcd->u8[BCD_DIG_BYTE(0)] & 0xF) {
> +    switch (bcd->VsrB(BCD_DIG_BYTE(0)) & 0xF) {
>      case BCD_PLUS_PREF_1:
>      case BCD_PLUS_PREF_2:
>      case BCD_PLUS_ALT_1:
> @@ -2095,9 +2091,9 @@ static uint8_t bcd_get_digit(ppc_avr_t *bcd, int n, int *invalid)
>  {
>      uint8_t result;
>      if (n & 1) {
> -        result = bcd->u8[BCD_DIG_BYTE(n)] >> 4;
> +        result = bcd->VsrB(BCD_DIG_BYTE(n)) >> 4;
>      } else {
> -       result = bcd->u8[BCD_DIG_BYTE(n)] & 0xF;
> +       result = bcd->VsrB(BCD_DIG_BYTE(n)) & 0xF;
>      }
>  
>      if (unlikely(result > 9)) {
> @@ -2109,11 +2105,11 @@ static uint8_t bcd_get_digit(ppc_avr_t *bcd, int n, int *invalid)
>  static void bcd_put_digit(ppc_avr_t *bcd, uint8_t digit, int n)
>  {
>      if (n & 1) {
> -        bcd->u8[BCD_DIG_BYTE(n)] &= 0x0F;
> -        bcd->u8[BCD_DIG_BYTE(n)] |= (digit << 4);
> +        bcd->VsrB(BCD_DIG_BYTE(n)) &= 0x0F;
> +        bcd->VsrB(BCD_DIG_BYTE(n)) |= (digit << 4);
>      } else {
> -        bcd->u8[BCD_DIG_BYTE(n)] &= 0xF0;
> -        bcd->u8[BCD_DIG_BYTE(n)] |= digit;
> +        bcd->VsrB(BCD_DIG_BYTE(n)) &= 0xF0;
> +        bcd->VsrB(BCD_DIG_BYTE(n)) |= digit;
>      }
>  }
>  
> @@ -2228,21 +2224,21 @@ uint32_t helper_bcdadd(ppc_avr_t *r,  ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>  
>      if (!invalid) {
>          if (sgna == sgnb) {
> -            result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgna, ps);
> +            result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgna, ps);
>              bcd_add_mag(&result, a, b, &invalid, &overflow);
>              cr = bcd_cmp_zero(&result);
>          } else {
>              int magnitude = bcd_cmp_mag(a, b);
>              if (magnitude > 0) {
> -                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgna, ps);
> +                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgna, ps);
>                  bcd_sub_mag(&result, a, b, &invalid, &overflow);
>                  cr = (sgna > 0) ? CRF_GT : CRF_LT;
>              } else if (magnitude < 0) {
> -                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgnb, ps);
> +                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(sgnb, ps);
>                  bcd_sub_mag(&result, b, a, &invalid, &overflow);
>                  cr = (sgnb > 0) ? CRF_GT : CRF_LT;
>              } else {
> -                result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(0, ps);
> +                result.VsrB(BCD_DIG_BYTE(0)) = bcd_preferred_sgn(0, ps);
>                  cr = CRF_EQ;
>              }
>          }
> @@ -2353,15 +2349,15 @@ uint32_t helper_bcdcfz(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
>      int zone_lead = ps ? 0xF : 0x3;
>      int digit = 0;
>      ppc_avr_t ret = { .u64 = { 0, 0 } };
> -    int sgnb = b->u8[BCD_DIG_BYTE(0)] >> 4;
> +    int sgnb = b->VsrB(BCD_DIG_BYTE(0)) >> 4;
>  
>      if (unlikely((sgnb < 0xA) && ps)) {
>          invalid = 1;
>      }
>  
>      for (i = 0; i < 16; i++) {
> -        zone_digit = i ? b->u8[BCD_DIG_BYTE(i * 2)] >> 4 : zone_lead;
> -        digit = b->u8[BCD_DIG_BYTE(i * 2)] & 0xF;
> +        zone_digit = i ? b->VsrB(BCD_DIG_BYTE(i * 2)) >> 4 : zone_lead;
> +        digit = b->VsrB(BCD_DIG_BYTE(i * 2)) & 0xF;
>          if (unlikely(zone_digit != zone_lead || digit > 0x9)) {
>              invalid = 1;
>              break;
> @@ -2407,7 +2403,7 @@ uint32_t helper_bcdctz(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
>              break;
>          }
>  
> -        ret.u8[BCD_DIG_BYTE(i * 2)] = zone_lead + digit;
> +        ret.VsrB(BCD_DIG_BYTE(i * 2)) = zone_lead + digit;
>      }
>  
>      if (ps) {
> @@ -2519,7 +2515,7 @@ uint32_t helper_bcdcpsgn(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>      }
>  
>      *r = *a;
> -    bcd_put_digit(r, b->u8[BCD_DIG_BYTE(0)] & 0xF, 0);
> +    bcd_put_digit(r, b->VsrB(BCD_DIG_BYTE(0)) & 0xF, 0);
>  
>      for (i = 1; i < 32; i++) {
>          bcd_get_digit(a, i, &invalid);
> @@ -2549,11 +2545,7 @@ uint32_t helper_bcdsetsgn(ppc_avr_t *r, ppc_avr_t *b, uint32_t ps)
>  uint32_t helper_bcds(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>  {
>      int cr;
> -#if defined(HOST_WORDS_BIGENDIAN)
> -    int i = a->s8[7];
> -#else
> -    int i = a->s8[8];
> -#endif
> +    int i = a->VsrSB(7);
>      bool ox_flag = false;
>      int sgnb = bcd_get_sgn(b);
>      ppc_avr_t ret = *b;
> @@ -2602,11 +2594,7 @@ uint32_t helper_bcdus(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>          }
>      }
>  
> -#if defined(HOST_WORDS_BIGENDIAN)
> -    i = a->s8[7];
> -#else
> -    i = a->s8[8];
> -#endif
> +    i = a->VsrSB(7);
>      if (i >= 32) {
>          ox_flag = true;
>          ret.VsrD(1) = ret.VsrD(0) = 0;
> @@ -2637,13 +2625,11 @@ uint32_t helper_bcdsr(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>      ppc_avr_t ret = *b;
>      ret.VsrD(1) &= ~0xf;
>  
> -#if defined(HOST_WORDS_BIGENDIAN)
> -    int i = a->s8[7];
> -    ppc_avr_t bcd_one = { .u64 = { 0, 0x10 } };
> -#else
> -    int i = a->s8[8];
> -    ppc_avr_t bcd_one = { .u64 = { 0x10, 0 } };
> -#endif
> +    int i = a->VsrSB(7);
> +    ppc_avr_t bcd_one;
> +
> +    bcd_one.VsrD(0) = 0;
> +    bcd_one.VsrD(1) = 0x10;
>  
>      if (bcd_is_valid(b) == false) {
>          return CRF_SO;
> @@ -2679,11 +2665,7 @@ uint32_t helper_bcdtrunc(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>  {
>      uint64_t mask;
>      uint32_t ox_flag = 0;
> -#if defined(HOST_WORDS_BIGENDIAN)
> -    int i = a->s16[3] + 1;
> -#else
> -    int i = a->s16[4] + 1;
> -#endif
> +    int i = a->VsrSH(3) + 1;
>      ppc_avr_t ret = *b;
>  
>      if (bcd_is_valid(b) == false) {
> @@ -2728,11 +2710,7 @@ uint32_t helper_bcdutrunc(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps)
>          }
>      }
>  
> -#if defined(HOST_WORDS_BIGENDIAN)
> -    i = a->s16[3];
> -#else
> -    i = a->s16[4];
> -#endif
> +    i = a->VsrSH(3);
>      if (i > 16 && i < 33) {
>          mask = (uint64_t)-1 >> (128 - i * 4);
>          if (ret.VsrD(0) & ~mask) {

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-09-29 10:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-26 20:44 [PATCH] target/ppc: use Vsr macros in BCD helpers Mark Cave-Ayland
2019-09-27 19:49 ` Richard Henderson
2019-09-29  9:29 ` David Gibson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).