about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run64.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index c39ff5e7..9a790cff 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -285,6 +285,101 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                     }

                     break;

 

+                case 0xBA:                      

+                    nextop = F8;

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

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

+                            CHECK_FLAGS(emu);

+                            GETED_OFFS(1, tlsdata);

+                            tmp8u = F8;

+                            if(rex.w) {

+                                tmp8u&=63;

+                                if(ED->q[0] & (1LL<<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_OFFS(1, tlsdata);

+                            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&=31;

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

+                                    SET_FLAG(F_CF);

+                                } else {

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

+                                    CLEAR_FLAG(F_CF);

+                                }

+                                if(MODREG)

+                                    ED->dword[1] = 0;

+                            }

+                            break;

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

+                            CHECK_FLAGS(emu);

+                            GETED_OFFS(1, tlsdata);

+                            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&=31;

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

+                                    SET_FLAG(F_CF);

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

+                                } else

+                                    CLEAR_FLAG(F_CF);

+                                if(MODREG)

+                                    ED->dword[1] = 0;

+                            }

+                            break;

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

+                            CHECK_FLAGS(emu);

+                            GETED_OFFS(1, tlsdata);

+                            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&=31;

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

+                                    SET_FLAG(F_CF);

+                                else

+                                    CLEAR_FLAG(F_CF);

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

+                                if(MODREG)

+                                    ED->dword[1] = 0;

+                            }

+                            break;

+

+                        default:

+                            return 0;

+                    }

+                    break;

+

                 default:

                     return 0;

             }