OSDN Git Service

*** empty log message ***
[pf3gnuchains/sourceware.git] / cgen / rtx-funcs.scm
index e008556..1054d9d 100644 (file)
@@ -1,5 +1,5 @@
 ; Standard RTL functions.
-; Copyright (C) 2000 Red Hat, Inc.
+; Copyright (C) 2000, 2009, 2010 Red Hat, Inc.
 ; This file is part of CGEN.
 ; See file COPYING.CGEN for details.
 
 \f
 ; Error reporting.
 ; MODE is present for use in situations like non-VOID mode cond's.
+; The code will expect the mode to be compatible even though `error'
+; "doesn't return".  A small concession for simpler code.
 
 (drn (error &options &mode message)
-     (OPTIONS ANYMODE STRING) (NA NA NA)
+     #f
+     (OPTIONS VOIDORNUMMODE STRING) (NA NA NA)
      MISC
-     (context-error (estate-context *estate*) message)
+     (estate-error *estate* "error in rtl" message)
 )
 
 ; Enums
 ; Default mode is INT.
 
 (drn (enum &options &mode enum-name)
-     (OPTIONS NUMMODE SYMBOL) (NA NA NA)
+     #f
+     (OPTIONS ANYINTMODE SYMBOL) (NA NA NA) ;; ??? s/SYMBOL/ENUM-NAME/ ?
      ARG
-     ; When computing a value, return the enum's value.
-     (enum-lookup-val enum-name)
+     ;; When computing a value, return the enum's value.
+     ;; Canonicalization should have already caught bad values.
+     (car (enum-lookup-val enum-name))
 )
 
 ; Instruction fields
 ; in this.
 
 (dron (ifield &options &mode ifld-name)
-      (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL) (NA NA NA) ;; ??? s/SYMBOL/IFIELD-NAME/ ?
       ARG
       (let ((f (current-ifld-lookup ifld-name)))
-       (make <operand> ifld-name (string-append ifld-name " used as operand")
+       (make <operand> (obj-location f)
+             ifld-name (string-append ifld-name " used as operand")
              (atlist-cons (bool-attr-make 'SEM-ONLY #t)
                           (obj-atlist f))
              (obj:name (ifld-hw-type f))
@@ -73,7 +80,8 @@
 ; in this.
 
 (dron (operand &options &mode op-name)
-      (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL) (NA NA NA) ;; ??? s/SYMBOL/OPERAND-NAME/ ?
       ARG
       (current-op-lookup op-name)
 )
 ; ??? Might also support numbering by allowing NEW-NAME to be a number.
 
 (drsn (name &options &mode new-name value)
-      (OPTIONS DFLTMODE SYMBOL RTX) (NA NA NA ANY)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL RTX) (NA NA NA ANY)
       ARG
+      ;; FIXME: s/DFLT/&mode/ ?
       (let ((result (object-copy (rtx-get 'DFLT value))))
        (op:set-sem-name! result new-name)
        result)
 ; Compiled operands are wrapped in this so that they still look like rtx.
 
 (dron (xop &options &mode object)
-      (OPTIONS DFLTMODE OBJECT) (NA NA NA)
+      #f
+      (OPTIONS ANYNUMMODE OBJECT) (NA NA NA) ;; ??? s/OBJECT/OPERAND/ ?
       ARG
       object
 )
 
 ;(dron (opspec: &options &mode op-name op-num hw-ref attrs)
-;      (OPTIONS ANYMODE SYMBOL NUMBER RTX ATTRS) (NA NA NA NA ANY NA)
+;      (OPTIONS ANYNUMMODE SYMBOL NUMBER RTX ATTRS) (NA NA NA NA ANY NA)
 ;      ARG
-;      (let ((opval (rtx-eval-with-estate hw-ref mode *estate*)))
+;      (let ((opval (rtx-eval-with-estate hw-ref (mode:lookup &mode) *estate*)))
 ;      (assert (operand? opval))
 ;      ; Set the specified mode, ensuring it's ok.
 ;      ; This also makes a copy as we don't want to modify predefined
 ; wrapped in this.
 
 (dron (local &options &mode local-name)
-      (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL) (NA NA NA) ;; ??? s/SYMBOL/LOCAL-NAME/ ?
       ARG
       (rtx-temp-lookup (tstate-env *tstate*) local-name)
 )
 ; ??? Since operands are given names and not numbers this isn't currently used.
 ;
 ;(drsn (dup &options &mode op-name)
-;     (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+;     #f
+;     (OPTIONS ANYNUMMODE SYMBOL) (NA NA NA)
 ;     ;(s-dup *estate* op-name)
 ;     (begin
 ;       (if (not (insn? (estate-owner *estate*)))
 ; ??? What about input/output operands.
 
 (drsn (ref &options &mode name)
-      (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+      BI
+      (OPTIONS BIMODE SYMBOL) (NA NA NA) ;; ??? s/SYMBOL/OPERAND-NAME/ ?
       ARG
       #f
 )
 
 ; Return the index of an operand.
 ; For registers this is the register number.
-; ??? Mode handling incomplete.
+; ??? Mode handling incomplete, this doesn't handle mem, which it could.
+; Until then we fix the mode of the result to INT.
 
 (dron (index-of &options &mode op-rtx)
-      (OPTIONS DFLTMODE RTX) (NA NA ANY)
+      INT
+      (OPTIONS INTMODE RTX) (NA NA ANY)
       ARG
-      (let* ((operand (rtx-eval-with-estate op-rtx 'DFLT *estate*))
+      ;; FIXME: s/DFLT/&mode/ ?
+      (let* ((operand (rtx-eval-with-estate op-rtx DFLT *estate*))
             (f (hw-index:value (op:index operand)))
             (f-name (obj:name f)))
-       (make <operand> f-name f-name
+       (make <operand> (if (source-ident? f) (obj-location f) #f)
+             f-name f-name
              (atlist-cons (bool-attr-make 'SEM-ONLY #t)
                           (obj-atlist f))
              (obj:name (ifld-hw-type f))
 ; unevaluated.
 ; ??? Not currently supported.  Not sure whether it should be.
 ;(drsn (hw &options &mode hw-elm . indx-sel)
-;      (OPTIONS ANYMODE SYMBOL . RTX) (NA NA NA . INT)
+;      (OPTIONS ANYNUMMODE SYMBOL . RTX) (NA NA NA . INT)
 ;      ARG
 ;      (let ((indx (if (pair? indx-sel) (car indx-sel) 0))
 ;            (selector (if (and (pair? indx-sel) (pair? (cdr indx-sel)))
 ; Register accesses.
 ; INDX-SEL is an optional index and possible selector.
 (dron (reg &options &mode hw-elm . indx-sel)
-      (OPTIONS ANYMODE SYMBOL . RTX) (NA NA NA . INT)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL . RTX) (NA NA NA . INT) ;; ??? s/SYMBOL/HW-NAME/ ?
       ARG
       (let ((indx (if (pair? indx-sel) (car indx-sel) 0))
            (selector (if (and (pair? indx-sel) (pair? (cdr indx-sel)))
 ; getter/setter definitions.
 
 (dron (raw-reg &options &mode hw-elm . indx-sel)
-      (OPTIONS ANYMODE SYMBOL . RTX) (NA NA NA . INT)
+      #f
+      (OPTIONS ANYNUMMODE SYMBOL . RTX) (NA NA NA . INT) ;; ??? s/SYMBOL/HW-NAME/ ?
       ARG
       (let ((indx (if (pair? indx-sel) (car indx-sel) 0))
            (selector (if (and (pair? indx-sel) (pair? (cdr indx-sel)))
 
 ; Memory accesses.
 (dron (mem &options &mode addr . sel)
+      #f
       (OPTIONS EXPLNUMMODE RTX . RTX) (NA NA AI . INT)
       ARG
       (s-hw *estate* mode 'h-memory addr
 ; The program counter.
 ; ??? Hmmm... needed?  The pc is usually specified as `pc' which is shorthand
 ; for (operand pc).
-(dron (pc) () () ARG s-pc)
+;(dron (pc) () () ARG s-pc)
 
 ; Fetch bytes from the instruction stream of size MODE.
 ; FIXME: Later need to augment this by passing an indicator to the mem-fetch
 
 ; Indicate there are N delay slots in the processing of RTX.
 ; N is a `const' node.
+; The mode of the result is the mode of RTX.
 ; ??? wip!
 
 (drn (delay &options &mode n rtx)
-     (OPTIONS DFLTMODE RTX RTX) (NA NA INT ANY)
+     #f
+     (OPTIONS VOIDORNUMMODE RTX RTX) (NA NA INT MATCHEXPR)
      MISC
      #f ; (s-sequence *estate* VOID '() rtx) ; wip!
 )
 ; ??? wip!
 
 (drn (skip &options &mode yes?)
-     (OPTIONS DFLTMODE RTX) (NA NA INT)
+     VOID
+     (OPTIONS VOIDMODE RTX) (NA NA INT)
      MISC
      #f
 )
 ; OWNER is the result of either (current-insn) or (current-mach)
 ; [note that canonicalization will turn them into
 ; (current-{insn,mach} () DFLT)].
-; The result is always of mode INT.
+; The result is always of mode BI.
 ; FIXME: wip
 ;
 ; This is a syntax node so the args are not pre-evaluated.
 ; FIXME: Hmmm... it currently isn't a syntax node.
 
 (drn (eq-attr &options &mode owner attr value)
-      (OPTIONS DFLTMODE RTX SYMBOL SYMORNUM) (NA NA ANY NA NA)
+     BI
+      (OPTIONS BIMODE RTX SYMBOL SYMORNUM) (NA NA ANY NA NA)
       MISC
       (let ((atval (if owner
                       (obj-attr-value owner attr)
            (eq? atval value)))
 )
 
-; Get the value of attribute ATTR-NAME.
-; OBJ is the result of either (current-insn) or (current-mach)
-; [note that canonicalization will turn them into
-; (current-{insn,mach} () DFLT)].
+; Get the value of attribute ATTR-NAME, expressable as an integer.
+; OBJ is the result of either (current-insn) or (current-mach).
+; Note that canonicalization will turn them into
+; (current-{insn,mach} () {INSN,MACH}MODE).
 ; FIXME:wip
+; This uses INTMODE because we can't otherwise determine the
+; mode of the result (if elided).
 
-(drn (attr &options &mode obj attr-name)
-     (OPTIONS DFLTMODE RTX SYMBOL) (NA NA NA NA)
+(drn (int-attr &options &mode obj attr-name)
+     #f
+     (OPTIONS INTMODE RTX SYMBOL) (NA NA ANY NA)
      MISC
      #f
 )
 
+;; Deprecated alias for int-attr.
+
+(drmn (attr arg1 . rest)
+      (cons 'int-attr (cons arg1 rest))
+)
+
 ; Same as `quote', for use in attributes cus "quote" sounds too jargonish.
 ; [Ok, not a strong argument for using "symbol", but so what?]
 
 (drsn (symbol &options &mode name)
-      (OPTIONS DFLTMODE SYMBOL) (NA NA NA)
+      SYM
+      (OPTIONS SYMMODE SYMBOL) (NA NA NA)
       ARG
       name
 )
 ; Return the current instruction.
 
 (drn (current-insn &options &mode)
-     (OPTIONS DFLTMODE) (NA NA)
+     INSN
+     (OPTIONS INSNMODE) (NA NA)
      MISC
      (let ((obj (estate-owner *estate*)))
        (if (not (insn? obj))
 ; This can either be a compile-time or run-time value.
 
 (drn (current-mach &options &mode)
-     (OPTIONS DFLTMODE) (NA NA)
+     MACH
+     (OPTIONS MACHMODE) (NA NA)
      MISC
      -rtx-current-mach
 )
 
 ; FIXME: Need to consider 64 bit hosts.
 (drn (const &options &mode c)
-     (OPTIONS NUMMODE NUMBER) (NA NA NA)
+     #f
+     (OPTIONS ANYNUMMODE NUMBER) (NA NA NA)
      ARG
      ; When computing a value, just return the constant unchanged.
      c
 
 ; Combine smaller modes into a larger one.
 ; Arguments are specified most significant to least significant.
-; ??? May also want an endian dependent argument order.  That can be
-; implemented on top of or beside this.
 ; ??? Not all of the combinations are supported in the simulator.
 ; They'll get added as necessary.
 (drn (join &options &out-mode in-mode arg1 . arg-rest)
-     (OPTIONS NUMMODE NUMMODE RTX . RTX) (NA NA NA ANY . ANY)
+     #f
+     (OPTIONS ANYNUMMODE ANYNUMMODE RTX . RTX) (NA NA NA ANY . ANY)
      MISC
      ; FIXME: Ensure correct number of args for in/out modes.
      ; FIXME: Ensure compatible modes.
 
 ; GCC's subreg.
 ; Called subword 'cus it's not exactly subreg.
-; Word numbering is from most significant (word 0) to least (word N-1).
-; ??? May also want an endian dependent word ordering.  That can be
-; implemented on top of or beside this.
+; Word numbering is word-order dependent.
+; Word number 0 is the most significant word if big-endian-words.
+; Word number 0 is the least significant word if little-endian-words.
 ; ??? GCC plans to switch to SUBREG_BYTE.  Keep an eye out for the switch
 ; (which is extensive so probably won't happen anytime soon).
+; MODE is the mode of the result, not operand0.
 ;
-; The mode spec of operand0 use to be OP0, but subword is not a normal rtx.
+; The mode spec of operand0 use to be MATCHEXPR, but subword is not a normal rtx.
 ; The mode of operand0 is not necessarily the same as the mode of the result,
 ; and code which analyzes it would otherwise use the result mode (specified by
 ; `&mode') for the mode of operand0.
 
 (drn (subword &options &mode value word-num)
-     (OPTIONS NUMMODE RTX RTX) (NA NA ANY INT)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA ANY INT)
      ARG
      #f
 )
 ; independent name.
 
 (drn (c-code &options &mode text)
-     (OPTIONS ANYMODE STRING) (NA NA NA)
+     #f
+     (OPTIONS ANYCEXPRMODE STRING) (NA NA NA)
      UNSPEC
      #f
 )
 ;           (c-call mode name arg1 arg2 ...)
 ; which is converted into a C function call:
 ;           name (current_cpu, arg1, arg2, ...)
-; Mode is the mode of the result.
+; MODE is the mode of the result.
 ; If it is VOID this call is a statement and ';' is appended.
 ; Otherwise it is part of an expression.
 
 (drn (c-call &options &mode name . args)
-     (OPTIONS ANYMODE STRING . RTX) (NA NA NA . ANY)
+     #f
+     (OPTIONS ANYCEXPRMODE STRING . RTX) (NA NA NA . ANY)
      UNSPEC
      #f
 )
 ; Same as c-call but without implicit first arg of `current_cpu'.
 
 (drn (c-raw-call &options &mode name . args)
-     (OPTIONS ANYMODE STRING . RTX) (NA NA NA . ANY)
+     #f
+     (OPTIONS ANYCEXPRMODE STRING . RTX) (NA NA NA . ANY)
      UNSPEC
      #f
 )
 ; Set/get/miscellaneous
 
 (drn (nop &options &mode)
+     VOID
      (OPTIONS VOIDMODE) (NA NA)
      MISC
      #f
 ; Clobber - mark an object as modified without explaining why or how.
 
 (drn (clobber &options &mode object)
-     (OPTIONS ANYMODE RTX) (NA NA OP0)
+     VOID
+     (OPTIONS VOIDORNUMMODE RTX) (NA NA MATCHEXPR)
      MISC
      #f
 )
 ; Scheme too closely.
 
 (drn (set &options &mode dst src)
-     (OPTIONS ANYMODE SETRTX RTX) (NA NA OP0 MATCH1)
+     VOID
+     (OPTIONS ANYNUMMODE SETRTX RTX) (NA NA MATCHEXPR MATCH2)
      SET
      #f
 )
 
 (drn (set-quiet &options &mode dst src)
-     (OPTIONS ANYMODE SETRTX RTX) (NA NA OP0 MATCH1)
+     VOID
+     (OPTIONS ANYNUMMODE SETRTX RTX) (NA NA MATCHEXPR MATCH2)
      SET
      #f
 )
 ; - ???
 
 (drn (neg &options &mode s1)
-     (OPTIONS ANYMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYNUMMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 
 (drn (abs &options &mode s1)
-     (OPTIONS ANYMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYNUMMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 ; For floating point values this produces 1/x.
 ; ??? Might want different names.
 (drn (inv &options &mode s1)
-     (OPTIONS ANYMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYINTMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 ; MODE is the mode of S1.  The result always has mode BI.
 ; ??? Perhaps `mode' shouldn't be here.
 (drn (not &options &mode s1)
-     (OPTIONS ANYMODE RTX) (NA NA OP0)
+     BI
+     (OPTIONS ANYINTMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 
 (drn (add &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (sub &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 ; For the *flag rtx's, MODE is the mode of S1,S2; the result always has
 ; mode BI.
 (drn (addc &options &mode s1 s2 s3)
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
-(drn (add-cflag &options &mode s1 s2 s3) ; FIXME: rename to addc-cflag
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+(drn (addc-cflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
-(drn (add-oflag &options &mode s1 s2 s3) ; FIXME: rename to addc-vflag
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+(drn (addc-oflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
 (drn (subc &options &mode s1 s2 s3)
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
+     TRINARY
+     #f
+)
+(drn (subc-cflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
+     TRINARY
+     #f
+)
+(drn (subc-oflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
+     TRINARY
+     #f
+)
+
+;; ??? These are deprecated.  Delete in time.
+(drn (add-cflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
+     TRINARY
+     #f
+)
+(drn (add-oflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
-(drn (sub-cflag &options &mode s1 s2 s3) ; FIXME: rename to subc-cflag
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+(drn (sub-cflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
-(drn (sub-oflag &options &mode s1 s2 s3) ; FIXME: rename to subc-vflag
-     (OPTIONS ANYMODE RTX RTX RTX) (NA NA OP0 MATCH1 BI)
+(drn (sub-oflag &options &mode s1 s2 s3)
+     BI
+     (OPTIONS ANYINTMODE RTX RTX RTX) (NA NA MATCHEXPR MATCH2 BI)
      TRINARY
      #f
 )
 ; Multiply/divide.
 
 (drn (mul &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 ; [both host and target], and one that specifies implementation defined
 ; situations [target].
 (drn (div &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (udiv &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (mod &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (umod &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 ; various floating point routines
 
 (drn (sqrt &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 
 (drn (cos &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 
 (drn (sin &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA OP0)
+     #f
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
+     UNARY
+     #f
+)
+
+(drn (nan &options &mode s1)
+     BI
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
+     UNARY
+     #f
+)
+(drn (qnan &options &mode s1)
+     BI
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
+     UNARY
+     #f
+)
+(drn (snan &options &mode s1)
+     BI
+     (OPTIONS ANYFLOATMODE RTX) (NA NA MATCHEXPR)
      UNARY
      #f
 )
 ; min/max
 
 (drn (min &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 
 (drn (max &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 
 (drn (umin &options &mode s1 s2)
-     (OPTIONS INTMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 
 (drn (umax &options &mode s1 s2)
-     (OPTIONS INTMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 
 ; These are bitwise operations.
 (drn (and &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (or &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 (drn (xor &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
      BINARY
      #f
 )
 ; Shift operations.
 
 (drn (sll &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 INT)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR INT)
      BINARY
      #f
 )
 (drn (srl &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 INT)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR INT)
      BINARY
      #f
 )
 ; ??? In non-sim case, ensure s1 is in right C type for right result.
 (drn (sra &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 INT)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR INT)
      BINARY
      #f
 )
 ; Rotates don't really have a sign, so doesn't matter what we say.
 (drn (ror &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 INT)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR INT)
      BINARY
      #f
 )
 (drn (rol &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 INT)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA MATCHEXPR INT)
      BINARY
      #f
 )
 ; On the other hand, handling an arbitrary number of args isn't supported by
 ; ISA's, which the main goal of what we're trying to represent.
 (drn (andif &options &mode s1 s2)
-     (OPTIONS DFLTMODE RTX RTX) (NA NA ANY ANY)
+     BI
+     (OPTIONS BIMODE RTX RTX) (NA NA ANYINT ANYINT)
      BINARY ; IF?
      #f
 )
 (drn (orif &options &mode s1 s2)
-     (OPTIONS DFLTMODE RTX RTX) (NA NA ANY ANY)
+     BI
+     (OPTIONS BIMODE RTX RTX) (NA NA ANYINT ANYINT)
      BINARY ; IF?
      #f
 )
 ;     ...
 ;)
 \f
-; Conversions.
+;; Integer conversions.
 
 (drn (ext &options &mode s1)
-     (OPTIONS INTMODE RTX) (NA NA ANY)
+     #f
+     (OPTIONS ANYINTMODE RTX) (NA NA ANY)
      UNARY
      #f
 )
 (drn (zext &options &mode s1)
-     (OPTIONS INTMODE RTX) (NA NA ANY)
+     #f
+     (OPTIONS ANYINTMODE RTX) (NA NA ANY)
      UNARY
      #f
 )
 (drn (trunc &options &mode s1)
-     (OPTIONS INTMODE RTX) (NA NA ANY)
+     #f
+     (OPTIONS ANYINTMODE RTX) (NA NA ANY)
      UNARY
      #f
 )
-(drn (fext &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA ANY)
+
+;; Conversions involving floating point values.
+
+(drn (fext &options &mode how s1)
+     #f
+     (OPTIONS ANYFLOATMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
-(drn (ftrunc &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA ANY)
+(drn (ftrunc &options &mode how s1)
+     #f
+     (OPTIONS ANYFLOATMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
-(drn (float &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA ANY)
+(drn (float &options &mode how s1)
+     #f
+     (OPTIONS ANYFLOATMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
-(drn (ufloat &options &mode s1)
-     (OPTIONS FLOATMODE RTX) (NA NA ANY)
+(drn (ufloat &options &mode how s1)
+     #f
+     (OPTIONS ANYFLOATMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
-(drn (fix &options &mode s1)
-     (OPTIONS INTMODE RTX) (NA NA ANY)
+(drn (fix &options &mode how s1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
-(drn (ufix &options &mode s1)
-     (OPTIONS INTMODE RTX) (NA NA ANY)
+(drn (ufix &options &mode how s1)
+     #f
+     (OPTIONS ANYINTMODE RTX RTX) (NA NA INT ANY)
      UNARY
      #f
 )
 ; MODE is the mode of S1,S2.  The result always has mode BI.
 
 (drn (eq &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (ne &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 ; ??? In non-sim case, ensure s1,s2 is in right C type for right result.
 (drn (lt &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (le &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (gt &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (ge &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 ; ??? In non-sim case, ensure s1,s2 is in right C type for right result.
 (drn (ltu &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (leu &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (gtu &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 (drn (geu &options &mode s1 s2)
-     (OPTIONS ANYMODE RTX RTX) (NA NA OP0 MATCH1)
-     BINARY
+     BI
+     (OPTIONS ANYNUMMODE RTX RTX) (NA NA MATCHEXPR MATCH2)
+     COMPARE
      #f
 )
 \f
 ; VALUE is any constant rtx.  SET is a `number-list' rtx.
 
 (drn (member &options &mode value set)
-     (OPTIONS DFLTMODE RTX RTX) (NA NA INT INT)
+     #f
+     (OPTIONS BIMODE RTX RTX) (NA NA INT INT)
      MISC
      (begin
        (if (not (rtx-constant? value))
-          (context-error (estate-context *estate*) "value is not a constant" value))
+          (estate-error *estate* "`member rtx'"
+                        "value is not a constant" value))
        (if (not (rtx-kind? 'number-list set))
-          (context-error (estate-context *estate*) "set is not a `number-list' rtx" set))
+          (estate-error *estate* "`member' rtx"
+                        "set is not a `number-list' rtx" set))
        (if (memq (rtx-constant-value value) (rtx-number-list-values set))
           (rtx-true)
           (rtx-false)))
 )
 
+;; FIXME: "number" in "number-list" implies floats are ok.
+;; Rename to integer-list, int-list, or some such.
+
 (drn (number-list &options &mode value-list)
+     #f
      (OPTIONS INTMODE NUMBER . NUMBER) (NA NA NA . NA)
      MISC
      #f
 
 ; FIXME: make syntax node?
 (drn (if &options &mode cond then . else)
-     (OPTIONS ANYMODE TESTRTX RTX . RTX) (NA NA ANY OP0 . MATCH2)
+     #f
+     ;; ??? It would be cleaner if TESTRTX had to have BI mode.
+     (OPTIONS ANYEXPRMODE TESTRTX RTX . RTX) (NA NA ANYINT MATCHEXPR . MATCH3)
      IF
      (apply e-if (append! (list *estate* mode cond then) else))
 )
 
 ; ??? The syntax here isn't quite that of Scheme.  A condition must be
 ; followed by a result expression.
+; ??? The syntax here isn't quite right, there must be at least one cond rtx.
 ; ??? Intermediate expressions (the ones before the last one) needn't have
 ; the same mode as the result.
 (drsn (cond &options &mode . cond-code-list)
-      (OPTIONS ANYMODE . CONDRTX) (NA NA . OP0)
+     #f
+      (OPTIONS ANYEXPRMODE . CONDRTX) (NA NA . MATCHEXPR)
       COND
       #f
 )
 
+; ??? The syntax here isn't quite right, there must be at least one case.
 ; ??? Intermediate expressions (the ones before the last one) needn't have
 ; the same mode as the result.
 (drn (case &options &mode test . case-list)
-     (OPTIONS ANYMODE RTX . CASERTX) (NA NA ANY . OP0)
+     #f
+     (OPTIONS ANYEXPRMODE RTX . CASERTX) (NA NA ANY . MATCHEXPR)
      COND
      #f
 )
 \f
-; Parallels and Sequences
+; parallel, sequence, do-count, closure
 
 ; This has to be a syntax node as we don't want EXPRS to be pre-evaluated.
 ; All semantic ops must have a mode, though here it must be VOID.
 ; IGNORE is for consistency with sequence.  ??? Delete some day.
-; ??? There's no real need for mode either.
+; ??? There's no real need for mode either, but convention requires it.
 
 (drsn (parallel &options &mode ignore expr . exprs)
+     #f
       (OPTIONS VOIDMODE LOCALS RTX . RTX) (NA NA NA VOID . VOID)
       SEQUENCE
       #f
 
 ; This has to be a syntax node to handle locals properly: they're not defined
 ; yet and thus pre-evaluating the expressions doesn't work.
-; ??? This should create a closure.
 
 (drsn (sequence &options &mode locals expr . exprs)
-      (OPTIONS ANYMODE LOCALS RTX . RTX) (NA NA NA OP0 . OP0)
+     #f
+      (OPTIONS VOIDORNUMMODE LOCALS RTX . RTX) (NA NA NA MATCHSEQ . MATCHSEQ)
       SEQUENCE
       #f
 )
-\f
+
+; This has to be a syntax node to handle iter-var properly: it's not defined
+; yet and thus pre-evaluating the expressions doesn't work.
+
+(drsn (do-count &options &mode iter-var nr-times expr . exprs)
+     #f
+      (OPTIONS VOIDMODE ITERATION RTX RTX . RTX) (NA NA NA INT VOID . VOID)
+      SEQUENCE
+      #f
+)
+
 ; Internal rtx to create a closure.
-; Internal, so it does not appear in rtl.texi.
+; Internal, so it does not appear in rtl.texi (at least not yet).
+; ??? Maybe closures shouldn't be separate from sequences,
+; but I'm less convinced these days.
 
-(drsn (closure &options &mode expr env)
-      (OPTIONS DFLTMODE RTX ENV) (NA NA NA NA)
+(drsn (closure &options &mode isa-name-list env-stack expr)
+     #f
+      (OPTIONS VOIDORNUMMODE SYMBOLLIST ENVSTACK RTX) (NA NA NA NA MATCHEXPR)
       MISC
       #f
 )