Implement Pointer<> support for Subzero.

Bug swiftshader:11

Change-Id: I794ef54a7c2ecde71ee6344c63955d2f838ff189
Reviewed-on: https://swiftshader-review.googlesource.com/7331
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 9adc3fb..a27b986 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -245,13 +245,24 @@
 
 	Value *Nucleus::allocateStackVariable(Type *t, int arraySize)
 	{
+		assert(arraySize == 0 && "UNIMPLEMENTED");
+
 		Ice::Type type = T(t);
-		Ice::Variable *value = ::function->makeVariable(type);
-		assert(type == Ice::IceType_i32 && arraySize == 0 && "UNIMPLEMENTED");
-		auto bytes = Ice::ConstantInteger32::create(::context, type, 4);
-		auto alloca = Ice::InstAlloca::create(::function, value, bytes, 4);
-		::function->getEntryNode()->appendInst(alloca);
-		return V(value);
+		
+		int32_t size = 0;
+		switch(type)
+		{
+		case Ice::IceType_i32: size = 4; break;
+		case Ice::IceType_i64: size = 8; break;
+		default: assert(false && "UNIMPLEMENTED" && type);
+		}
+
+		auto bytes = Ice::ConstantInteger32::create(::context, type, size);
+		auto address = ::function->makeVariable(T(getPointerType(t)));
+		auto alloca = Ice::InstAlloca::create(::function, address, bytes, size);
+		::function->getEntryNode()->getInsts().push_front(alloca);
+
+		return V(address);
 	}
 
 	BasicBlock *Nucleus::createBasicBlock()
@@ -425,9 +436,9 @@
 		assert(false && "UNIMPLEMENTED"); return nullptr;
 	}
 
-	Value *Nucleus::createLoad(Value *ptr, bool isVolatile, unsigned int align)
+	Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align)
 	{
-		Ice::Variable *value = ::function->makeVariable(ptr->getType());
+		Ice::Variable *value = ::function->makeVariable(T(type));
 		auto load = Ice::InstLoad::create(::function, value, ptr, align);
 		::basicBlock->appendInst(load);
 		return V(value);
@@ -687,7 +698,14 @@
 
 	Type *Nucleus::getPointerType(Type *ElementType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		if(sizeof(void*) == 8)
+		{
+			return T(Ice::IceType_i64);
+		}
+		else
+		{
+			return T(Ice::IceType_i32);
+		}
 	}
 
 	Constant *Nucleus::createNullValue(Type *Ty)
@@ -755,14 +773,14 @@
 		return T(Ice::IceType_void);
 	}
 
-	LValue::LValue(Type *type, int arraySize)
+	LValue::LValue(Type *type, int arraySize) : type(type)
 	{
 		address = Nucleus::allocateStackVariable(type, arraySize);
 	}
 
 	Value *LValue::loadValue(unsigned int alignment) const
 	{
-		return Nucleus::createLoad(address, false, alignment);
+		return Nucleus::createLoad(address, type, false, alignment);
 	}
 
 	Value *LValue::storeValue(Value *value, unsigned int alignment) const