diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-09-13 12:53:55 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-09-13 12:53:55 +0200 |
| commit | 52fe2485ae9d68d4cf3ffdcd91aeffecd43a66db (patch) | |
| tree | 440d1e2991920f5ac0d9ef3f4f645e482733f04c /src | |
| parent | 2c6816be8f9f6b0ed3c87cd97f9fb468ac61e042 (diff) | |
| download | box64-52fe2485ae9d68d4cf3ffdcd91aeffecd43a66db.tar.gz box64-52fe2485ae9d68d4cf3ffdcd91aeffecd43a66db.zip | |
[DYNAREC] Small refactor on StrongMem emulator and lock prefix
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 6 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_helper.c | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_private.h | 1 | ||||
| -rw-r--r-- | src/tools/env.c | 2 |
9 files changed, 9 insertions, 13 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 00c34afc..763d1812 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -773,7 +773,7 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r if (!dyn->need_dump && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) return; static char buf[4096]; - int length = sprintf(buf, "barrier=%d state=%d/%d/%d(%d:%d->%d:%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d(%d/%d)", + int length = sprintf(buf, "barrier=%d state=%d/%d/%d(%d:%d->%d:%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d(%d/%d/%d)", dyn->insts[ninst].x64.barrier, dyn->insts[ninst].x64.state_flags, dyn->f.pending, @@ -788,7 +788,7 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r dyn->insts[ninst].x64.use_flags, dyn->insts[ninst].x64.need_before, dyn->insts[ninst].x64.need_after, - dyn->smwrite, dyn->insts[ninst].will_write, dyn->insts[ninst].last_write); + dyn->smwrite, dyn->insts[ninst].will_write, dyn->insts[ninst].last_write, dyn->insts[ninst].lock); if (dyn->insts[ninst].nat_flags_op) { if (dyn->insts[ninst].nat_flags_op == NAT_FLAG_OP_TOUCH && dyn->insts[ninst].before_nat_flags) length += sprintf(buf + length, " NF:%d/read:%x", dyn->insts[ninst].nat_flags_op, dyn->insts[ninst].before_nat_flags); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index d71603d4..a1d9a93b 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -31,8 +31,7 @@ uintptr_t geted(dynarec_arm_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, u MAYUSE(dyn); MAYUSE(ninst); MAYUSE(delta); if (l == LOCK_LOCK) { - dyn->insts[ninst].lock_prefixed = 1; - DMB_ISH(); + dyn->insts[ninst].lock = 1; } if(rex.is32bits) diff --git a/src/dynarec/arm64/dynarec_arm64_private.h b/src/dynarec/arm64/dynarec_arm64_private.h index e3d78d8e..cf28dd64 100644 --- a/src/dynarec/arm64/dynarec_arm64_private.h +++ b/src/dynarec/arm64/dynarec_arm64_private.h @@ -115,7 +115,6 @@ typedef struct instruction_arm64_s { uint8_t will_read:1; // [strongmem] will read from memory uint8_t last_write:1; // [strongmem] the last write in a SEQ uint8_t lock:1; // [strongmem] lock semantic - uint8_t lock_prefixed:1; // [strongmem] the opcode is lock prefixed uint8_t wfe:1; // opcode uses sevl + wfe uint8_t set_nat_flags; // 0 or combinaison of native flags define uint8_t use_nat_flags; // 0 or combinaison of native flags define diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index fc3d06a9..3d0a6e7b 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -134,8 +134,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int WILLWRITE(); } - int is_opcode_volatile = box64_wine && VolatileRangesContains(ip) && VolatileOpcodesHas(ip); - if (is_opcode_volatile && !dyn->insts[ninst].lock_prefixed) + int is_opcode_volatile = /*box64_wine &&*/ VolatileRangesContains(ip) && VolatileOpcodesHas(ip); + if (is_opcode_volatile && !dyn->insts[ninst].lock) DMB_ISHST(); #endif if((dyn->insts[ninst].x64.need_before&~X_PEND) && !ninst) { @@ -198,7 +198,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int INST_EPILOG; #if STEP > 1 - if (is_opcode_volatile && !dyn->insts[ninst].lock_prefixed) + if (is_opcode_volatile && !dyn->insts[ninst].lock) DMB_ISHLD(); #endif diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c index dea9799d..27a39ed2 100644 --- a/src/dynarec/la64/dynarec_la64_helper.c +++ b/src/dynarec/la64/dynarec_la64_helper.c @@ -36,7 +36,7 @@ uintptr_t geted(dynarec_la64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, MAYUSE(delta); if (l == LOCK_LOCK) { - dyn->insts[ninst].lock_prefixed = 1; + dyn->insts[ninst].lock = 1; } if (rex.is32bits) diff --git a/src/dynarec/la64/dynarec_la64_private.h b/src/dynarec/la64/dynarec_la64_private.h index f5cf5f29..00f19bc6 100644 --- a/src/dynarec/la64/dynarec_la64_private.h +++ b/src/dynarec/la64/dynarec_la64_private.h @@ -106,7 +106,6 @@ typedef struct instruction_la64_s { uint8_t will_read:1; // [strongmem] will read from memory uint8_t last_write:1; // [strongmem] the last write in a SEQ uint8_t lock:1; // [strongmem] lock semantic - uint8_t lock_prefixed:1; // [strongmem] the opcode is lock prefixed uint8_t df_notneeded; uint8_t nat_flags_fusion:1; uint8_t nat_flags_nofusion:1; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 6f008865..69bc708e 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -35,7 +35,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, MAYUSE(delta); if (l == LOCK_LOCK) { - dyn->insts[ninst].lock_prefixed = 1; + dyn->insts[ninst].lock = 1; } if (rex.is32bits) diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index de7ba7be..1d22c5ac 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -120,7 +120,6 @@ typedef struct instruction_rv64_s { uint8_t will_read:1; // [strongmem] will read from memory uint8_t last_write:1; // [strongmem] the last write in a SEQ uint8_t lock:1; // [strongmem] lock semantic - uint8_t lock_prefixed:1; // [strongmem] the opcode is lock prefixed uint8_t df_notneeded; uint8_t nat_flags_fusion:1; uint8_t nat_flags_nofusion:1; diff --git a/src/tools/env.c b/src/tools/env.c index 69be7c47..22ed7511 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -812,7 +812,7 @@ done: #else #error meh! #endif -#define DYNAREC_VERSION SET_VERSION(0, 0, 3) +#define DYNAREC_VERSION SET_VERSION(0, 0, 4) typedef struct DynaCacheHeader_s { char sign[10]; //"DynaCache\0" |