about summary refs log tree commit diff stats
path: root/src/emu/x64run.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-26 09:21:04 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-26 09:21:04 +0200
commitd09a48fd03466e7160752d8ed17c9df3976d11f9 (patch)
treec862d8ae9e7df0b439645b08ed4e5265c174b908 /src/emu/x64run.c
parentb5c0a857ca18fa91d0416a35e5ea9c7acf790d79 (diff)
downloadbox64-d09a48fd03466e7160752d8ed17c9df3976d11f9.tar.gz
box64-d09a48fd03466e7160752d8ed17c9df3976d11f9.zip
[INTERPRETER] my first avx opcode
Diffstat (limited to 'src/emu/x64run.c')
-rw-r--r--src/emu/x64run.c76
1 files changed, 72 insertions, 4 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index d7950424..ef2f550a 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -28,6 +28,27 @@
 
 int my_setcontext(x64emu_t* emu, void* ucp);
 
+static const char* avx_prefix_string(uint16_t p)
+{
+    switch(p) {
+        case 0: return "0";
+        case 1: return "66";
+        case 2: return "F3";
+        case 3: return "F2";
+        default: return "??";
+    }
+}
+static const char* avx_map_string(uint16_t m)
+{
+    switch(m) {
+        case 0: return "0";
+        case 1: return "0F";
+        case 2: return "0F38";
+        case 3: return "0F3A";
+        default: return "??";
+    }
+}
+
 #ifdef TEST_INTERPRETER
 int RunTest(x64test_t *test)
 #else
@@ -1353,8 +1374,32 @@ x64emurun:
                 emu->segs_serial[_ES] = 0;
                 GD->dword[0] = *(uint32_t*)ED;
             } else {
-                // AVX not supported yet
-                emit_signal(emu, SIGILL, (void*)R_RIP, 0);
+                vex_t vex = {0};
+                vex.rex = rex;
+                tmp8u = F8;
+                vex.m = tmp8u&0b00011111;
+                vex.rex.b = (tmp8u&0b00100000)?0:1;
+                vex.rex.x = (tmp8u&0b01000000)?0:1;
+                vex.rex.r = (tmp8u&0b10000000)?0:1;
+                tmp8u = F8;
+                vex.p = tmp8u&0b00000011;
+                vex.l = (tmp8u>>2)&1;
+                vex.v = ((~tmp8u)>>3)&0b1111;
+                vex.rex.w = (tmp8u>>7)&1;
+                #ifdef TEST_INTERPRETER 
+                if(!(addr = TestAVX(test, vex, addr, &step)))
+                    unimp = 1;
+                #else
+                if(!(addr = RunAVX(emu, vex, addr, &step))) {
+                    printf_log(LOG_NONE, "Unimplemented AVX opcode prefix %s map %s ", avx_prefix_string(vex.p), avx_prefix_string(vex.m));
+                    unimp = 1;
+                    goto fini;
+                }
+                if(step==2) {
+                    STEP2;
+                }
+                #endif
+                break;
             }
             break;
         case 0xC5:                      /* LDS Gd,Ed */
@@ -1366,8 +1411,31 @@ x64emurun:
                 emu->segs_serial[_DS] = 0;
                 GD->dword[0] = *(uint32_t*)ED;
             } else {
-                // AVX not supported yet
-                emit_signal(emu, SIGILL, (void*)R_RIP, 0);
+                vex_t vex = {0};
+                vex.rex = rex;
+                tmp8u = F8;
+                vex.p = tmp8u&0b00000011;
+                vex.l = (tmp8u>>2)&1;
+                vex.v = ((~tmp8u)>>3)&0b1111;
+                vex.rex.r = (tmp8u&0b10000000)?0:1;
+                vex.rex.b = 0;
+                vex.rex.x = 0;
+                vex.rex.w = 0;
+                vex.m = VEX_M_0F;
+                #ifdef TEST_INTERPRETER 
+                if(!(addr = TestAVX(test, vex, addr, &step)))
+                    unimp = 1;
+                #else
+                if(!(addr = RunAVX(emu, vex, addr, &step))) {
+                    printf_log(LOG_NONE, "Unimplemented AVX opcode prefix %s map %s ", avx_prefix_string(vex.p), avx_map_string(vex.m));
+                    unimp = 1;
+                    goto fini;
+                }
+                if(step==2) {
+                    STEP2;
+                }
+                #endif
+                break;
             }
             break;
         case 0xC6:                      /* MOV Eb,Ib */