gen_fn: Accept wasm builder, not jit context
This commit is contained in:
parent
20d22a0bc0
commit
7e3f1ad401
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
);
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue