Build fixes for LLVM 3 backend

Ctlz and Cttz are stubbed for now. Will fix after the builds turn green.

Bug: b/130343040
Tests: dEQP-VK.glsl.builtin.precision.*
Tests: dEQP-VK.glsl.builtin.function.integer.findMSB.*
Change-Id: Ibff6a52bee7f5440c536dfc7a61ad4ba3e96743d
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28868
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 468acc4..418e66d 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -3106,13 +3106,13 @@
 
 	static RValue<Float4> TransformFloat4PerElement(RValue<Float4> v, const char* name)
 	{
-		auto funcTy = ::llvm::FunctionType::get(T(Float::getType()), {T(Float::getType())}, false);
+		auto funcTy = ::llvm::FunctionType::get(T(Float::getType()), ::llvm::ArrayRef<llvm::Type*>(T(Float::getType())), false);
 		auto func = ::module->getOrInsertFunction(name, funcTy);
 		llvm::Value *out = ::llvm::UndefValue::get(T(Float4::getType()));
 		for (uint64_t i = 0; i < 4; i++)
 		{
-			auto el = ::builder->CreateCall(func, ::builder->CreateExtractElement(V(v.value), i));
-			out = ::builder->CreateInsertElement(out, el, i);
+			auto el = ::builder->CreateCall(func, V(Nucleus::createExtractElement(v.value, Float::getType(), i)));
+			out = V(Nucleus::createInsertElement(V(out), V(el), i));
 		}
 		return RValue<Float4>(V(out));
 	}
@@ -3164,68 +3164,84 @@
 
 	RValue<Float4> Atan2(RValue<Float4> x, RValue<Float4> y)
 	{
-		auto funcTy = ::llvm::FunctionType::get(T(Float::getType()),
-				{T(Float::getType()), T(Float::getType())}, false);
+		::llvm::SmallVector<::llvm::Type*, 2> paramTys;
+		paramTys.push_back(T(Float::getType()));
+		paramTys.push_back(T(Float::getType()));
+		auto funcTy = ::llvm::FunctionType::get(T(Float::getType()), paramTys, false);
 		auto func = ::module->getOrInsertFunction("atan2f", funcTy);
 		llvm::Value *out = ::llvm::UndefValue::get(T(Float4::getType()));
 		for (uint64_t i = 0; i < 4; i++)
 		{
-			auto el = ::builder->CreateCall(func, {
-					::builder->CreateExtractElement(V(x.value), i),
-					::builder->CreateExtractElement(V(y.value), i),
-				});
-			out = ::builder->CreateInsertElement(out, el, i);
+			auto el = ::builder->CreateCall2(func, ARGS(
+					V(Nucleus::createExtractElement(x.value, Float::getType(), i)),
+					V(Nucleus::createExtractElement(y.value, Float::getType(), i))
+				));
+			out = V(Nucleus::createInsertElement(V(out), V(el), i));
 		}
 		return RValue<Float4>(V(out));
 	}
 
 	RValue<Float4> Pow(RValue<Float4> x, RValue<Float4> y)
 	{
-		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::pow,
-			{ T(Float4::getType()), T(Float4::getType()) } );
-		return RValue<Float4>(V(::builder->CreateCall(func, { V(x.value), V(y.value) })));
+		::llvm::SmallVector<::llvm::Type*, 2> paramTys;
+		paramTys.push_back(T(Float4::getType()));
+		paramTys.push_back(T(Float4::getType()));
+		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::pow, paramTys);
+		return RValue<Float4>(V(::builder->CreateCall2(func, ARGS(V(x.value), V(y.value)))));
 	}
 
 	RValue<Float4> Exp(RValue<Float4> v)
 	{
 		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::exp, { T(Float4::getType()) } );
-		return RValue<Float4>(V(::builder->CreateCall(func, { V(v.value) })));
+		return RValue<Float4>(V(::builder->CreateCall(func, V(v.value))));
 	}
 
 	RValue<Float4> Log(RValue<Float4> v)
 	{
 		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::log, { T(Float4::getType()) } );
-		return RValue<Float4>(V(::builder->CreateCall(func, { V(v.value) })));
+		return RValue<Float4>(V(::builder->CreateCall(func, V(v.value))));
 	}
 
 	RValue<Float4> Exp2(RValue<Float4> v)
 	{
 		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::exp2, { T(Float4::getType()) } );
-		return RValue<Float4>(V(::builder->CreateCall(func, { V(v.value) })));
+		return RValue<Float4>(V(::builder->CreateCall(func, V(v.value))));
 	}
 
 	RValue<Float4> Log2(RValue<Float4> v)
 	{
 		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::log2, { T(Float4::getType()) } );
-		return RValue<Float4>(V(::builder->CreateCall(func, { V(v.value) })));
+		return RValue<Float4>(V(::builder->CreateCall(func, V(v.value))));
 	}
 
 	RValue<UInt4> Ctlz(RValue<UInt4> v, bool isZeroUndef)
 	{
-		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::ctlz, { T(UInt4::getType()), T(Bool::getType()) } );
-		return RValue<UInt4>(V(::builder->CreateCall(func, {
+#if REACTOR_LLVM_VERSION < 7
+		assert(false); // TODO: LLVM 3 does not support ctlz in a vector form.
+#endif
+		::llvm::SmallVector<::llvm::Type*, 2> paramTys;
+		paramTys.push_back(T(UInt4::getType()));
+		paramTys.push_back(T(Bool::getType()));
+		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::ctlz, paramTys);
+		return RValue<UInt4>(V(::builder->CreateCall2(func, ARGS(
 			V(v.value),
 			isZeroUndef ? ::llvm::ConstantInt::getTrue(*::context) : ::llvm::ConstantInt::getFalse(*::context)
-		})));
+		))));
 	}
 
 	RValue<UInt4> Cttz(RValue<UInt4> v, bool isZeroUndef)
 	{
-		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::cttz, { T(UInt4::getType()), T(Bool::getType()) } );
-		return RValue<UInt4>(V(::builder->CreateCall(func, {
+#if REACTOR_LLVM_VERSION < 7
+		assert(false); // TODO: LLVM 3 does not support cttz in a vector form.
+#endif
+		::llvm::SmallVector<::llvm::Type*, 2> paramTys;
+		paramTys.push_back(T(UInt4::getType()));
+		paramTys.push_back(T(Bool::getType()));
+		auto func = llvm::Intrinsic::getDeclaration(::module, llvm::Intrinsic::cttz, paramTys);
+		return RValue<UInt4>(V(::builder->CreateCall2(func, ARGS(
 			V(v.value),
 			isZeroUndef ? ::llvm::ConstantInt::getTrue(*::context) : ::llvm::ConstantInt::getFalse(*::context)
-		})));
+		))));
 	}
 
 	Type *Float4::getType()