better register logic

This commit is contained in:
anon
2024-07-08 18:06:14 +02:00
parent 19ccf53e91
commit bdad66ebbb
5 changed files with 79 additions and 46 deletions

View File

@ -5,7 +5,10 @@ typedef unsigned int next;
typedef unsigned char byte;
typedef enum {
D8, D16, D32, D64,
D8 = 0x00,
D16 = 0x01,
D32 = 0x10,
D64 = 0x11,
} size_index;
typedef enum {

View File

@ -16,7 +16,6 @@ tommy_hashtable variable_table;
char * scope = NULL;
int is_program_found = 0;
#if DEBUG == 1
static
void dump_variable(void * data) {

View File

@ -12,6 +12,14 @@ typedef struct {
tommy_node _node;
} variable_t;
#define REGISTER64_MASK 0x00;
#define REGISTER32_MASK 0x01;
typedef struct {
int number : 6;
int size : 2;
} cpuregister_t;
extern int system_type;
extern char * scope;

View File

@ -62,6 +62,7 @@ r11 { return RG11; }
r12 { return RG12; }
r13 { return RG13; }
r14 { return RG14; }
xmm0 { return RGXMM0; }
xmm1 { return RGXMM1; }
xmm2 { return RGXMM2; }
@ -71,15 +72,22 @@ xmm5 { return RGXMM5; }
xmm6 { return RGXMM6; }
xmm7 { return RGXMM7; }
eax { return EAX; }
ebx { return EBX; }
ecx { return ECX; }
edx { return EDX; }
ebp { return EBP; }
esp { return ESP; }
eip { return EIP; }
esi { return ESI; }
edi { return EDI; }
eax { return EAX; }
ebx { return EBX; }
ecx { return ECX; }
edx { return EDX; }
ebp { return EBP; }
esp { return ESP; }
eip { return EIP; }
esi { return ESI; }
edi { return EDI; }
r8d { return RG8D; }
r9d { return RG9D; }
r10d { return RG10D; }
r11d { return RG11D; }
r12d { return RG12D; }
r13d { return RG13D; }
r14d { return RG14D; }
in { return TIN; }
\= { return '='; }

View File

@ -26,6 +26,7 @@
long intval;
char * strval;
variable_t varval;
cpuregister_t regval;
}
/* XXX NOTE: while naming, if my name collided with something in assembler.h i just
@ -68,7 +69,7 @@
%type<varval> declaration
// Registers
%type<intval> register
%type<regval> register register64 register32
%token RBP RSP RIP
%token RAX RBX RCX RDX
@ -79,6 +80,7 @@
%token EBP ESP EIP
%token EAX EBX ECX EDX
%token ESI EDI
%token RG8D RG9D RG10D RG11D RG12D RG13D RG14D RG15D
// Instructions
%token TADD TOR TADC TBB TXOR TAND TSUB TCMP TSYSCALL TINC
@ -206,7 +208,7 @@ instruction: INOP { ; }
| IMOV register register
| IMOV memory register
| IMOV register memory
| IMOV register immediate { append_instruction_t6 (MOV, D32, REG, (int) $2, IMM, (int) $3); }
| IMOV register immediate { append_instruction_t6 (MOV, $2.size, REG, $2.number, IMM, (int) $3); }
| IMOV memory immediate
| IXOR register register
| IXOR register memory
@ -260,39 +262,52 @@ arguments: %empty
| artimetric_block arguments
;
register: RAX { $$ = R0; }
| RBX { $$ = R1; }
| RCX { $$ = R2; }
| RDX { $$ = R3; }
| RSI { $$ = R4; }
| RDI { $$ = R5; }
| RBP { $$ = R6; }
| RSP { $$ = R7; }
| RG8 { $$ = R8; }
| RG9 { $$ = R9; }
| RG10 { $$ = R10; }
| RG11 { $$ = R11; }
| RG12 { $$ = R12; }
| RG13 { $$ = R13; }
| RG14 { $$ = R14; }
| RG15 { $$ = R15; }
| RGXMM0 { $$ = 0; } /* XXX */
| RGXMM1 { $$ = 0; }
| RGXMM2 { $$ = 0; }
| RGXMM3 { $$ = 0; }
| RGXMM4 { $$ = 0; }
| RGXMM5 { $$ = 0; }
| RGXMM6 { $$ = 0; }
| RGXMM7 { $$ = 0; }
/* XXX !!! */
register: EAX { $$ = R0; }
| EBX { $$ = R3; }
| ECX { $$ = R1; }
| EDX { $$ = R2; }
| ESI { $$ = R6; }
| EDI { $$ = R7; }
| EBP { $$ = R5; }
| ESP { $$ = R4; }
register: register64 { $$ = $1; $$.size = D64; }
| register32 { $$ = $1; $$.size = D32; }
;
register64: RAX { $$.number = R0; }
| RBX { $$.number = R1; }
| RCX { $$.number = R2; }
| RDX { $$.number = R3; }
| RSI { $$.number = R4; }
| RDI { $$.number = R5; }
| RBP { $$.number = R6; }
| RSP { $$.number = R7; }
| RG8 { $$.number = R8; }
| RG9 { $$.number = R9; }
| RG10 { $$.number = R10; }
| RG11 { $$.number = R11; }
| RG12 { $$.number = R12; }
| RG13 { $$.number = R13; }
| RG14 { $$.number = R14; }
| RG15 { $$.number = R15; }
| RGXMM0 { $$.number = 0; } /* XXX */
| RGXMM1 { $$.number = 0; }
| RGXMM2 { $$.number = 0; }
| RGXMM3 { $$.number = 0; }
| RGXMM4 { $$.number = 0; }
| RGXMM5 { $$.number = 0; }
| RGXMM6 { $$.number = 0; }
| RGXMM7 { $$.number = 0; }
;
register32: EAX { $$.number = R0; }
| EBX { $$.number = R3; }
| ECX { $$.number = R1; }
| EDX { $$.number = R2; }
| ESI { $$.number = R6; }
| EDI { $$.number = R7; }
| EBP { $$.number = R5; }
| ESP { $$.number = R4; }
| RG8D { $$.number = R8; }
| RG9D { $$.number = R9; }
| RG10D { $$.number = R10; }
| RG11D { $$.number = R11; }
| RG12D { $$.number = R12; }
| RG13D { $$.number = R13; }
| RG14D { $$.number = R14; }
| RG15D { $$.number = R15; }
;
artimetric_block: '{' artimetric_expression '}' { $$ = $2; }