Support assigning constants to values.
Subzero has unrelated types for constants and variables. Both are
operands to instructions, but we can't express this relationship at
the Nucleus level. We'd require a large number of Value to Operand
conversions. Instead, an Assign instruction is provided to convert
a Constant into a Value.
Bug swiftshader:12
Change-Id: Ie35a2cea3e485c4012ed949f92825a41caca3367
Reviewed-on: https://swiftshader-review.googlesource.com/7370
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index dbb4802..594f748 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -53,6 +53,7 @@
namespace sw
{
class Value : public Ice::Variable {};
+ class Constant : public Ice::Constant {};
class BasicBlock : public Ice::CfgNode {};
Ice::Type T(Type *t)
@@ -70,6 +71,11 @@
return reinterpret_cast<Value*>(v);
}
+ Constant *C(Ice::Constant *c)
+ {
+ return reinterpret_cast<Constant*>(c);
+ }
+
Optimization optimization[10] = {InstructionCombining, Disabled};
void *loadImage(uint8_t *const elfImage)
@@ -421,6 +427,15 @@
assert(false && "UNIMPLEMENTED"); return nullptr;
}
+ Value *Nucleus::createAssign(Constant *constant)
+ {
+ Ice::Variable *value = ::function->makeVariable(constant->getType());
+ auto assign = Ice::InstAssign::create(::function, value, constant);
+ ::basicBlock->appendInst(assign);
+
+ return V(value);
+ }
+
Value *Nucleus::createNeg(Value *v)
{
assert(false && "UNIMPLEMENTED"); return nullptr;
@@ -451,9 +466,11 @@
return value;
}
- Value *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
+ Constant *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ auto store = Ice::InstStore::create(::function, constant, ptr, align);
+ ::basicBlock->appendInst(store);
+ return constant;
}
Value *Nucleus::createGEP(Value *ptr, Value *index)
@@ -720,7 +737,7 @@
Constant *Nucleus::createConstantInt(int i)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return C(::context->getConstantInt32(i));
}
Constant *Nucleus::createConstantInt(unsigned int i)