added a few operations and expanded standard library
This commit is contained in:
14
codegen.lisp
14
codegen.lisp
@@ -313,7 +313,8 @@
|
|||||||
|
|
||||||
;; ( -- a)
|
;; ( -- a)
|
||||||
(defop (push-int a) (:lex nil :targets :nasm)
|
(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)
|
(defop (push-str len addr str) (:lex nil :targets :nasm)
|
||||||
(progn (:write ("push ~d" len)
|
(progn (:write ("push ~d" len)
|
||||||
@@ -359,6 +360,17 @@
|
|||||||
(:write ("pop ~a" (aref call-regs i)))
|
(:write ("pop ~a" (aref call-regs i)))
|
||||||
(finally (:write "syscall"))))
|
(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)
|
(defun gen-dump (str)
|
||||||
(format str "~{~a~%~}"
|
(format str "~{~a~%~}"
|
||||||
'("dump:"
|
'("dump:"
|
||||||
|
|||||||
@@ -20,10 +20,15 @@
|
|||||||
;; (print op)
|
;; (print op)
|
||||||
;; (print *stack*)
|
;; (print *stack*)
|
||||||
(case (car op)
|
(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-int (push* (cadr op)))
|
||||||
(:+ (push* (+ (pop*) (pop*))))
|
(:+ (push* (+ (pop*) (pop*))))
|
||||||
(:- (let ((top (pop*)))
|
(:- (let ((top (pop*)))
|
||||||
(push* (- (pop*) top))))
|
(push* (- (pop*) top))))
|
||||||
|
(:* (push* (* (pop*) (pop*))))
|
||||||
(:dump (format t "~a~%" (pop*)))
|
(:dump (format t "~a~%" (pop*)))
|
||||||
(:= (push* (if (= (pop*) (pop*)) 1 0)))
|
(:= (push* (if (= (pop*) (pop*)) 1 0)))
|
||||||
(:eş (let ((top (pop*)))
|
(:eş (let ((top (pop*)))
|
||||||
@@ -36,6 +41,8 @@
|
|||||||
(setf i (third op))))
|
(setf i (third op))))
|
||||||
(:< (let ((top (pop*)))
|
(:< (let ((top (pop*)))
|
||||||
(push* (if (< (pop*) top) 1 0))))
|
(push* (if (< (pop*) top) 1 0))))
|
||||||
|
(:> (let ((top (pop*)))
|
||||||
|
(push* (if (> (pop*) top) 1 0))))
|
||||||
(:iken (when (= 0 (pop*))
|
(:iken (when (= 0 (pop*))
|
||||||
(setf i (cadr op))))
|
(setf i (cadr op))))
|
||||||
(:döngü nil)
|
(:döngü nil)
|
||||||
|
|||||||
@@ -1,4 +1,33 @@
|
|||||||
|
;; Currently makro stack notation is ignored by the compiler.
|
||||||
makro sys-write 1 son
|
makro sys-write 1 son
|
||||||
makro write (fd string -- )
|
makro write (fd string -- )
|
||||||
değiş sys-write syscall-3 son
|
değiş sys-write syscall-3 son
|
||||||
makro stdout 1 son
|
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
|
||||||
Reference in New Issue
Block a user