diff options
author | Junyan He <junyan.he@linux.intel.com> | 2015-12-01 16:10:39 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2015-12-14 15:11:58 +0800 |
commit | 81fbb83890db4eb676f126d16b572472d7d63e6a (patch) | |
tree | 0b8780693039c9ef01e549ae348d2e865ffecde5 | |
parent | 3c083db0b9b54b838a17843c78f9be437016847c (diff) |
Backend: Add reduce add to gen_context.
Signed-off-by: Junyan He <junyan.he@linux.intel.com>
Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r-- | backend/src/backend/gen_context.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp index 880d8b72..a2e11a4e 100644 --- a/backend/src/backend/gen_context.cpp +++ b/backend/src/backend/gen_context.cpp @@ -2863,7 +2863,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(); } @@ -2874,7 +2877,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) { @@ -2884,6 +2888,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); @@ -2935,6 +2943,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(); @@ -3089,7 +3108,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; |