diff options
Diffstat (limited to 'src/backend/x86.c')
| -rw-r--r-- | src/backend/x86.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/backend/x86.c b/src/backend/x86.c new file mode 100644 index 0000000..05aafc1 --- /dev/null +++ b/src/backend/x86.c @@ -0,0 +1,75 @@ +#include <x86.h> + +#include <backend.h> + +#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 +} |
