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; } } } }