Skip to content
Snippets Groups Projects
Commit 8d75583b authored by Raymond Toy's avatar Raymond Toy
Browse files

Add WITH-CYCLE-COUNTER for x86, sparc, and ppc. Sparc and ppc

versions are untested.
parent f621914f
No related branches found
No related tags found
No related merge requests found
...@@ -275,3 +275,22 @@ ...@@ -275,3 +275,22 @@
(defun read-cycle-counter () (defun read-cycle-counter ()
(read-time-base)) (read-time-base))
(defmacro with-cycle-counter (&body body)
"Returns the primary value of BODY as the primary value, and the
number of tick cycles elapsed as secondary value. To get the number
of cycles, multiply by *cycles-per-tick*"
(let ((hi0 (gensym))
(hi1 (gensym))
(lo0 (gensym))
(lo1 (gensym)))
`(multiple-value-bind (,lo0 ,hi0)
(read-cycle-counter)
(values (locally ,@body)
(multiple-value-bind (,lo1 ,hi1)
(read-cycle-counter)
;; Can't do anything about the notes about generic
;; arithmetic, so silence the notes..
(declare (optimize (inhibit-warnings 3))
(+ (ash (- ,hi1 ,hi0) 32)
(- ,lo1 ,lo0)))))))
...@@ -284,3 +284,21 @@ ...@@ -284,3 +284,21 @@
64-bit counter is returned as two 32-bit unsigned integers. The low 32-bit 64-bit counter is returned as two 32-bit unsigned integers. The low 32-bit
result is the first value." result is the first value."
(read-cycle-counter)) (read-cycle-counter))
(defmacro with-cycle-counter (&body body)
"Returns the primary value of BODY as the primary value, and the
number of CPU cycles elapsed as secondary value."
(let ((hi0 (gensym))
(hi1 (gensym))
(lo0 (gensym))
(lo1 (gensym)))
`(multiple-value-bind (,lo0 ,hi0)
(read-cycle-counter)
(values (locally ,@body)
(multiple-value-bind (,lo1 ,hi1)
(read-cycle-counter)
;; Can't do anything about the notes about generic
;; arithmetic, so silence the notes..
(declare (optimize (inhibit-warnings 3))
(+ (ash (- ,hi1 ,hi0) 32)
(- ,lo1 ,lo0)))))))
...@@ -562,7 +562,7 @@ ...@@ -562,7 +562,7 @@
(inst ret))) (inst ret)))
;; the RDTSC instruction (present on Pentium processors and ;; The RDTSC instruction (present on Pentium processors and
;; successors) allows you to access the time-stamp counter, a 64-bit ;; successors) allows you to access the time-stamp counter, a 64-bit
;; model-specific register that counts executed cycles. The ;; model-specific register that counts executed cycles. The
;; instruction returns the low cycle count in EAX and high cycle count ;; instruction returns the low cycle count in EAX and high cycle count
...@@ -676,3 +676,21 @@ ...@@ -676,3 +676,21 @@
(defun cpuid (level) (defun cpuid (level)
(declare (type (unsigned-byte 32) level)) (declare (type (unsigned-byte 32) level))
(cpuid level)) (cpuid level))
(defmacro with-cycle-counter (&body body)
"Returns the primary value of BODY as the primary value, and the
number of CPU cycles elapsed as secondary value."
(let ((hi0 (gensym))
(hi1 (gensym))
(lo0 (gensym))
(lo1 (gensym)))
`(multiple-value-bind (,lo0 ,hi0)
(read-cycle-counter)
(values (locally ,@body)
(multiple-value-bind (,lo1 ,hi1)
(read-cycle-counter)
;; Can't do anything about the notes about generic
;; arithmetic, so silence the notes..
(declare (optimize (inhibit-warnings 3))
(+ (ash (- ,hi1 ,hi0) 32)
(- ,lo1 ,lo0)))))))
...@@ -54,6 +54,8 @@ New in this release: ...@@ -54,6 +54,8 @@ New in this release:
* OSX 10.4 is no longer supported. * OSX 10.4 is no longer supported.
* Micro optimizations for floats: 2*x -> x+x and x/2^n -> * Micro optimizations for floats: 2*x -> x+x and x/2^n ->
(2^(n))*x. (2^(n))*x.
* Add VM::WITH-CYCLE-COUNTER to return the number of cycles elapsed
when executing the body, as measured by the CPU cycle/tick counter.
* ANSI compliance fixes: * ANSI compliance fixes:
* CMUCL was not printing pathnames like (make-pathname :directory * CMUCL was not printing pathnames like (make-pathname :directory
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment