Raymond Toy pushed to branch rtoy-mmap-anon-control-and-binding-stacks at cmucl / cmucl
Commits:
f7e92b73 by Raymond Toy at 2015-11-10T21:39:15Z
Rename arguments to RENAME-PACKAGE and update docstring
Can't ever remember the order of arguments for RENAME-PACKAGE so just
rename the variables to make it clearer. And update the docstring to
be a little more verbose.
- - - - -
5d3a63fa by Raymond Toy at 2015-11-28T16:43:54Z
Support constant shifts for bignum digits.
This gets rid of the load of the shift amount to ecx, saving one
instruction and reducing pressure on the ecx register.
- - - - -
a613a908 by Raymond Toy at 2015-11-28T16:45:41Z
Regenerated (due to docstring change for rename-package).
- - - - -
1b8b84be by Raymond Toy at 2015-12-01T21:41:49Z
Handle large (fixed) shift amounts for the digit shifters.
Make the vops handle the case when the known constant shift amount is
so large that the result is a known value. Plus, the instructions
have a fixed immediate argument size and the amount is taken mod 32
which would produce the wrong result if the actual shift amount were
used.
- - - - -
5406768c by Raymond Toy at 2015-12-02T20:07:43Z
Linux needs unix-setitimer
Cut and paste error from unix-glibc2.lisp copied unix-getitimer
instead of unix-setitimer which is needed by SAVE-LISP.
- - - - -
be500bc5 by Raymond Toy at 2015-12-05T16:10:46Z
Regenerated.
- - - - -
1d64f63b by Raymond Toy at 2015-12-05T17:01:22Z
Update from logs.
- - - - -
7a1457da by Raymond Toy at 2015-12-11T19:25:30Z
New implementation of the digit shifters.
Define new vops for the digit shifters that take a constant
(unsigned-byte 5) value. The previous version, while correct, still
causes the ecx register to spill because it was a temporary. This
doens't cause the compiler to spill ecx unnecessarily anymore.
- - - - -
c91ff829 by Raymond Toy at 2015-12-12T08:51:40Z
Update lisp-unit.
- - - - -
275011da by Raymond Toy at 2015-12-13T21:35:03Z
Merge branch 'master' into rtoy-mmap-anon-control-and-binding-stacks
- - - - -
8 changed files:
- src/code/package.lisp
- src/code/unix.lisp
- src/compiler/x86/arith.lisp
- src/contrib/lisp-unit/internal-test/example-tests.lisp
- src/contrib/lisp-unit/lisp-unit.lisp
- src/general-info/release-21b.txt
- src/i18n/locale/cmucl-unix.pot
- src/i18n/locale/cmucl.pot
Changes:
=====================================
src/code/package.lisp
=====================================
--- a/src/code/package.lisp
+++ b/src/code/package.lisp
@@ -1204,23 +1204,25 @@
;;; Change the name if we can, blast any old nicknames and then
;;; add in any new ones.
;;;
-(defun rename-package (package name &optional (nicknames ()))
- "Changes the name and nicknames for a package."
+(defun rename-package (package new-name &optional (new-nicknames ()))
+ "Replaces the name and nicknames of Package. The old name and all of
+ the old nicknames of Package are eliminated and are replaced by
+ New-Name and New-Nicknames."
(let* ((package (package-or-lose package))
- (name (string name))
- (found (find-package name)))
+ (new-name (string new-name))
+ (found (find-package new-name)))
(unless (or (not found) (eq found package))
(error 'simple-package-error
- :package name
+ :package new-name
:format-control (intl:gettext "A package named ~S already exists.")
- :format-arguments (list name)))
+ :format-arguments (list new-name)))
(remhash (package-%name package) *package-names*)
(dolist (n (package-%nicknames package))
(remhash n *package-names*))
- (setf (package-%name package) name)
- (setf (gethash name *package-names*) package)
+ (setf (package-%name package) new-name)
+ (setf (gethash new-name *package-names*) package)
(setf (package-%nicknames package) ())
- (enter-new-nicknames package nicknames)
+ (enter-new-nicknames package new-nicknames)
package))
;;; Delete-Package -- Public
=====================================
src/code/unix.lisp
=====================================
--- a/src/code/unix.lisp
+++ b/src/code/unix.lisp
@@ -2661,12 +2661,18 @@
which (alien-sap (addr itvn))(alien-sap (addr itvo))))))
#+linux
-(defun unix-getitimer (which)
- _N"Unix-getitimer returns the INTERVAL and VALUE slots of one of
- three system timers (:real :virtual or :profile). On success,
- unix-getitimer returns 5 values,
- T, it-interval-secs, it-interval-usec, it-value-secs, it-value-usec."
+(defun unix-setitimer (which int-secs int-usec val-secs val-usec)
+ _N" Unix-setitimer sets the INTERVAL and VALUE slots of one of
+ three system timers (:real :virtual or :profile). A SIGALRM signal
+ will be delivered VALUE <seconds+microseconds> from now. INTERVAL,
+ when non-zero, is <seconds+microseconds> to be loaded each time
+ the timer expires. Setting INTERVAL and VALUE to zero disables
+ the timer. See the Unix man page for more details. On success,
+ unix-setitimer returns the old contents of the INTERVAL and VALUE
+ slots as in unix-getitimer."
(declare (type (member :real :virtual :profile) which)
+ (type (unsigned-byte 29) int-secs val-secs)
+ (type (integer 0 (1000000)) int-usec val-usec)
(values t
(unsigned-byte 29)(mod 1000000)
(unsigned-byte 29)(mod 1000000)))
@@ -2674,14 +2680,19 @@
(:real ITIMER-REAL)
(:virtual ITIMER-VIRTUAL)
(:profile ITIMER-PROF))))
- (with-alien ((itv (struct itimerval)))
- (syscall* ("getitimer" int (* (struct itimerval)))
+ (with-alien ((itvn (struct itimerval))
+ (itvo (struct itimerval)))
+ (setf (slot (slot itvn 'it-interval) 'tv-sec ) int-secs
+ (slot (slot itvn 'it-interval) 'tv-usec) int-usec
+ (slot (slot itvn 'it-value ) 'tv-sec ) val-secs
+ (slot (slot itvn 'it-value ) 'tv-usec) val-usec)
+ (syscall* ("setitimer" int (* (struct timeval))(* (struct timeval)))
(values T
- (slot (slot itv 'it-interval) 'tv-sec)
- (slot (slot itv 'it-interval) 'tv-usec)
- (slot (slot itv 'it-value) 'tv-sec)
- (slot (slot itv 'it-value) 'tv-usec))
- which (alien-sap (addr itv))))))
+ (slot (slot itvo 'it-interval) 'tv-sec)
+ (slot (slot itvo 'it-interval) 'tv-usec)
+ (slot (slot itvo 'it-value) 'tv-sec)
+ (slot (slot itvo 'it-value) 'tv-usec))
+ which (alien-sap (addr itvn))(alien-sap (addr itvo))))))
;;;; User and group database access, POSIX Standard 9.2.2
=====================================
src/compiler/x86/arith.lisp
=====================================
--- a/src/compiler/x86/arith.lisp
+++ b/src/compiler/x86/arith.lisp
@@ -1445,32 +1445,62 @@
(:translate bignum::%ashr)
(:policy :fast-safe)
(:args (digit :scs (unsigned-reg unsigned-stack) :target result)
- (count :scs (unsigned-reg) :target ecx))
+ (count :scs (unsigned-reg)))
(:arg-types unsigned-num positive-fixnum)
(:temporary (:sc unsigned-reg :offset ecx-offset :from (:argument 1)) ecx)
(:results (result :scs (unsigned-reg) :from (:argument 0)
:load-if (not (and (sc-is result unsigned-stack)
(location= digit result)))))
(:result-types unsigned-num)
- (:generator 1
+ (:generator 2
(move result digit)
(move ecx count)
(inst sar result :cl)))
+(define-vop (digit-ashr-c)
+ (:translate bignum::%ashr)
+ (:policy :fast-safe)
+ (:args (digit :scs (unsigned-reg unsigned-stack) :target result))
+ (:info count)
+ (:arg-types unsigned-num (:constant (unsigned-byte #.(1- (integer-length vm:word-bits)))))
+ (:results (result :scs (unsigned-reg) :from (:argument 0)
+ :load-if (not (and (sc-is result unsigned-stack)
+ (location= digit result)))))
+ (:result-types unsigned-num)
+ (:generator 1
+ (move result digit)
+ ;; If the count is greater than 31, it's the same as
+ ;; shifting by 31, leaving just the sign bit.
+ (inst sar result count)))
+
(define-vop (digit-lshr digit-ashr)
(:translate bignum::%digit-logical-shift-right)
- (:generator 1
+ (:generator 2
(move result digit)
(move ecx count)
(inst shr result :cl)))
+(define-vop (digit-lshr-c digit-ashr-c)
+ (:translate bignum::%digit-logical-shift-right)
+ (:generator 1
+ (move result digit)
+ (inst shr result count)))
+
(define-vop (digit-ashl digit-ashr)
(:translate bignum::%ashl)
- (:generator 1
+ (:generator 2
(move result digit)
(move ecx count)
(inst shl result :cl)))
+(define-vop (digit-ashl-c digit-ashr-c)
+ (:translate bignum::%ashl)
+ (:generator 1
+ (move result digit)
+ (inst shl result count)))
+
+
+
;;;; Static functions.
=====================================
src/contrib/lisp-unit/internal-test/example-tests.lisp
=====================================
--- a/src/contrib/lisp-unit/internal-test/example-tests.lisp
+++ b/src/contrib/lisp-unit/internal-test/example-tests.lisp
@@ -57,6 +57,10 @@
(dotimes (i 5)
(assert-equal i (my-sqrt (* i i)) i)))
+(define-test cl-user::my-sqrt
+ (dotimes (i 5)
+ (assert-equal i (my-sqrt (* i i)) i)))
+
;;; Macro
(defmacro my-macro (arg1 arg2)
=====================================
src/contrib/lisp-unit/lisp-unit.lisp
=====================================
--- a/src/contrib/lisp-unit/lisp-unit.lisp
+++ b/src/contrib/lisp-unit/lisp-unit.lisp
@@ -126,8 +126,9 @@ functions or even macros does not require reloading any tests.
"If not NIL, enter the debugger when an error is encountered in an
assertion.")
-(defparameter *signal-results* nil
- "Signal the result if non NIL.")
+(defun use-debugger (&optional (flag t))
+ "Use the debugger when testing, or not."
+ (setq *use-debugger* flag))
(defun use-debugger-p (condition)
"Debug or ignore errors."
@@ -136,9 +137,8 @@ assertion.")
(y-or-n-p "~A -- debug?" condition))
(*use-debugger*)))
-(defun use-debugger (&optional (flag t))
- "Use the debugger when testing, or not."
- (setq *use-debugger* flag))
+(defparameter *signal-results* nil
+ "Signal the result if non NIL.")
(defun signal-results (&optional (flag t))
"Signal the results for extensibility."
@@ -238,7 +238,7 @@ assertion.")
((and (stringp item) (not doc) (rest body))
(if tag
(values doc tag (rest body))
- (parse-body (rest body) doc tag)))
+ (parse-body (rest body) item tag)))
(t (values doc tag body)))))
(defun test-name-error-report (test-name-error stream)
@@ -260,20 +260,31 @@ assertion.")
name
(error 'test-name-error :datum name)))
+(defun test-package (name)
+ "Return the package for storing the test."
+ (multiple-value-bind (symbol status)
+ (find-symbol (symbol-name name))
+ (declare (ignore symbol))
+ (ecase status
+ ((:internal :external nil)
+ (symbol-package name))
+ (:inherited *package*))))
+
(defmacro define-test (name &body body)
"Store the test in the test database."
(let ((qname (gensym "NAME-")))
(multiple-value-bind (doc tag code) (parse-body body)
`(let* ((,qname (valid-test-name ',name))
- (doc (or ,doc (string ,qname))))
+ (doc (or ,doc (symbol-name ,qname)))
+ (package (test-package ,qname)))
(setf
;; Unit test
- (gethash ,qname (package-table *package* t))
+ (gethash ,qname (package-table package t))
(make-instance 'unit-test :doc doc :code ',code))
;; Tags
- (loop for tag in ',tag do
- (pushnew
- ,qname (gethash tag (package-tags *package* t))))
+ (loop
+ for tag in ',tag do
+ (pushnew ,qname (gethash tag (package-tags package t))))
;; Return the name of the test
,qname))))
=====================================
src/general-info/release-21b.txt
=====================================
--- a/src/general-info/release-21b.txt
+++ b/src/general-info/release-21b.txt
@@ -42,10 +42,13 @@ New in this release:
of BYTE and WORD.
* Unix support on Linux has been unified with all other OSes.
Thus, src/code/unix-glibc2.lisp is no longer used.
+ * Micro-optimize modular shifts on x86.
+ * Update lisp-unit to commit e6c259f.
* ANSI compliance fixes:
* Bugfixes:
+ * Linux was missing unix-setitimer which prevented saving cores.
* Trac Tickets:
=====================================
src/i18n/locale/cmucl-unix.pot
=====================================
--- a/src/i18n/locale/cmucl-unix.pot
+++ b/src/i18n/locale/cmucl-unix.pot
@@ -1298,14 +1298,6 @@ msgstr ""
#: src/code/unix.lisp
msgid ""
-"Unix-getitimer returns the INTERVAL and VALUE slots of one of\n"
-" three system timers (:real :virtual or :profile). On success,\n"
-" unix-getitimer returns 5 values,\n"
-" T, it-interval-secs, it-interval-usec, it-value-secs, it-value-usec."
-msgstr ""
-
-#: src/code/unix.lisp
-msgid ""
"Return a USER-INFO structure for the user identified by UID, or NIL if not "
"found."
msgstr ""
=====================================
src/i18n/locale/cmucl.pot
=====================================
--- a/src/i18n/locale/cmucl.pot
+++ b/src/i18n/locale/cmucl.pot
@@ -8120,7 +8120,10 @@ msgid "The package named ~S doesn't exist."
msgstr ""
#: src/code/package.lisp
-msgid "Changes the name and nicknames for a package."
+msgid ""
+"Replaces the name and nicknames of Package. The old name and all of\n"
+" the old nicknames of Package are eliminated and are replaced by\n"
+" New-Name and New-Nicknames."
msgstr ""
#: src/code/package.lisp
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/compare/70f15c09eb7c4cb656ab3802…
Raymond Toy pushed to branch master at cmucl / cmucl
Commits:
c91ff829 by Raymond Toy at 2015-12-12T08:51:40Z
Update lisp-unit.
- - - - -
3 changed files:
- src/contrib/lisp-unit/internal-test/example-tests.lisp
- src/contrib/lisp-unit/lisp-unit.lisp
- src/general-info/release-21b.txt
Changes:
=====================================
src/contrib/lisp-unit/internal-test/example-tests.lisp
=====================================
--- a/src/contrib/lisp-unit/internal-test/example-tests.lisp
+++ b/src/contrib/lisp-unit/internal-test/example-tests.lisp
@@ -57,6 +57,10 @@
(dotimes (i 5)
(assert-equal i (my-sqrt (* i i)) i)))
+(define-test cl-user::my-sqrt
+ (dotimes (i 5)
+ (assert-equal i (my-sqrt (* i i)) i)))
+
;;; Macro
(defmacro my-macro (arg1 arg2)
=====================================
src/contrib/lisp-unit/lisp-unit.lisp
=====================================
--- a/src/contrib/lisp-unit/lisp-unit.lisp
+++ b/src/contrib/lisp-unit/lisp-unit.lisp
@@ -126,8 +126,9 @@ functions or even macros does not require reloading any tests.
"If not NIL, enter the debugger when an error is encountered in an
assertion.")
-(defparameter *signal-results* nil
- "Signal the result if non NIL.")
+(defun use-debugger (&optional (flag t))
+ "Use the debugger when testing, or not."
+ (setq *use-debugger* flag))
(defun use-debugger-p (condition)
"Debug or ignore errors."
@@ -136,9 +137,8 @@ assertion.")
(y-or-n-p "~A -- debug?" condition))
(*use-debugger*)))
-(defun use-debugger (&optional (flag t))
- "Use the debugger when testing, or not."
- (setq *use-debugger* flag))
+(defparameter *signal-results* nil
+ "Signal the result if non NIL.")
(defun signal-results (&optional (flag t))
"Signal the results for extensibility."
@@ -238,7 +238,7 @@ assertion.")
((and (stringp item) (not doc) (rest body))
(if tag
(values doc tag (rest body))
- (parse-body (rest body) doc tag)))
+ (parse-body (rest body) item tag)))
(t (values doc tag body)))))
(defun test-name-error-report (test-name-error stream)
@@ -260,20 +260,31 @@ assertion.")
name
(error 'test-name-error :datum name)))
+(defun test-package (name)
+ "Return the package for storing the test."
+ (multiple-value-bind (symbol status)
+ (find-symbol (symbol-name name))
+ (declare (ignore symbol))
+ (ecase status
+ ((:internal :external nil)
+ (symbol-package name))
+ (:inherited *package*))))
+
(defmacro define-test (name &body body)
"Store the test in the test database."
(let ((qname (gensym "NAME-")))
(multiple-value-bind (doc tag code) (parse-body body)
`(let* ((,qname (valid-test-name ',name))
- (doc (or ,doc (string ,qname))))
+ (doc (or ,doc (symbol-name ,qname)))
+ (package (test-package ,qname)))
(setf
;; Unit test
- (gethash ,qname (package-table *package* t))
+ (gethash ,qname (package-table package t))
(make-instance 'unit-test :doc doc :code ',code))
;; Tags
- (loop for tag in ',tag do
- (pushnew
- ,qname (gethash tag (package-tags *package* t))))
+ (loop
+ for tag in ',tag do
+ (pushnew ,qname (gethash tag (package-tags package t))))
;; Return the name of the test
,qname))))
=====================================
src/general-info/release-21b.txt
=====================================
--- a/src/general-info/release-21b.txt
+++ b/src/general-info/release-21b.txt
@@ -43,6 +43,7 @@ New in this release:
* Unix support on Linux has been unified with all other OSes.
Thus, src/code/unix-glibc2.lisp is no longer used.
* Micro-optimize modular shifts on x86.
+ * Update lisp-unit to commit e6c259f.
* ANSI compliance fixes:
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/c91ff8298e9007102a71242c8…
Raymond Toy pushed to branch master at cmucl / cmucl
Commits:
7a1457da by Raymond Toy at 2015-12-11T19:25:30Z
New implementation of the digit shifters.
Define new vops for the digit shifters that take a constant
(unsigned-byte 5) value. The previous version, while correct, still
causes the ecx register to spill because it was a temporary. This
doens't cause the compiler to spill ecx unnecessarily anymore.
- - - - -
1 changed file:
- src/compiler/x86/arith.lisp
Changes:
=====================================
src/compiler/x86/arith.lisp
=====================================
--- a/src/compiler/x86/arith.lisp
+++ b/src/compiler/x86/arith.lisp
@@ -1445,7 +1445,7 @@
(:translate bignum::%ashr)
(:policy :fast-safe)
(:args (digit :scs (unsigned-reg unsigned-stack) :target result)
- (count :scs (unsigned-reg immediate)))
+ (count :scs (unsigned-reg)))
(:arg-types unsigned-num positive-fixnum)
(:temporary (:sc unsigned-reg :offset ecx-offset :from (:argument 1)) ecx)
(:results (result :scs (unsigned-reg) :from (:argument 0)
@@ -1454,53 +1454,52 @@
(:result-types unsigned-num)
(:generator 2
(move result digit)
- (sc-case count
- (unsigned-reg
- (move ecx count)
- (inst sar result :cl))
- (immediate
- (let ((amount (tn-value count)))
- ;; If the amount is greater than 31, it's the same as
- ;; shifting by 31, leaving just the sign bit.
- (inst sar result (if (>= amount vm:word-bits)
- (1- vm:word-bits)
- amount)))))))
+ (move ecx count)
+ (inst sar result :cl)))
+
+(define-vop (digit-ashr-c)
+ (:translate bignum::%ashr)
+ (:policy :fast-safe)
+ (:args (digit :scs (unsigned-reg unsigned-stack) :target result))
+ (:info count)
+ (:arg-types unsigned-num (:constant (unsigned-byte #.(1- (integer-length vm:word-bits)))))
+ (:results (result :scs (unsigned-reg) :from (:argument 0)
+ :load-if (not (and (sc-is result unsigned-stack)
+ (location= digit result)))))
+ (:result-types unsigned-num)
+ (:generator 1
+ (move result digit)
+ ;; If the count is greater than 31, it's the same as
+ ;; shifting by 31, leaving just the sign bit.
+ (inst sar result count)))
(define-vop (digit-lshr digit-ashr)
(:translate bignum::%digit-logical-shift-right)
(:generator 2
- (sc-case count
- (unsigned-reg
- (move result digit)
- (move ecx count)
- (inst shr result :cl))
- (immediate
- (let ((amount (tn-value count)))
- ;; If the amount is greater than 31, the result is 0 because
- ;; all the bits get shifted right and out.
- (cond ((>= amount vm:word-bits)
- (inst mov result 0))
- (t
- (move result digit)
- (inst shr result count))))))))
+ (move result digit)
+ (move ecx count)
+ (inst shr result :cl)))
+
+(define-vop (digit-lshr-c digit-ashr-c)
+ (:translate bignum::%digit-logical-shift-right)
+ (:generator 1
+ (move result digit)
+ (inst shr result count)))
(define-vop (digit-ashl digit-ashr)
(:translate bignum::%ashl)
(:generator 2
- (sc-case count
- (unsigned-reg
- (move result digit)
- (move ecx count)
- (inst shl result :cl))
- (immediate
- (let ((amount (tn-value count)))
- ;; If the amount is greater than 31, the result is 0 because
- ;; all the bits get shifted left and out.
- (cond ((>= amount vm:word-bits)
- (inst mov result 0))
- (t
- (move result digit)
- (inst shl result amount))))))))
+ (move result digit)
+ (move ecx count)
+ (inst shl result :cl)))
+
+(define-vop (digit-ashl-c digit-ashr-c)
+ (:translate bignum::%ashl)
+ (:generator 1
+ (move result digit)
+ (inst shl result count)))
+
+
;;;; Static functions.
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/7a1457da0f9169bcd0007a7ac…