Skip to content

Commit

Permalink
[ARM64_DYNAREC] Some changes on shift opcode and OF handling, and add…
Browse files Browse the repository at this point in the history
…ed some new profiles
  • Loading branch information
ptitSeb committed Feb 10, 2025
1 parent 7e0c4dc commit a50d34e
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 31 deletions.
76 changes: 45 additions & 31 deletions src/dynarec/arm64/dynarec_arm64_emit_shift.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ void emit_shl32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_OF) {
CMPSxw_U12(s2, 1); // if s2==1
LSRxw(s4, s1, (rex.w)?63:31);
EORxw_REG(s3, s4, xFlags); // CF is set if OF is asked
LSRxw(s4, s1, (rex.w)?63:31);
EORxw_REG(s3, s4, xFlags); // CF is set if OF is asked
if(BOX64ENV(dynarec_test)) {
CMPSxw_U12(s2, 1); // if s2==1
CSELw(s3, s3, wZR, cEQ);
BFIw(xFlags, s3, F_OF, 1);
}
BFIw(xFlags, s3, F_OF, 1);
}
int need_tst = 0;
IFX(X_ZF) need_tst = 1;
Expand Down Expand Up @@ -116,7 +118,7 @@ void emit_shl32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
}
}
IFX(X_OF) {
if(c==1) {
if(c==1 || BOX64DRENV(dynarec_safeflags)>1) {
IFX(X_SF) {} else {LSRxw(s4, s1, (rex.w)?63:31);}
EORxw_REG(s4, s4, xFlags); // CF is set if OF is asked
BFIw(xFlags, s4, F_OF, 1);
Expand Down Expand Up @@ -158,10 +160,12 @@ void emit_shr32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3
BFIw(xFlags, s3, 0, 1);
}
IFX(X_OF) {
CMPSxw_U12(s2, 1); // if s2==1
LSRxw(s4, s1, rex.w?63:31);
LSRxw(s4, s1, rex.w?63:31);
if(BOX64ENV(dynarec_test)) {
CMPSxw_U12(s2, 1); // if s2==1
CSELw(s4, s4, xZR, cEQ); // clear bit if c!=1
BFIw(xFlags, s4, F_OF, 1);
}
BFIw(xFlags, s4, F_OF, 1);
}
LSRxw_REG(s1, s1, s2);
IFX(X_PEND) {
Expand Down Expand Up @@ -213,7 +217,7 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
BFIw(xFlags, s3, 0, 1);
}
}
IFX2(X_OF, && (c==1)) {
IFX2(X_OF, && (c==1 || BOX64DRENV(dynarec_safeflags)>1)) {
LSRxw(s4, s1, rex.w?63:31);
BFIw(xFlags, s4, F_OF, 1);
}
Expand All @@ -237,13 +241,14 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
BFCw(xFlags, F_SF, 1);
}
}
if (BOX64ENV(dynarec_test))
if (BOX64ENV(dynarec_test)) {
IFX(X_AF) {
BFCw(xFlags, F_AF, 1);
}
IFX(X_OF) if(c>1) {
BFCw(xFlags, F_OF, 1);
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s4);
}
Expand Down Expand Up @@ -338,7 +343,7 @@ void emit_sar32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i
}
}
IFX(X_OF)
if (c == 1 || BOX64ENV(dynarec_test)) {
if (c == 1 || BOX64ENV(dynarec_test) || BOX64DRENV(dynarec_safeflags)>1) {
BFCw(xFlags, F_OF, 1);
}
if (BOX64ENV(dynarec_test))
Expand Down Expand Up @@ -375,11 +380,13 @@ void emit_shl8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_OF) {
CMPSw_U12(s2, 1); // if s2==1
LSRw(s3, s1, 7);
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
LSRw(s3, s1, 7);
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
if(BOX64ENV(dynarec_test)) {
CMPSw_U12(s2, 1); // if s2==1
CSELw(s4, s4, wZR, cEQ);
BFIw(xFlags, s4, F_OF, 1);
}
BFIw(xFlags, s4, F_OF, 1);
}
COMP_ZFSF(s1, 8)
if (BOX64ENV(dynarec_test))
Expand Down Expand Up @@ -415,7 +422,7 @@ void emit_shl8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s
}
COMP_ZFSF(s1, 8)
IFX(X_OF) {
if(c==1) {
if(c==1 || BOX64DRENV(dynarec_safeflags)>1) {
IFX2(X_SF, && !arm64_flagm) {} else {LSRw(s3, s1, 7);} //use COMP_ZFSF operation
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
BFIw(xFlags, s4, F_OF, 1);
Expand Down Expand Up @@ -484,10 +491,12 @@ void emit_shr8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
BFIw(xFlags, s4, 0, 1);
}
IFX(X_OF) {
CMPSw_U12(s2, 1); // if s2==1
LSRw(s4, s1, 7);
LSRw(s4, s1, 7);
if(BOX64ENV(dynarec_test)) {
CMPSw_U12(s2, 1); // if s2==1
CSELw(s4, s4, xZR, cEQ);
BFIw(xFlags, s4, F_OF, 1);
}
BFIw(xFlags, s4, F_OF, 1);
}
LSRw_REG(s1, s1, s2);
IFX(X_PEND) {
Expand Down Expand Up @@ -524,7 +533,7 @@ void emit_shr8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s
}
}
IFX(X_OF) {
if(c==1) {
if(c==1 || BOX64DRENV(dynarec_safeflags)>1) {
LSRw(s4, s1, 7);
BFIw(xFlags, s4, F_OF, 1);
} else if (BOX64ENV(dynarec_test)) {
Expand Down Expand Up @@ -601,7 +610,7 @@ void emit_sar8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s
if(c<8) {
COMP_ZFSF(s1, 8)
IFX(X_OF)
if ((c == 1) || BOX64ENV(dynarec_test)) {
if ((c == 1) || BOX64ENV(dynarec_test) || BOX64DRENV(dynarec_safeflags)>1) {
BFCw(xFlags, F_OF, 1);
}
IFX(X_PF) {
Expand All @@ -616,6 +625,7 @@ void emit_sar8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s
EORw_mask(s3, s3, 0, 0); //1
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_OF){if(BOX64ENV(dynarec_test) || BOX64DRENV(dynarec_safeflags)>1) BFCw(xFlags, F_OF, 1);}
IFX(X_PF) {
ORRw_mask(xFlags, xFlags, 30, 0); //1<<F_PF
}
Expand Down Expand Up @@ -648,11 +658,13 @@ void emit_shl16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_OF) {
CMPSw_U12(s2, 1); // if s2==1
LSRw(s3, s1, 15);
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
LSRw(s3, s1, 15);
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
if(BOX64ENV(dynarec_test)) {
CMPSw_U12(s2, 1); // if s2==1
CSELw(s4, s4, wZR, cEQ);
BFIw(xFlags, s4, F_OF, 1);
}
BFIw(xFlags, s4, F_OF, 1);
}
COMP_ZFSF(s1, 16)
if (BOX64ENV(dynarec_test))
Expand Down Expand Up @@ -688,7 +700,7 @@ void emit_shl16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int
}
COMP_ZFSF(s1, 16)
IFX(X_OF) {
if(c==1) {
if(c==1 || BOX64DRENV(dynarec_safeflags)>1) {
IFX2(X_SF, && !arm64_flagm) {} else {LSRw(s3, s1, 15);} // use COMP_ZFSF operation
EORw_REG(s4, s3, xFlags); // CF is set if OF is asked
BFIw(xFlags, s4, F_OF, 1);
Expand Down Expand Up @@ -757,10 +769,12 @@ void emit_shr16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
BFIw(xFlags, s4, 0, 1);
}
IFX(X_OF) {
CMPSw_U12(s2, 1); // if s2==1
LSRw(s4, s1, 15);
LSRw(s4, s1, 15);
if(BOX64DRENV(dynarec_test)) {
CMPSw_U12(s2, 1); // if s2==1
CSELw(s4, s4, xZR, cEQ);
BFIw(xFlags, s4, F_OF, 1);
}
BFIw(xFlags, s4, F_OF, 1);
}
LSRw_REG(s1, s1, s2);
IFX(X_PEND) {
Expand Down Expand Up @@ -798,7 +812,7 @@ void emit_shr16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int
}
}
IFX(X_OF) {
if(c==1) {
if(c==1 || BOX64DRENV(dynarec_safeflags)>1) {
LSRw(s4, s1, 15);
BFIw(xFlags, s4, F_OF, 1);
} else if (BOX64ENV(dynarec_test)) {
Expand Down Expand Up @@ -875,7 +889,7 @@ void emit_sar16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int
}
COMP_ZFSF(s1, 16)
IFX(X_OF)
if ((c == 1) || BOX64ENV(dynarec_test)) {
if ((c == 1) || BOX64ENV(dynarec_test) || BOX64DRENV(dynarec_safeflags)>1) {
BFCw(xFlags, F_OF, 1);
}
if (BOX64ENV(dynarec_test))
Expand Down
15 changes: 15 additions & 0 deletions system/box64.box64rc
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,13 @@ BOX64_DYNAREC_STRONGMEM=1
BOX64_DYNAREC_SAFEFLAGS=2
BOX64_DYNAREC_CALLRET=1

[DIRT5.exe]
BOX64_DYNAREC_SAFEFLAGS=2
BOX64_DYNAREC_BIGBLOCK=3
BOX64_DYNAREC_CALLRET=1
BOX64_DYNAREC_STRONGMEM=0
BOX64_DYNAREC_PAUSE=3

This comment has been minimized.

Copy link
@ksco

ksco Feb 11, 2025

Collaborator

Oh this helps loading time?

This comment has been minimized.

Copy link
@ptitSeb

ptitSeb Feb 11, 2025

Author Owner

The PAUSE=3 usualy works fine on my Ampere yes.


[DOOMx64.exe]
BOX64_DYNAREC_SAFEFLAGS=0

Expand Down Expand Up @@ -482,6 +489,10 @@ BOX64_RDTSC_1GHZ=1
[INSIDE.exe]
BOX64_DYNAREC_STRONGMEM=1

[Maneater-Win64-Shipping.exe]
BOX64_DYNAREC_SAFEFLAGS=2
BOX64_DYNAREC_CALLRET=1

[MassEffect.exe]
BOX64_DYNAREC_BIGBLOCK=0
BOX64_DYNAREC_SAFEFLAGS=2
Expand Down Expand Up @@ -620,6 +631,10 @@ BOX64_DYNAREC_BIGBLOCK=0
[Sunblaze.exe]
BOX64_DYNAREC_STRONGMEM=1

[Talos2-Win64-Shipping.exe]
BOX64_DYNAREC_BIGBLOCK=3
BOX64_DYNAREC_CALLRET=1

[TouristTrophy.exe]
BOX64_DYNAREC_STRONGMEM=1
BOX64_DYNAREC_BIGBLOCK=3
Expand Down

0 comments on commit a50d34e

Please sign in to comment.