|
|
@ -270,6 +270,17 @@ private: |
|
|
SetDest(0, dest, op_a + " + " + op_b, 1, 1); |
|
|
SetDest(0, dest, op_a + " + " + op_b, 1, 1); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
case OpCode::Id::MUFU: { |
|
|
|
|
|
switch (instr.sub_op) { |
|
|
|
|
|
case SubOp::Rcp: |
|
|
|
|
|
SetDest(0, dest, "1.0 / " + op_a, 1, 1); |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
LOG_ERROR(HW_GPU, "Unhandled sub op: 0x%02x", (int)instr.sub_op.Value()); |
|
|
|
|
|
throw DecompileFail("Unhandled sub op"); |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
default: { |
|
|
default: { |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic instruction: 0x%02x (%s): 0x%08x", |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic instruction: 0x%02x (%s): 0x%08x", |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
@ -298,7 +309,6 @@ private: |
|
|
SetDest(0, dest, op_a + " * " + op_b + " + " + op_c, 1, 1); |
|
|
SetDest(0, dest, op_a + " * " + op_b + " + " + op_c, 1, 1); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
default: { |
|
|
default: { |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic FFMA instruction: 0x%02x (%s): 0x%08x", |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic FFMA instruction: 0x%02x (%s): 0x%08x", |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
@ -347,7 +357,6 @@ private: |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x", |
|
|
LOG_CRITICAL(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x", |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
static_cast<unsigned>(instr.opcode.EffectiveOpCode()), |
|
|
OpCode::GetInfo(instr.opcode).name.c_str(), instr.hex); |
|
|
OpCode::GetInfo(instr.opcode).name.c_str(), instr.hex); |
|
|
throw DecompileFail("Unhandled instruction"); |
|
|
|
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|