about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-24 16:07:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-24 16:07:10 +0200
commitfa702c0240d0741def3955697067b562cc7a7fcd (patch)
tree9c6e9cc3cedffc9ba8249b933c75e88094cd4c64 /src/emu
parent34bc807bd5218d42e16757ed5dc7edd2751f5bf0 (diff)
downloadbox64-fa702c0240d0741def3955697067b562cc7a7fcd.tar.gz
box64-fa702c0240d0741def3955697067b562cc7a7fcd.zip
Improved CPUID a bit more, adding RDRAND (helps geekbench6 avx2 version)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64run0f.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 8aa634ae..4f12e615 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1704,12 +1704,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
             GX->q[0] = eax1.q[0];

             GX->q[1] = eax1.q[1];

             break;

-        case 0xC7:                      /* CMPXCHG8B Eq */

+        case 0xC7:

             CHECK_FLAGS(emu);

             nextop = F8;

             GETE8xw(0);

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

-                case 1:

+                case 1:     /* CMPXCHG8B Eq */

                     if(rex.w) {

                         tmp64u = ED->q[0];

                         tmp64u2= ED->q[1];

@@ -1736,6 +1736,22 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         }

                     }

                     break;

+                case 6:     /* RDRAND Ed */

+                    RESET_FLAGS(emu);

+                    CLEAR_FLAG(F_OF);

+                    CLEAR_FLAG(F_SF);

+                    CLEAR_FLAG(F_PF);

+                    CLEAR_FLAG(F_ZF);

+                    CLEAR_FLAG(F_AF);

+                    SET_FLAG(F_CF);

+                    if(rex.w)

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

+                    else {

+                        ED->dword[0] = get_random32();

+                        if(MODREG)

+                            ED->dword[1] = 1;

+                    }

+                    break;

                 default:

                     return 0;

             }