diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 11:40:38 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 11:40:38 +0200 |
| commit | eb1b77ad010be102c5d911a918f6cef674fe67d7 (patch) | |
| tree | 7c4839c3288abc15c3f05ce32f0e15f8a31ec5ca /src | |
| parent | 45c7bab8e4712b31df37e83a754de7019fe3817c (diff) | |
| download | box64-eb1b77ad010be102c5d911a918f6cef674fe67d7.tar.gz box64-eb1b77ad010be102c5d911a918f6cef674fe67d7.zip | |
[DYNAREC] Better handling for Calling UpdateFlags when Cache flags needs transform
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.c | 4 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.h | 24 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_private.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 24 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_private.h | 2 |
6 files changed, 32 insertions, 28 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 7aaf098e..29442c1f 100755 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -1783,11 +1783,11 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1) if(go) { if(dyn->f.pending!=SF_PENDING) { LDRw_U12(s1, xEmu, offsetof(x64emu_t, df)); - j64 = (GETMARK3)-(dyn->native_size); + j64 = (GETMARKF2)-(dyn->native_size); CBZw(s1, j64); } CALL_(UpdateFlags, -1, 0); - MARK3; + MARKF2; } #endif } diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 84346f84..878094fe 100755 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -455,17 +455,19 @@ // R0 will not be pushed/popd if ret is -2. Flags are not save/restored #define CALL_S(F, ret) call_c(dyn, ninst, F, x7, ret, 0, 0) -#define MARK dyn->insts[ninst].mark = dyn->native_size -#define GETMARK dyn->insts[ninst].mark -#define MARK2 dyn->insts[ninst].mark2 = dyn->native_size -#define GETMARK2 dyn->insts[ninst].mark2 -#define MARK3 dyn->insts[ninst].mark3 = dyn->native_size -#define GETMARK3 dyn->insts[ninst].mark3 -#define MARKF dyn->insts[ninst].markf = dyn->native_size -#define GETMARKF dyn->insts[ninst].markf -#define MARKSEG dyn->insts[ninst].markseg = dyn->native_size -#define GETMARKSEG dyn->insts[ninst].markseg -#define MARKLOCK dyn->insts[ninst].marklock = dyn->native_size +#define MARK dyn->insts[ninst].mark = dyn->native_size +#define GETMARK dyn->insts[ninst].mark +#define MARK2 dyn->insts[ninst].mark2 = dyn->native_size +#define GETMARK2 dyn->insts[ninst].mark2 +#define MARK3 dyn->insts[ninst].mark3 = dyn->native_size +#define GETMARK3 dyn->insts[ninst].mark3 +#define MARKF dyn->insts[ninst].markf = dyn->native_size +#define GETMARKF dyn->insts[ninst].markf +#define MARKF2 dyn->insts[ninst].markf2 = dyn->native_size +#define GETMARKF2 dyn->insts[ninst].markf2 +#define MARKSEG dyn->insts[ninst].markseg = dyn->native_size +#define GETMARKSEG dyn->insts[ninst].markseg +#define MARKLOCK dyn->insts[ninst].marklock = dyn->native_size #define GETMARKLOCK dyn->insts[ninst].marklock // Branch to MARK if cond (use j64) diff --git a/src/dynarec/arm64/dynarec_arm64_private.h b/src/dynarec/arm64/dynarec_arm64_private.h index be57a790..52ad44b4 100755 --- a/src/dynarec/arm64/dynarec_arm64_private.h +++ b/src/dynarec/arm64/dynarec_arm64_private.h @@ -69,7 +69,7 @@ typedef struct instruction_arm64_s { int pred_sz; // size of predecessor list int *pred; // predecessor array uintptr_t mark, mark2, mark3; - uintptr_t markf; + uintptr_t markf, markf2; uintptr_t markseg; uintptr_t marklock; int pass2choice;// value for choices that are fixed on pass2 for pass3 diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index ec47b91d..0ec243a6 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -1843,11 +1843,11 @@ static void flagsCacheTransform(dynarec_rv64_t* dyn, int ninst, int s1) if(go) { if(dyn->f.pending!=SF_PENDING) { LW(s1, xEmu, offsetof(x64emu_t, df)); - j64 = (GETMARK3)-(dyn->native_size); + j64 = (GETMARKF2)-(dyn->native_size); BEQZ(s1, j64); } CALL_(UpdateFlags, -1, 0); - MARK3; + MARKF2; } #endif } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 60d369d2..ba2f426c 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -477,17 +477,19 @@ // R0 will not be pushed/popd if ret is -2. Flags are not save/restored #define CALL_S(F, ret) call_c(dyn, ninst, F, x6, ret, 0, 0) -#define MARK dyn->insts[ninst].mark = dyn->native_size -#define GETMARK dyn->insts[ninst].mark -#define MARK2 dyn->insts[ninst].mark2 = dyn->native_size -#define GETMARK2 dyn->insts[ninst].mark2 -#define MARK3 dyn->insts[ninst].mark3 = dyn->native_size -#define GETMARK3 dyn->insts[ninst].mark3 -#define MARKF dyn->insts[ninst].markf = dyn->native_size -#define GETMARKF dyn->insts[ninst].markf -#define MARKSEG dyn->insts[ninst].markseg = dyn->native_size -#define GETMARKSEG dyn->insts[ninst].markseg -#define MARKLOCK dyn->insts[ninst].marklock = dyn->native_size +#define MARK dyn->insts[ninst].mark = dyn->native_size +#define GETMARK dyn->insts[ninst].mark +#define MARK2 dyn->insts[ninst].mark2 = dyn->native_size +#define GETMARK2 dyn->insts[ninst].mark2 +#define MARK3 dyn->insts[ninst].mark3 = dyn->native_size +#define GETMARK3 dyn->insts[ninst].mark3 +#define MARKF dyn->insts[ninst].markf = dyn->native_size +#define GETMARKF dyn->insts[ninst].markf +#define MARKF2 dyn->insts[ninst].markf2 = dyn->native_size +#define GETMARKF2 dyn->insts[ninst].markf2 +#define MARKSEG dyn->insts[ninst].markseg = dyn->native_size +#define GETMARKSEG dyn->insts[ninst].markseg +#define MARKLOCK dyn->insts[ninst].marklock = dyn->native_size #define GETMARKLOCK dyn->insts[ninst].marklock #define Bxx_gen(OP, M, reg1, reg2) \ diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index 01657427..08182afd 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -70,7 +70,7 @@ typedef struct instruction_rv64_s { int pred_sz; // size of predecessor list int *pred; // predecessor array uintptr_t mark, mark2, mark3; - uintptr_t markf; + uintptr_t markf, markf2; uintptr_t markseg; uintptr_t marklock; int pass2choice;// value for choices that are fixed on pass2 for pass3 |