From 0f0dd1012d6b1768eb91f1b35e8a7006d09414ab Mon Sep 17 00:00:00 2001 From: bd Date: Thu, 10 Apr 2025 20:40:40 -0400 Subject: Fix swapped destination + source in immediate i-type instructions --- input/add-loop.asm | 1 + 1 file changed, 1 insertion(+) (limited to 'input') diff --git a/input/add-loop.asm b/input/add-loop.asm index f8d97a1..53520f3 100644 --- a/input/add-loop.asm +++ b/input/add-loop.asm @@ -1,3 +1,4 @@ +.data .text addi $2 $0 0x200 addi $5 $0 0x1 -- cgit v1.2.3 From 1904e4e800dcf37becb3bba17c3a3aaca3c7a47c Mon Sep 17 00:00:00 2001 From: bd Date: Fri, 11 Apr 2025 03:32:24 -0400 Subject: Add a few new test files --- input/add-loop-directive.asm | 21 --------------- input/add-loop.asm | 24 ----------------- input/adjacent-adder-manual.asm | 30 +++++++++++++++++++++ input/adjacent-adder.asm | 25 +++++++++++++++++ input/dominative-functions.asm | 54 +++++++++++++++++++++++++++++++++++++ input/identity.asm | 59 +++++++++++++++++++++++++++++++++++++++++ input/rabbits.asm | 17 ++++++++++++ input/simple.asm | 5 ---- src/main.lisp | 2 +- src/parse.lisp | 10 +++---- 10 files changed, 191 insertions(+), 56 deletions(-) delete mode 100644 input/add-loop-directive.asm delete mode 100644 input/add-loop.asm create mode 100644 input/adjacent-adder-manual.asm create mode 100644 input/adjacent-adder.asm create mode 100644 input/dominative-functions.asm create mode 100644 input/identity.asm create mode 100644 input/rabbits.asm delete mode 100644 input/simple.asm (limited to 'input') diff --git a/input/add-loop-directive.asm b/input/add-loop-directive.asm deleted file mode 100644 index 5bccff3..0000000 --- a/input/add-loop-directive.asm +++ /dev/null @@ -1,21 +0,0 @@ -.data - arr 1 2 3 4 - s 3 - i 0 - -.text - load $5 s - load $10 arr - load $6 i - jrl CMP -L: - add $9 $10 $6 - load $7 0($9) - load $8 1($9) - add $7 $7 $8 - - store $7 0($9) - addi $6 $6 0x1 -CMP: - cmp $6 $5 - bgt L diff --git a/input/add-loop.asm b/input/add-loop.asm deleted file mode 100644 index 53520f3..0000000 --- a/input/add-loop.asm +++ /dev/null @@ -1,24 +0,0 @@ -.data -.text - addi $2 $0 0x200 - addi $5 $0 0x1 - store $5 0($2) - addi $5 $0 0x2 - store $5 1($2) - addi $5 $0 0x3 - store $5 2($2) - addi $5 $0 0x4 - store $5 3($2) - addi $5 $0 0x0 - addi $6 $0 0x3 - jrl CHECK -LOOP: - add $9 $2 $5 - load $7 -0($9) - load $8 +1($9) - add $7 $7 $8 - store $7 0($9) - addi $5 $5 0x1 -CHECK: - cmp $6 $5 - bgt LOOP diff --git a/input/adjacent-adder-manual.asm b/input/adjacent-adder-manual.asm new file mode 100644 index 0000000..b575959 --- /dev/null +++ b/input/adjacent-adder-manual.asm @@ -0,0 +1,30 @@ +;;;;;;;; +;;; adds adjacent elements of a 4-element vector together, +;;; storing the result in place. +;;; Does not make use of variables. + +.data + ;; empty +.text + addi $2 $0 0x200 + addi $5 $0 0x1 + store $5 0($2) + addi $5 $0 0x2 + store $5 1($2) + addi $5 $0 0x3 + store $5 2($2) + addi $5 $0 0x4 + store $5 3($2) + addi $5 $0 0x0 + addi $6 $0 0x3 + jrl CHECK +LOOP: + add $9 $2 $5 + load $7 -0($9) + load $8 +1($9) + add $7 $7 $8 + store $7 0($9) + addi $5 $5 0x1 +CHECK: + cmp $6 $5 + bgt LOOP diff --git a/input/adjacent-adder.asm b/input/adjacent-adder.asm new file mode 100644 index 0000000..35704d2 --- /dev/null +++ b/input/adjacent-adder.asm @@ -0,0 +1,25 @@ +;;;;;;;; +;;; adds adjacent elements of a 4-element vector together, +;;; storing the result in place. + +.data + arr 1 2 3 4 + s 3 + i 0 + +.text + addi $5 $5 s + addi $10 $10 arr + addi $6 $6 i + jrl CMP +L: + add $9 $10 $6 + load $7 0($9) + load $8 1($9) + add $7 $7 $8 + + store $7 0($9) + addi $6 $6 0x1 +CMP: + cmp $5 $6 + bgt L diff --git a/input/dominative-functions.asm b/input/dominative-functions.asm new file mode 100644 index 0000000..cb8564e --- /dev/null +++ b/input/dominative-functions.asm @@ -0,0 +1,54 @@ +;;;;;;;; +;;; makes use of a designated function to add two numbers together +;;; uses a stack-based paradigm with a base pointer to manage argument passing +;;; TODO this file is incomplete due to remaining ISA subroutine design issues + +.data + answer 0 + +.text +MAIN: + addi $5 $2 0x0 ; establish frame pointer + + addi $6 $0 -11 + + push $6 + ;; jal SUB23 + store $6 answer($0) +SUB23: + push $5 ; push old frame pointer + addi $5 $2 0x0 + subi $2 $2 0x4 + + addi $6 $0 -23 + store $6 -4($5) + + load $7 +4($5) ; access argument + load $6 -4($5) + + add $6 $6 $7 + push $6 + ;; jal ADD76 + pop $6 ; retrieve and pass along + store $6 +4($5) + + addi $2 $5 0x0 ; restore stack pointer + pop $5 ; restore frame pointer + ;; ret +ADD76: + push $5 + addi $5 $2 0x0 + subi $2 $2 0x4 + + addi $6 $0 +76 + store $6 -4($5) + + load $7 +4($5) ; access argument + load $6 -4($5) + + add $6 $6 $7 + store $6 +4($5) + + addi $2 $5 0x0 + pop $5 + ;; ret diff --git a/input/identity.asm b/input/identity.asm new file mode 100644 index 0000000..e6d9260 --- /dev/null +++ b/input/identity.asm @@ -0,0 +1,59 @@ +;;;;;;;; +;;; performs a matrix multiply on the 4x4 square matrices +;;; m1 and m2, +;;; the result of which is placed into +;;; r, +;;; in this case, the result is the identity +;;; does not use designated vector instructions + +.data + m1 01 00 -1 00 00 01 00 -1 00 00 01 00 00 00 00 01 + m2 01 00 01 00 00 01 00 01 00 00 01 00 00 00 00 01 + r 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +.text + addi $8 $0 0x4 ; dimensions + addi $9 $0 0x0 ; tracks the rows + addi $10 $0 0x0 ; tracks the columns + jrl ROWCOND + +ROW: + jrl COLCOND +COL: + addi $11 $0 0x0 ; tracks the element being added + addi $12 $0 0x0 ; the accumulated result to place into $9,$10 + + mul $7 $9 $8 ; setup the index into m1 + addi $5 $7 m1 + + addi $6 $0 m2 ; setup the index into m2 + add $6 $6 $10 + + jrl ELECOND +ELE: + add $5 $5 $11 ; increment m1 + + mul $13 $11 $8 ; increment m2 + add $6 $6 $13 + + load $13 0($5) ; retrieve and accumulate + load $14 0($6) + add $12 $14 $13 + + addi $11 $11 0x1 +ELECOND: + cmp $8 $11 + bgt ELE + addi $10 $10 0x1 +COLCOND: + cmp $8 $10 + bgt COL + + add $7 $7 $10 ; setup the index into r + addi $7 $7 r + + store $12 0($7) + + addi $9 $9 0x1 +ROWCOND: + cmp $8 $9 + bgt ROW diff --git a/input/rabbits.asm b/input/rabbits.asm new file mode 100644 index 0000000..c848116 --- /dev/null +++ b/input/rabbits.asm @@ -0,0 +1,17 @@ +;;;;;;;; +;;; multiplies numbers until an overflow occurs + +.data + rabbits 2 + rate 300 + +.text + load $5 rabbits($0) + load $6 rate($0) + +BREED: + mul $5 $5 $6 + store $5 rabbits($0) + bof DONE + jrl BREED +DONE: diff --git a/input/simple.asm b/input/simple.asm deleted file mode 100644 index 3e60ee8..0000000 --- a/input/simple.asm +++ /dev/null @@ -1,5 +0,0 @@ - addi $sp $0 512 - addi $5 $0 1 - store $5 0($sp) - addi $5 $0 2 - store $5 1($sp) diff --git a/src/main.lisp b/src/main.lisp index 517d395..f1f3021 100644 --- a/src/main.lisp +++ b/src/main.lisp @@ -65,7 +65,7 @@ _/_/ _/_/ " (let ((words (emit:emit ast))) (if write? (postprocess words file) - (format t "Emission successfull, got: ~%~a~%" words))) + (format t "Emission successful, got: ~%~a~%" words))) (format t "Parse successful, got:~%~a~%" (emit:ast->str ast)))) (error "The file does not exist, or it could not be opened.~%"))))))) diff --git a/src/parse.lisp b/src/parse.lisp index 2e1cf55..f435c0a 100644 --- a/src/parse.lisp +++ b/src/parse.lisp @@ -51,14 +51,14 @@ (esrap:defrule variable alphanumeric (:lambda (e) (list 'emit::var e))) -(esrap:defrule dereference (and integer #\( register #\)) - (:destructure (i1 w1 r w2) - (declare (ignore w1 w2)) - (list r (list 'emit::imm i1)))) - (esrap:defrule immediate (or integer variable) (:lambda (e) (list 'emit::imm e))) +(esrap:defrule dereference (and immediate #\( register #\)) + (:destructure (i1 w1 r w2) + (declare (ignore w1 w2)) + (list r i1))) + ;;; defines rules to parse labels (esrap:defrule label alphanumeric -- cgit v1.2.3 From 639098b1ea82be82bd18a4af415458fcbaf5e20b Mon Sep 17 00:00:00 2001 From: bd Date: Fri, 11 Apr 2025 16:39:21 -0400 Subject: Add RET and NOP j-type instructions --- input/dominative-functions.asm | 5 +++-- src/parse.lisp | 11 ++++++++--- src/util.lisp | 2 +- t/parse.lisp | 11 ++++++----- 4 files changed, 18 insertions(+), 11 deletions(-) (limited to 'input') diff --git a/input/dominative-functions.asm b/input/dominative-functions.asm index cb8564e..530717d 100644 --- a/input/dominative-functions.asm +++ b/input/dominative-functions.asm @@ -14,6 +14,7 @@ MAIN: push $6 ;; jal SUB23 + pop $6 store $6 answer($0) SUB23: push $5 ; push old frame pointer @@ -34,7 +35,7 @@ SUB23: addi $2 $5 0x0 ; restore stack pointer pop $5 ; restore frame pointer - ;; ret + ret ADD76: push $5 addi $5 $2 0x0 @@ -51,4 +52,4 @@ ADD76: addi $2 $5 0x0 pop $5 - ;; ret + ret diff --git a/src/parse.lisp b/src/parse.lisp index e58dea0..0ea6c0d 100644 --- a/src/parse.lisp +++ b/src/parse.lisp @@ -84,11 +84,12 @@ (generate-mnemonic 'i-type-2-m '("STOREV" "STORE")) (generate-mnemonic 'j-type-1-m '("JMP" "JAL")) (generate-mnemonic 'j-type-2-m '("PUSH" "POP")) +(generate-mnemonic 'j-type-3-m '("RET" "NOP")) ;; we need to reverse to ensure rules like "ADDV" are matched before "ADD" (generate-mnemonic 'r-type-3-m (reverse util:r-type)) (generate-mnemonic 'i-type-3-m (reverse util:i-type)) -(generate-mnemonic 'j-type-3-m (reverse util:j-type)) +(generate-mnemonic 'j-type-4-m (reverse util:j-type)) ;; TODO this is pretty gross (defmacro defrule-instr (name type-id order &rest destructure-pattern) @@ -110,7 +111,7 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma (defrule-instr r-type-2 'emit::r (0 1 2) register register) (defrule-instr r-type-3 'emit::r (1 2 0) register register register) (defrule-instr i-type-3 'emit::i (1 0 2) register register immediate) -(defrule-instr j-type-3 'emit::j (1 0) label) +(defrule-instr j-type-4 'emit::j (1 0) label) (esrap:defrule i-type-1 (and i-type-1-m space register space dereference) (:destructure (m w1 s w2 di) @@ -132,8 +133,12 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma (declare (ignore w)) `(emit::j ,m ,r 0))) +(esrap:defrule j-type-3 j-type-3-m + (:lambda (m) + `(emit::j ,m (emit::rr 0) 0))) + (esrap:defrule instr (or r-type-1 r-type-2 r-type-3 i-type-1 i-type-2 - i-type-3 j-type-1 j-type-2 j-type-3)) + i-type-3 j-type-1 j-type-2 j-type-3 j-type-4)) ;;; defines rules to parse the .text segment diff --git a/src/util.lisp b/src/util.lisp index 8d98680..e52d7aa 100644 --- a/src/util.lisp +++ b/src/util.lisp @@ -76,5 +76,5 @@ of the elements from both lists. Returns nil if the lists are not equal size." "I-type instructions.") (defvar j-type - '("JMP" "JRL" "JAL" "BEQ" "BGT" "BUF" "BOF" "PUSH" "POP") + '("JMP" "JRL" "JAL" "BEQ" "BGT" "BUF" "BOF" "PUSH" "POP" "RET" "NOP") "J-type instructions.") diff --git a/t/parse.lisp b/t/parse.lisp index 7c084aa..2612f45 100644 --- a/t/parse.lisp +++ b/t/parse.lisp @@ -45,9 +45,10 @@ (emit::x (emit::j "JMP" (emit::rr 3) 3) (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 8)) + (emit::j "RET" (emit::rr 0) 0) (emit::j "PUSH" (emit::rr 5) 0))) (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tJMP 3($3) -~tJRL FOO~%~tPUSH $5~%"))))) +~tJRL FOO~%~tRET~%~tPUSH $5~%"))))) (test esrap-instr-type-i-negative (is (equal @@ -73,7 +74,7 @@ (emit::d) (emit::x (emit::j "JMP" (emit::rr 3) 3) - (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 14)) + (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 15)) (emit::j "PUSH" (emit::rr 5) 0))) (esrap:parse 'parse:str->ast (format nil ".DATA~%~%.TEXT~t~%JMP 3($3)~t JRL FOO~t~%PUSH $5~%"))))) @@ -84,7 +85,7 @@ JRL FOO~t~%PUSH $5~%"))))) (emit::d) (emit::x (emit::j "JMP" (emit::rr 3) 3) - (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 17)) + (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 18)) (emit::j "PUSH" (emit::rr 5) 0))) (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT;; dot dot dot ~tJMP 3($3) ;; this does things @@ -143,11 +144,11 @@ H 3 5~%.TEXT~%"))))) (emit::i "ADDI" (emit::rr 0) (emit::rr 5) (emit::var "S")) (emit::i "ADDI" (emit::rr 0) (emit::rr 10) (emit::var "ARR")) (emit::i "ADDI" (emit::rr 0) (emit::rr 6) (emit::var "I")) - (emit::j "JRL" (emit::rr 0) (emit::l "CMP" 23)) + (emit::j "JRL" (emit::rr 0) (emit::l "CMP" 24)) (emit::r "ADD" (emit::rr 10) (emit::rr 6) (emit::rr 9)) (emit::i "ADDI" (emit::rr 6) (emit::rr 6) 1) (emit::r "CMP" (emit::rr 6) (emit::rr 5) (emit::rr 0)) - (emit::j "BGT" (emit::rr 0) (emit::l "L" 27)))) + (emit::j "BGT" (emit::rr 0) (emit::l "L" 28)))) (esrap:parse 'parse:str->ast (format nil " .DATA ARR 1 2 3 4 -- cgit v1.2.3