about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-04 20:17:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-04 20:17:43 +0100
commit50398acc97fefb99ab73798be3cd2751d3a2e998 (patch)
treeb9385a059ed9d07852323998a0aa9b516096ab5d
parent2e81d8ba80bbd4beb7998f5900905d8f8f784a49 (diff)
downloadbox64-50398acc97fefb99ab73798be3cd2751d3a2e998.tar.gz
box64-50398acc97fefb99ab73798be3cd2751d3a2e998.zip
Added REX D1/D3 opcodes
-rwxr-xr-xsrc/emu/x64run.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 1eacb1a7..4dc8851d 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -406,6 +406,36 @@ x64emurun:
             if(emu->quit) goto fini;
             break;
 
+        case 0xD1:                      /* GRP2 Ed,1 */
+        case 0xD3:                      /* GRP2 Ed,CL */
+            nextop = F8;
+            GETED;
+            tmp8u = (opcode==0xD1)?1:R_CL;
+            if(rex.w) {
+                switch((nextop>>3)&7) {
+                    case 0: ED->q[0] = rol64(emu, ED->q[0], tmp8u); break;
+                    case 1: ED->q[0] = ror64(emu, ED->q[0], tmp8u); break;
+                    case 2: ED->q[0] = rcl64(emu, ED->q[0], tmp8u); break;
+                    case 3: ED->q[0] = rcr64(emu, ED->q[0], tmp8u); break;
+                    case 4: 
+                    case 6: ED->q[0] = shl64(emu, ED->q[0], tmp8u); break;
+                    case 5: ED->q[0] = shr64(emu, ED->q[0], tmp8u); break;
+                    case 7: ED->q[0] = sar64(emu, ED->q[0], tmp8u); break;
+                }
+            } else {
+                switch((nextop>>3)&7) {
+                    case 0: ED->dword[0] = rol32(emu, ED->dword[0], tmp8u); break;
+                    case 1: ED->dword[0] = ror32(emu, ED->dword[0], tmp8u); break;
+                    case 2: ED->dword[0] = rcl32(emu, ED->dword[0], tmp8u); break;
+                    case 3: ED->dword[0] = rcr32(emu, ED->dword[0], tmp8u); break;
+                    case 4: 
+                    case 6: ED->dword[0] = shl32(emu, ED->dword[0], tmp8u); break;
+                    case 5: ED->dword[0] = shr32(emu, ED->dword[0], tmp8u); break;
+                    case 7: ED->dword[0] = sar32(emu, ED->dword[0], tmp8u); break;
+                }
+            }
+            break;
+
         case 0xE8:                      /* CALL Id */
             tmp32s = F32S; // call is relative
             Push(emu, R_RIP);