From 74f8caa95f6a41a619ce54d193879cb240b9992f Mon Sep 17 00:00:00 2001 From: bd Date: Wed, 29 Jan 2025 22:54:34 -0500 Subject: Add emission procedures for binary ops, fix unary parsing error --- src/backend/emitter/traverse.scm | 25 +++++++++++++++++++++++-- src/backend/generator/assembly.scm | 4 ++-- src/backend/generator/expansion.scm | 2 +- src/frontend/parser.y | 8 ++++---- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/backend/emitter/traverse.scm b/src/backend/emitter/traverse.scm index e88f207..15bda10 100644 --- a/src/backend/emitter/traverse.scm +++ b/src/backend/emitter/traverse.scm @@ -32,10 +32,25 @@ \tret\n") (define (neg-ir dst) - (format #f "\tnegl\t~a\n" dst)) + (emit-unary "negl" dst)) (define (not-ir dst) - (format #f "\tnotl\t~a\n" dst)) + (emit-unary "notl" dst)) + +(define (plus-ir src dst) + (emit-binary "addl" src dst)) + +(define (minus-ir src dst) + (emit-binary "subl" src dst)) + +(define (mult-ir src dst) + (emit-binary "imull" src dst)) + +(define (div-ir src) + (emit-unary "idivl" src)) + +(define (cdq-ir) + (format #f "\tcdq\n")) (define (alloc-ir size) (format #f "\tsubq\t$~a, %rsp\n" size)) @@ -48,3 +63,9 @@ (define (imm-ir int) (format #f "$~a" int)) + +(define (emit-unary instr dst) + (format #f "\t~a\t~a\n" instr dst)) + +(define (emit-binary instr src dst) + (format #f "\t~a\t~a, ~a\n" instr src dst)) diff --git a/src/backend/generator/assembly.scm b/src/backend/generator/assembly.scm index 1593a07..d7167d7 100644 --- a/src/backend/generator/assembly.scm +++ b/src/backend/generator/assembly.scm @@ -6,8 +6,8 @@ mov-ir)) -(define r10 (reg-ir "r10")) -(define r11 (reg-ir "r11")) +(define r10 (reg-ir "r10d")) +(define r11 (reg-ir "r11d")) (define (instrs-ir lst) (cons 'list (cons (list 'alloc-ir (abs (get-frame-size))) diff --git a/src/backend/generator/expansion.scm b/src/backend/generator/expansion.scm index c9e4709..eb8b297 100644 --- a/src/backend/generator/expansion.scm +++ b/src/backend/generator/expansion.scm @@ -20,7 +20,7 @@ (define (handle-ret src) (list (list 'mov-ir src eax) - (list 'ret-ir src))) + (list 'ret-ir))) (define (handle-unary op src dst) (list (list 'mov-ir src dst) diff --git a/src/frontend/parser.y b/src/frontend/parser.y index bd5d127..f8c574a 100644 --- a/src/frontend/parser.y +++ b/src/frontend/parser.y @@ -86,15 +86,15 @@ term: factor { add_child($$, $1); add_child($$, $3); } -| un_op exp { - $$ = create_expr($1); - add_child($$, $2); - } ; factor: NUMBER { $$ = create_const($1); } +| un_op factor { + $$ = create_expr($1); + add_child($$, $2); + } | L_PAREN exp R_PAREN { $$ = $2; } -- cgit v1.2.3