summaryrefslogtreecommitdiff
path: root/register.c
diff options
context:
space:
mode:
authorCarson Fleming <cflems@cflems.net>2026-07-31 23:52:09 -0400
committerCarson Fleming <cflems@cflems.net>2026-07-31 23:52:09 -0400
commitb1ff7e8bf24b40cf64127a6194d45661db3a4baf (patch)
tree98aa2c040222c5ca092d6573cb24257ac12b0a2c /register.c
parent5adb568da4dfda6d5d9699ee4b92fe44b43fc4cf (diff)
downloadccc-b1ff7e8bf24b40cf64127a6194d45661db3a4baf.tar.gz
code gen can use registers besides RAX now
Diffstat (limited to 'register.c')
-rw-r--r--register.c119
1 files changed, 97 insertions, 22 deletions
diff --git a/register.c b/register.c
index fe1a718..f197513 100644
--- a/register.c
+++ b/register.c
@@ -1,48 +1,123 @@
#include "register.h"
+#include <stddef.h>
-const struct reg RAX = {
+struct reg RAX = {
.qword = "rax",
.dword = "eax",
.word = "ax",
.byte = "al",
+ .is_occupied = false,
};
-const struct reg RDI = {
+struct reg RBX = {
+ .qword = "rbx",
+ .dword = "ebx",
+ .word = "bx",
+ .byte = "bl",
+ .is_occupied = false,
+};
+struct reg RCX = {
+ .qword = "rcx",
+ .dword = "ecx",
+ .word = "cx",
+ .byte = "cl",
+ .is_occupied = false,
+};
+struct reg RDX = {
+ .qword = "rdx",
+ .dword = "edx",
+ .word = "dx",
+ .byte = "dl",
+ .is_occupied = false,
+};
+
+struct reg RDI = {
.qword = "rdi",
.dword = "edi",
.word = "di",
.byte = "dil",
+ .is_occupied = false,
};
-const struct reg RSI = {
+struct reg RSI = {
.qword = "rsi",
.dword = "esi",
.word = "si",
.byte = "sil",
+ .is_occupied = false,
};
-const struct reg RDX = {
- .qword = "rdx",
- .dword = "edx",
- .word = "dx",
- .byte = "dl",
+struct reg RSP = {
+ .qword = "rsp",
+ .dword = "esp",
+ .word = "sp",
+ .byte = "spl",
+ .is_occupied = true,
};
-const struct reg R10 = {
- .qword = "r10",
- .dword = "r10d",
- .word = "r10w",
- .byte = "r10b",
+struct reg RBP = {
+ .qword = "rbp",
+ .dword = "ebp",
+ .word = "bp",
+ .byte = "bpl",
+ .is_occupied = true,
+};
+
+struct reg R8 = {
+ .qword = "r8",
+ .dword = "r8d",
+ .word = "r8w",
+ .byte = "r8b",
+ .is_occupied = false,
};
-const struct reg R9 = {
+struct reg R9 = {
.qword = "r9",
.dword = "r9d",
.word = "r9w",
.byte = "r9b",
+ .is_occupied = false,
};
-const struct reg R8 = {
- .qword = "r8",
- .dword = "r8d",
- .word = "r8w",
- .byte = "r8b",
+struct reg R10 = {
+ .qword = "r10",
+ .dword = "r10d",
+ .word = "r10w",
+ .byte = "r10b",
+ .is_occupied = false,
+};
+struct reg R11 = {
+ .qword = "r11",
+ .dword = "r11d",
+ .word = "r11w",
+ .byte = "r11b",
+ .is_occupied = false,
+};
+struct reg R12 = {
+ .qword = "r12",
+ .dword = "r12d",
+ .word = "r12w",
+ .byte = "r12b",
+ .is_occupied = false,
+};
+struct reg R13 = {
+ .qword = "r13",
+ .dword = "r13d",
+ .word = "r13w",
+ .byte = "r13b",
+ .is_occupied = false,
+};
+struct reg R14 = {
+ .qword = "r14",
+ .dword = "r14d",
+ .word = "r14w",
+ .byte = "r14b",
+ .is_occupied = false,
+};
+struct reg R15 = {
+ .qword = "r15",
+ .dword = "r15d",
+ .word = "r15w",
+ .byte = "r15b",
+ .is_occupied = false,
};
-const struct reg* const CALLING_CONV[] = {&RDI, &RSI, &RDX, &R10, &R9, &R8};
-const unsigned char CC_N_REGS =
- sizeof(CALLING_CONV) / sizeof(const struct reg* const);
+struct reg* const CALLING_CONV[] = {&RDI, &RSI, &RDX, &R10, &R9, &R8, NULL};
+struct reg* const DATA_REGS[] = {
+ &RDI, &RSI, &RAX, &RBX, &RCX, &RDX,
+ &R8, &R9, &R10, &R11, &R12, &R13, &R14, &R15, NULL
+};