|
@@ -140,8 +140,8 @@ const encodings = [
|
|
|
{ opcode: 0xAE, block_boundary: 1, is_string: 1, },
|
|
|
{ opcode: 0xAF, block_boundary: 1, is_string: 1, os: 1, },
|
|
|
|
|
|
- { opcode: 0xC2, block_boundary: 1, os: 1, imm16: 1, skip: 1, }, // ret
|
|
|
- { opcode: 0xC3, block_boundary: 1, os: 1, skip: 1, },
|
|
|
+ { opcode: 0xC2, block_boundary: 1, no_next_instruction: 1, os: 1, imm16: 1, skip: 1, }, // ret
|
|
|
+ { opcode: 0xC3, block_boundary: 1, no_next_instruction: 1, os: 1, skip: 1, },
|
|
|
|
|
|
{ opcode: 0xC4, os: 1, e: 1, skip: 1, },
|
|
|
{ opcode: 0xC5, block_boundary: 1, os: 1, e: 1, skip: 1, },
|
|
@@ -151,22 +151,25 @@ const encodings = [
|
|
|
|
|
|
{ opcode: 0xC8, os: 1, imm16: 1, extra_imm8: 1, }, // enter
|
|
|
{ opcode: 0xC9, os: 1, skip: 1, }, // leave: requires valid ebp
|
|
|
- { 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: 0xCA, block_boundary: 1, no_next_instruction: 1, os: 1, imm16: 1, skip: 1, }, // retf
|
|
|
+ { opcode: 0xCB, block_boundary: 1, no_next_instruction: 1, os: 1, skip: 1, },
|
|
|
+ { opcode: 0xCC, block_boundary: 1, skip: 1, }, // int
|
|
|
{ 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: 0xCF, block_boundary: 1, no_next_instruction: 1, os: 1, skip: 1, }, // iret
|
|
|
|
|
|
{ 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, 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, },
|
|
|
+ // loop, jcxz, etc.
|
|
|
+ // Conditional jumps, but condition code not supported by code generator
|
|
|
+ // (these are never generated by modern compilers)
|
|
|
+ { opcode: 0xE0, imm8s: 1, skip: 1, block_boundary: 1, /* jump_offset_imm: 1, conditional_jump: 1, */ },
|
|
|
+ { opcode: 0xE1, imm8s: 1, skip: 1, block_boundary: 1, /* jump_offset_imm: 1, conditional_jump: 1, */ },
|
|
|
+ { opcode: 0xE2, imm8s: 1, skip: 1, block_boundary: 1, /* jump_offset_imm: 1, conditional_jump: 1, */ },
|
|
|
+ { opcode: 0xE3, imm8s: 1, skip: 1, block_boundary: 1, /* jump_offset_imm: 1, conditional_jump: 1, */ },
|
|
|
|
|
|
// port functions aren't jumps, but they may modify eip due to how they are implemented
|
|
|
{ opcode: 0xE4, block_boundary: 1, imm8: 1, skip: 1, }, // in
|
|
@@ -174,10 +177,12 @@ const encodings = [
|
|
|
{ opcode: 0xE6, block_boundary: 1, imm8: 1, skip: 1, }, // out
|
|
|
{ opcode: 0xE7, block_boundary: 1, os: 1, imm8: 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, },
|
|
|
+ // E8 call: Has immediate jump offset, but we don't really want to follow
|
|
|
+ // into other functions while generating code
|
|
|
+ { opcode: 0xE8, block_boundary: 1, /* jump_offset_imm: 1, */ os: 1, imm1632: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0xE9, block_boundary: 1, jump_offset_imm: 1, no_next_instruction: 1, os: 1, imm1632: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0xEA, block_boundary: 1, no_next_instruction: 1, os: 1, imm1632: 1, extra_imm16: 1, skip: 1, }, // jmpf
|
|
|
+ { opcode: 0xEB, block_boundary: 1, jump_offset_imm: 1, no_next_instruction: 1, imm8s: 1, custom: 1, skip: 1, },
|
|
|
|
|
|
{ opcode: 0xEC, block_boundary: 1, skip: 1, },
|
|
|
{ opcode: 0xED, block_boundary: 1, os: 1, skip: 1, },
|
|
@@ -223,8 +228,8 @@ const encodings = [
|
|
|
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 1, nonfaulting: 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, os: 1, e: 1, fixed_g: 4, block_boundary: 1, no_next_instruction: 1, skip: 1, },
|
|
|
+ { opcode: 0xFF, os: 1, e: 1, fixed_g: 5, block_boundary: 1, no_next_instruction: 1, skip: 1, },
|
|
|
{ opcode: 0xFF, custom: 1, os: 1, e: 1, fixed_g: 6, },
|
|
|
|
|
|
{ opcode: 0x0F00, fixed_g: 0, e: 1, skip: 1 },
|
|
@@ -271,7 +276,7 @@ const encodings = [
|
|
|
{ opcode: 0x0F32, skip: 1 },
|
|
|
{ opcode: 0x0F33, skip: 1 },
|
|
|
{ opcode: 0x0F34, skip: 1, block_boundary: 1, }, // sysenter
|
|
|
- { opcode: 0x0F35, skip: 1, block_boundary: 1, }, // sysexit
|
|
|
+ { opcode: 0x0F35, skip: 1, block_boundary: 1, no_next_instruction: 1, }, // sysexit
|
|
|
|
|
|
{ opcode: 0x0F40, nonfaulting: 1, e: 1, os: 1, },
|
|
|
{ opcode: 0x0F41, nonfaulting: 1, e: 1, os: 1, },
|
|
@@ -290,22 +295,22 @@ const encodings = [
|
|
|
{ opcode: 0x0F4E, nonfaulting: 1, e: 1, os: 1, },
|
|
|
{ opcode: 0x0F4F, nonfaulting: 1, e: 1, os: 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: 0x0F80, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F81, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F82, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F83, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F84, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F85, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F86, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F87, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F88, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F89, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8A, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8B, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8C, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8D, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8E, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x0F8F, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm1632: 1, os: 1, custom: 1, skip: 1, },
|
|
|
|
|
|
{ opcode: 0x0F90, nonfaulting: 1, e: 1, },
|
|
|
{ opcode: 0x0F91, nonfaulting: 1, e: 1, },
|
|
@@ -636,8 +641,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, block_boundary: 1, imm8s: 1, custom: 1, skip: 1, },
|
|
|
- { opcode: 0x78 | i, block_boundary: 1, imm8s: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x70 | i, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 1, imm8s: 1, custom: 1, skip: 1, },
|
|
|
+ { opcode: 0x78 | i, block_boundary: 1, jump_offset_imm: 1, conditional_jump: 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, },
|