This commit is contained in:
Fabian 2020-12-31 19:14:30 -06:00
parent fdaf79eaa9
commit 27a1f00657
2 changed files with 58 additions and 80 deletions

View file

@ -1,6 +1,7 @@
use cpu::BitSize;
use cpu2::cpu::{
FLAG_CARRY, FLAG_ZERO, TLB_GLOBAL, TLB_HAS_CODE, TLB_NO_USER, TLB_READONLY, TLB_VALID, FLAG_SIGN, FLAG_OVERFLOW
FLAG_CARRY, FLAG_OVERFLOW, FLAG_SIGN, FLAG_ZERO, TLB_GLOBAL, TLB_HAS_CODE, TLB_NO_USER,
TLB_READONLY, TLB_VALID,
};
use cpu2::imports::mem8;
use global_pointers;
@ -11,11 +12,6 @@ use profiler;
use regs;
use wasmgen::wasm_builder::{FunctionType, WasmBuilder, WasmLocal, WasmLocalI64};
const CONDITION_FUNCTIONS: [&str; 16] = [
"test_o", "test_no", "test_b", "test_nb", "test_z", "test_nz", "test_be", "test_nbe", "test_s",
"test_ns", "test_p", "test_np", "test_l", "test_nl", "test_le", "test_nle",
];
pub fn gen_add_cs_offset(ctx: &mut JitContext) {
ctx.builder
.load_aligned_i32(global_pointers::get_seg_offset(regs::CS));
@ -1467,7 +1463,6 @@ pub fn gen_getof(builder: &mut WasmBuilder) {
builder.shr_u_i32();
builder.const_i32(1);
builder.and_i32();
}
builder.else_();
{
@ -1581,61 +1576,61 @@ pub fn gen_trigger_gp(ctx: &mut JitContext, error_code: u32) {
ctx.builder.return_();
}
pub fn gen_condition_fn(ctx: &mut JitContext, mut condition: u8) {
pub fn gen_condition_fn(ctx: &mut JitContext, condition: u8) {
if condition & 0xF0 == 0x00 || condition & 0xF0 == 0x70 || condition & 0xF0 == 0x80 {
condition &= 0xF;
if condition == 0 {
gen_getof(ctx.builder);
}
else if condition == 1 {
gen_getof(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 2 {
gen_getcf(ctx.builder);
}
else if condition == 3 {
gen_getcf(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 4 {
gen_getzf(ctx.builder);
}
else if condition == 5 {
gen_getzf(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 6 {
gen_test_be(ctx.builder);
}
else if condition == 7 {
gen_test_be(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 8 {
gen_getsf(ctx.builder);
}
else if condition == 9 {
gen_getsf(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 0xC {
gen_test_l(ctx.builder);
}
else if condition == 0xD {
gen_test_l(ctx.builder);
ctx.builder.eqz_i32();
}
else if condition == 0xE {
gen_test_le(ctx.builder);
}
else if condition == 0xF {
gen_test_le(ctx.builder);
ctx.builder.eqz_i32();
}
else {
let condition_name = CONDITION_FUNCTIONS[condition as usize];
gen_fn0_const_ret(ctx.builder, condition_name);
match condition & 0xF {
0x0 => {
gen_getof(ctx.builder);
},
0x1 => {
gen_getof(ctx.builder);
ctx.builder.eqz_i32();
},
0x2 => {
gen_getcf(ctx.builder);
},
0x3 => {
gen_getcf(ctx.builder);
ctx.builder.eqz_i32();
},
0x4 => {
gen_getzf(ctx.builder);
},
0x5 => {
gen_getzf(ctx.builder);
ctx.builder.eqz_i32();
},
0x6 => {
gen_test_be(ctx.builder);
},
0x7 => {
gen_test_be(ctx.builder);
ctx.builder.eqz_i32();
},
0x8 => {
gen_getsf(ctx.builder);
},
0x9 => {
gen_getsf(ctx.builder);
ctx.builder.eqz_i32();
},
0xA => gen_fn0_const_ret(ctx.builder, "test_p"),
0xB => gen_fn0_const_ret(ctx.builder, "test_np"),
0xC => {
gen_test_l(ctx.builder);
},
0xD => {
gen_test_l(ctx.builder);
ctx.builder.eqz_i32();
},
0xE => {
gen_test_le(ctx.builder);
},
0xF => {
gen_test_le(ctx.builder);
ctx.builder.eqz_i32();
},
_ => dbg_assert!(false),
}
}
else {

View file

@ -3,7 +3,6 @@ use cpu2::fpu::{fpu_load_m80, fpu_load_status_word, fpu_set_status_word, fpu_sto
use cpu2::global_pointers::*;
use paging::OrPageFault;
#[no_mangle]
pub unsafe fn getcf() -> bool {
if 0 != *flags_changed & 1 {
return 0
@ -25,7 +24,6 @@ pub unsafe fn getpf() -> bool {
return 0 != *flags & FLAG_PARITY;
};
}
#[no_mangle]
pub unsafe fn getaf() -> bool {
if 0 != *flags_changed & FLAG_ADJUST {
return 0 != (*last_op1 ^ *last_op2 ^ *last_add_result) & FLAG_ADJUST;
@ -34,7 +32,6 @@ pub unsafe fn getaf() -> bool {
return 0 != *flags & FLAG_ADJUST;
};
}
#[no_mangle]
pub unsafe fn getzf() -> bool {
if 0 != *flags_changed & FLAG_ZERO {
return 0 != (!*last_result & *last_result - 1) >> *last_op_size & 1;
@ -43,7 +40,6 @@ pub unsafe fn getzf() -> bool {
return 0 != *flags & FLAG_ZERO;
};
}
#[no_mangle]
pub unsafe fn getsf() -> bool {
if 0 != *flags_changed & FLAG_SIGN {
return 0 != *last_result >> *last_op_size & 1;
@ -52,7 +48,6 @@ pub unsafe fn getsf() -> bool {
return 0 != *flags & FLAG_SIGN;
};
}
#[no_mangle]
pub unsafe fn getof() -> bool {
if 0 != *flags_changed & FLAG_OVERFLOW {
return 0
@ -63,38 +58,26 @@ pub unsafe fn getof() -> bool {
return 0 != *flags & FLAG_OVERFLOW;
};
}
#[no_mangle]
pub unsafe fn test_o() -> bool { return getof(); }
#[no_mangle]
pub unsafe fn test_b() -> bool { return getcf(); }
#[no_mangle]
pub unsafe fn test_z() -> bool { return getzf(); }
#[no_mangle]
pub unsafe fn test_s() -> bool { return getsf(); }
#[no_mangle]
pub unsafe fn test_p() -> bool { return getpf(); }
#[no_mangle]
pub unsafe fn test_be() -> bool { return getcf() || getzf(); }
#[no_mangle]
pub unsafe fn test_l() -> bool { return getsf() != getof(); }
#[no_mangle]
pub unsafe fn test_le() -> bool { return getzf() || getsf() != getof(); }
#[no_mangle]
pub unsafe fn test_no() -> bool { return !test_o(); }
#[no_mangle]
pub unsafe fn test_nb() -> bool { return !test_b(); }
#[no_mangle]
pub unsafe fn test_nz() -> bool { return !test_z(); }
#[no_mangle]
pub unsafe fn test_ns() -> bool { return !test_s(); }
#[no_mangle]
pub unsafe fn test_np() -> bool { return !test_p(); }
#[no_mangle]
pub unsafe fn test_nbe() -> bool { return !test_be(); }
#[no_mangle]
pub unsafe fn test_nl() -> bool { return !test_l(); }
#[no_mangle]
pub unsafe fn test_nle() -> bool { return !test_le(); }
#[no_mangle]
pub unsafe fn jmp_rel16(rel16: i32) {
let cs_offset = get_seg_cs();