Browse Source

gl_shader_decompiler: Implement SHR instruction.

nce_cpp
bunnei 8 years ago
parent
commit
9c12d989c3
  1. 4
      src/video_core/engines/shader_bytecode.h
  2. 13
      src/video_core/renderer_opengl/gl_shader_decompiler.cpp

4
src/video_core/engines/shader_bytecode.h

@ -259,6 +259,10 @@ union Instruction {
} }
} alu; } alu;
union {
BitField<48, 1, u64> is_signed;
} shift;
union { union {
BitField<39, 5, u64> shift_amount; BitField<39, 5, u64> shift_amount;
BitField<48, 1, u64> negate_b; BitField<48, 1, u64> negate_b;

13
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@ -973,6 +973,19 @@ private:
} }
switch (opcode->GetId()) { switch (opcode->GetId()) {
case OpCode::Id::SHR_C:
case OpCode::Id::SHR_R:
case OpCode::Id::SHR_IMM: {
if (!instr.shift.is_signed) {
// Logical shift right
op_a = "uint(" + op_a + ')';
}
// Cast to int is superfluous for arithmetic shift, it's only for a logical shift
regs.SetRegisterToInteger(instr.gpr0, true, 0, "int(" + op_a + " >> " + op_b + ')',
1, 1);
break;
}
case OpCode::Id::SHL_C: case OpCode::Id::SHL_C:
case OpCode::Id::SHL_R: case OpCode::Id::SHL_R:
case OpCode::Id::SHL_IMM: case OpCode::Id::SHL_IMM:

Loading…
Cancel
Save