Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv3809
Modified Files:
cpu-id.lisp
Log Message:
Re-wrote cpu-id. This function still has some way to go before it's
compliant with (the still very informal) stack and register disciplines.
Date: Wed Apr 14 18:49:14 2004
Author: ffjeld
Index: movitz/losp/muerte/cpu-id.lisp
diff -u movitz/losp/muerte/cpu-id.lisp:1.2 movitz/losp/muerte/cpu-id.lisp:1.3
--- movitz/losp/muerte/cpu-id.lisp:1.2 Mon Jan 19 06:23:46 2004
+++ movitz/losp/muerte/cpu-id.lisp Wed Apr 14 18:49:14 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef(a)acm.org>
;;;; Created at: Mon Apr 15 22:47:13 2002
;;;;
-;;;; $Id: cpu-id.lisp,v 1.2 2004/01/19 11:23:46 ffjeld Exp $
+;;;; $Id: cpu-id.lisp,v 1.3 2004/04/14 22:49:14 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -91,53 +91,50 @@
octets in c0, c1, c2, and c3. The 16 values returned represent the individual
octets of EAX, EBX, EDX, and ECX, also in little-endian order."
(when (cpu-586-class-p)
- (with-inline-assembly (:returns :multiple-values) pack octets
- ;; c0-c1-c2-c3 into eax..
- (:compile-form (:result-mode :eax) c3)
- (:compile-form (:result-mode :ecx) c2)
- (:shll 8 :eax)
- (:xorl :ecx :eax)
- (:compile-form (:result-mode :ecx) c1)
- (:shll 8 :eax)
- (:xorl :ecx :eax)
- (:compile-form (:result-mode :ecx) c0)
- (:shll #.(cl:- 8 movitz::+movitz-fixnum-shift+) :eax)
- (:shrl #.movitz::+movitz-fixnum-shift+ :ecx)
- (:xorl :ecx :eax)
- ;; do actual cpu-id instruction
- (:cpuid)
- ;; unpack eax, ebx, edx, ecx to 16 values..
- (:call '(:sub-program (unpack-eax)
- (:popl (:esp -20)) ; return address
- (:pushl :eax)
- (:andl #x000000ff (:esp))
- (:shll #.movitz::+movitz-fixnum-shift+ (:esp))
- (:pushl :eax)
- (:andl #x0000ff00 (:esp))
- (:shrl #.(cl:- 8 movitz::+movitz-fixnum-shift+) (:esp))
- (:pushl :eax)
- (:andl #x00ff0000 (:esp))
- (:shrl #.(cl:- 16 movitz::+movitz-fixnum-shift+) (:esp))
- (:pushl :eax)
- (:andl #xff000000 (:esp))
- (:shrl #.(cl:- 24 movitz::+movitz-fixnum-shift+) (:esp))
- (:subl 4 :esp)
- (:ret)))
- (:movl :ebx :eax)
- (:call 'unpack-eax)
- (:movl :edx :eax)
- (:call 'unpack-eax)
- (:movl :ecx :eax)
- (:call 'unpack-eax)
- ;; return multiple-values (16 values, actually..)
- (:movl (:esp #.(cl:* 4 (cl:- 16 1))) :eax)
- (:movl (:esp #.(cl:* 4 (cl:- 16 2))) :ebx)
- ;; (:leal (:esp #.(cl:* 4 (cl:- 16 3))) :edx)
- (:movb 16 :cl)
- (:load-constant muerte.cl::values :edx)
- (:movl (:edx #.(bt:slot-offset 'movitz::movitz-symbol 'movitz::function-value))
- :esi) ; load new funobj from symbol into ESI
- (:call (:esi #.(bt:slot-offset 'movitz::movitz-funobj 'movitz::code-vector))))))
+ (macrolet
+ ((do-it ()
+ (flet ((make-register-push (register)
+ `((:pushl ,register)
+ (:andl #x000000ff (:esp))
+ (:shll #.movitz::+movitz-fixnum-shift+ (:esp))
+ (:pushl ,register)
+ (:andl #x0000ff00 (:esp))
+ (:shrl #.(cl:- 8 movitz::+movitz-fixnum-shift+) (:esp))
+ (:pushl ,register)
+ (:andl #x00ff0000 (:esp))
+ (:shrl #.(cl:- 16 movitz::+movitz-fixnum-shift+) (:esp))
+ (:pushl ,register)
+ (:andl #xff000000 (:esp))
+ (:shrl #.(cl:- 24 movitz::+movitz-fixnum-shift+) (:esp)))))
+ `(with-inline-assembly (:returns :multiple-values) pack octets
+ ;; c0-c1-c2-c3 into eax..
+ (:compile-form (:result-mode :eax) c3)
+ (:compile-form (:result-mode :ecx) c2)
+ (:shll 8 :eax)
+ (:xorl :ecx :eax)
+ (:compile-form (:result-mode :ecx) c1)
+ (:shll 8 :eax)
+ (:xorl :ecx :eax)
+ (:compile-form (:result-mode :ecx) c0)
+ (:shll #.(cl:- 8 movitz::+movitz-fixnum-shift+) :eax)
+ (:shrl #.movitz::+movitz-fixnum-shift+ :ecx)
+ (:xorl :ecx :eax)
+ ;; do actual cpu-id instruction
+ (:cpuid)
+ ;; unpack eax, ebx, edx, ecx to 16 values..
+ ,@(make-register-push :eax)
+ ,@(make-register-push :ebx)
+ ,@(make-register-push :edx)
+ ,@(make-register-push :ecx)
+ ;; return multiple-values (16 values, actually..)
+ (:movl (:esp #.(cl:* 4 (cl:- 16 1))) :eax)
+ (:movl (:esp #.(cl:* 4 (cl:- 16 2))) :ebx)
+ (:movb 16 :cl)
+ (:load-constant muerte.cl::values :edx)
+ (:movl (:edx #.(bt:slot-offset 'movitz::movitz-symbol 'movitz::function-value))
+ :esi) ; load new funobj from symbol into ESI
+ (:call (:esi #.(bt:slot-offset 'movitz::movitz-funobj 'movitz::code-vector)))))))
+ (do-it))))
(defconstant +cpu-id-feature-map+