This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ia64 fr register reunification


As enabled by the earlier CLASS_CANNOT_CHANGE_MODE patch.


r~


        * config/ia64/ia64.h (enum reg_class): Remove FR_INT_REGS, FR_FP_REGS,
        GR_AND_FR_INT_REGS, GR_AND_FR_FP_REGS.
        (REG_CLASS_NAMES): Likewise.
        (REG_CLASS_CONTENTS): Likewise.
        (FR_FP_REGNO_P, FR_INT_REGNO_P): Remove.
        (HARD_REGNO_MODE_OK): Remove references to them.
        (REGNO_REG_CLASS): Likewise.
        (REG_CLASS_FROM_LETTER): Likewise.
        (CLASS_MAX_NREGS): Likewise.
        (REGISTER_MOVE_COST): Likewise.
        * config/ia64/ia64.c (ia64_secondary_reload_class): Likewise.
        * config/ia64/ia64.md (*): Replace "e" constraints with "f".
        (movqi_internal): Special case moves from zero.
        (movhi_internal, movsi_internal): Likewise.
        (movdi_internal): Likewise.  Fill out "f" constraints.
        (movsf_internal): Fill out "r" constraints.
        (movdf_internal): Likewise.

Index: config/ia64/ia64.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/ia64/ia64.c,v
retrieving revision 1.22
diff -c -p -d -r1.22 ia64.c
*** ia64.c	2000/06/08 17:15:32	1.22
--- ia64.c	2000/06/13 23:12:20
*************** ia64_secondary_reload_class (class, mode
*** 1969,1975 ****
       because paradoxical subregs are not accepted by register_operand when
       INSN_SCHEDULING is defined.  Or alternatively, stop the paradoxical subreg
       stupidity in the *_operand functions in recog.c.  */
!   if ((class == FR_REGS || class == FR_INT_REGS || class == FR_FP_REGS)
        && GET_CODE (x) == MEM
        && (GET_MODE (x) == SImode || GET_MODE (x) == HImode
  	  || GET_MODE (x) == QImode))
--- 1969,1975 ----
       because paradoxical subregs are not accepted by register_operand when
       INSN_SCHEDULING is defined.  Or alternatively, stop the paradoxical subreg
       stupidity in the *_operand functions in recog.c.  */
!   if (class == FR_REGS
        && GET_CODE (x) == MEM
        && (GET_MODE (x) == SImode || GET_MODE (x) == HImode
  	  || GET_MODE (x) == QImode))
*************** ia64_secondary_reload_class (class, mode
*** 1978,1992 ****
    /* This can happen because of the ior/and/etc patterns that accept FP
       registers as operands.  If the third operand is a constant, then it
       needs to be reloaded into a FP register.  */
!   if ((class == FR_REGS || class == FR_INT_REGS || class == FR_FP_REGS)
!       && GET_CODE (x) == CONST_INT)
!     return GR_REGS;
! 
!   /* Moving a integer from an FP register to memory requires a general register
!      as an intermediary.  This is not necessary if we are moving a DImode
!      subreg of a DFmode value from an FP register to memory, since stfd will
!      do the right thing in this case.  */
!   if (class == FR_INT_REGS && GET_CODE (x) == MEM && GET_MODE (x) == DImode)
      return GR_REGS;
  
    /* ??? This happens if we cse/gcse a CCmode value across a call, and the
--- 1978,1984 ----
    /* This can happen because of the ior/and/etc patterns that accept FP
       registers as operands.  If the third operand is a constant, then it
       needs to be reloaded into a FP register.  */
!   if (class == FR_REGS && GET_CODE (x) == CONST_INT)
      return GR_REGS;
  
    /* ??? This happens if we cse/gcse a CCmode value across a call, and the
Index: config/ia64/ia64.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/ia64/ia64.h,v
retrieving revision 1.18
diff -c -p -d -r1.18 ia64.h
*** ia64.h	2000/06/13 21:47:41	1.18
--- ia64.h	2000/06/13 23:12:20
*************** while (0)
*** 545,554 ****
  /* Ranges for the various kinds of registers.  */
  #define ADDL_REGNO_P(REGNO) ((REGNO) >= 0 && (REGNO) <= 3)
  #define GR_REGNO_P(REGNO) ((REGNO) >= 0 && (REGNO) <= 127)
- #define FR_FP_REGNO_P(REGNO) \
-   (((REGNO) >= 128 && (REGNO) <= 143) || ((REGNO) >= 152 && (REGNO) <= 223))
- #define FR_INT_REGNO_P(REGNO) \
-   (((REGNO) >= 144 && (REGNO) <= 151) || ((REGNO) >= 224 && (REGNO) <= 255))
  #define FR_REGNO_P(REGNO) ((REGNO) >= 128 && (REGNO) <= 255)
  #define PR_REGNO_P(REGNO) ((REGNO) >= 256 && (REGNO) <= 319)
  #define BR_REGNO_P(REGNO) ((REGNO) >= 320 && (REGNO) <= 327)
--- 545,550 ----
*************** while (0)
*** 816,825 ****
     that one).  */
  
  #define HARD_REGNO_MODE_OK(REGNO, MODE) \
!   (FR_FP_REGNO_P (REGNO) ? ! INTEGRAL_MODE_P (MODE)			\
!    : FR_INT_REGNO_P (REGNO) ? ! FLOAT_MODE_P (MODE)			\
!    : PR_REGNO_P (REGNO) ? (MODE) == CCmode				\
!    : 1)
  
  /* A C expression that is nonzero if it is desirable to choose register
     allocation so as to avoid move instructions between a value of mode MODE1
--- 812,818 ----
     that one).  */
  
  #define HARD_REGNO_MODE_OK(REGNO, MODE) \
!   (PR_REGNO_P (REGNO) ? (MODE) == CCmode : 1)
  
  /* A C expression that is nonzero if it is desirable to choose register
     allocation so as to avoid move instructions between a value of mode MODE1
*************** while (0)
*** 861,871 ****
     register class, followed by one more enumeral value, `LIM_REG_CLASSES',
     which is not a register class but rather tells how many classes there
     are.  */
- /* ??? FP registers hold INT and FP values in different representations, so
-    we can't just use a subreg to convert between the two.  We get around this
-    problem by segmenting the FP register set into two parts.  One part (FR_INT)
-    only holds integer values, and one part (FR_FP) only hold FP values.  Thus
-    we always know which representation is being used.  */
  /* ??? When compiling without optimization, it is possible for the only use of
     a pseudo to be a parameter load from the stack with a REG_EQUIV note.
     Regclass handles this case specially and does not assign any costs to the
--- 854,859 ----
*************** enum reg_class
*** 879,889 ****
    BR_REGS,
    ADDL_REGS,
    GR_REGS,
-   FR_INT_REGS,
-   FR_FP_REGS,
    FR_REGS,
-   GR_AND_FR_INT_REGS,
-   GR_AND_FR_FP_REGS,
    GR_AND_FR_REGS,
    ALL_REGS,
    LIM_REG_CLASSES
--- 867,873 ----
*************** enum reg_class
*** 897,905 ****
  /* An initializer containing the names of the register classes as C string
     constants.  These names are used in writing some of the debugging dumps.  */
  #define REG_CLASS_NAMES \
! { "NO_REGS", "PR_REGS", "BR_REGS", "ADDL_REGS", "GR_REGS", "FR_INT_REGS", \
!   "FR_FP_REGS", "FR_REGS", "GR_AND_FR_INT_REGS", "GR_AND_FR_FP_REGS",	  \
!   "GR_AND_FR_REGS", "ALL_REGS" }
  
  /* An initializer containing the contents of the register classes, as integers
     which are bit masks.  The Nth integer specifies the contents of class N.
--- 881,888 ----
  /* An initializer containing the names of the register classes as C string
     constants.  These names are used in writing some of the debugging dumps.  */
  #define REG_CLASS_NAMES \
! { "NO_REGS", "PR_REGS", "BR_REGS", "ADDL_REGS", "GR_REGS", \
!   "FR_REGS", "GR_AND_FR_REGS", "ALL_REGS" }
  
  /* An initializer containing the contents of the register classes, as integers
     which are bit masks.  The Nth integer specifies the contents of class N.
*************** enum reg_class
*** 927,952 ****
    { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
      0x00000000, 0x00000000, 0x00000000, 0x00000000,	\
      0x00000000, 0x00000000, 0x300 },			\
-   /* FR_INT_REGS.  */					\
-   { 0x00000000, 0x00000000, 0x00000000, 0x00000000,	\
-     0x00FF0000, 0x00000000, 0x00000000, 0xFFFFFFFF,	\
-     0x00000000, 0x00000000, 0x000 },			\
-   /* FR_FP_REGS.  */					\
-   { 0x00000000, 0x00000000, 0x00000000, 0x00000000,	\
-     0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,	\
-     0x00000000, 0x00000000, 0x000 },			\
    /* FR_REGS.  */					\
    { 0x00000000, 0x00000000, 0x00000000, 0x00000000,	\
      0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
      0x00000000, 0x00000000, 0x000 },			\
-   /* GR_AND_FR_INT_REGS.  */				\
-   { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
-     0x00FF0000, 0x00000000, 0x00000000, 0xFFFFFFFF,	\
-     0x00000000, 0x00000000, 0x300 },			\
-   /* GR_AND_FR_FP_REGS.  */				\
-   { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
-     0xFF00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,	\
-     0x00000000, 0x00000000, 0x300 },			\
    /* GR_AND_FR_REGS.  */				\
    { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
      0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,	\
--- 910,919 ----
*************** enum reg_class
*** 966,973 ****
  #define REGNO_REG_CLASS(REGNO) \
  (ADDL_REGNO_P (REGNO) ? ADDL_REGS	\
   : GENERAL_REGNO_P (REGNO) ? GR_REGS	\
!  : FR_FP_REGNO_P (REGNO) ? FR_FP_REGS	\
!  : FR_INT_REGNO_P (REGNO) ? FR_INT_REGS	\
   : PR_REGNO_P (REGNO) ? PR_REGS		\
   : BR_REGNO_P (REGNO) ? BR_REGS		\
   : NO_REGS)
--- 933,939 ----
  #define REGNO_REG_CLASS(REGNO) \
  (ADDL_REGNO_P (REGNO) ? ADDL_REGS	\
   : GENERAL_REGNO_P (REGNO) ? GR_REGS	\
!  : FR_REGNO_P (REGNO) ? FR_REGS		\
   : PR_REGNO_P (REGNO) ? PR_REGS		\
   : BR_REGNO_P (REGNO) ? BR_REGS		\
   : NO_REGS)
*************** enum reg_class
*** 990,997 ****
     will not be passed to this macro; you do not need to handle it.  */
  
  #define REG_CLASS_FROM_LETTER(CHAR) \
! ((CHAR) == 'f' ? FR_FP_REGS		\
!  : (CHAR) == 'e' ? FR_INT_REGS		\
   : (CHAR) == 'a' ? ADDL_REGS		\
   : (CHAR) == 'b' ? BR_REGS		\
   : (CHAR) == 'c' ? PR_REGS		\
--- 956,962 ----
     will not be passed to this macro; you do not need to handle it.  */
  
  #define REG_CLASS_FROM_LETTER(CHAR) \
! ((CHAR) == 'f' ? FR_REGS		\
   : (CHAR) == 'a' ? ADDL_REGS		\
   : (CHAR) == 'b' ? BR_REGS		\
   : (CHAR) == 'c' ? PR_REGS		\
*************** enum reg_class
*** 1041,1049 ****
     This is closely related to the macro `HARD_REGNO_NREGS'.  */
  
  #define CLASS_MAX_NREGS(CLASS, MODE) \
!   ((MODE) == CCmode && (CLASS) == PR_REGS ? 2				\
!    : (((CLASS) == FR_REGS || (CLASS) == FR_FP_REGS			\
!        || (CLASS) == FR_INT_REGS) && (MODE) == XFmode) ? 1		\
     : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
  
  /* If defined, gives a class of registers that cannot be used as the
--- 1006,1013 ----
     This is closely related to the macro `HARD_REGNO_NREGS'.  */
  
  #define CLASS_MAX_NREGS(CLASS, MODE) \
!   ((MODE) == CCmode && (CLASS) == PR_REGS ? 2			\
!    : ((CLASS) == FR_REGS && (MODE) == XFmode) ? 1		\
     : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
  
  /* If defined, gives a class of registers that cannot be used as the
*************** enum reg_class
*** 1160,1165 ****
--- 1124,1130 ----
     or a `MEM' representing a location in the stack.  This enables DWARF2
     unwind info for C++ EH.  */
  #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (VOIDmode, BR_REG (0))
+ 
  /* ??? This is not defined because of three problems.
     1) dwarf2out.c assumes that DWARF_FRAME_RETURN_COLUMN fits in one byte.
     The default value is FIRST_PSEUDO_REGISTER which doesn't.  This can be
*************** do {									\
*** 1925,1932 ****
  ((FROM) == BR_REGS && (TO) == BR_REGS ? 8				\
   : (((FROM) == BR_REGS && (TO) != GENERAL_REGS)				\
      || ((TO) == BR_REGS && (FROM) != GENERAL_REGS)) ? 6			\
-  : (((FROM) == FR_FP_REGS && (TO) == FR_INT_REGS)			\
-     || ((FROM) == FR_INT_REGS && (TO) == FR_FP_REGS)) ? 4		\
   : 2)
  
  /* A C expression for the cost of moving data of mode M between a register and
--- 1890,1895 ----
Index: config/ia64/ia64.md
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/ia64/ia64.md,v
retrieving revision 1.16
diff -c -p -d -r1.16 ia64.md
*** ia64.md	2000/06/13 20:08:12	1.16
--- ia64.md	2000/06/13 23:12:20
***************
*** 177,194 ****
  }")
  
  (define_insn "*movqi_internal"
!   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,m,r,*e")
! 	(match_operand:QI 1 "move_operand" "r,J,m,r,*e,r"))]
    "! memory_operand (operands[0], QImode)
     || ! memory_operand (operands[1], QImode)"
    "@
!    mov %0 = %1
     addl %0 = %1, r0
     ld1%O1 %0 = %1%P1
!    st1%Q0 %0 = %1%P0
     getf.sig %0 = %1
!    setf.sig %0 = %1"
!   [(set_attr "type" "A,A,M,M,M,M")])
  
  (define_expand "movhi"
    [(set (match_operand:HI 0 "general_operand" "")
--- 177,195 ----
  }")
  
  (define_insn "*movqi_internal"
!   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r, m, r,*f,*f")
! 	(match_operand:QI 1 "move_operand"         "rO,J,m,rO,*f,rO,*f"))]
    "! memory_operand (operands[0], QImode)
     || ! memory_operand (operands[1], QImode)"
    "@
!    mov %0 = %r1
     addl %0 = %1, r0
     ld1%O1 %0 = %1%P1
!    st1%Q0 %0 = %r1%P0
     getf.sig %0 = %1
!    setf.sig %0 = %r1
!    mov %0 = %1"
!   [(set_attr "type" "A,A,M,M,M,M,F")])
  
  (define_expand "movhi"
    [(set (match_operand:HI 0 "general_operand" "")
***************
*** 203,220 ****
  }")
  
  (define_insn "*movhi_internal"
!   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m,r,*e")
! 	(match_operand:HI 1 "move_operand" "r,J,m,r,*e,r"))]
    "! memory_operand (operands[0], HImode)
     || !memory_operand (operands[1], HImode)"
    "@
!    mov %0 = %1
     addl %0 = %1, r0
     ld2%O1 %0 = %1%P1
!    st2%Q0 %0 = %1%P0
     getf.sig %0 = %1
!    setf.sig %0 = %1"
!   [(set_attr "type" "A,A,M,M,M,M")])
  
  (define_expand "movsi"
    [(set (match_operand:SI 0 "general_operand" "")
--- 204,222 ----
  }")
  
  (define_insn "*movhi_internal"
!   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r, m, r,*f,*f")
! 	(match_operand:HI 1 "move_operand"         "rO,J,m,rO,*f,rO,*f"))]
    "! memory_operand (operands[0], HImode)
     || !memory_operand (operands[1], HImode)"
    "@
!    mov %0 = %r1
     addl %0 = %1, r0
     ld2%O1 %0 = %1%P1
!    st2%Q0 %0 = %r1%P0
     getf.sig %0 = %1
!    setf.sig %0 = %r1
!    mov %0 = %1"
!   [(set_attr "type" "A,A,M,M,M,M,F")])
  
  (define_expand "movsi"
    [(set (match_operand:SI 0 "general_operand" "")
***************
*** 229,250 ****
  }")
  
  (define_insn "*movsi_internal"
!   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,m,r,*e,*e,r,*f")
! 	(match_operand:SI 1 "move_operand"       "r,J,i,m,r,*e,r,*e,*f,r"))]
    "! memory_operand (operands[0], SImode)
     || ! memory_operand (operands[1], SImode)"
    "@
!   mov %0 = %1
    addl %0 = %1, r0
    movl %0 = %1
    ld4%O1 %0 = %1%P1
!   st4%Q0 %0 = %1%P0
    getf.sig %0 = %1
!   setf.sig %0 = %1
!   mov %0 = %1
!   getf.s %0 = %1
!   setf.s %0 = %1"
!   [(set_attr "type" "A,A,L,M,M,M,M,F,M,M")])
  
  (define_expand "movdi"
    [(set (match_operand:DI 0 "general_operand" "")
--- 231,250 ----
  }")
  
  (define_insn "*movsi_internal"
!   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r, m, r,*f,*f")
! 	(match_operand:SI 1 "move_operand"         "rO,J,i,m,rO,*f,rO,*f"))]
    "! memory_operand (operands[0], SImode)
     || ! memory_operand (operands[1], SImode)"
    "@
!   mov %0 = %r1
    addl %0 = %1, r0
    movl %0 = %1
    ld4%O1 %0 = %1%P1
!   st4%Q0 %0 = %r1%P0
    getf.sig %0 = %1
!   setf.sig %0 = %r1
!   mov %0 = %1"
!   [(set_attr "type" "A,A,L,M,M,M,M,F")])
  
  (define_expand "movdi"
    [(set (match_operand:DI 0 "general_operand" "")
***************
*** 287,311 ****
      operands[1] = copy_to_mode_reg (DImode, operands[1]);
  }")
  
- ;; ??? Emit stf8 for m/*e constraint.
  (define_insn "*movdi_internal"
!   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,m,r,*e,*e,r,*f,r,*b")
! 	(match_operand:DI 1 "move_operand"       "r,J,i,m,r,*e,r,*e,*f,r,*b,r"))]
    "! memory_operand (operands[0], DImode)
     || ! memory_operand (operands[1], DImode)"
    "@
!   mov %0 = %1
    addl %0 = %1, r0
    movl %0 = %1
    ld8%O1 %0 = %1%P1
!   st8%Q0 %0 = %1%P0
    getf.sig %0 = %1
!   setf.sig %0 = %1
    mov %0 = %1
!   getf.d %0 = %1
!   setf.d %0 = %1
    mov %0 = %1
!   mov %0 = %1"
    [(set_attr "type" "A,A,L,M,M,M,M,F,M,M,I,I")])
  
  (define_expand "load_fptr"
--- 287,310 ----
      operands[1] = copy_to_mode_reg (DImode, operands[1]);
  }")
  
  (define_insn "*movdi_internal"
!   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r, m, r,*f,*f,*f, m, r,*b")
! 	(match_operand:DI 1 "move_operand"         "rO,J,i,m,rO,*f,rO,*f, m,*f,*b,rO"))]
    "! memory_operand (operands[0], DImode)
     || ! memory_operand (operands[1], DImode)"
    "@
!   mov %0 = %r1
    addl %0 = %1, r0
    movl %0 = %1
    ld8%O1 %0 = %1%P1
!   st8%Q0 %0 = %r1%P0
    getf.sig %0 = %1
!   setf.sig %0 = %r1
    mov %0 = %1
!   ldf8%O1 %0 = %1%P1
!   stf8%Q0 %0 = %1%P0
    mov %0 = %1
!   mov %0 = %r1"
    [(set_attr "type" "A,A,L,M,M,M,M,F,M,M,I,I")])
  
  (define_expand "load_fptr"
***************
*** 392,403 ****
      operands[1] = copy_to_mode_reg (SFmode, operands[1]);
  }")
  
- ;; ??? The r/m alternative is apparently needed because of paradoxical subregs,
- ;; so it may no longer be necessary after scheduling is enabled.
- 
  (define_insn "*movsf_internal"
!   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,*r,f,*r,*r")
! 	(match_operand:SF 1 "general_operand" "fG,m,fG,fG,*r,*r,m"))]
    "! memory_operand (operands[0], SFmode)
     || ! memory_operand (operands[1], SFmode)"
    "@
--- 391,399 ----
      operands[1] = copy_to_mode_reg (SFmode, operands[1]);
  }")
  
  (define_insn "*movsf_internal"
!   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f, m,*r, f,*r,*r, m")
! 	(match_operand:SF 1 "general_operand"      "fG,m,fG,fG,*r,*r, m,*r"))]
    "! memory_operand (operands[0], SFmode)
     || ! memory_operand (operands[1], SFmode)"
    "@
***************
*** 407,414 ****
    getf.s %0 = %F1
    setf.s %0 = %1
    mov %0 = %1
!   ld4%O1 %0 = %1"
!   [(set_attr "type" "F,M,M,M,M,A,M")])
  
  (define_expand "movdf"
    [(set (match_operand:DF 0 "general_operand" "")
--- 403,411 ----
    getf.s %0 = %F1
    setf.s %0 = %1
    mov %0 = %1
!   ld4%O1 %0 = %1%P1
!   st4%Q0 %0 = %1%P0"
!   [(set_attr "type" "F,M,M,M,M,A,M,M")])
  
  (define_expand "movdf"
    [(set (match_operand:DF 0 "general_operand" "")
***************
*** 422,432 ****
      operands[1] = copy_to_mode_reg (DFmode, operands[1]);
  }")
  
- ;; ??? movsf has a r/m alternative, movdf doesn't.
- 
  (define_insn "*movdf_internal"
!   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,*r,f,*r")
! 	(match_operand:DF 1 "general_operand" "fG,m,fG,fG,*r,*r"))]
    "! memory_operand (operands[0], DFmode)
     || ! memory_operand (operands[1], DFmode)"
    "@
--- 419,427 ----
      operands[1] = copy_to_mode_reg (DFmode, operands[1]);
  }")
  
  (define_insn "*movdf_internal"
!   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f, m,*r, f,*r,*r, m")
! 	(match_operand:DF 1 "general_operand"      "fG,m,fG,fG,*r,*r, m,*r"))]
    "! memory_operand (operands[0], DFmode)
     || ! memory_operand (operands[1], DFmode)"
    "@
***************
*** 435,442 ****
    stfd %0 = %F1%P0
    getf.d %0 = %F1
    setf.d %0 = %1
!   mov %0 = %1"
!   [(set_attr "type" "F,M,M,M,M,A")])
  
  (define_expand "movxf"
    [(set (match_operand:XF 0 "general_operand" "")
--- 430,439 ----
    stfd %0 = %F1%P0
    getf.d %0 = %F1
    setf.d %0 = %1
!   mov %0 = %1
!   ld8%O1 %0 = %1%P1
!   st8%Q0 %0 = %1%P0"
!   [(set_attr "type" "F,M,M,M,M,A,M,M")])
  
  (define_expand "movxf"
    [(set (match_operand:XF 0 "general_operand" "")
***************
*** 451,458 ****
  }")
  
  (define_insn "*movxf_internal"
!   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,f,m")
! 	(match_operand:XF 1 "general_operand" "fG,m,fG"))]
    "! memory_operand (operands[0], XFmode)
     || ! memory_operand (operands[1], XFmode)"
    "@
--- 448,455 ----
  }")
  
  (define_insn "*movxf_internal"
!   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,f, m")
! 	(match_operand:XF 1 "general_operand"      "fG,m,fG"))]
    "! memory_operand (operands[0], XFmode)
     || ! memory_operand (operands[1], XFmode)"
    "@
***************
*** 485,492 ****
    [(set_attr "type" "I")])
  
  (define_insn "extendsidi2"
!   [(set (match_operand:DI 0 "register_operand" "=r,*e")
! 	(sign_extend:DI (match_operand:SI 1 "register_operand" "r,*e")))]
    ""
    "@
     sxt4 %0 = %1
--- 482,489 ----
    [(set_attr "type" "I")])
  
  (define_insn "extendsidi2"
!   [(set (match_operand:DI 0 "register_operand" "=r,*f")
! 	(sign_extend:DI (match_operand:SI 1 "register_operand" "r,*f")))]
    ""
    "@
     sxt4 %0 = %1
***************
*** 514,521 ****
    [(set_attr "type" "I,M")])
  
  (define_insn "zero_extendsidi2"
!   [(set (match_operand:DI 0 "register_operand" "=r,r,*e")
! 	(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "r,m,*e")))]
    ""
    "@
     zxt4 %0 = %1
--- 511,518 ----
    [(set_attr "type" "I,M")])
  
  (define_insn "zero_extendsidi2"
!   [(set (match_operand:DI 0 "register_operand" "=r,r,*f")
! 	(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "r,m,*f")))]
    ""
    "@
     zxt4 %0 = %1
***************
*** 565,584 ****
  
  (define_insn "floatdixf2"
    [(set (match_operand:XF 0 "register_operand" "=f")
! 	(float:XF (match_operand:DI 1 "register_operand" "e")))]
    ""
    "fcvt.xf %0 = %1"
    [(set_attr "type" "F")])
  
  (define_insn "fix_truncsfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(fix:DI (match_operand:SF 1 "register_operand" "f")))]
    ""
    "fcvt.fx.trunc %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fix_truncdfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(fix:DI (match_operand:DF 1 "register_operand" "f")))]
    ""
    "fcvt.fx.trunc %0 = %1%B0"
--- 562,581 ----
  
  (define_insn "floatdixf2"
    [(set (match_operand:XF 0 "register_operand" "=f")
! 	(float:XF (match_operand:DI 1 "register_operand" "f")))]
    ""
    "fcvt.xf %0 = %1"
    [(set_attr "type" "F")])
  
  (define_insn "fix_truncsfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(fix:DI (match_operand:SF 1 "register_operand" "f")))]
    ""
    "fcvt.fx.trunc %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fix_truncdfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(fix:DI (match_operand:DF 1 "register_operand" "f")))]
    ""
    "fcvt.fx.trunc %0 = %1%B0"
***************
*** 588,614 ****
  
  (define_insn "floatunsdisf2"
    [(set (match_operand:SF 0 "register_operand" "=f")
! 	(unsigned_float:SF (match_operand:DI 1 "register_operand" "e")))]
    ""
    "fcvt.xuf.s %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "floatunsdidf2"
    [(set (match_operand:DF 0 "register_operand" "=f")
! 	(unsigned_float:DF (match_operand:DI 1 "register_operand" "e")))]
    ""
    "fcvt.xuf.d %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fixuns_truncsfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(unsigned_fix:DI (match_operand:SF 1 "register_operand" "f")))]
    ""
    "fcvt.fxu.trunc %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fixuns_truncdfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(unsigned_fix:DI (match_operand:DF 1 "register_operand" "f")))]
    ""
    "fcvt.fxu.trunc %0 = %1%B0"
--- 585,611 ----
  
  (define_insn "floatunsdisf2"
    [(set (match_operand:SF 0 "register_operand" "=f")
! 	(unsigned_float:SF (match_operand:DI 1 "register_operand" "f")))]
    ""
    "fcvt.xuf.s %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "floatunsdidf2"
    [(set (match_operand:DF 0 "register_operand" "=f")
! 	(unsigned_float:DF (match_operand:DI 1 "register_operand" "f")))]
    ""
    "fcvt.xuf.d %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fixuns_truncsfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(unsigned_fix:DI (match_operand:SF 1 "register_operand" "f")))]
    ""
    "fcvt.fxu.trunc %0 = %1%B0"
    [(set_attr "type" "F")])
  
  (define_insn "fixuns_truncdfdi2"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(unsigned_fix:DI (match_operand:DF 1 "register_operand" "f")))]
    ""
    "fcvt.fxu.trunc %0 = %1%B0"
***************
*** 920,928 ****
  ;; ??? Could add maddsi3 patterns patterned after the madddi3 patterns.
  
  (define_insn "*mulsi3_internal"
!   [(set (match_operand:SI 0 "register_operand" "=e")
! 	(mult:SI (match_operand:SI 1 "register_operand" "e")
! 		 (match_operand:SI 2 "nonmemory_operand" "e")))]
    ""
    "xma.l %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
--- 917,925 ----
  ;; ??? Could add maddsi3 patterns patterned after the madddi3 patterns.
  
  (define_insn "*mulsi3_internal"
!   [(set (match_operand:SI 0 "register_operand" "=f")
! 	(mult:SI (match_operand:SI 1 "register_operand" "f")
! 		 (match_operand:SI 2 "nonmemory_operand" "f")))]
    ""
    "xma.l %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
***************
*** 1065,1073 ****
    [(set_attr "type" "A")])
  
  (define_insn "muldi3"
!   [(set (match_operand:DI 0 "register_operand" "=e")
! 	(mult:DI (match_operand:DI 1 "register_operand" "e")
! 		 (match_operand:DI 2 "register_operand" "e")))]
    ""
    "xma.l %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
--- 1062,1070 ----
    [(set_attr "type" "A")])
  
  (define_insn "muldi3"
!   [(set (match_operand:DI 0 "register_operand" "=f")
! 	(mult:DI (match_operand:DI 1 "register_operand" "f")
! 		 (match_operand:DI 2 "register_operand" "f")))]
    ""
    "xma.l %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
***************
*** 1084,1093 ****
  ;; ??? Maybe we should change how adds are canonicalized.
  
  (define_insn "*madddi3"
!   [(set (match_operand:DI 0 "register_operand" "=e")
! 	(plus:DI (mult:DI (match_operand:DI 1 "register_operand" "e")
! 			  (match_operand:DI 2 "register_operand" "e"))
! 		 (match_operand:DI 3 "register_operand" "e")))
     (clobber (match_scratch:DI 4 "=X"))]
    ""
    "xma.l %0 = %1, %2, %3%B0"
--- 1081,1090 ----
  ;; ??? Maybe we should change how adds are canonicalized.
  
  (define_insn "*madddi3"
!   [(set (match_operand:DI 0 "register_operand" "=f")
! 	(plus:DI (mult:DI (match_operand:DI 1 "register_operand" "f")
! 			  (match_operand:DI 2 "register_operand" "f"))
! 		 (match_operand:DI 3 "register_operand" "f")))
     (clobber (match_scratch:DI 4 "=X"))]
    ""
    "xma.l %0 = %1, %2, %3%B0"
***************
*** 1103,1113 ****
  
  (define_insn "*madddi3_elim"
    [(set (match_operand:DI 0 "register_operand" "=&r")
! 	(plus:DI (plus:DI (mult:DI (match_operand:DI 1 "register_operand" "e")
! 				   (match_operand:DI 2 "register_operand" "e"))
! 			  (match_operand:DI 3 "register_operand" "e"))
  		 (match_operand:DI 4 "nonmemory_operand" "rI")))
!    (clobber (match_scratch:DI 5 "=e"))]
    "reload_in_progress"
    "#"
    [(set_attr "type" "unknown")])
--- 1100,1110 ----
  
  (define_insn "*madddi3_elim"
    [(set (match_operand:DI 0 "register_operand" "=&r")
! 	(plus:DI (plus:DI (mult:DI (match_operand:DI 1 "register_operand" "f")
! 				   (match_operand:DI 2 "register_operand" "f"))
! 			  (match_operand:DI 3 "register_operand" "f"))
  		 (match_operand:DI 4 "nonmemory_operand" "rI")))
!    (clobber (match_scratch:DI 5 "=f"))]
    "reload_in_progress"
    "#"
    [(set_attr "type" "unknown")])
***************
*** 1136,1157 ****
  ;; to generate them.
  
  (define_insn "smuldi3_highpart"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(truncate:DI
  	 (lshiftrt:TI
! 	  (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "e"))
! 		   (sign_extend:TI (match_operand:DI 2 "register_operand" "e")))
  	  (const_int 64))))]
    ""
    "xma.h %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
  
  (define_insn "umuldi3_highpart"
!   [(set (match_operand:DI 0 "register_operand" "=e")
  	(truncate:DI
  	 (lshiftrt:TI
! 	  (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "e"))
! 		   (zero_extend:TI (match_operand:DI 2 "register_operand" "e")))
  	  (const_int 64))))]
    ""
    "xma.hu %0 = %1, %2, f0%B0"
--- 1133,1154 ----
  ;; to generate them.
  
  (define_insn "smuldi3_highpart"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(truncate:DI
  	 (lshiftrt:TI
! 	  (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "f"))
! 		   (sign_extend:TI (match_operand:DI 2 "register_operand" "f")))
  	  (const_int 64))))]
    ""
    "xma.h %0 = %1, %2, f0%B0"
    [(set_attr "type" "F")])
  
  (define_insn "umuldi3_highpart"
!   [(set (match_operand:DI 0 "register_operand" "=f")
  	(truncate:DI
  	 (lshiftrt:TI
! 	  (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "f"))
! 		   (zero_extend:TI (match_operand:DI 2 "register_operand" "f")))
  	  (const_int 64))))]
    ""
    "xma.hu %0 = %1, %2, f0%B0"
***************
*** 1735,1743 ****
  ;; ::::::::::::::::::::
  
  (define_insn "anddi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*e")
! 	(and:DI (match_operand:DI 1 "register_operand" "%r,*e")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*e")))]
    ""
    "@
     and %0 = %2, %1
--- 1732,1740 ----
  ;; ::::::::::::::::::::
  
  (define_insn "anddi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*f")
! 	(and:DI (match_operand:DI 1 "register_operand" "%r,*f")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*f")))]
    ""
    "@
     and %0 = %2, %1
***************
*** 1745,1753 ****
    [(set_attr "type" "A,F")])
  
  (define_insn "*andnot"
!   [(set (match_operand:DI 0 "register_operand" "=r,*e")
! 	(and:DI (not:DI (match_operand:DI 1 "register_operand" "r,*e"))
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*e")))]
    ""
    "@
     andcm %0 = %2, %1
--- 1742,1750 ----
    [(set_attr "type" "A,F")])
  
  (define_insn "*andnot"
!   [(set (match_operand:DI 0 "register_operand" "=r,*f")
! 	(and:DI (not:DI (match_operand:DI 1 "register_operand" "r,*f"))
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*f")))]
    ""
    "@
     andcm %0 = %2, %1
***************
*** 1755,1763 ****
    [(set_attr "type" "A,F")])
  
  (define_insn "iordi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*e")
! 	(ior:DI (match_operand:DI 1 "register_operand" "%r,*e")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*e")))]
    ""
    "@
     or %0 = %2, %1
--- 1752,1760 ----
    [(set_attr "type" "A,F")])
  
  (define_insn "iordi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*f")
! 	(ior:DI (match_operand:DI 1 "register_operand" "%r,*f")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*f")))]
    ""
    "@
     or %0 = %2, %1
***************
*** 1765,1773 ****
    [(set_attr "type" "A,F")])
  
  (define_insn "xordi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*e")
! 	(xor:DI (match_operand:DI 1 "register_operand" "%r,*e")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*e")))]
    ""
    "@
     xor %0 = %2, %1
--- 1762,1770 ----
    [(set_attr "type" "A,F")])
  
  (define_insn "xordi3"
!   [(set (match_operand:DI 0 "register_operand" "=r,*f")
! 	(xor:DI (match_operand:DI 1 "register_operand" "%r,*f")
! 		(match_operand:DI 2 "reg_or_8bit_operand" "rK,*f")))]
    ""
    "@
     xor %0 = %2, %1
***************
*** 3000,3006 ****
  		      (return)
  		      (pc)))]
    "ia64_direct_return ()"
!   "(%%J0) br.ret%+.many rp"
    [(set_attr "type" "B")
     (set_attr "predicable" "no")])
  
--- 2997,3003 ----
  		      (return)
  		      (pc)))]
    "ia64_direct_return ()"
!   "(%J0) br.ret%+.many rp"
    [(set_attr "type" "B")
     (set_attr "predicable" "no")])
  
***************
*** 3012,3018 ****
  		      (pc)
  		      (return)))]
    "ia64_direct_return ()"
!   "(%%j0) br.ret%+.many rp"
    [(set_attr "type" "B")
     (set_attr "predicable" "no")])
  
--- 3009,3015 ----
  		      (pc)
  		      (return)))]
    "ia64_direct_return ()"
!   "(%j0) br.ret%+.many rp"
    [(set_attr "type" "B")
     (set_attr "predicable" "no")])
  
***************
*** 3132,3144 ****
  
  (define_insn "fr_spill"
    [(set (match_operand:XF 0 "memory_operand" "=m")
! 	(unspec:XF [(match_operand:XF 1 "register_operand" "f*e")] 3))]
    ""
    "stf.spill %0 = %1%P0"
    [(set_attr "type" "M")])
  
  (define_insn "fr_restore"
!   [(set (match_operand:XF 0 "register_operand" "=f*e")
  	(unspec:XF [(match_operand:XF 1 "memory_operand" "m")] 4))]
    ""
    "ldf.fill %0 = %1%P1"
--- 3129,3141 ----
  
  (define_insn "fr_spill"
    [(set (match_operand:XF 0 "memory_operand" "=m")
! 	(unspec:XF [(match_operand:XF 1 "register_operand" "f")] 3))]
    ""
    "stf.spill %0 = %1%P0"
    [(set_attr "type" "M")])
  
  (define_insn "fr_restore"
!   [(set (match_operand:XF 0 "register_operand" "=f")
  	(unspec:XF [(match_operand:XF 1 "memory_operand" "m")] 4))]
    ""
    "ldf.fill %0 = %1%P1"
***************
*** 3196,3223 ****
    [(unspec_volatile [(const_int 0)] 5)
     (use (match_operand:DI 0 "register_operand" "r"))]
    ""
!   "flushrs\;			\
!    mov r19=ar.rsc\;		\
!    ;;\;				\
!    and r19=0x1c,r19\;		\
!    ;;\;				\
!    mov ar.rsc=r19\;		\
!    ;;\;				\
!    mov ar.bspstore=%0\;		\
!    ;;\;				\
!    or r19=0x3,r19\;		\
!    ;;\;				\
!    loadrs\;			\
!    invala\;			\
!    ;;\;				\
!    mov ar.rsc=r19\;"
    [(set_attr "type" "unknown")
     (set_attr "predicable" "no")])
  
  (define_insn "flushrs"
    [(unspec [(const_int 0)] 21)]
    ""
!   ";; \; flushrs"
    [(set_attr "type" "M")])
  
  ;; ::::::::::::::::::::
--- 3193,3206 ----
    [(unspec_volatile [(const_int 0)] 5)
     (use (match_operand:DI 0 "register_operand" "r"))]
    ""
!   "flushrs\;mov r19=ar.rsc\;;;\;and r19=0x1c,r19\;;;\;mov ar.rsc=r19\;;;\;mov ar.bspstore=%0\;;;\;or r19=0x3,r19\;;;\;loadrs\;invala\;;;\;mov ar.rsc=r19"
    [(set_attr "type" "unknown")
     (set_attr "predicable" "no")])
  
  (define_insn "flushrs"
    [(unspec [(const_int 0)] 21)]
    ""
!   ";;\;flushrs"
    [(set_attr "type" "M")])
  
  ;; ::::::::::::::::::::

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]