diff --git a/debug/xop.eax b/debug/xop.eax index f6e6bf7..353b8c1 100644 --- a/debug/xop.eax +++ b/debug/xop.eax @@ -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 diff --git a/source/eaxhla.l b/source/eaxhla.l index a33598e..1adcbbc 100644 --- a/source/eaxhla.l +++ b/source/eaxhla.l @@ -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; } diff --git a/source/eaxhla.y b/source/eaxhla.y index eba1390..064be76 100644 --- a/source/eaxhla.y +++ b/source/eaxhla.y @@ -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 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 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 + ; %%