From b1ff7e8bf24b40cf64127a6194d45661db3a4baf Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Fri, 31 Jul 2026 23:52:09 -0400 Subject: code gen can use registers besides RAX now --- register.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 22 deletions(-) (limited to 'register.c') 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 -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 +}; -- cgit v1.2.3