summaryrefslogtreecommitdiff
path: root/module/system/vm/disassembler.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/system/vm/disassembler.scm')
-rw-r--r--module/system/vm/disassembler.scm13
1 files changed, 12 insertions, 1 deletions
diff --git a/module/system/vm/disassembler.scm b/module/system/vm/disassembler.scm
index 83499333c..7519e2e0b 100644
--- a/module/system/vm/disassembler.scm
+++ b/module/system/vm/disassembler.scm
@@ -107,7 +107,8 @@
(unpack-s12 (ash word -20))))
((X8_S8_S8_S8
X8_S8_S8_C8
- X8_S8_C8_S8)
+ X8_S8_C8_S8
+ X8_S8_C8_C8)
#'((logand (ash word -8) #xff)
(logand (ash word -16) #xff)
(ash word -24)))
@@ -208,6 +209,9 @@ address of that offset."
(define (reference-scm target)
(unpack-scm (u32-offset->addr (+ offset target) context)))
+ (define (reference-tagged-scm tag target)
+ (unpack-scm (+ tag (u32-offset->addr (+ offset target) context))))
+
(define (dereference-scm target)
(let ((addr (u32-offset->addr (+ offset target)
context)))
@@ -270,6 +274,11 @@ address of that offset."
(when (program? val)
(push-addr! (program-code val) val))
(list "~@Y" val)))
+ (('make-tagged-non-immediate dst tag target)
+ (let ((val (reference-tagged-scm tag target)))
+ (when (program? val)
+ (push-addr! (program-code val) val))
+ (list "~@Y" val)))
(((or 'throw/value 'throw/value+data) dst target)
(list "~@Y" (reference-scm target)))
(('builtin-ref dst idx)
@@ -408,6 +417,8 @@ address of that offset."
`(load-label ,dst ,(u32-offset->addr (+ offset src) context)))
(('make-non-immediate dst target)
`(make-non-immediate ,dst ,(reference-scm target)))
+ (('make-tagged-non-immediate dst tag target)
+ `(make-tagged-non-immediate ,dst ,tag ,(reference-tagged-scm tag target)))
(('builtin-ref dst idx)
`(builtin-ref ,dst ,(builtin-index->name idx)))
(((or 'static-ref 'static-set!) dst target)