1.0.24.34: IR2: additional representation for predicates, conditional moves
[sbcl.git] / src / compiler / vop.lisp
index fbd0056..035a215 100644 (file)
   ;;
   ;;    :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