From 1fea054faa7cb8605e2d5bc8c5ccd9db9dfc6a09 Mon Sep 17 00:00:00 2001 From: rtoy <rtoy> Date: Tue, 22 Jun 2010 15:35:23 +0000 Subject: [PATCH] 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. --- bootfiles/20a/boot-2010-06-cross-x86.lisp | 2 ++ code/x86-vm.lisp | 13 +------ compiler/x86/sse2-c-call.lisp | 6 ++-- compiler/x86/vm.lisp | 44 ++++++++++++++++------- lisp/Darwin-os.c | 28 +++++---------- lisp/Linux-os.c | 20 +++++++---- 6 files changed, 60 insertions(+), 53 deletions(-) create mode 100644 bootfiles/20a/boot-2010-06-cross-x86.lisp diff --git a/bootfiles/20a/boot-2010-06-cross-x86.lisp b/bootfiles/20a/boot-2010-06-cross-x86.lisp new file mode 100644 index 000000000..f47a35195 --- /dev/null +++ b/bootfiles/20a/boot-2010-06-cross-x86.lisp @@ -0,0 +1,2 @@ +#+x86 +(load "target:tools/cross-scripts/cross-x86-x86") diff --git a/code/x86-vm.lisp b/code/x86-vm.lisp index 9f09115a4..d785a7e9f 100644 --- a/code/x86-vm.lisp +++ b/code/x86-vm.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (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 @@ ;;; Like SIGCONTEXT-REGISTER, but returns the value of a float register. ;;; Format is the type of float to return. ;;; -#-(and sse2 (or darwin)) (defun sigcontext-float-register (scp index format) (declare (type (alien (* sigcontext)) scp)) (let ((fn (extern-alien "os_sigcontext_fpu_reg" @@ -259,16 +258,6 @@ (integer 32))))) (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) (declare (type (alien (* sigcontext)) scp)) diff --git a/compiler/x86/sse2-c-call.lisp b/compiler/x86/sse2-c-call.lisp index daeaaa0da..7bfaded3f 100644 --- a/compiler/x86/sse2-c-call.lisp +++ b/compiler/x86/sse2-c-call.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (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 @@ ;; call_into_c as arranged for ST(0) to contain the result. ;; Move it to XMM0. (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 ;; Setup the NPX for C; all the FP registers need to be ;; empty; pop them all. @@ -72,7 +72,7 @@ (inst fxch fr7-tn) ; move the result back to fr0 ;; Move the result into xmm0. (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 ;; Fill up the last x87 register (inst fldz))))))) diff --git a/compiler/x86/vm.lisp b/compiler/x86/vm.lisp index 480d7f6b8..b8d185877 100644 --- a/compiler/x86/vm.lisp +++ b/compiler/x86/vm.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (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 @@ ;;; added by jrd (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 fr1 1 :float) (defreg fr2 2 :float) @@ -105,7 +105,17 @@ (defreg fr5 5 :float) (defreg fr6 6 :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. @@ -124,7 +134,7 @@ ;;; sense to use the 387's idea of a stack. 8 separate registers is easier ;;; to deal with. ;;; (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 constant :non-packed) @@ -258,14 +268,14 @@ ;; Non-Descriptor single-floats. (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) :save-p t :alternate-scs (single-stack)) ;; Non-Descriptor double-floats. (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) :save-p t :alternate-scs (double-stack)) @@ -280,21 +290,21 @@ #+double-double (double-double-reg float-registers - :locations (0 2 4 6) + :locations #-sse2 (0 2 4 6) #+sse2 (8 10 12 14) :element-size 2 :constant-scs () :save-p t :alternate-scs (double-double-stack)) (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 :constant-scs () :save-p t :alternate-scs (complex-single-stack)) (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 :constant-scs () :save-p t @@ -309,7 +319,7 @@ :alternate-scs (complex-long-stack)) #+double-double (complex-double-double-reg float-registers - :locations (0 4) + :locations #-sse2 (0 4) #+sse2 (8 12) :element-size 4 :constant-scs () :save-p t @@ -359,7 +369,9 @@ (def-random-reg-tns byte-reg al ah bl bh cl ch dl dh) ;; 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. @@ -454,8 +466,14 @@ (< -1 offset (length name-vec)) (svref name-vec offset)) (format nil "<Unknown Reg: off=~D, sc=~A>" offset sc-name)))) - (float-registers (format nil #-sse2 "FR~D" #+sse2 "XMM~D" - offset)) + (float-registers + #-sse2 + (format nil "FR~D" offset) + #+sse2 + (format nil (if (< offset 8) + "FR~D" + "XMM~D") + offset)) (stack (format nil "S~D" offset)) (constant (format nil "Const~D" offset)) (immediate-constant "Immed") diff --git a/lisp/Darwin-os.c b/lisp/Darwin-os.c index 30db779cd..553b91919 100644 --- a/lisp/Darwin-os.c +++ b/lisp/Darwin-os.c @@ -14,7 +14,7 @@ * Frobbed for OpenBSD by Pierre R. Mai, 2001. * 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) return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm6; case 7: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7; - } - return NULL; -} - -#ifdef FEATURE_SSE2 -unsigned char * -os_sigcontext_fpu_reg_sse2(ucontext_t *scp, int index) -{ - switch (index) { - case 0: + case 8: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm0; - case 1: + case 9: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm1; - case 2: + case 10: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm2; - case 3: + case 11: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm3; - case 4: + case 12: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm4; - case 5: + case 13: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm5; - case 6: + case 14: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_xmm6; - case 7: + case 15: return (unsigned char *) &scp->uc_mcontext->__fs.__fpu_stmm7; } return NULL; } -#endif unsigned int os_sigcontext_fpu_modes(ucontext_t *scp) diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c index 5758466a6..9c75bf7d7 100644 --- a/lisp/Linux-os.c +++ b/lisp/Linux-os.c @@ -15,7 +15,7 @@ * GENCGC support by Douglas Crosher, 1996, 1997. * 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 * os_sigcontext_fpu_reg(ucontext_t *scp, int offset) { fpregset_t fpregs = scp->uc_mcontext.fpregs; - - if (fpregs == NULL) { - return NULL; - } else { - return (unsigned char *) &fpregs->_st[offset]; + unsigned char *reg = NULL; + + if (fpregs) { + if (offset < 8) { + 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 -- GitLab