diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-26 09:21:04 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-26 09:21:04 +0200 |
| commit | d09a48fd03466e7160752d8ed17c9df3976d11f9 (patch) | |
| tree | c862d8ae9e7df0b439645b08ed4e5265c174b908 /src/emu/x64run.c | |
| parent | b5c0a857ca18fa91d0416a35e5ea9c7acf790d79 (diff) | |
| download | box64-d09a48fd03466e7160752d8ed17c9df3976d11f9.tar.gz box64-d09a48fd03466e7160752d8ed17c9df3976d11f9.zip | |
[INTERPRETER] my first avx opcode
Diffstat (limited to 'src/emu/x64run.c')
| -rw-r--r-- | src/emu/x64run.c | 76 |
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 */ |