about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-09 16:30:04 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-09 16:30:04 +0100
commit5ce5951f5db4377b1c745ed71e69376e875ce93a (patch)
tree4a77c2ad0dadaa3de0248db6226214343e04d942 /src
parent09428c185eae97b64c3a68a2751bad09481c7f6f (diff)
downloadbox64-5ce5951f5db4377b1c745ed71e69376e875ce93a.tar.gz
box64-5ce5951f5db4377b1c745ed71e69376e875ce93a.zip
Added REX 0F BA opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run0f.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index f30b8906..e48c0eb6 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -498,6 +498,103 @@ int Run0F(x64emu_t *emu, rex_t rex)
             GD->q[0] = EW->word[0];

             break;

 

+        case 0xBA:                      

+            nextop = F8;

+            switch((nextop>>3)&7) {

+                case 4:                 /* BT Ed,Ib */

+                    CHECK_FLAGS(emu);

+                    GETED(1);

+                    tmp8u = F8;

+                    if(!MODREG)

+                        ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5));

+                    if(rex.w) {

+                        tmp8u&=63;

+                        if(ED->q[0] & (1L<<tmp8u))

+                            SET_FLAG(F_CF);

+                        else

+                            CLEAR_FLAG(F_CF);

+                    } else {

+                        tmp8u&=31;

+                        if(ED->dword[0] & (1<<tmp8u))

+                            SET_FLAG(F_CF);

+                        else

+                            CLEAR_FLAG(F_CF);

+                    }

+                    break;

+                case 5:             /* BTS Ed, Ib */

+                    CHECK_FLAGS(emu);

+                    GETED(1);

+                    tmp8u = F8;

+                    if(!MODREG)

+                        ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5));

+                    if(rex.w) {

+                        tmp8u&=63;

+                        if(ED->q[0] & (1L<<tmp8u)) {

+                            SET_FLAG(F_CF);

+                        } else {

+                            ED->q[0] ^= (1L<<tmp8u);

+                            CLEAR_FLAG(F_CF);

+                        }

+                    } else {

+                        tmp8u&=31;

+                        if(ED->dword[0] & (1<<tmp8u)) {

+                            SET_FLAG(F_CF);

+                        } else {

+                            ED->dword[0] ^= (1<<tmp8u);

+                            CLEAR_FLAG(F_CF);

+                        }

+                    }

+                    break;

+                case 6:             /* BTR Ed, Ib */

+                    CHECK_FLAGS(emu);

+                    GETED(1);

+                    tmp8u = F8;

+                    if(!MODREG)

+                        ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5));

+                    if(rex.w) {

+                        tmp8u&=63;

+                        if(ED->q[0] & (1L<<tmp8u)) {

+                            SET_FLAG(F_CF);

+                            ED->q[0] ^= (1L<<tmp8u);

+                        } else

+                            CLEAR_FLAG(F_CF);

+                    } else {

+                        tmp8u&=31;

+                        if(ED->dword[0] & (1<<tmp8u)) {

+                            SET_FLAG(F_CF);

+                            ED->dword[0] ^= (1<<tmp8u);

+                        } else

+                            CLEAR_FLAG(F_CF);

+                    }

+                    break;

+                case 7:             /* BTC Ed, Ib */

+                    CHECK_FLAGS(emu);

+                    GETED(1);

+                    tmp8u = F8;

+                    if(!MODREG)

+                        ED=(reg64_t*)(((uintptr_t*)(ED))+(tmp8u>>5));

+                    if(rex.w) {

+                        tmp8u&=63;

+                        if(ED->q[0] & (1L<<tmp8u))

+                            SET_FLAG(F_CF);

+                        else

+                            CLEAR_FLAG(F_CF);

+                        ED->q[0] ^= (1L<<tmp8u);

+                    } else {

+                        tmp8u&=31;

+                        if(ED->dword[0] & (1<<tmp8u))

+                            SET_FLAG(F_CF);

+                        else

+                            CLEAR_FLAG(F_CF);

+                        ED->dword[0] ^= (1<<tmp8u);

+                    }

+                    break;

+

+                default:

+                    return 1;

+            }

+            break;

+

         case 0xBE:                      /* MOVSX Gd,Eb */

             nextop = F8;

             GETEB(0);