about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-07-04 20:08:11 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-07-04 20:08:11 +0200
commit34c3e2dab306a85f913f89b3bfcf5c764061b904 (patch)
treecf904bab523594c0fca91aff78c5792bc4ea2a52 /src
parent2c0bbc06b7b05c2f5f06ef3ccc7d2e4cfb9117f1 (diff)
downloadbox64-34c3e2dab306a85f913f89b3bfcf5c764061b904.tar.gz
box64-34c3e2dab306a85f913f89b3bfcf5c764061b904.zip
[ARM64_DYNAREC] Improved 0F C7 /6 opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 1c1c2c98..85025081 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -2337,8 +2337,29 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xC7:

             // rep has no impact here

             nextop = F8;

-            if(MODREG) { DEFAULT; }

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

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

+            case 6:

+                INST_NAME("RDRAND Ed");

+                SETFLAGS(X_ALL, SF_SET_DF);

+                SET_DFNONE(x1);

+                GETED(0);

+                IFX(X_OF|X_SF|X_ZF|X_PF|X_AF) {

+                    MOV32w(x1, (1<<F_OF)|(1<<F_SF)|(1<<F_ZF)|(1<<F_PF)|(1<<F_AF));

+                    BICw(xFlags, xFlags, x1);

+                }

+                if(arm64_rndr) {

+                    MRS_rndr(x1);

+                    IFX(X_CF) { CSETw(x3, cNE); }

+                } else {

+                    CALL(rex.w?((void*)get_random64):((void*)get_random32), x1);

+                    IFX(X_CF) { MOV32w(x3, 1); }

+                }

+                IFX(X_CF) { BFIw(xFlags, x3, F_CF, 1); }

+                MOVxw_REG(ed, x1);

+                break;

+            default:

+                DEFAULT;

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

             case 1:

                 INST_NAME("CMPXCHG8B Gq, Eq");

                 SETFLAGS(X_ZF, SF_SUBSET);