diff options
| -rw-r--r-- | codegen.lisp | 14 | ||||
| -rw-r--r-- | simulation.lisp | 7 | ||||
| -rw-r--r-- | 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 | 
