summaryrefslogtreecommitdiff
path: root/backend/src/backend/gen_context.cpp
diff options
context:
space:
mode:
authorGrigore Lupescu <grigore.lupescu at intel.com>2016-04-11 17:36:16 +0300
committerYang Rong <rong.r.yang@intel.com>2016-05-18 15:10:36 +0800
commitb561e87a34f59093de7410f3bd3c0007610133a7 (patch)
tree73625c32ab1c9ce1d4ffe1085d71ec351d86c136 /backend/src/backend/gen_context.cpp
parent3e829674e077e79dc724ab642c8d01aec9d8a212 (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>
Diffstat (limited to 'backend/src/backend/gen_context.cpp')
-rw-r--r--backend/src/backend/gen_context.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index a959ba24..7073b807 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -3263,12 +3263,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 */