summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuiling Song <ruiling.song@intel.com>2015-11-27 10:09:09 +0800
committerYang Rong <rong.r.yang@intel.com>2015-12-23 15:04:08 +0800
commit67a0e9e721d09dc8f69bfafe085b6889e026f909 (patch)
tree2f34b3c9456f04056231af63a3849970ff6101f1
parentaa4819d6827f276cbe90d22e6f3a0cc10c767d0f (diff)
ocl20/GBE: support generic load/store
Signed-off-by: Ruiling Song <ruiling.song@intel.com> Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r--backend/src/backend/gen_insn_selection.cpp88
-rw-r--r--backend/src/backend/gen_register.hpp6
-rw-r--r--backend/src/ir/instruction.cpp1
-rw-r--r--backend/src/ir/instruction.hpp1
-rw-r--r--backend/src/llvm/llvm_gen_backend.cpp8
5 files changed, 101 insertions, 3 deletions
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index f3008e0d..d19f985e 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -3577,6 +3577,17 @@ namespace gbe
return GEN_BYTE_SCATTER_BYTE;
}
}
+ ir::Register generateLocalMask(Selection::Opaque &sel, GenRegister addr) {
+ sel.push();
+ ir::Register localMask = sel.reg(ir::FAMILY_BOOL);
+ sel.curr.physicalFlag = 0;
+ sel.curr.modFlag = 1;
+ sel.curr.predicate = GEN_PREDICATE_NONE;
+ sel.curr.flagIndex = localMask;
+ sel.CMP(GEN_CONDITIONAL_L, addr, GenRegister::immud(64*1024));
+ sel.pop();
+ return localMask;
+ }
class LoadInstructionPattern : public SelectionPattern
{
@@ -3657,9 +3668,9 @@ namespace gbe
sel.curr.noMask = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
}
+ vector<GenRegister> btiTemp = sel.getBTITemps(AM);
if (AM == AM_DynamicBti || AM == AM_StaticBti) {
- vector<GenRegister> btiTemp = sel.getBTITemps(AM);
if (AM == AM_DynamicBti) {
Register btiReg = insn.getBtiReg();
sel.UNTYPED_READ(addr, dst.data(), valueNum, sel.selReg(btiReg, TYPE_U32), btiTemp);
@@ -3673,8 +3684,20 @@ namespace gbe
GenRegister addrDW = addr;
if (addrBytes == 8)
addrDW = convertU64ToU32(sel, addr);
- vector<GenRegister> btiTemp;
sel.UNTYPED_READ(addrDW, dst.data(), valueNum, GenRegister::immud(bti), btiTemp);
+ } else if (addrSpace == ir::MEM_GENERIC) {
+ Register localMask = generateLocalMask(sel, addr);
+ sel.push();
+ sel.curr.useVirtualFlag(localMask, GEN_PREDICATE_NORMAL);
+ GenRegister addrDW = addr;
+ if (addrBytes == 8)
+ addrDW = convertU64ToU32(sel, addr);
+ sel.UNTYPED_READ(addrDW, dst.data(), valueNum, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ untypedReadStateless(sel, addr, dst);
+ sel.pop();
+
} else {
untypedReadStateless(sel, addr, dst);
}
@@ -3825,6 +3848,18 @@ namespace gbe
if (addrBytes == 8)
addrDW = convertU64ToU32(sel, addr);
read64Legacy(sel, addrDW, dst, b, btiTemp);
+ } else if (addrSpace == ir::MEM_GENERIC) {
+ Register localMask = generateLocalMask(sel, addr);
+ sel.push();
+ sel.curr.useVirtualFlag(localMask, GEN_PREDICATE_NORMAL);
+ GenRegister addrDW = addr;
+ if (addrBytes == 8)
+ addrDW = convertU64ToU32(sel, addr);
+ read64Legacy(sel, addrDW, dst, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ read64Stateless(sel, addr, dst);
+ sel.pop();
} else {
read64Stateless(sel, addr, dst);
}
@@ -4036,6 +4071,18 @@ namespace gbe
}
sel.BYTE_GATHER(dst, addrDW, elemSize, GenRegister::immud(bti), btiTemp);
+ } else if (addrSpace == ir::MEM_GENERIC) {
+ Register localMask = generateLocalMask(sel, addr);
+ sel.push();
+ sel.curr.useVirtualFlag(localMask, GEN_PREDICATE_NORMAL);
+ GenRegister addrDW = addr;
+ if (addrBytes == 8)
+ addrDW = convertU64ToU32(sel, addr);
+ sel.BYTE_GATHER(dst, addrDW, elemSize, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ byteGatherStateless(sel, addr, dst, elemSize);
+ sel.pop();
} else {
byteGatherStateless(sel, addr, dst, elemSize);
}
@@ -4151,6 +4198,7 @@ namespace gbe
insn.getAddressSpace() == MEM_CONSTANT ||
insn.getAddressSpace() == MEM_PRIVATE ||
insn.getAddressSpace() == MEM_LOCAL ||
+ insn.getAddressSpace() == MEM_GENERIC ||
insn.getAddressSpace() == MEM_MIXED);
//GBE_ASSERT(sel.isScalarReg(insn.getValue(0)) == false);
@@ -4281,6 +4329,18 @@ namespace gbe
addr = convertU64ToU32(sel, address);
}
sel.UNTYPED_WRITE(addr, value.data(), valueNum, GenRegister::immud(0xfe), btiTemp);
+ } 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.UNTYPED_WRITE(addrDW, value.data(), valueNum, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ untypedWriteStateless(sel, address, value);
+ sel.pop();
} else {
untypedWriteStateless(sel, address, value);
}
@@ -4397,6 +4457,18 @@ namespace gbe
addr = convertU64ToU32(sel, address);
}
write64Legacy(sel, addr, src, b, btiTemp);
+ } 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);
+ write64Legacy(sel, addrDW, src, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ write64Stateless(sel, address, src);
+ sel.pop();
} else {
GBE_ASSERT(sel.hasLongType());
write64Stateless(sel, address, src);
@@ -4466,6 +4538,18 @@ namespace gbe
addr = convertU64ToU32(sel, address);
}
sel.BYTE_SCATTER(addr, data, elemSize, GenRegister::immud(0xfe), btiTemp);
+ } 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.BYTE_SCATTER(addrDW, data, elemSize, GenRegister::immud(0xfe), btiTemp);
+
+ sel.curr.inversePredicate = 1;
+ byteScatterStateless(sel, address, data, elemSize);
+ sel.pop();
} else {
byteScatterStateless(sel, address, data, elemSize);
}
diff --git a/backend/src/backend/gen_register.hpp b/backend/src/backend/gen_register.hpp
index bafff297..f26dec4c 100644
--- a/backend/src/backend/gen_register.hpp
+++ b/backend/src/backend/gen_register.hpp
@@ -169,6 +169,12 @@ namespace gbe
NOT_IMPLEMENTED;
}
}
+ void useVirtualFlag(ir::Register flag, unsigned pred) {
+ modFlag = 0;
+ physicalFlag = 0;
+ flagIndex = flag;
+ predicate = pred;
+ }
void useFlag(int nr, int subnr) {
flag = nr;
subFlag = subnr;
diff --git a/backend/src/ir/instruction.cpp b/backend/src/ir/instruction.cpp
index 02961bd2..e8f7aa8e 100644
--- a/backend/src/ir/instruction.cpp
+++ b/backend/src/ir/instruction.cpp
@@ -1565,6 +1565,7 @@ namespace ir {
case MEM_CONSTANT: return out << "constant";
case MEM_PRIVATE: return out << "private";
case MEM_MIXED: return out << "mixed";
+ case MEM_GENERIC: return out << "generic";
case MEM_INVALID: return out << "invalid";
};
return out;
diff --git a/backend/src/ir/instruction.hpp b/backend/src/ir/instruction.hpp
index 0fc7a441..67ce8337 100644
--- a/backend/src/ir/instruction.hpp
+++ b/backend/src/ir/instruction.hpp
@@ -62,6 +62,7 @@ namespace ir {
MEM_CONSTANT, //!< Immutable global memory
MEM_PRIVATE, //!< Per thread private memory
MEM_MIXED, //!< mixed address space pointer.
+ MEM_GENERIC, //!< mixed address space pointer.
MEM_INVALID
};
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index e58f4375..cb47097b 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -211,6 +211,7 @@ namespace gbe
case 1: return ir::MEM_GLOBAL;
case 2: return ir::MEM_CONSTANT;
case 3: return ir::MEM_LOCAL;
+ case 4: return ir::MEM_GENERIC;
}
GBE_ASSERT(false);
return ir::MEM_GLOBAL;
@@ -3101,7 +3102,10 @@ namespace gbe
case Instruction::FPTrunc:
case Instruction::Trunc:
this->newRegister(&I);
- break;
+ break;
+ case Instruction::AddrSpaceCast:
+ regTranslator.newValueProxy(srcValue, dstValue);
+ break;
default: NOT_SUPPORTED;
}
}
@@ -3109,6 +3113,8 @@ namespace gbe
void GenWriter::emitCastInst(CastInst &I) {
switch (I.getOpcode())
{
+ case Instruction::AddrSpaceCast:
+ break;
case Instruction::PtrToInt:
case Instruction::IntToPtr:
{