#include #include #define REG_SAFETY(reg) \ do { \ if(reg > 15) DIE("Compiler error! Register %d is invalid!" \ , reg); \ } while(0) // TODO: Consider implementing a modrm backend that is rex-aware. //void x86_calc_modrm(uint16_t reg, uint16_t mod) void x86_mov_r_i64(uint8_t reg, uint64_t value) { REG_SAFETY(reg); emit8(REXW); emit8(0xB8 + reg); emit64(value); } void x86_mov_rm_i64(uint8_t mode, uint16_t reg) { DIE("TODO"); } void x86_push_i32(uint32_t value) { emit8(0x68); emit32(value); } /* * @todo */ void x86_push_i16(uint16_t value) { DIE("NOT IMPLEMENTED"); // 66h // PUSH 68 // IMM value } void x86_push_i8(uint8_t value) { emit8(0x6A); emit8(value); } void x86_push_r64(uint8_t reg) { REG_SAFETY(reg); emit8(0x50 + reg); } void x86_push_rm64(uint8_t mode, uint8_t r, uint64_t m) { REG_SAFETY(r); if(r > 7) { emit8(REXWR); } else if (r < 7) { emit8(REXW); } emit8(0xFF); // Calculate MODRM // emit MODRM byte // if mode = 1: // disp // done }