about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-06-09 11:07:55 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-06-09 11:07:55 +0200
commitb19dc0db89ab4fdaa1a7c379e30d608a89f29163 (patch)
treec5232a3ba010cf534b6c1d1711eff3fb4d09b84c /src
parentd886cf1d980e5282599c7acb78d6ddc7b8c15a1e (diff)
downloadbox64-b19dc0db89ab4fdaa1a7c379e30d608a89f29163.tar.gz
box64-b19dc0db89ab4fdaa1a7c379e30d608a89f29163.zip
[ARM64_DYNAREC] Added 64/65 0F BF opcode (for #2716)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/arm64_emitter.h1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 7cc424fb..680647b4 100644
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -338,6 +338,7 @@ int convert_bitmask(uint64_t bitmask);
 #define LDRSW_REG(Rt, Rn, Rm)           EMIT(LDRS_REG_gen(0b10, Rm, 0b011, 0, Rn, Rt))
 #define LDRSW_REG_SXTW(Rt, Rn, Rm)      EMIT(LDRS_REG_gen(0b10, Rm, 0b110, 0, Rn, Rt))
 #define LDRSW_REGz(Rt, Rn, Rm)          EMIT(LDRS_REG_gen(0b10, Rm, rex.is32bits?0b110:0b011, 0, Rn, Rt))
+#define LDRSH_REGz(Rt, Rn, Rm)          EMIT(LDRS_REG_gen(0b01, Rm, rex.is32bits?0b110:0b011, 0, Rn, Rt))
 
 #define LDR_PC_gen(opc, imm19, Rt)      ((opc)<<30 | 0b011<<27 | (imm19)<<5 | (Rt))
 #define LDRx_literal(Rt, imm21)         EMIT(LDR_PC_gen(0b01, (((int64_t)(imm21))>>2)&0x7FFFF, Rt))
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index f5c46cd2..e8c238ae 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -370,6 +370,27 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     break;
 
+                case 0xBF:
+                    switch(rep) {
+                        case 0:
+                            INST_NAME("MOVSX Gd, Ew");
+                            nextop = F8;
+                            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
+                            GETGD;
+                            if(MODREG) {
+                                ed = TO_NAT((nextop & 7) + (rex.b << 3));
+                                SXTHxw(gd, ed);
+                            } else {
+                                SMREAD();
+                                addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
+                                LDRSH_REGz(gd, x4, ed);
+                            }
+                            break;
+                        default:
+                            DEFAULT;
+                    }
+                    break;
+
                 default:
                     DEFAULT;
             }