summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2015-12-01 16:10:39 +0800
committerYang Rong <rong.r.yang@intel.com>2015-12-14 15:11:58 +0800
commit81fbb83890db4eb676f126d16b572472d7d63e6a (patch)
tree0b8780693039c9ef01e549ae348d2e865ffecde5
parent3c083db0b9b54b838a17843c78f9be437016847c (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.cpp24
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;