diff options
| author | 2022-01-29 14:06:03 -0500 | |
|---|---|---|
| committer | 2022-01-29 19:56:02 -0500 | |
| commit | 90a0506d564ce0ce44ad8ab662f035c21fc03e71 (patch) | |
| tree | 787c3f7a82675c97a7cb1d40010695f81eb2c2b2 /src | |
| parent | shaders: Add U64->U32x2 Atomic fallback functions (diff) | |
| download | yuzu-90a0506d564ce0ce44ad8ab662f035c21fc03e71.tar.gz yuzu-90a0506d564ce0ce44ad8ab662f035c21fc03e71.tar.xz yuzu-90a0506d564ce0ce44ad8ab662f035c21fc03e71.zip | |
lower_int64_to_int32: Add 64-bit atomic fallbacks
Diffstat (limited to '')
3 files changed, 76 insertions, 11 deletions
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc index 8da5df97c..efb6bfac3 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.inc +++ b/src/shader_recompiler/frontend/ir/opcodes.inc | |||
| @@ -363,15 +363,15 @@ OPCODE(GlobalAtomicAnd64, U64, U64, | |||
| 363 | OPCODE(GlobalAtomicOr64, U64, U64, U64, ) | 363 | OPCODE(GlobalAtomicOr64, U64, U64, U64, ) |
| 364 | OPCODE(GlobalAtomicXor64, U64, U64, U64, ) | 364 | OPCODE(GlobalAtomicXor64, U64, U64, U64, ) |
| 365 | OPCODE(GlobalAtomicExchange64, U64, U64, U64, ) | 365 | OPCODE(GlobalAtomicExchange64, U64, U64, U64, ) |
| 366 | OPCODE(GlobalAtomicIAdd32x2, U32x2, U64, U32x2, ) | 366 | OPCODE(GlobalAtomicIAdd32x2, U32x2, U32x2, U32x2, ) |
| 367 | OPCODE(GlobalAtomicSMin32x2, U32x2, U64, U32x2, ) | 367 | OPCODE(GlobalAtomicSMin32x2, U32x2, U32x2, U32x2, ) |
| 368 | OPCODE(GlobalAtomicUMin32x2, U32x2, U64, U32x2, ) | 368 | OPCODE(GlobalAtomicUMin32x2, U32x2, U32x2, U32x2, ) |
| 369 | OPCODE(GlobalAtomicSMax32x2, U32x2, U64, U32x2, ) | 369 | OPCODE(GlobalAtomicSMax32x2, U32x2, U32x2, U32x2, ) |
| 370 | OPCODE(GlobalAtomicUMax32x2, U32x2, U64, U32x2, ) | 370 | OPCODE(GlobalAtomicUMax32x2, U32x2, U32x2, U32x2, ) |
| 371 | OPCODE(GlobalAtomicAnd32x2, U32x2, U64, U32x2, ) | 371 | OPCODE(GlobalAtomicAnd32x2, U32x2, U32x2, U32x2, ) |
| 372 | OPCODE(GlobalAtomicOr32x2, U32x2, U64, U32x2, ) | 372 | OPCODE(GlobalAtomicOr32x2, U32x2, U32x2, U32x2, ) |
| 373 | OPCODE(GlobalAtomicXor32x2, U32x2, U64, U32x2, ) | 373 | OPCODE(GlobalAtomicXor32x2, U32x2, U32x2, U32x2, ) |
| 374 | OPCODE(GlobalAtomicExchange32x2, U32x2, U64, U32x2, ) | 374 | OPCODE(GlobalAtomicExchange32x2, U32x2, U32x2, U32x2, ) |
| 375 | OPCODE(GlobalAtomicAddF32, F32, U64, F32, ) | 375 | OPCODE(GlobalAtomicAddF32, F32, U64, F32, ) |
| 376 | OPCODE(GlobalAtomicAddF16x2, U32, U64, F16x2, ) | 376 | OPCODE(GlobalAtomicAddF16x2, U32, U64, F16x2, ) |
| 377 | OPCODE(GlobalAtomicAddF32x2, U32, U64, F32x2, ) | 377 | OPCODE(GlobalAtomicAddF32x2, U32, U64, F32x2, ) |
diff --git a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp index 4197b0095..38592afd0 100644 --- a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp +++ b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp | |||
| @@ -92,6 +92,15 @@ bool IsGlobalMemory(const IR::Inst& inst) { | |||
| 92 | case IR::Opcode::GlobalAtomicOr64: | 92 | case IR::Opcode::GlobalAtomicOr64: |
| 93 | case IR::Opcode::GlobalAtomicXor64: | 93 | case IR::Opcode::GlobalAtomicXor64: |
| 94 | case IR::Opcode::GlobalAtomicExchange64: | 94 | case IR::Opcode::GlobalAtomicExchange64: |
| 95 | case IR::Opcode::GlobalAtomicIAdd32x2: | ||
| 96 | case IR::Opcode::GlobalAtomicSMin32x2: | ||
| 97 | case IR::Opcode::GlobalAtomicUMin32x2: | ||
| 98 | case IR::Opcode::GlobalAtomicSMax32x2: | ||
| 99 | case IR::Opcode::GlobalAtomicUMax32x2: | ||
| 100 | case IR::Opcode::GlobalAtomicAnd32x2: | ||
| 101 | case IR::Opcode::GlobalAtomicOr32x2: | ||
| 102 | case IR::Opcode::GlobalAtomicXor32x2: | ||
| 103 | case IR::Opcode::GlobalAtomicExchange32x2: | ||
| 95 | case IR::Opcode::GlobalAtomicAddF32: | 104 | case IR::Opcode::GlobalAtomicAddF32: |
| 96 | case IR::Opcode::GlobalAtomicAddF16x2: | 105 | case IR::Opcode::GlobalAtomicAddF16x2: |
| 97 | case IR::Opcode::GlobalAtomicAddF32x2: | 106 | case IR::Opcode::GlobalAtomicAddF32x2: |
| @@ -135,6 +144,15 @@ bool IsGlobalMemoryWrite(const IR::Inst& inst) { | |||
| 135 | case IR::Opcode::GlobalAtomicOr64: | 144 | case IR::Opcode::GlobalAtomicOr64: |
| 136 | case IR::Opcode::GlobalAtomicXor64: | 145 | case IR::Opcode::GlobalAtomicXor64: |
| 137 | case IR::Opcode::GlobalAtomicExchange64: | 146 | case IR::Opcode::GlobalAtomicExchange64: |
| 147 | case IR::Opcode::GlobalAtomicIAdd32x2: | ||
| 148 | case IR::Opcode::GlobalAtomicSMin32x2: | ||
| 149 | case IR::Opcode::GlobalAtomicUMin32x2: | ||
| 150 | case IR::Opcode::GlobalAtomicSMax32x2: | ||
| 151 | case IR::Opcode::GlobalAtomicUMax32x2: | ||
| 152 | case IR::Opcode::GlobalAtomicAnd32x2: | ||
| 153 | case IR::Opcode::GlobalAtomicOr32x2: | ||
| 154 | case IR::Opcode::GlobalAtomicXor32x2: | ||
| 155 | case IR::Opcode::GlobalAtomicExchange32x2: | ||
| 138 | case IR::Opcode::GlobalAtomicAddF32: | 156 | case IR::Opcode::GlobalAtomicAddF32: |
| 139 | case IR::Opcode::GlobalAtomicAddF16x2: | 157 | case IR::Opcode::GlobalAtomicAddF16x2: |
| 140 | case IR::Opcode::GlobalAtomicAddF32x2: | 158 | case IR::Opcode::GlobalAtomicAddF32x2: |
| @@ -199,6 +217,8 @@ IR::Opcode GlobalToStorage(IR::Opcode opcode) { | |||
| 199 | return IR::Opcode::StorageAtomicOr32; | 217 | return IR::Opcode::StorageAtomicOr32; |
| 200 | case IR::Opcode::GlobalAtomicXor32: | 218 | case IR::Opcode::GlobalAtomicXor32: |
| 201 | return IR::Opcode::StorageAtomicXor32; | 219 | return IR::Opcode::StorageAtomicXor32; |
| 220 | case IR::Opcode::GlobalAtomicExchange32: | ||
| 221 | return IR::Opcode::StorageAtomicExchange32; | ||
| 202 | case IR::Opcode::GlobalAtomicIAdd64: | 222 | case IR::Opcode::GlobalAtomicIAdd64: |
| 203 | return IR::Opcode::StorageAtomicIAdd64; | 223 | return IR::Opcode::StorageAtomicIAdd64; |
| 204 | case IR::Opcode::GlobalAtomicSMin64: | 224 | case IR::Opcode::GlobalAtomicSMin64: |
| @@ -215,10 +235,26 @@ IR::Opcode GlobalToStorage(IR::Opcode opcode) { | |||
| 215 | return IR::Opcode::StorageAtomicOr64; | 235 | return IR::Opcode::StorageAtomicOr64; |
| 216 | case IR::Opcode::GlobalAtomicXor64: | 236 | case IR::Opcode::GlobalAtomicXor64: |
| 217 | return IR::Opcode::StorageAtomicXor64; | 237 | return IR::Opcode::StorageAtomicXor64; |
| 218 | case IR::Opcode::GlobalAtomicExchange32: | ||
| 219 | return IR::Opcode::StorageAtomicExchange32; | ||
| 220 | case IR::Opcode::GlobalAtomicExchange64: | 238 | case IR::Opcode::GlobalAtomicExchange64: |
| 221 | return IR::Opcode::StorageAtomicExchange64; | 239 | return IR::Opcode::StorageAtomicExchange64; |
| 240 | case IR::Opcode::GlobalAtomicIAdd32x2: | ||
| 241 | return IR::Opcode::StorageAtomicIAdd32x2; | ||
| 242 | case IR::Opcode::GlobalAtomicSMin32x2: | ||
| 243 | return IR::Opcode::StorageAtomicSMin32x2; | ||
| 244 | case IR::Opcode::GlobalAtomicUMin32x2: | ||
| 245 | return IR::Opcode::StorageAtomicUMin32x2; | ||
| 246 | case IR::Opcode::GlobalAtomicSMax32x2: | ||
| 247 | return IR::Opcode::StorageAtomicSMax32x2; | ||
| 248 | case IR::Opcode::GlobalAtomicUMax32x2: | ||
| 249 | return IR::Opcode::StorageAtomicUMax32x2; | ||
| 250 | case IR::Opcode::GlobalAtomicAnd32x2: | ||
| 251 | return IR::Opcode::StorageAtomicAnd32x2; | ||
| 252 | case IR::Opcode::GlobalAtomicOr32x2: | ||
| 253 | return IR::Opcode::StorageAtomicOr32x2; | ||
| 254 | case IR::Opcode::GlobalAtomicXor32x2: | ||
| 255 | return IR::Opcode::StorageAtomicXor32x2; | ||
| 256 | case IR::Opcode::GlobalAtomicExchange32x2: | ||
| 257 | return IR::Opcode::StorageAtomicExchange32x2; | ||
| 222 | case IR::Opcode::GlobalAtomicAddF32: | 258 | case IR::Opcode::GlobalAtomicAddF32: |
| 223 | return IR::Opcode::StorageAtomicAddF32; | 259 | return IR::Opcode::StorageAtomicAddF32; |
| 224 | case IR::Opcode::GlobalAtomicAddF16x2: | 260 | case IR::Opcode::GlobalAtomicAddF16x2: |
| @@ -454,6 +490,15 @@ void Replace(IR::Block& block, IR::Inst& inst, const IR::U32& storage_index, | |||
| 454 | case IR::Opcode::GlobalAtomicOr64: | 490 | case IR::Opcode::GlobalAtomicOr64: |
| 455 | case IR::Opcode::GlobalAtomicXor64: | 491 | case IR::Opcode::GlobalAtomicXor64: |
| 456 | case IR::Opcode::GlobalAtomicExchange64: | 492 | case IR::Opcode::GlobalAtomicExchange64: |
| 493 | case IR::Opcode::GlobalAtomicIAdd32x2: | ||
| 494 | case IR::Opcode::GlobalAtomicSMin32x2: | ||
| 495 | case IR::Opcode::GlobalAtomicUMin32x2: | ||
| 496 | case IR::Opcode::GlobalAtomicSMax32x2: | ||
| 497 | case IR::Opcode::GlobalAtomicUMax32x2: | ||
| 498 | case IR::Opcode::GlobalAtomicAnd32x2: | ||
| 499 | case IR::Opcode::GlobalAtomicOr32x2: | ||
| 500 | case IR::Opcode::GlobalAtomicXor32x2: | ||
| 501 | case IR::Opcode::GlobalAtomicExchange32x2: | ||
| 457 | case IR::Opcode::GlobalAtomicAddF32: | 502 | case IR::Opcode::GlobalAtomicAddF32: |
| 458 | case IR::Opcode::GlobalAtomicAddF16x2: | 503 | case IR::Opcode::GlobalAtomicAddF16x2: |
| 459 | case IR::Opcode::GlobalAtomicAddF32x2: | 504 | case IR::Opcode::GlobalAtomicAddF32x2: |
diff --git a/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp b/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp index e80d3d1d9..c2654cd9b 100644 --- a/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp +++ b/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp | |||
| @@ -199,6 +199,26 @@ void Lower(IR::Block& block, IR::Inst& inst) { | |||
| 199 | return ShiftRightLogical64To32(block, inst); | 199 | return ShiftRightLogical64To32(block, inst); |
| 200 | case IR::Opcode::ShiftRightArithmetic64: | 200 | case IR::Opcode::ShiftRightArithmetic64: |
| 201 | return ShiftRightArithmetic64To32(block, inst); | 201 | return ShiftRightArithmetic64To32(block, inst); |
| 202 | case IR::Opcode::SharedAtomicExchange64: | ||
| 203 | return inst.ReplaceOpcode(IR::Opcode::SharedAtomicExchange32x2); | ||
| 204 | case IR::Opcode::GlobalAtomicIAdd64: | ||
| 205 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicIAdd32x2); | ||
| 206 | case IR::Opcode::GlobalAtomicSMin64: | ||
| 207 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicSMin32x2); | ||
| 208 | case IR::Opcode::GlobalAtomicUMin64: | ||
| 209 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicUMin32x2); | ||
| 210 | case IR::Opcode::GlobalAtomicSMax64: | ||
| 211 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicSMax32x2); | ||
| 212 | case IR::Opcode::GlobalAtomicUMax64: | ||
| 213 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicUMax32x2); | ||
| 214 | case IR::Opcode::GlobalAtomicAnd64: | ||
| 215 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicAnd32x2); | ||
| 216 | case IR::Opcode::GlobalAtomicOr64: | ||
| 217 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicOr32x2); | ||
| 218 | case IR::Opcode::GlobalAtomicXor64: | ||
| 219 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicXor32x2); | ||
| 220 | case IR::Opcode::GlobalAtomicExchange64: | ||
| 221 | return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicExchange32x2); | ||
| 202 | default: | 222 | default: |
| 203 | break; | 223 | break; |
| 204 | } | 224 | } |