summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Xionghu <xionghu.luo@intel.com>2016-03-01 19:35:07 +0800
committerYang Rong <rong.r.yang@intel.com>2016-11-08 20:38:21 +0800
commitd6f43f57179bb36909b986e3593be75a66829dce (patch)
treeb0b62d118117cef71e48940983b4fa1138696e29
parent9c994cc75cb86e06bce428e1eef142cedb07de35 (diff)
support generic atomic.
Signed-off-by: Luo Xionghu <xionghu.luo@intel.com> Reviewed-by: Ruiling Song <ruiling.song@intel.com>
-rw-r--r--backend/src/backend/gen_insn_selection.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index 14175412..a80a6a88 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -6334,8 +6334,19 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp
if (addrBytes == 8)
addrDW = convertU64ToU32(sel, address);
sel.ATOMIC(dst, genAtomicOp, msgPayload, addrDW, src1, src2, GenRegister::immud(0xfe), sel.getBTITemps(AM));
- }
- else
+ } else if (addrSpace == ir::MEM_GENERIC) {
+ Register localMask = generateLocalMask(sel, address);
+ sel.push();
+ sel.curr.useVirtualFlag(localMask, GEN_PREDICATE_NORMAL);
+ GenRegister addrDW = address;
+ if (addrBytes == 8)
+ addrDW = convertU64ToU32(sel, address);
+ sel.ATOMIC(dst, genAtomicOp, msgPayload, addrDW, src1, src2, GenRegister::immud(0xfe), sel.getBTITemps(AM));
+
+ sel.curr.inversePredicate = 1;
+ untypedAtomicA64Stateless(sel, insn, msgPayload, dst, address, src1, src2, GenRegister::immud(0xff));
+ sel.pop();
+ } else
untypedAtomicA64Stateless(sel, insn, msgPayload, dst, address, src1, src2, GenRegister::immud(0xff));
markAllChildren(dag);