From 4946ca67cf04845737f0f7f70b5ed27bcfe9a18b Mon Sep 17 00:00:00 2001 From: 0x221E <0x221E@0xinfinity.dev> Date: Sun, 12 Apr 2026 16:24:06 +0200 Subject: Initial commit --- src/backend/x86.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/backend/x86.c (limited to 'src/backend/x86.c') 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 + +#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 +} -- cgit v1.2.3