Implement remaining constant creations.

Bug swiftshader:6

Change-Id: I3ab9023e2ac91a8435b403ebdd16e741197ecf6b
Reviewed-on: https://swiftshader-review.googlesource.com/7757
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8138
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 91defcb..26521d3 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -719,7 +719,7 @@
 		return shuffle;
 	}
 
-	Value *Nucleus::createConstantPointer(const void *address, Type *Ty, bool isConstant, unsigned int Align)
+	Value *Nucleus::createConstantPointer(const void *address, Type *Ty, unsigned int align)
 	{
 		const GlobalValue *existingGlobal = ::executionEngine->getGlobalValueAtAddress(const_cast<void*>(address));   // FIXME: Const
 
@@ -728,9 +728,8 @@
 			return (Value*)existingGlobal;
 		}
 
-		llvm::GlobalValue *global = new llvm::GlobalVariable(*::module, Ty, isConstant, llvm::GlobalValue::ExternalLinkage, 0, "");
-
-		global->setAlignment(Align);
+		llvm::GlobalValue *global = new llvm::GlobalVariable(*::module, Ty, true, llvm::GlobalValue::ExternalLinkage, 0, "");
+		global->setAlignment(align);
 
 		::executionEngine->addGlobalMapping(global, const_cast<void*>(address));
 
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index 51c041b..c91ae17 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -164,7 +164,7 @@
 		static Value *createNullPointer(Type *type);
 		static Value *createConstantVector(const int64_t *constants, Type *type);
 		static Value *createConstantVector(const double *constants, Type *type);
-		static Value *createConstantPointer(const void *external, Type *type, bool isConstant, unsigned int align);
+		static Value *createConstantPointer(const void *external, Type *type, unsigned int align = 0);
 
 		static Type *getPointerType(Type *elementType);
 
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index c0e2394..86c867c 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -2566,7 +2566,7 @@
 	template<class T>
 	Pointer<T>::Pointer(const void *external) : alignment((intptr_t)external & 0x0000000F ? 1 : 16)
 	{
-		Value *globalPointer = Nucleus::createConstantPointer(external, T::getType(), false, alignment);
+		Value *globalPointer = Nucleus::createConstantPointer(external, T::getType(), alignment);
 
 		LValue<Pointer<T>>::storeValue(globalPointer);
 	}
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index c2d3fd9..48f3361 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -434,6 +434,7 @@
 		assembler->alignFunction();
 		objectWriter->writeFunctionCode(::function->getFunctionName(), false, assembler.get());
 		::context->lowerGlobals("last");
+		::context->lowerConstants();
 		objectWriter->setUndefinedSyms(::context->getConstantExternSyms());
 		objectWriter->writeNonUserSections();
 
@@ -1047,7 +1048,7 @@
 		assert(false && "UNIMPLEMENTED"); return nullptr;
 	}
 
-	Value *Nucleus::createConstantPointer(const void *address, Type *Ty, bool isConstant, unsigned int Align)
+	Value *Nucleus::createConstantPointer(const void *address, Type *Ty, unsigned int align)
 	{
 		if(sizeof(void*) == 8)
 		{
@@ -1073,12 +1074,20 @@
 
 	Value *Nucleus::createNullValue(Type *Ty)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		if(Ice::isVectorType(T(Ty)))
+		{
+			int64_t c[4] = {0, 0, 0, 0};
+			return createConstantVector(c, Ty);
+		}
+		else
+		{
+			return createAssign(::context->getConstantZero(T(Ty)));
+		}
 	}
 
 	Value *Nucleus::createConstantLong(int64_t i)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt64(i));
 	}
 
 	Value *Nucleus::createConstantInt(int i)
@@ -1088,22 +1097,22 @@
 
 	Value *Nucleus::createConstantInt(unsigned int i)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt32(i));
 	}
 
 	Value *Nucleus::createConstantBool(bool b)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt1(b));
 	}
 
 	Value *Nucleus::createConstantByte(signed char i)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt8(i));
 	}
 
 	Value *Nucleus::createConstantByte(unsigned char i)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt8(i));
 	}
 
 	Value *Nucleus::createConstantShort(short i)
@@ -1113,17 +1122,24 @@
 
 	Value *Nucleus::createConstantShort(unsigned short i)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantInt16(i));
 	}
 
 	Value *Nucleus::createConstantFloat(float x)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createAssign(::context->getConstantFloat(x));
 	}
 
 	Value *Nucleus::createNullPointer(Type *Ty)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		if(true)
+		{
+			return createNullValue(T(sizeof(void*) == 8 ? Ice::IceType_i64 : Ice::IceType_i32));
+		}
+		else
+		{
+			return createConstantPointer(nullptr, Ty);
+		}
 	}
 
 	Value *Nucleus::createConstantVector(const int64_t *constants, Type *type)