summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--codegen.lisp14
-rw-r--r--simulation.lisp7
-rw-r--r--test/std.kurt33
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