gen_fn: Accept wasm builder, not jit context

This commit is contained in:
Fabian 2018-09-14 19:57:38 -05:00
parent 20d22a0bc0
commit 7e3f1ad401
3 changed files with 27 additions and 34 deletions

View file

@ -199,7 +199,7 @@ function gen_instruction_body_after_prefix(encodings, size)
default_case: {
body: [].concat(
gen_call(`::codegen::gen_fn0_const`, ["ctx", '"trigger_ud"']),
gen_call(`::codegen::gen_fn0_const`, ["ctx.builder", '"trigger_ud"']),
"*instr_flags |= ::jit::JIT_INSTR_BLOCK_BOUNDARY_FLAG;"
),
}
@ -264,7 +264,7 @@ function gen_instruction_body_after_fixed_g(encoding, size)
// Has modrm byte, but the 2 mod bits are ignored and both
// operands are always registers (0f20-0f24)
const args = ["ctx", `"${instruction_name}"`, "(modrm_byte & 7) as u32", "(modrm_byte >> 3 & 7) as u32"];
const args = ["ctx.builder", `"${instruction_name}"`, "(modrm_byte & 7) as u32", "(modrm_byte >> 3 & 7) as u32"];
return [].concat(
instruction_prefix,
@ -316,8 +316,8 @@ function gen_instruction_body_after_fixed_g(encoding, size)
}
else
{
const mem_args = ["ctx", `"${instruction_name}_mem"`];
const reg_args = ["ctx", `"${instruction_name}_reg"`, "(modrm_byte & 7) as u32"];
const mem_args = ["ctx.builder", `"${instruction_name}_mem"`];
const reg_args = ["ctx.builder", `"${instruction_name}_reg"`, "(modrm_byte & 7) as u32"];
if(encoding.fixed_g === undefined)
{
@ -383,7 +383,7 @@ function gen_instruction_body_after_fixed_g(encoding, size)
{
// instruction without modrm byte or prefix
const args = ["ctx", `"${instruction_name}"`];
const args = ["ctx.builder", `"${instruction_name}"`];
if(imm_read)
{

View file

@ -98,8 +98,7 @@ pub fn sign_extend_i16(builder: &mut WasmBuilder) {
builder.instruction_body.shr_s_i32();
}
pub fn gen_fn0_const(ctx: &mut JitContext, name: &str) {
let builder = &mut ctx.builder;
pub fn gen_fn0_const(builder: &mut WasmBuilder, name: &str) {
let fn_idx = builder.get_fn_idx(name, module_init::FN0_TYPE_INDEX);
builder.instruction_body.call_fn(fn_idx);
}
@ -109,8 +108,7 @@ pub fn gen_fn0_const_ret(builder: &mut WasmBuilder, name: &str) {
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_fn1_const(ctx: &mut JitContext, name: &str, arg0: u32) {
let builder = &mut ctx.builder;
pub fn gen_fn1_const(builder: &mut WasmBuilder, name: &str, arg0: u32) {
let fn_idx = builder.get_fn_idx(name, module_init::FN1_TYPE_INDEX);
builder.instruction_body.const_i32(arg0 as i32);
builder.instruction_body.call_fn(fn_idx);
@ -122,8 +120,7 @@ pub fn gen_call_fn1_ret(builder: &mut WasmBuilder, name: &str) {
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_fn2_const(ctx: &mut JitContext, name: &str, arg0: u32, arg1: u32) {
let builder = &mut ctx.builder;
pub fn gen_fn2_const(builder: &mut WasmBuilder, name: &str, arg0: u32, arg1: u32) {
let fn_idx = builder.get_fn_idx(name, module_init::FN2_TYPE_INDEX);
builder.instruction_body.const_i32(arg0 as i32);
builder.instruction_body.const_i32(arg1 as i32);
@ -148,14 +145,12 @@ pub fn gen_call_fn2_ret(builder: &mut WasmBuilder, name: &str) {
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_call_fn3(ctx: &mut JitContext, name: &str) {
let builder = &mut ctx.builder;
pub fn gen_call_fn3(builder: &mut WasmBuilder, name: &str) {
let fn_idx = builder.get_fn_idx(name, module_init::FN3_TYPE_INDEX);
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_fn3_const(ctx: &mut JitContext, name: &str, arg0: u32, arg1: u32, arg2: u32) {
let builder = &mut ctx.builder;
pub fn gen_fn3_const(builder: &mut WasmBuilder, name: &str, arg0: u32, arg1: u32, arg2: u32) {
let fn_idx = builder.get_fn_idx(name, module_init::FN3_TYPE_INDEX);
builder.instruction_body.const_i32(arg0 as i32);
builder.instruction_body.const_i32(arg1 as i32);
@ -163,24 +158,21 @@ pub fn gen_fn3_const(ctx: &mut JitContext, name: &str, arg0: u32, arg1: u32, arg
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_modrm_fn0(ctx: &mut JitContext, name: &str) {
pub fn gen_modrm_fn0(builder: &mut WasmBuilder, name: &str) {
// generates: fn( _ )
let builder = &mut ctx.builder;
let fn_idx = builder.get_fn_idx(name, module_init::FN1_TYPE_INDEX);
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_modrm_fn1(ctx: &mut JitContext, name: &str, arg0: u32) {
pub fn gen_modrm_fn1(builder: &mut WasmBuilder, name: &str, arg0: u32) {
// generates: fn( _, arg0 )
let builder = &mut ctx.builder;
let fn_idx = builder.get_fn_idx(name, module_init::FN2_TYPE_INDEX);
builder.instruction_body.const_i32(arg0 as i32);
builder.instruction_body.call_fn(fn_idx);
}
pub fn gen_modrm_fn2(ctx: &mut JitContext, name: &str, arg0: u32, arg1: u32) {
pub fn gen_modrm_fn2(builder: &mut WasmBuilder, name: &str, arg0: u32, arg1: u32) {
// generates: fn( _, arg0, arg1 )
let builder = &mut ctx.builder;
let fn_idx = builder.get_fn_idx(name, module_init::FN3_TYPE_INDEX);
builder.instruction_body.const_i32(arg0 as i32);
builder.instruction_body.const_i32(arg1 as i32);
@ -694,7 +686,6 @@ pub fn gen_pop32s(ctx: &mut JitContext) {
pub fn gen_task_switch_test(ctx: &mut JitContext) {
// generate if(cr[0] & (CR0_EM | CR0_TS)) { task_switch_test_void(); return; }
let cr0_offset = global_pointers::get_creg_offset(0);
ctx.builder.instruction_body.load_aligned_i32(cr0_offset);
@ -705,7 +696,8 @@ pub fn gen_task_switch_test(ctx: &mut JitContext) {
ctx.builder.instruction_body.if_void();
gen_fn0_const(ctx, "task_switch_test_void");
gen_fn0_const(ctx.builder, "task_switch_test_void");
ctx.builder.instruction_body.return_();
ctx.builder.instruction_body.block_end();
@ -723,7 +715,8 @@ pub fn gen_task_switch_test_mmx(ctx: &mut JitContext) {
ctx.builder.instruction_body.if_void();
gen_fn0_const(ctx, "task_switch_test_mmx_void");
gen_fn0_const(ctx.builder, "task_switch_test_mmx_void");
ctx.builder.instruction_body.return_();
ctx.builder.instruction_body.block_end();

View file

@ -1387,11 +1387,11 @@ pub fn instr32_8D_mem_jit(ctx: &mut JitContext, modrm_byte: u8, reg: u32) {
}
pub fn instr16_8D_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_fn2_const(ctx, "instr16_8D_reg", r1, r2);
codegen::gen_fn2_const(ctx.builder, "instr16_8D_reg", r1, r2);
}
pub fn instr32_8D_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_fn2_const(ctx, "instr32_8D_reg", r1, r2);
codegen::gen_fn2_const(ctx.builder, "instr32_8D_reg", r1, r2);
}
pub fn instr16_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
@ -1404,10 +1404,10 @@ pub fn instr16_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
ctx.builder.instruction_body.store_aligned_u16(0);
codegen::gen_modrm_resolve(ctx, modrm_byte);
codegen::gen_modrm_fn0(ctx, "instr16_8F_0_mem_jit");
codegen::gen_modrm_fn0(ctx.builder, "instr16_8F_0_mem_jit");
}
pub fn instr16_8F_0_reg_jit(ctx: &mut JitContext, r: u32) {
codegen::gen_fn1_const(ctx, "instr16_8F_0_reg", r);
codegen::gen_fn1_const(ctx.builder, "instr16_8F_0_reg", r);
}
pub fn instr32_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
ctx.builder
@ -1419,10 +1419,10 @@ pub fn instr32_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
ctx.builder.instruction_body.store_aligned_i32(0);
codegen::gen_modrm_resolve(ctx, modrm_byte);
codegen::gen_modrm_fn0(ctx, "instr32_8F_0_mem_jit");
codegen::gen_modrm_fn0(ctx.builder, "instr32_8F_0_mem_jit");
}
pub fn instr32_8F_0_reg_jit(ctx: &mut JitContext, r: u32) {
codegen::gen_fn1_const(ctx, "instr32_8F_0_reg", r);
codegen::gen_fn1_const(ctx.builder, "instr32_8F_0_reg", r);
}
define_instruction_read_write_mem16!(
@ -2291,14 +2291,14 @@ macro_rules! define_cmovcc16(
codegen::gen_modrm_resolve(ctx, modrm_byte);
codegen::gen_safe_read16(ctx);
ctx.builder.instruction_body.const_i32(r as i32);
codegen::gen_call_fn3(ctx, "cmovcc16")
codegen::gen_call_fn3(ctx.builder, "cmovcc16")
}
pub fn $name_reg(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_fn0_const_ret(ctx.builder, $cond);
codegen::gen_get_reg16(ctx.builder, r1);
ctx.builder.instruction_body.const_i32(r2 as i32);
codegen::gen_call_fn3(ctx, "cmovcc16")
codegen::gen_call_fn3(ctx.builder, "cmovcc16")
}
);
);
@ -2310,14 +2310,14 @@ macro_rules! define_cmovcc32(
codegen::gen_modrm_resolve(ctx, modrm_byte);
codegen::gen_safe_read32(ctx);
ctx.builder.instruction_body.const_i32(r as i32);
codegen::gen_call_fn3(ctx, "cmovcc32")
codegen::gen_call_fn3(ctx.builder, "cmovcc32")
}
pub fn $name_reg(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_fn0_const_ret(ctx.builder, $cond);
codegen::gen_get_reg32(ctx.builder, r1);
ctx.builder.instruction_body.const_i32(r2 as i32);
codegen::gen_call_fn3(ctx, "cmovcc32")
codegen::gen_call_fn3(ctx.builder, "cmovcc32")
}
);
);