diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-01-25 02:30:20 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-01-25 03:16:10 -0300 | 
| commit | d26e74f0a3af0e015f7d33f06d1381d8f0d21e93 (patch) | |
| tree | bb61633d3ad8401d03e62569f50b506fa8e1e7fc | |
| parent | 9a2cdf85205b7c77112d73fbd491426f96e0c993 (diff) | |
shader/memory: Implement STL.S16 and STS.S16
| -rw-r--r-- | src/video_core/shader/decode/memory.cpp | 13 | 
1 files changed, 10 insertions, 3 deletions
| diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp index 8cd0e7d96..58744d29a 100644 --- a/src/video_core/shader/decode/memory.cpp +++ b/src/video_core/shader/decode/memory.cpp @@ -291,9 +291,9 @@ u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) {              return Operation(OperationCode::IAdd, NO_PRECISE, GetRegister(instr.gpr8), immediate);          }; -        const auto set_memory = opcode->get().GetId() == OpCode::Id::ST_L -                                    ? &ShaderIR::SetLocalMemory -                                    : &ShaderIR::SetSharedMemory; +        const bool is_local = opcode->get().GetId() == OpCode::Id::ST_L; +        const auto set_memory = is_local ? &ShaderIR::SetLocalMemory : &ShaderIR::SetSharedMemory; +        const auto get_memory = is_local ? &ShaderIR::GetLocalMemory : &ShaderIR::GetSharedMemory;          switch (instr.ldst_sl.type.Value()) {          case StoreType::Bits128: @@ -306,6 +306,13 @@ u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) {          case StoreType::Bits32:              (this->*set_memory)(bb, GetAddress(0), GetRegister(instr.gpr0));              break; +        case StoreType::Signed16: { +            Node address = GetAddress(0); +            Node memory = (this->*get_memory)(address); +            (this->*set_memory)( +                bb, address, InsertUnaligned(memory, GetRegister(instr.gpr0), address, 0b10, 16)); +            break; +        }          default:              UNIMPLEMENTED_MSG("{} unhandled type: {}", opcode->get().GetName(),                                static_cast<u32>(instr.ldst_sl.type.Value())); | 
