4.4BSD/usr/src/contrib/gcc-2.3.3/genattr.i

# 1 "genattr.c"
 




















# 1 "/usr/include/stdio.h" 1
 









































# 1 "/usr/include/sys/types.h" 1
 





































 
# 1 "/usr/include/machine/endian.h" 1
 


































 






 









# 1 "/usr/include/sys/cdefs.h" 1
 













































 











# 76 "/usr/include/sys/cdefs.h"


 
















# 53 "/usr/include/machine/endian.h" 2


 
unsigned long	htonl (unsigned long)		;
unsigned short	htons (unsigned short)		;
unsigned long	ntohl (unsigned long)		;
unsigned short	ntohs (unsigned short)		;
 

 





















# 40 "/usr/include/sys/types.h" 2


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	unsigned long long u_quad_t;
typedef	long long quad_t;
typedef	quad_t * qaddr_t;
typedef	char *	caddr_t;		 
typedef	long	daddr_t;		 
typedef	u_long	dev_t;			 
typedef	u_long	ino_t;			 
typedef	quad_t	off_t;			 
typedef	u_short	nlink_t;		 
typedef	long	swblk_t;		 
typedef	long	segsz_t;		 
typedef	u_long	uid_t;			 
typedef	u_long	gid_t;			 
typedef	short	pid_t;			 
typedef	u_short	mode_t;			 
typedef u_long	fixpt_t;		 







# 1 "/usr/include/machine/ansi.h" 1
 





































 



















# 71 "/usr/include/sys/types.h" 2


# 1 "/usr/include/machine/types.h" 1
 





































typedef struct _physadr {
	short r[1];
} *physadr;

typedef struct label_t {			 
	int val[15];
} label_t;

typedef	u_long	vm_offset_t;
typedef	u_long	vm_size_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;



# 73 "/usr/include/sys/types.h" 2




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;







# 140 "/usr/include/sys/types.h"




# 43 "/usr/include/stdio.h" 2



# 1 "/usr/include/sys/cdefs.h" 1
 


































# 94 "/usr/include/sys/cdefs.h"

# 46 "/usr/include/stdio.h" 2


# 1 "/usr/include/machine/ansi.h" 1
 


































# 58 "/usr/include/machine/ansi.h"

# 48 "/usr/include/stdio.h" 2










 





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;	 
	int	_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 char *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 *, char *			)		;
int	 vprintf (const char *, char *			)		;
int	 vsprintf (char *, const char *, char *			)		;
 

 






 
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 *, char *			)		;
int	 vscanf (const char *, char *			)		;
int	 vsscanf (const char *, const char *, char *			)		;
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 *, char *			)		;
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));
}
# 347 "/usr/include/stdio.h"























# 22 "genattr.c" 2

# 1 "hconfig.h" 1
 



















 



 








 

# 1 "tm.h" 1


 



 




 



 



 



 



 



 




 



# 36 "hconfig.h" 2


 



 

 



# 23 "genattr.c" 2

# 1 "rtl.h" 1
 



















# 1 "machmode.h" 1
 





















 












 













 







 





 



enum machine_mode {
# 1 "machmode.def" 1
 




















 










 



























 

 VOIDmode, 

 QImode, 		 
 HImode, 
 


 PSImode, 
 SImode, 
 PDImode, 
 DImode, 
 TImode, 

 SFmode, 
 DFmode, 
 XFmode,     
 TFmode, 

 SCmode, 
 DCmode, 
 XCmode, 
 TCmode, 

 

 BLKmode, 

 





 CCmode, 

 


 





# 69 "machmode.h" 2





MAX_MACHINE_MODE };









 

extern char *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 enum mode_class mode_class[];


 

extern int mode_size[];


 

extern int mode_unit_size[];


 





 



 






 

extern enum machine_mode mode_wider_mode[];


 



extern enum machine_mode mode_for_size ();

 

extern enum machine_mode get_best_mode ();

 





 

extern enum machine_mode class_narrowest_mode[];


 


extern enum machine_mode byte_mode;
extern enum machine_mode word_mode;


# 21 "rtl.h" 2





 


enum rtx_code  {


# 1 "rtl.def" 1
 





















 




































 




 
  UNKNOWN , 

 

  NIL , 

 



 
  EXPR_LIST , 

 

  INSN_LIST , 

 




 































  MATCH_OPERAND , 

 




  MATCH_SCRATCH , 

 


  MATCH_DUP , 

 





  MATCH_OPERATOR , 

 






  MATCH_PARALLEL , 

 


  MATCH_OP_DUP , 

 


  MATCH_PAR_DUP , 

 
















  DEFINE_INSN , 

 





  DEFINE_PEEPHOLE , 

 







  DEFINE_SPLIT , 

 

  DEFINE_COMBINE , 

 









  DEFINE_EXPAND , 
   
 













  DEFINE_DELAY , 

 






































  DEFINE_FUNCTION_UNIT , 

 
  DEFINE_ASM_ATTRIBUTES , 

 



  SEQUENCE , 

 



  ADDRESS , 

 




 



  DEFINE_ATTR , 

 
  ATTR , 

 





  SET_ATTR , 

 












  SET_ATTR_ALTERNATIVE , 

 


  EQ_ATTR , 

 









 
  INSN , 

 

  JUMP_INSN , 

 



  CALL_INSN , 

 
  BARRIER , 

 





  CODE_LABEL , 
     
 







  NOTE , 

 



  INLINE_HEADER , 

 


   
 
  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 , 

 

  MEM , 

 



  LABEL_REF , 

 



  SYMBOL_REF , 

 




  CC0 , 

 















  QUEUED , 

 



 





  IF_THEN_ELSE , 

 






  COND , 

 
  COMPARE , 

 
  PLUS , 

 
  MINUS , 

 
  NEG , 

  MULT , 

 
  DIV , 
 
  MOD , 

 
  UDIV , 
  UMOD , 

 
  AND , 

  IOR , 

  XOR , 

  NOT , 

 




  LSHIFT , 
  ASHIFT , 
  ROTATE , 

 


  ASHIFTRT , 
  LSHIFTRT , 
  ROTATERT , 

 



  SMIN , 
  SMAX , 
  UMIN , 
  UMAX , 

 






  PRE_DEC , 
  PRE_INC , 
  POST_DEC , 
  POST_INC , 

 

  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 , 

 





# 32 "rtl.h" 2



  LAST_AND_UNUSED_RTX_CODE};	 




				 

extern int rtx_length[];


extern char *rtx_name[];


extern char *rtx_format[];


extern char rtx_class[];


 

typedef union rtunion_def
{
  int  rtwint;
  int rtint;
  char *rtstr;
  struct rtx_def *rtx;
  struct rtvec_def *rtvec;
  enum machine_mode rttype;
} 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;
   


  rtunion fld[1];
} *rtx;

 










 

















 















 



typedef struct rtvec_def{
  unsigned num_elem;		 
  rtunion 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 };

 



 

extern char *reg_note_name[];


 






 








 



 


 



 






 





 

 

 

 

 

 

 










 

extern char *note_insn_name[];


 



 



 




 





 





 




 



 




 


 



 





 










 













 



 


 



 
 


 


 


 



 









 




 


 


 


 


 




































 



 











 


 






 


 




 

 













extern rtx plus_constant_wide		 (rtx, int ) ;
extern rtx plus_constant_for_output_wide (rtx, int ) ;



# 631 "rtl.h"

extern rtx gen_rtx ();
extern rtvec gen_rtvec ();



extern rtx read_rtx			(FILE *) ;










extern char *xrealloc ();


extern char *xmalloc			(unsigned) ;
extern char *oballoc			(int) ;
extern char *permalloc			(int) ;
extern void free			(void *) ;
extern rtx rtx_alloc			(enum rtx_code ) ;
extern rtvec rtvec_alloc		(int) ;
extern rtx find_reg_note		(rtx, enum reg_note, rtx) ;
extern rtx find_regno_note		(rtx, enum reg_note, int) ;
extern int  get_integer_term	(rtx) ;
extern rtx get_related_value		(rtx) ;
extern rtx single_set			(rtx) ;
extern rtx find_last_value		(rtx, rtx *, rtx) ;
extern rtx copy_rtx			(rtx) ;
extern rtx copy_rtx_if_shared		(rtx) ;
extern rtx copy_most_rtx		(rtx, rtx) ;
extern rtx replace_rtx			(rtx, 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_inline_header_rtx	(rtx, rtx, int, int, int, int, int, int, rtx, int, int, rtvec, rtx) ;
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 memory_address		(enum machine_mode, rtx) ;
extern rtx get_insns			(void) ;
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 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 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_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_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 reg_set_last			(rtx, 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 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 nonlocal_label_rtx_list	(void) ;
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 eliminate_constant_term	(rtx, rtx *) ;
extern rtx expand_complex_abs		(enum machine_mode, rtx, rtx, int) ;

 



extern int max_parallel;

extern int asm_noperands		(rtx) ;
extern char *decode_asm_operands	(rtx, rtx *, rtx **, 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 rtx pc_rtx;
extern rtx cc0_rtx;
extern rtx const0_rtx;
extern rtx const1_rtx;
extern rtx const2_rtx;
extern rtx constm1_rtx;
extern rtx const_true_rtx;

extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];

 




 




 


extern rtx stack_pointer_rtx;
extern rtx frame_pointer_rtx;
extern rtx arg_pointer_rtx;
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 virtual_incoming_args_rtx;



 



extern rtx virtual_stack_vars_rtx;



 



extern rtx virtual_stack_dynamic_rtx;



 



extern rtx virtual_outgoing_args_rtx;





extern rtx find_next_ref		(rtx, rtx) ;
extern rtx *find_single_use		(rtx, rtx, rtx *) ;

 


extern rtx expand_expr ();
extern rtx immed_real_const_1();









extern rtx output_constant_def ();
extern rtx immed_real_const ();
extern rtx immed_real_const_1 ();


 





 


extern int reload_completed;

 


extern int reload_in_progress;

 





extern int cse_not_expected;

 

extern rtx *regno_reg_rtx;
# 24 "genattr.c" 2

# 1 "obstack.h" 1
 
















 


















































































 




 











 




# 133 "obstack.h"

# 1 "/usr/include/stddef.h" 1
 





































# 1 "/usr/include/machine/ansi.h" 1
 


































# 58 "/usr/include/machine/ansi.h"

# 39 "/usr/include/stddef.h" 2


typedef	int				ptrdiff_t;







typedef	unsigned short			wchar_t;










# 134 "obstack.h" 2










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;		 
  ptrdiff_t  temp;		 
  int   alignment_mask;		 
  struct _obstack_chunk *(*chunkfun) ();  
  void (*freefun) ();		 
  char *extra_arg;		 
  unsigned use_extra_arg:1;	 
  unsigned maybe_empty_object:1; 



};

 


extern void _obstack_newchunk (struct obstack *, int);
extern void _obstack_free (struct obstack *, void *);
extern void _obstack_begin (struct obstack *, int, int,
			    void *(*) (), void (*) ());
extern void _obstack_begin_1 (struct obstack *, int, int,
			      void *(*) (), void (*) (), void *);









 


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_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);



 


 





 



 



 




























 














 





# 301 "obstack.h"


# 312 "obstack.h"









 


   














































 


# 387 "obstack.h"









# 482 "obstack.h"



# 25 "genattr.c" 2


static struct obstack obstack;
struct obstack *rtl_obstack = &obstack;




extern void free ();
extern int atoi ();
extern rtx read_rtx ();

char *xmalloc ();
static void fatal ();
void fancy_abort ();

 

struct range
{
  int min;
  int max;
};

 


struct function_unit
{
  char *name;			 
  struct function_unit *next;	 
  int multiplicity;		 
  int simultaneity;		 

  struct range ready_cost;	 
  struct range issue_delay;	 
};

static void
extend_range (range, min, max)
     struct range *range;
     int min;
     int max;
{
  if (range->min > min) range->min = min;
  if (range->max < max) range->max = max;
}

static void
init_range (range)
     struct range *range;
{
  range->min = 100000;
  range->max = -1;
}

static void
write_upcase (str)
    char *str;
{
  for (; *str; str++)
    if (*str >= 'a' && *str <= 'z')
      printf ("%c", *str - 'a' + 'A');
    else
      printf ("%c", *str);
}

static void
gen_attr (attr)
     rtx attr;
{
  char *p;

  printf ("#define HAVE_ATTR_%s\n", ((attr)->fld[ 0].rtstr) );

   
  if (*((attr)->fld[ 1].rtstr)  == '\0')
    printf ("extern int get_attr_%s ();\n", ((attr)->fld[ 0].rtstr) );
  else
    {
      printf ("enum attr_%s {", ((attr)->fld[ 0].rtstr) );
      write_upcase (((attr)->fld[ 0].rtstr) );
      printf ("_");

      for (p = ((attr)->fld[ 1].rtstr) ; *p != '\0'; p++)
	{
	  if (*p == ',')
	    {
	      printf (", ");
	      write_upcase (((attr)->fld[ 0].rtstr) );
	      printf ("_");
	    }
	  else if (*p >= 'a' && *p <= 'z')
	    printf ("%c", *p - 'a' + 'A');
	  else
	    printf ("%c", *p);
	}

      printf ("};\n");
      printf ("extern enum attr_%s get_attr_%s ();\n\n",
	      ((attr)->fld[ 0].rtstr) , ((attr)->fld[ 0].rtstr) );
    }

   

  if (! strcmp (((attr)->fld[ 0].rtstr) , "length"))
    {
      printf ("extern void init_lengths ();\n");
      printf ("extern void shorten_branches ();\n");
      printf ("extern int insn_default_length ();\n");
      printf ("extern int insn_variable_length_p ();\n");
      printf ("extern int insn_current_length ();\n\n");
      printf ("extern int *insn_addresses;\n");
      printf ("extern int insn_current_address;\n\n");
    }
}

static void
write_units (num_units, multiplicity, simultaneity,
	     ready_cost, issue_delay, blockage)
     int num_units;
     struct range *multiplicity;
     struct range *simultaneity;
     struct range *ready_cost;
     struct range *issue_delay;
     struct range *blockage;
{
  int i, q_size;

  printf ("#define INSN_SCHEDULING\n\n");
  printf ("extern int result_ready_cost ();\n");
  printf ("extern int function_units_used ();\n\n");
  printf ("extern struct function_unit_desc\n");
  printf ("{\n");
  printf ("  char *name;\n");
  printf ("  int bitmask;\n");
  printf ("  int multiplicity;\n");
  printf ("  int simultaneity;\n");
  printf ("  int default_cost;\n");
  printf ("  int max_issue_delay;\n");
  printf ("  int (*ready_cost_function) ();\n");
  printf ("  int (*conflict_cost_function) ();\n");
  printf ("  int max_blockage;\n");
  printf ("  unsigned int (*blockage_range_function) ();\n");
  printf ("  int (*blockage_function) ();\n");
  printf ("} function_units[];\n\n");
  printf ("#define FUNCTION_UNITS_SIZE %d\n", num_units);
  printf ("#define MIN_MULTIPLICITY %d\n", multiplicity->min);
  printf ("#define MAX_MULTIPLICITY %d\n", multiplicity->max);
  printf ("#define MIN_SIMULTANEITY %d\n", simultaneity->min);
  printf ("#define MAX_SIMULTANEITY %d\n", simultaneity->max);
  printf ("#define MIN_READY_COST %d\n", ready_cost->min);
  printf ("#define MAX_READY_COST %d\n", ready_cost->max);
  printf ("#define MIN_ISSUE_DELAY %d\n", issue_delay->min);
  printf ("#define MAX_ISSUE_DELAY %d\n", issue_delay->max);
  printf ("#define MIN_BLOCKAGE %d\n", blockage->min);
  printf ("#define MAX_BLOCKAGE %d\n", blockage->max);
  for (i = 0; (1 << i) < blockage->max; i++)
    ;
  printf ("#define BLOCKAGE_BITS %d\n", i + 1);

   

  i = ((blockage->max) > ( ready_cost->max) ? (blockage->max) : ( ready_cost->max)) ;
  for (q_size = 1; q_size <= i; q_size <<= 1)
    ;
  printf ("#define INSN_QUEUE_SIZE %d\n", q_size);
}

char *
xmalloc (size)
     unsigned size;
{
  register char *val = (char *) malloc (size);

  if (val == 0)
    fatal ("virtual memory exhausted");
  return val;
}

char *
xrealloc (ptr, size)
     char *ptr;
     unsigned size;
{
  char * result = (char *) realloc (ptr, size);
  if (!result)
    fatal ("virtual memory exhausted");
  return result;
}

static void
fatal (s, a1, a2)
     char *s;
{
  fprintf ((&__sF[2]) , "genattr: ");
  fprintf ((&__sF[2]) , s, a1, a2);
  fprintf ((&__sF[2]) , "\n");
  exit (33 );
}

 


void
fancy_abort ()
{
  fatal ("Internal gcc abort.");
}

int
main (argc, argv)
     int argc;
     char **argv;
{
  rtx desc;
  FILE *infile;
  register int c;
  int have_delay = 0;
  int have_annul_true = 0;
  int have_annul_false = 0;
  int num_units = 0;
  struct range all_simultaneity, all_multiplicity;
  struct range all_ready_cost, all_issue_delay, all_blockage;
  struct function_unit *units = 0, *unit;
  int i;

  init_range (&all_multiplicity);
  init_range (&all_simultaneity);
  init_range (&all_ready_cost);
  init_range (&all_issue_delay);
  init_range (&all_blockage);

  _obstack_begin ((rtl_obstack), 0, 0, (void *(*) ()) xmalloc , (void (*) ()) free ) ;

  if (argc <= 1)
    fatal ("No input file name.");

  infile = fopen (argv[1], "r");
  if (infile == 0)
    {
      perror (argv[1]);
      exit (33 );
    }

  init_rtl ();

  printf ("/* Generated automatically by the program `genattr'\nfrom the machine description file `md'.  */\n\n");


   


  printf ("#define HAVE_ATTR_alternative\n");
  printf ("#define get_attr_alternative(insn) which_alternative\n");
     
   

  while (1)
    {
      c = read_skip_spaces (infile);
      if (c == (-1) )
	break;
      ungetc (c, infile);

      desc = read_rtx (infile);
      if (	((desc)->code)  == DEFINE_ATTR)
	gen_attr (desc);

      else if (	((desc)->code)  == DEFINE_DELAY)
        {
	  if (! have_delay)
	    {
	      printf ("#define DELAY_SLOTS\n");
	      printf ("extern int num_delay_slots ();\n");
	      printf ("extern int eligible_for_delay ();\n\n");
	      printf ("extern int const_num_delay_slots ();\n\n");
	      have_delay = 1;
	    }

	  for (i = 0; i < ((desc)->fld[ 1].rtvec->num_elem) ; i += 3)
	    {
	      if (((desc)->fld[ 1].rtvec->elem[ i + 1].rtx)  && ! have_annul_true)
		{
		  printf ("#define ANNUL_IFTRUE_SLOTS\n");
		  printf ("extern int eligible_for_annul_true ();\n");
		  have_annul_true = 1;
		}

	      if (((desc)->fld[ 1].rtvec->elem[ i + 2].rtx)  && ! have_annul_false)
		{
		  printf ("#define ANNUL_IFFALSE_SLOTS\n");
		  printf ("extern int eligible_for_annul_false ();\n");
		  have_annul_false = 1;
		}
	    }
        }

      else if (	((desc)->code)  == DEFINE_FUNCTION_UNIT)
	{
	  char *name = ((desc)->fld[ 0].rtstr) ;
	  int multiplicity = ((desc)->fld[ 1].rtint) ;
	  int simultaneity = ((desc)->fld[ 2].rtint) ;
	  int ready_cost = ((((desc)->fld[ 4].rtint) ) > ( 1) ? (((desc)->fld[ 4].rtint) ) : ( 1)) ;
	  int issue_delay = ((((desc)->fld[ 5].rtint) ) > ( 1) ? (((desc)->fld[ 5].rtint) ) : ( 1)) ;
	  int issueexp_p = (((desc)->fld[ 6].rtvec)  != 0);

	  for (unit = units; unit; unit = unit->next)
	    if (strcmp (unit->name, name) == 0)
	      break;

	  if (unit == 0)
	    {
	      int len = strlen (name) + 1;
	      unit = (struct function_unit *)
		__builtin_alloca(sizeof (struct function_unit)) ;
	      unit->name = (char *) __builtin_alloca(len) ;
	      bcopy (name, unit->name, len);
	      unit->multiplicity = multiplicity;
	      unit->simultaneity = simultaneity;
	      unit->ready_cost.min = unit->ready_cost.max = ready_cost;
	      unit->issue_delay.min = unit->issue_delay.max = issue_delay;
	      unit->next = units;
	      units = unit;
	      num_units++;

	      extend_range (&all_multiplicity, multiplicity, multiplicity);
	      extend_range (&all_simultaneity, simultaneity, simultaneity);
	    }
	  else if (unit->multiplicity != multiplicity
		   || unit->simultaneity != simultaneity)
	    fatal ("Differing specifications given for `%s' function unit.",
		   unit->name);

	  extend_range (&unit->ready_cost, ready_cost, ready_cost);
	  extend_range (&unit->issue_delay,
			issueexp_p ? 1 : issue_delay, issue_delay);
	  extend_range (&all_ready_cost,
			unit->ready_cost.min, unit->ready_cost.max);
	  extend_range (&all_issue_delay,
			unit->issue_delay.min, unit->issue_delay.max);
	}
    }

  if (num_units > 0)
    {
       











      for (unit = units; unit; unit = unit->next)
	{
	  struct range blockage;
	  int max_issue_time = ((unit->issue_delay.max) > ( 1) ? (unit->issue_delay.max) : ( 1)) ;

	  blockage = unit->issue_delay;
	  blockage.max = ((unit->ready_cost.max
			      - (unit->ready_cost.min - 1)) > (
			      blockage.max) ? (unit->ready_cost.max
			      - (unit->ready_cost.min - 1)) : (
			      blockage.max)) ;
# 392 "genattr.c"
	  blockage.min = ((1) > ( blockage.min) ? (1) : ( blockage.min)) ;

	  if (unit->simultaneity != 0)
	    {
	      int fill_time = ((unit->simultaneity - 1)
			       * unit->issue_delay.min);
	      blockage.min = ((unit->ready_cost.min - fill_time) > (
				  blockage.min) ? (unit->ready_cost.min - fill_time) : (
				  blockage.min)) ;
# 400 "genattr.c"
	      blockage.max = ((unit->ready_cost.max - fill_time) > (
				  blockage.max) ? (unit->ready_cost.max - fill_time) : (
				  blockage.max)) ;
# 402 "genattr.c"
	    }
	  extend_range (&all_blockage, blockage.min, blockage.max);
	}

      write_units (num_units, &all_multiplicity, &all_simultaneity,
		   &all_ready_cost, &all_issue_delay, &all_blockage);
    }

  fflush ((&__sF[1]) );
  exit (((((&__sF[1]) )->_flags & 0x0040		) != 0)   != 0 ? 33  : 0 );
   
  return 0;
}