Update of /cvsroot/sbcl/sbcl/src/compiler/mips
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv28442/src/compiler/mips
Modified Files:
Tag: lutex-branch
show.lisp macros.lisp debug.lisp c-call.lisp array.lisp
Log Message:
0.9.12.26.lutex-branch.33
* merging 0.9.12.26 changes onto the lutex branch
Index: show.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/show.lisp,v
retrieving revision 1.3
retrieving revision 1.3.4.1
diff -u -d -r1.3 -r1.3.4.1
--- show.lisp 8 Sep 2005 08:04:48 -0000 1.3
+++ show.lisp 15 May 2006 17:07:51 -0000 1.3.4.1
@@ -27,8 +27,8 @@
(move nl0 object)
(inst li cfunc (make-fixup "debug_print" :foreign))
(inst jal (make-fixup "call_into_c" :foreign))
- (inst addu nsp-tn nsp-tn -16)
- (inst addu nsp-tn nsp-tn 16)
+ (inst subu nsp-tn 16)
+ (inst addu nsp-tn 16)
(when cur-nfp
(load-stack-tn cur-nfp nfp-save))
(move result nl0))))
Index: macros.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/macros.lisp,v
retrieving revision 1.15
retrieving revision 1.15.4.1
diff -u -d -r1.15 -r1.15.4.1
--- macros.lisp 28 Sep 2005 15:10:40 -0000 1.15
+++ macros.lisp 15 May 2006 17:07:51 -0000 1.15.4.1
@@ -296,9 +296,8 @@
(:results (value :scs ,scs))
(:result-types ,el-type)
(:generator 5
- (inst add lip object index)
- (inst lw value lip (- (* ,offset n-word-bytes) ,lowtag))
- (inst nop)))
+ (inst addu lip object index)
+ (loadw value lip ,offset ,lowtag)))
(define-vop (,(symbolicate name "-C"))
,@(when translate
`((:translate ,translate)))
@@ -311,8 +310,7 @@
(:results (value :scs ,scs))
(:result-types ,el-type)
(:generator 4
- (inst lw value object (- (* (+ ,offset index) n-word-bytes) ,lowtag))
- (inst nop)))))
+ (loadw value object (+ ,offset index) ,lowtag)))))
(defmacro define-full-setter (name type offset lowtag scs el-type
&optional translate)
@@ -329,8 +327,8 @@
(:results (result :scs ,scs))
(:result-types ,el-type)
(:generator 2
- (inst add lip object index)
- (inst sw value lip (- (* ,offset n-word-bytes) ,lowtag))
+ (inst addu lip object index)
+ (storew value lip ,offset ,lowtag)
(move result value)))
(define-vop (,(symbolicate name "-C"))
,@(when translate
@@ -346,7 +344,7 @@
(:results (result :scs ,scs))
(:result-types ,el-type)
(:generator 1
- (inst sw value object (- (* (+ ,offset index) n-word-bytes) ,lowtag))
+ (storew value object (+ ,offset index) ,lowtag)
(move result value)))))
Index: debug.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/debug.lisp,v
retrieving revision 1.4
retrieving revision 1.4.4.1
diff -u -d -r1.4 -r1.4.4.1
--- debug.lisp 7 Sep 2005 23:04:46 -0000 1.4
+++ debug.lisp 15 May 2006 17:07:51 -0000 1.4.4.1
@@ -1,8 +1,19 @@
+;;;; MIPS compiler support for the debugger
+
+;;;; 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")
(define-vop (debug-cur-sp)
- (:translate current-sp)
+ (:translate sb!di::current-sp)
(:policy :fast-safe)
(:results (res :scs (sap-reg)))
(:result-types system-area-pointer)
@@ -10,7 +21,7 @@
(move res csp-tn)))
(define-vop (debug-cur-fp)
- (:translate current-fp)
+ (:translate sb!di::current-fp)
(:policy :fast-safe)
(:results (res :scs (sap-reg)))
(:result-types system-area-pointer)
@@ -18,7 +29,7 @@
(move res cfp-tn)))
(define-vop (read-control-stack)
- (:translate stack-ref)
+ (:translate sb!kernel:stack-ref)
(:policy :fast-safe)
(:args (object :scs (sap-reg) :target sap)
(offset :scs (any-reg)))
@@ -32,7 +43,7 @@
(inst nop)))
(define-vop (read-control-stack-c)
- (:translate stack-ref)
+ (:translate sb!kernel:stack-ref)
(:policy :fast-safe)
(:args (object :scs (sap-reg)))
(:info offset)
@@ -44,7 +55,7 @@
(inst nop)))
(define-vop (write-control-stack)
- (:translate %set-stack-ref)
+ (:translate sb!kernel:%set-stack-ref)
(:policy :fast-safe)
(:args (object :scs (sap-reg) :target sap)
(offset :scs (any-reg))
@@ -95,16 +106,16 @@
(move code null-tn t)))))
(define-vop (code-from-lra code-from-mumble)
- (:translate lra-code-header)
+ (:translate sb!di::lra-code-header)
(:variant other-pointer-lowtag))
(define-vop (code-from-fun code-from-mumble)
- (:translate fun-code-header)
+ (:translate sb!di::fun-code-header)
(:variant fun-pointer-lowtag))
(define-vop (make-lisp-obj)
(:policy :fast-safe)
- (:translate make-lisp-obj)
+ (:translate sb!di::make-lisp-obj)
(:args (value :scs (unsigned-reg) :target result))
(:arg-types unsigned-num)
(:results (result :scs (descriptor-reg)))
@@ -113,7 +124,7 @@
(define-vop (get-lisp-obj-address)
(:policy :fast-safe)
- (:translate get-lisp-obj-address)
+ (:translate sb!di::get-lisp-obj-address)
(:args (thing :scs (descriptor-reg) :target result))
(:results (result :scs (unsigned-reg)))
(:result-types unsigned-num)
@@ -122,7 +133,7 @@
(define-vop (fun-word-offset)
(:policy :fast-safe)
- (:translate fun-word-offset)
+ (:translate sb!di::fun-word-offset)
(:args (fun :scs (descriptor-reg)))
(:results (res :scs (unsigned-reg)))
(:result-types positive-fixnum)
Index: c-call.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/c-call.lisp,v
retrieving revision 1.8
retrieving revision 1.8.4.1
diff -u -d -r1.8 -r1.8.4.1
--- c-call.lisp 29 Sep 2005 06:45:08 -0000 1.8
+++ c-call.lisp 15 May 2006 17:07:51 -0000 1.8.4.1
@@ -167,8 +167,8 @@
;; 64-bit long long types are stored in
;; consecutive locations, endian word order,
;; aligned to 8 bytes.
- (if (oddp (length (new-args)))
- (new-args nil))
+ (when (oddp (length (new-args)))
+ (new-args nil))
#!-little-endian
(progn (new-args `(ash ,arg -32))
(new-args `(logand ,arg #xffffffff))
@@ -295,3 +295,162 @@
(t
(inst li temp delta)
(inst addu nsp-tn temp)))))))
+
+#-sb-xc-host
+(defun alien-callback-accessor-form (type sap offset)
+ (let ((parsed-type type))
+ (if (alien-integer-type-p parsed-type)
+ (let ((bits (sb!alien::alien-integer-type-bits parsed-type)))
+ (let ((byte-offset
+ (cond ((< bits n-word-bits)
+ (- n-word-bytes
+ (ceiling bits n-byte-bits)))
+ (t 0))))
+ `(deref (sap-alien (sap+ ,sap
+ ,(+ byte-offset offset))
+ (* ,type)))))
+ `(deref (sap-alien (sap+ ,sap ,offset) (* ,type))))))
+
+;;; Returns a vector in static space containing machine code for the
+;;; callback wrapper
+#-sb-xc-host
+(defun alien-callback-assembler-wrapper (index result-type argument-types)
+ "Cons up a piece of code which calls enter-alien-callback with INDEX
+and a pointer to the arguments."
+ (flet ((make-gpr (n)
+ (make-random-tn :kind :normal :sc (sc-or-lose 'any-reg) :offset n))
+ (make-fpr (n)
+ (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg) :offset n)))
+ (let* ((segment (make-segment))
+ (n-argument-words
+ (mapcar (lambda (arg) (ceiling (alien-type-bits arg) n-word-bits))
+ argument-types))
+ (n-linkage-area-bytes 8)
+ (n-return-area-words
+ (ceiling (or (alien-type-bits result-type) 0) n-word-bits))
+ (n-return-area-bytes (* n-return-area-words n-word-bytes))
+ (n-callee-register-args-bytes 16)
+ (n-frame-bytes (logandc2 (+ n-linkage-area-bytes
+ n-return-area-bytes
+ n-callee-register-args-bytes
+ 7)
+ 7))
+ (words-processed 0)
+ (int-seen)
+ (gprs (mapcar #'make-gpr '(4 5 6 7)))
+ (fprs (mapcar #'make-fpr '(12 14))))
+ (flet ((save-arg (type words)
+ (let ((offset (* words-processed n-word-bytes)))
+ (cond ((not (alien-float-type-p type))
+ (when (and (alien-integer-type-p type)
+ (> (sb!alien::alien-integer-type-bits type)
+ n-word-bits)
+ (oddp words-processed))
+ (pop gprs)
+ (incf words-processed)
+ (incf offset n-word-bytes))
+ (when gprs
+ (loop repeat words
+ for gpr = (pop gprs)
+ when gpr do
+ (inst sw gpr nsp-tn offset)
+ do
+ (setf int-seen t)
+ (incf words-processed)
+ (incf offset n-word-bytes))))
+ ((alien-single-float-type-p type)
+ (when gprs
+ (let ((gpr (pop gprs))
+ (fpr (pop fprs)))
+ (if int-seen
+ (when gpr (inst sw gpr nsp-tn offset))
+ (when fpr (inst swc1 fpr nsp-tn offset))))
+ (incf words-processed)))
+ ((alien-double-float-type-p type)
+ (when (oddp words-processed)
+ (pop gprs)
+ (incf words-processed)
+ (incf offset n-word-bytes))
+ (when gprs
+ (let* ((gpr1 (pop gprs))
+ (gpr2 (pop gprs))
+ (fpr (pop fprs)))
+ (if int-seen
+ (when gpr1
+ (ecase *backend-byte-order*
+ (:big-endian
+ (inst sw gpr1 nsp-tn offset)
+ (inst sw gpr2 nsp-tn (+ offset n-word-bytes)))
+ (:little-endian
+ (inst sw gpr2 nsp-tn offset)
+ (inst sw gpr1 nsp-tn (+ offset n-word-bytes)))))
+ (when fpr
+ (ecase *backend-byte-order*
+ (:big-endian
+ (inst swc1 fpr nsp-tn offset)
+ (inst swc1-odd fpr nsp-tn (+ offset n-word-bytes)))
+ (:little-endian
+ (inst swc1-odd fpr nsp-tn offset)
+ (inst swc1 fpr nsp-tn (+ offset n-word-bytes)))))))
+ (incf words-processed 2)))
+ (t
+ (bug "Unknown alien floating point type: ~S" type))))))
+ (assemble (segment)
+ (mapc #'save-arg argument-types n-argument-words)
+ ;; funcall3 (enter-alien-callback, index, args, return-area)
+ ;;
+ ;; INDEX is fixnumized, ARGS and RETURN-AREA don't need to be
+ ;; because they're word-aligned. Kinda gross, but hey ...
+ (destructuring-bind (v0 v1 a0 a1 a2 a3 t9 gp sp ra)
+ (mapcar #'make-gpr '(2 3 4 5 6 7 25 28 29 31))
+ ;; Allocate stack frame.
+ (inst subu sp n-frame-bytes)
+
+ ;; Save GP and RA.
+ (inst sw gp sp (- n-frame-bytes (* 2 n-word-bytes)))
+ (inst sw ra sp (- n-frame-bytes n-word-bytes))
+
+ ;; Setup the args and make the call.
+ (inst li a0 (get-lisp-obj-address #'enter-alien-callback))
+ (inst li t9 (foreign-symbol-address "funcall3"))
+ (inst li a1 (fixnumize index))
+ (inst addu a2 sp n-frame-bytes)
+ (inst jal t9)
+ (inst addu a3 sp n-callee-register-args-bytes)
+
+ ;; We're back! Restore GP.
+ (inst lw gp sp (- n-frame-bytes (* 2 n-word-bytes)))
+
+ ;; Load the return value.
+ (cond
+ ((alien-single-float-type-p result-type)
+ (inst lwc1 (make-fpr 0) sp n-callee-register-args-bytes))
+ ((alien-double-float-type-p result-type)
+ (inst lwc1 (make-fpr 0) sp n-callee-register-args-bytes)
+ (inst lwc1 (make-fpr 1) sp (+ n-callee-register-args-bytes
+ n-word-bytes)))
+ ((and (alien-integer-type-p result-type)
+ (> (sb!alien::alien-integer-type-bits result-type)
+ n-word-bits))
+ (inst lw v0 sp n-callee-register-args-bytes)
+ (inst lw v1 sp (+ n-callee-register-args-bytes n-word-bytes)))
+ ((or (alien-integer-type-p result-type)
+ (alien-pointer-type-p result-type)
+ (alien-type-= #.(parse-alien-type 'system-area-pointer nil)
+ result-type))
+ (inst lw v0 sp n-callee-register-args-bytes))
+ ((alien-void-type-p result-type))
+ (t
+ (error "unrecognized alien type: ~A" result-type)))
+
+ ;; Restore RA, free stack frame, and return.
+ (inst lw ra sp (- n-frame-bytes n-word-bytes))
+ (inst j ra)
+ (inst addu sp n-frame-bytes))))
+ (finalize-segment segment)
+ ;; Now that the segment is done, convert it to a static
+ ;; vector we can point foreign code to.
+ (let ((buffer (sb!assem::segment-buffer segment)))
+ (make-static-vector (length buffer)
+ :element-type '(unsigned-byte 8)
+ :initial-contents buffer)))))
Index: array.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/array.lisp,v
retrieving revision 1.11
retrieving revision 1.11.4.1
diff -u -d -r1.11 -r1.11.4.1
--- array.lisp 7 Sep 2005 23:06:19 -0000 1.11
+++ array.lisp 15 May 2006 17:07:51 -0000 1.11.4.1
@@ -138,13 +138,13 @@
(def-full-data-vector-frobs simple-array-signed-byte-32 signed-num
signed-reg))
-;;; Integer vectors whos elements are smaller than a byte. I.e. bit, 2-bit,
+;;; Integer vectors whose elements are smaller than a byte. I.e. bit, 2-bit,
;;; and 4-bit vectors.
(macrolet ((def-small-data-vector-frobs (type bits)
(let* ((elements-per-word (floor n-word-bits bits))
(bit-shift (1- (integer-length elements-per-word))))
`(progn
- (define-vop (,(symbolicate 'data-vector-ref/ type))
+ (define-vop (,(symbolicate 'DATA-VECTOR-REF/ type))
(:note "inline array access")
(:translate data-vector-ref)
(:policy :fast-safe)
@@ -170,7 +170,7 @@
(inst srl result temp)
(inst and result ,(1- (ash 1 bits)))
(inst sll value result n-fixnum-tag-bits)))
- (define-vop (,(symbolicate 'data-vector-ref-c/ type))
+ (define-vop (,(symbolicate 'DATA-VECTOR-REF-C/ type))
(:translate data-vector-ref)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg)))
@@ -195,7 +195,7 @@
(inst srl result (* extra ,bits)))
(unless (= extra ,(1- elements-per-word))
(inst and result ,(1- (ash 1 bits)))))))
- (define-vop (,(symbolicate 'data-vector-set/ type))
+ (define-vop (,(symbolicate 'DATA-VECTOR-SET/ type))
(:note "inline array store")
(:translate data-vector-set)
(:policy :fast-safe)
@@ -244,7 +244,7 @@
(move result zero-tn))
(unsigned-reg
(move result value)))))
- (define-vop (,(symbolicate 'data-vector-set-c/ type))
+ (define-vop (,(symbolicate 'DATA-VECTOR-SET-C/ type))
(:translate data-vector-set)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
|