[Bug other/57195] New: Mode attributes with specific mode iterator can not be used as mode iterators in *.md files

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue May 7 15:56:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57195

             Bug #: 57195
           Summary: Mode attributes with specific mode iterator can not be
                    used as mode iterators in *.md files
    Classification: Unclassified
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: ubizjak@gmail.com


There is a strange undocumented limitation when using mode attributes with
specific mode iterator as mode iterators in *.md files. As an example from
i386.md, following RTX is accepted:

(define_insn_and_split "copysign<mode>3_const"
  [(set (match_operand:CSGNMODE 0 "register_operand" "=x")
    (unspec:CSGNMODE
      [(match_operand:<CSGNVMODE> 1 "vector_move_operand" "xmC")
       (match_operand:CSGNMODE 2 "register_operand" "0")
       (match_operand:<CSGNVMODE> 3 "nonimmediate_operand" "xm")]
      UNSPEC_COPYSIGN))]
  ...)

However, when equivalent named mode attribute (i.e. <CSGNMODE:CSGNVMODE> below)
is used in place of a mode iterator:

(define_insn_and_split "copysign<mode>3_const"
  [(set (match_operand:CSGNMODE 0 "register_operand" "=x")
    (unspec:CSGNMODE
      [(match_operand:<CSGNMODE:CSGNVMODE> 1 "vector_move_operand" "xmC")
       (match_operand:CSGNMODE 2 "register_operand" "0")
       (match_operand:<CSGNVMODE> 3 "nonimmediate_operand" "xm")]
      UNSPEC_COPYSIGN))]
  ...)

compilation breaks with:

build/genconditions
../../gcc-svn/branches/gcc-4_8-branch/gcc/config/i386/i386.md > tmp-condmd.c
../../gcc-svn/branches/gcc-4_8-branch/gcc/config/i386/i386.md:8866: unknown
mode `<CSGNMODE'
../../gcc-svn/branches/gcc-4_8-branch/gcc/config/i386/i386.md:8866: following
context is `:CSGNVMODE> 1 "vector_move_operand" "xmC")'

The iterators are defined as:

(define_mode_iterator CSGNMODE [SF DF TF])
(define_mode_attr CSGNVMODE [(SF "V4SF") (DF "V2DF") (TF "TF")])

I would like to use mode attribute with named mode in the following pattern:

(define_insn "*vec_extract<PEXTR_MODE:mode>_zext"
  [(set (match_operand:SWI48 0 "register_operand" "=r")
    (zero_extend:SWI48
      (vec_select:<PEXTR_MODE:ssescalarmode>
        (match_operand:PEXTR_MODE 1 "register_operand" "x")
        (parallel
          [(match_operand:SI 2
         "const_0_to_<PEXTR_MODE:ssescalarnummask>_operand")]))))]

where ssescalarmode mode attribute applies to PEXTR_MODE mode iterator, and not
to SWI48.



More information about the Gcc-bugs mailing list