diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp new file mode 100644 index 000000000..b9e7244d8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp @@ -0,0 +1,372 @@ +#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" +#include "Recompiler.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; +using ShaderRecompiler::ShaderStage; + +constexpr std::uint32_t Threads = 32; +constexpr std::uint32_t Inputs = 4; +constexpr std::uint32_t Results = 16; +alignas(256) std::array Input{}; +alignas(256) std::array Output{}; + +alignas(256) constexpr std::array Code{ + 0x34020084, 0x34060086, 0xe0381000, 0x80000401, 0xbf8c3f70, 0x1e140b04, 0x20160b04, 0xd551000c, + 0x041a0b04, 0xd554000d, 0x041a0b04, 0xd557000e, 0x041a0b04, 0xd50f000f, 0x02020b04, 0xd5100010, + 0x02020b04, 0xe0781000, 0x80010a03, 0xe0781010, 0x80010e03, 0xbf810000, +}; + +constexpr std::uint32_t Rows[128][4] = { + {0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x7f800001u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0xff800000u, 0x00000000u}, + {0x00000000u, 0xc0400000u, 0x3f800000u, 0x00000000u}, + {0x00000000u, 0x7f800000u, 0xff812345u, 0x00000000u}, + {0x00000000u, 0xff800000u, 0x7fc12345u, 0x00000000u}, + {0x00000000u, 0x7fc12345u, 0xc0400000u, 0x00000000u}, + {0x00000000u, 0xffd54321u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x7f800001u, 0xffd54321u, 0x00000000u}, + {0x00000000u, 0xff812345u, 0x7f800000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x7f800000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x3f800000u, 0x7f800001u, 0x00000000u}, + {0x80000000u, 0xc0400000u, 0xff800000u, 0x00000000u}, + {0x80000000u, 0x7f800000u, 0x3f800000u, 0x00000000u}, + {0x80000000u, 0xff800000u, 0xff812345u, 0x00000000u}, + {0x80000000u, 0x7fc12345u, 0x7fc12345u, 0x00000000u}, + {0x80000000u, 0xffd54321u, 0xc0400000u, 0x00000000u}, + {0x80000000u, 0x7f800001u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0xff812345u, 0xffd54321u, 0x00000000u}, + {0x3f800000u, 0x00000000u, 0xffd54321u, 0x00000000u}, + {0x3f800000u, 0x80000000u, 0x7f800000u, 0x00000000u}, + {0x3f800000u, 0x3f800000u, 0x80000000u, 0x00000000u}, + {0x3f800000u, 0xc0400000u, 0x7f800001u, 0x00000000u}, + {0x3f800000u, 0x7f800000u, 0xff800000u, 0x00000000u}, + {0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u}, + {0x3f800000u, 0x7fc12345u, 0xff812345u, 0x00000000u}, + {0x3f800000u, 0xffd54321u, 0x7fc12345u, 0x00000000u}, + {0x3f800000u, 0x7f800001u, 0xc0400000u, 0x00000000u}, + {0x3f800000u, 0xff812345u, 0x00000000u, 0x00000000u}, + {0xc0400000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0xc0400000u, 0x80000000u, 0xffd54321u, 0x00000000u}, + {0xc0400000u, 0x3f800000u, 0x7f800000u, 0x00000000u}, + {0xc0400000u, 0xc0400000u, 0x80000000u, 0x00000000u}, + {0xc0400000u, 0x7f800000u, 0x7f800001u, 0x00000000u}, + {0xc0400000u, 0xff800000u, 0xff800000u, 0x00000000u}, + {0xc0400000u, 0x7fc12345u, 0x3f800000u, 0x00000000u}, + {0xc0400000u, 0xffd54321u, 0xff812345u, 0x00000000u}, + {0xc0400000u, 0x7f800001u, 0x7fc12345u, 0x00000000u}, + {0xc0400000u, 0xff812345u, 0xc0400000u, 0x00000000u}, + {0x7f800000u, 0x00000000u, 0xc0400000u, 0x00000000u}, + {0x7f800000u, 0x80000000u, 0x00000000u, 0x00000000u}, + {0x7f800000u, 0x3f800000u, 0xffd54321u, 0x00000000u}, + {0x7f800000u, 0xc0400000u, 0x7f800000u, 0x00000000u}, + {0x7f800000u, 0x7f800000u, 0x80000000u, 0x00000000u}, + {0x7f800000u, 0xff800000u, 0x7f800001u, 0x00000000u}, + {0x7f800000u, 0x7fc12345u, 0xff800000u, 0x00000000u}, + {0x7f800000u, 0xffd54321u, 0x3f800000u, 0x00000000u}, + {0x7f800000u, 0x7f800001u, 0xff812345u, 0x00000000u}, + {0x7f800000u, 0xff812345u, 0x7fc12345u, 0x00000000u}, + {0xff800000u, 0x00000000u, 0x7fc12345u, 0x00000000u}, + {0xff800000u, 0x80000000u, 0xc0400000u, 0x00000000u}, + {0xff800000u, 0x3f800000u, 0x00000000u, 0x00000000u}, + {0xff800000u, 0xc0400000u, 0xffd54321u, 0x00000000u}, + {0xff800000u, 0x7f800000u, 0x7f800000u, 0x00000000u}, + {0xff800000u, 0xff800000u, 0x80000000u, 0x00000000u}, + {0xff800000u, 0x7fc12345u, 0x7f800001u, 0x00000000u}, + {0xff800000u, 0xffd54321u, 0xff800000u, 0x00000000u}, + {0xff800000u, 0x7f800001u, 0x3f800000u, 0x00000000u}, + {0xff800000u, 0xff812345u, 0xff812345u, 0x00000000u}, + {0x7fc12345u, 0x00000000u, 0xff812345u, 0x00000000u}, + {0x7fc12345u, 0x80000000u, 0x7fc12345u, 0x00000000u}, + {0x7fc12345u, 0x3f800000u, 0xc0400000u, 0x00000000u}, + {0x7fc12345u, 0xc0400000u, 0x00000000u, 0x00000000u}, + {0x7fc12345u, 0x7f800000u, 0xffd54321u, 0x00000000u}, + {0x7fc12345u, 0xff800000u, 0x7f800000u, 0x00000000u}, + {0x7fc12345u, 0x7fc12345u, 0x80000000u, 0x00000000u}, + {0x7fc12345u, 0xffd54321u, 0x7f800001u, 0x00000000u}, + {0x7fc12345u, 0x7f800001u, 0xff800000u, 0x00000000u}, + {0x7fc12345u, 0xff812345u, 0x3f800000u, 0x00000000u}, + {0xffd54321u, 0x00000000u, 0x3f800000u, 0x00000000u}, + {0xffd54321u, 0x80000000u, 0xff812345u, 0x00000000u}, + {0xffd54321u, 0x3f800000u, 0x7fc12345u, 0x00000000u}, + {0xffd54321u, 0xc0400000u, 0xc0400000u, 0x00000000u}, + {0xffd54321u, 0x7f800000u, 0x00000000u, 0x00000000u}, + {0xffd54321u, 0xff800000u, 0xffd54321u, 0x00000000u}, + {0xffd54321u, 0x7fc12345u, 0x7f800000u, 0x00000000u}, + {0xffd54321u, 0xffd54321u, 0x80000000u, 0x00000000u}, + {0xffd54321u, 0x7f800001u, 0x7f800001u, 0x00000000u}, + {0xffd54321u, 0xff812345u, 0xff800000u, 0x00000000u}, + {0x7f800001u, 0x00000000u, 0xff800000u, 0x00000000u}, + {0x7f800001u, 0x80000000u, 0x3f800000u, 0x00000000u}, + {0x7f800001u, 0x3f800000u, 0xff812345u, 0x00000000u}, + {0x7f800001u, 0xc0400000u, 0x7fc12345u, 0x00000000u}, + {0x7f800001u, 0x7f800000u, 0xc0400000u, 0x00000000u}, + {0x7f800001u, 0xff800000u, 0x00000000u, 0x00000000u}, + {0x7f800001u, 0x7fc12345u, 0xffd54321u, 0x00000000u}, + {0x7f800001u, 0xffd54321u, 0x7f800000u, 0x00000000u}, + {0x7f800001u, 0x7f800001u, 0x80000000u, 0x00000000u}, + {0x7f800001u, 0xff812345u, 0x7f800001u, 0x00000000u}, + {0xff812345u, 0x00000000u, 0x7f800001u, 0x00000000u}, + {0xff812345u, 0x80000000u, 0xff800000u, 0x00000000u}, + {0xff812345u, 0x3f800000u, 0x3f800000u, 0x00000000u}, + {0xff812345u, 0xc0400000u, 0xff812345u, 0x00000000u}, + {0xff812345u, 0x7f800000u, 0x7fc12345u, 0x00000000u}, + {0xff812345u, 0xff800000u, 0xc0400000u, 0x00000000u}, + {0xff812345u, 0x7fc12345u, 0x00000000u, 0x00000000u}, + {0xff812345u, 0xffd54321u, 0xffd54321u, 0x00000000u}, + {0xff812345u, 0x7f800001u, 0x7f800000u, 0x00000000u}, + {0xff812345u, 0xff812345u, 0x80000000u, 0x00000000u}, + {0x3f800000u, 0x40200000u, 0x00000000u, 0x00000000u}, + {0x3f800000u, 0x00800000u, 0x3f800000u, 0x00000000u}, + {0xbf800000u, 0xc0400000u, 0x00000000u, 0x00000000u}, + {0xc0400000u, 0xbf800000u, 0x3f800000u, 0x00000000u}, + {0x7fc00000u, 0x7fc12345u, 0x00000000u, 0x00000000u}, + {0xffc00000u, 0xffd54321u, 0x00000000u, 0x00000000u}, + {0x7f800001u, 0x7fa00000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xbf800000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x7fc00000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xffc00000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x7f800001u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xff812345u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x3f800000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0xbf800000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0xff800000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0x7fc00000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0xffc00000u, 0x00000000u}, + {0x00000000u, 0x80000000u, 0xff812345u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0x80000000u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0x3f800000u, 0x00000000u} +}; +constexpr std::uint32_t Expected[128][7] = { + {0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u}, + {0xc0400000u, 0x00000000u, 0xc0400000u, 0x3f800000u, 0x00000000u, 0xc0400000u, 0x00000000u}, + {0x00000000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x7f800000u}, + {0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x80000000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x80000000u, 0x80000000u, 0x3f800000u}, + {0xc0400000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0x80000000u}, + {0x80000000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x3f800000u, 0x80000000u, 0x7f800000u}, + {0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xff800000u, 0xff800000u, 0x80000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x80000000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0x80000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u}, + {0x80000000u, 0x3f800000u, 0x80000000u, 0x7f800000u, 0x3f800000u, 0x80000000u, 0x3f800000u}, + {0x3f800000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0xc0400000u, 0x3f800000u}, + {0x3f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x3f800000u, 0x3f800000u, 0x7f800000u}, + {0xff800000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x3f800000u, 0xff800000u, 0x3f800000u}, + {0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0x3f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0x3f800000u}, + {0x3f800000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0x00000000u, 0xc0400000u, 0x00000000u}, + {0xc0400000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0x80000000u}, + {0xc0400000u, 0x3f800000u, 0xc0400000u, 0x7f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0xc0400000u, 0xc0400000u, 0x7f800000u}, + {0xff800000u, 0xc0400000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xc0400000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0x00000000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x7f800000u}, + {0x80000000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x7f800000u}, + {0x3f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x3f800000u, 0x3f800000u, 0x7f800000u}, + {0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x7f800000u, 0xc0400000u, 0x7f800000u}, + {0x7f800000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0xff800000u, 0x7f800000u}, + {0x7f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x7f800000u}, + {0x7f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x7f800000u}, + {0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u}, + {0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0x00000000u}, + {0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xc0400000u, 0xff800000u, 0x80000000u}, + {0xff800000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u, 0xff800000u, 0x3f800000u}, + {0xff800000u, 0xc0400000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xc0400000u}, + {0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0x80000000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0x3f800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x3f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0x00000000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0x7fc12345u, 0x7fc12345u, 0x80000000u, 0x80000000u, 0x80000000u, 0x7fc12345u, 0x7fc12345u}, + {0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u}, + {0x7fc12345u, 0x7fc12345u, 0xff800000u, 0xff800000u, 0xff800000u, 0x7fc12345u, 0x7fc12345u}, + {0x7fc12345u, 0x7fc12345u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x7fc12345u, 0x7fc12345u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0x7f800000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xffd54321u, 0xffd54321u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0xffd54321u, 0xffd54321u}, + {0xffd54321u, 0xffd54321u, 0x80000000u, 0x80000000u, 0x80000000u, 0xffd54321u, 0xffd54321u}, + {0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u}, + {0xffd54321u, 0xffd54321u, 0xff800000u, 0xff800000u, 0xff800000u, 0xffd54321u, 0xffd54321u}, + {0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0x80000000u, 0x3f800000u, 0x80000000u, 0x80000000u, 0x80000000u}, + {0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0x7f800000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u}, + {0x7f800001u, 0x7f800001u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800001u, 0x7f800001u}, + {0x7f800001u, 0x7f800001u, 0x80000000u, 0x80000000u, 0x80000000u, 0x7f800001u, 0x7f800001u}, + {0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0x80000000u}, + {0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u}, + {0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u}, + {0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u}, + {0xff800000u, 0xff800000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xff800000u}, + {0xff812345u, 0xff812345u, 0x00000000u, 0x00000000u, 0x00000000u, 0xff812345u, 0xff812345u}, + {0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u}, + {0xff812345u, 0xff812345u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0xff812345u, 0xff812345u}, + {0xff812345u, 0xff812345u, 0x80000000u, 0x80000000u, 0x80000000u, 0xff812345u, 0xff812345u}, + {0x3f800000u, 0x40200000u, 0x00000000u, 0x40200000u, 0x3f800000u, 0x3f800000u, 0x40200000u}, + {0x00800000u, 0x3f800000u, 0x00800000u, 0x3f800000u, 0x3f800000u, 0x00800000u, 0x3f800000u}, + {0xc0400000u, 0xbf800000u, 0xc0400000u, 0x00000000u, 0xbf800000u, 0xc0400000u, 0xbf800000u}, + {0xc0400000u, 0xbf800000u, 0xc0400000u, 0x3f800000u, 0xbf800000u, 0xc0400000u, 0xbf800000u}, + {0x7fc00000u, 0x7fc00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x7fc00000u, 0x7fc00000u}, + {0xffc00000u, 0xffc00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xffc00000u, 0xffc00000u}, + {0x7f800001u, 0x7f800001u, 0x00000000u, 0x00000000u, 0x00000000u, 0x7f800001u, 0x7f800001u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xbf800000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x3f800000u, 0x00000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0xbf800000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u}, + {0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u}, + {0x00000000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u}, + {0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x3f800000u, 0x00000000u, 0x3f800000u} +}; +constexpr std::uint32_t Chunks = 4; +std::uint32_t Chunk = 0; +constexpr const char* Names[7] = { + "v_min_f32 v10, v4, v5", + "v_max_f32 v11, v4, v5", + "v_min3_f32 v12, v4, v5, v6", + "v_max3_f32 v13, v4, v5, v6", + "v_med3_f32 v14, v4, v5, v6", + "v_min_f32_e64 v15, v4, v5", + "v_max_f32_e64 v16, v4, v5", +}; + +void Fill(std::uint32_t tid, std::uint32_t* words) { + std::copy(std::begin(Rows[Chunk * Threads + tid]), std::end(Rows[Chunk * Threads + tid]), words); +} + +std::array BufferDescriptor(const void* data, std::uint32_t bytes) { + const auto address = reinterpret_cast(data); + return {static_cast(address), static_cast((address >> 32u) & 0xffffu), bytes, 0x01016facu}; +} + +std::string Hex(std::uint32_t value) { + char text[16]; + std::snprintf(text, sizeof(text), "0x%08x", value); + return text; +} + +void Expect(std::uint32_t tid, std::uint32_t actual, std::uint32_t expected, const char* name) { + Require(actual == expected, std::string("f32 min max nan: row ") + std::to_string(tid) + " " + name + " is " + Hex(actual) + ", expected " + Hex(expected)); +} + +void Run(AgcDriver::VulkanDevice& device) { + for (std::uint32_t tid = 0; tid < Threads; ++tid) Fill(tid, &Input[tid * Inputs]); + Output.fill(0xdeadbeefu); + std::vector userData(8, 0u); + const auto input = BufferDescriptor(Input.data(), static_cast(Input.size() * 4u)); + const auto output = BufferDescriptor(Output.data(), static_cast(Output.size() * 4u)); + std::copy(input.begin(), input.end(), userData.begin()); + std::copy(output.begin(), output.end(), userData.begin() + 4); + const std::span code(Code); + const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(code)}}}; + const ShaderRecompiler::ShaderComputeStageInfo compute{{Threads, 1, 1}, 0u, {false, false, false}, false, 1}; + ShaderRecompiler::RecompileRequest request{ + {ShaderStage::Compute, reinterpret_cast(code.data()), code, 0, {}}, + {32, 0, userData, compute, std::nullopt, std::nullopt, memory}, + device.Target(), + {0, 0, 0, 128} + }; + request.useCache = false; + const auto result = ShaderRecompiler::Recompile(request); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(code.data())); + device.WaitIdle(); +} + +void Check() { + for (std::uint32_t tid = 0; tid < Threads; ++tid) { + const std::uint32_t* in = &Input[tid * Inputs]; + const std::uint32_t* out = &Output[tid * Results]; + for (std::uint32_t i = 0; i < 7; ++i) { + Expect(Chunk * Threads + tid, out[i], Expected[Chunk * Threads + tid][i], Names[i]); + } + } +} + +} + +int main() { + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + for (Chunk = 0; Chunk < Chunks; ++Chunk) { + Run(*device); + Check(); + } + std::puts("f32 min max nan tests passed"); + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp index b85d7ee98..5b3c83ce3 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp @@ -809,8 +809,8 @@ std::uint32_t EmitMinMaxF32Value(SpirvEmitterState& state, std::uint32_t lhs, st const auto zeroBits = Binary(state, maxValue ? spv::OpBitwiseAnd : spv::OpBitwiseOr, TypeU32(state), lhsClass.bits, rhsClass.bits); const auto numericBits = Select(state, TypeU32(state), bothZero, zeroBits, orderedBits); - const auto rhsNanBits = Select(state, TypeU32(state), rhsClass.nan, lhsClass.bits, numericBits); - const auto resultBits = Select(state, TypeU32(state), lhsClass.nan, rhsClass.bits, rhsNanBits); + const auto lhsNanBits = Select(state, TypeU32(state), lhsClass.nan, rhsClass.bits, numericBits); + const auto resultBits = Select(state, TypeU32(state), rhsClass.nan, lhsClass.bits, lhsNanBits); return Unary(state, spv::OpBitcast, TypeF32(state), resultBits); }