logic recognized; +registers; +machine block

This commit is contained in:
anon
2024-07-05 11:43:58 +02:00
parent 5d83d7abc6
commit 4a7ede2e1b
3 changed files with 110 additions and 22 deletions

@ -16,8 +16,7 @@ procedure highlight
s32 byte
begin
loop
if
/* byte = 0x90 */
if byte = 0x90
then
fastcall echo_new_line
fastcall terminal_style EFFECT_NORMAL COLOUR_YELLOW
@ -27,8 +26,7 @@ begin
fastcall echo_byte [buffer + offset]
end if
inc offset
if
/* offset = size */
if offset = size
then
break
end if
@ -43,8 +41,7 @@ program xop
u8 buffer = 0
begin
if
/* argc != 2 */
if ! argc = 2
then
fastcall fatal_failure 1 "xop: xop input"
end if
@ -69,5 +66,9 @@ begin
fastcall deallocate buffer
mov buffer rax
exit SUCCESS
machine
0x90
end machine
exit 0
end program

@ -43,7 +43,10 @@ procedure{wsnl}+ { return PROCEDURE; }
loop{wsnl}+ { return TLOOP; }
if{wsnl}+ { return IF; }
then{wsnl}+ { return THEN; }
machine{wsnl}+ { return MACHINE; }
break{wsnl}+ { return BREAK; }
exit{wsnl}+ { return EXIT; }
end { BEGIN IN_END; }
@ -52,6 +55,7 @@ program { BEGIN INITIAL; return END_PROGRAM; }
procedure { BEGIN INITIAL; return END_PROCEDURE; }
loop { BEGIN INITIAL; return END_LOOP; }
if { BEGIN INITIAL; return END_IF; }
machine { BEGIN INITIAL; return END_MACHINE; }
{wsnl} { ; }
. { yyerror(); }
}
@ -59,17 +63,37 @@ if { BEGIN INITIAL; return END_IF; }
fast{wsnl}+ { return FAST; }
unix{wsnl}+ { return UNIX; }
\$rax{wsnl}+ { return RAX; }
\$rbx{wsnl}+ { return RBX; }
\$rcx{wsnl}+ { return RCX; }
\$rdx{wsnl}+ { return RDX; }
\$rbp{wsnl}+ { return RBP; }
\$rsp{wsnl}+ { return RSP; }
\$rip{wsnl}+ { return RIP; }
\$rax{wsnl}+ { return RAX; }
\$rbx{wsnl}+ { return RBX; }
\$rcx{wsnl}+ { return RCX; }
\$rdx{wsnl}+ { return RDX; }
\$rbp{wsnl}+ { return RBP; }
\$rsp{wsnl}+ { return RSP; }
\$rip{wsnl}+ { return RIP; }
\$rsi{wsnl}+ { return RSI; }
\$rdi{wsnl}+ { return RDI; }
\$r8{wsnl}+ { return RG8; }
\$r9{wsnl}+ { return RG9; }
\$r10{wsnl}+ { return RG10; }
\$r11{wsnl}+ { return RG11; }
\$r12{wsnl}+ { return RG12; }
\$r13{wsnl}+ { return RG13; }
\$r14{wsnl}+ { return RG14; }
\$xmm0{wsnl}+ { return RGXMM0; }
\$xmm1{wsnl}+ { return RGXMM1; }
\$xmm2{wsnl}+ { return RGXMM2; }
\$xmm3{wsnl}+ { return RGXMM3; }
\$xmm4{wsnl}+ { return RGXMM4; }
\$xmm5{wsnl}+ { return RGXMM5; }
\$xmm6{wsnl}+ { return RGXMM6; }
\$xmm7{wsnl}+ { return RGXMM7; }
in{wsnl}+ { return TIN; }
\= { return '='; }
\!\= { return NEQ; }
\! { return TNOT; }
s8{wsnl}+ { return S8; }
s16{wsnl}+ { return S16; }
s32{wsnl}+ { return S32; }

@ -57,7 +57,9 @@
%token PROCEDURE END_PROCEDURE
%token TLOOP END_LOOP
%token IF THEN ELSE END_IF
%token BREAK
%token MACHINE END_MACHINE
%token EXIT BREAK
%token<strval> IDENTIFIER
@ -68,6 +70,10 @@
%token UNIX
// Logic
%token NEQ TNOT
//%token TOR TXOR // these are (in)conveniently instructions too
// Type info
%token TIN
%token S8 S16 S32 S64
@ -77,8 +83,11 @@
// Registers
%type<intval> register
%token RAX RBX RCX RDX
%token RBP RSP RIP
%token RAX RBX RCX RDX
%token RSI RDI
%token RG8 RG9 RG10 RG11 RG12 RG13 RG14 RG15
%token RGXMM0 RGXMM1 RGXMM2 RGXMM3 RGXMM4 RGXMM5 RGXMM6 RGXMM7
// Instructions
%token TADD TOR TADC TBB TXOR TAND TSUB TCMP TSYSCALL TINC
@ -133,10 +142,12 @@ type: S8 { $$ = (static_variable){ .is_signed = 1, .size = 8, .address = new
;
code: %empty
| loop code
| if code
| call code
| loop code
| if code
| call code
| machine code
| BREAK code
| exit code
| TXOR register register code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ }
| TXOR register immediate code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ }
| TXOR IDENTIFIER register code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ free($2); }
@ -151,7 +162,33 @@ if: IF logic THEN code END_IF
| IF logic THEN code ELSE code END_IF
;
logic: %empty /* XXX */
logic: logical_operand TAND logical_operand
| logical_operand TOR logical_operand
| logical_operand TXOR logical_operand
| logical_operand '=' logical_operand
| logical_operand NEQ logical_operand
| TNOT logic
;
sublogic: '(' logic ')'
;
logical_operand: operand
| sublogic
;
operand: immediate
| register
| IDENTIFIER
;
machine: MACHINE machine_code END_MACHINE
;
machine_code: %empty
| LITERAL machine_code
| STRING_LITERAL machine_code
| IDENTIFIER machine_code { free($1); }
;
call: calltype IDENTIFIER arguments { free($2); }
@ -167,10 +204,36 @@ arguments: %empty
| immediate arguments
;
register: RAX { $$ = R0; }
| RBX { $$ = R1; }
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; }
;
immediate: LITERAL
;
exit: EXIT immediate
| EXIT IDENTIFIER
;
%%