Implement cast operations.

Bug swiftshader:6

Change-Id: I12e1c109c5954ef65ea00750c2d5b027c0c7765a
Reviewed-on: https://swiftshader-review.googlesource.com/7394
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index f1d1631..7948012 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -524,16 +524,6 @@
 		return V(::builder->CreateFPExt(v, destType));
 	}
 
-	Value *Nucleus::createPtrToInt(Value *v, Type *destType)
-	{
-		return V(::builder->CreatePtrToInt(v, destType));
-	}
-
-	Value *Nucleus::createIntToPtr(Value *v, Type *destType)
-	{
-		return V(::builder->CreateIntToPtr(v, destType));
-	}
-
 	Value *Nucleus::createBitCast(Value *v, Type *destType)
 	{
 		return V(::builder->CreateBitCast(v, destType));
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index a221db3..aae8ad9 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -113,8 +113,6 @@
 		static Value *createSIToFP(Value *V, Type *destType);
 		static Value *createFPTrunc(Value *V, Type *destType);
 		static Value *createFPExt(Value *V, Type *destType);
-		static Value *createPtrToInt(Value *V, Type *destType);
-		static Value *createIntToPtr(Value *V, Type *destType);
 		static Value *createBitCast(Value *V, Type *destType);
 		static Value *createIntCast(Value *V, Type *destType, bool isSigned);
 
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index bdb00d2..ade6e83 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -498,59 +498,63 @@
 		assert(false && "UNIMPLEMENTED"); return nullptr;
 	}
 
+	static Value *createCast(Ice::InstCast::OpKind op, Value *v, Type *destType)
+	{
+		if(T(v->getType()) == destType)
+		{
+			return v;
+		}
+
+		Ice::Variable *result = ::function->makeVariable(T(destType));
+		Ice::InstCast *cast = Ice::InstCast::create(::function, op, result, v);
+		::basicBlock->appendInst(cast);
+
+		return V(result);
+	}
+
 	Value *Nucleus::createTrunc(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Trunc, v, destType);
 	}
 
 	Value *Nucleus::createZExt(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Zext, v, destType);
 	}
 
 	Value *Nucleus::createSExt(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Sext, v, destType);
 	}
 
 	Value *Nucleus::createFPToSI(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Fptosi, v, destType);
 	}
 
 	Value *Nucleus::createUIToFP(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Uitofp, v, destType);
 	}
 
 	Value *Nucleus::createSIToFP(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Sitofp, v, destType);
 	}
 
 	Value *Nucleus::createFPTrunc(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Fptrunc, v, destType);
 	}
 
 	Value *Nucleus::createFPExt(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
-	}
-
-	Value *Nucleus::createPtrToInt(Value *v, Type *destType)
-	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
-	}
-
-	Value *Nucleus::createIntToPtr(Value *v, Type *destType)
-	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Fpext, v, destType);
 	}
 
 	Value *Nucleus::createBitCast(Value *v, Type *destType)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return createCast(Ice::InstCast::Bitcast, v, destType);
 	}
 
 	Value *Nucleus::createIntCast(Value *v, Type *destType, bool isSigned)