ulisp/lisp/r5asmpi.lsp

162 lines
3.9 KiB
Common Lisp

; RISC-V Assembler extensions for RP2350 - Version 1 - 18th October 2024
; see http://www.ulisp.com/show?4Y5E
;
; Instruction formats
(defun bit13 (op1 op2 rs1 op3 rd)
(emit32 '(7 5 5 3 5 7) op1 op2 (regno rs1) op3 (regno rd) #x13))
(defun bitimm5 (op1 imm5 rs1 op2 rd)
(emit32 '(7 5 5 3 5 7) op1 (logand imm5 #x1f) (regno rs1) op2 (regno rd) #x13))
; Additional compressed formats
(defun $mul (rd rs1 rs2)
(cond
((and (eq rd rs1) (cregp rd) (cregp rs2))
(emit '(3 3 3 2 3 2) 4 7 (cregno rd) 2 (cregno rs2) 1))
(t (muldiv rs2 rs1 0 rd #x33))))
(defun $sb (src imm &optional lst)
(unless lst (setq lst imm imm 0))
(cond
((and (cregp src) (cregp (car lst)) (<= 0 imm 3))
(emit '(3 3 3 1 1 3 2) 4 2 (cregno (car lst)) (bits imm 0) (bits imm 1) (cregno src) 0))
(t (store imm src (car lst) 0))))
(defun $sh (src imm &optional lst)
(unless lst (setq lst imm imm 0))
(cond
((and (cregp src) (cregp (car lst)) (or (= imm 0) (= im 2))
(emit '(3 3 3 1 1 3 2) 4 3 (cregno (car lst)) 0 (bits imm 1) (cregno src) 0))
(t (store imm src (car lst) 1)))))
; Add compressed formats to $lbu, $lh, and $lhu. No $lb compressed format
(defun $lbu (rd imm &optional lst)
(unless lst (setq lst imm imm 0))
(cond
((and (cregp rd) (cregp (car lst)) (<= 0 imm 3))
(emit '(3 3 3 1 1 3 2) 4 0 (cregno (car lst)) (bits imm 0) (bits imm 1) (cregno rd) 0))
(t (immed imm (car lst) 4 rd 3))))
(defun $lh (rd imm &optional lst)
(unless lst (setq lst imm imm 0))
(cond
((and (cregp rd) (cregp (car lst)) (or (= imm 0) (= im 2))
(emit '(3 3 3 1 1 3 2) 4 1 (cregno (car lst)) 1 (bits imm 1) (cregno rd) 0))
(t (immed imm (car lst) 1 rd 3)))))
(defun $lhu (rd imm &optional lst)
(unless lst (setq lst imm imm 0))
(cond
((and (cregp rd) (cregp (car lst)) (or (= imm 0) (= im 2))
(emit '(3 3 3 1 1 3 2) 4 1 (cregno (car lst)) 0 (bits imm 1) (cregno rd) 0))
(t (immed imm (car lst) 5 rd 3)))))
(defun $xori (rd rs1 imm)
(cond
((and (eq rd rs1) (cregp rd) (= imm -1))
(emit '(3 3 3 2 3 2) 4 7 (cregno rd) 3 5 1))
(t (immed imm rs1 4 rd #x13))))
; New instructions
(defun $andn (rd rs1 rs2)
(reg #x20 rs2 rs1 3 rd #x33))
(defun $bclr (rd rs1 rs2)
(reg #x24 rs2 rs1 1 rd #x33))
(defun $bclri (rd rs1 imm5)
(bitimm5 #x24 imm5 rs1 1 rd))
(defun $bext (rd rs1 rs2)
(reg #x24 rs2 rs1 5 rd #x33))
(defun $bexti (rd rs1 imm5)
(bitimm5 #x24 imm5 rs1 5 rd))
(defun $binv (rd rs1 rs2)
(reg #x34 rs2 rs1 1 rd #x33))
(defun $binvi (rd rs1 imm5)
(bitimm5 #x34 imm5 rs1 1 rd))
(defun $brev8 (rd rs1)
(bit13 #x34 7 rs1 5 rd))
(defun $bset (rd rs1 rs2)
(reg #x14 rs2 rs1 1 rd #x33))
(defun $bseti (rd rs1 imm5)
(bitimm5 #x14 imm5 rs1 1 rd))
(defun $clz (rd rs1)
(bit13 #x30 0 rs1 1 rd))
(defun $cpop (rd rs1)
(bit13 #x30 2 rs1 1 rd))
(defun $ctz (rd rs1)
(bit13 #x30 1 rs1 1 rd))
(defun $max (rd rs1 rs2)
(reg #x05 rs2 rs1 6 rd #x33))
(defun $maxu (rd rs1 rs2)
(reg #x05 rs2 rs1 7 rd #x33))
(defun $min (rd rs1 rs2)
(reg #x05 rs2 rs1 4 rd #x33))
(defun $minu (rd rs1 rs2)
(reg #x05 rs2 rs1 5 rd #x33))
(defun $orc.b (rd rs1)
(bit13 #x14 7 rs1 5 rd))
(defun $orn (rd rs1 rs2)
(reg #x20 rs2 rs1 5 rd #x33))
(defun $pack (rd rs1 rs2)
(reg #x04 rs2 rs1 4 rd #x33))
(defun $packh (rd rs1 rs2)
(reg #x04 rs2 rs1 7 rd #x33))
(defun $rev8 (rd rs1)
(bit13 #x34 #x18 rs1 5 rd))
(defun $rol (rd rs1 rs2)
(reg #x30 rs2 rs1 1 rd #x33))
(defun $ror (rd rs1 rs2)
(reg #x30 rs2 rs1 5 rd #x33))
(defun $rori (rd rs1 imm5)
(bitimm5 #x30 imm5 rs1 5 rd))
(defun $sext.b (rd rs1)
(bit13 #x30 #x04 rs1 1 rd))
(defun $sext.h (rd rs1)
(bit13 #x30 #x05 rs1 1 rd))
(defun $unzip (rd rs1)
(bit13 #x04 #x0f rs1 5 rd))
(defun $xnor (rd rs1 rs2)
(reg #x20 rs2 rs1 4 rd #x33))
(defun $zext.b (rd rs1)
($andi rd rs1 #xff)))
(defun $zext.h (rd rs1)
(emit32 '(7 5 5 3 5 7) #x04 0 (regno rs1) 4 (regno rd) #x33))
(defun $zip (rd rs1)
(bit13 #x04 #x0f rs1 1 rd))