Hi,

except for one use, from bittype_for_type was used as a poor-man's
type size function.  That is confusing, so I added a real type size
function.  The new implementation of hsa_bittype_for_type then uses
that as its basis too.

Martin

2015-06-18  Martin Jambor  <mjam...@suse.cz>

        * hsa.c (hsa_type_bit_size): New function.
        (hsa_bittype_for_type): Likewise.
        * hsa-brig.c (get_alignment): Use hsa_type_bit_size.
        (bittype_for_type): removed.
        * hsa-gen.c (hsa_needs_cvt): Use hsa_type_bit_size.
        (gen_address_calculation): Likewise.
        (hsa_build_append_simple_mov): Likewise.
        (gen_hsa_insns_for_store): Likewise.
        (gen_hsa_insns_for_call): Likewise.
---
 gcc/ChangeLog.hsa | 12 ++++++++
 gcc/hsa-brig.c    | 81 +++++--------------------------------------------
 gcc/hsa-gen.c     | 31 ++++++++++---------
 gcc/hsa.c         | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 gcc/hsa.h         |  2 ++
 5 files changed, 129 insertions(+), 88 deletions(-)

diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c
index bb4a2c1..e17d941 100644
--- a/gcc/hsa-brig.c
+++ b/gcc/hsa-brig.c
@@ -445,20 +445,20 @@ brig_release_data (void)
 static BrigAlignment8_t
 get_alignment (BrigType16_t type)
 {
-  BrigType16_t bit_type ;
-  bit_type = bittype_for_type (type) ;
+  unsigned bit_size ;
+  bit_size = hsa_type_bit_size (type) ;
 
-  if (bit_type == BRIG_TYPE_B1)
+  if (bit_size == 1)
     return BRIG_ALIGNMENT_1;
-  if (bit_type == BRIG_TYPE_B8)
+  if (bit_size == 8)
     return BRIG_ALIGNMENT_1;
-  if (bit_type == BRIG_TYPE_B16)
+  if (bit_size == 16)
     return BRIG_ALIGNMENT_2;
-  if (bit_type == BRIG_TYPE_B32)
+  if (bit_size == 32)
     return BRIG_ALIGNMENT_4;
-  if (bit_type == BRIG_TYPE_B64)
+  if (bit_size == 64)
     return BRIG_ALIGNMENT_8;
-  if (bit_type == BRIG_TYPE_B128)
+  if (bit_size == 128)
     return BRIG_ALIGNMENT_16;
   gcc_unreachable ();
 }
@@ -621,71 +621,6 @@ emit_bb_label_directive (hsa_bb *hbb)
   brig_insn_count++;
 }
 
-BrigType16_t
-bittype_for_type (BrigType16_t t)
-{
-  switch (t)
-    {
-    case BRIG_TYPE_B1:
-      return BRIG_TYPE_B1;
-
-    case BRIG_TYPE_U8:
-    case BRIG_TYPE_S8:
-    case BRIG_TYPE_B8:
-      return BRIG_TYPE_B8;
-
-    case BRIG_TYPE_U16:
-    case BRIG_TYPE_S16:
-    case BRIG_TYPE_B16:
-    case BRIG_TYPE_F16:
-      return BRIG_TYPE_B16;
-
-    case BRIG_TYPE_U32:
-    case BRIG_TYPE_S32:
-    case BRIG_TYPE_B32:
-    case BRIG_TYPE_F32:
-    case BRIG_TYPE_U8X4:
-    case BRIG_TYPE_U16X2:
-    case BRIG_TYPE_S8X4:
-    case BRIG_TYPE_S16X2:
-    case BRIG_TYPE_F16X2:
-      return BRIG_TYPE_B32;
-
-    case BRIG_TYPE_U64:
-    case BRIG_TYPE_S64:
-    case BRIG_TYPE_F64:
-    case BRIG_TYPE_B64:
-    case BRIG_TYPE_U8X8:
-    case BRIG_TYPE_U16X4:
-    case BRIG_TYPE_U32X2:
-    case BRIG_TYPE_S8X8:
-    case BRIG_TYPE_S16X4:
-    case BRIG_TYPE_S32X2:
-    case BRIG_TYPE_F16X4:
-    case BRIG_TYPE_F32X2:
-
-      return BRIG_TYPE_B64;
-
-    case BRIG_TYPE_B128:
-    case BRIG_TYPE_U8X16:
-    case BRIG_TYPE_U16X8:
-    case BRIG_TYPE_U32X4:
-    case BRIG_TYPE_U64X2:
-    case BRIG_TYPE_S8X16:
-    case BRIG_TYPE_S16X8:
-    case BRIG_TYPE_S32X4:
-    case BRIG_TYPE_S64X2:
-    case BRIG_TYPE_F16X8:
-    case BRIG_TYPE_F32X4:
-    case BRIG_TYPE_F64X2:
-      return BRIG_TYPE_B128;
-
-    default:
-      gcc_assert (seen_error ());
-      return t;
-    }
-}
-
 /* Map a normal HSAIL type to the type of the equivalent BRIG operand
    holding such, for constants and registers.  */
 
diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index 7be4db7..9fb8096 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -401,9 +401,8 @@ hsa_needs_cvt (BrigType16_t dtype, BrigType16_t stype)
   /* float <-> int conversions are real converts.  */
   if (hsa_type_float_p (dtype) != hsa_type_float_p (stype))
     return true;
-  /* When both types have different size (equivalent to different
-     underlying bit types), then we need CVT as well.  */
-  if (bittype_for_type (dtype) != bittype_for_type (stype))
+  /* When both types have different size, then we need CVT as well.  */
+  if (hsa_type_bit_size (dtype) != hsa_type_bit_size (stype))
     return true;
   return false;
 }
@@ -816,8 +815,8 @@ gen_address_calculation (tree exp, hsa_bb *hbb, vec 
<hsa_op_reg_p> ssa_map,
        hsa_op_immed *imm = hsa_alloc_immed_op (exp);
        if (addrtype != imm->type)
         {
-          gcc_assert (bittype_for_type (addrtype)
-                      > bittype_for_type (imm->type));
+          gcc_assert (hsa_type_bit_size (addrtype)
+                      > hsa_type_bit_size (imm->type));
           imm->type = addrtype;
         }
        return imm;
@@ -1181,12 +1180,13 @@ hsa_build_append_simple_mov (hsa_op_reg *dest, 
hsa_op_base *src, hsa_bb *hbb)
   insn->operands[1] = src;
   if (hsa_op_reg *sreg = dyn_cast <hsa_op_reg *> (src))
     {
-      gcc_assert (bittype_for_type (dest->type) == bittype_for_type 
(sreg->type));
+      gcc_assert (hsa_type_bit_size (dest->type)
+                 == hsa_type_bit_size (sreg->type));
       sreg->uses.safe_push (insn);
     }
   else
-    gcc_assert (bittype_for_type (dest->type)
-               == bittype_for_type (as_a <hsa_op_immed *> (src)->type));
+    gcc_assert (hsa_type_bit_size (dest->type)
+               == hsa_type_bit_size (as_a <hsa_op_immed *> (src)->type));
   set_reg_def (dest, insn);
   hsa_append_insn (hbb, insn);
 }
@@ -1280,17 +1280,17 @@ gen_hsa_insns_for_store (tree lhs, hsa_op_base *src, 
hsa_bb *hbb,
        {
          /* ...and all vector immediates apparently need to be vectors of
             unsigned bytes. */
-         BrigType16_t bt = bittype_for_type (imm->type);
-         gcc_assert (bt == bittype_for_type (mem->type));
-         switch (bt)
+         unsigned bs = hsa_type_bit_size (imm->type);
+         gcc_assert (bs == hsa_type_bit_size (mem->type));
+         switch (bs)
            {
-           case BRIG_TYPE_B32:
+           case 32:
              imm->type = BRIG_TYPE_U8X4;
              break;
-           case BRIG_TYPE_B64:
+           case 64:
              imm->type = BRIG_TYPE_U8X8;
              break;
-           case BRIG_TYPE_B128:
+           case 128:
              imm->type = BRIG_TYPE_U8X16;
              break;
            default:
@@ -1954,7 +1954,8 @@ specialop:
        atominsn->opcode = BRIG_OPCODE_ATOMIC;
        /* Should check what the memory scope is */
        atominsn->memoryscope = BRIG_MEMORY_SCOPE_WORKGROUP;
-       atominsn->type = bittype_for_type (hsa_type_for_scalar_tree_type 
(TREE_TYPE (lhs), false));
+       atominsn->type = hsa_bittype_for_type
+         (hsa_type_for_scalar_tree_type (TREE_TYPE (lhs), false));
        atominsn->operands[0] = dest;
        atominsn->operands[1] = addr;
        atominsn->operands[2]
diff --git a/gcc/hsa.c b/gcc/hsa.c
index 966949b..3212205 100644
--- a/gcc/hsa.c
+++ b/gcc/hsa.c
@@ -156,6 +156,97 @@ hsa_opcode_op_output_p (BrigOpcode16_t opcode, int opnum)
     }
 }
 
+/* Return size of HSA type T in bits.  */
+
+unsigned
+hsa_type_bit_size (BrigType16_t t)
+{
+  switch (t)
+    {
+    case BRIG_TYPE_B1:
+      return 1;
+
+    case BRIG_TYPE_U8:
+    case BRIG_TYPE_S8:
+    case BRIG_TYPE_B8:
+      return 8;
+
+    case BRIG_TYPE_U16:
+    case BRIG_TYPE_S16:
+    case BRIG_TYPE_B16:
+    case BRIG_TYPE_F16:
+      return 16;
+
+    case BRIG_TYPE_U32:
+    case BRIG_TYPE_S32:
+    case BRIG_TYPE_B32:
+    case BRIG_TYPE_F32:
+    case BRIG_TYPE_U8X4:
+    case BRIG_TYPE_U16X2:
+    case BRIG_TYPE_S8X4:
+    case BRIG_TYPE_S16X2:
+    case BRIG_TYPE_F16X2:
+      return 32;
+
+    case BRIG_TYPE_U64:
+    case BRIG_TYPE_S64:
+    case BRIG_TYPE_F64:
+    case BRIG_TYPE_B64:
+    case BRIG_TYPE_U8X8:
+    case BRIG_TYPE_U16X4:
+    case BRIG_TYPE_U32X2:
+    case BRIG_TYPE_S8X8:
+    case BRIG_TYPE_S16X4:
+    case BRIG_TYPE_S32X2:
+    case BRIG_TYPE_F16X4:
+    case BRIG_TYPE_F32X2:
+
+      return 64;
+
+    case BRIG_TYPE_B128:
+    case BRIG_TYPE_U8X16:
+    case BRIG_TYPE_U16X8:
+    case BRIG_TYPE_U32X4:
+    case BRIG_TYPE_U64X2:
+    case BRIG_TYPE_S8X16:
+    case BRIG_TYPE_S16X8:
+    case BRIG_TYPE_S32X4:
+    case BRIG_TYPE_S64X2:
+    case BRIG_TYPE_F16X8:
+    case BRIG_TYPE_F32X4:
+    case BRIG_TYPE_F64X2:
+      return 128;
+
+    default:
+      gcc_assert (seen_error ());
+      return t;
+    }
+}
+
+/* Return HSA bit-type with the same size as the type T.  */
+
+BrigType16_t
+hsa_bittype_for_type (BrigType16_t t)
+{
+  switch (hsa_type_bit_size (t))
+    {
+    case 1:
+      return BRIG_TYPE_B1;
+    case 8:
+      return BRIG_TYPE_B8;
+    case 16:
+      return BRIG_TYPE_B16;
+    case 32:
+      return BRIG_TYPE_B32;
+    case 64:
+      return BRIG_TYPE_B64;
+    case 128:
+      return BRIG_TYPE_B128;
+    default:
+      return t;
+    }
+}
+
 /* Create a mapping between the original function DECL and kernel name NAME.  
*/
 
 void
diff --git a/gcc/hsa.h b/gcc/hsa.h
index e8dec42..c0a8ead 100644
--- a/gcc/hsa.h
+++ b/gcc/hsa.h
@@ -612,6 +612,8 @@ void hsa_deinit_compilation_unit_data (void);
 bool hsa_machine_large_p (void);
 bool hsa_full_profile_p (void);
 bool hsa_opcode_op_output_p (BrigOpcode16_t, int);
+unsigned hsa_type_bit_size (BrigType16_t t);
+BrigType16_t hsa_bittype_for_type (BrigType16_t t);
 void hsa_add_kern_decl_mapping (tree decl, char *name);
 unsigned hsa_get_number_decl_kernel_mappings (void);
 tree hsa_get_decl_kernel_mapping_decl (unsigned i);
-- 
2.1.4

Reply via email to