mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-07-04 23:31:19 +01:00
GPU: Don't mark uniform buffers and registers as used for instructions which don't have them.
Like the MOV32I and FMUL32I instructions. This fixes a potential crash when using these instructions.
This commit is contained in:
parent
0e13d9cb7b
commit
eab7457c00
2 changed files with 18 additions and 14 deletions
|
@ -526,6 +526,7 @@ public:
|
||||||
enum class Type {
|
enum class Type {
|
||||||
Trivial,
|
Trivial,
|
||||||
Arithmetic,
|
Arithmetic,
|
||||||
|
ArithmeticImmediate,
|
||||||
ArithmeticInteger,
|
ArithmeticInteger,
|
||||||
ArithmeticIntegerImmediate,
|
ArithmeticIntegerImmediate,
|
||||||
Bfe,
|
Bfe,
|
||||||
|
@ -655,7 +656,7 @@ private:
|
||||||
INST("0100110001101---", Id::FMUL_C, Type::Arithmetic, "FMUL_C"),
|
INST("0100110001101---", Id::FMUL_C, Type::Arithmetic, "FMUL_C"),
|
||||||
INST("0101110001101---", Id::FMUL_R, Type::Arithmetic, "FMUL_R"),
|
INST("0101110001101---", Id::FMUL_R, Type::Arithmetic, "FMUL_R"),
|
||||||
INST("0011100-01101---", Id::FMUL_IMM, Type::Arithmetic, "FMUL_IMM"),
|
INST("0011100-01101---", Id::FMUL_IMM, Type::Arithmetic, "FMUL_IMM"),
|
||||||
INST("00011110--------", Id::FMUL32_IMM, Type::Arithmetic, "FMUL32_IMM"),
|
INST("00011110--------", Id::FMUL32_IMM, Type::ArithmeticImmediate, "FMUL32_IMM"),
|
||||||
INST("0100110000010---", Id::IADD_C, Type::ArithmeticInteger, "IADD_C"),
|
INST("0100110000010---", Id::IADD_C, Type::ArithmeticInteger, "IADD_C"),
|
||||||
INST("0101110000010---", Id::IADD_R, Type::ArithmeticInteger, "IADD_R"),
|
INST("0101110000010---", Id::IADD_R, Type::ArithmeticInteger, "IADD_R"),
|
||||||
INST("0011100-00010---", Id::IADD_IMM, Type::ArithmeticInteger, "IADD_IMM"),
|
INST("0011100-00010---", Id::IADD_IMM, Type::ArithmeticInteger, "IADD_IMM"),
|
||||||
|
@ -676,7 +677,7 @@ private:
|
||||||
INST("0100110010011---", Id::MOV_C, Type::Arithmetic, "MOV_C"),
|
INST("0100110010011---", Id::MOV_C, Type::Arithmetic, "MOV_C"),
|
||||||
INST("0101110010011---", Id::MOV_R, Type::Arithmetic, "MOV_R"),
|
INST("0101110010011---", Id::MOV_R, Type::Arithmetic, "MOV_R"),
|
||||||
INST("0011100-10011---", Id::MOV_IMM, Type::Arithmetic, "MOV_IMM"),
|
INST("0011100-10011---", Id::MOV_IMM, Type::Arithmetic, "MOV_IMM"),
|
||||||
INST("000000010000----", Id::MOV32_IMM, Type::Arithmetic, "MOV32_IMM"),
|
INST("000000010000----", Id::MOV32_IMM, Type::ArithmeticImmediate, "MOV32_IMM"),
|
||||||
INST("0100110001100---", Id::FMNMX_C, Type::Arithmetic, "FMNMX_C"),
|
INST("0100110001100---", Id::FMNMX_C, Type::Arithmetic, "FMNMX_C"),
|
||||||
INST("0101110001100---", Id::FMNMX_R, Type::Arithmetic, "FMNMX_R"),
|
INST("0101110001100---", Id::FMNMX_R, Type::Arithmetic, "FMNMX_R"),
|
||||||
INST("0011100-01100---", Id::FMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"),
|
INST("0011100-01100---", Id::FMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"),
|
||||||
|
|
|
@ -852,11 +852,6 @@ private:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case OpCode::Id::MOV32_IMM: {
|
|
||||||
// mov32i doesn't have abs or neg bits.
|
|
||||||
regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OpCode::Id::FMUL_C:
|
case OpCode::Id::FMUL_C:
|
||||||
case OpCode::Id::FMUL_R:
|
case OpCode::Id::FMUL_R:
|
||||||
case OpCode::Id::FMUL_IMM: {
|
case OpCode::Id::FMUL_IMM: {
|
||||||
|
@ -864,13 +859,6 @@ private:
|
||||||
instr.alu.saturate_d);
|
instr.alu.saturate_d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OpCode::Id::FMUL32_IMM: {
|
|
||||||
// fmul32i doesn't have abs or neg bits.
|
|
||||||
regs.SetRegisterToFloat(
|
|
||||||
instr.gpr0, 0,
|
|
||||||
regs.GetRegisterAsFloat(instr.gpr8) + " * " + GetImmediate32(instr), 1, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OpCode::Id::FADD_C:
|
case OpCode::Id::FADD_C:
|
||||||
case OpCode::Id::FADD_R:
|
case OpCode::Id::FADD_R:
|
||||||
case OpCode::Id::FADD_IMM: {
|
case OpCode::Id::FADD_IMM: {
|
||||||
|
@ -943,6 +931,21 @@ private:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OpCode::Type::ArithmeticImmediate: {
|
||||||
|
switch (opcode->GetId()) {
|
||||||
|
case OpCode::Id::MOV32_IMM: {
|
||||||
|
regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OpCode::Id::FMUL32_IMM: {
|
||||||
|
regs.SetRegisterToFloat(
|
||||||
|
instr.gpr0, 0,
|
||||||
|
regs.GetRegisterAsFloat(instr.gpr8) + " * " + GetImmediate32(instr), 1, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OpCode::Type::Bfe: {
|
case OpCode::Type::Bfe: {
|
||||||
ASSERT_MSG(!instr.bfe.negate_b, "Unimplemented");
|
ASSERT_MSG(!instr.bfe.negate_b, "Unimplemented");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue