/// This file handles the contextual generation of machine code. /// It abstracts over quirks like the limitations of addressing modes, /// provides higher-level functionality, and can perform peephole optimization. #include "asm.h" #include "format.h" #include "x86encode.h" #include #include void inst_jump(symbol sym) { int32_t disp = symbol_offset(sym, X86_JMP_DISP8_SIZE); if (disp >= INT8_MIN && disp <= INT8_MAX) { x86_inst_jmp_disp8(disp); } else { x86_inst_jmp_disp32_op(); relocate_pc32(sym); } // TODO: support 64-bit jumps? } void inst_jump_if_zero(symbol sym, reg reg) { x86_inst_test_r64_r64(reg, reg); int32_t disp = symbol_offset(sym, X86_JZ_DISP8_SIZE); if (disp >= INT8_MIN && disp <= INT8_MAX) { x86_inst_jz_disp8(disp); } else { x86_inst_jz_disp32_op(); relocate_pc32(sym); } } void inst_jump_if_not_zero(symbol sym, reg reg) { x86_inst_test_r64_r64(reg, reg); int32_t disp = symbol_offset(sym, X86_JNZ_DISP8_SIZE); if (disp >= INT8_MIN && disp <= INT8_MAX) { x86_inst_jnz_disp8(disp); } else { x86_inst_jnz_disp32_op(); relocate_pc32(sym); } }