From a276d8c29cbebf3f4a31b69d97106bdd4b364775 Mon Sep 17 00:00:00 2001 From: rogerman Date: Wed, 27 Apr 2022 22:58:53 -0700 Subject: [PATCH] JIT (ARM): Fixes a rendering bug in the SVatGLovesYou demo. - Special thanks to @byte4byte for the fix. His notes: "Fixed rrx shifts" --- desmume/src/utils/arm_jit/arm64_emit.cpp | 25 ++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/desmume/src/utils/arm_jit/arm64_emit.cpp b/desmume/src/utils/arm_jit/arm64_emit.cpp index 7d54a3855..1a0ca59b6 100755 --- a/desmume/src/utils/arm_jit/arm64_emit.cpp +++ b/desmume/src/utils/arm_jit/arm64_emit.cpp @@ -200,6 +200,8 @@ static void emit_rrxs_reg(t_bytes *out, int reg, int nreg); static void emit_rrx_reg(t_bytes *out, int reg, int nreg); static void emit_ror_reg(t_bytes *out, int reg, int nreg); +static void emit_andimm(t_bytes *out,int rs,int imm,int rt); + static void emit_lsr_reg(t_bytes *out, int reg, int nreg); static void emit_testimm(t_bytes *out, int rs,int imm); @@ -208,6 +210,9 @@ static void emit_movimm(t_bytes *out, uintptr_t imm,u_int rt); static void emit_movimm2pad(t_bytes *out, u_int imm,u_int rt); static void emit_addnop(t_bytes *out, u_int r); +static void emit_setc(t_bytes *out, int reg); +static void emit_or(t_bytes *out, u_int rs1,u_int rs2,u_int rt); + static void output_w32(t_bytes *bytes, unsigned int word); static void output_w32_full(t_bytes *bytes, unsigned int word, int type, int label_id, int cond); @@ -295,9 +300,14 @@ static void emit_ror(t_bytes *out, int reg, int n) { } } static void emit_rrx(t_bytes *out, int reg, int n) { + emit_setc(out, 13); + output_w32(out, 0x530101AD); // lsl w13, w13, #31 + emit_andimm(out, reg, 1, 5); emit_movimm(out, n, SHIFT_REG); - emit_ror_reg(out, reg, SHIFT_REG); + emit_ror_reg(out, reg, SHIFT_REG); + emit_andimm(out, reg, 0x7fffffff, reg); + emit_or(out, reg, 13, reg); } static void emit_lsl_reg(t_bytes *out, int reg, int nreg) { int setb=genlabel(); @@ -372,8 +382,19 @@ static void emit_rors(t_bytes *out, int reg, int n) { emit_rors_reg(out, reg, SHIFT_REG); } static void emit_rrxs(t_bytes *out, int reg, int n) { + + emit_setc(out, 13); + output_w32(out, 0x530101AD); // lsl w13, w13, #31 + emit_andimm(out, reg, 1, 5); + emit_movimm(out, n, SHIFT_REG); - emit_rrxs_reg(out, reg, SHIFT_REG); + emit_ror_reg(out, reg, SHIFT_REG); + emit_andimm(out, reg, 0x7fffffff, reg); + emit_or(out, reg, 13, reg); + + //emit_mov(out, 14, 5); + //emit_movimm(out, n, SHIFT_REG); + //emit_rrxs_reg(out, reg, SHIFT_REG); } static void emit_lsls_reg(t_bytes *out, int reg, int nreg) {