about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_0f.c25
-rw-r--r--src/emu/x64run0f.c19
-rw-r--r--src/tools/my_cpuid.c1
3 files changed, 45 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index b1308b09..79578406 100755
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -400,6 +400,31 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQRDMULH_16(q0, q0, q1);

                     break;

 

+                case 0xF0:

+                    INST_NAME("MOVBE Gd, Ed");

+                    nextop=F8;

+                    GETGD;

+                    if(MODREG) {

+                        REVxw(gd, xRAX+(nextop&7)+(rex.b<<3));

+                    } else {

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0);

+                        LDRxw_U12(gd, ed, fixedaddress);

+                        REVxw(gd, gd);

+                    }

+                    break;

+                case 0xF1:

+                    INST_NAME("MOVBE Ed, Gd");

+                    nextop=F8;

+                    GETGD;

+                    if(MODREG) {   // reg <= reg

+                        REVxw(xRAX+(nextop&7)+(rex.b<<3), gd);

+                    } else {                    // mem <= reg

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0);

+                        REVxw(x1, gd);

+                        STRxw_U12(x1, ed, fixedaddress);

+                    }

+                    break;

+

                 default:

                     DEFAULT;

             }

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index a75ffc26..5cde4f53 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -304,6 +304,25 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                     }

                     break;

 

+                case 0xF0: /* MOVBE Gd, Ed*/

+                    nextop = F8;

+                    GETGD;

+                    GETED(0);

+                    if(rex.w)

+                        GD->q[0] = __builtin_bswap64(ED->q[0]);

+                    else

+                        GD->q[0] = __builtin_bswap32(ED->dword[0]);

+                    break;

+                case 0xF1: /* MOVBE Ed, Gd*/

+                    nextop = F8;

+                    GETGD;

+                    GETED(0);

+                    if(rex.w)

+                        ED->q[0] = __builtin_bswap64(GD->q[0]);

+                    else

+                        ED->q[0] = __builtin_bswap32(GD->dword[0]);

+                    break;

+

                 default:

                     return 0;

             }

diff --git a/src/tools/my_cpuid.c b/src/tools/my_cpuid.c
index 7ab19db0..7e330bec 100644
--- a/src/tools/my_cpuid.c
+++ b/src/tools/my_cpuid.c
@@ -65,6 +65,7 @@ void my_cpuid(x64emu_t* emu, uint32_t tmp32u)
                     | 1<<9      // SSSE3
                     | 1<<12     // fma
                     | 1<<13     // cx16 (cmpxchg16)
+                    | 1<<22     // MOVBE
                     | 1<<25     // aesni
                     ; 
             break;