about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 22:55:49 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 22:55:49 +0100
commitdce3292fc7134d7a32ce7de0b5e5d7e7ea4beb04 (patch)
tree6679fec30d40cd4e379b87a25feb1616f06d5dab
parent98a567e102305e0b50b3330ee04e2ddc11630a8f (diff)
downloadbox64-dce3292fc7134d7a32ce7de0b5e5d7e7ea4beb04.tar.gz
box64-dce3292fc7134d7a32ce7de0b5e5d7e7ea4beb04.zip
[DYNAREC] Added 0F BE/BF ocpodes, and fixed LDRSB emitter
-rwxr-xr-xsrc/dynarec/arm64_emitter.h6
-rwxr-xr-xsrc/dynarec/arm64_printer.c4
-rwxr-xr-xsrc/dynarec/dynablock.c4
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c31
-rwxr-xr-xsrc/include/debug.h2
5 files changed, 41 insertions, 6 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h
index d67361e5..28dfa452 100755
--- a/src/dynarec/arm64_emitter.h
+++ b/src/dynarec/arm64_emitter.h
@@ -227,9 +227,9 @@
 #define LDRSHx_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b01, 0b01, 0b10, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
 #define LDRSHw_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b01, 0b01, 0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
 #define LDRSHxw_U12(Rt, Rn, imm12)          EMIT(LDRSH_gen(0b01, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
-#define LDRSBx_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b00, 0b01, 0b10, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
-#define LDRSBw_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b00, 0b01, 0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
-#define LDRSBxw_U12(Rt, Rn, imm12)          EMIT(LDRSH_gen(0b00, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>1))&0xfff, Rn, Rt))
+#define LDRSBx_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b00, 0b01, 0b10, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt))
+#define LDRSBw_U12(Rt, Rn, imm12)           EMIT(LDRSH_gen(0b00, 0b01, 0b11, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt))
+#define LDRSBxw_U12(Rt, Rn, imm12)          EMIT(LDRSH_gen(0b00, 0b01, rex.w?0b10:0b11, ((uint32_t)(imm12>>0))&0xfff, Rn, Rt))
 
 #define LDR_PC_gen(opc, imm19, Rt)      ((opc)<<30 | 0b011<<27 | (imm19)<<5 | (Rt))
 #define LDRx_literal(Rt, imm19)         EMIT(LDR_PC_gen(0b01, ((imm19)>>2)&0x7FFFF, Rt))
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index 13fe743a..14255e48 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -278,9 +278,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
     if(isMask(opcode, "001110011xiiiiiiiiiiiinnnnnttttt", &a)) {

         int offset = imm<<1;

         if(!offset)

-            snprintf(buff, sizeof(buff), "LDRSB %s, [%s]", a.x?Xt[Rt]:Wt[Rt], XtSp[Rn]);

+            snprintf(buff, sizeof(buff), "LDRSB %s, [%s]", a.x?Wt[Rt]:Xt[Rt], XtSp[Rn]);

         else

-            snprintf(buff, sizeof(buff), "LDRSB %s, [%s, #%d]", a.x?Xt[Rt]:Wt[Rt], XtSp[Rn], offset);

+            snprintf(buff, sizeof(buff), "LDRSB %s, [%s, #%d]", a.x?Wt[Rt]:Xt[Rt], XtSp[Rn], offset);

         return buff;

     }

 

diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index e92b7f0b..79a07027 100755
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -323,8 +323,10 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
     if(!created)
         return block;   // existing block...
 
+    #if 0
     if(box64_dynarec_dump)
         pthread_mutex_lock(&my_context->mutex_dyndump);
+    #endif
     // fill the block
     block->x64_addr = (void*)addr;
     if(!FillBlock64(block, filladdr)) {
@@ -336,8 +338,10 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
         free(block);
         block = NULL;
     }
+    #if 0
     if(box64_dynarec_dump)
         pthread_mutex_unlock(&my_context->mutex_dyndump);
+    #endif
     // check size
     if(block && block->x64_size) {
         int blocksz = block->x64_size;
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 29298506..08eaedeb 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -543,6 +543,37 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             BFIw(xFlags, x1, F_ZF, 1);

             SET_DFNONE(x1);

             break;

+        case 0xBE:

+            INST_NAME("MOVSX Gd, Eb");

+            nextop = F8;

+            GETGD;

+            if(MODREG) {

+                if(rex.rex) {

+                    wback = xRAX+(nextop&7)+(rex.b<<3);

+                    wb2 = 0;

+                } else {

+                    wback = (nextop&7);

+                    wb2 = (wback>>2)*8;

+                    wback = xRAX+(wback&3);

+                }

+                SBFXxw(gd, wback, wb2, 8);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, 0xfff, 0, rex, 0, 0);

+                LDRSBxw_U12(gd, ed, fixedaddress);

+            }

+            break;

+        case 0xBF:

+            INST_NAME("MOVSX Gd, Ew");

+            nextop = F8;

+            GETGD;

+            if(MODREG) {

+                ed = xRAX+(nextop&7)+(rex.b<<3);

+                SXTHxw(gd, ed);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, 0xfff<<1, 1, rex, 0, 0);

+                LDRSHxw_U12(gd, ed, fixedaddress);

+            }

+            break;

 

         default:

             DEFAULT;

diff --git a/src/include/debug.h b/src/include/debug.h
index 61071b48..0f2de170 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -37,7 +37,7 @@ extern FILE* ftrace;
 
 #define printf_log(L, ...) do {if(L<=box64_log) {fprintf(ftrace, __VA_ARGS__); fflush(ftrace);}} while(0)
 
-#define dynarec_log(L, ...) do {if(L<=box64_dynarec_log) {fprintf(ftrace, __VA_ARGS__); /*fflush(ftrace);*/}} while(0)
+#define dynarec_log(L, ...) do {if(L<=box64_dynarec_log) {fprintf(ftrace, __VA_ARGS__); fflush(ftrace);}} while(0)
 
 #define EXPORT __attribute__((visibility("default")))
 #ifdef BUILD_DYNAMIC