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]
Other format: [Raw text]

Re: m68k: Fix PR18421 and PR16719


Bernardo Innocenti wrote:

> gcc/
> 2004-12-06  Peter Barada  <peter@the-baradas.com>
> 
> 	PR middle-end/16719
> 	PR middle-end/18421
> 	* config/m68k/m68k.h (HARD_REGNO_MODE_OK): Disallow bytes
> 	in address registers.
> 	* config/m68k/m68k.c (hard_regno_mode_ok): Likewise.
> 	* config/m68k/m68k.md: Replace 's' with 'i' in 4th
> 	alternative of addsi3_5200.

Thanks to Adam Conrad, this patch has been finally regtested
on m68k-linux on 4.0 and 3.4, with no new testcase failures
and one old failure accidentally fixed.

This patch was approved for several months ago, so if nobody
objects I'll go on and install it on mainline.

PR16719 and PR18421 are also outstanding regressions on 3.4
and 4.0.  OK to backport the patch?



> Index: gcc-4.0.0/gcc/config/m68k/m68k-protos.h
> ===================================================================
> RCS file: /cvs/uberbaum/gcc/config/m68k/m68k-protos.h,v
> retrieving revision 1.17
> diff -c -3 -p -r1.17 m68k-protos.h
> *** gcc-4.0.0/gcc/config/m68k/m68k-protos.h	22 Oct 2004 12:47:24 -0000	1.17
> --- gcc-4.0.0/gcc/config/m68k/m68k-protos.h	6 Dec 2004 15:54:05 -0000
> *************** extern rtx legitimize_pic_address (rtx, 
> *** 53,58 ****
> --- 53,59 ----
>   
>   #endif /* RTX_CODE */
>   
> + extern bool m68k_regno_mode_ok (int, enum machine_mode);
>   extern int flags_in_68881 (void);
>   extern bool use_return_insn (void);
>   extern void override_options (void);
> Index: gcc-4.0.0/gcc/config/m68k/m68k.c
> ===================================================================
> RCS file: /cvs/uberbaum/gcc/config/m68k/m68k.c,v
> retrieving revision 1.143
> diff -c -3 -p -r1.143 m68k.c
> *** gcc-4.0.0/gcc/config/m68k/m68k.c	9 Nov 2004 10:13:09 -0000	1.143
> --- gcc-4.0.0/gcc/config/m68k/m68k.c	6 Dec 2004 15:54:06 -0000
> *************** m68k_hard_regno_rename_ok (unsigned int 
> *** 3445,3447 ****
> --- 3445,3480 ----
>   
>     return 1;
>   }
> + 
> + /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
> +    On the 68000, the cpu registers can hold any mode except bytes in address
> +    registers, but the 68881 registers can hold only SFmode or DFmode.  */
> + bool
> + m68k_regno_mode_ok (int regno, enum machine_mode mode)
> + {
> +   if (regno < 8)
> +     {
> + 	/* Data Registers, can hold aggregate if fits in.  */
> + 	if (regno + GET_MODE_SIZE (mode) / 4 <= 8)
> + 	  return true;
> +     }
> +   else if (regno < 16)
> +     {
> + 	/* Address Registers, can't hold bytes, can hold aggregate if
> + 	   fits in.  */
> + 	if (GET_MODE_SIZE (mode) == 1)
> + 	  return false;
> + 	if (regno + GET_MODE_SIZE (mode) / 4 <= 16)
> + 	  return true;
> +     }
> +   else if (regno < 24)
> +     {
> +       /* FPU registers, hold float or complex float of long double or
> + 	   smaller.  */
> + 	if ((GET_MODE_CLASS (mode) == MODE_FLOAT
> + 	     || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
> + 	    && GET_MODE_UNIT_SIZE (mode) <= 12)
> + 	  return true;
> +     }
> +   return false;
> + }
> Index: gcc-4.0.0/gcc/config/m68k/m68k.h
> ===================================================================
> RCS file: /cvs/uberbaum/gcc/config/m68k/m68k.h,v
> retrieving revision 1.122
> diff -c -3 -p -r1.122 m68k.h
> *** gcc-4.0.0/gcc/config/m68k/m68k.h	9 Nov 2004 10:13:09 -0000	1.122
> --- gcc-4.0.0/gcc/config/m68k/m68k.h	6 Dec 2004 15:54:06 -0000
> *************** extern int target_flags;
> *** 486,500 ****
>   #define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \
>     m68k_hard_regno_rename_ok (OLD_REG, NEW_REG)
>   
> ! /* On the m68k, the cpu registers can hold any mode but the 68881 registers
> !    can hold only SFmode or DFmode.  */
>   #define HARD_REGNO_MODE_OK(REGNO, MODE) \
> !   (((REGNO) < 16					\
> !     && !((REGNO) < 8 && (REGNO) + GET_MODE_SIZE (MODE) / 4 > 8))	\
> !    || ((REGNO) >= 16 && (REGNO) < 24				        \
> !        && (GET_MODE_CLASS (MODE) == MODE_FLOAT		\
> ! 	   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)		\
> !        && GET_MODE_UNIT_SIZE (MODE) <= 12))
>   
>   #define MODES_TIEABLE_P(MODE1, MODE2)			\
>     (! TARGET_68881					\
> --- 486,497 ----
>   #define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \
>     m68k_hard_regno_rename_ok (OLD_REG, NEW_REG)
>   
> ! /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
> !    On the 68000, the cpu registers can hold any mode except bytes in
> !    address registers, the 68881 registers can hold only SFmode or DFmode.  */
> ! 
>   #define HARD_REGNO_MODE_OK(REGNO, MODE) \
> !   m68k_regno_mode_ok ((REGNO), (MODE))
>   
>   #define MODES_TIEABLE_P(MODE1, MODE2)			\
>     (! TARGET_68881					\
> Index: gcc-4.0.0/gcc/config/m68k/m68k.md
> ===================================================================
> RCS file: /cvs/uberbaum/gcc/config/m68k/m68k.md,v
> retrieving revision 1.80
> diff -c -3 -p -r1.80 m68k.md
> *** gcc-4.0.0/gcc/config/m68k/m68k.md	6 Aug 2004 07:14:56 -0000	1.80
> --- gcc-4.0.0/gcc/config/m68k/m68k.md	6 Dec 2004 15:54:07 -0000
> ***************
> *** 1850,1856 ****
>   (define_insn "*addsi3_5200"
>     [(set (match_operand:SI 0 "nonimmediate_operand" "=m,?a,?a,r")
>   	(plus:SI (match_operand:SI 1 "general_operand" "%0,a,rJK,0")
> ! 		 (match_operand:SI 2 "general_src_operand" "d,rJK,a,mrIKLs")))]
>     "TARGET_COLDFIRE"
>     "* return output_addsi3 (operands);")
>   
> --- 1850,1856 ----
>   (define_insn "*addsi3_5200"
>     [(set (match_operand:SI 0 "nonimmediate_operand" "=m,?a,?a,r")
>   	(plus:SI (match_operand:SI 1 "general_operand" "%0,a,rJK,0")
> ! 		 (match_operand:SI 2 "general_src_operand" "d,rJK,a,mrIKLi")))]
>     "TARGET_COLDFIRE"
>     "* return output_addsi3 (operands);")


-- 
  // Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/  http://www.develer.com/


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