-;;;
-;;; Written by Rob MacLachlan
-;;;
-;;; Mips conversion by William Lott and Christopher Hoover.
-;;;
-(in-package "SB!VM")
+;;;; PPC VM definitions of various system hacking operations
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+(in-package "SB!VM")
\f
;;;; Type frobbing VOPs
(:results (result :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 1
- (inst andi. result object sb!vm:lowtag-mask)))
+ (inst andi. result object lowtag-mask)))
(define-vop (widetag-of)
(:translate widetag-of)
;; It wasn't a fixnum, so get the low 8 bits.
(inst andi. result object widetag-mask)
(inst b done)
-
+
FUNCTION-POINTER
(load-type result object (- fun-pointer-lowtag))
(inst b done)
(:results (result :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 6
- (load-type result function (- sb!vm:fun-pointer-lowtag))))
+ (load-type result function (- fun-pointer-lowtag))))
(define-vop (set-fun-subtype)
(:translate (setf fun-subtype))
(:policy :fast-safe)
(:args (type :scs (unsigned-reg) :target result)
- (function :scs (descriptor-reg)))
+ (function :scs (descriptor-reg)))
(:arg-types positive-fixnum *)
(:results (result :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:results (res :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 6
- (loadw res x 0 sb!vm:other-pointer-lowtag)
- (inst srwi res res sb!vm:n-widetag-bits)))
+ (loadw res x 0 other-pointer-lowtag)
+ (inst srwi res res n-widetag-bits)))
(define-vop (get-closure-length)
(:translate get-closure-length)
(:results (res :scs (unsigned-reg)))
(:result-types positive-fixnum)
(:generator 6
- (loadw res x 0 sb!vm:fun-pointer-lowtag)
- (inst srwi res res sb!vm:n-widetag-bits)))
+ (loadw res x 0 fun-pointer-lowtag)
+ (inst srwi res res n-widetag-bits)))
(define-vop (set-header-data)
(:translate set-header-data)
(:policy :fast-safe)
(:args (x :scs (descriptor-reg) :target res)
- (data :scs (any-reg immediate zero)))
+ (data :scs (any-reg immediate zero)))
(:arg-types * positive-fixnum)
(:results (res :scs (descriptor-reg)))
(:temporary (:scs (non-descriptor-reg)) t1 t2)
(:generator 6
- (loadw t1 x 0 sb!vm:other-pointer-lowtag)
- (inst andi. t1 t1 sb!vm:widetag-mask)
+ (loadw t1 x 0 other-pointer-lowtag)
+ (inst andi. t1 t1 widetag-mask)
(sc-case data
(any-reg
- (inst slwi t2 data (- sb!vm:n-widetag-bits 2))
+ (inst slwi t2 data (- n-widetag-bits 2))
(inst or t1 t1 t2))
(immediate
- (inst ori t1 t1 (ash (tn-value data) sb!vm:n-widetag-bits)))
+ (inst ori t1 t1 (ash (tn-value data) n-widetag-bits)))
(zero))
- (storew t1 x 0 sb!vm:other-pointer-lowtag)
+ (storew t1 x 0 other-pointer-lowtag)
(move res x)))
;;
;; Some code (the hash table code) depends on this returning a
;; positive number so make sure it does.
- (inst slwi res ptr 3)
- (inst srwi res res 1)))
+ (inst rlwinm res ptr n-fixnum-tag-bits 1 n-positive-fixnum-bits)))
(define-vop (make-other-immediate-type)
(:args (val :scs (any-reg descriptor-reg))
- (type :scs (any-reg descriptor-reg immediate)
- :target temp))
+ (type :scs (any-reg descriptor-reg immediate)
+ :target temp))
(:results (res :scs (any-reg descriptor-reg)))
(:temporary (:scs (non-descriptor-reg)) temp)
(:generator 2
(sc-case type
(immediate
- (inst slwi temp val sb!vm:n-widetag-bits)
+ (inst slwi temp val n-widetag-bits)
(inst ori res temp (tn-value type)))
(t
(inst srawi temp type 2)
- (inst slwi res val (- sb!vm:n-widetag-bits 2))
+ (inst slwi res val (- n-widetag-bits 2))
(inst or res res temp)))))
\f
(:results (sap :scs (sap-reg)))
(:result-types system-area-pointer)
(:generator 10
- (loadw ndescr code 0 sb!vm:other-pointer-lowtag)
- (inst srwi ndescr ndescr sb!vm:n-widetag-bits)
- (inst slwi ndescr ndescr sb!vm:word-shift)
- (inst subi ndescr ndescr sb!vm:other-pointer-lowtag)
+ (loadw ndescr code 0 other-pointer-lowtag)
+ (inst srwi ndescr ndescr n-widetag-bits)
+ (inst slwi ndescr ndescr word-shift)
+ (inst subi ndescr ndescr other-pointer-lowtag)
(inst add sap code ndescr)))
(define-vop (compute-fun)
(:args (code :scs (descriptor-reg))
- (offset :scs (signed-reg unsigned-reg)))
+ (offset :scs (signed-reg unsigned-reg)))
(:arg-types * positive-fixnum)
(:results (func :scs (descriptor-reg)))
(:temporary (:scs (non-descriptor-reg)) ndescr)
(:generator 10
- (loadw ndescr code 0 sb!vm:other-pointer-lowtag)
- (inst srwi ndescr ndescr sb!vm:n-widetag-bits)
- (inst slwi ndescr ndescr sb!vm:word-shift)
+ (loadw ndescr code 0 other-pointer-lowtag)
+ (inst srwi ndescr ndescr n-widetag-bits)
+ (inst slwi ndescr ndescr word-shift)
(inst add ndescr ndescr offset)
- (inst addi ndescr ndescr (- sb!vm:fun-pointer-lowtag sb!vm:other-pointer-lowtag))
+ (inst addi ndescr ndescr (- fun-pointer-lowtag other-pointer-lowtag))
(inst add func code ndescr)))
;;;; Other random VOPs.
-(defknown sb!unix::do-pending-interrupt () (values))
-(define-vop (sb!unix::do-pending-interrupt)
+(defknown sb!unix::receive-pending-interrupt () (values))
+(define-vop (sb!unix::receive-pending-interrupt)
(:policy :fast-safe)
- (:translate sb!unix::do-pending-interrupt)
+ (:translate sb!unix::receive-pending-interrupt)
(:generator 1
(inst unimp pending-interrupt-trap)))
(define-vop (halt)
(:generator 1
(inst unimp halt-trap)))
-
-
\f
;;;; Dynamic vop count collection support
(:temporary (:scs (non-descriptor-reg)) count)
(:generator 1
(let ((offset
- (- (* (+ index vector-data-offset) n-word-bytes) other-pointer-lowtag)))
- (assert (typep offset '(signed-byte 16)))
+ (- (* (+ index vector-data-offset) n-word-bytes) other-pointer-lowtag)))
+ (aver (typep offset '(signed-byte 16)))
(inst lwz count count-vector offset)
(inst addi count count 1)
(inst stw count count-vector offset))))