better register logic
This commit is contained in:
@ -5,7 +5,10 @@ typedef unsigned int next;
|
|||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
D8, D16, D32, D64,
|
D8 = 0x00,
|
||||||
|
D16 = 0x01,
|
||||||
|
D32 = 0x10,
|
||||||
|
D64 = 0x11,
|
||||||
} size_index;
|
} size_index;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -16,7 +16,6 @@ tommy_hashtable variable_table;
|
|||||||
|
|
||||||
char * scope = NULL;
|
char * scope = NULL;
|
||||||
int is_program_found = 0;
|
int is_program_found = 0;
|
||||||
|
|
||||||
#if DEBUG == 1
|
#if DEBUG == 1
|
||||||
static
|
static
|
||||||
void dump_variable(void * data) {
|
void dump_variable(void * data) {
|
||||||
|
@ -12,6 +12,14 @@ typedef struct {
|
|||||||
tommy_node _node;
|
tommy_node _node;
|
||||||
} variable_t;
|
} 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 int system_type;
|
||||||
|
|
||||||
extern char * scope;
|
extern char * scope;
|
||||||
|
@ -62,6 +62,7 @@ r11 { return RG11; }
|
|||||||
r12 { return RG12; }
|
r12 { return RG12; }
|
||||||
r13 { return RG13; }
|
r13 { return RG13; }
|
||||||
r14 { return RG14; }
|
r14 { return RG14; }
|
||||||
|
|
||||||
xmm0 { return RGXMM0; }
|
xmm0 { return RGXMM0; }
|
||||||
xmm1 { return RGXMM1; }
|
xmm1 { return RGXMM1; }
|
||||||
xmm2 { return RGXMM2; }
|
xmm2 { return RGXMM2; }
|
||||||
@ -71,15 +72,22 @@ xmm5 { return RGXMM5; }
|
|||||||
xmm6 { return RGXMM6; }
|
xmm6 { return RGXMM6; }
|
||||||
xmm7 { return RGXMM7; }
|
xmm7 { return RGXMM7; }
|
||||||
|
|
||||||
eax { return EAX; }
|
eax { return EAX; }
|
||||||
ebx { return EBX; }
|
ebx { return EBX; }
|
||||||
ecx { return ECX; }
|
ecx { return ECX; }
|
||||||
edx { return EDX; }
|
edx { return EDX; }
|
||||||
ebp { return EBP; }
|
ebp { return EBP; }
|
||||||
esp { return ESP; }
|
esp { return ESP; }
|
||||||
eip { return EIP; }
|
eip { return EIP; }
|
||||||
esi { return ESI; }
|
esi { return ESI; }
|
||||||
edi { return EDI; }
|
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; }
|
in { return TIN; }
|
||||||
\= { return '='; }
|
\= { return '='; }
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
long intval;
|
long intval;
|
||||||
char * strval;
|
char * strval;
|
||||||
variable_t varval;
|
variable_t varval;
|
||||||
|
cpuregister_t regval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX NOTE: while naming, if my name collided with something in assembler.h i just
|
/* XXX NOTE: while naming, if my name collided with something in assembler.h i just
|
||||||
@ -68,7 +69,7 @@
|
|||||||
%type<varval> declaration
|
%type<varval> declaration
|
||||||
|
|
||||||
// Registers
|
// Registers
|
||||||
%type<intval> register
|
%type<regval> register register64 register32
|
||||||
|
|
||||||
%token RBP RSP RIP
|
%token RBP RSP RIP
|
||||||
%token RAX RBX RCX RDX
|
%token RAX RBX RCX RDX
|
||||||
@ -79,6 +80,7 @@
|
|||||||
%token EBP ESP EIP
|
%token EBP ESP EIP
|
||||||
%token EAX EBX ECX EDX
|
%token EAX EBX ECX EDX
|
||||||
%token ESI EDI
|
%token ESI EDI
|
||||||
|
%token RG8D RG9D RG10D RG11D RG12D RG13D RG14D RG15D
|
||||||
|
|
||||||
// Instructions
|
// Instructions
|
||||||
%token TADD TOR TADC TBB TXOR TAND TSUB TCMP TSYSCALL TINC
|
%token TADD TOR TADC TBB TXOR TAND TSUB TCMP TSYSCALL TINC
|
||||||
@ -206,7 +208,7 @@ instruction: INOP { ; }
|
|||||||
| IMOV register register
|
| IMOV register register
|
||||||
| IMOV memory register
|
| IMOV memory register
|
||||||
| IMOV register memory
|
| 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
|
| IMOV memory immediate
|
||||||
| IXOR register register
|
| IXOR register register
|
||||||
| IXOR register memory
|
| IXOR register memory
|
||||||
@ -260,39 +262,52 @@ arguments: %empty
|
|||||||
| artimetric_block arguments
|
| artimetric_block arguments
|
||||||
;
|
;
|
||||||
|
|
||||||
register: RAX { $$ = R0; }
|
register: register64 { $$ = $1; $$.size = D64; }
|
||||||
| RBX { $$ = R1; }
|
| register32 { $$ = $1; $$.size = D32; }
|
||||||
| RCX { $$ = R2; }
|
;
|
||||||
| RDX { $$ = R3; }
|
|
||||||
| RSI { $$ = R4; }
|
register64: RAX { $$.number = R0; }
|
||||||
| RDI { $$ = R5; }
|
| RBX { $$.number = R1; }
|
||||||
| RBP { $$ = R6; }
|
| RCX { $$.number = R2; }
|
||||||
| RSP { $$ = R7; }
|
| RDX { $$.number = R3; }
|
||||||
| RG8 { $$ = R8; }
|
| RSI { $$.number = R4; }
|
||||||
| RG9 { $$ = R9; }
|
| RDI { $$.number = R5; }
|
||||||
| RG10 { $$ = R10; }
|
| RBP { $$.number = R6; }
|
||||||
| RG11 { $$ = R11; }
|
| RSP { $$.number = R7; }
|
||||||
| RG12 { $$ = R12; }
|
| RG8 { $$.number = R8; }
|
||||||
| RG13 { $$ = R13; }
|
| RG9 { $$.number = R9; }
|
||||||
| RG14 { $$ = R14; }
|
| RG10 { $$.number = R10; }
|
||||||
| RG15 { $$ = R15; }
|
| RG11 { $$.number = R11; }
|
||||||
| RGXMM0 { $$ = 0; } /* XXX */
|
| RG12 { $$.number = R12; }
|
||||||
| RGXMM1 { $$ = 0; }
|
| RG13 { $$.number = R13; }
|
||||||
| RGXMM2 { $$ = 0; }
|
| RG14 { $$.number = R14; }
|
||||||
| RGXMM3 { $$ = 0; }
|
| RG15 { $$.number = R15; }
|
||||||
| RGXMM4 { $$ = 0; }
|
| RGXMM0 { $$.number = 0; } /* XXX */
|
||||||
| RGXMM5 { $$ = 0; }
|
| RGXMM1 { $$.number = 0; }
|
||||||
| RGXMM6 { $$ = 0; }
|
| RGXMM2 { $$.number = 0; }
|
||||||
| RGXMM7 { $$ = 0; }
|
| RGXMM3 { $$.number = 0; }
|
||||||
/* XXX !!! */
|
| RGXMM4 { $$.number = 0; }
|
||||||
register: EAX { $$ = R0; }
|
| RGXMM5 { $$.number = 0; }
|
||||||
| EBX { $$ = R3; }
|
| RGXMM6 { $$.number = 0; }
|
||||||
| ECX { $$ = R1; }
|
| RGXMM7 { $$.number = 0; }
|
||||||
| EDX { $$ = R2; }
|
;
|
||||||
| ESI { $$ = R6; }
|
|
||||||
| EDI { $$ = R7; }
|
register32: EAX { $$.number = R0; }
|
||||||
| EBP { $$ = R5; }
|
| EBX { $$.number = R3; }
|
||||||
| ESP { $$ = R4; }
|
| 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; }
|
artimetric_block: '{' artimetric_expression '}' { $$ = $2; }
|
||||||
|
Reference in New Issue
Block a user