gen: s/jump/block_boundary/

This commit is contained in:
Amaan Cheval 2018-04-02 13:20:03 +05:30 committed by Fabian
parent 42f7501cba
commit 4d87bebee9
2 changed files with 70 additions and 70 deletions

View file

@ -169,8 +169,8 @@ function gen_instruction_body(encodings, size)
}
console.assert(
!encodings.some(e => e.nonfaulting && e.jump),
"Unsupported: instruction cannot be both a jump and nonfaulting. Opcode: 0x" + hex(encoding.opcode)
!encodings.some(e => e.nonfaulting && e.block_boundary),
"Unsupported: instruction cannot be both a block boundary and nonfaulting. Opcode: 0x" + hex(encoding.opcode)
);
if(has_66 || has_F2 || has_F3)
@ -186,7 +186,7 @@ function gen_instruction_body(encodings, size)
);
}
const instruction_postfix = encoding.jump ? ["instr_flags |= JIT_INSTR_JUMP_FLAG;"] : [];
const instruction_postfix = encoding.block_boundary ? ["instr_flags |= JIT_INSTR_BLOCK_BOUNDARY_FLAG;"] : [];
// May be overridden for custom encodings
const gen_call_fns = {
@ -214,7 +214,7 @@ function gen_instruction_body(encodings, size)
cases: cases.map(case_ => {
const fixed_g = case_.fixed_g;
let instruction_name = make_instruction_name(case_, size, undefined);
const instruction_postfix = case_.jump ? ["instr_flags |= JIT_INSTR_JUMP_FLAG;"] : [];
const instruction_postfix = case_.block_boundary ? ["instr_flags |= JIT_INSTR_BLOCK_BOUNDARY_FLAG;"] : [];
let modrm_resolve_prefix = undefined;

View file

@ -81,10 +81,10 @@ const encodings = [
{ opcode: 0x6A, custom: 1, os: 1, imm8s: 1, },
{ opcode: 0x6B, nonfaulting: 1, os: 1, e: 1, imm8s: 1, mask_flags: af, }, // zf?
{ opcode: 0x6C, jump: 1, is_string: 1, skip: 1, }, // ins
{ opcode: 0x6D, jump: 1, is_string: 1, os: 1, skip: 1, },
{ opcode: 0x6E, jump: 1, is_string: 1, skip: 1, }, // outs
{ opcode: 0x6F, jump: 1, is_string: 1, os: 1, skip: 1, },
{ opcode: 0x6C, block_boundary: 1, is_string: 1, skip: 1, }, // ins
{ opcode: 0x6D, block_boundary: 1, is_string: 1, os: 1, skip: 1, },
{ opcode: 0x6E, block_boundary: 1, is_string: 1, skip: 1, }, // outs
{ opcode: 0x6F, block_boundary: 1, is_string: 1, os: 1, skip: 1, },
{ opcode: 0x84, nonfaulting: 1, e: 1, },
{ opcode: 0x85, nonfaulting: 1, os: 1, e: 1, },
@ -111,11 +111,11 @@ const encodings = [
{ opcode: 0x98, nonfaulting: 1, os: 1, },
{ opcode: 0x99, nonfaulting: 1, os: 1, },
{ opcode: 0x9A, os: 1, imm1632: 1, extra_imm16: 1, skip: 1, jump: 1, }, // callf
{ opcode: 0x9A, os: 1, imm1632: 1, extra_imm16: 1, skip: 1, block_boundary: 1, }, // callf
{ opcode: 0x9B, skip: 1, },
{ opcode: 0x9C, os: 1, },
// popf: not a jump, but can cause an eip change due to updating the interrupt flag
{ opcode: 0x9D, os: 1, jump: 1, skip: 1, },
{ opcode: 0x9D, os: 1, block_boundary: 1, skip: 1, },
{ opcode: 0x9E, },
{ opcode: 0x9F, },
@ -125,23 +125,23 @@ const encodings = [
{ opcode: 0xA3, os: 1, immaddr: 1, },
// string instructions aren't jumps, but they modify eip due to how they're implemented
{ opcode: 0xA4, jump: 1, is_string: 1, },
{ opcode: 0xA5, jump: 1, is_string: 1, os: 1, },
{ opcode: 0xA6, jump: 1, is_string: 1, },
{ opcode: 0xA7, jump: 1, is_string: 1, os: 1, },
{ opcode: 0xA4, block_boundary: 1, is_string: 1, },
{ opcode: 0xA5, block_boundary: 1, is_string: 1, os: 1, },
{ opcode: 0xA6, block_boundary: 1, is_string: 1, },
{ opcode: 0xA7, block_boundary: 1, is_string: 1, os: 1, },
{ opcode: 0xA8, nonfaulting: 1, imm8: 1, },
{ opcode: 0xA9, nonfaulting: 1, os: 1, imm1632: 1, },
{ opcode: 0xAA, jump: 1, is_string: 1, },
{ opcode: 0xAB, jump: 1, is_string: 1, os: 1, },
{ opcode: 0xAC, jump: 1, is_string: 1, },
{ opcode: 0xAD, jump: 1, is_string: 1, os: 1, },
{ opcode: 0xAE, jump: 1, is_string: 1, },
{ opcode: 0xAF, jump: 1, is_string: 1, os: 1, },
{ opcode: 0xAA, block_boundary: 1, is_string: 1, },
{ opcode: 0xAB, block_boundary: 1, is_string: 1, os: 1, },
{ opcode: 0xAC, block_boundary: 1, is_string: 1, },
{ opcode: 0xAD, block_boundary: 1, is_string: 1, os: 1, },
{ opcode: 0xAE, block_boundary: 1, is_string: 1, },
{ opcode: 0xAF, block_boundary: 1, is_string: 1, os: 1, },
{ opcode: 0xC2, jump: 1, os: 1, imm16: 1, skip: 1, }, // ret
{ opcode: 0xC3, jump: 1, os: 1, skip: 1, },
{ opcode: 0xC2, block_boundary: 1, os: 1, imm16: 1, skip: 1, }, // ret
{ opcode: 0xC3, block_boundary: 1, os: 1, skip: 1, },
{ opcode: 0xC4, os: 1, e: 1, skip: 1, },
{ opcode: 0xC5, os: 1, e: 1, skip: 1, },
@ -151,44 +151,44 @@ const encodings = [
{ opcode: 0xC8, os: 1, imm16: 1, extra_imm8: 1, }, // enter
{ opcode: 0xC9, os: 1, skip: 1, }, // leave: requires valid ebp
{ opcode: 0xCA, jump: 1, os: 1, imm16: 1, skip: 1, }, // retf
{ opcode: 0xCB, jump: 1, os: 1, skip: 1, },
{ opcode: 0xCC, jump: 1, skip: 1, },
{ opcode: 0xCD, jump: 1, skip: 1, imm8: 1, },
{ opcode: 0xCE, jump: 1, skip: 1, },
{ opcode: 0xCF, jump: 1, os: 1, skip: 1, },
{ opcode: 0xCA, block_boundary: 1, os: 1, imm16: 1, skip: 1, }, // retf
{ opcode: 0xCB, block_boundary: 1, os: 1, skip: 1, },
{ opcode: 0xCC, block_boundary: 1, skip: 1, },
{ opcode: 0xCD, block_boundary: 1, skip: 1, imm8: 1, },
{ opcode: 0xCE, block_boundary: 1, skip: 1, },
{ opcode: 0xCF, block_boundary: 1, os: 1, skip: 1, },
{ opcode: 0xD4, imm8: 1, }, // aam, may trigger #de
{ opcode: 0xD5, nonfaulting: 1, imm8: 1, mask_flags: of | cf | af, },
{ opcode: 0xD6, nonfaulting: 1, },
{ opcode: 0xD7, skip: 1, },
{ opcode: 0xE0, imm8s: 1, skip: 1, jump: 1, },
{ opcode: 0xE1, imm8s: 1, skip: 1, jump: 1, },
{ opcode: 0xE2, imm8s: 1, skip: 1, jump: 1, },
{ opcode: 0xE3, imm8s: 1, skip: 1, jump: 1, },
{ opcode: 0xE0, imm8s: 1, skip: 1, block_boundary: 1, },
{ opcode: 0xE1, imm8s: 1, skip: 1, block_boundary: 1, },
{ opcode: 0xE2, imm8s: 1, skip: 1, block_boundary: 1, },
{ opcode: 0xE3, imm8s: 1, skip: 1, block_boundary: 1, },
// port functions aren't jumps, but they may modify eip due to how they are implemented
{ opcode: 0xE4, jump: 1, imm8: 1, skip: 1, }, // in
{ opcode: 0xE5, jump: 1, os: 1, imm8: 1, skip: 1, },
{ opcode: 0xE6, jump: 1, imm8: 1, skip: 1, }, // out
{ opcode: 0xE7, jump: 1, os: 1, imm8: 1, skip: 1, },
{ opcode: 0xE4, block_boundary: 1, imm8: 1, skip: 1, }, // in
{ opcode: 0xE5, block_boundary: 1, os: 1, imm8: 1, skip: 1, },
{ opcode: 0xE6, block_boundary: 1, imm8: 1, skip: 1, }, // out
{ opcode: 0xE7, block_boundary: 1, os: 1, imm8: 1, skip: 1, },
{ opcode: 0xE8, jump: 1, os: 1, imm1632: 1, custom: 1, skip: 1, },
{ opcode: 0xE9, jump: 1, os: 1, imm1632: 1, custom: 1, skip: 1, },
{ opcode: 0xEA, jump: 1, os: 1, imm1632: 1, extra_imm16: 1, skip: 1, }, // jmpf
{ opcode: 0xEB, jump: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0xE8, block_boundary: 1, os: 1, imm1632: 1, custom: 1, skip: 1, },
{ opcode: 0xE9, block_boundary: 1, os: 1, imm1632: 1, custom: 1, skip: 1, },
{ opcode: 0xEA, block_boundary: 1, os: 1, imm1632: 1, extra_imm16: 1, skip: 1, }, // jmpf
{ opcode: 0xEB, block_boundary: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0xEC, jump: 1, skip: 1, },
{ opcode: 0xED, jump: 1, os: 1, skip: 1, },
{ opcode: 0xEE, jump: 1, skip: 1, },
{ opcode: 0xEF, jump: 1, os: 1, skip: 1, },
{ opcode: 0xEC, block_boundary: 1, skip: 1, },
{ opcode: 0xED, block_boundary: 1, os: 1, skip: 1, },
{ opcode: 0xEE, block_boundary: 1, skip: 1, },
{ opcode: 0xEF, block_boundary: 1, os: 1, skip: 1, },
{ opcode: 0xF0, prefix: 1, },
{ opcode: 0xF1, skip: 1, },
{ opcode: 0xF2, prefix: 1, },
{ opcode: 0xF3, prefix: 1, },
{ opcode: 0xF4, jump: 1, skip: 1, },
{ opcode: 0xF4, block_boundary: 1, skip: 1, },
{ opcode: 0xF5, nonfaulting: 1, },
{ opcode: 0xF6, fixed_g: 0, nonfaulting: 1, imm8: 1, },
@ -213,7 +213,7 @@ const encodings = [
{ opcode: 0xF9, nonfaulting: 1, },
{ opcode: 0xFA, skip: 1, },
// sti: not a jump, but can cause a change in eip
{ opcode: 0xFB, jump: 1, skip: 1, },
{ opcode: 0xFB, block_boundary: 1, skip: 1, },
{ opcode: 0xFC, nonfaulting: 1, },
{ opcode: 0xFD, nonfaulting: 1, },
@ -221,10 +221,10 @@ const encodings = [
{ opcode: 0xFE, e: 1, fixed_g: 1, nonfaulting: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 0, nonfaulting: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 1, nonfaulting: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 2, jump: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 3, jump: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 4, jump: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 5, jump: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 2, block_boundary: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 3, block_boundary: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 4, block_boundary: 1, skip: 1, },
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 5, block_boundary: 1, skip: 1, },
{ opcode: 0xFF, custom: 1, os: 1, e: 1, fixed_g: 6, },
{ opcode: 0x0F00, fixed_g: 0, e: 1, skip: 1 },
@ -270,8 +270,8 @@ const encodings = [
{ opcode: 0x0F31, skip: 1 },
{ opcode: 0x0F32, skip: 1 },
{ opcode: 0x0F33, skip: 1 },
{ opcode: 0x0F34, skip: 1, jump: 1, }, // sysenter
{ opcode: 0x0F35, skip: 1, jump: 1, }, // sysexit
{ opcode: 0x0F34, skip: 1, block_boundary: 1, }, // sysenter
{ opcode: 0x0F35, skip: 1, block_boundary: 1, }, // sysexit
{ opcode: 0x0F40, nonfaulting: 1, e: 1, os: 1, },
{ opcode: 0x0F41, nonfaulting: 1, e: 1, os: 1, },
@ -290,22 +290,22 @@ const encodings = [
{ opcode: 0x0F4E, nonfaulting: 1, e: 1, os: 1, },
{ opcode: 0x0F4F, nonfaulting: 1, e: 1, os: 1, },
{ opcode: 0x0F80, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F81, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F82, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F83, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F84, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F85, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F86, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F87, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F88, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F89, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8A, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8B, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8C, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8D, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8E, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8F, jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F80, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F81, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F82, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F83, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F84, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F85, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F86, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F87, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F88, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F89, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8A, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8B, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8C, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8D, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8E, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F8F, block_boundary: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
{ opcode: 0x0F90, nonfaulting: 1, e: 1, },
{ opcode: 0x0F91, nonfaulting: 1, e: 1, },
@ -636,8 +636,8 @@ for(let i = 0; i < 8; i++)
{ opcode: 0x04 | i << 3, nonfaulting: 1, eax: 1, imm8: 1, },
{ opcode: 0x05 | i << 3, nonfaulting: 1, os: 1, eax: 1, imm1632: 1, },
{ opcode: 0x70 | i, jump: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0x78 | i, jump: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0x70 | i, block_boundary: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0x78 | i, block_boundary: 1, imm8s: 1, custom: 1, skip: 1, },
{ opcode: 0x80, nonfaulting: 1, e: 1, fixed_g: i, imm8: 1, },
{ opcode: 0x81, nonfaulting: 1, os: 1, e: 1, fixed_g: i, imm1632: 1, },