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]

Re: egcs/gcc internal errors in the recent snapshot


On Thu, Mar 11, 1999 at 12:18:47PM +0200, Alexander L. Belikoff wrote:
> egcs_crash3.c:49: internal error--insn does not satisfy its constraints:
> (insn 309 282 214 (set (reg:QI 36 $f4)
>         (reg:QI 3 $3)) 288 {movsi-1} (nil)
>     (nil))

Ok, I finally tracked this down.  This is a bit of ugliness that 
worked before because there was no int to fp register move insns.

I considered making the change conditional on TARGET_CIX, but 
rejected it as not being Right.  We'll see how much in the way of
performance we lose on ev56, I guess.

Jeff, this is something that's been bitched about wrt egcs 1.1;
I think it should go there as well.


r~


	* alpha.h (HARD_REGNO_MODE_OK): Disallow QI/HImode in fp regs.
	(MODES_TIEABLE_P): Update.

Index: config/alpha/alpha.h
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/config/alpha/alpha.h,v
retrieving revision 1.59
diff -c -p -d -r1.59 alpha.h
*** alpha.h	1999/03/02 07:21:46	1.59
--- alpha.h	1999/03/11 21:28:42
*************** extern void override_options ();
*** 620,637 ****
  /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
     On Alpha, the integer registers can hold any mode.  The floating-point
     registers can hold 32-bit and 64-bit integers as well, but not 16-bit
!    or 8-bit values.  If we only allowed the larger integers into FP registers,
!    we'd have to say that QImode and SImode aren't tiable, which is a
!    pain.  So say all registers can hold everything and see how that works.  */
  
! #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
  
  /* Value is 1 if it is a good idea to tie two pseudo registers
     when one has mode MODE1 and one has mode MODE2.
     If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
     for any hard reg, then this must be 0 for correct output.  */
  
! #define MODES_TIEABLE_P(MODE1, MODE2) 1
  
  /* Specify the registers used for certain standard purposes.
     The values of these macros are register numbers.  */
--- 620,639 ----
  /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
     On Alpha, the integer registers can hold any mode.  The floating-point
     registers can hold 32-bit and 64-bit integers as well, but not 16-bit
!    or 8-bit values.  */
  
! #define HARD_REGNO_MODE_OK(REGNO, MODE) 			\
!   ((REGNO) < 32 || ((MODE) != QImode && (MODE) != HImode))
  
  /* Value is 1 if it is a good idea to tie two pseudo registers
     when one has mode MODE1 and one has mode MODE2.
     If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
     for any hard reg, then this must be 0 for correct output.  */
  
! #define MODES_TIEABLE_P(MODE1, MODE2) 				\
!   ((MODE1) == QImode || (MODE1) == HImode			\
!    ? (MODE2) == QImode || (MODE2) == HImode			\
!    : 1)
  
  /* Specify the registers used for certain standard purposes.
     The values of these macros are register numbers.  */


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