[Openmcl-cvs-notifications] r9261 - /trunk/source/compiler/PPC/ppc2.lisp

gb at clozure.com gb at clozure.com
Thu Apr 24 05:32:53 EDT 2008


Author: gb
Date: Thu Apr 24 05:32:53 2008
New Revision: 9261

Log:
THE typechecking in PPC backend, too.

Modified:
    trunk/source/compiler/PPC/ppc2.lisp

Modified: trunk/source/compiler/PPC/ppc2.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/compiler/PPC/ppc2.lisp (original)
+++ trunk/source/compiler/PPC/ppc2.lisp Thu Apr 24 05:32:53 2008
@@ -5521,9 +5521,10 @@
 (defppc2 ppc2-svset svset (seg vreg xfer vector index value)
   (ppc2-vset seg vreg xfer :simple-vector  vector index value (nx-lookup-t=
arget-uvector-subtag :simple-vector)))
 =

-(defppc2 ppc2-typed-form typed-form (seg vreg xfer typespec form)
-  (declare (ignore typespec)) ; Boy, do we ever !
-  (ppc2-form seg vreg xfer form))
+(defppc2 ppc2-typed-form typed-form (seg vreg xfer typespec form &optional=
 check)
+  (if check
+    (ppc2-typechecked-form seg vreg xfer typespec form)
+    (ppc2-form seg vreg xfer form)))
 =

 (defppc2 ppc2-%primitive %primitive (seg vreg xfer &rest ignore)
   (declare (ignore seg vreg xfer ignore))
@@ -7966,6 +7967,62 @@
   (def-ppc2-require ppc2-require-s8 require-s64)
   (def-ppc2-require ppc2-require-s8 require-u64))
 =

+(defun ppc2-typechecked-form (seg vreg xfer typespec form)
+  (with-ppc-local-vinsn-macros (seg vreg xfer)
+    (let* ((op
+            (cond ((eq typespec 'fixnum) (%nx1-operator require-fixnum))
+                  ((eq typespec 'integer) (%nx1-operator require-integer))
+                  ((memq typespec '(base-char character))
+                   (%nx1-operator require-character))
+                  ((eq typespec 'symbol) (%nx1-operator require-symbol))
+                  ((eq typespec 'list) (%nx1-operator require-list))
+                  ((eq typespec 'real) (%nx1-operator require-real))
+                  ((memq typespec '(simple-base-string simple-string))
+                   (%nx1-operator require-simple-string))
+                  ((eq typespec 'number) (%nx1-operator require-number))
+                  ((eq typespec 'simple-vector) (%nx1-operator require-sim=
ple-vector))
+                  (t
+                   (let* ((ctype (specifier-type typespec)))
+                     (cond ((type=3D ctype (load-time-value (specifier-typ=
e '(signed-byte 8))))
+                            (%nx1-operator require-s8))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(unsigned-byte 8))))
+                            (%nx1-operator require-u8))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(signed-byte 16))))
+                            (%nx1-operator require-s16))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(unsigned-byte 16))))
+                            (%nx1-operator require-u16))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(signed-byte 32))))                            =

+                            (%nx1-operator require-s32))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(unsigned-byte 32))))
+                            (%nx1-operator require-u32))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(signed-byte 64))))
+                            (%nx1-operator require-s64))
+                           ((type=3D ctype (load-time-value (specifier-typ=
e '(unsigned-byte 64))))
+                            (%nx1-operator require-u64))))))))
+      (if op
+        (ppc2-use-operator op seg vreg xfer form)
+        (if (or (eq typespec t)
+                (eq typespec '*))
+          (ppc2-form seg vreg xfer form)
+          (let* ((ok (backend-get-next-label)))
+            (ppc2-one-targeted-reg-form seg form ($ ppc::arg_y))
+            (ppc2-store-immediate seg typespec ($ ppc::arg_z))
+            (ppc2-store-immediate seg 'typep ($ ppc::fname))
+            (ppc2-set-nargs seg 2)
+            (ppc2-vpush-register seg ($ ppc::arg_y))
+            (! call-known-symbol ($ ppc::arg_z))
+	    (with-crf-target () crf
+               (! compare-to-nil crf ($ ppc::arg_z))
+	       (ppc2-vpop-register seg ($ ppc::arg_y))
+	       (! cbranch-false (aref *backend-labels* ok) crf ppc::ppc-eq-bit))
+            (ppc2-lri seg ($ ppc::arg_x) (ash $XWRONGTYPE *ppc2-target-fix=
num-shift*))
+            (ppc2-store-immediate seg typespec ($ ppc::arg_z))
+            (ppc2-set-nargs seg 3)
+            (! ksignalerr)
+            (@ ok)
+            (<- ($ ppc::arg_y))
+            (^)))))))
+
 (defppc2 ppc2-%badarg2 %badarg2 (seg vreg xfer badthing goodthing)
   (ppc2-two-targeted-reg-forms seg badthing ($ ppc::arg_y) goodthing ($ pp=
c::arg_z))
   (ppc2-lri seg ($ ppc::arg_x) (ash $XWRONGTYPE *ppc2-target-fixnum-shift*=
))



More information about the Openmcl-cvs-notifications mailing list