Allow fast path for memory reads from pages that contain code

This commit is contained in:
Fabian 2018-09-02 21:11:04 -05:00
parent fcdda9487e
commit b70a5c081a
6 changed files with 16 additions and 12 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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