From: Junyan He <junyan...@linux.intel.com> Signed-off-by: Junyan He <junyan...@linux.intel.com> --- backend/src/backend/gen_context.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp index d099920..c8f0713 100644 --- a/backend/src/backend/gen_context.cpp +++ b/backend/src/backend/gen_context.cpp @@ -2856,7 +2856,10 @@ namespace gbe cond = GEN_CONDITIONAL_GE; p->SEL_CMP(cond, msgData, threadData, msgData); + } else if (wg_op == ir::WORKGROUP_OP_REDUCE_ADD) { + p->ADD(msgData, threadData, msgData); } + p->pop(); } @@ -2867,7 +2870,8 @@ namespace gbe p->MOV(dataReg, GenRegister::immud(0xFFFFFFFF)); } else { GBE_ASSERT(wg_op == ir::WORKGROUP_OP_REDUCE_MAX || wg_op == ir::WORKGROUP_OP_INCLUSIVE_MAX - || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MAX); + || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MAX || wg_op == ir::WORKGROUP_OP_REDUCE_ADD + || wg_op == ir::WORKGROUP_OP_INCLUSIVE_ADD || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_ADD); p->MOV(dataReg, GenRegister::immud(0)); } } else if (dataReg.type == GEN_TYPE_F) { @@ -2877,6 +2881,10 @@ namespace gbe } else if (wg_op == ir::WORKGROUP_OP_REDUCE_MAX || wg_op == ir::WORKGROUP_OP_INCLUSIVE_MAX || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_MAX) { p->MOV(GenRegister::retype(dataReg, GEN_TYPE_UD), GenRegister::immud(0xFF800000)); // -inf + } else { + GBE_ASSERT(wg_op == ir::WORKGROUP_OP_REDUCE_ADD || wg_op == ir::WORKGROUP_OP_INCLUSIVE_ADD + || wg_op == ir::WORKGROUP_OP_EXCLUSIVE_ADD); + p->MOV(GenRegister::retype(dataReg, GEN_TYPE_UD), GenRegister::immud(0x0)); } } else { GBE_ASSERT(0); @@ -2928,6 +2936,17 @@ namespace gbe } } } + } else if (wg_op == ir::WORKGROUP_OP_REDUCE_ADD) { + GBE_ASSERT(tmp.type == theVal.type); + GenRegister v = GenRegister::toUniform(tmp, theVal.type); + for (uint32_t i = 0; i < simd; i++) { + p->ADD(threadData, threadData, v); + v.subnr += typeSize(theVal.type); + if (v.subnr == 32) { + v.subnr = 0; + v.nr++; + } + } } p->pop(); @@ -3082,7 +3101,8 @@ do { \ } p->pop(); /* Broadcast the result. */ - if (wg_op == ir::WORKGROUP_OP_REDUCE_MIN || wg_op == ir::WORKGROUP_OP_REDUCE_MAX) { + if (wg_op == ir::WORKGROUP_OP_REDUCE_MIN || wg_op == ir::WORKGROUP_OP_REDUCE_MAX + || wg_op == ir::WORKGROUP_OP_REDUCE_ADD) { p->push(); { p->curr.predicate = GEN_PREDICATE_NORMAL; p->curr.noMask = 1; -- 1.7.9.5 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet