diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-12-20 17:56:30 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-12-20 18:02:41 -0300 | 
| commit | 38d3a4887359b55193b57f31a80921b956c90443 (patch) | |
| tree | bd80e6b7eeadb8f5c0b999c674869b7610ddbfe2 /src/video_core | |
| parent | cf27b59493501787320764889a0375711c3f68e1 (diff) | |
shader/p2r: Implement P2R Pr
P2R dumps predicate or condition codes state to a register. This is
useful for unit testing.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/shader/decode/register_set_predicate.cpp | 16 | 
1 files changed, 15 insertions, 1 deletions
| diff --git a/src/video_core/shader/decode/register_set_predicate.cpp b/src/video_core/shader/decode/register_set_predicate.cpp index ff8245020..8d54cce34 100644 --- a/src/video_core/shader/decode/register_set_predicate.cpp +++ b/src/video_core/shader/decode/register_set_predicate.cpp @@ -34,10 +34,11 @@ u32 ShaderIR::DecodeRegisterSetPredicate(NodeBlock& bb, u32 pc) {          }      }(); +    const auto offset = static_cast<u32>(instr.p2r_r2p.byte) * 8; +      switch (opcode->get().GetId()) {      case OpCode::Id::R2P_IMM: {          const Node mask = GetRegister(instr.gpr8); -        const auto offset = static_cast<u32>(instr.p2r_r2p.byte) * 8;          for (u64 pred = 0; pred < NUM_PROGRAMMABLE_PREDICATES; ++pred) {              const auto shift = static_cast<u32>(pred); @@ -55,6 +56,19 @@ u32 ShaderIR::DecodeRegisterSetPredicate(NodeBlock& bb, u32 pc) {          }          break;      } +    case OpCode::Id::P2R_IMM: { +        Node value = Immediate(0); +        for (u64 pred = 0; pred < NUM_PROGRAMMABLE_PREDICATES; ++pred) { +            Node bit = Operation(OperationCode::Select, GetPredicate(pred), Immediate(1U << pred), +                                 Immediate(0)); +            value = Operation(OperationCode::UBitwiseOr, std::move(value), std::move(bit)); +        } +        value = Operation(OperationCode::UBitwiseAnd, std::move(value), apply_mask); +        value = BitfieldInsert(GetRegister(instr.gpr8), std::move(value), offset, 8); + +        SetRegister(bb, instr.gpr0, std::move(value)); +        break; +    }      default:          UNIMPLEMENTED_MSG("Unhandled P2R/R2R instruction: {}", opcode->get().GetName());          break; | 
