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