summaryrefslogtreecommitdiff
path: root/src/backend/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/x86.c')
-rw-r--r--src/backend/x86.c75
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
+}