00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "rtl.h"
00027 #include "tree.h"
00028 #include "regs.h"
00029 #include "hard-reg-set.h"
00030 #include "real.h"
00031 #include "insn-config.h"
00032 #include "conditions.h"
00033 #include "function.h"
00034 #include "output.h"
00035 #include "insn-attr.h"
00036 #include "recog.h"
00037 #include "expr.h"
00038 #include "optabs.h"
00039 #include "flags.h"
00040 #include "debug.h"
00041 #include "toplev.h"
00042 #include "tm_p.h"
00043 #include "target.h"
00044 #include "target-def.h"
00045
00046 static void vax_output_function_prologue (FILE *, HOST_WIDE_INT);
00047 static void vax_file_start (void);
00048 static void vax_init_libfuncs (void);
00049 static void vax_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
00050 HOST_WIDE_INT, tree);
00051 static int vax_address_cost_1 (rtx);
00052 static int vax_address_cost (rtx);
00053 static bool vax_rtx_costs (rtx, int, int, int *);
00054 static rtx vax_struct_value_rtx (tree, int);
00055
00056
00057 #undef TARGET_ASM_ALIGNED_HI_OP
00058 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
00059
00060 #undef TARGET_ASM_FUNCTION_PROLOGUE
00061 #define TARGET_ASM_FUNCTION_PROLOGUE vax_output_function_prologue
00062
00063 #undef TARGET_ASM_FILE_START
00064 #define TARGET_ASM_FILE_START vax_file_start
00065 #undef TARGET_ASM_FILE_START_APP_OFF
00066 #define TARGET_ASM_FILE_START_APP_OFF true
00067
00068 #undef TARGET_INIT_LIBFUNCS
00069 #define TARGET_INIT_LIBFUNCS vax_init_libfuncs
00070
00071 #undef TARGET_ASM_OUTPUT_MI_THUNK
00072 #define TARGET_ASM_OUTPUT_MI_THUNK vax_output_mi_thunk
00073 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
00074 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
00075
00076 #undef TARGET_RTX_COSTS
00077 #define TARGET_RTX_COSTS vax_rtx_costs
00078 #undef TARGET_ADDRESS_COST
00079 #define TARGET_ADDRESS_COST vax_address_cost
00080
00081 #undef TARGET_PROMOTE_PROTOTYPES
00082 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
00083
00084 #undef TARGET_STRUCT_VALUE_RTX
00085 #define TARGET_STRUCT_VALUE_RTX vax_struct_value_rtx
00086
00087 struct gcc_target targetm = TARGET_INITIALIZER;
00088
00089
00090
00091 void
00092 override_options (void)
00093 {
00094
00095 if (TARGET_G_FLOAT)
00096 REAL_MODE_FORMAT (DFmode) = &vax_g_format;
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 static void
00109 vax_output_function_prologue (FILE * file, HOST_WIDE_INT size)
00110 {
00111 register int regno;
00112 register int mask = 0;
00113
00114 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
00115 if (regs_ever_live[regno] && !call_used_regs[regno])
00116 mask |= 1 << regno;
00117
00118 fprintf (file, "\t.word 0x%x\n", mask);
00119
00120 if (dwarf2out_do_frame ())
00121 {
00122 const char *label = dwarf2out_cfi_label ();
00123 int offset = 0;
00124
00125 for (regno = FIRST_PSEUDO_REGISTER-1; regno >= 0; --regno)
00126 if (regs_ever_live[regno] && !call_used_regs[regno])
00127 dwarf2out_reg_save (label, regno, offset -= 4);
00128
00129 dwarf2out_reg_save (label, PC_REGNUM, offset -= 4);
00130 dwarf2out_reg_save (label, FRAME_POINTER_REGNUM, offset -= 4);
00131 dwarf2out_reg_save (label, ARG_POINTER_REGNUM, offset -= 4);
00132 dwarf2out_def_cfa (label, FRAME_POINTER_REGNUM, -(offset - 4));
00133 }
00134
00135 size -= STARTING_FRAME_OFFSET;
00136 if (size >= 64)
00137 asm_fprintf (file, "\tmovab %wd(%Rsp),%Rsp\n", -size);
00138 else if (size)
00139 asm_fprintf (file, "\tsubl2 $%wd,%Rsp\n", size);
00140 }
00141
00142
00143
00144
00145 static void
00146 vax_file_start (void)
00147 {
00148 default_file_start ();
00149
00150 if (write_symbols == DBX_DEBUG)
00151 fprintf (asm_out_file, "___vax_%c_doubles:\n", ASM_DOUBLE_CHAR);
00152 }
00153
00154
00155
00156
00157
00158 static void
00159 vax_init_libfuncs (void)
00160 {
00161 set_optab_libfunc (udiv_optab, SImode, TARGET_ELF ? "*__udiv" : "*udiv");
00162 set_optab_libfunc (umod_optab, SImode, TARGET_ELF ? "*__urem" : "*urem");
00163 }
00164
00165
00166
00167 void
00168 split_quadword_operands (rtx * operands, rtx * low, int n ATTRIBUTE_UNUSED)
00169 {
00170 int i;
00171
00172
00173 low[0] = low[1] = low[2] = 0;
00174 for (i = 0; i < 3; i++)
00175 {
00176 if (low[i])
00177 ;
00178 else if (GET_CODE (operands[i]) == MEM
00179 && (GET_CODE (XEXP (operands[i], 0)) == POST_INC))
00180 {
00181 rtx addr = XEXP (operands[i], 0);
00182 operands[i] = low[i] = gen_rtx_MEM (SImode, addr);
00183 if (which_alternative == 0 && i == 0)
00184 {
00185 addr = XEXP (operands[i], 0);
00186 operands[i+1] = low[i+1] = gen_rtx_MEM (SImode, addr);
00187 }
00188 }
00189 else
00190 {
00191 low[i] = operand_subword (operands[i], 0, 0, DImode);
00192 operands[i] = operand_subword (operands[i], 1, 0, DImode);
00193 }
00194 }
00195 }
00196
00197 void
00198 print_operand_address (FILE * file, register rtx addr)
00199 {
00200 register rtx reg1, breg, ireg;
00201 rtx offset;
00202
00203 retry:
00204 switch (GET_CODE (addr))
00205 {
00206 case MEM:
00207 fprintf (file, "*");
00208 addr = XEXP (addr, 0);
00209 goto retry;
00210
00211 case REG:
00212 fprintf (file, "(%s)", reg_names[REGNO (addr)]);
00213 break;
00214
00215 case PRE_DEC:
00216 fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
00217 break;
00218
00219 case POST_INC:
00220 fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
00221 break;
00222
00223 case PLUS:
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 reg1 = 0; ireg = 0; breg = 0; offset = 0;
00234
00235 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
00236 || GET_CODE (XEXP (addr, 0)) == MEM)
00237 {
00238 offset = XEXP (addr, 0);
00239 addr = XEXP (addr, 1);
00240 }
00241 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
00242 || GET_CODE (XEXP (addr, 1)) == MEM)
00243 {
00244 offset = XEXP (addr, 1);
00245 addr = XEXP (addr, 0);
00246 }
00247 else if (GET_CODE (XEXP (addr, 1)) == MULT)
00248 {
00249 ireg = XEXP (addr, 1);
00250 addr = XEXP (addr, 0);
00251 }
00252 else if (GET_CODE (XEXP (addr, 0)) == MULT)
00253 {
00254 ireg = XEXP (addr, 0);
00255 addr = XEXP (addr, 1);
00256 }
00257 else if (GET_CODE (XEXP (addr, 1)) == REG)
00258 {
00259 reg1 = XEXP (addr, 1);
00260 addr = XEXP (addr, 0);
00261 }
00262 else if (GET_CODE (XEXP (addr, 0)) == REG)
00263 {
00264 reg1 = XEXP (addr, 0);
00265 addr = XEXP (addr, 1);
00266 }
00267 else
00268 abort ();
00269
00270 if (GET_CODE (addr) == REG)
00271 {
00272 if (reg1)
00273 ireg = addr;
00274 else
00275 reg1 = addr;
00276 }
00277 else if (GET_CODE (addr) == MULT)
00278 ireg = addr;
00279 else if (GET_CODE (addr) == PLUS)
00280 {
00281 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
00282 || GET_CODE (XEXP (addr, 0)) == MEM)
00283 {
00284 if (offset)
00285 {
00286 if (GET_CODE (offset) == CONST_INT)
00287 offset = plus_constant (XEXP (addr, 0), INTVAL (offset));
00288 else if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
00289 offset = plus_constant (offset, INTVAL (XEXP (addr, 0)));
00290 else
00291 abort ();
00292 }
00293 offset = XEXP (addr, 0);
00294 }
00295 else if (GET_CODE (XEXP (addr, 0)) == REG)
00296 {
00297 if (reg1)
00298 ireg = reg1, breg = XEXP (addr, 0), reg1 = 0;
00299 else
00300 reg1 = XEXP (addr, 0);
00301 }
00302 else if (GET_CODE (XEXP (addr, 0)) == MULT)
00303 {
00304 if (ireg)
00305 abort ();
00306 ireg = XEXP (addr, 0);
00307 }
00308 else
00309 abort ();
00310
00311 if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
00312 || GET_CODE (XEXP (addr, 1)) == MEM)
00313 {
00314 if (offset)
00315 {
00316 if (GET_CODE (offset) == CONST_INT)
00317 offset = plus_constant (XEXP (addr, 1), INTVAL (offset));
00318 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
00319 offset = plus_constant (offset, INTVAL (XEXP (addr, 1)));
00320 else
00321 abort ();
00322 }
00323 offset = XEXP (addr, 1);
00324 }
00325 else if (GET_CODE (XEXP (addr, 1)) == REG)
00326 {
00327 if (reg1)
00328 ireg = reg1, breg = XEXP (addr, 1), reg1 = 0;
00329 else
00330 reg1 = XEXP (addr, 1);
00331 }
00332 else if (GET_CODE (XEXP (addr, 1)) == MULT)
00333 {
00334 if (ireg)
00335 abort ();
00336 ireg = XEXP (addr, 1);
00337 }
00338 else
00339 abort ();
00340 }
00341 else
00342 abort ();
00343
00344
00345 if (reg1)
00346 {
00347 if (breg != 0 || (offset && GET_CODE (offset) == MEM))
00348 {
00349 if (ireg)
00350 abort ();
00351 ireg = reg1;
00352 }
00353 else
00354 breg = reg1;
00355 }
00356
00357 if (offset != 0)
00358 output_address (offset);
00359
00360 if (breg != 0)
00361 fprintf (file, "(%s)", reg_names[REGNO (breg)]);
00362
00363 if (ireg != 0)
00364 {
00365 if (GET_CODE (ireg) == MULT)
00366 ireg = XEXP (ireg, 0);
00367 if (GET_CODE (ireg) != REG)
00368 abort ();
00369 fprintf (file, "[%s]", reg_names[REGNO (ireg)]);
00370 }
00371 break;
00372
00373 default:
00374 output_addr_const (file, addr);
00375 }
00376 }
00377
00378 const char *
00379 rev_cond_name (rtx op)
00380 {
00381 switch (GET_CODE (op))
00382 {
00383 case EQ:
00384 return "neq";
00385 case NE:
00386 return "eql";
00387 case LT:
00388 return "geq";
00389 case LE:
00390 return "gtr";
00391 case GT:
00392 return "leq";
00393 case GE:
00394 return "lss";
00395 case LTU:
00396 return "gequ";
00397 case LEU:
00398 return "gtru";
00399 case GTU:
00400 return "lequ";
00401 case GEU:
00402 return "lssu";
00403
00404 default:
00405 abort ();
00406 }
00407 }
00408
00409 int
00410 vax_float_literal(register rtx c)
00411 {
00412 register enum machine_mode mode;
00413 REAL_VALUE_TYPE r, s;
00414 int i;
00415
00416 if (GET_CODE (c) != CONST_DOUBLE)
00417 return 0;
00418
00419 mode = GET_MODE (c);
00420
00421 if (c == const_tiny_rtx[(int) mode][0]
00422 || c == const_tiny_rtx[(int) mode][1]
00423 || c == const_tiny_rtx[(int) mode][2])
00424 return 1;
00425
00426 REAL_VALUE_FROM_CONST_DOUBLE (r, c);
00427
00428 for (i = 0; i < 7; i++)
00429 {
00430 int x = 1 << i;
00431 REAL_VALUE_FROM_INT (s, x, 0, mode);
00432
00433 if (REAL_VALUES_EQUAL (r, s))
00434 return 1;
00435 if (!exact_real_inverse (mode, &s))
00436 abort ();
00437 if (REAL_VALUES_EQUAL (r, s))
00438 return 1;
00439 }
00440 return 0;
00441 }
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455 static int
00456 vax_address_cost_1 (register rtx addr)
00457 {
00458 int reg = 0, indexed = 0, indir = 0, offset = 0, predec = 0;
00459 rtx plus_op0 = 0, plus_op1 = 0;
00460 restart:
00461 switch (GET_CODE (addr))
00462 {
00463 case PRE_DEC:
00464 predec = 1;
00465 case REG:
00466 case SUBREG:
00467 case POST_INC:
00468 reg = 1;
00469 break;
00470 case MULT:
00471 indexed = 1;
00472 break;
00473 case CONST_INT:
00474
00475 if (offset == 0)
00476 offset = (unsigned HOST_WIDE_INT)(INTVAL(addr)+128) > 256;
00477 break;
00478 case CONST:
00479 case SYMBOL_REF:
00480 offset = 1;
00481 break;
00482 case LABEL_REF:
00483 if (offset == 0)
00484 offset = 1;
00485 break;
00486 case PLUS:
00487 if (plus_op0)
00488 plus_op1 = XEXP (addr, 0);
00489 else
00490 plus_op0 = XEXP (addr, 0);
00491 addr = XEXP (addr, 1);
00492 goto restart;
00493 case MEM:
00494 indir = 2;
00495 addr = XEXP (addr, 0);
00496 goto restart;
00497 default:
00498 break;
00499 }
00500
00501
00502
00503
00504 if (plus_op0)
00505 {
00506 addr = plus_op0;
00507 plus_op0 = 0;
00508 goto restart;
00509 }
00510 if (plus_op1)
00511 {
00512 addr = plus_op1;
00513 plus_op1 = 0;
00514 goto restart;
00515 }
00516
00517
00518 if (reg && indexed && offset)
00519 return reg + indir + offset + predec;
00520 return reg + indexed + indir + offset + predec;
00521 }
00522
00523 static int
00524 vax_address_cost (rtx x)
00525 {
00526 return (1 + (GET_CODE (x) == REG ? 0 : vax_address_cost_1 (x)));
00527 }
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537 static bool
00538 vax_rtx_costs (rtx x, int code, int outer_code, int *total)
00539 {
00540 enum machine_mode mode = GET_MODE (x);
00541 int i = 0;
00542 const char *fmt = GET_RTX_FORMAT (code);
00543
00544 switch (code)
00545 {
00546
00547
00548
00549
00550
00551 case CONST_INT:
00552 if (INTVAL (x) == 0)
00553 return true;
00554 if (outer_code == AND)
00555 {
00556 *total = ((unsigned HOST_WIDE_INT) ~INTVAL (x) <= 077) ? 1 : 2;
00557 return true;
00558 }
00559 if ((unsigned HOST_WIDE_INT) INTVAL (x) <= 077
00560 || (outer_code == COMPARE
00561 && INTVAL (x) == -1)
00562 || ((outer_code == PLUS || outer_code == MINUS)
00563 && (unsigned HOST_WIDE_INT) -INTVAL (x) <= 077))
00564 {
00565 *total = 1;
00566 return true;
00567 }
00568
00569
00570 case CONST:
00571 case LABEL_REF:
00572 case SYMBOL_REF:
00573 *total = 3;
00574 return true;
00575
00576 case CONST_DOUBLE:
00577 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
00578 *total = vax_float_literal (x) ? 5 : 8;
00579 else
00580 *total = ((CONST_DOUBLE_HIGH (x) == 0
00581 && (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x) < 64)
00582 || (outer_code == PLUS
00583 && CONST_DOUBLE_HIGH (x) == -1
00584 && (unsigned HOST_WIDE_INT)-CONST_DOUBLE_LOW (x) < 64))
00585 ? 2 : 5;
00586 return true;
00587
00588 case POST_INC:
00589 *total = 2;
00590 return true;
00591
00592 case PRE_DEC:
00593 *total = 3;
00594 return true;
00595
00596 case MULT:
00597 switch (mode)
00598 {
00599 case DFmode:
00600 *total = 16;
00601 break;
00602 case SFmode:
00603 *total = 9;
00604 break;
00605 case DImode:
00606 *total = 16;
00607 break;
00608 case SImode:
00609 case HImode:
00610 case QImode:
00611 *total = 10;
00612 break;
00613 default:
00614 *total = MAX_COST;
00615 return true;
00616 }
00617 break;
00618
00619 case UDIV:
00620 if (mode != SImode)
00621 {
00622 *total = MAX_COST;
00623 return true;
00624 }
00625 *total = 17;
00626 break;
00627
00628 case DIV:
00629 if (mode == DImode)
00630 *total = 30;
00631 else if (mode == DFmode)
00632
00633 *total = 24;
00634 else
00635 *total = 11;
00636 break;
00637
00638 case MOD:
00639 *total = 23;
00640 break;
00641
00642 case UMOD:
00643 if (mode != SImode)
00644 {
00645 *total = MAX_COST;
00646 return true;
00647 }
00648 *total = 29;
00649 break;
00650
00651 case FLOAT:
00652 *total = (6
00653 + (mode == DFmode) + (GET_MODE (XEXP (x, 0)) != SImode));
00654 break;
00655
00656 case FIX:
00657 *total = 7;
00658 break;
00659
00660 case ASHIFT:
00661 case LSHIFTRT:
00662 case ASHIFTRT:
00663 if (mode == DImode)
00664 *total = 12;
00665 else
00666 *total = 10;
00667 break;
00668
00669 case ROTATE:
00670 case ROTATERT:
00671 *total = 6;
00672 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
00673 fmt = "e";
00674 break;
00675
00676 case PLUS:
00677 case MINUS:
00678 *total = (mode == DFmode) ? 13 : 8;
00679
00680 if ((GET_CODE (XEXP (x, 1)) == CONST_INT)
00681 && (unsigned HOST_WIDE_INT)(INTVAL (XEXP (x, 1)) + 63) < 127)
00682 fmt = "e";
00683 break;
00684
00685 case IOR:
00686 case XOR:
00687 *total = 3;
00688 break;
00689
00690 case AND:
00691
00692 *total = 3;
00693 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
00694 {
00695 if ((unsigned HOST_WIDE_INT)~INTVAL (XEXP (x, 0)) > 63)
00696 *total = 4;
00697 fmt = "e";
00698 i = 1;
00699 }
00700 break;
00701
00702 case NEG:
00703 if (mode == DFmode)
00704 *total = 9;
00705 else if (mode == SFmode)
00706 *total = 6;
00707 else if (mode == DImode)
00708 *total = 4;
00709 else
00710 *total = 2;
00711 break;
00712
00713 case NOT:
00714 *total = 2;
00715 break;
00716
00717 case ZERO_EXTRACT:
00718 case SIGN_EXTRACT:
00719 *total = 15;
00720 break;
00721
00722 case MEM:
00723 if (mode == DImode || mode == DFmode)
00724 *total = 5;
00725 else
00726 *total = 3;
00727 x = XEXP (x, 0);
00728 if (GET_CODE (x) != REG && GET_CODE (x) != POST_INC)
00729 *total += vax_address_cost_1 (x);
00730 return true;
00731
00732 case FLOAT_EXTEND:
00733 case FLOAT_TRUNCATE:
00734 case TRUNCATE:
00735 *total = 3;
00736 break;
00737
00738 default:
00739 return false;
00740 }
00741
00742
00743
00744
00745
00746
00747
00748 while (*fmt++ == 'e')
00749 {
00750 rtx op = XEXP (x, i);
00751
00752 i += 1;
00753 code = GET_CODE (op);
00754
00755
00756
00757
00758 if (code == NOT)
00759 op = XEXP (op, 0), code = GET_CODE (op);
00760
00761 switch (code)
00762 {
00763 case CONST_INT:
00764 if ((unsigned HOST_WIDE_INT)INTVAL (op) > 63
00765 && GET_MODE (x) != QImode)
00766 *total += 1;
00767 break;
00768 case CONST:
00769 case LABEL_REF:
00770 case SYMBOL_REF:
00771 *total += 1;
00772 break;
00773 case CONST_DOUBLE:
00774 if (GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT)
00775 {
00776
00777
00778 if (vax_float_literal (op))
00779 *total += 1;
00780 else
00781 *total += (GET_MODE (x) == DFmode) ? 3 : 2;
00782 }
00783 else
00784 {
00785 if (CONST_DOUBLE_HIGH (op) != 0
00786 || (unsigned)CONST_DOUBLE_LOW (op) > 63)
00787 *total += 2;
00788 }
00789 break;
00790 case MEM:
00791 *total += 1;
00792 if (GET_CODE (XEXP (op, 0)) != REG)
00793 *total += vax_address_cost_1 (XEXP (op, 0));
00794 break;
00795 case REG:
00796 case SUBREG:
00797 break;
00798 default:
00799 *total += 1;
00800 break;
00801 }
00802 }
00803 return true;
00804 }
00805
00806
00807
00808
00809
00810
00811
00812
00813 static void
00814 vax_output_mi_thunk (FILE * file,
00815 tree thunk ATTRIBUTE_UNUSED,
00816 HOST_WIDE_INT delta,
00817 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
00818 tree function)
00819 {
00820 fprintf (file, "\t.word 0x0ffc\n\taddl2 $" HOST_WIDE_INT_PRINT_DEC, delta);
00821 asm_fprintf (file, ",4(%Rap)\n");
00822 fprintf (file, "\tjmp ");
00823 assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
00824 fprintf (file, "+2\n");
00825 }
00826
00827 static rtx
00828 vax_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
00829 int incoming ATTRIBUTE_UNUSED)
00830 {
00831 return gen_rtx_REG (Pmode, VAX_STRUCT_VALUE_REGNUM);
00832 }
00833
00834
00835
00836 void
00837 vax_notice_update_cc (rtx exp, rtx insn ATTRIBUTE_UNUSED)
00838 {
00839 if (GET_CODE (exp) == SET)
00840 {
00841 if (GET_CODE (SET_SRC (exp)) == CALL)
00842 CC_STATUS_INIT;
00843 else if (GET_CODE (SET_DEST (exp)) != ZERO_EXTRACT
00844 && GET_CODE (SET_DEST (exp)) != PC)
00845 {
00846 cc_status.flags = 0;
00847
00848
00849
00850
00851
00852
00853 switch (GET_CODE (SET_SRC (exp)))
00854 {
00855 case NEG:
00856 if (GET_MODE_CLASS (GET_MODE (exp)) == MODE_FLOAT)
00857 break;
00858 case AND:
00859 case IOR:
00860 case XOR:
00861 case NOT:
00862 case MEM:
00863 case REG:
00864 cc_status.flags = CC_NO_OVERFLOW;
00865 break;
00866 default:
00867 break;
00868 }
00869 cc_status.value1 = SET_DEST (exp);
00870 cc_status.value2 = SET_SRC (exp);
00871 }
00872 }
00873 else if (GET_CODE (exp) == PARALLEL
00874 && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
00875 {
00876 if (GET_CODE (SET_SRC (XVECEXP (exp, 0, 0))) == CALL)
00877 CC_STATUS_INIT;
00878 else if (GET_CODE (SET_DEST (XVECEXP (exp, 0, 0))) != PC)
00879 {
00880 cc_status.flags = 0;
00881 cc_status.value1 = SET_DEST (XVECEXP (exp, 0, 0));
00882 cc_status.value2 = SET_SRC (XVECEXP (exp, 0, 0));
00883 }
00884 else
00885
00886
00887 CC_STATUS_INIT;
00888 }
00889 else
00890 CC_STATUS_INIT;
00891 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
00892 && cc_status.value2
00893 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
00894 cc_status.value2 = 0;
00895 if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM
00896 && cc_status.value2
00897 && GET_CODE (cc_status.value2) == MEM)
00898 cc_status.value2 = 0;
00899
00900
00901 }