This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
testcase for combine bug
- To: kenner at vlsi1 dot ultra dot nyu dot edu
- Subject: testcase for combine bug
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Wed, 01 Dec 1999 00:35:55 -0700
- Cc: gcc-bugs at gcc dot gnu dot org
- Reply-To: law at cygnus dot com
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;
}