summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
index 97d11cc63..b3afbef25 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
@@ -22,6 +22,28 @@ Id Clamp(EmitContext& ctx, Id type, Id value, Id zero, Id one) {
22 return ctx.OpFClamp(type, value, zero, one); 22 return ctx.OpFClamp(type, value, zero, one);
23 } 23 }
24} 24}
25
26Id FPOrdNotEqual(EmitContext& ctx, Id lhs, Id rhs) {
27 if (ctx.profile.ignore_nan_fp_comparisons) {
28 const Id comp{ctx.OpFOrdEqual(ctx.U1, lhs, rhs)};
29 const Id lhs_not_nan{ctx.OpLogicalNot(ctx.U1, ctx.OpIsNan(ctx.U1, lhs))};
30 const Id rhs_not_nan{ctx.OpLogicalNot(ctx.U1, ctx.OpIsNan(ctx.U1, rhs))};
31 return ctx.OpLogicalAnd(ctx.U1, ctx.OpLogicalAnd(ctx.U1, comp, lhs_not_nan), rhs_not_nan);
32 } else {
33 return ctx.OpFOrdNotEqual(ctx.U1, lhs, rhs);
34 }
35}
36
37Id FPUnordCompare(Id (EmitContext::*comp_func)(Id, Id, Id), EmitContext& ctx, Id lhs, Id rhs) {
38 if (ctx.profile.ignore_nan_fp_comparisons) {
39 const Id lhs_nan{ctx.OpIsNan(ctx.U1, lhs)};
40 const Id rhs_nan{ctx.OpIsNan(ctx.U1, rhs)};
41 const Id comp{(ctx.*comp_func)(ctx.U1, lhs, rhs)};
42 return ctx.OpLogicalOr(ctx.U1, ctx.OpLogicalOr(ctx.U1, comp, lhs_nan), rhs_nan);
43 } else {
44 return (ctx.*comp_func)(ctx.U1, lhs, rhs);
45 }
46}
25} // Anonymous namespace 47} // Anonymous namespace
26 48
27Id EmitFPAbs16(EmitContext& ctx, Id value) { 49Id EmitFPAbs16(EmitContext& ctx, Id value) {
@@ -227,27 +249,27 @@ Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs) {
227} 249}
228 250
229Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs) { 251Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs) {
230 return ctx.OpFUnordEqual(ctx.U1, lhs, rhs); 252 return FPUnordCompare(&EmitContext::OpFUnordEqual, ctx, lhs, rhs);
231} 253}
232 254
233Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs) { 255Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs) {
234 return ctx.OpFUnordEqual(ctx.U1, lhs, rhs); 256 return FPUnordCompare(&EmitContext::OpFUnordEqual, ctx, lhs, rhs);
235} 257}
236 258
237Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs) { 259Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs) {
238 return ctx.OpFUnordEqual(ctx.U1, lhs, rhs); 260 return FPUnordCompare(&EmitContext::OpFUnordEqual, ctx, lhs, rhs);
239} 261}
240 262
241Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs) { 263Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs) {
242 return ctx.OpFOrdNotEqual(ctx.U1, lhs, rhs); 264 return FPOrdNotEqual(ctx, lhs, rhs);
243} 265}
244 266
245Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs) { 267Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs) {
246 return ctx.OpFOrdNotEqual(ctx.U1, lhs, rhs); 268 return FPOrdNotEqual(ctx, lhs, rhs);
247} 269}
248 270
249Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs) { 271Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs) {
250 return ctx.OpFOrdNotEqual(ctx.U1, lhs, rhs); 272 return FPOrdNotEqual(ctx, lhs, rhs);
251} 273}
252 274
253Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs) { 275Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs) {
@@ -275,15 +297,15 @@ Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs) {
275} 297}
276 298
277Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs) { 299Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs) {
278 return ctx.OpFUnordLessThan(ctx.U1, lhs, rhs); 300 return FPUnordCompare(&EmitContext::OpFUnordLessThan, ctx, lhs, rhs);
279} 301}
280 302
281Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs) { 303Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs) {
282 return ctx.OpFUnordLessThan(ctx.U1, lhs, rhs); 304 return FPUnordCompare(&EmitContext::OpFUnordLessThan, ctx, lhs, rhs);
283} 305}
284 306
285Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs) { 307Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs) {
286 return ctx.OpFUnordLessThan(ctx.U1, lhs, rhs); 308 return FPUnordCompare(&EmitContext::OpFUnordLessThan, ctx, lhs, rhs);
287} 309}
288 310
289Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) { 311Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) {
@@ -299,15 +321,15 @@ Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs) {
299} 321}
300 322
301Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) { 323Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) {
302 return ctx.OpFUnordGreaterThan(ctx.U1, lhs, rhs); 324 return FPUnordCompare(&EmitContext::OpFUnordGreaterThan, ctx, lhs, rhs);
303} 325}
304 326
305Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs) { 327Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs) {
306 return ctx.OpFUnordGreaterThan(ctx.U1, lhs, rhs); 328 return FPUnordCompare(&EmitContext::OpFUnordGreaterThan, ctx, lhs, rhs);
307} 329}
308 330
309Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs) { 331Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs) {
310 return ctx.OpFUnordGreaterThan(ctx.U1, lhs, rhs); 332 return FPUnordCompare(&EmitContext::OpFUnordGreaterThan, ctx, lhs, rhs);
311} 333}
312 334
313Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { 335Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) {
@@ -323,15 +345,15 @@ Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs) {
323} 345}
324 346
325Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { 347Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) {
326 return ctx.OpFUnordLessThanEqual(ctx.U1, lhs, rhs); 348 return FPUnordCompare(&EmitContext::OpFUnordLessThanEqual, ctx, lhs, rhs);
327} 349}
328 350
329Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs) { 351Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs) {
330 return ctx.OpFUnordLessThanEqual(ctx.U1, lhs, rhs); 352 return FPUnordCompare(&EmitContext::OpFUnordLessThanEqual, ctx, lhs, rhs);
331} 353}
332 354
333Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { 355Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs) {
334 return ctx.OpFUnordLessThanEqual(ctx.U1, lhs, rhs); 356 return FPUnordCompare(&EmitContext::OpFUnordLessThanEqual, ctx, lhs, rhs);
335} 357}
336 358
337Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { 359Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) {
@@ -347,15 +369,15 @@ Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs) {
347} 369}
348 370
349Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { 371Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) {
350 return ctx.OpFUnordGreaterThanEqual(ctx.U1, lhs, rhs); 372 return FPUnordCompare(&EmitContext::OpFUnordGreaterThanEqual, ctx, lhs, rhs);
351} 373}
352 374
353Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs) { 375Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs) {
354 return ctx.OpFUnordGreaterThanEqual(ctx.U1, lhs, rhs); 376 return FPUnordCompare(&EmitContext::OpFUnordGreaterThanEqual, ctx, lhs, rhs);
355} 377}
356 378
357Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { 379Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs) {
358 return ctx.OpFUnordGreaterThanEqual(ctx.U1, lhs, rhs); 380 return FPUnordCompare(&EmitContext::OpFUnordGreaterThanEqual, ctx, lhs, rhs);
359} 381}
360 382
361Id EmitFPIsNan16(EmitContext& ctx, Id value) { 383Id EmitFPIsNan16(EmitContext& ctx, Id value) {