about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-09 17:08:50 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-09 17:08:50 +0200
commit8ccde3ed4afc29e5187315b0a74b632b8acb0676 (patch)
tree7771d3ead02f1cd18bdd08b0b1438c7abbc1a53e /src
parentb6ce8efa2019a58c7c43c9056230e242b3239f00 (diff)
downloadbox64-8ccde3ed4afc29e5187315b0a74b632b8acb0676.tar.gz
box64-8ccde3ed4afc29e5187315b0a74b632b8acb0676.zip
Added 66 0F BA opcodes (for #44)
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run660f.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index 3b1ab667..2ac797a2 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -1012,6 +1012,97 @@ int Run660F(x64emu_t *emu, rex_t rex)
         GW->word[0] = EB->byte[0];

         break;

 

+    case 0xBA:                      

+        nextop = F8;

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

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

+                CHECK_FLAGS(emu);

+                GETEW(0);

+                GETGW;

+                tmp8u = F8;

+                if(rex.w) {

+                    tmp8u&=63;

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

+                        SET_FLAG(F_CF);

+                    else

+                        CLEAR_FLAG(F_CF);

+                } else {

+                    tmp8u&=15;

+                    if(EW->word[0] & (1<<tmp8u))

+                        SET_FLAG(F_CF);

+                    else

+                        CLEAR_FLAG(F_CF);

+                }

+                break;

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

+                CHECK_FLAGS(emu);

+                GETEW(0);

+                GETGW;

+                tmp8u = F8;

+                if(rex.w) {

+                    tmp8u&=63;

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

+                        SET_FLAG(F_CF);

+                    } else {

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

+                        CLEAR_FLAG(F_CF);

+                    }

+                } else {

+                    tmp8u&=15;

+                    if(EW->word[0] & (1<<tmp8u)) {

+                        SET_FLAG(F_CF);

+                    } else {

+                        EW->word[0] ^= (1<<tmp8u);

+                        CLEAR_FLAG(F_CF);

+                    }

+                }

+                break;

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

+                CHECK_FLAGS(emu);

+                GETEW(0);

+                GETGW;

+                tmp8u = F8;

+                if(rex.w) {

+                    tmp8u&=63;

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

+                        SET_FLAG(F_CF);

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

+                    } else

+                        CLEAR_FLAG(F_CF);

+                } else {

+                    tmp8u&=15;

+                    if(EW->word[0] & (1<<tmp8u)) {

+                        SET_FLAG(F_CF);

+                        EW->word[0] ^= (1<<tmp8u);

+                    } else

+                        CLEAR_FLAG(F_CF);

+                }

+                break;

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

+                CHECK_FLAGS(emu);

+                GETEW(0);

+                GETGW;

+                tmp8u = F8;

+                if(rex.w) {

+                    tmp8u&=63;

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

+                        SET_FLAG(F_CF);

+                    else

+                        CLEAR_FLAG(F_CF);

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

+                } else {

+                    tmp8u&=15;

+                    if(EW->word[0] & (1<<tmp8u))

+                        SET_FLAG(F_CF);

+                    else

+                        CLEAR_FLAG(F_CF);

+                    EW->word[0] ^= (1<<tmp8u);

+                }

+                break;

+            default:

+                return 1;

+        }

+        break;

     case 0xBB:                      /* BTC Ew,Gw */

         CHECK_FLAGS(emu);

         nextop = F8;