From ba0e074ab1d9061730feb6b90665553fdb83c572 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 10 Dec 2025 09:58:20 +0000 Subject: [PATCH] fix stdu/ldu Signed-off-by: lizzie --- externals/powah/data2code.c | 9 +++++---- externals/powah/powah_gen_base.hpp | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/externals/powah/data2code.c b/externals/powah/data2code.c index 05b2fd4e1a..54bc17a1bf 100644 --- a/externals/powah/data2code.c +++ b/externals/powah/data2code.c @@ -41,10 +41,7 @@ int main(int argc, char *argv[]) { {"NS",4,4}, {"NU",4,4}, }; - #define OP_EXT ((i_opcode << 26) | (i_extopc << 1)) -#define OP_EXT_XS ((i_opcode << 26) | (i_extopc << 2)) - if (strchr(mem, '[') != NULL) *strchr(mem, '[') = '\0'; if (strchr(mem, '.') != NULL) *strchr(mem, '.') = '_'; *sec++ = '\0'; @@ -181,12 +178,15 @@ int main(int argc, char *argv[]) { "}\n" , mem, form, i_opcode << 26); } else if (!strcmp(form, "DS")) { +#define OP_EXT_DS ((i_opcode << 26) | (i_extopc << 0)) printf( "void %s(GPR const rt, GPR const ra, uint32_t d) {" " emit_%s(0x%08x, rt, ra, d >> 2); " "}\n" - , mem, form, OP_EXT); + , mem, form, OP_EXT_DS); +#undef OP_EXT_DS } else if (!strcmp(form, "XS")) { +#define OP_EXT_XS ((i_opcode << 26) | (i_extopc << 2)) /* HUGE DIFFERENCE DO NOT REMOVE */ printf( "void %s(GPR const rt, GPR const ra, uint32_t sh) {" @@ -198,6 +198,7 @@ int main(int argc, char *argv[]) { " emit_%s(0x%08x, rt, ra, sh, true); " "}\n" , mem, form, OP_EXT_XS); +#undef OP_EXT_XS } else if (!strcmp(form, "XL")) { if (!strcmp(mem, "BCLR")) { printf( diff --git a/externals/powah/powah_gen_base.hpp b/externals/powah/powah_gen_base.hpp index bba6bc9067..6f3f27f6f0 100644 --- a/externals/powah/powah_gen_base.hpp +++ b/externals/powah/powah_gen_base.hpp @@ -227,7 +227,7 @@ void LBZX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0000ae, ra, rt void LD(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xe8000000, rt, ra, d >> 2); } void LDARX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0000a8, ra, rt, rb, false); } void LDARX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0000a8, ra, rt, rb, true); } -void LDU(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xe8000002, rt, ra, d >> 2); } +void LDU(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xe8000001, rt, ra, d >> 2); } void LDUX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00006a, ra, rt, rb, false); } void LDUX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00006a, ra, rt, rb, true); } void LDX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00002a, ra, rt, rb, false); } @@ -263,7 +263,7 @@ void LSWI(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0004aa, ra, rt, void LSWI_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0004aa, ra, rt, rb, true); } void LSWX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00042a, ra, rt, rb, false); } void LSWX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00042a, ra, rt, rb, true); } -void LWA(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xe8000004, rt, ra, d >> 2); } +void LWA(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xe8000002, rt, ra, d >> 2); } void LWARX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c000028, ra, rt, rb, false); } void LWARX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c000028, ra, rt, rb, true); } void LWAUX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0002ea, ra, rt, rb, false); } @@ -403,7 +403,7 @@ void STBX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0001ae, ra, rt void STD(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xf8000000, rt, ra, d >> 2); } void STDCX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0001ac, ra, rt, rb, false); } void STDCX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c0001ac, ra, rt, rb, true); } -void STDU(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xf8000002, rt, ra, d >> 2); } +void STDU(GPR const rt, GPR const ra, uint32_t d) { emit_DS(0xf8000001, rt, ra, d >> 2); } void STDUX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00016a, ra, rt, rb, false); } void STDUX_(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00016a, ra, rt, rb, true); } void STDX(GPR const rt, GPR const ra, GPR const rb) { emit_X(0x7c00012a, ra, rt, rb, false); }