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)