fix: implement missing shader recompiler instructions

Resolves compilation errors in move_register.cpp by using proper
register offset approach instead of non-existent Y/Z/W methods.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-10-22 21:13:00 +10:00
parent c425e3b06f
commit d5081c3919

View File

@@ -19,66 +19,67 @@ void MOV(TranslatorVisitor& v, u64 insn, const IR::U32& src, bool is_mov32i = fa
u64 mask = is_mov32i ? mov.mov32i_mask : mov.mask; u64 mask = is_mov32i ? mov.mov32i_mask : mov.mask;
// Handle all mask patterns for proper component selection // Handle component selection based on mask
// The mask bits correspond to: bit 0=X, bit 1=Y, bit 2=Z, bit 3=W
if (mask == 0xf) { if (mask == 0xf) {
// All components - full move // All components - full move
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
} else if (mask == 0x1) { } else if (mask == 0x1) {
// Single component (X) - move only X component // X component only
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
} else if (mask == 0x2) { } else if (mask == 0x2) {
// Y component only // Y component only - move to Y register
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
} else if (mask == 0x4) { } else if (mask == 0x4) {
// Z component only // Z component only - move to Z register
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
} else if (mask == 0x8) { } else if (mask == 0x8) {
// W component only // W component only - move to W register
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0x3) { } else if (mask == 0x3) {
// XY components // XY components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
} else if (mask == 0x5) { } else if (mask == 0x5) {
// XZ components // XZ components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
} else if (mask == 0x9) { } else if (mask == 0x9) {
// XW components // XW components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0x6) { } else if (mask == 0x6) {
// YZ components // YZ components
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
} else if (mask == 0xa) { } else if (mask == 0xa) {
// YW components // YW components
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0xc) { } else if (mask == 0xc) {
// ZW components // ZW components
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0x7) { } else if (mask == 0x7) {
// XYZ components // XYZ components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
} else if (mask == 0xb) { } else if (mask == 0xb) {
// XYW components // XYW components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0xd) { } else if (mask == 0xd) {
// XZW components // XZW components
v.X(mov.dest_reg, src); v.X(mov.dest_reg, src);
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else if (mask == 0xe) { } else if (mask == 0xe) {
// YZW components // YZW components
v.Y(mov.dest_reg, src); v.X(mov.dest_reg + 1, src);
v.Z(mov.dest_reg, src); v.X(mov.dest_reg + 2, src);
v.W(mov.dest_reg, src); v.X(mov.dest_reg + 3, src);
} else { } else {
// Invalid mask pattern - this should not happen // Invalid mask pattern - this should not happen
LOG_WARNING(Shader, "Invalid mask pattern in MOV instruction: 0x{:x}", mask); LOG_WARNING(Shader, "Invalid mask pattern in MOV instruction: 0x{:x}", mask);