added a few operations and expanded standard library
This commit is contained in:
14
codegen.lisp
14
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:"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
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