Skip to content
Snippets Groups Projects
Commit 1fea054f authored by rtoy's avatar rtoy
Browse files

Revert the previous change to fix debug:arg/trace issue. Instead, use

Carl's suggestion and define new SC numbers for the xmm registers
instead of overloading the x87 fpu registers and the xmm register
SC's.

bootfiles/20a/boot-2010-06-cross-x86.lisp:
o New file needed for cross-compiling this change.

code/x86-vm.lisp:
o Revert previous change.

compiler/x86/sse2-c-call.lisp:
o Use xmm0-tn instead of fr0-tn.  No functional change, but makes the
  code more readable.

compiler/x86/vm.lisp:
o Increase the number of float registers from 8 to 16 (8 more for SSE2
  registers).
o Define new xmm<n> registers
o Update the locations with the new sse2 SC locations for single-reg,
  double-reg, double-double-reg, complex-single-reg,
  complex-double-reg, and complex-double-double-reg storage classes.

lisp/Darwin-os.c:
o Revert previous change.
o Update os_sigcontext_fpu_reg to support the xmm registers.

lisp/Linux-os.c:
o Update os_sigcontext_fpu_reg to support the xmm registers.
parent ac9b6803
Branches
Tags
No related merge requests found
#+x86
(load "target:tools/cross-scripts/cross-x86-x86")
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; Scott Fahlman or slisp-group@cs.cmu.edu.
;;; ;;;
(ext:file-comment (ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/x86-vm.lisp,v 1.36 2010/06/22 03:24:49 rtoy Exp $") "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/x86-vm.lisp,v 1.37 2010/06/22 15:35:23 rtoy Exp $")
;;; ;;;
;;; ********************************************************************** ;;; **********************************************************************
;;; ;;;
...@@ -250,7 +250,6 @@ ...@@ -250,7 +250,6 @@
;;; Like SIGCONTEXT-REGISTER, but returns the value of a float register. ;;; Like SIGCONTEXT-REGISTER, but returns the value of a float register.
;;; Format is the type of float to return. ;;; Format is the type of float to return.
;;; ;;;
#-(and sse2 (or darwin))
(defun sigcontext-float-register (scp index format) (defun sigcontext-float-register (scp index format)
(declare (type (alien (* sigcontext)) scp)) (declare (type (alien (* sigcontext)) scp))
(let ((fn (extern-alien "os_sigcontext_fpu_reg" (let ((fn (extern-alien "os_sigcontext_fpu_reg"
...@@ -259,16 +258,6 @@ ...@@ -259,16 +258,6 @@
(integer 32))))) (integer 32)))))
(coerce (sap-ref-long (alien-funcall fn scp index) 0) format))) (coerce (sap-ref-long (alien-funcall fn scp index) 0) format)))
#+(and sse2 (or darwin))
(defun sigcontext-float-register (scp index format)
(declare (type (alien (* sigcontext)) scp))
(let ((fn (extern-alien "os_sigcontext_fpu_reg_sse2"
(function system-area-pointer
(* sigcontext)
(integer 32)))))
(if (eq format 'double-float)
(coerce (sap-ref-double (alien-funcall fn scp index) 0) format)
(coerce (sap-ref-single (alien-funcall fn scp index) 0) format))))
;;; ;;;
(defun %set-sigcontext-float-register (scp index format new) (defun %set-sigcontext-float-register (scp index format new)
(declare (type (alien (* sigcontext)) scp)) (declare (type (alien (* sigcontext)) scp))
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; Scott Fahlman or slisp-group@cs.cmu.edu.
;;; ;;;
(ext:file-comment (ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/sse2-c-call.lisp,v 1.3 2010/03/19 15:19:01 rtoy Exp $") "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/sse2-c-call.lisp,v 1.4 2010/06/22 15:35:23 rtoy Exp $")
;;; ;;;
;;; ********************************************************************** ;;; **********************************************************************
;;; ;;;
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
;; call_into_c as arranged for ST(0) to contain the result. ;; call_into_c as arranged for ST(0) to contain the result.
;; Move it to XMM0. ;; Move it to XMM0.
(inst fstd (ea-for-df-stack temp)) (inst fstd (ea-for-df-stack temp))
(inst movsd fr0-tn (ea-for-df-stack temp)))) (inst movsd xmm0-tn (ea-for-df-stack temp))))
(t (t
;; Setup the NPX for C; all the FP registers need to be ;; Setup the NPX for C; all the FP registers need to be
;; empty; pop them all. ;; empty; pop them all.
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
(inst fxch fr7-tn) ; move the result back to fr0 (inst fxch fr7-tn) ; move the result back to fr0
;; Move the result into xmm0. ;; Move the result into xmm0.
(inst fstd (ea-for-df-stack temp)) (inst fstd (ea-for-df-stack temp))
(inst movsd fr0-tn (ea-for-df-stack temp))) (inst movsd xmm0-tn (ea-for-df-stack temp)))
(t (t
;; Fill up the last x87 register ;; Fill up the last x87 register
(inst fldz))))))) (inst fldz)))))))
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; Scott Fahlman or slisp-group@cs.cmu.edu.
;;; ;;;
(ext:file-comment (ext:file-comment
"$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/vm.lisp,v 1.15 2010/03/19 15:19:01 rtoy Exp $") "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/vm.lisp,v 1.16 2010/06/22 15:35:23 rtoy Exp $")
;;; ;;;
;;; ********************************************************************** ;;; **********************************************************************
;;; ;;;
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
;;; added by jrd ;;; added by jrd
(eval-when (compile load eval) (eval-when (compile load eval)
(defvar *float-register-names* (make-array 8 :initial-element nil))) (defvar *float-register-names* (make-array #-sse2 8 #+sse2 16 :initial-element nil)))
(defreg fr0 0 :float) (defreg fr0 0 :float)
(defreg fr1 1 :float) (defreg fr1 1 :float)
(defreg fr2 2 :float) (defreg fr2 2 :float)
...@@ -105,7 +105,17 @@ ...@@ -105,7 +105,17 @@
(defreg fr5 5 :float) (defreg fr5 5 :float)
(defreg fr6 6 :float) (defreg fr6 6 :float)
(defreg fr7 7 :float) (defreg fr7 7 :float)
(defregset float-regs fr0 fr1 fr2 fr3 fr4 fr5 fr6 fr7) (defreg xmm0 8 :float)
(defreg xmm1 9 :float)
(defreg xmm2 10 :float)
(defreg xmm3 11 :float)
(defreg xmm4 12 :float)
(defreg xmm5 13 :float)
(defreg xmm6 14 :float)
(defreg xmm7 15 :float)
(defregset float-regs
fr0 fr1 fr2 fr3 fr4 fr5 fr6 fr7
xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7)
;;;; SB definitions. ;;;; SB definitions.
...@@ -124,7 +134,7 @@ ...@@ -124,7 +134,7 @@
;;; sense to use the 387's idea of a stack. 8 separate registers is easier ;;; sense to use the 387's idea of a stack. 8 separate registers is easier
;;; to deal with. ;;; to deal with.
;;; (define-storage-base float-registers :finite :size 1) ;;; (define-storage-base float-registers :finite :size 1)
(define-storage-base float-registers :finite :size 8) (define-storage-base float-registers :finite :size #-sse2 8 #+sse2 16)
(define-storage-base stack :unbounded :size 8) (define-storage-base stack :unbounded :size 8)
(define-storage-base constant :non-packed) (define-storage-base constant :non-packed)
...@@ -258,14 +268,14 @@ ...@@ -258,14 +268,14 @@
;; Non-Descriptor single-floats. ;; Non-Descriptor single-floats.
(single-reg float-registers (single-reg float-registers
:locations (0 1 2 3 4 5 6 7) :locations #-sse2 (0 1 2 3 4 5 6 7) #+sse2 (8 9 10 11 12 13 14 15)
:constant-scs (fp-constant) :constant-scs (fp-constant)
:save-p t :save-p t
:alternate-scs (single-stack)) :alternate-scs (single-stack))
;; Non-Descriptor double-floats. ;; Non-Descriptor double-floats.
(double-reg float-registers (double-reg float-registers
:locations (0 1 2 3 4 5 6 7) :locations #-sse2 (0 1 2 3 4 5 6 7) #+sse2 (8 9 10 11 12 13 14 15)
:constant-scs (fp-constant) :constant-scs (fp-constant)
:save-p t :save-p t
:alternate-scs (double-stack)) :alternate-scs (double-stack))
...@@ -280,21 +290,21 @@ ...@@ -280,21 +290,21 @@
#+double-double #+double-double
(double-double-reg float-registers (double-double-reg float-registers
:locations (0 2 4 6) :locations #-sse2 (0 2 4 6) #+sse2 (8 10 12 14)
:element-size 2 :element-size 2
:constant-scs () :constant-scs ()
:save-p t :save-p t
:alternate-scs (double-double-stack)) :alternate-scs (double-double-stack))
(complex-single-reg float-registers (complex-single-reg float-registers
:locations #-sse2 (0 2 4 6) #+sse2 (0 1 2 3 4 5 6 7) :locations #-sse2 (0 2 4 6) #+sse2 (8 9 10 11 12 13 14 15)
:element-size #-sse2 2 #+sse2 1 :element-size #-sse2 2 #+sse2 1
:constant-scs () :constant-scs ()
:save-p t :save-p t
:alternate-scs (complex-single-stack)) :alternate-scs (complex-single-stack))
(complex-double-reg float-registers (complex-double-reg float-registers
:locations #-sse2 (0 2 4 6) #+sse2 (0 1 2 3 4 5 6 7) :locations #-sse2 (0 2 4 6) #+sse2 (8 9 10 11 12 13 14 15)
:element-size #-sse2 2 #+sse2 1 :element-size #-sse2 2 #+sse2 1
:constant-scs () :constant-scs ()
:save-p t :save-p t
...@@ -309,7 +319,7 @@ ...@@ -309,7 +319,7 @@
:alternate-scs (complex-long-stack)) :alternate-scs (complex-long-stack))
#+double-double #+double-double
(complex-double-double-reg float-registers (complex-double-double-reg float-registers
:locations (0 4) :locations #-sse2 (0 4) #+sse2 (8 12)
:element-size 4 :element-size 4
:constant-scs () :constant-scs ()
:save-p t :save-p t
...@@ -359,7 +369,9 @@ ...@@ -359,7 +369,9 @@
(def-random-reg-tns byte-reg al ah bl bh cl ch dl dh) (def-random-reg-tns byte-reg al ah bl bh cl ch dl dh)
;; added by jrd ;; added by jrd
(def-random-reg-tns single-reg fr0 fr1 fr2 fr3 fr4 fr5 fr6 fr7) (def-random-reg-tns single-reg
fr0 fr1 fr2 fr3 fr4 fr5 fr6 fr7
xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7)
;; Added by pw. ;; Added by pw.
...@@ -454,8 +466,14 @@ ...@@ -454,8 +466,14 @@
(< -1 offset (length name-vec)) (< -1 offset (length name-vec))
(svref name-vec offset)) (svref name-vec offset))
(format nil "<Unknown Reg: off=~D, sc=~A>" offset sc-name)))) (format nil "<Unknown Reg: off=~D, sc=~A>" offset sc-name))))
(float-registers (format nil #-sse2 "FR~D" #+sse2 "XMM~D" (float-registers
offset)) #-sse2
(format nil "FR~D" offset)
#+sse2
(format nil (if (< offset 8)
"FR~D"
"XMM~D")
offset))
(stack (format nil "S~D" offset)) (stack (format nil "S~D" offset))
(constant (format nil "Const~D" offset)) (constant (format nil "Const~D" offset))
(immediate-constant "Immed") (immediate-constant "Immed")
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* Frobbed for OpenBSD by Pierre R. Mai, 2001. * Frobbed for OpenBSD by Pierre R. Mai, 2001.
* Frobbed for Darwin by Pierre R. Mai, 2003. * Frobbed for Darwin by Pierre R. Mai, 2003.
* *
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Darwin-os.c,v 1.28 2010/06/22 03:24:49 rtoy Exp $ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Darwin-os.c,v 1.29 2010/06/22 15:35:23 rtoy Exp $
* *
*/ */
...@@ -285,35 +285,25 @@ os_sigcontext_fpu_reg(ucontext_t *scp, int index) ...@@ -285,35 +285,25 @@ os_sigcontext_fpu_reg(ucontext_t *scp, int index)
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm6; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm6;
case 7: case 7:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7;
} case 8:
return NULL;
}
#ifdef FEATURE_SSE2
unsigned char *
os_sigcontext_fpu_reg_sse2(ucontext_t *scp, int index)
{
switch (index) {
case 0:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm0; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm0;
case 1: case 9:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm1; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm1;
case 2: case 10:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm2; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm2;
case 3: case 11:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm3; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm3;
case 4: case 12:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm4; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm4;
case 5: case 13:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm5; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm5;
case 6: case 14:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm6; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm6;
case 7: case 15:
return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7; return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7;
} }
return NULL; return NULL;
} }
#endif
unsigned int unsigned int
os_sigcontext_fpu_modes(ucontext_t *scp) os_sigcontext_fpu_modes(ucontext_t *scp)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* GENCGC support by Douglas Crosher, 1996, 1997. * GENCGC support by Douglas Crosher, 1996, 1997.
* Alpha support by Julian Dolby, 1999. * Alpha support by Julian Dolby, 1999.
* *
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.48 2010/02/01 16:04:43 rtoy Exp $ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.49 2010/06/22 15:35:23 rtoy Exp $
* *
*/ */
...@@ -185,12 +185,20 @@ unsigned char * ...@@ -185,12 +185,20 @@ unsigned char *
os_sigcontext_fpu_reg(ucontext_t *scp, int offset) os_sigcontext_fpu_reg(ucontext_t *scp, int offset)
{ {
fpregset_t fpregs = scp->uc_mcontext.fpregs; fpregset_t fpregs = scp->uc_mcontext.fpregs;
unsigned char *reg = NULL;
if (fpregs == NULL) {
return NULL; if (fpregs) {
} else { if (offset < 8) {
return (unsigned char *) &fpregs->_st[offset]; reg = (unsigned char *) &fpregs->_st[offset];
} else {
struct _fpstate *fpstate;
fpstate = (struct _fpstate*) scp->uc_mcontext.fpregs;
if (fpstate->magic != 0xffff) {
reg = (unsigned char *) &fpstate->_xmm[offset - 8];
}
}
} }
return reg;
} }
unsigned int unsigned int
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment