aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h
index 5d98d47564..b78c14f6b7 100644
--- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h
+++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h
@@ -161,8 +161,12 @@ template<>
code.jnz(abort, code.T_NEAR);
}
- code.shl(tmp, int(ctx.conf.page_table_log2_stride));
- code.mov(page, qword[r14 + tmp]);
+ if (ctx.conf.page_table_log2_stride > 3) {
+ code.shl(tmp, int(ctx.conf.page_table_log2_stride));
+ code.mov(page, qword[r14 + tmp.cvt64()]);
+ } else {
+ code.mov(page, qword[r14 + tmp.cvt64() * int(1 << ctx.conf.page_table_log2_stride)]);
+ }
// check for marked bit, use as unmapped if marked
if (ctx.conf.page_table_marked_bit) {
@@ -178,9 +182,10 @@ template<>
code.mov(tmp, ctx.conf.page_table_pointer_mask);
code.and_(page, tmp);
}
+ // check for sign bit, apply sign extension as needed
if (ctx.conf.page_table_sign_extension) {
- code.shl(page, *ctx.conf.page_table_sign_extension);
- code.sar(page, *ctx.conf.page_table_sign_extension);
+ code.shl(page, 63 - int(*ctx.conf.page_table_sign_extension));
+ code.sar(page, 63 - int(*ctx.conf.page_table_sign_extension));
}
code.jz(abort, code.T_NEAR);