1.0.24.34: IR2: additional representation for predicates, conditional moves
[sbcl.git] / src / compiler / vop.lisp
index cfcb0f4..035a215 100644 (file)
   ;; SC and OFFSET are already filled in.
   ;;
   ;; CONSTANT-TNs are non-packed TNs that represent constants.
-  ;; :CONSTANT TNs may eventually be converted to :CACHED-CONSTANT
-  ;; normal TNs.
-  ;;
-  ;; FIXME: What is :CACHED-CONSTANT?
   (normal-tns nil :type (or tn null))
   (restricted-tns nil :type (or tn null))
   (wired-tns nil :type (or tn null))
   (arguments nil :type list)
   ;; a function type specifier representing the arguments and results
   ;; of this function
-  (type 'function :type (or list (member function))))
+  (type 'function :type (or list (member function)))
+  ;; xref information for the XEP
+  (xref nil :type (or null simple-vector)))
 
 ;;; An IR2-PHYSENV is used to annotate non-LET LAMBDAs with their
 ;;; passing locations. It is stored in the PHYSENV-INFO.
   ;;
   ;;    :STRANGE
   ;;        A segment of a "strange loop" in a non-reducible flow graph.
-  (kind (required-argument) :type (member :outer :natural :strange))
+  (kind (missing-arg) :type (member :outer :natural :strange))
   ;; The first and last blocks in the loop.  There may be more than one tail,
   ;; since there may be multiple back branches to the same head.
   (head nil :type (or cblock null))
   (depth 0 :type fixnum)
   ;; The head of the list of blocks directly within this loop.  We must recurse
   ;; on INFERIORS to find all the blocks.
-  (blocks nil :type (or null cblock)))
+  (blocks nil :type (or null cblock))
+  ;; Backend saves the first emitted block of each loop here.
+  (info nil))
 
 (defprinter (cloop :conc-name loop-)
   kind
   ;; conditional that yields its result as a control transfer. The
   ;; emit function takes two info arguments: the target label and a
   ;; boolean flag indicating whether to negate the sense of the test.
+  ;;
+  ;; If RESULT-TYPES is a cons whose car is :CONDITIONAL, then this is
+  ;; a flag-setting VOP. The rest is a list of condition descriptors to
+  ;; be interpreted by the BRANCH-IF VOP (see $ARCH/pred.lisp).
   (arg-types nil :type list)
-  (result-types nil :type (or list (member :conditional)))
+  (result-types nil :type (or list (member :conditional) (cons (eql :conditional))))
   ;; the primitive type restriction applied to each extra argument or
   ;; result following the fixed operands. If NIL, no extra
   ;; args/results are allowed. Otherwise, either * or a (:OR ...) list