Hi,

this patch adds two hsa builtins and code for emission of HSAIL for
them and for BUILT_IN_GOMP_BARRIER.  These built-ins are going to be
introduced to GIMPLE IL at OMP expansion time by the subsequent patch
in the series.  I plan to experiment with adding more builtins for
special HSAIL instructions but that is a separate effort.

I'll commit this to the hsa branch in a few moments and then to trunk
at some point in summer.

Thanks,

Martin

2016-06-03  Martin Jambor  <mjam...@suse.cz>

        * hsa-builtins.def (BUILT_IN_HSA_GET_WORKGROUP_ID): New.
        (BUILT_IN_HSA_GET_WORKITEM_ID): Likewise.
        * hsa-gen.c (gen_hsa_insns_for_call): Emit HSAIL for the above
        builtins and for BUILT_IN_GOMP_BARRIER.  Move emiting of
        BUILT_IN_HSA_GET_WORKITEM_ABSID up in the function.
---
 gcc/hsa-builtins.def |  4 ++++
 gcc/hsa-gen.c        | 38 ++++++++++++++++++++++++++++++--------
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/gcc/hsa-builtins.def b/gcc/hsa-builtins.def
index e4681c1..3f183f1 100644
--- a/gcc/hsa-builtins.def
+++ b/gcc/hsa-builtins.def
@@ -27,5 +27,9 @@ along with GCC; see the file COPYING3.  If not see
 /* The reason why they aren't in gcc/builtins.def is that the Fortran front end
    doesn't source those.  */
 
+DEF_HSA_BUILTIN (BUILT_IN_HSA_GET_WORKGROUP_ID, "hsa_get_workgroup_id",
+                BT_FN_UINT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
+DEF_HSA_BUILTIN (BUILT_IN_HSA_GET_WORKITEM_ID, "hsa_get_workitem_id",
+                BT_FN_UINT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
 DEF_HSA_BUILTIN (BUILT_IN_HSA_GET_WORKITEM_ABSID, "hsa_get_workitem_absid",
                 BT_FN_UINT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index fb376a1..efcba8c 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -5783,6 +5783,36 @@ gen_hsa_insns_for_call (gimple *stmt, hsa_bb *hbb)
        hbb->append_insn (atominsn);
        break;
       }
+
+    case BUILT_IN_HSA_GET_WORKGROUP_ID:
+      {
+       hsa_op_immed *bdim = new hsa_op_immed (gimple_call_arg (stmt, 0), true);
+       if (bdim->m_type != BRIG_TYPE_U32)
+         bdim->get_in_type (BRIG_TYPE_U32, hbb);
+       query_hsa_grid (stmt, BRIG_OPCODE_WORKGROUPID, bdim, hbb);
+       break;
+      }
+    case BUILT_IN_HSA_GET_WORKITEM_ID:
+      {
+       hsa_op_immed *bdim = new hsa_op_immed (gimple_call_arg (stmt, 0), true);
+       if (bdim->m_type != BRIG_TYPE_U32)
+         bdim->get_in_type (BRIG_TYPE_U32, hbb);
+       query_hsa_grid (stmt, BRIG_OPCODE_WORKITEMID, bdim, hbb);
+       break;
+      }
+    case BUILT_IN_HSA_GET_WORKITEM_ABSID:
+      {
+       hsa_op_immed *bdim = new hsa_op_immed (gimple_call_arg (stmt, 0), true);
+       if (bdim->m_type != BRIG_TYPE_U32)
+         bdim->get_in_type (BRIG_TYPE_U32, hbb);
+       query_hsa_grid (stmt, BRIG_OPCODE_WORKITEMABSID, bdim, hbb);
+       break;
+      }
+
+    case BUILT_IN_GOMP_BARRIER:
+      hbb->append_insn (new hsa_insn_br (0, BRIG_OPCODE_BARRIER, 
BRIG_TYPE_NONE,
+                                        BRIG_WIDTH_ALL));
+      break;
     case BUILT_IN_GOMP_PARALLEL:
       {
        gcc_checking_assert (gimple_call_num_args (stmt) == 4);
@@ -5798,14 +5828,6 @@ gen_hsa_insns_for_call (gimple *stmt, hsa_bb *hbb)
 
        break;
       }
-    case BUILT_IN_HSA_GET_WORKITEM_ABSID:
-      {
-       hsa_op_immed *bdim = new hsa_op_immed (gimple_call_arg (stmt, 0), true);
-       if (bdim->m_type != BRIG_TYPE_U32)
-         bdim->get_in_type (BRIG_TYPE_U32, hbb);
-       query_hsa_grid (stmt, BRIG_OPCODE_WORKITEMABSID, bdim, hbb);
-       break;
-      }
     case BUILT_IN_OMP_GET_THREAD_NUM:
       {
        query_hsa_grid (stmt, BRIG_OPCODE_WORKITEMABSID, 0, hbb);
-- 
2.8.2

Reply via email to