diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-04 20:08:11 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-04 20:08:11 +0200 |
| commit | 34c3e2dab306a85f913f89b3bfcf5c764061b904 (patch) | |
| tree | cf904bab523594c0fca91aff78c5792bc4ea2a52 /src | |
| parent | 2c0bbc06b7b05c2f5f06ef3ccc7d2e4cfb9117f1 (diff) | |
| download | box64-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.c | 25 |
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); |