yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Jay KwakFix IEEE 754 NaN comparisons in constant folding (#7721)57567778b

master
4.7 KiB150 linesraw
1//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type -compute
2
3// Test IEEE 754 NaN comparison behavior
4// According to IEEE 754 standard:
5// - Any comparison with NaN (except !=) should return false
6// - The != comparison with NaN should return true
7
8static const float fNAN = 0.0f / 0.0f;
9static const float fPOSITIVE_INFINITY = 1.0f / 0.0f;
10static const float fNEGATIVE_INFINITY = -1.0f / 0.0f;
11static const float fZERO = 0.0f;
12static const float fONE = 1.0f;
13static const float fNEG_ONE = -1.0f;
14
15//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
16RWStructuredBuffer<uint> outputBuffer;
17
18[numthreads(1, 1, 1)]
19void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
20{
21    uint testIndex = 0;
22
23    // Test 1: NaN == NaN should be false
24    // CHECK: 0
25    outputBuffer[testIndex++] = (fNAN == fNAN) ? 1u : 0u;
26
27    // Test 2: NaN != NaN should be true
28    // CHECK: 1
29    outputBuffer[testIndex++] = (fNAN != fNAN) ? 1u : 0u;
30
31    // Test 3: NaN > NaN should be false
32    // CHECK: 0
33    outputBuffer[testIndex++] = (fNAN > fNAN) ? 1u : 0u;
34
35    // Test 4: NaN < NaN should be false
36    // CHECK: 0
37    outputBuffer[testIndex++] = (fNAN < fNAN) ? 1u : 0u;
38
39    // Test 5: NaN >= NaN should be false
40    // CHECK: 0
41    outputBuffer[testIndex++] = (fNAN >= fNAN) ? 1u : 0u;
42
43    // Test 6: NaN <= NaN should be false
44    // CHECK: 0
45    outputBuffer[testIndex++] = (fNAN <= fNAN) ? 1u : 0u;
46
47    // Test 7: NaN == 0.0 should be false
48    // CHECK: 0
49    outputBuffer[testIndex++] = (fNAN == fZERO) ? 1u : 0u;
50
51    // Test 8: NaN != 0.0 should be true
52    // CHECK: 1
53    outputBuffer[testIndex++] = (fNAN != fZERO) ? 1u : 0u;
54
55    // Test 9: NaN > 0.0 should be false
56    // CHECK: 0
57    outputBuffer[testIndex++] = (fNAN > fZERO) ? 1u : 0u;
58
59    // Test 10: NaN < 0.0 should be false
60    // CHECK: 0
61    outputBuffer[testIndex++] = (fNAN < fZERO) ? 1u : 0u;
62
63    // Test 11: NaN >= 0.0 should be false
64    // CHECK: 0
65    outputBuffer[testIndex++] = (fNAN >= fZERO) ? 1u : 0u;
66
67    // Test 12: NaN <= 0.0 should be false
68    // CHECK: 0
69    outputBuffer[testIndex++] = (fNAN <= fZERO) ? 1u : 0u;
70
71    // Test 13: 0.0 == NaN should be false
72    // CHECK: 0
73    outputBuffer[testIndex++] = (fZERO == fNAN) ? 1u : 0u;
74
75    // Test 14: 0.0 != NaN should be true
76    // CHECK: 1
77    outputBuffer[testIndex++] = (fZERO != fNAN) ? 1u : 0u;
78
79    // Test 15: 0.0 > NaN should be false
80    // CHECK: 0
81    outputBuffer[testIndex++] = (fZERO > fNAN) ? 1u : 0u;
82
83    // Test 16: 0.0 < NaN should be false
84    // CHECK: 0
85    outputBuffer[testIndex++] = (fZERO < fNAN) ? 1u : 0u;
86
87    // Test 17: 0.0 >= NaN should be false
88    // CHECK: 0
89    outputBuffer[testIndex++] = (fZERO >= fNAN) ? 1u : 0u;
90
91    // Test 18: 0.0 <= NaN should be false
92    // CHECK: 0
93    outputBuffer[testIndex++] = (fZERO <= fNAN) ? 1u : 0u;
94
95    // Test 19: NaN == +infinity should be false
96    // CHECK: 0
97    outputBuffer[testIndex++] = (fNAN == fPOSITIVE_INFINITY) ? 1u : 0u;
98
99    // Test 20: NaN != +infinity should be true
100    // CHECK: 1
101    outputBuffer[testIndex++] = (fNAN != fPOSITIVE_INFINITY) ? 1u : 0u;
102
103    // Test 21: NaN > +infinity should be false
104    // CHECK: 0
105    outputBuffer[testIndex++] = (fNAN > fPOSITIVE_INFINITY) ? 1u : 0u;
106
107    // Test 22: NaN < +infinity should be false
108    // CHECK: 0
109    outputBuffer[testIndex++] = (fNAN < fPOSITIVE_INFINITY) ? 1u : 0u;
110
111    // Test 23: NaN >= +infinity should be false
112    // CHECK: 0
113    outputBuffer[testIndex++] = (fNAN >= fPOSITIVE_INFINITY) ? 1u : 0u;
114
115    // Test 24: NaN <= +infinity should be false
116    // CHECK: 0
117    outputBuffer[testIndex++] = (fNAN <= fPOSITIVE_INFINITY) ? 1u : 0u;
118
119    // Test 25: NaN == -infinity should be false
120    // CHECK: 0
121    outputBuffer[testIndex++] = (fNAN == fNEGATIVE_INFINITY) ? 1u : 0u;
122
123    // Test 26: NaN != -infinity should be true
124    // CHECK: 1
125    outputBuffer[testIndex++] = (fNAN != fNEGATIVE_INFINITY) ? 1u : 0u;
126
127    // Test 27: NaN > -infinity should be false
128    // CHECK: 0
129    outputBuffer[testIndex++] = (fNAN > fNEGATIVE_INFINITY) ? 1u : 0u;
130
131    // Test 28: NaN < -infinity should be false
132    // CHECK: 0
133    outputBuffer[testIndex++] = (fNAN < fNEGATIVE_INFINITY) ? 1u : 0u;
134
135    // Test 29: NaN >= -infinity should be false
136    // CHECK: 0
137    outputBuffer[testIndex++] = (fNAN >= fNEGATIVE_INFINITY) ? 1u : 0u;
138
139    // Test 30: NaN <= -infinity should be false
140    // CHECK: 0
141    outputBuffer[testIndex++] = (fNAN <= fNEGATIVE_INFINITY) ? 1u : 0u;
142
143    // Test 31: NaN == 1.0 should be false
144    // CHECK: 0
145    outputBuffer[testIndex++] = (fNAN == fONE) ? 1u : 0u;
146
147    // Test 32: NaN != 1.0 should be true
148    // CHECK: 1
149    outputBuffer[testIndex++] = (fNAN != fONE) ? 1u : 0u;
150}