Skip to content

Commit

Permalink
SpirvShader: Implement GLSLstd450FindILsb
Browse files Browse the repository at this point in the history
Bug: b/126873455
Tests: dEQP-VK.glsl.builtin.function.integer.findlsb.*
Change-Id: I46671fe6b64814a5c9cbc8dd9fe4cc449a328f42
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28789
Tested-by: Ben Clayton <bclayton@google.com>
Presubmit-Ready: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
  • Loading branch information
ben-clayton committed Apr 11, 2019
1 parent 6095826 commit 3f007c4
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/Pipeline/SpirvShader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3605,7 +3605,12 @@ namespace sw
}
case GLSLstd450FindILsb:
{
UNIMPLEMENTED("GLSLstd450FindILsb");
auto val = GenericValue(this, routine, insn.word(5));
for (auto i = 0u; i < type.sizeInComponents; i++)
{
auto v = val.UInt(i);
dst.move(i, Cttz(v, true) | CmpEQ(v, SIMD::UInt(0)));
}
break;
}
case GLSLstd450FindSMsb:
Expand Down
9 changes: 9 additions & 0 deletions src/Reactor/LLVMReactor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3219,6 +3219,15 @@ namespace rr
})));
}

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, {
V(v.value),
isZeroUndef ? ::llvm::ConstantInt::getTrue(*::context) : ::llvm::ConstantInt::getFalse(*::context)
})));
}

Type *Float4::getType()
{
return T(llvm::VectorType::get(T(Float::getType()), 4));
Expand Down
5 changes: 5 additions & 0 deletions src/Reactor/Reactor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2238,6 +2238,11 @@ namespace rr
// Returns an undefined value when: !isZeroUndef && x == 0.
RValue<UInt4> Ctlz(RValue<UInt4> x, bool isZeroUndef);

// Count trailing zeros.
// Returns 32 when: isZeroUndef && x == 0.
// Returns an undefined value when: !isZeroUndef && x == 0.
RValue<UInt4> Cttz(RValue<UInt4> x, bool isZeroUndef);

template<class T>
class Pointer : public LValue<Pointer<T>>
{
Expand Down

0 comments on commit 3f007c4

Please sign in to comment.