Allow fast path for memory reads from pages that contain code
This commit is contained in:
parent
fcdda9487e
commit
b70a5c081a
|
@ -3,7 +3,7 @@ use global_pointers;
|
|||
use jit::JitContext;
|
||||
use modrm;
|
||||
use regs;
|
||||
use tlb::{TLB_GLOBAL, TLB_NO_USER, TLB_READONLY, TLB_VALID};
|
||||
use tlb::{TLB_GLOBAL, TLB_HAS_CODE, TLB_NO_USER, TLB_READONLY, TLB_VALID};
|
||||
use wasmgen::module_init;
|
||||
use wasmgen::module_init::{WasmBuilder, WasmLocal};
|
||||
use wasmgen::wasm_util::WasmBuf;
|
||||
|
@ -251,11 +251,15 @@ fn gen_safe_read(ctx: &mut JitContext, bits: BitSize) {
|
|||
.load_aligned_i32_from_stack(global_pointers::TLB_DATA);
|
||||
let entry_local = builder.tee_new_local();
|
||||
|
||||
// Pseudo: bool can_use_fast_path = (entry & 0xFFF & ~TLB_READONLY & ~TLB_GLOBAL & ~(cpl == 3 ? 0 : TLB_NO_USER) == TLB_VALID &&
|
||||
// (bitsize == 8 ? true : (address & 0xFFF) <= (0x1000 - (bitsize / 8)));
|
||||
// Pseudo: bool can_use_fast_path =
|
||||
// (entry & 0xFFF & ~TLB_READONLY & ~TLB_GLOBAL & ~TLB_HAS_CODE & ~(cpl == 3 ? 0 : TLB_NO_USER) == TLB_VALID &&
|
||||
// (bitsize == 8 ? true : (address & 0xFFF) <= (0x1000 - (bitsize / 8)));
|
||||
builder.instruction_body.const_i32(
|
||||
(0xFFF & !TLB_READONLY & !TLB_GLOBAL & !(if ctx.cpu.cpl3() { 0 } else { TLB_NO_USER }))
|
||||
as i32,
|
||||
(0xFFF
|
||||
& !TLB_READONLY
|
||||
& !TLB_GLOBAL
|
||||
& !TLB_HAS_CODE
|
||||
& !(if ctx.cpu.cpl3() { 0 } else { TLB_NO_USER })) as i32,
|
||||
);
|
||||
builder.instruction_body.and_i32();
|
||||
|
||||
|
|
|
@ -3,4 +3,4 @@ pub const TLB_READONLY: u32 = (1 << 1);
|
|||
pub const TLB_NO_USER: u32 = (1 << 2);
|
||||
//const TLB_IN_MAPPED_RANGE: u32 = (1 << 3);
|
||||
pub const TLB_GLOBAL: u32 = (1 << 4);
|
||||
//const TLB_HAS_CODE: u32 = (1 << 5);
|
||||
pub const TLB_HAS_CODE: u32 = (1 << 5);
|
||||
|
|
|
@ -160,7 +160,7 @@
|
|||
(i32.const 744))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
(i32.const 3))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
@ -87,7 +87,7 @@
|
|||
(i32.const 3))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
|
|
@ -148,7 +148,7 @@
|
|||
(i32.const 3))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
@ -198,7 +198,7 @@
|
|||
(i32.const 3))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
(i32.const 744))))
|
||||
(i32.const 12))
|
||||
(i32.const 2))))
|
||||
(i32.const 4073))
|
||||
(i32.const 4041))
|
||||
(i32.const 1))
|
||||
(i32.le_s
|
||||
(i32.and
|
||||
|
|
Loading…
Reference in a new issue