diff options
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp | 58 |
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 | |||
| 26 | Id 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 | |||
| 37 | Id 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 | ||
| 27 | Id EmitFPAbs16(EmitContext& ctx, Id value) { | 49 | Id EmitFPAbs16(EmitContext& ctx, Id value) { |
| @@ -227,27 +249,27 @@ Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs) { | |||
| 227 | } | 249 | } |
| 228 | 250 | ||
| 229 | Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 251 | Id 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 | ||
| 233 | Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs) { | 255 | Id 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 | ||
| 237 | Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs) { | 259 | Id 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 | ||
| 241 | Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 263 | Id 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 | ||
| 245 | Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs) { | 267 | Id 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 | ||
| 249 | Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs) { | 271 | Id 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 | ||
| 253 | Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 275 | Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs) { |
| @@ -275,15 +297,15 @@ Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs) { | |||
| 275 | } | 297 | } |
| 276 | 298 | ||
| 277 | Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs) { | 299 | Id 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 | ||
| 281 | Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs) { | 303 | Id 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 | ||
| 285 | Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs) { | 307 | Id 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 | ||
| 289 | Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) { | 311 | Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) { |
| @@ -299,15 +321,15 @@ Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs) { | |||
| 299 | } | 321 | } |
| 300 | 322 | ||
| 301 | Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs) { | 323 | Id 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 | ||
| 305 | Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs) { | 327 | Id 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 | ||
| 309 | Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs) { | 331 | Id 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 | ||
| 313 | Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 335 | Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { |
| @@ -323,15 +345,15 @@ Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { | |||
| 323 | } | 345 | } |
| 324 | 346 | ||
| 325 | Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 347 | Id 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 | ||
| 329 | Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs) { | 351 | Id 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 | ||
| 333 | Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { | 355 | Id 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 | ||
| 337 | Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 359 | Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { |
| @@ -347,15 +369,15 @@ Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { | |||
| 347 | } | 369 | } |
| 348 | 370 | ||
| 349 | Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs) { | 371 | Id 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 | ||
| 353 | Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs) { | 375 | Id 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 | ||
| 357 | Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs) { | 379 | Id 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 | ||
| 361 | Id EmitFPIsNan16(EmitContext& ctx, Id value) { | 383 | Id EmitFPIsNan16(EmitContext& ctx, Id value) { |