meissner@DG-RTP.DG.COM (03/21/89)
In making the latest GNU C compiler for the 88k, I've uncovered a
strange bug within the reload phase of GNU. Under some circumstances,
it appears that choose_reload_targets reload1.c will call the function
emit_move_insn to reload the output. In the case in question, though
the output is a SYMBOL_REF, which was generated by a block move (ie,
structure copy in this case). It only fails when optimizing and when
one less register is available than is normal for the 88k. I just
sent up the 88k patch kit to RMS, and can send it out upon request.
In particular, the block move insn is:
(insn:QI 1355 1871 1872 (parallel[
(set (mem:BLK (reg:SI 2))
(mem:BLK (reg:SI 7)))
(use (const_int 16))
(use (const_int 4))
(clobber (reg:SI 4))
(clobber (reg:SI 3))
(clobber (reg:SI 6))
(clobber (reg:SI 5))
] ) 55 (insn_list 1353 (nil))
(expr_list:QI (reg:SI 2)
(expr_list:QI (reg:SI 4)
(expr_list:QI (reg:SI 3)
(expr_list:QI (reg:SI 6)
(expr_list:QI (reg:SI 5)
(nil)))))))
The insn inserted is:
(insn 1872 1355 1356 (set (symbol_ref:SI ("cc_status"))
(reg:SI 7)) -1 (nil)
(nil))
I put in a quick hack to not reload this case, but I think the problem
is actually further back (ie, it never should have been marked for
reloading in the first place). Each of the relavant files is
separated by a line beginning with 20 `-'s. The warning comes from
the 88k backend, because it's confused about seeing a SET of a
SYMBOL_REF. In order to get this through the mailers, this message is
in three parts. Part 1 is the source code, diagnostics log, sample
patch to fix the problem. Part 2 is the xfinal.c.lreg file that has
been compressed (16 bit compress) and then uuencoded. Part 3 is the
xfinal.c.greg file that has been compressed and then uuencoded.
-------------------- Running the compile
-tiktok:emacs-> r=/udd/c/release/gcc-1.34.2-sun/lib
-tiktok:emacs-> $r/gcc88 -B$r/gcc88- -v -dlg -S -ffixed-r24 -O xfinal.c
gcc version 1.34
/udd/c/release/gcc-1.34.2-sun/lib/gcc88-cpp -v -undef -D__GNUC__ -Dm88000 -Dm88k -Dunix -DDGUX -D__m88000__ -D__m88k__ -D__unix__ -D__DGUX__ -D__CHAR_UNSIGNED__ -D__OPTIMIZE__ -Dmemcpy=__builtin_memcpy -Dstrcpy=__builtin_strcpy -Dmemcmp=__builtin_memcmp
-Dstrcmp=__builtin_strcmp xfinal.c /tmp/cca01493.cpp
GNU CPP version 1.34
/udd/c/release/gcc-1.34.2-sun/lib/gcc88-cc1 /tmp/cca01493.cpp -mdelay-slot -fomit-frame-pointer -quiet -dumpbase xfinal.c -dlg -ffixed-r24 -O -version -o xfinal.s
GNU C version 1.34 (88k, Mar 19 1989, 1.34.2) compiled by GNU C version 1.34.
default target switches: -mliteral-synthesis -mocs
xfinal.c: In function final:
xfinal.c:708: warning: CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been
xfinal.c:708: warning: output_ls_address MDEP_LS_LO16 bit set when it shouldn't have been
-------------------- Patch to fix instance of problem
*** reload1.c.orig Tue Mar 21 10:12:10 1989
--- reload1.c Tue Mar 21 10:12:39 1989
***************
*** 1979,1984 ****
--- 1979,1987 ----
old = reload_in[j];
if (old != 0 && ! reload_inherited[j]
+ && GET_CODE (old) != SYMBOL_REF /* quick fix for final.c on */
+ && GET_CODE (old) != LABEL_REF /* 88k, reload tried to put */
+ && GET_CODE (old) != CONST /* reg into symbol_ref. mrm */
&& reload_reg_rtx[j] != old
&& reload_reg_rtx[j] != 0)
{
-------------------- xfinal.c (after preprocessing)
typedef unsigned int size_t;
typedef void * _TYP;
typedef int wchar_t;
typedef struct {
int __va_num;
int *__va_ptr;
} va_list;
typedef struct {
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
int _flag;
int _file;
int _reserve[27];
} FILE;
extern int _filbuf();
extern FILE _iob[64 ];
extern unsigned char *_bufendtab[];
typedef long int fpos_t;
extern FILE *fdopen();
extern FILE *popen();
extern char *ctermid(), *cuserid(), *tempnam();
extern int pclose(), system();
extern int rename (const char *__old, const char *__new) ;
extern int fclose (FILE *__stream) ;
extern int fflush (FILE *__stream) ;
extern FILE *fopen (const char *__filename, const char *__mode) ;
extern FILE *freopen (const char *__filename, const char *__mode,
FILE *__stream) ;
extern void setbuf (FILE *__stream, char *__buf) ;
extern int setvbuf (FILE *__stream, char *__buf, int __mode, size_t __size) ;
extern int fprintf (FILE *__stream, const char *__format, ...) ;
extern int fscanf (FILE *__stream, const char *__format, ...) ;
extern int printf (const char *__format, ...) ;
extern int scanf (const char *__format, ...) ;
extern int sprintf (char *__s, const char *__format, ...) ;
extern int sscanf (const char *__s, const char *__format, ...) ;
extern int vscanf ( const char *__fmt, va_list ) ;
extern int vfprintf ( FILE *__stream, const char *__fmt, va_list ) ;
extern int vfscanf ( FILE *__stream, const char *__fmt, va_list ) ;
extern int vsscanf (const char *__buf, const char *__fmt, va_list) ;
extern vprintf (const char *__format, va_list __arg) ;
extern int vsprintf (char *__s, const char *__format, va_list __arg) ;
extern int fgetc (FILE *__stream) ;
extern int ungetc ( int __ch, FILE *__stream ) ;
extern int putw ( int __n, FILE *__stream ) ;
extern int getw ( FILE *__stream ) ;
extern int fputc (int __c, FILE *__stream) ;
extern int fputs (const char *__s, FILE *__stream) ;
extern char *gets (char *__s) ;
extern char *fgets ( char *__line, int __n, FILE *__stream ) ;
extern int puts (const char *__s) ;
extern size_t fread (_TYP __ptr, size_t __size, size_t __nmemb, FILE *__stream) ;
extern size_t fwrite (const _TYP __ptr, size_t __size, size_t __nmemb, FILE *__stream) ;
extern int fgetpos (FILE *__stream, fpos_t *__pos) ;
extern int fseek (FILE *__stream, long int __offset, int __whence) ;
extern int fsetpos (FILE *__stream, const fpos_t *__pos) ;
extern long int ftell (FILE *__stream) ;
extern void rewind (FILE *__stream) ;
extern int remove (const char *__filename) ;
extern void perror (const char *__s) ;
extern FILE *tmpfile (void) ;
extern char *tmpnam (char *__s) ;
extern int target_flags;
void m88k_options ();
extern char *m88k_tab_align;
extern char *sdbout_scl_str ();
extern char *sdbout_type_str ();
extern int m88k_prologue_done;
extern void m88k_asm_filter_init ();
extern void m88k_silicon_filter ();
extern void m88k_reorder ();
enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
extern int function_arg_p();
extern void m88k_function_prologue();
extern int may_call_alloca;
extern int current_function_pretend_args_size;
extern void m88k_function_epilogue();
extern struct rtx_def * m88k_fix_frame_pointer_address();
void output_ls_address ();
extern char *m88k_function_name;
enum rtx_code {
UNKNOWN ,
NIL ,
EXPR_LIST ,
INSN_LIST ,
MATCH_OPERAND ,
MATCH_DUP ,
MATCH_OPERATOR ,
DEFINE_INSN ,
DEFINE_PEEPHOLE ,
DEFINE_COMBINE ,
DEFINE_EXPAND ,
SEQUENCE ,
ADDRESS ,
INSN ,
JUMP_INSN ,
CALL_INSN ,
BARRIER ,
CODE_LABEL ,
NOTE ,
INLINE_HEADER ,
PARALLEL ,
ASM_INPUT ,
ASM_OPERANDS ,
ADDR_VEC ,
ADDR_DIFF_VEC ,
SET ,
USE ,
CLOBBER ,
CALL ,
RETURN ,
CONST_INT ,
CONST_DOUBLE ,
CONST ,
PC ,
REG ,
SUBREG ,
STRICT_LOW_PART ,
MEM ,
LABEL_REF ,
SYMBOL_REF ,
CC0 ,
QUEUED ,
IF_THEN_ELSE ,
COMPARE ,
PLUS ,
MINUS ,
NEG ,
MULT ,
DIV ,
MOD ,
UMULT ,
UDIV ,
UMOD ,
AND ,
IOR ,
XOR ,
NOT ,
LSHIFT ,
ASHIFT ,
ROTATE ,
ASHIFTRT ,
LSHIFTRT ,
ROTATERT ,
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 ,
LAST_AND_UNUSED_RTX_CODE};
extern int rtx_length[];
extern char *rtx_name[];
extern char *rtx_format[];
enum machine_mode {
VOIDmode,
QImode,
HImode,
SImode,
DImode,
TImode,
QFmode,
HFmode,
SFmode,
DFmode,
TFmode,
CQImode,
CHImode,
CSImode,
CDImode,
CTImode,
CQFmode,
CHFmode,
CSFmode,
CDFmode,
CTFmode,
BImode,
BLKmode,
EPmode,
MAX_MACHINE_MODE };
extern char *mode_name[];
enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT,
MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_FUNCTION };
extern enum mode_class mode_class[];
extern int mode_size[];
extern int mode_unit_size[];
typedef union rtunion_def
{
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_ASM_LINE = 9, REG_ASM_FILE = 10 };
extern rtx rtx_alloc ();
extern rtvec rtvec_alloc ();
extern rtx find_reg_note ();
extern rtx gen_rtx ();
extern rtx copy_rtx ();
extern rtvec gen_rtvec ();
extern rtvec gen_rtvec_v ();
extern rtx gen_reg_rtx ();
extern rtx gen_label_rtx ();
extern rtx gen_inline_header_rtx ();
extern rtx gen_lowpart ();
extern rtx gen_highpart ();
extern int subreg_lowpart_p ();
extern rtx make_safe_from ();
extern rtx memory_address ();
extern rtx get_insns ();
extern rtx get_last_insn ();
extern rtx start_sequence ();
extern rtx gen_sequence ();
extern rtx expand_expr ();
extern rtx output_constant_def ();
extern rtx immed_real_const ();
extern rtx immed_real_const_1 ();
extern rtx immed_double_const ();
extern rtx force_const_double_mem ();
extern rtx force_const_mem ();
extern rtx get_parm_real_loc ();
extern rtx assign_stack_local ();
extern rtx protect_from_queue ();
extern void emit_queue ();
extern rtx emit_move_insn ();
extern rtx emit_insn ();
extern rtx emit_jump_insn ();
extern rtx emit_call_insn ();
extern rtx emit_call_insn_before ();
extern rtx emit_insn_before ();
extern rtx emit_insn_after ();
extern rtx emit_label ();
extern rtx emit_barrier ();
extern rtx emit_note ();
extern rtx emit_line_note ();
extern rtx emit_line_note_force ();
extern rtx prev_real_insn ();
extern rtx next_real_insn ();
extern rtx next_nondeleted_insn ();
extern rtx plus_constant ();
extern rtx find_equiv_reg ();
extern rtx delete_insn ();
extern rtx adj_offsetable_operand ();
extern int max_parallel;
extern int asm_noperands ();
extern char *decode_asm_operands ();
extern enum reg_class reg_preferred_class ();
extern rtx get_first_nonparm_insn ();
extern rtx pc_rtx;
extern rtx cc0_rtx;
extern rtx const0_rtx;
extern rtx const1_rtx;
extern rtx fconst0_rtx;
extern rtx dconst0_rtx;
extern rtx stack_pointer_rtx;
extern rtx frame_pointer_rtx;
extern rtx arg_pointer_rtx;
extern rtx struct_value_rtx;
extern rtx struct_value_incoming_rtx;
extern rtx static_chain_rtx;
extern rtx static_chain_incoming_rtx;
extern int max_regno;
extern short *reg_n_refs;
extern short *reg_n_sets;
extern short *reg_n_deaths;
extern int *reg_n_calls_crossed;
extern int *reg_live_length;
extern short *reg_renumber;
extern char regs_ever_live[32 ];
extern char *reg_names[32 ];
extern short *regno_first_uid;
extern short *regno_last_uid;
extern char *regno_pointer_flag;
extern rtx *regno_reg_rtx;
extern int caller_save_needed;
extern int recog_memoized ();
extern void insn_extract ();
extern rtx recog_operand[];
extern rtx *recog_operand_loc[];
extern rtx *recog_dup_loc[];
extern char recog_dup_num[];
extern char *insn_template[];
extern char *(*insn_outfun[]) ();
extern int insn_n_operands[];
extern int insn_n_dups[];
extern int insn_n_alternatives[];
extern char *insn_operand_constraint[][8 ];
extern char insn_operand_address_p[][8 ];
extern enum machine_mode insn_operand_mode[][8 ];
extern char insn_operand_strict_low[][8 ];
extern int (*insn_operand_predicate[][8 ]) ();
typedef struct {int flags; rtx value1, value2; int mdep;} CC_STATUS;
extern CC_STATUS cc_prev_status;
extern CC_STATUS cc_status;
struct gdbfile
{
struct gdbfile *next;
char *name;
int filenum;
int nlines;
};
extern struct gdbfile *gdbfiles;
extern char *main_input_filename;
enum debugger { NO_DEBUG = 0, GDB_DEBUG = 1, DBX_DEBUG = 2, SDB_DEBUG = 3,
EXTENDED_DBX_DEBUG = 4 };
extern enum debugger write_symbols;
extern int use_gdb_dbx_extensions;
extern int optimize;
extern int obey_regdecls;
extern int quiet_flag;
extern int verbose_flag;
extern int inhibit_warnings;
extern int extra_warnings;
extern int warn_unused;
extern int profile_flag;
extern int profile_block_flag;
extern int pedantic;
extern char *cc1_path_name;
extern int flag_caller_saves;
extern int flag_pcc_struct_return;
extern int flag_force_mem;
extern int flag_force_addr;
extern int flag_defer_pop;
extern int flag_float_store;
extern int flag_combine_regs;
extern int flag_strength_reduce;
extern int flag_writable_strings;
extern int flag_no_function_cse;
extern int flag_omit_frame_pointer;
extern int frame_pointer_needed;
extern int flag_no_peephole;
extern int flag_volatile;
extern int flag_inline_functions;
extern int flag_keep_inline_functions;
extern int flag_syntax_only;
extern int flag_shared_data;
extern double ldexp ();
extern double atof ();
union real_extract
{
double d;
int i[sizeof (double ) / sizeof (int)];
};
void output_asm_insn ();
rtx alter_subreg ();
static int alter_cond ();
void output_asm_label ();
static void output_operand ();
void output_address ();
void output_addr_const ();
static void output_source_line ();
extern int sdb_begin_function_line;
static int last_linenum;
static int count_basic_blocks;
static rtx this_is_asm_operands;
static int insn_noperands;
static char *reg_name[] = {"ap", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"} ;
extern FILE *asm_out_file;
int next_block_index;
struct gdbfile *gdbfiles;
static struct gdbfile *current_gdbfile;
static int next_gdb_filenum;
CC_STATUS cc_status;
CC_STATUS cc_prev_status;
static char *lastfile;
char regs_ever_live[32 ];
int frame_pointer_needed;
int profile_label_no;
static int max_block_depth;
static int *pending_blocks;
static int block_depth;
static int app_on;
void
final (first, file, write_symbols, optimize, prescan)
rtx first;
FILE *file;
enum debugger write_symbols;
int optimize;
int prescan;
{
register rtx insn;
register int i;
rtx last_ignored_compare = 0;
int new_block = 1;
init_recog ();
(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
for (insn = ((first)->fld[2].rtx) ; insn; insn = ((insn)->fld[2].rtx) )
{
switch ( ((insn)->code) )
{
case NOTE:
if (prescan > 0)
break;
if (write_symbols == NO_DEBUG)
break;
if (((insn)->fld[4].rtint) == 0 )
abort ();
if (((insn)->fld[4].rtint) == -4
|| ((insn)->fld[4].rtint) == -5 )
break;
if (((insn)->fld[4].rtint) == -1 )
break;
if (app_on)
{
fprintf (file, "" );
app_on = 0;
}
if (((insn)->fld[4].rtint) == -2 )
{
if (block_depth == max_block_depth)
{
max_block_depth *= 2;
pending_blocks
= (int *) xrealloc (pending_blocks,
max_block_depth * sizeof (int));
}
pending_blocks[block_depth++] = next_block_index;
if (write_symbols == SDB_DEBUG)
sdbout_begin_block (file, last_linenum, next_block_index);
if (write_symbols == GDB_DEBUG)
fprintf (file, "\t.gdbbeg %d\n", next_block_index);
next_block_index++;
}
else if (((insn)->fld[4].rtint) == -3 )
{
--block_depth;
if (write_symbols == SDB_DEBUG && block_depth >= 0)
sdbout_end_block (file, last_linenum);
if (write_symbols == GDB_DEBUG)
fprintf (file, "\t.gdbend %d\n", pending_blocks[block_depth]);
}
else if (((insn)->fld[4].rtint) > 0)
output_source_line (file, insn, write_symbols);
break;
case BARRIER:
break;
case CODE_LABEL:
(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
if (prescan > 0)
break;
new_block = 1;
if (app_on)
{
fprintf (file, "" );
app_on = 0;
}
do { if ( (target_flags & 0x00000200 ) && "L"[0] == 'L' && "L"[1] == '\0' && m88k_function_name != (char *)0) fprintf (file, "@%s%d.%s:\n", "L", ((insn)->fld[3].rtint) , m88k_function_name); else fprintf (file, "@%s%d:\n", "L", ((insn)->fld[3].
rtint) ); } while (0) ;
break;
default:
{
register rtx body = ((insn)->fld[3].rtx) ;
int insn_code_number;
char *template;
if ( ((body)->code) == USE
|| ((body)->code) == CLOBBER)
break;
if (profile_block_flag && new_block)
{
new_block = 0;
do { if ( (target_flags & 0x00000200 ) && "LPB"[0] == 'L' && "LPB"[1] == '\0' && m88k_function_name != (char *)0) fprintf (file, "@%s%d.%s:\n", "LPB", count_basic_blocks, m88k_function_name); else fprintf (file, "@%s%d:\n", "LPB", count_basic_bl
ocks); } while (0) ;
count_basic_blocks++;
}
if ( ((body)->code) == ASM_INPUT)
{
(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
if (prescan > 0)
break;
if (! app_on)
{
fprintf (file, "" );
app_on = 1;
}
fprintf (asm_out_file, "\t%s\n", ((body)->fld[ 0].rtstr) );
break;
}
if (asm_noperands (body) >= 0)
{
int noperands = asm_noperands (body);
rtx *ops;
char *string;
(cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ;
if (prescan > 0)
break;
if (noperands > 0)
ops = (rtx *) xmalloc (noperands * sizeof (rtx));
if (! app_on)
{
fprintf (file, "" );
app_on = 1;
}
string = decode_asm_operands (body, ops, 0, 0, 0);
insn_noperands = noperands;
this_is_asm_operands = insn;
output_asm_insn (string, ops);
this_is_asm_operands = 0;
if (noperands > 0)
free (ops);
break;
}
if (prescan <= 0 && app_on)
{
fprintf (file, "" );
app_on = 0;
}
if ( ((body)->code) == ADDR_VEC)
{
register int vlen, idx;
if (prescan > 0)
break;
vlen = ((body)->fld[ 0].rtvec->num_elem) ;
for (idx = 0; idx < vlen; idx++)
do { char buffer[256]; do { if ( (target_flags & 0x00000200 ) && "L"[0] == 'L' && "L"[1] == '\0' && m88k_function_name != (char *)0) sprintf (buffer, "*@%s%d.%s", "L",
((((((body)->fld[ 0].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name); else sprintf (buffer, "*@%s%d", "L",
((((((body)->fld[ 0].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) ); } while (0) ; fprintf (file, "\tbr%s %s\n", m88k_tab_align, &buffer[1]); } while (0) ;
break;
}
if ( ((body)->code) == ADDR_DIFF_VEC)
{
register int vlen, idx;
if (prescan > 0)
break;
vlen = ((body)->fld[ 1].rtvec->num_elem) ;
for (idx = 0; idx < vlen; idx++)
do { char buf1[256], buf2[256]; do { if ( (target_flags & 0x00000200 ) && "L"[0] == 'L' && "L"[1] == '\0' && m88k_function_name != (char *)0) sprintf (buf1, "*@%s%d.%s", "L",
((((((body)->fld[ 1].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name); else sprintf (buf1, "*@%s%d", "L",
((((((body)->fld[ 1].rtvec->elem[ idx].rtx) )->fld[ 0].rtx) )->fld[3].rtint) ); } while (0) ; do { if ( (target_flags & 0x00000200 ) && "L"[0] == 'L' && "L"[1] == '\0' && m88k_function_name != (char *)0) sprintf (buf2, "*@%s%d.%s", "L",
((((((body)->fld[ 0].rtx) )->fld[ 0].rtx) )->fld[3].rtint) , m88k_function_name); else sprintf (buf2, "*@%s%d", "L",
((((((body)->fld[ 0].rtx) )->fld[ 0].rtx) )->fld[3].rtint) ); } while (0) ; fprintf (file, "\tword%s %s-%s\n", m88k_tab_align, &buf1[1], &buf2[1]); } while (0) ;
break;
}
body = ((insn)->fld[3].rtx) ;
if (optimize
&& ((body)->code) == SET
&& ((((body)->fld[0].rtx) )->code) == CC0)
{
if ( ((((body)->fld[1].rtx) )->code) == SUBREG)
((body)->fld[1].rtx) = alter_subreg (((body)->fld[1].rtx) );
if ((cc_status.value1 != 0
&& rtx_equal_p (((body)->fld[1].rtx) , cc_status.value1))
|| (cc_status.value2 != 0
&& rtx_equal_p (((body)->fld[1].rtx) , cc_status.value2)))
{
if (! find_reg_note (insn, REG_INC, 0)
&& ! volatile_refs_p (((insn)->fld[3].rtx) ))
{
last_ignored_compare = insn;
break;
}
}
}
reinsert_compare:
if ( ((insn)->code) == JUMP_INSN && ((body)->code) == SET
&& ((((body)->fld[1].rtx) )->code) != LABEL_REF)
new_block = 1;
if (cc_status.flags != 0
&& ((insn)->code) == JUMP_INSN
&& ((body)->code) == SET
&& ((body)->fld[0].rtx) == pc_rtx
&& ((((body)->fld[1].rtx) )->code) == IF_THEN_ELSE
&& prescan >= 0)
{
register int result = alter_cond (((((body)->fld[1].rtx) )->fld[ 0].rtx) );
if (result == 1)
((body)->fld[1].rtx) = ((((body)->fld[1].rtx) )->fld[ 1].rtx) ;
if (result == -1)
((body)->fld[1].rtx) = ((((body)->fld[1].rtx) )->fld[ 2].rtx) ;
if (((body)->fld[1].rtx) == pc_rtx)
{
((insn)->code = ( NOTE)) ;
((insn)->fld[4].rtint) = -1 ;
((insn)->fld[3].rtstr) = 0;
break;
}
if (result != 0)
((insn)->fld[4].rtint) = -1;
}
if (cc_status.flags != 0
&& ((body)->code) == SET)
switch ( ((((body)->fld[1].rtx) )->code) )
{
case GTU:
case GT:
case LTU:
case LT:
case GEU:
case GE:
case LEU:
case LE:
case EQ:
case NE:
{
register int result;
if ( ((((((body)->fld[1].rtx) )->fld[ 0].rtx) )->code) != CC0)
break;
result = alter_cond (((body)->fld[1].rtx) );
if (result == 1)
((body)->fld[1].rtx) = gen_rtx (CONST_INT, VOIDmode,
1 );
if (result == -1)
((body)->fld[1].rtx) = const0_rtx;
if (result != 0)
((insn)->fld[4].rtint) = -1;
}
}
if (optimize && !flag_no_peephole)
{
peephole (insn);
body = ((insn)->fld[3].rtx) ;
}
insn_code_number = recog_memoized (insn);
insn_extract (insn);
for (i = 0; i < insn_n_operands[insn_code_number]; i++)
{
if ( ((recog_operand[i])->code) == SUBREG)
recog_operand[i] = alter_subreg (recog_operand[i]);
}
if (! constrain_operands (insn_code_number))
abort ();
cc_prev_status = cc_status;
{ if ( ((body)->code) == SET) { if ( ((((body)->fld[0].rtx) )->code) == CC0) { cc_status.flags = 0; cc_status.value1 = ((body)->fld[0].rtx) ; cc_status.value2 = ((body)->fld[1].rtx) ; } else if ( ((((body)->fld[1].rtx) )->code) == CALL) { (cc_stat
us.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; } else if ( ((((body)->fld[0].rtx) )->code) == R
EG) { if (cc_status.value1 && reg_overlap_mentioned_p (((body)->fld[0].rtx) , cc_status.value1)) cc_status.value1 = 0; if (cc_status.value2 && reg_overlap_mentioned_p (((body)->fld[0].rtx) , cc_status.value2)) cc_status.value2 = 0; } else if ( ((((body)->
fld[0].rtx) )->code) == MEM) { int i = cc_status.mdep & (0x00000001 | 0x00000002 | 0x00000004 ) ; (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set
when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; cc_status.mdep = i; } } else if ( ((body)->code) == PARALLEL && ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->code) == SET) { if ( ((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code
) == CC0) { cc_status.flags = 0; cc_status.value1 = ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) ; cc_status.value2 = ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[1].rtx) ; } else if ( ((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[1].rtx)
)->code) == CALL) { (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; } else if ( ((((((
body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code) == REG) { if (cc_status.value1 && reg_overlap_mentioned_p (((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) , cc_status.value1)) cc_status.value1 = 0; if (cc_status.value2 && reg_overlap_m
entioned_p (((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) , cc_status.value2)) cc_status.value2 = 0; } else if ( ((((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->fld[0].rtx) )->code) == MEM) { int i = cc_status.mdep & (0x00000001 | 0x00000002 | 0x
00000004 ) ; (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ? warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_
status.mdep = 0) ) ; cc_status.mdep = i; } } else if ( ((body)->code) == PARALLEL && ((((body)->fld[ 0].rtvec->elem[ 0].rtx) )->code) == REG) { (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ?
warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; } else if ( ((body)->code) == CALL) { (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, ((((cc_status.mdep & 0x00000002 ) != 0) ?
warning ("CC_STATUS_INIT MDEP_LS_LO16 bit set when it shouldn't have been") : 0), cc_status.mdep = 0) ) ; } } ;
template = insn_template[insn_code_number];
if (template == 0)
{
template = (*insn_outfun[insn_code_number]) (recog_operand, insn);
if (template == 0)
{
if (((insn)->fld[1].rtx) != last_ignored_compare)
abort ();
insn = ((insn)->fld[1].rtx) ;
body = ((insn)->fld[3].rtx) ;
new_block = 0;
goto reinsert_compare;
}
}
if (prescan > 0)
break;
output_asm_insn (template, recog_operand);
((insn)->volatil) = 1;
}
}
}
}