mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-21 11:26:56 +02:00
shader: classify float NaNs with one magnitude comparison
This commit is contained in:
@@ -84,15 +84,10 @@ uint32_t EmitF32ToF16RtzBits(EmitterState& state, uint32_t f32) {
|
|||||||
|
|
||||||
F32Class EmitClassifyF32Bits(EmitterState& state, uint32_t bits) {
|
F32Class EmitClassifyF32Bits(EmitterState& state, uint32_t bits) {
|
||||||
F32Class cls;
|
F32Class cls;
|
||||||
cls.bits = bits;
|
cls.bits = bits;
|
||||||
const auto abs_bits = EmitAndConstant(state, cls.bits, 0x7fffffffu);
|
const auto abs_bits = EmitAndConstant(state, cls.bits, 0x7fffffffu);
|
||||||
const auto exponent_bits = EmitAndConstant(state, abs_bits, 0x7f800000u);
|
cls.nan = EmitCompareU32Constant(state, spv::OpUGreaterThan, abs_bits, 0x7f800000u);
|
||||||
const auto mantissa_bits = EmitAndConstant(state, abs_bits, 0x007fffffu);
|
cls.zero = EmitCompareU32Constant(state, spv::OpIEqual, abs_bits, 0);
|
||||||
const auto exponent_max =
|
|
||||||
EmitCompareU32Constant(state, spv::OpIEqual, exponent_bits, 0x7f800000u);
|
|
||||||
const auto mantissa_nonzero = EmitCompareU32Constant(state, spv::OpINotEqual, mantissa_bits, 0);
|
|
||||||
cls.nan = EmitLogicalAndBool(state, exponent_max, mantissa_nonzero);
|
|
||||||
cls.zero = EmitCompareU32Constant(state, spv::OpIEqual, abs_bits, 0);
|
|
||||||
return cls;
|
return cls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user