diff options
author | Grigore Lupescu <grigore.lupescu at intel.com> | 2016-04-11 17:36:16 +0300 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2016-04-14 14:13:36 +0800 |
commit | 5536699c9ddd0759560c3f55dfadab186e43c6be (patch) | |
tree | 5bf6dffa7996a409b9db9e9b82905a37f71764d7 | |
parent | d6ffeedec5366f531114bb25bc988de0eaa09ff4 (diff) |
Backend: Workgroup scan cmp qword, workaround for execution width 16
Signed-off-by: Grigore Lupescu <grigore.lupescu at intel.com>
Reviewed-by: Pan Xiuli <xiuli.pan@intel.com>
-rw-r--r-- | backend/src/backend/gen_context.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp index 056fe3a9..cac78a96 100644 --- a/backend/src/backend/gen_context.cpp +++ b/backend/src/backend/gen_context.cpp @@ -2768,12 +2768,32 @@ namespace gbe if(wg_op == ir::WORKGROUP_OP_INCLUSIVE_ADD || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_ADD) p->ADD(dst, dst, partialData); - else if(wg_op == ir::WORKGROUP_OP_INCLUSIVE_MIN - || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MIN) + else if(wg_op == ir::WORKGROUP_OP_INCLUSIVE_MIN || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MIN) + { p->SEL_CMP(GEN_CONDITIONAL_LE, dst, dst, partialData); - else if(wg_op == ir::WORKGROUP_OP_INCLUSIVE_MAX - || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MAX) + /* workaround QW datatype on CMP */ + if(dst.type == GEN_TYPE_UL || dst.type == GEN_TYPE_L){ + p->SEL_CMP(GEN_CONDITIONAL_LE, dst.offset(dst, 1, 0), + dst.offset(dst, 1, 0), partialData); + p->SEL_CMP(GEN_CONDITIONAL_LE, dst.offset(dst, 2, 0), + dst.offset(dst, 2, 0), partialData); + p->SEL_CMP(GEN_CONDITIONAL_LE, dst.offset(dst, 3, 0), + dst.offset(dst, 3, 0), partialData); + } + } + else if(wg_op == ir::WORKGROUP_OP_INCLUSIVE_MAX || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MAX) + { p->SEL_CMP(GEN_CONDITIONAL_GE, dst, dst, partialData); + /* workaround QW datatype on CMP */ + if(dst.type == GEN_TYPE_UL || dst.type == GEN_TYPE_L){ + p->SEL_CMP(GEN_CONDITIONAL_GE, dst.offset(dst, 1, 0), + dst.offset(dst, 1, 0), partialData); + p->SEL_CMP(GEN_CONDITIONAL_GE, dst.offset(dst, 2, 0), + dst.offset(dst, 2, 0), partialData); + p->SEL_CMP(GEN_CONDITIONAL_GE, dst.offset(dst, 3, 0), + dst.offset(dst, 3, 0), partialData); + } + } } /* corner cases for threads 0 */ |