From 86dbe8eb0abe2a2d5f0f687ff190c4e9f547d126 Mon Sep 17 00:00:00 2001 From: mRnea Date: Sun, 18 Aug 2024 17:10:32 +0300 Subject: added a few operations and expanded standard library --- codegen.lisp | 14 +++++++++++++- simulation.lisp | 7 +++++++ test/std.kurt | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/codegen.lisp b/codegen.lisp index 1e8c364..c74b4c0 100644 --- a/codegen.lisp +++ b/codegen.lisp @@ -313,7 +313,8 @@ ;; ( -- a) (defop (push-int a) (:lex nil :targets :nasm) - ("push ~d" a)) + ("mov rax, ~a" a) + ("push rax")) (defop (push-str len addr str) (:lex nil :targets :nasm) (progn (:write ("push ~d" len) @@ -359,6 +360,17 @@ (:write ("pop ~a" (aref call-regs i))) (finally (:write "syscall")))) +(defop divmod (:targets :nasm) + "mov rdx, 0" + (rax rcx -- ) + "div rcx" + (-- rax rdx)) + +(defop * (:targets :nasm) + (rbx rax -- ) + "mul rbx" + ( -- rax)) + (defun gen-dump (str) (format str "~{~a~%~}" '("dump:" diff --git a/simulation.lisp b/simulation.lisp index b0e317c..f35abc6 100644 --- a/simulation.lisp +++ b/simulation.lisp @@ -20,10 +20,15 @@ ;; (print op) ;; (print *stack*) (case (car op) + (:divmod (let ((top (pop*))) + (multiple-value-bind (div mod) (truncate (pop*) top) + (push* div) + (push* mod)))) (:push-int (push* (cadr op))) (:+ (push* (+ (pop*) (pop*)))) (:- (let ((top (pop*))) (push* (- (pop*) top)))) + (:* (push* (* (pop*) (pop*)))) (:dump (format t "~a~%" (pop*))) (:= (push* (if (= (pop*) (pop*)) 1 0))) (:eş (let ((top (pop*))) @@ -36,6 +41,8 @@ (setf i (third op)))) (:< (let ((top (pop*))) (push* (if (< (pop*) top) 1 0)))) + (:> (let ((top (pop*))) + (push* (if (> (pop*) top) 1 0)))) (:iken (when (= 0 (pop*)) (setf i (cadr op)))) (:döngü nil) diff --git a/test/std.kurt b/test/std.kurt index cf7e684..97fc60b 100644 --- a/test/std.kurt +++ b/test/std.kurt @@ -1,4 +1,33 @@ -makro sys-write 1 son +;; Currently makro stack notation is ignored by the compiler. +makro sys-write 1 son makro write (fd string -- ) değiş sys-write syscall-3 son -makro stdout 1 son \ No newline at end of file +makro stdout 1 son + +makro / (a b -- (a / b)) divmod düş son +makro % (a b -- (a % b)) divmod değiş düş son +makro 2eş (a b -- a b a b) üst üst son + +makro load64 (bel -- a) + 7 + 0 + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş 1 - değiş + 8 << üst oku + değiş düş +son + +makro byte-max 255 son ;; 2^8 - 1 = 255 +makro store64 (bel a -- ) + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> değiş 1 + değiş + 2eş byte-max & yaz 8 >> düş düş +son \ No newline at end of file -- cgit v1.2.3