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()