This is the mail archive of the gcc-bugs@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]

testcase for combine bug



Hit the send button too quickly.

extern int target_flags;



enum reg_class {
  NO_REGS, DATA_REGS,
  ADDR_REGS, FP_REGS,
  GENERAL_REGS, DATA_OR_FP_REGS,
  ADDR_OR_FP_REGS, ALL_REGS,
  LIM_REG_CLASSES };









extern char *output_move_const_into_data_reg ();
extern char *output_move_simode_const ();
extern char *output_move_simode ();
extern char *output_move_himode ();
extern char *output_move_qimode ();
extern char *output_move_stricthi ();
extern char *output_move_strictqi ();
extern char *output_move_double ();
extern char *output_move_const_single ();
extern char *output_move_const_double ();
extern char *output_btst ();
extern char *output_scc_di ();
extern char *output_addsi3 ();
extern char *output_andsi3 ();
extern char *output_iorsi3 ();
extern char *output_xorsi3 ();
extern void output_dbcc_and_branch ();
extern int const_uint32_operand ();
extern int const_sint32_operand ();
extern int floating_exact_log2 ();
extern int not_sp_operand ();
extern int valid_dbcc_comparison_p ();
extern int extend_operator ();
extern int flags_in_68881 ();
extern int strict_low_part_peephole_ok ();
extern const char *m68k_align_loops_string;
extern const char *m68k_align_jumps_string;
extern const char *m68k_align_funcs_string;
extern int m68k_align_loops;
extern int m68k_align_jumps;
extern int m68k_align_funcs;
extern int m68k_last_compare_had_fp_operands;
extern int symbolic_operand ();
extern int const_int_cost ();
extern int standard_68881_constant_p ();
extern int standard_sun_fpa_constant_p ();
extern void output_function_prologue ();
extern void output_function_epilogue ();
extern int use_return_insn ();
extern void print_operand_address ();
extern void print_operand ();
extern void notice_update_cc ();
extern void finalize_pic ();
extern void override_options ();

typedef __builtin_va_list __gnuc_va_list;
typedef __gnuc_va_list va_list;
typedef	unsigned char	u_char;
typedef	unsigned short	u_short;
typedef	unsigned int	u_int;
typedef	unsigned long	u_long;
typedef	unsigned short	ushort;		 
typedef	char *		caddr_t;	 
typedef	long		daddr_t;	 
typedef	short		dev_t;		 
typedef	unsigned long	ino_t;		 
typedef	long		off_t;		 
typedef	unsigned short	nlink_t;	 
typedef	long		swblk_t;	 
typedef	long		segsz_t;	 
typedef	unsigned short	uid_t;		 
typedef	unsigned short	gid_t;		 
typedef	short		pid_t;		 
typedef	unsigned short	mode_t;		 
typedef	unsigned long	fixpt_t;	 
typedef	struct	_uquad	{ unsigned long val[2]; } u_quad_t;
typedef	struct	_quad	{          long val[2]; } quad_t;
typedef	long *	qaddr_t;
typedef struct _physadr {			 
	short r[1];
} *physadr;
typedef struct label_t {			 
	int val[15];
} label_t;
typedef	char			s1byte_t;	 
typedef	unsigned char		u1byte_t;
typedef	short			s2byte_t;
typedef	unsigned short		u2byte_t;
typedef	long			s4byte_t;
typedef	unsigned long		u4byte_t;
typedef	long long		s8byte_t;
typedef	unsigned long long	u8byte_t;
typedef	float			f4byte_t;
typedef	double			f8byte_t;
typedef signed char                int8_t;
typedef unsigned char            u_int8_t;
typedef short                     int16_t;
typedef unsigned short          u_int16_t;
typedef int                       int32_t;
typedef unsigned int            u_int32_t;
typedef long long                 int64_t;
typedef unsigned long long      u_int64_t;
typedef	unsigned long 	clock_t;
typedef	unsigned int 	size_t;
typedef	int 	ssize_t;
typedef	long 	time_t;
typedef long	fd_mask;
typedef	struct fd_set {
	fd_mask	fds_bits[((( 256  )+((  (sizeof(fd_mask) * 8 )  )-1))/(  
(sizeof(fd_mask) * 8 )  )) ];
} fd_set;
typedef off_t fpos_t;
struct __sbuf {
	unsigned char *_base;
	int	_size;
};
typedef	struct __sFILE {
	unsigned char *_p;	 
	int	_r;		 
	int	_w;		 
	short	_flags;		 
	short	_file;		 
	struct	__sbuf _bf;	 
	int	_lbfsize;	 
	void	*_cookie;	 
	int	(*_close)  (void *)  ;
	int	(*_read)   (void *, char *, int)  ;
	fpos_t	(*_seek)   (void *, fpos_t, int)  ;
	int	(*_write)  (void *, const char *, int)  ;
	struct	__sbuf _ub;	 
	unsigned char *_up;	 
	int	_ur;		 
	unsigned char _ubuf[3];	 
	unsigned char _nbuf[1];	 
	struct	__sbuf _lb;	 
	int	_blksize;	 
	fpos_t	_offset;	 
} FILE;
extern FILE __sF[];
void	 clearerr  (FILE *)  ;
int	 fclose  (FILE *)  ;
int	 feof  (FILE *)  ;
int	 ferror  (FILE *)  ;
int	 fflush  (FILE *)  ;
int	 fgetc  (FILE *)  ;
int	 fgetpos  (FILE *, fpos_t *)  ;
char	*fgets  (char *, size_t, FILE *)  ;
FILE	*fopen  (const char *, const char *)  ;
int	 fprintf  (FILE *, const char *, ...)  ;
int	 fputc  (int, FILE *)  ;
int	 fputs  (const char *, FILE *)  ;
size_t	 fread  (void *, size_t, size_t, FILE *)  ;
FILE	*freopen  (const char *, const char *, FILE *)  ;
int	 fscanf  (FILE *, const char *, ...)  ;
int	 fseek  (FILE *, long, int)  ;
int	 fsetpos  (FILE *, const fpos_t *)  ;
long	 ftell  (const FILE *)  ;
size_t	 fwrite  (const void *, size_t, size_t, FILE *)  ;
int	 getc  (FILE *)  ;
int	 getchar  (void)  ;
char	*gets  (char *)  ;
extern int sys_nerr;			 
extern const char *const sys_errlist[];
void	 perror  (const char *)  ;
int	 printf  (const char *, ...)  ;
int	 putc  (int, FILE *)  ;
int	 putchar  (int)  ;
int	 puts  (const char *)  ;
int	 remove  (const char *)  ;
int	 rename   (const char *, const char *)  ;
void	 rewind  (FILE *)  ;
int	 scanf  (const char *, ...)  ;
void	 setbuf  (FILE *, char *)  ;
int	 setvbuf  (FILE *, char *, int, size_t)  ;
int	 sprintf  (char *, const char *, ...)  ;
int	 sscanf  (const char *, const char *, ...)  ;
FILE	*tmpfile  (void)  ;
char	*tmpnam  (char *)  ;
int	 ungetc  (int, FILE *)  ;
int	 vfprintf  (FILE *, const char *, __gnuc_va_list)  ;
int	 vprintf  (const char *, __gnuc_va_list)  ;
int	 vsprintf  (char *, const char *, __gnuc_va_list)  ;
char	*ctermid  (char *)  ;
FILE	*fdopen  (int, const char *)  ;
int	 fileno  (FILE *)  ;
char	*fgetline  (FILE *, size_t *)  ;
int	 fpurge  (FILE *)  ;
int	 getw  (FILE *)  ;
int	 pclose  (FILE *)  ;
FILE	*popen  (const char *, const char *)  ;
int	 putw  (int, FILE *)  ;
void	 setbuffer  (FILE *, char *, int)  ;
int	 setlinebuf  (FILE *)  ;
char	*tempnam  (const char *, const char *)  ;
int	 snprintf  (char *, size_t, const char *, ...)  ;
int	 vsnprintf  (char *, size_t, const char *, __gnuc_va_list)  ;
int	 vscanf  (const char *, __gnuc_va_list)  ;
int	 vsscanf  (const char *, const char *, __gnuc_va_list)  ;
FILE	*zopen  (const char *, const char *, int)  ;
FILE	*funopen  (const void *,
		int (*)(void *, char *, int),
		int (*)(void *, const char *, int),
		fpos_t (*)(void *, fpos_t, int),
		int (*)(void *))  ;
int	__srget  (FILE *)  ;
int	__svfscanf  (FILE *, const char *, __gnuc_va_list)  ;
int	__swbuf  (int, FILE *)  ;
static __inline int __sputc(int _c, FILE *_p) {
	if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
		return (*_p->_p++ = _c);
	else
		return (__swbuf(_c, _p));
}
typedef int 	rune_t;
typedef int 	wchar_t;
typedef struct {
	rune_t		min;		 
	rune_t		max;		 
	rune_t		map;		 
	unsigned long	*types;		 
} _RuneEntry;
typedef struct {
	int		nranges;	 
	_RuneEntry	*ranges;	 
} _RuneRange;
typedef struct {
	char		magic[8];	 
	char		encoding[32];	 
	rune_t		(*sgetrune)
	     (const char *, unsigned int, char const **)  ;
	int		(*sputrune)
	     (rune_t, char *, unsigned int, char **)  ;
	rune_t		invalid_rune;
	unsigned long	runetype[(1 <<8 ) ];
	rune_t		maplower[(1 <<8 ) ];
	rune_t		mapupper[(1 <<8 ) ];
	_RuneRange	runetype_ext;
	_RuneRange	maplower_ext;
	_RuneRange	mapupper_ext;
	void		*variable;	 
	int		variable_len;	 
} _RuneLocale;
extern _RuneLocale _DefaultRuneLocale;
extern _RuneLocale *_CurrentRuneLocale;
unsigned long	___runetype  (int )  ;
int 	___tolower  (int )  ;
int 	___toupper  (int )  ;
static __inline__  int
__istype(int  c, unsigned long f)
{
	return((((c & (~((1 <<8 )  - 1)) ) ? ___runetype(c) :
	    _CurrentRuneLocale->runetype[c]) & f) ? 1 : 0);
}
static __inline__  int
__isctype(int  c, unsigned long f)
{
	return((((c & (~((1 <<8 )  - 1)) ) ? 0 :
	    _DefaultRuneLocale.runetype[c]) & f) ? 1 : 0);
}
static __inline__  int 
toupper(int  c)
{
	return((c & (~((1 <<8 )  - 1)) ) ?
	    ___toupper(c) : _CurrentRuneLocale->mapupper[c]);
}
static __inline__  int 
tolower(int  c)
{
	return((c & (~((1 <<8 )  - 1)) ) ?
	    ___tolower(c) : _CurrentRuneLocale->maplower[c]);
}
extern int errno;			 
extern int errno;
void	*memchr  (const void *, int, size_t)  ;
int	 memcmp  (const void *, const void *, size_t)  ;
void	*memcpy  (void *, const void *, size_t)  ;
void	*memmove  (void *, const void *, size_t)  ;
void	*memset  (void *, int, size_t)  ;
char	*strcat  (char *, const char *)  ;
char	*strchr  (const char *, int)  ;
int	 strcmp  (const char *, const char *)  ;
int	 strcoll  (const char *, const char *)  ;
char	*strcpy  (char *, const char *)  ;
size_t	 strcspn  (const char *, const char *)  ;
char	*strerror  (int)  ;
size_t	 strlen  (const char *)  ;
char	*strncat  (char *, const char *, size_t)  ;
int	 strncmp  (const char *, const char *, size_t)  ;
char	*strncpy  (char *, const char *, size_t)  ;
char	*strpbrk  (const char *, const char *)  ;
char	*strrchr  (const char *, int)  ;
size_t	 strspn  (const char *, const char *)  ;
char	*strstr  (const char *, const char *)  ;
char	*strtok  (char *, const char *)  ;
size_t	 strxfrm  (char *, const char *, size_t)  ;
int	 bcmp  (const void *, const void *, size_t)  ;
void	 bcopy  (const void *, void *, size_t)  ;
void	 bzero  (void *, size_t)  ;
int	 ffs  (int)  ;
char	*index  (const char *, int)  ;
void	*memccpy  (void *, const void *, int, size_t)  ;
char	*rindex  (const char *, int)  ;
int	 strcasecmp  (const char *, const char *)  ;
char	*strdup  (const char *)  ;
void	 strmode  (int, char *)  ;
int	 strncasecmp  (const char *, const char *, size_t)  ;
char	*strsep  (char **, const char *)  ;
void	 swab  (const void *, void *, size_t)  ;
typedef struct {
	int quot;		 
	int rem;		 
} div_t;
typedef struct {
	long quot;		 
	long rem;		 
} ldiv_t;
extern int __mb_cur_max;
  void
	 abort  (void)  ;
  int
	 abs  (int)  ;
int	 atexit  (void (*)(void))  ;
double	 atof  (const char *)  ;
int	 atoi  (const char *)  ;
long	 atol  (const char *)  ;
void	*bsearch  (const void *, const void *, size_t,
	    size_t, int (*)(const void *, const void *))  ;
void	*calloc  (size_t, size_t)  ;
  div_t
	 div  (int, int)  ;
  void
	 exit  (int)  ;
void	 free  (void *)  ;
char	*getenv  (const char *)  ;
  long
	 labs  (long)  ;
  ldiv_t
	 ldiv  (long, long)  ;
void	*malloc  (size_t)  ;
void	 qsort  (void *, size_t, size_t,
	    int (*)(const void *, const void *))  ;
int	 rand  (void)  ;
void	*realloc  (void *, size_t)  ;
void	 srand  (unsigned)  ;
double	 strtod  (const char *, char **)  ;
long	 strtol  (const char *, char **, int)  ;
unsigned long
	 strtoul  (const char *, char **, int)  ;
int	 system  (const char *)  ;
int	 mblen  (const char *, size_t)  ;
size_t	 mbstowcs  (wchar_t *, const char *, size_t)  ;
int	 wctomb  (char *, wchar_t)  ;
int	 mbtowc  (wchar_t *, const char *, size_t)  ;
size_t	 wcstombs  (char *, const wchar_t *, size_t)  ;
int	 putenv  (const char *)  ;
int	 setenv  (const char *, const char *, int)  ;
char	*getbsize  (int *, long *)  ;
char	*cgetcap  (char *, char *, int)  ;
int	 cgetclose  (void)  ;
int	 cgetent  (char **, char **, char *)  ;
int	 cgetfirst  (char **, char **)  ;
int	 cgetmatch  (char *, char *)  ;
int	 cgetnext  (char **, char **)  ;
int	 cgetnum  (char *, char *, long *)  ;
int	 cgetset  (char *)  ;
int	 cgetstr  (char *, char *, char **)  ;
int	 cgetustr  (char *, char *, char **)  ;
int	 daemon  (int, int)  ;
extern char *optarg;			 
extern int opterr, optind, optopt;
int	 getopt  (int, char * const *, const char *)  ;
extern char *suboptarg;			 
int	 getsubopt  (char **, char * const *, char **)  ;
void	*alloca  (size_t)  ;	 
int	 heapsort  (void *, size_t, size_t,
	    int (*)(const void *, const void *))  ;
char	*initstate  (unsigned, char *, int)  ;
int	 mergesort  (void *, size_t, size_t,
	    int (*)(const void *, const void *))  ;
int	 radixsort  (const unsigned char **, int, const unsigned char *,
	    unsigned)  ;
int	 sradixsort  (const unsigned char **, int, const unsigned char *,
	    unsigned)  ;
long	 random  (void)  ;
char	*setstate  (char *)  ;
void	 srandom  (unsigned)  ;
long long
	 strtoq  (const char *, char **, int)  ;
unsigned long long
	 strtouq  (const char *, char **, int)  ;
void	 unsetenv  (const char *)  ;
  void
	 _exit  (int)  ;
int	 access  (const char *, int)  ;
unsigned int	 alarm  (unsigned int)  ;
int	 chdir  (const char *)  ;
int	 chown  (const char *, uid_t, gid_t)  ;
int	 close  (int)  ;
int	 dup  (int)  ;
int	 dup2  (int, int)  ;
int	 execl  (const char *, const char *, ...)  ;
int	 execle  (const char *, const char *, ...)  ;
int	 execlp  (const char *, const char *, ...)  ;
int	 execv  (const char *, char * const *)  ;
int	 execve  (const char *, char * const *, char * const *)  ;
int	 execvp  (const char *, char * const *)  ;
pid_t	 fork  (void)  ;
char	*getcwd  (char *, size_t)  ;
gid_t	 getegid  (void)  ;
uid_t	 geteuid  (void)  ;
gid_t	 getgid  (void)  ;
int	 getgroups  (int, int *)  ;		 
char	*getlogin  (void)  ;
pid_t	 getpgrp  (void)  ;
pid_t	 getpid  (void)  ;
pid_t	 getppid  (void)  ;
uid_t	 getuid  (void)  ;
int	 isatty  (int)  ;
int	 link  (const char *, const char *)  ;
off_t	 lseek  (int, off_t, int)  ;
int	 pause  (void)  ;
int	 pipe  (int *)  ;
ssize_t	 read  (int, void *, size_t)  ;
int	 rmdir  (const char *)  ;
int	 setgid  (gid_t)  ;
int	 setpgid  (pid_t, pid_t)  ;
pid_t	 setsid  (void)  ;
int	 setuid  (uid_t)  ;
unsigned int	 sleep  (unsigned int)  ;
char	*ttyname  (int)  ;
int	 unlink  (const char *)  ;
ssize_t	 write  (int, const void *, size_t)  ;
struct timeval {
	long	tv_sec;		 
	long	tv_usec;	 
};
struct timespec {
	long	ts_sec;		 
	long	ts_nsec;	 
};
struct timezone {
	int	tz_minuteswest;	 
	int	tz_dsttime;	 
};
struct	itimerval {
	struct	timeval it_interval;	 
	struct	timeval it_value;	 
};
struct clockinfo {
	int	hz;		 
	int	tick;		 
	int	stathz;		 
	int	profhz;		 
};
struct tm {
	int	tm_sec;		 
	int	tm_min;		 
	int	tm_hour;	 
	int	tm_mday;	 
	int	tm_mon;		 
	int	tm_year;	 
	int	tm_wday;	 
	int	tm_yday;	 
	int	tm_isdst;	 
	long	tm_gmtoff;	 
	char	*tm_zone;	 
};
char *asctime  (const struct tm *)  ;
clock_t clock  (void)  ;
char *ctime  (const time_t *)  ;
double difftime  (time_t, time_t)  ;
struct tm *gmtime  (const time_t *)  ;
struct tm *localtime  (const time_t *)  ;
time_t mktime  (struct tm *)  ;
size_t strftime  (char *, size_t, const char *, const struct tm *)  ;
time_t time  (time_t *)  ;
void tzset  (void)  ;
char *timezone  (int, int)  ;
void tzsetwall  (void)  ;
int	adjtime  (const struct timeval *, struct timeval *)  ;
int	getitimer  (int, struct itimerval *)  ;
int	gettimeofday  (struct timeval *, struct timezone *)  ;
int	setitimer  (int, const struct itimerval *, struct itimerval *)  ;
int	settimeofday  (const struct timeval *, const struct timezone *)  ;
int	utimes  (const char *, const struct timeval *)  ;
int	 acct  (const char *)  ;
int	 async_daemon  (void)  ;
char	*brk  (const char *)  ;
int	 chroot  (const char *)  ;
char	*crypt  (const char *, const char *)  ;
int	 des_cipher  (const char *, char *, long, int)  ;
int	 des_setkey  (const char *key)  ;
int	 encrypt  (char *, int)  ;
void	 endusershell  (void)  ;
int	 exect  (const char *, char * const *, char * const *)  ;
int	 fchdir  (int)  ;
int	 fchown  (int, int, int)  ;
int	 fsync  (int)  ;
int	 ftruncate  (int, off_t)  ;
int	 getdtablesize  (void)  ;
long	 gethostid  (void)  ;
int	 gethostname  (char *, int)  ;
mode_t	 getmode  (const void *, mode_t)  ;
  int
	 getpagesize  (void)  ;
char	*getpass  (const char *)  ;
char	*getusershell  (void)  ;
char	*getwd  (char *)  ;			 
int	 initgroups  (const char *, int)  ;
int	 iruserok  (unsigned long, int, const char *, const char *)  ;
int	 mknod  (const char *, mode_t, dev_t)  ;
int	 mkstemp  (char *)  ;
char	*mktemp  (char *)  ;
int	 nfssvc  (int, caddr_t)  ;
int	 nice  (int)  ;
void	 psignal  (unsigned int, const char *)  ;
extern const char *const sys_siglist[];
int	 profil  (char *, int, int, int)  ;
int	 rcmd  (char **, int, const char *,
		const char *, const char *, int *)  ;
char	*re_comp  (const char *)  ;
int	 re_exec  (const char *)  ;
int	 readlink  (const char *, char *, int)  ;
int	 reboot  (int)  ;
int	 revoke  (const char *)  ;
int	 rresvport  (int *)  ;
int	 ruserok  (const char *, int, const char *, const char *)  ;
char	*sbrk  (int)  ;
int	 select  (int, fd_set *, fd_set *, fd_set *, struct timeval *)  ;
int	 setegid  (gid_t)  ;
int	 seteuid  (uid_t)  ;
int	 setgroups  (int, const int *)  ;
void	 sethostid  (long)  ;
int	 sethostname  (const char *, int)  ;
int	 setkey  (const char *)  ;
int	 setlogin  (const char *)  ;
void	*setmode  (const char *)  ;
int	 setpgrp  (pid_t pid, pid_t pgrp)  ;	 
int	 setregid  (int, int)  ;
int	 setreuid  (int, int)  ;
int	 setrgid  (gid_t)  ;
int	 setruid  (uid_t)  ;
void	 setusershell  (void)  ;
int	 swapon  (const char *)  ;
int	 symlink  (const char *, const char *)  ;
void	 sync  (void)  ;
int	 syscall  (int, ...)  ;
int	 truncate  (const char *, off_t)  ;
int	 ttyslot  (void)  ;
unsigned int	 ualarm  (unsigned int, unsigned int)  ;
void	 usleep  (unsigned int)  ;
void	*valloc  (size_t)  ;			 
pid_t	 vfork  (void)  ;
struct	sigvec {
	void	(*sv_handler)();	 
	int	sv_mask;		 
	int	sv_flags;		 
};
struct	sigstack {
	char	*ss_sp;			 
	int	ss_onstack;		 
};
struct	sigcontext {
	int	sc_onstack;		 
	int	sc_mask;		 
	int	sc_sp;			 
	int	sc_fp;			 
	int	sc_ap;			 
	int	sc_pc;			 
	int	sc_ps;			 
};
typedef void (*sig_t)  (int)  ;	 
extern const char *const sys_signame[32 ];
extern const char *const sys_siglist[32 ];
void	(*signal  (int, void (*)  (int)  )  )  (int)  ;
int	kill  (pid_t, int)  ;
int	killpg  (pid_t, int)  ;
int	sigblock  (int)  ;
int	siginterrupt  (int, int)  ;
int	sigpause  (int)  ;
int	sigreturn  (struct sigcontext *)  ;
int	sigsetmask  (int)  ;
int	sigstack  (const struct sigstack *, struct sigstack *)  ;
int	sigvec  (int, struct sigvec *, struct sigvec *)  ;
void	psignal  (unsigned int, const char *)  ;
struct flock {
	off_t	l_start;	 
	off_t	l_len;		 
	pid_t	l_pid;		 
	short	l_type;		 
	short	l_whence;	 
};
int	open  (const char *, int, ...)  ;
int	creat  (const char *, mode_t)  ;
int	fcntl  (int, int, ...)  ;
int	flock  (int, int)  ;
union wait {
	int	w_status;		 
	struct {
		unsigned int	w_Filler:16,	 
				w_Retcode:8,	 
				w_Coredump:1,	 
				w_Termsig:7;	 
	} w_T;
	struct {
		unsigned int	w_Filler:16,	 
				w_Stopsig:8,	 
				w_Stopval:8;	 
	} w_S;
};
struct rusage;	 
pid_t	wait  (int *)  ;
pid_t	waitpid  (pid_t, int *, int)  ;
pid_t	wait3  (int *, int, struct rusage *)  ;
pid_t	wait4  (pid_t, int *, int, struct rusage *)  ;
struct stat
{
	dev_t	st_dev;			 
	ino_t	st_ino;			 
	mode_t	st_mode;		 
	nlink_t	st_nlink;		 
	uid_t	st_uid;			 
	gid_t	st_gid;			 
	dev_t	st_rdev;		 
	off_t	st_size;		 
	struct	timespec st_atimespec;	 
	struct	timespec st_mtimespec;	 
	struct	timespec st_ctimespec;	 
	long	st_blksize;		 
	long	st_blocks;		 
	unsigned long	st_flags;	 
	unsigned long	st_gen;		 
};
int	chmod  (const char *, mode_t)  ;
int	fstat  (int, struct stat *)  ;
int	mkdir  (const char *, mode_t)  ;
int	mkfifo  (const char *, mode_t)  ;
int	stat  (const char *, struct stat *)  ;
mode_t	umask  (mode_t)  ;
int	chflags  (const char *, u_long)  ;
int	fchflags  (int, u_long)  ;
int	fchmod  (int, mode_t)  ;
int	lstat  (const char *, struct stat *)  ;
extern char **buildargv  (char *)  ;
extern void freeargv  (char **)  ;
extern char **dupargv  (char **)  ;
extern char *basename ();
extern char *concat  (const char *, ...)  ;
extern int fdmatch  (int fd1, int fd2)  ;
extern char * getpwd  (void)  ;
extern long get_run_time  (void)  ;
extern char *choose_temp_base  (void)  ;
extern char *make_temp_file  (const char *)  ;
extern const char *spaces  (int count)  ;
extern int errno_max  (void)  ;
extern const char *strerrno  (int)  ;
extern int strtoerrno  (const char *)  ;
extern char *xstrerror  (int)  ;
extern int signo_max  (void)  ;
extern const char *strsigno  (int)  ;
extern int strtosigno  (const char *)  ;
extern int xatexit  (void (*fn) (void))  ;
void xexit  (int status)   __attribute__ ((noreturn));
extern void xmalloc_set_program_name  (const char *)  ;
typedef int ptrdiff_t;
typedef unsigned int  wint_t;
extern void *  xmalloc  (size_t)  ;
extern void *  xrealloc  (void * , size_t)  ;
extern void *  xcalloc  (size_t, size_t)  ;
extern char *xstrdup  (const char *)  ;
extern void *  xmemdup  (const void * , size_t, size_t)  ;
extern char _hex_value[256 ];
extern void hex_init  (void)  ;
extern int pexecute  (const char *, char * const *, const char *,
			    const char *, char **, char **, int)  ;
extern int pwait  (int, int *, int)  ;
struct function;
enum machine_mode {
 VOIDmode , 
 PQImode , 
 QImode , 		 
 PHImode , 
 HImode , 
 PSImode , 
 SImode , 
 PDImode , 
 DImode , 
 TImode , 
 OImode , 
 QFmode , 
 HFmode , 
 TQFmode ,    
 SFmode , 
 DFmode , 
 XFmode ,     
 TFmode , 
 QCmode , 
 HCmode , 
 SCmode , 
 DCmode , 
 XCmode , 
 TCmode , 
 CQImode , 
 CHImode , 
 CSImode , 
 CDImode , 
 CTImode , 
 COImode , 
 BLKmode , 
  CCmode  ,  
MAX_MACHINE_MODE };
extern const char * const mode_name[];
enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
		  MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MAX_MODE_CLASS};
extern const enum mode_class mode_class[];
extern const int mode_size[];
extern const int mode_unit_size[];
extern const unsigned int  mode_mask_array[];
extern const unsigned char mode_wider_mode[];
extern enum machine_mode mode_for_size   (unsigned int, enum mode_class, int)  
  ;
extern enum machine_mode smallest_mode_for_size    (unsigned int,
                                                        enum mode_class)    ;
extern enum machine_mode int_mode_for_mode   (enum machine_mode)    ;
extern enum machine_mode get_best_mode   (int, int, int, enum machine_mode, 
int)    ;
extern const enum machine_mode class_narrowest_mode[];
extern enum machine_mode byte_mode;
extern enum machine_mode word_mode;
extern enum machine_mode ptr_mode;
union tree_node;
enum rtx_code  {
 UNKNOWN  , 
 NIL  , 
 EXPR_LIST  , 
 INSN_LIST  , 
 MATCH_OPERAND  , 
 MATCH_SCRATCH  , 
 MATCH_DUP  , 
 MATCH_OPERATOR  , 
 MATCH_PARALLEL  , 
 MATCH_OP_DUP  , 
 MATCH_PAR_DUP  , 
 MATCH_INSN  , 
 DEFINE_INSN  , 
 DEFINE_PEEPHOLE  , 
 DEFINE_SPLIT  , 
 DEFINE_PEEPHOLE2  , 
 DEFINE_COMBINE  , 
 DEFINE_EXPAND  , 
 DEFINE_DELAY  , 
 DEFINE_FUNCTION_UNIT  , 
 DEFINE_ASM_ATTRIBUTES  , 
 SEQUENCE  , 
 ADDRESS  , 
 DEFINE_ATTR  , 
 ATTR  , 
 SET_ATTR  , 
 SET_ATTR_ALTERNATIVE  , 
 EQ_ATTR  , 
 ATTR_FLAG  , 
 INSN  , 
 JUMP_INSN  , 
 CALL_INSN  , 
 BARRIER  , 
 CODE_LABEL  , 
 NOTE  , 
 PARALLEL  , 
 ASM_INPUT  , 
 ASM_OPERANDS  , 
 UNSPEC  , 
 UNSPEC_VOLATILE  , 
 ADDR_VEC  , 
 ADDR_DIFF_VEC  , 
 SET  , 
 USE  , 
 CLOBBER  , 
 CALL  , 
 RETURN  , 
 TRAP_IF  , 
 CONST_INT  , 
 CONST_DOUBLE  , 
 CONST_STRING  , 
 CONST  , 
 PC  , 
 REG  , 
 SCRATCH  , 
 SUBREG  , 
 STRICT_LOW_PART  , 
 CONCAT  , 
 MEM  , 
 LABEL_REF  , 
 SYMBOL_REF  , 
 CC0  , 
 ADDRESSOF  , 
 QUEUED  , 
 IF_THEN_ELSE  , 
 COND  , 
 COMPARE  , 
 PLUS  , 
 MINUS  , 
 NEG  , 
 MULT  , 
 DIV  , 
 MOD  , 
 UDIV  , 
 UMOD  , 
 AND  , 
 IOR  , 
 XOR  , 
 NOT  , 
 ASHIFT  , 
 ROTATE  , 
 ASHIFTRT  , 
 LSHIFTRT  , 
 ROTATERT  , 
 SMIN  , 
 SMAX  , 
 UMIN  , 
 UMAX  , 
 PRE_DEC  , 
 PRE_INC  , 
 POST_DEC  , 
 POST_INC  , 
 PRE_MODIFY  , 
 POST_MODIFY  , 
 NE  , 
 EQ  , 
 GE  , 
 GT  , 
 LE  , 
 LT  , 
 GEU  , 
 GTU  , 
 LEU  , 
 LTU  , 
 SIGN_EXTEND  , 
 ZERO_EXTEND  , 
 TRUNCATE  , 
 FLOAT_EXTEND  , 
 FLOAT_TRUNCATE  , 
 FLOAT  , 
 FIX  , 
 UNSIGNED_FLOAT  , 
 UNSIGNED_FIX  , 
 ABS  , 
 SQRT  , 
 FFS  , 
 SIGN_EXTRACT  , 
 ZERO_EXTRACT  , 
 HIGH  , 
 LO_SUM  , 
 RANGE_INFO  , 
 RANGE_REG  , 
 RANGE_VAR  , 
 RANGE_LIVE  , 
 CONSTANT_P_RTX  , 
 CALL_PLACEHOLDER  , 
  LAST_AND_UNUSED_RTX_CODE};	 
extern const int rtx_length[];
extern const char * const rtx_name[];
extern const char * const rtx_format[];
extern const char rtx_class[];

typedef struct
{
  unsigned min_align: 8;
  unsigned base_after_vec: 1;  
  unsigned min_after_vec: 1;   
  unsigned max_after_vec: 1;   
  unsigned min_after_base: 1;  
  unsigned max_after_base: 1;  
  unsigned offset_unsigned: 1;  
  unsigned : 2;
  unsigned scale : 8;
} addr_diff_vec_flags;
typedef union rtunion_def
{
  int  rtwint;
  int rtint;
  char *rtstr;
  struct rtx_def *rtx;
  struct rtvec_def *rtvec;
  enum machine_mode rttype;
  addr_diff_vec_flags rt_addr_diff_vec_flags;
  struct bitmap_head_def *rtbit;
  union tree_node *rttree;
  struct basic_block_def *bb;
} rtunion;
typedef struct rtx_def
{
  enum rtx_code code : 16;
  enum machine_mode mode : 8;
  unsigned int jump : 1;
  unsigned int call : 1;
  unsigned int unchanging : 1;
  unsigned int volatil : 1;
  unsigned int in_struct : 1;
  unsigned int used : 1;
  unsigned integrated : 1;
  unsigned frame_related : 1;
  rtunion fld[1];
} *rtx;
typedef struct rtvec_def{
  int num_elem;		 
  struct rtx_def *elem[1];
} *rtvec;

enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
		REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
		REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
		REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
		REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_BR_PROB = 16,
		REG_EXEC_COUNT = 17, REG_NOALIAS = 18, REG_SAVE_AREA = 19,
		REG_BR_PRED = 20, REG_EH_CONTEXT = 21,
		REG_FRAME_RELATED_EXPR = 22, REG_EH_REGION = 23,
		REG_EH_RETHROW = 24, REG_SAVE_NOTE = 25 };
extern const char * const reg_note_name[];
extern const char * const note_insn_name[];


extern int rtx_equal_function_value_matters;
extern int exact_log2_wide		  (unsigned int )    ;
extern int floor_log2_wide		  (unsigned int )    ;
extern int ceil_log2			  (unsigned int )    ;
extern int  trunc_int_for_mode	  (int ,
					       enum machine_mode)    ;
extern rtx plus_constant_wide		   (rtx, int )    ;
extern rtx plus_constant_for_output_wide   (rtx, int )    ;
extern void optimize_save_area_alloca	  (rtx)    ;
extern rtx gen_rtx			  (enum rtx_code,
						 enum machine_mode, ...)    ;
extern rtvec gen_rtvec			  (int, ...)    ;
extern char *oballoc			  (int)    ;
extern char *permalloc			  (int)    ;
extern rtx rtx_alloc			  (enum rtx_code )    ;
extern rtvec rtvec_alloc		  (int)    ;
extern rtx copy_insn_1			  (rtx)    ;
extern rtx copy_insn			  (rtx)    ;
extern rtx copy_rtx			  (rtx)    ;
extern rtx copy_rtx_if_shared		  (rtx)    ;
extern rtx copy_most_rtx		  (rtx, rtx)    ;
extern rtx shallow_copy_rtx		  (rtx)    ;
extern int rtx_equal_p                    (rtx, rtx)    ;
extern rtvec gen_rtvec_v		  (int, rtx *)    ;
extern rtx gen_reg_rtx			  (enum machine_mode)    ;
extern rtx gen_label_rtx		  (void)    ;
extern rtx gen_lowpart_common		  (enum machine_mode, rtx)    ;
extern rtx gen_lowpart			  (enum machine_mode, rtx)    ;
extern rtx gen_lowpart_if_possible	  (enum machine_mode, rtx)    ;
extern rtx gen_highpart			  (enum machine_mode, rtx)    ;
extern rtx gen_realpart			  (enum machine_mode, rtx)    ;
extern rtx gen_imagpart			  (enum machine_mode, rtx)    ;
extern rtx operand_subword		  (rtx, int, int, enum machine_mode)    ;
extern rtx operand_subword_force	  (rtx, int, enum machine_mode)    ;
extern int subreg_lowpart_p		  (rtx)    ;
extern rtx make_safe_from		  (rtx, rtx)    ;
extern rtx convert_memory_address	  (enum machine_mode, rtx)    ;
extern rtx memory_address		  (enum machine_mode, rtx)    ;
extern rtx get_insns			  (void)    ;
extern const char *get_insn_name	  (int)    ;
extern rtx get_last_insn		  (void)    ;
extern rtx get_last_insn_anywhere	  (void)    ;
extern void start_sequence		  (void)    ;
extern void push_to_sequence		  (rtx)    ;
extern void end_sequence		  (void)    ;
extern rtx gen_sequence			  (void)    ;
extern rtx immed_double_const		  (int , int , enum machine_mode)    ;
extern rtx force_const_mem		  (enum machine_mode, rtx)    ;
extern rtx force_reg			  (enum machine_mode, rtx)    ;
extern rtx get_pool_constant		  (rtx)    ;
extern enum machine_mode get_pool_mode	  (rtx)    ;
extern rtx get_pool_constant_for_function	  (struct function *, rtx)    ;
extern enum machine_mode get_pool_mode_for_function	  (struct function *, rtx) 
   ;
extern int get_pool_offset		  (rtx)    ;
extern rtx simplify_subtraction		  (rtx)    ;
extern rtx assign_stack_local		  (enum machine_mode,
					       int , int)    ;
extern rtx assign_stack_temp		  (enum machine_mode,
					       int , int)    ;
extern rtx assign_temp			  (union tree_node *,
					       int, int, int)    ;
extern rtx protect_from_queue		  (rtx, int)    ;
extern void emit_queue			  (void)    ;
extern rtx emit_move_insn		  (rtx, rtx)    ;
extern rtx emit_insn_before		  (rtx, rtx)    ;
extern rtx emit_jump_insn_before	  (rtx, rtx)    ;
extern rtx emit_call_insn_before	  (rtx, rtx)    ;
extern rtx emit_barrier_before		  (rtx)    ;
extern rtx emit_label_before		  (rtx, rtx)    ;
extern rtx emit_note_before		  (int, rtx)    ;
extern rtx emit_insn_after		  (rtx, rtx)    ;
extern rtx emit_jump_insn_after		  (rtx, rtx)    ;
extern rtx emit_barrier_after		  (rtx)    ;
extern rtx emit_label_after		  (rtx, rtx)    ;
extern rtx emit_note_after		  (int, rtx)    ;
extern rtx emit_line_note_after		  (char *, int, rtx)    ;
extern rtx emit_insn			  (rtx)    ;
extern rtx emit_insns			  (rtx)    ;
extern rtx emit_insns_before		  (rtx, rtx)    ;
extern rtx emit_insns_after		  (rtx, rtx)    ;
extern rtx emit_jump_insn		  (rtx)    ;
extern rtx emit_call_insn		  (rtx)    ;
extern rtx emit_label			  (rtx)    ;
extern rtx emit_barrier			  (void)    ;
extern rtx emit_line_note		  (char *, int)    ;
extern rtx emit_note			  (char *, int)    ;
extern rtx emit_line_note_force		  (char *, int)    ;
extern rtx make_insn_raw		  (rtx)    ;
extern rtx previous_insn		  (rtx)    ;
extern rtx next_insn			  (rtx)    ;
extern rtx prev_nonnote_insn		  (rtx)    ;
extern rtx next_nonnote_insn		  (rtx)    ;
extern rtx prev_real_insn		  (rtx)    ;
extern rtx next_real_insn		  (rtx)    ;
extern rtx prev_active_insn		  (rtx)    ;
extern rtx next_active_insn		  (rtx)    ;
extern rtx prev_label			  (rtx)    ;
extern rtx next_label			  (rtx)    ;
extern rtx next_cc0_user		  (rtx)    ;
extern rtx prev_cc0_setter		  (rtx)    ;
extern rtx next_nondeleted_insn		  (rtx)    ;
extern enum rtx_code reverse_condition	  (enum rtx_code)    ;
extern enum rtx_code swap_condition	  (enum rtx_code)    ;
extern enum rtx_code unsigned_condition	  (enum rtx_code)    ;
extern enum rtx_code signed_condition	  (enum rtx_code)    ;
extern rtx find_equiv_reg		  (rtx, rtx, enum reg_class, int, short *, int, 
enum machine_mode)    ;
extern rtx squeeze_notes		  (rtx, rtx)    ;
extern rtx delete_insn			  (rtx)    ;
extern void delete_jump			  (rtx)    ;
extern void delete_barrier		  (rtx)    ;
extern rtx get_label_before		  (rtx)    ;
extern rtx get_label_after		  (rtx)    ;
extern rtx follow_jumps			  (rtx)    ;
extern rtx adj_offsettable_operand	  (rtx, int)    ;
extern rtx try_split			  (rtx, rtx, int)    ;
extern rtx split_insns			  (rtx, rtx)    ;
extern rtx simplify_unary_operation	  (enum rtx_code, enum machine_mode, rtx, 
enum machine_mode)    ;
extern rtx simplify_binary_operation	  (enum rtx_code, enum machine_mode, rtx, 
rtx)    ;
extern rtx simplify_ternary_operation	  (enum rtx_code, enum machine_mode, 
enum machine_mode, rtx, rtx, rtx)    ;
extern rtx simplify_relational_operation   (enum rtx_code, enum machine_mode, 
rtx, rtx)    ;
extern rtx simplify_gen_binary		  (enum rtx_code, enum machine_mode,
					       rtx, rtx)    ;
extern rtx simplify_rtx			  (rtx)    ;
extern rtx gen_move_insn		  (rtx, rtx)    ;
extern rtx gen_jump			  (rtx)    ;
extern rtx gen_beq			  (rtx)    ;
extern rtx gen_bge			  (rtx)    ;
extern rtx gen_ble			  (rtx)    ;
extern rtx gen_mem_addressof		  (rtx, union tree_node *)    ;
extern rtx eliminate_constant_term	  (rtx, rtx *)    ;
extern rtx expand_complex_abs		  (enum machine_mode, rtx, rtx, int)    ;
extern enum machine_mode choose_hard_reg_mode   (int, int)    ;
extern void set_unique_reg_note           (rtx, enum reg_note, rtx)    ;
extern int rtx_unstable_p		  (rtx)    ;
extern int rtx_varies_p			  (rtx)    ;
extern int rtx_addr_varies_p		  (rtx)    ;
extern int  get_integer_term	  (rtx)    ;
extern rtx get_related_value		  (rtx)    ;
extern int reg_mentioned_p		  (rtx, rtx)    ;
extern int reg_referenced_p		  (rtx, rtx)    ;
extern int reg_used_between_p		  (rtx, rtx, rtx)    ;
extern int reg_referenced_between_p	  (rtx, rtx, rtx)    ;
extern int reg_set_between_p		  (rtx, rtx, rtx)    ;
extern int regs_set_between_p		  (rtx, rtx, rtx)    ;
extern int modified_between_p		  (rtx, rtx, rtx)    ;
extern int no_labels_between_p		  (rtx, rtx)    ;
extern int no_jumps_between_p		  (rtx, rtx)    ;
extern int modified_in_p		  (rtx, rtx)    ;
extern int reg_set_p			  (rtx, rtx)    ;
extern rtx single_set			  (rtx)    ;
extern int multiple_sets		  (rtx)    ;
extern rtx find_last_value		  (rtx, rtx *, rtx, int)    ;
extern int refers_to_regno_p		  (int, int, rtx, rtx *)    ;
extern int reg_overlap_mentioned_p	  (rtx, rtx)    ;
extern void note_stores			  (rtx, void (*)(rtx, rtx, void *), void *)    ;
extern rtx reg_set_last			  (rtx, rtx)    ;
extern int dead_or_set_p		  (rtx, rtx)    ;
extern int dead_or_set_regno_p		  (rtx, int)    ;
extern rtx find_reg_note		  (rtx, enum reg_note, rtx)    ;
extern rtx find_regno_note		  (rtx, enum reg_note, int)    ;
extern int find_reg_fusage		  (rtx, enum rtx_code, rtx)    ;
extern int find_regno_fusage		  (rtx, enum rtx_code, int)    ;
extern void remove_note			  (rtx, rtx)    ;
extern int side_effects_p		  (rtx)    ;
extern int volatile_refs_p		  (rtx)    ;
extern int volatile_insn_p		  (rtx)    ;
extern int may_trap_p			  (rtx)    ;
extern int inequality_comparisons_p	  (rtx)    ;
extern rtx replace_rtx			  (rtx, rtx, rtx)    ;
extern rtx replace_regs			  (rtx, rtx *, int, int)    ;
extern int computed_jump_p		  (rtx)    ;
typedef int (*rtx_function)               (rtx *, void *)    ;
extern int for_each_rtx                   (rtx *, rtx_function, void *)    ;
extern rtx regno_use_in			  (int, rtx)    ;
extern int auto_inc_p			  (rtx)    ;
extern void remove_node_from_expr_list	  (rtx, rtx *)    ;
extern int insns_safe_to_move_p           (rtx, rtx, rtx *)    ;
extern rtx find_use_as_address		  (rtx, rtx, int )    ;
void init_EXPR_INSN_LIST_cache		  (void)    ;
void free_EXPR_LIST_list 		  (rtx *)    ;
void free_INSN_LIST_list 		  (rtx *)    ;
void free_EXPR_LIST_node 		  (rtx)    ;
void free_INSN_LIST_node 		  (rtx)    ;
rtx alloc_INSN_LIST			  (rtx, rtx)    ;
rtx alloc_EXPR_LIST			  (int, rtx, rtx)    ;
extern int max_parallel;
extern void free_reg_info		  (void)    ;
extern int asm_noperands		  (rtx)    ;
extern char *decode_asm_operands	  (rtx, rtx *, rtx **,
					       const char **,
					       enum machine_mode *)    ;
extern enum reg_class reg_preferred_class   (int)    ;
extern enum reg_class reg_alternate_class   (int)    ;
extern rtx get_first_nonparm_insn	  (void)    ;
extern void split_all_insns		  (int)    ;
extern rtx const_int_rtx[64  * 2 + 1];
extern rtx const_true_rtx;
extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
enum global_rtl_index
{
  GR_PC,
  GR_CC0,
  GR_STACK_POINTER,
  GR_FRAME_POINTER,
  GR_ARG_POINTER = GR_FRAME_POINTER,
  GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
  GR_VIRTUAL_INCOMING_ARGS,
  GR_VIRTUAL_STACK_ARGS,
  GR_VIRTUAL_STACK_DYNAMIC,
  GR_VIRTUAL_OUTGOING_ARGS,
  GR_VIRTUAL_CFA,
  GR_MAX
};
extern rtx global_rtl[GR_MAX];
extern rtx pic_offset_table_rtx;
extern rtx struct_value_rtx;
extern rtx struct_value_incoming_rtx;
extern rtx static_chain_rtx;
extern rtx static_chain_incoming_rtx;
extern rtx return_address_pointer_rtx;
extern rtx gen_rtx_fmt_ee	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1)    ;
extern rtx gen_rtx_fmt_ue	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1)    ;
extern rtx gen_rtx_fmt_iss	  (enum rtx_code , enum machine_mode mode,
				       int arg0, char *arg1, char *arg2)    ;
extern rtx gen_rtx_fmt_is	  (enum rtx_code , enum machine_mode mode,
				       int arg0, char *arg1)    ;
extern rtx gen_rtx_fmt_i	  (enum rtx_code , enum machine_mode mode,
				       int arg0)    ;
extern rtx gen_rtx_fmt_isE	  (enum rtx_code , enum machine_mode mode,
				       int arg0, char *arg1, rtvec arg2)    ;
extern rtx gen_rtx_fmt_iE	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtvec arg1)    ;
extern rtx gen_rtx_fmt_Ess	  (enum rtx_code , enum machine_mode mode,
				       rtvec arg0, char *arg1, char *arg2)    ;
extern rtx gen_rtx_fmt_sEss	  (enum rtx_code , enum machine_mode mode,
				       char *arg0, rtvec arg1, char *arg2,
				       char *arg3)    ;
extern rtx gen_rtx_fmt_eE	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtvec arg1)    ;
extern rtx gen_rtx_fmt_E	  (enum rtx_code , enum machine_mode mode,
				       rtvec arg0)    ;
extern rtx gen_rtx_fmt_e	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0)    ;
extern rtx gen_rtx_fmt_sse	  (enum rtx_code , enum machine_mode mode,
				       char *arg0, char *arg1, rtx arg2)    ;
extern rtx gen_rtx_fmt_s	  (enum rtx_code , enum machine_mode mode,
				       char *arg0)    ;
extern rtx gen_rtx_fmt_ss	  (enum rtx_code , enum machine_mode mode,
				       char *arg0, char *arg1)    ;
extern rtx gen_rtx_fmt_sE	  (enum rtx_code , enum machine_mode mode,
				       char *arg0, rtvec arg1)    ;
extern rtx gen_rtx_fmt_iuueiee	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtx arg1, rtx arg2,
				       rtx arg3, int arg4, rtx arg5,
				       rtx arg6)    ;
extern rtx gen_rtx_fmt_iuueiee0	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtx arg1, rtx arg2,
				       rtx arg3, int arg4, rtx arg5,
				       rtx arg6)    ;
extern rtx gen_rtx_fmt_iuueieee	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtx arg1, rtx arg2,
				       rtx arg3, int arg4, rtx arg5,
				       rtx arg6, rtx arg7)    ;
extern rtx gen_rtx_fmt_iuu	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtx arg1, rtx arg2)    ;
extern rtx gen_rtx_fmt_iuuis00s	  (enum rtx_code , enum machine_mode mode,
				       int arg0, rtx arg1, rtx arg2,
				       int arg3, char *arg4, char *arg5)    ;
extern rtx gen_rtx_fmt_ssiEEsi	  (enum rtx_code , enum machine_mode mode,
				       char *arg0, char *arg1, int arg2,
				       rtvec arg3, rtvec arg4, char *arg5,
				       int arg6)    ;
extern rtx gen_rtx_fmt_Ei	  (enum rtx_code , enum machine_mode mode,
				       rtvec arg0, int arg1)    ;
extern rtx gen_rtx_fmt_eEee0	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtvec arg1, rtx arg2,
				       rtx arg3)    ;
extern rtx gen_rtx_fmt_	  (enum rtx_code , enum machine_mode mode)    ;
extern rtx gen_rtx_fmt_w	  (enum rtx_code , enum machine_mode mode,
				       int  arg0)    ;
extern rtx gen_rtx_fmt_e0www	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, int  arg1,
				       int  arg2,
				       int  arg3)    ;
extern rtx gen_rtx_fmt_i0	  (enum rtx_code , enum machine_mode mode,
				       int arg0)    ;
extern rtx gen_rtx_fmt_0	  (enum rtx_code , enum machine_mode mode)    ;
extern rtx gen_rtx_fmt_ei	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, int arg1)    ;
extern rtx gen_rtx_fmt_e0	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0)    ;
extern rtx gen_rtx_fmt_u00	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0)    ;
extern rtx gen_rtx_fmt_eit	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, int arg1,
				       union tree_node *arg2)    ;
extern rtx gen_rtx_fmt_eeeee	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1, rtx arg2,
				       rtx arg3, rtx arg4)    ;
extern rtx gen_rtx_fmt_eee	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1, rtx arg2)    ;
extern rtx gen_rtx_fmt_Ee	  (enum rtx_code , enum machine_mode mode,
				       rtvec arg0, rtx arg1)    ;
extern rtx gen_rtx_fmt_uuEiiiiiibbii	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1, rtvec arg2,
				       int arg3, int arg4, int arg5,
				       int arg6, int arg7, int arg8,
				       struct bitmap_head_def *arg9,
				       struct bitmap_head_def *arg10,
				       int arg11, int arg12)    ;
extern rtx gen_rtx_fmt_iiiiiiiitt	  (enum rtx_code , enum machine_mode mode,
				       int arg0, int arg1, int arg2,
				       int arg3, int arg4, int arg5,
				       int arg6, int arg7,
				       union tree_node *arg8,
				       union tree_node *arg9)    ;
extern rtx gen_rtx_fmt_eti	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, union tree_node *arg1,
				       int arg2)    ;
extern rtx gen_rtx_fmt_bi	  (enum rtx_code , enum machine_mode mode,
				       struct bitmap_head_def *arg0,
				       int arg1)    ;
extern rtx gen_rtx_fmt_uuuu	  (enum rtx_code , enum machine_mode mode,
				       rtx arg0, rtx arg1, rtx arg2,
				       rtx arg3)    ;
extern rtx gen_rtx_CONST_DOUBLE   (enum machine_mode, rtx,
				       int , int )    ;
extern rtx gen_rtx_CONST_INT   (enum machine_mode, int )    ;
extern rtx gen_rtx_REG   (enum machine_mode, int)    ;
extern rtx gen_rtx_MEM   (enum machine_mode, rtx)    ;
extern rtx find_next_ref		  (rtx, rtx)    ;
extern rtx *find_single_use		  (rtx, rtx, rtx *)    ;
extern rtx output_constant_def		  (union tree_node *)    ;
extern rtx immed_real_const		  (union tree_node *)    ;
extern union tree_node *make_tree	  (union tree_node *, rtx)    ;
extern int flow2_completed;
extern int reload_completed;
extern int reload_in_progress;
extern int cse_not_expected;
extern int no_new_pseudos;
extern int rtx_to_tree_code	  (enum rtx_code)    ;
extern void obfree			  (char *)    ;
struct obstack;
extern void gcc_obstack_init		  (struct obstack *)    ;
extern void pop_obstacks		  (void)    ;
extern void push_obstacks		  (struct obstack *,
						struct obstack *)    ;
struct cse_basic_block_data;
extern int rtx_cost			  (rtx, enum rtx_code)    ;
extern void delete_trivially_dead_insns	  (rtx, int)    ;
extern int cse_main			  (rtx, int, int, FILE *)    ;
extern void cse_end_of_basic_block	  (rtx,
						struct cse_basic_block_data *,
						int, int, int)    ;
extern int comparison_dominates_p	  (enum rtx_code, enum rtx_code)    ;
extern int condjump_p			  (rtx)    ;
extern rtx condjump_label		  (rtx)    ;
extern int simplejump_p			  (rtx)    ;
extern int returnjump_p			  (rtx)    ;
extern int onlyjump_p			  (rtx)    ;
extern int sets_cc0_p			  (rtx)    ;
extern int invert_jump			  (rtx, rtx)    ;
extern int rtx_renumbered_equal_p	  (rtx, rtx)    ;
extern int true_regnum			  (rtx)    ;
extern int redirect_jump		  (rtx, rtx)    ;
extern void jump_optimize		  (rtx, int, int, int)    ;
extern void rebuild_jump_labels		  (rtx)    ;
extern void thread_jumps		  (rtx, int, int)    ;
extern int redirect_exp			  (rtx *, rtx, rtx, rtx)    ;
extern int rtx_equal_for_thread_p	  (rtx, rtx, rtx)    ;
extern int invert_exp			  (rtx, rtx)    ;
extern int can_reverse_comparison_p	  (rtx, rtx)    ;
extern void delete_for_peephole		  (rtx, rtx)    ;
extern int condjump_in_parallel_p	  (rtx)    ;
extern void never_reached_warning	  (rtx)    ;
extern int max_reg_num				  (void)    ;
extern int max_label_num			  (void)    ;
extern int get_first_label_num			  (void)    ;
extern void delete_insns_since			  (rtx)    ;
extern void mark_reg_pointer			  (rtx, int)    ;
extern void mark_user_reg			  (rtx)    ;
extern void reset_used_flags			  (rtx)    ;
extern void reorder_insns			  (rtx, rtx, rtx)    ;
extern int get_max_uid				  (void)    ;
extern int in_sequence_p			  (void)    ;
extern void force_next_line_note		  (void)    ;
extern void clear_emit_caches			  (void)    ;
extern void init_emit				  (void)    ;
extern void init_emit_once			  (int)    ;
extern void push_topmost_sequence		  (void)    ;
extern void pop_topmost_sequence		  (void)    ;
extern int subreg_realpart_p			  (rtx)    ;
extern void reverse_comparison			  (rtx)    ;
extern void set_new_first_and_last_insn		  (rtx, rtx)    ;
extern void set_new_first_and_last_label_num	  (int, int)    ;
extern void set_new_last_label_num		  (int)    ;
extern void unshare_all_rtl			  (rtx)    ;
extern void set_last_insn			  (rtx)    ;
extern void link_cc0_insns			  (rtx)    ;
extern void add_insn				  (rtx)    ;
extern void add_insn_before			  (rtx, rtx)    ;
extern void add_insn_after			  (rtx, rtx)    ;
extern void remove_insn				  (rtx)    ;
extern void reorder_insns_with_line_notes	  (rtx, rtx, rtx)    ;
extern void emit_insn_after_with_line_notes	  (rtx, rtx, rtx)    ;
extern enum rtx_code classify_insn		  (rtx)    ;
extern rtx emit					  (rtx)    ;
int force_line_numbers   (void)    ;
void restore_line_number_status   (int old_value)    ;
extern void renumber_insns                        (FILE *)    ;
extern void remove_unncessary_notes               (void)    ;
extern void add_clobbers		  (rtx, int)    ;
extern void combine_instructions	  (rtx, int)    ;
extern int extended_count		  (rtx, enum machine_mode, int)    ;
extern rtx remove_death			  (int, rtx)    ;
extern void dump_combine_stats		  (FILE *)    ;
extern void dump_combine_total_stats	  (FILE *)    ;
extern void schedule_insns		  (FILE *)    ;
extern void fix_sched_param		  (const char *, const char *)    ;
extern void debug_rtx			  (rtx)    ;
extern void debug_rtx_list		  (rtx, int)    ;
extern rtx debug_rtx_find		  (rtx, int)    ;
extern void print_rtl			  (FILE *, rtx)    ;
extern int print_rtl_single		  (FILE *, rtx)    ;
extern void print_inline_rtx		  (FILE *, rtx, int)    ;
extern void init_loop			  (void)    ;
extern rtx libcall_other_reg		  (rtx, rtx)    ;
extern void loop_optimize		  (rtx, FILE *, int, int)    ;
extern void record_excess_regs		  (rtx, rtx, rtx *)    ;
extern void reposition_prologue_and_epilogue_notes	  (rtx)    ;
extern void thread_prologue_and_epilogue_insns		  (rtx)    ;
extern int prologue_epilogue_contains			  (rtx)    ;
extern void use_variable				  (rtx)    ;
extern int  get_frame_size			  (void)    ;
extern void preserve_rtl_expr_result			  (rtx)    ;
extern void mark_temp_addr_taken			  (rtx)    ;
extern void update_temp_slot_address			  (rtx, rtx)    ;
extern void use_variable_after				  (rtx, rtx)    ;
extern void purge_addressof				  (rtx)    ;
extern int operands_match_p		  (rtx, rtx)    ;
extern int safe_from_earlyclobber	  (rtx, rtx)    ;
extern void set_file_and_line_for_stmt	  (char *, int)    ;
extern void expand_null_return		  (void)    ;
extern void emit_jump			  (rtx)    ;
extern int preserve_subexpressions_p	  (void)    ;
extern void init_expr_once		  (void)    ;
extern void move_by_pieces		  (rtx, rtx, int, int)    ;
extern void stupid_life_analysis	  (rtx, int, FILE *)    ;
extern void allocate_bb_life_data	  (void)    ;
extern void allocate_reg_life_data	  (void)    ;
extern void recompute_reg_usage		  (rtx, int)    ;
extern void print_rtl_with_bb		  (FILE *, rtx)    ;
extern void dump_flow_info		  (FILE *)    ;
extern void init_expmed			  (void)    ;
extern void expand_inc			  (rtx, rtx)    ;
extern void expand_dec			  (rtx, rtx)    ;
extern rtx expand_mult_highpart		  (enum machine_mode, rtx,
						unsigned int , rtx,
						int, int)    ;
extern int gcse_main			  (rtx, FILE *)    ;
extern void mark_elimination		  (int, int)    ;
extern int global_alloc			  (FILE *)    ;
extern void dump_global_regs		  (FILE *)    ;
extern int reg_classes_intersect_p	  (enum reg_class, enum reg_class)    ;
extern int reg_class_subset_p		  (enum reg_class, enum reg_class)    ;
extern void globalize_reg		  (int)    ;
extern void init_regs			  (void)    ;
extern void init_reg_sets		  (void)    ;
extern void regset_release_memory	  (void)    ;
extern void regclass_init		  (void)    ;
extern void regclass			  (rtx, int)    ;
extern void reg_scan			  (rtx, int, int)    ;
extern void reg_scan_update		  (rtx, rtx, int)    ;
extern void fix_register		  (const char *, int, int)    ;
extern void regmove_optimize		  (rtx, int, FILE *)    ;
extern void dbr_schedule		  (rtx, FILE *)    ;
extern void init_optabs			  (void)    ;
extern void dump_local_alloc		  (FILE *)    ;
extern int local_alloc			  (void)    ;
extern int function_invariant_p		  (rtx)    ;
extern void reload_cse_regs		  (rtx)    ;
extern void init_reload			  (void)    ;
extern void mark_home_live		  (int)    ;
extern int reload			  (rtx, int, FILE *)    ;
extern void init_caller_save		  (void)    ;
extern void init_branch_prob		  (const char *)    ;
extern void branch_prob			  (rtx, FILE *)    ;
extern void end_branch_prob		  (FILE *)    ;
extern void output_func_start_profiler	  (void)    ;
extern void reg_to_stack		  (rtx, FILE *)    ;
extern int add_double		  (int , int ,
					int , int ,
					int  *, int  *)    ;
extern int neg_double		  (int , int ,
					int  *, int  *)    ;
extern int mul_double		  (int , int ,
					int , int ,
					int  *, int  *)    ;
extern void lshift_double	  (int , int ,
					int , int, int  *,
					int  *, int)    ;
extern void rshift_double	  (int , int ,
					int , int,
					int  *, int  *, int)    ;
extern void lrotate_double	  (int , int ,
					int , int, int  *,
					int  *)    ;
extern void rrotate_double	  (int , int ,
					int , int, int  *,
					int  *)    ;
extern void emit_library_call		  (rtx, int, enum machine_mode,
						  int, ...)    ;
extern rtx emit_library_call_value	  (rtx, rtx, int,
						 enum machine_mode,
						 int, ...)    ;
extern int set_dominates_use		  (int, int, int, rtx, rtx)    ;
extern void bss_section			  (void)    ;
extern int in_data_section		  (void)    ;
extern int supports_one_only		  (void)    ;
extern void init_varasm_once		  (void)    ;
extern void init_rtl			  (void)    ;
extern void rtx_free			  (rtx)    ;
extern int read_skip_spaces		  (FILE *)    ;
extern rtx read_rtx			  (FILE *)    ;
extern const char *read_rtx_filename;
extern int read_rtx_lineno;
extern void fancy_abort   (const char *, int, const char *)    
    __attribute__ ((__noreturn__)) ;
extern int true_dependence		  (rtx, enum machine_mode, rtx,
						int (*)(rtx))    ;
extern int read_dependence		  (rtx, rtx)    ;
extern int anti_dependence		  (rtx, rtx)    ;
extern int output_dependence		  (rtx, rtx)    ;
extern void mark_constant_function	  (void)    ;
extern void init_alias_once		  (void)    ;
extern void init_alias_analysis		  (void)    ;
extern void end_alias_analysis		  (void)    ;
extern void record_base_value		  (int, rtx, int)    ;
extern void record_alias_subset           (int, int)    ;
extern rtx addr_side_effect_eval	  (rtx, int, int)    ;
extern void delete_null_pointer_checks	  (rtx)    ;

struct _obstack_chunk		 
{
  char  *limit;			 
  struct _obstack_chunk *prev;	 
  char	contents[4];		 
};
struct obstack		 
{
  long	chunk_size;		 
  struct _obstack_chunk *chunk;	 
  char	*object_base;		 
  char	*next_free;		 
  char	*chunk_limit;		 
  int  temp;		 
  int   alignment_mask;		 
  struct _obstack_chunk *(*chunkfun) (void *, long);
  void (*freefun) (void *, struct _obstack_chunk *);
  void *extra_arg;		 
  unsigned use_extra_arg:1;	 
  unsigned maybe_empty_object:1; 
  unsigned alloc_failed:1;	 
};
extern void _obstack_newchunk (struct obstack *, int);
extern void _obstack_free (struct obstack *, void *);
extern int _obstack_begin (struct obstack *, int, int,
			    void *(*) (long), void (*) (void *));
extern int _obstack_begin_1 (struct obstack *, int, int,
			     void *(*) (void *, long),
			     void (*) (void *, void *), void *);
extern int _obstack_memory_used (struct obstack *);

void obstack_init (struct obstack *obstack);
void * obstack_alloc (struct obstack *obstack, int size);
void * obstack_copy (struct obstack *obstack, void *address, int size);
void * obstack_copy0 (struct obstack *obstack, void *address, int size);
void obstack_free (struct obstack *obstack, void *block);
void obstack_blank (struct obstack *obstack, int size);
void obstack_grow (struct obstack *obstack, void *data, int size);
void obstack_grow0 (struct obstack *obstack, void *data, int size);
void obstack_1grow (struct obstack *obstack, int data_char);
void obstack_ptr_grow (struct obstack *obstack, void *data);
void obstack_int_grow (struct obstack *obstack, int data);
void * obstack_finish (struct obstack *obstack);
int obstack_object_size (struct obstack *obstack);
int obstack_room (struct obstack *obstack);
void obstack_make_room (struct obstack *obstack, int size);
void obstack_1grow_fast (struct obstack *obstack, int data_char);
void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
void obstack_int_grow_fast (struct obstack *obstack, int data);
void obstack_blank_fast (struct obstack *obstack, int size);
void * obstack_base (struct obstack *obstack);
void * obstack_next_free (struct obstack *obstack);
int obstack_alignment_mask (struct obstack *obstack);
int obstack_chunk_size (struct obstack *obstack);
int obstack_memory_used (struct obstack *obstack);
extern void (*obstack_alloc_failed_handler) (void);
extern int obstack_exit_failure;



extern void warning   (const char *format, ...)     __attribute__ ((__format__ 
(__printf__,  1 ,   2 )))  ;
extern void error     (const char *format, ...)     __attribute__ ((__format__ 
(__printf__,  1 ,   2 )))  ;
extern void fatal     (const char *format, ...)    
    __attribute__ ((__format__ (__printf__,  1 ,   2 )))   __attribute__ 
((__noreturn__)) ;
extern int have_error;
extern const char *progname;
static struct obstack obstack;
struct obstack *rtl_obstack = &obstack;
static char **insn_name_ptr = 0;
static int insn_name_ptr_size = 0;
struct decision_head
{
  struct decision *first;
  struct decision *last;
};
struct decision_test
{
  struct decision_test *next;
  enum decision_type {
    DT_mode, DT_code, DT_veclen,
    DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide,
    DT_dup, DT_pred, DT_c_test, 
    DT_accept_op, DT_accept_insn
  } type;
  union
  {
    enum machine_mode mode;	 
    enum rtx_code  code;		 
    struct
    {
      const char *name;		 
      int index;		 
      enum machine_mode mode;	 
    } pred;
    const char *c_test;		 
    int veclen;			 
    int dup;			 
    int  intval;	 
    int opno;			 
    struct {
      int code_number;		 
      int lineno;		 
      int num_clobbers_to_add;	 
    } insn;
  } u;
};
struct decision
{
  struct decision_head success;	 
  struct decision *next;	 
  struct decision *prev;	 
  struct decision *afterward;	 
  const char *position;		 
  struct decision_test *tests;	 
  int number;			 
  int subroutine_number;	 
  int need_label;		 
};
static int next_subroutine_number;
enum routine_type {
  RECOG, SPLIT, PEEPHOLE2
};
static int next_number;
static int next_insn_code;
static int next_index;
static int max_depth;
static int pattern_lineno;
static int error_count;

static struct pred_table
{
  const char *name;
  enum rtx_code  codes[((int)LAST_AND_UNUSED_RTX_CODE) ];
} preds[] = {
  {"general_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
		       LABEL_REF, SUBREG, REG, MEM}},
  {"address_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
		       LABEL_REF, SUBREG, REG, MEM, PLUS, MINUS, MULT}},
  {"register_operand", {SUBREG, REG}},
  {"pmode_register_operand", {SUBREG, REG}},
  {"scratch_operand", {SCRATCH, REG}},
  {"immediate_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
			 LABEL_REF}},
  {"const_int_operand", {CONST_INT}},
  {"const_double_operand", {CONST_INT, CONST_DOUBLE}},
  {"nonimmediate_operand", {SUBREG, REG, MEM}},
  {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
			 LABEL_REF, SUBREG, REG}},
  {"push_operand", {MEM}},
  {"pop_operand", {MEM}},
  {"memory_operand", {SUBREG, MEM}},
  {"indirect_operand", {SUBREG, MEM}},
  {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU}},
  {"mode_independent_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
				LABEL_REF, SUBREG, REG, MEM}}
};
static const char * special_mode_pred_table[] = {
  "pmode_register_operand"
};
static void message_with_line
    (int, const char *, ...)     __attribute__ ((__format__ (__printf__,  2 ,  
 3 )))  ;
static struct decision *new_decision
    (const char *, struct decision_head *)    ;
static struct decision_test *new_decision_test
    (enum decision_type, struct decision_test ***)    ;
static rtx find_operand
    (rtx, int)    ;
static void validate_pattern
    (rtx, rtx, rtx)    ;
static struct decision *add_to_sequence
    (rtx, struct decision_head *, const char *, enum routine_type, int)    ;
static int maybe_both_true_2
    (struct decision_test *, struct decision_test *)    ;
static int maybe_both_true_1
    (struct decision_test *, struct decision_test *)    ;
static int maybe_both_true
    (struct decision *, struct decision *, int)    ;
static int nodes_identical_1
    (struct decision_test *, struct decision_test *)    ;
static int nodes_identical
    (struct decision *, struct decision *)    ;
static void merge_accept_insn
    (struct decision *, struct decision *)    ;
static void merge_trees
    (struct decision_head *, struct decision_head *)    ;
static void factor_tests
    (struct decision_head *)    ;
static void simplify_tests
    (struct decision_head *)    ;
static int break_out_subroutines
    (struct decision_head *, int)    ;
static void find_afterward
    (struct decision_head *, struct decision *)    ;
static void change_state
    (const char *, const char *, struct decision *, const char *)    ;
static void print_code
    (enum rtx_code)    ;
static void write_afterward
    (struct decision *, struct decision *, const char *)    ;
static struct decision *write_switch
    (struct decision *, int)    ;
static void write_cond
    (struct decision_test *, int, enum routine_type)    ;
static void write_action
    (struct decision_test *, int, int, struct decision *,
	 enum routine_type)    ;
static int is_unconditional
    (struct decision_test *, enum routine_type)    ;
static int write_node
    (struct decision *, int, enum routine_type)    ;
static void write_tree_1
    (struct decision_head *, int, enum routine_type)    ;
static void write_tree
    (struct decision_head *, const char *, enum routine_type, int)    ;
static void write_subroutine
    (struct decision_head *, enum routine_type)    ;
static void write_subroutines
    (struct decision_head *, enum routine_type)    ;
static void write_header
    (void)    ;
static struct decision_head make_insn_sequence
    (rtx, enum routine_type)    ;
static void process_tree
    (struct decision_head *, enum routine_type)    ;
static void record_insn_name
    (int, const char *)    ;
static void debug_decision_0
    (struct decision *, int, int)    ;
static void debug_decision_1
    (struct decision *, int)    ;
static void debug_decision_2
    (struct decision_test *)    ;
extern void debug_decision
    (struct decision *)    ;
extern void debug_decision_list
    (struct decision *)    ;

static struct decision_head
make_insn_sequence (insn, type)
     rtx insn;
     enum routine_type type;
{
  rtx x;
  const char *c_test = (((  insn  )->fld[    type == RECOG ? 2 : 1  ]) .rtstr) 
;
  struct decision *last;
  struct decision_test *test, **place;
  struct decision_head head;
  record_insn_name (next_insn_code, (type == RECOG ? (((  insn  )->fld[    0  
]) .rtstr)  : ((void *)0) ));
  if (type == PEEPHOLE2)
    {
      int i, j;
      x = rtx_alloc (PARALLEL);
      (( x )->mode = (  VOIDmode )) ;
      (((  x  )->fld[    0  ]) .rtvec)  = rtvec_alloc ((( (((   insn   )->fld[ 
     0   ]) .rtvec)  )->num_elem)  );
      for (i = j = 0; i < (( (((   insn   )->fld[      0   ]) .rtvec)  )->
num_elem)  ; i++)
	{
	  rtx tmp = (( (((   insn   )->fld[      0   ]) .rtvec)  )->elem[    i  ])  ;
	  if ((( tmp )->code)  != MATCH_SCRATCH && (( tmp )->code)  != MATCH_DUP)
	    {
	      (( (((   x   )->fld[      0   ]) .rtvec)  )->elem[    j  ])   = tmp;
	      j++;
	    }
	}
      (( (((   x   )->fld[      0   ]) .rtvec)  )->num_elem)   = j;
    }
  else if ((( (((   insn   )->fld[      type == RECOG   ]) .rtvec)  )->
num_elem)   == 1)
    x = (( (((   insn   )->fld[      type == RECOG   ]) .rtvec)  )->elem[    0 
 ])  ;
  else
    {
      x = rtx_alloc (PARALLEL);
      (((  x  )->fld[    0  ]) .rtvec)  = (((  insn  )->fld[    type == RECOG  
]) .rtvec) ;
      (( x )->mode = (  VOIDmode )) ;
    }
  validate_pattern (x, insn, (rtx) 0 );
  memset(&head, 0, sizeof(head));
  last = add_to_sequence (x, &head, "", type, 1);
  for (test = last->tests; test->next; test = test->next)
    continue;
  place = &test->next;
  if (c_test[0])
    {
      if (test->type == DT_accept_op)
	{
	  last = new_decision ("", &last->success);
	  place = &last->tests;
	}
      test = new_decision_test (DT_c_test, &place);
      test->u.c_test = c_test;
    }
  test = new_decision_test (DT_accept_insn, &place);
  test->u.insn.code_number = next_insn_code;
  test->u.insn.lineno = pattern_lineno;
  test->u.insn.num_clobbers_to_add = 0;
  switch (type)
    {
    case RECOG:
      if ((( x )->code)  == PARALLEL)
	{
	  int i;
	  for (i = (( (((   x   )->fld[      0   ]) .rtvec)  )->num_elem)  ; i > 0; 
i--)
	    {
	      rtx y = (( (((   x   )->fld[      0   ]) .rtvec)  )->elem[    i - 1  ]) 
 ;
	      if ((( y )->code)  != CLOBBER
		  || ((( (((  y  )->fld[    0  ]) .rtx)  )->code)  != REG
		      && (( (((  y  )->fld[    0  ]) .rtx)  )->code)  != MATCH_SCRATCH))
		break;
	    }
	  if (i != (( (((   x   )->fld[      0   ]) .rtvec)  )->num_elem)  )
	    {
	      rtx new;
	      struct decision_head clobber_head;
	      if (i == 1)
		new = (( (((   x   )->fld[      0   ]) .rtvec)  )->elem[    0  ])  ;
	      else
		{
		  int j;
		  new = rtx_alloc (PARALLEL);
		  (((  new  )->fld[    0  ]) .rtvec)  = rtvec_alloc (i);
		  for (j = i - 1; j >= 0; j--)
		    (( (((   new   )->fld[      0   ]) .rtvec)  )->elem[    j  ])   = (( ((( 
  x   )->fld[      0   ]) .rtvec)  )->elem[    j  ])  ;
		}
	      memset (&clobber_head, 0, sizeof(clobber_head));
	      last = add_to_sequence (new, &clobber_head, "", type, 1);
	      for (test = last->tests; test->next; test = test->next)
		continue;
	      place = &test->next;
	      if (test->type == DT_accept_op)
		{
		  last = new_decision ("", &last->success);
		  place = &last->tests;
		}
	      if (c_test[0])
		{
		  test = new_decision_test (DT_c_test, &place);
		  test->u.c_test = c_test;
		}
	      test = new_decision_test (DT_accept_insn, &place);
	      test->u.insn.code_number = next_insn_code;
	      test->u.insn.lineno = pattern_lineno;
	      test->u.insn.num_clobbers_to_add = (( (((   x   )->fld[      0   ]) 
.rtvec)  )->num_elem)   - i;
	      merge_trees (&head, &clobber_head);
	    }
	}
      break;
    case SPLIT:
      printf ("extern rtx gen_split_%d PROTO ((rtx *));\n", next_insn_code);
      break;
    case PEEPHOLE2:
      printf ("extern rtx gen_peephole2_%d PROTO ((rtx, rtx *));\n",
	      next_insn_code);
      break;
    }
  next_insn_code++;
  return head;
}




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