(defmacro lisp-jump (function lip)
"Jump to the lisp function FUNCTION. LIP is an interior-reg temporary."
`(progn
- (inst lda ,lip (- (ash sb!vm:simple-fun-code-offset sb!vm:word-shift)
- sb!vm:fun-pointer-lowtag)
+ (inst lda ,lip (- (ash simple-fun-code-offset word-shift)
+ fun-pointer-lowtag)
,function)
(move ,function code-tn)
(inst jsr zero-tn ,lip 1)))
;;; presumably initializes the object.
(defmacro with-fixed-allocation ((result-tn temp-tn widetag size)
&body body)
- `(pseudo-atomic (:extra (pad-data-block ,size))
- (inst bis alloc-tn other-pointer-lowtag ,result-tn)
- (inst li (logior (ash (1- ,size) n-widetag-bits) ,widetag) ,temp-tn)
- (storew ,temp-tn ,result-tn 0 other-pointer-lowtag)
- ,@body))
+ (unless body
+ (bug "empty &body in WITH-FIXED-ALLOCATION"))
+ (once-only ((result-tn result-tn) (temp-tn temp-tn) (size size))
+ `(pseudo-atomic (:extra (pad-data-block ,size))
+ (inst bis alloc-tn other-pointer-lowtag ,result-tn)
+ (inst li (logior (ash (1- ,size) n-widetag-bits) ,widetag) ,temp-tn)
+ (storew ,temp-tn ,result-tn 0 other-pointer-lowtag)
+ ,@body)))
+
+(defun align-csp (temp)
+ ;; is used for stack allocation of dynamic-extent objects
+ (let ((aligned (gen-label)))
+ (inst and csp-tn lowtag-mask temp)
+ (inst beq temp aligned)
+ (inst addq csp-tn n-word-bytes csp-tn)
+ (storew zero-tn csp-tn -1)
+ (emit-label aligned)))
\f
;;;; error code
(eval-when (:compile-toplevel :load-toplevel :execute)
(:result-types ,el-type)
(:temporary (:sc non-descriptor-reg) temp)
(:temporary (:sc non-descriptor-reg) temp1)
- (:generator 5
+ (:generator 4
,@(ecase size
(:byte
(if signed
(:temporary (:sc non-descriptor-reg) temp2)
(:results (result :scs ,scs))
(:result-types ,el-type)
- (:generator 5
+ (:generator 4
,@(ecase size
(:byte
- `((inst lda temp (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag)
+ `((inst lda temp (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag)
object)
- (inst ldq_u temp1 (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag)
+ (inst ldq_u temp1 (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag)
object)
(inst insbl value temp temp2)
(inst mskbl temp1 temp temp1)
(inst bis temp1 temp2 temp1)
- (inst stq_u temp1 (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag) object)))
+ (inst stq_u temp1 (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag) object)))
(:short
- `((inst lda temp (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag)
+ `((inst lda temp (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag)
object)
- (inst ldq_u temp1 (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag)
+ (inst ldq_u temp1 (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag)
object)
(inst mskwl temp1 temp temp1)
(inst inswl value temp temp2)
(inst bis temp1 temp2 temp)
- (inst stq_u temp (- (* ,offset n-word-bytes)
- (* index ,scale) ,lowtag) object))))
+ (inst stq_u temp (- (+ (* ,offset n-word-bytes)
+ (* index ,scale))
+ ,lowtag) object))))
(move value result))))))
+
+(defmacro sb!sys::with-pinned-objects ((&rest objects) &body body)
+ "Arrange with the garbage collector that the pages occupied by
+OBJECTS will not be moved in memory for the duration of BODY.
+Useful for e.g. foreign calls where another thread may trigger
+garbage collection. This is currently implemented by disabling GC"
+ (declare (ignore objects)) ;should we eval these for side-effect?
+ `(without-gcing
+ ,@body))