about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-04 11:56:06 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-04 11:56:06 +0100
commitabb74f7f760050186127f33ef9bb708e7b62526f (patch)
treeb0a5d800ef63b9b1a6c7ab8ea082033f9dd3cb87
parentca9ca0ca48b9cd3b0d112c1adf5b7e6a5681e3ff (diff)
downloadbox64-abb74f7f760050186127f33ef9bb708e7b62526f.tar.gz
box64-abb74f7f760050186127f33ef9bb708e7b62526f.zip
Added REX 81/83 opcodes
-rwxr-xr-xsrc/emu/x64run.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 10ca8b10..66db0709 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -197,6 +197,42 @@ x64emurun:
             emu->regs[tmp8u].q[0] = Pop(emu);
             break;
 
+        case 0x81:                      /* GRP Ed,Id */
+        case 0x83:                      /* GRP Ed,Ib */
+            nextop = F8;
+            GETED;
+            if(opcode==0x81) {
+                tmp32s = F32S;
+            } else {
+                tmp32s = F8S;
+            }
+            if(rex.w) {
+                tmp64u = (uint64_t)tmp32s;
+                switch((nextop>>3)&7) {
+                    case 0: ED->dword[0] = add64(emu, ED->dword[0], tmp64u); break;
+                    case 1: ED->dword[0] =  or64(emu, ED->dword[0], tmp64u); break;
+                    case 2: ED->dword[0] = adc64(emu, ED->dword[0], tmp64u); break;
+                    case 3: ED->dword[0] = sbb64(emu, ED->dword[0], tmp64u); break;
+                    case 4: ED->dword[0] = and64(emu, ED->dword[0], tmp64u); break;
+                    case 5: ED->dword[0] = sub64(emu, ED->dword[0], tmp64u); break;
+                    case 6: ED->dword[0] = xor64(emu, ED->dword[0], tmp64u); break;
+                    case 7:                cmp64(emu, ED->dword[0], tmp64u); break;
+                }
+            } else {
+                tmp32u = (uint32_t)tmp32s;
+                switch((nextop>>3)&7) {
+                    case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp32u); break;
+                    case 1: ED->dword[0] =  or32(emu, ED->dword[0], tmp32u); break;
+                    case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp32u); break;
+                    case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp32u); break;
+                    case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp32u); break;
+                    case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp32u); break;
+                    case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp32u); break;
+                    case 7:                cmp32(emu, ED->dword[0], tmp32u); break;
+                }
+            }
+            break;
+
         case 0x89:                    /* MOV Ed,Gd */
             nextop = F8;
             GETED;