add gen_push32_ss{16,32}

This commit is contained in:
Awal Garg 2018-08-17 21:23:02 +05:30 committed by Fabian
parent 5c2ab56b3b
commit be7d21e79f
2 changed files with 102 additions and 15 deletions

View file

@ -696,3 +696,93 @@ pub fn gen_push16_ss32(ctx: &mut JitContext, imm: ImmVal) {
ctx.builder.instruction_body.store_aligned_i32();
ctx.builder.free_local(reg32_updated_local);
}
pub fn gen_push32_ss16(ctx: &mut JitContext, imm: ImmVal) {
match imm {
ImmVal::REG(r) => {
ctx.builder
.instruction_body
.load_aligned_i32(global_pointers::get_reg32_offset(r));
},
ImmVal::CONST(imm) => {
ctx.builder.instruction_body.push_i32(imm as i32);
},
ImmVal::MEM => {
gen_safe_read32(ctx);
},
};
let value_local = ctx.builder.set_new_local();
ctx.builder
.instruction_body
.load_aligned_u16(global_pointers::get_reg16_offset(regs::SP));
ctx.builder.instruction_body.push_i32(4);
ctx.builder.instruction_body.sub_i32();
ctx.builder.instruction_body.push_i32(0xFFFF);
ctx.builder.instruction_body.and_i32();
let new_sp_local = ctx.builder.tee_new_local();
if !ctx.cpu.has_flat_segmentation() {
ctx.builder
.instruction_body
.load_aligned_i32(global_pointers::get_seg_offset(regs::SS));
ctx.builder.instruction_body.add_i32();
}
let sp_local = ctx.builder.set_new_local();
gen_safe_write32(ctx, &sp_local, &value_local);
ctx.builder.free_local(value_local);
ctx.builder.free_local(sp_local);
ctx.builder
.instruction_body
.push_i32(global_pointers::get_reg16_offset(regs::SP) as i32);
ctx.builder.instruction_body.get_local(&new_sp_local);
ctx.builder.instruction_body.store_aligned_u16();
ctx.builder.free_local(new_sp_local);
}
pub fn gen_push32_ss32(ctx: &mut JitContext, imm: ImmVal) {
match imm {
ImmVal::REG(r) => {
ctx.builder
.instruction_body
.load_aligned_i32(global_pointers::get_reg32_offset(r));
},
ImmVal::CONST(imm) => {
ctx.builder.instruction_body.push_i32(imm as i32);
},
ImmVal::MEM => {
gen_safe_read32(ctx);
},
};
let value_local = ctx.builder.set_new_local();
ctx.builder
.instruction_body
.load_aligned_i32(global_pointers::get_reg32_offset(regs::ESP));
ctx.builder.instruction_body.push_i32(4);
ctx.builder.instruction_body.sub_i32();
let new_esp_local = ctx.builder.tee_new_local();
if !ctx.cpu.has_flat_segmentation() {
ctx.builder
.instruction_body
.load_aligned_i32(global_pointers::get_seg_offset(regs::SS));
ctx.builder.instruction_body.add_i32();
}
let sp_local = ctx.builder.set_new_local();
gen_safe_write32(ctx, &sp_local, &value_local);
ctx.builder.free_local(value_local);
ctx.builder.free_local(sp_local);
ctx.builder
.instruction_body
.push_i32(global_pointers::get_reg32_offset(regs::ESP) as i32);
ctx.builder.instruction_body.get_local(&new_esp_local);
ctx.builder.instruction_body.store_aligned_i32();
ctx.builder.free_local(new_esp_local);
}

View file

@ -106,13 +106,12 @@ fn push16_reg_jit(ctx: &mut JitContext, r: u32) {
}
fn push32_reg_jit(ctx: &mut JitContext, r: u32) {
let name = if ctx.cpu.ssize_32() {
"push32_ss32"
if ctx.cpu.ssize_32() {
codegen::gen_push32_ss32(ctx, ImmVal::REG(r));
}
else {
"push32_ss16"
};
codegen::gen_fn1_reg32(ctx, name, r);
codegen::gen_push32_ss16(ctx, ImmVal::REG(r));
}
}
fn push16_imm_jit(ctx: &mut JitContext, imm: u32) {
@ -125,13 +124,12 @@ fn push16_imm_jit(ctx: &mut JitContext, imm: u32) {
}
fn push32_imm_jit(ctx: &mut JitContext, imm: u32) {
let name = if ctx.cpu.ssize_32() {
"push32_ss32"
if ctx.cpu.ssize_32() {
codegen::gen_push32_ss32(ctx, ImmVal::CONST(imm));
}
else {
"push32_ss16"
};
codegen::gen_fn1_const(ctx, name, imm)
codegen::gen_push32_ss16(ctx, ImmVal::CONST(imm));
}
}
fn push16_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
@ -146,13 +144,12 @@ fn push16_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
fn push32_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
codegen::gen_modrm_resolve(ctx, modrm_byte);
let name = if ctx.cpu.ssize_32() {
"push32_ss32_mem"
if ctx.cpu.ssize_32() {
codegen::gen_push32_ss32(ctx, ImmVal::MEM);
}
else {
"push32_ss16_mem"
};
codegen::gen_modrm_fn0(ctx, name)
codegen::gen_push32_ss16(ctx, ImmVal::MEM);
}
}
fn pop16_reg_jit(ctx: &mut JitContext, reg: u32) {