diff mbox series

[15/34] target/ppc: merge ppc_vsr_t and ppc_avr_t union types

Message ID 20181218063911.2112-16-richard.henderson@linaro.org
State New
Headers show
Series tcg, target/ppc vector improvements | expand

Commit Message

Richard Henderson Dec. 18, 2018, 6:38 a.m. UTC
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


Since the VSX registers are actually a superset of the VMX registers then they
can be represented by the same type. Merge ppc_avr_t into ppc_vsr_t and change
ppc_avr_t to be a simple typedef alias.

Note that due to a difference in the naming of the float32 member between
ppc_avr_t and ppc_vsr_t, references to the ppc_avr_t f member must be replaced
with f32 instead.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

Message-Id: <20181217122405.18732-7-mark.cave-ayland@ilande.co.uk>
---
 target/ppc/cpu.h        | 17 +++++++------
 target/ppc/internal.h   | 11 --------
 target/ppc/int_helper.c | 56 +++++++++++++++++++++--------------------
 3 files changed, 39 insertions(+), 45 deletions(-)

-- 
2.17.2

Comments

David Gibson Dec. 19, 2018, 6:21 a.m. UTC | #1
On Mon, Dec 17, 2018 at 10:38:52PM -0800, Richard Henderson wrote:
> From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

> 

> Since the VSX registers are actually a superset of the VMX registers then they

> can be represented by the same type. Merge ppc_avr_t into ppc_vsr_t and change

> ppc_avr_t to be a simple typedef alias.

> 

> Note that due to a difference in the naming of the float32 member between

> ppc_avr_t and ppc_vsr_t, references to the ppc_avr_t f member must be replaced

> with f32 instead.

> 

> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


Acked-by: David Gibson <david@gibson.dropbear.id.au>


> Message-Id: <20181217122405.18732-7-mark.cave-ayland@ilande.co.uk>

> ---

>  target/ppc/cpu.h        | 17 +++++++------

>  target/ppc/internal.h   | 11 --------

>  target/ppc/int_helper.c | 56 +++++++++++++++++++++--------------------

>  3 files changed, 39 insertions(+), 45 deletions(-)

> 

> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h

> index ab68abe8a2..5445d4c3c1 100644

> --- a/target/ppc/cpu.h

> +++ b/target/ppc/cpu.h

> @@ -230,7 +230,6 @@ typedef struct opc_handler_t opc_handler_t;

>  /* Types used to describe some PowerPC registers etc. */

>  typedef struct DisasContext DisasContext;

>  typedef struct ppc_spr_t ppc_spr_t;

> -typedef union ppc_avr_t ppc_avr_t;

>  typedef union ppc_tlb_t ppc_tlb_t;

>  typedef struct ppc_hash_pte64 ppc_hash_pte64_t;

>  

> @@ -254,22 +253,26 @@ struct ppc_spr_t {

>  #endif

>  };

>  

> -/* Altivec registers (128 bits) */

> -union ppc_avr_t {

> -    float32 f[4];

> +/* VSX/Altivec registers (128 bits) */

> +typedef union _ppc_vsr_t {

>      uint8_t u8[16];

>      uint16_t u16[8];

>      uint32_t u32[4];

> +    uint64_t u64[2];

>      int8_t s8[16];

>      int16_t s16[8];

>      int32_t s32[4];

> -    uint64_t u64[2];

>      int64_t s64[2];

> +    float32 f32[4];

> +    float64 f64[2];

> +    float128 f128;

>  #ifdef CONFIG_INT128

>      __uint128_t u128;

>  #endif

> -    Int128 s128;

> -};

> +    Int128  s128;

> +} ppc_vsr_t;

> +

> +typedef ppc_vsr_t ppc_avr_t;

>  

>  #if !defined(CONFIG_USER_ONLY)

>  /* Software TLB cache */

> diff --git a/target/ppc/internal.h b/target/ppc/internal.h

> index a9bcadff42..b4b1f7b3db 100644

> --- a/target/ppc/internal.h

> +++ b/target/ppc/internal.h

> @@ -204,17 +204,6 @@ EXTRACT_HELPER(IMM8, 11, 8);

>  EXTRACT_HELPER(DCMX, 16, 7);

>  EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1, 6, 6);

>  

> -typedef union _ppc_vsr_t {

> -    uint8_t u8[16];

> -    uint16_t u16[8];

> -    uint32_t u32[4];

> -    uint64_t u64[2];

> -    float32 f32[4];

> -    float64 f64[2];

> -    float128 f128;

> -    Int128  s128;

> -} ppc_vsr_t;

> -

>  #if defined(HOST_WORDS_BIGENDIAN)

>  #define VsrB(i) u8[i]

>  #define VsrH(i) u16[i]

> diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c

> index fcac90a4a9..9d715be25c 100644

> --- a/target/ppc/int_helper.c

> +++ b/target/ppc/int_helper.c

> @@ -548,8 +548,8 @@ VARITH_DO(muluwm, *, u32)

>      {                                                                   \

>          int i;                                                          \

>                                                                          \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \

> -            r->f[i] = func(a->f[i], b->f[i], &env->vec_status);         \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \

> +            r->f32[i] = func(a->f32[i], b->f32[i], &env->vec_status);   \

>          }                                                               \

>      }

>  VARITHFP(addfp, float32_add)

> @@ -563,9 +563,9 @@ VARITHFP(maxfp, float32_max)

>                             ppc_avr_t *b, ppc_avr_t *c)                  \

>      {                                                                   \

>          int i;                                                          \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \

> -            r->f[i] = float32_muladd(a->f[i], c->f[i], b->f[i],         \

> -                                     type, &env->vec_status);           \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \

> +            r->f32[i] = float32_muladd(a->f32[i], c->f32[i], b->f32[i], \

> +                                       type, &env->vec_status);         \

>          }                                                               \

>      }

>  VARITHFPFMA(maddfp, 0);

> @@ -670,9 +670,9 @@ VABSDU(w, u32)

>      {                                                                   \

>          int i;                                                          \

>                                                                          \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \

>              float32 t = cvt(b->element[i], &env->vec_status);           \

> -            r->f[i] = float32_scalbn(t, -uim, &env->vec_status);        \

> +            r->f32[i] = float32_scalbn(t, -uim, &env->vec_status);      \

>          }                                                               \

>      }

>  VCF(ux, uint32_to_float32, u32)

> @@ -782,9 +782,9 @@ VCMPNE(w, u32, uint32_t, 0)

>          uint32_t none = 0;                                              \

>          int i;                                                          \

>                                                                          \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \

>              uint32_t result;                                            \

> -            int rel = float32_compare_quiet(a->f[i], b->f[i],           \

> +            int rel = float32_compare_quiet(a->f32[i], b->f32[i],       \

>                                              &env->vec_status);          \

>              if (rel == float_relation_unordered) {                      \

>                  result = 0;                                             \

> @@ -816,14 +816,16 @@ static inline void vcmpbfp_internal(CPUPPCState *env, ppc_avr_t *r,

>      int i;

>      int all_in = 0;

>  

> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {

> -        int le_rel = float32_compare_quiet(a->f[i], b->f[i], &env->vec_status);

> +    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {

> +        int le_rel = float32_compare_quiet(a->f32[i], b->f32[i],

> +                                           &env->vec_status);

>          if (le_rel == float_relation_unordered) {

>              r->u32[i] = 0xc0000000;

>              all_in = 1;

>          } else {

> -            float32 bneg = float32_chs(b->f[i]);

> -            int ge_rel = float32_compare_quiet(a->f[i], bneg, &env->vec_status);

> +            float32 bneg = float32_chs(b->f32[i]);

> +            int ge_rel = float32_compare_quiet(a->f32[i], bneg,

> +                                               &env->vec_status);

>              int le = le_rel != float_relation_greater;

>              int ge = ge_rel != float_relation_less;

>  

> @@ -856,11 +858,11 @@ void helper_vcmpbfp_dot(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,

>          float_status s = env->vec_status;                               \

>                                                                          \

>          set_float_rounding_mode(float_round_to_zero, &s);               \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \

> -            if (float32_is_any_nan(b->f[i])) {                          \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \

> +            if (float32_is_any_nan(b->f32[i])) {                        \

>                  r->element[i] = 0;                                      \

>              } else {                                                    \

> -                float64 t = float32_to_float64(b->f[i], &s);            \

> +                float64 t = float32_to_float64(b->f32[i], &s);          \

>                  int64_t j;                                              \

>                                                                          \

>                  t = float64_scalbn(t, uim, &s);                         \

> @@ -1661,8 +1663,8 @@ void helper_vrefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)

>  {

>      int i;

>  

> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {

> -        r->f[i] = float32_div(float32_one, b->f[i], &env->vec_status);

> +    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {

> +        r->f32[i] = float32_div(float32_one, b->f32[i], &env->vec_status);

>      }

>  }

>  

> @@ -1674,8 +1676,8 @@ void helper_vrefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)

>          float_status s = env->vec_status;                       \

>                                                                  \

>          set_float_rounding_mode(rounding, &s);                  \

> -        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                \

> -            r->f[i] = float32_round_to_int (b->f[i], &s);       \

> +        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {              \

> +            r->f32[i] = float32_round_to_int (b->f32[i], &s);   \

>          }                                                       \

>      }

>  VRFI(n, float_round_nearest_even)

> @@ -1705,10 +1707,10 @@ void helper_vrsqrtefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)

>  {

>      int i;

>  

> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {

> -        float32 t = float32_sqrt(b->f[i], &env->vec_status);

> +    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {

> +        float32 t = float32_sqrt(b->f32[i], &env->vec_status);

>  

> -        r->f[i] = float32_div(float32_one, t, &env->vec_status);

> +        r->f32[i] = float32_div(float32_one, t, &env->vec_status);

>      }

>  }

>  

> @@ -1751,8 +1753,8 @@ void helper_vexptefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)

>  {

>      int i;

>  

> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {

> -        r->f[i] = float32_exp2(b->f[i], &env->vec_status);

> +    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {

> +        r->f32[i] = float32_exp2(b->f32[i], &env->vec_status);

>      }

>  }

>  

> @@ -1760,8 +1762,8 @@ void helper_vlogefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)

>  {

>      int i;

>  

> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {

> -        r->f[i] = float32_log2(b->f[i], &env->vec_status);

> +    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {

> +        r->f32[i] = float32_log2(b->f32[i], &env->vec_status);

>      }

>  }

>  


-- 
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
diff mbox series

Patch

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index ab68abe8a2..5445d4c3c1 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -230,7 +230,6 @@  typedef struct opc_handler_t opc_handler_t;
 /* Types used to describe some PowerPC registers etc. */
 typedef struct DisasContext DisasContext;
 typedef struct ppc_spr_t ppc_spr_t;
-typedef union ppc_avr_t ppc_avr_t;
 typedef union ppc_tlb_t ppc_tlb_t;
 typedef struct ppc_hash_pte64 ppc_hash_pte64_t;
 
@@ -254,22 +253,26 @@  struct ppc_spr_t {
 #endif
 };
 
-/* Altivec registers (128 bits) */
-union ppc_avr_t {
-    float32 f[4];
+/* VSX/Altivec registers (128 bits) */
+typedef union _ppc_vsr_t {
     uint8_t u8[16];
     uint16_t u16[8];
     uint32_t u32[4];
+    uint64_t u64[2];
     int8_t s8[16];
     int16_t s16[8];
     int32_t s32[4];
-    uint64_t u64[2];
     int64_t s64[2];
+    float32 f32[4];
+    float64 f64[2];
+    float128 f128;
 #ifdef CONFIG_INT128
     __uint128_t u128;
 #endif
-    Int128 s128;
-};
+    Int128  s128;
+} ppc_vsr_t;
+
+typedef ppc_vsr_t ppc_avr_t;
 
 #if !defined(CONFIG_USER_ONLY)
 /* Software TLB cache */
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index a9bcadff42..b4b1f7b3db 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -204,17 +204,6 @@  EXTRACT_HELPER(IMM8, 11, 8);
 EXTRACT_HELPER(DCMX, 16, 7);
 EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1, 6, 6);
 
-typedef union _ppc_vsr_t {
-    uint8_t u8[16];
-    uint16_t u16[8];
-    uint32_t u32[4];
-    uint64_t u64[2];
-    float32 f32[4];
-    float64 f64[2];
-    float128 f128;
-    Int128  s128;
-} ppc_vsr_t;
-
 #if defined(HOST_WORDS_BIGENDIAN)
 #define VsrB(i) u8[i]
 #define VsrH(i) u16[i]
diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c
index fcac90a4a9..9d715be25c 100644
--- a/target/ppc/int_helper.c
+++ b/target/ppc/int_helper.c
@@ -548,8 +548,8 @@  VARITH_DO(muluwm, *, u32)
     {                                                                   \
         int i;                                                          \
                                                                         \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
-            r->f[i] = func(a->f[i], b->f[i], &env->vec_status);         \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \
+            r->f32[i] = func(a->f32[i], b->f32[i], &env->vec_status);   \
         }                                                               \
     }
 VARITHFP(addfp, float32_add)
@@ -563,9 +563,9 @@  VARITHFP(maxfp, float32_max)
                            ppc_avr_t *b, ppc_avr_t *c)                  \
     {                                                                   \
         int i;                                                          \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
-            r->f[i] = float32_muladd(a->f[i], c->f[i], b->f[i],         \
-                                     type, &env->vec_status);           \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \
+            r->f32[i] = float32_muladd(a->f32[i], c->f32[i], b->f32[i], \
+                                       type, &env->vec_status);         \
         }                                                               \
     }
 VARITHFPFMA(maddfp, 0);
@@ -670,9 +670,9 @@  VABSDU(w, u32)
     {                                                                   \
         int i;                                                          \
                                                                         \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \
             float32 t = cvt(b->element[i], &env->vec_status);           \
-            r->f[i] = float32_scalbn(t, -uim, &env->vec_status);        \
+            r->f32[i] = float32_scalbn(t, -uim, &env->vec_status);      \
         }                                                               \
     }
 VCF(ux, uint32_to_float32, u32)
@@ -782,9 +782,9 @@  VCMPNE(w, u32, uint32_t, 0)
         uint32_t none = 0;                                              \
         int i;                                                          \
                                                                         \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \
             uint32_t result;                                            \
-            int rel = float32_compare_quiet(a->f[i], b->f[i],           \
+            int rel = float32_compare_quiet(a->f32[i], b->f32[i],       \
                                             &env->vec_status);          \
             if (rel == float_relation_unordered) {                      \
                 result = 0;                                             \
@@ -816,14 +816,16 @@  static inline void vcmpbfp_internal(CPUPPCState *env, ppc_avr_t *r,
     int i;
     int all_in = 0;
 
-    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
-        int le_rel = float32_compare_quiet(a->f[i], b->f[i], &env->vec_status);
+    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {
+        int le_rel = float32_compare_quiet(a->f32[i], b->f32[i],
+                                           &env->vec_status);
         if (le_rel == float_relation_unordered) {
             r->u32[i] = 0xc0000000;
             all_in = 1;
         } else {
-            float32 bneg = float32_chs(b->f[i]);
-            int ge_rel = float32_compare_quiet(a->f[i], bneg, &env->vec_status);
+            float32 bneg = float32_chs(b->f32[i]);
+            int ge_rel = float32_compare_quiet(a->f32[i], bneg,
+                                               &env->vec_status);
             int le = le_rel != float_relation_greater;
             int ge = ge_rel != float_relation_less;
 
@@ -856,11 +858,11 @@  void helper_vcmpbfp_dot(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
         float_status s = env->vec_status;                               \
                                                                         \
         set_float_rounding_mode(float_round_to_zero, &s);               \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
-            if (float32_is_any_nan(b->f[i])) {                          \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {                      \
+            if (float32_is_any_nan(b->f32[i])) {                        \
                 r->element[i] = 0;                                      \
             } else {                                                    \
-                float64 t = float32_to_float64(b->f[i], &s);            \
+                float64 t = float32_to_float64(b->f32[i], &s);          \
                 int64_t j;                                              \
                                                                         \
                 t = float64_scalbn(t, uim, &s);                         \
@@ -1661,8 +1663,8 @@  void helper_vrefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
 {
     int i;
 
-    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
-        r->f[i] = float32_div(float32_one, b->f[i], &env->vec_status);
+    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {
+        r->f32[i] = float32_div(float32_one, b->f32[i], &env->vec_status);
     }
 }
 
@@ -1674,8 +1676,8 @@  void helper_vrefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
         float_status s = env->vec_status;                       \
                                                                 \
         set_float_rounding_mode(rounding, &s);                  \
-        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                \
-            r->f[i] = float32_round_to_int (b->f[i], &s);       \
+        for (i = 0; i < ARRAY_SIZE(r->f32); i++) {              \
+            r->f32[i] = float32_round_to_int (b->f32[i], &s);   \
         }                                                       \
     }
 VRFI(n, float_round_nearest_even)
@@ -1705,10 +1707,10 @@  void helper_vrsqrtefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
 {
     int i;
 
-    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
-        float32 t = float32_sqrt(b->f[i], &env->vec_status);
+    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {
+        float32 t = float32_sqrt(b->f32[i], &env->vec_status);
 
-        r->f[i] = float32_div(float32_one, t, &env->vec_status);
+        r->f32[i] = float32_div(float32_one, t, &env->vec_status);
     }
 }
 
@@ -1751,8 +1753,8 @@  void helper_vexptefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
 {
     int i;
 
-    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
-        r->f[i] = float32_exp2(b->f[i], &env->vec_status);
+    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {
+        r->f32[i] = float32_exp2(b->f32[i], &env->vec_status);
     }
 }
 
@@ -1760,8 +1762,8 @@  void helper_vlogefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
 {
     int i;
 
-    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
-        r->f[i] = float32_log2(b->f[i], &env->vec_status);
+    for (i = 0; i < ARRAY_SIZE(r->f32); i++) {
+        r->f32[i] = float32_log2(b->f32[i], &env->vec_status);
     }
 }