|
|
1.1 root 1: /* Subroutines used for code generation on IBM RS/6000. 1.1.1.4 root 2: Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. 1.1.1.3 root 3: Contributed by Richard Kenner ([email protected]) 1.1 root 4: 5: This file is part of GNU CC. 6: 7: GNU CC is free software; you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation; either version 2, or (at your option) 10: any later version. 11: 12: GNU CC is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with GNU CC; see the file COPYING. If not, write to 1.1.1.4 root 19: the Free Software Foundation, 59 Temple Place - Suite 330, 20: Boston, MA 02111-1307, USA. */ 1.1 root 21: 22: #include <stdio.h> 1.1.1.3 root 23: #include <ctype.h> 1.1 root 24: #include "config.h" 25: #include "rtl.h" 26: #include "regs.h" 27: #include "hard-reg-set.h" 28: #include "real.h" 29: #include "insn-config.h" 30: #include "conditions.h" 31: #include "insn-flags.h" 32: #include "output.h" 33: #include "insn-attr.h" 34: #include "flags.h" 35: #include "recog.h" 36: #include "expr.h" 37: #include "obstack.h" 38: #include "tree.h" 39: 40: extern char *language_string; 1.1.1.2 root 41: extern int profile_block_flag; 1.1 root 42: 43: #define min(A,B) ((A) < (B) ? (A) : (B)) 44: #define max(A,B) ((A) > (B) ? (A) : (B)) 45: 1.1.1.2 root 46: /* Target cpu type */ 47: 48: enum processor_type rs6000_cpu; 49: char *rs6000_cpu_string; 50: 1.1 root 51: /* Set to non-zero by "fix" operation to indicate that itrunc and 52: uitrunc must be defined. */ 53: 54: int rs6000_trunc_used; 55: 56: /* Set to non-zero once they have been defined. */ 57: 58: static int trunc_defined; 59: 1.1.1.3 root 60: /* Set to non-zero once AIX common-mode calls have been defined. */ 61: static int common_mode_defined; 1.1 root 62: /* Save information from a "cmpxx" operation until the branch or scc is 63: emitted. */ 64: 65: rtx rs6000_compare_op0, rs6000_compare_op1; 66: int rs6000_compare_fp_p; 1.1.1.4 root 67: 68: #ifdef USING_SVR4_H 69: /* Label number of label created for -mrelocatable, to call to so we can 70: get the address of the GOT section */ 71: int rs6000_pic_labelno; 72: #endif 73: 74: /* Whether a System V.4 varargs area was created. */ 75: int rs6000_sysv_varargs_p; 76: 77: /* Temporary memory used to convert integer -> float */ 78: static rtx stack_temps[NUM_MACHINE_MODES]; 79: 80: 81: /* Print the options used in the assembly file. */ 82: 83: extern char *version_string, *language_string; 84: 85: struct asm_option 86: { 87: char *string; 88: int *variable; 89: int on_value; 90: }; 91: 92: #define MAX_LINE 79 93: 94: static int 95: output_option (file, type, name, pos) 96: FILE *file; 97: char *type; 98: char *name; 99: int pos; 100: { 101: int type_len = strlen (type); 102: int name_len = strlen (name); 103: 104: if (1 + type_len + name_len + pos > MAX_LINE) 105: { 106: fprintf (file, "\n # %s%s", type, name); 107: return 3 + type_len + name_len; 108: } 109: fprintf (file, " %s%s", type, name); 110: return pos + 1 + type_len + name_len; 111: } 112: 113: static struct { char *name; int value; } m_options[] = TARGET_SWITCHES; 114: 115: void 116: output_options (file, f_options, f_len, W_options, W_len) 117: FILE *file; 118: struct asm_option *f_options; 119: int f_len; 120: struct asm_option *W_options; 121: int W_len; 122: { 123: int j; 124: int flags = target_flags; 125: int pos = 32767; 126: 127: fprintf (file, " # %s %s", language_string, version_string); 128: 129: if (optimize) 130: { 131: char opt_string[20]; 132: sprintf (opt_string, "%d", optimize); 133: pos = output_option (file, "-O", opt_string, pos); 134: } 135: 136: if (profile_flag) 137: pos = output_option (file, "-p", "", pos); 138: 139: if (profile_block_flag) 140: pos = output_option (file, "-a", "", pos); 141: 142: if (inhibit_warnings) 143: pos = output_option (file, "-w", "", pos); 144: 145: for (j = 0; j < f_len; j++) 146: { 147: if (*f_options[j].variable == f_options[j].on_value) 148: pos = output_option (file, "-f", f_options[j].string, pos); 149: } 150: 151: for (j = 0; j < W_len; j++) 152: { 153: if (*W_options[j].variable == W_options[j].on_value) 154: pos = output_option (file, "-W", W_options[j].string, pos); 155: } 156: 157: for (j = 0; j < sizeof m_options / sizeof m_options[0]; j++) 158: { 159: if (m_options[j].name[0] != '\0' 160: && m_options[j].value > 0 161: && ((m_options[j].value & flags) == m_options[j].value)) 162: { 163: pos = output_option (file, "-m", m_options[j].name, pos); 164: flags &= ~ m_options[j].value; 165: } 166: } 167: 168: if (rs6000_cpu_string != (char *)0) 169: pos = output_option (file, "-mcpu=", rs6000_cpu_string, pos); 170: 171: fputs ("\n\n", file); 172: } 173: 1.1 root 174: 1.1.1.2 root 175: /* Override command line options. Mostly we process the processor 176: type and sometimes adjust other TARGET_ options. */ 177: 178: void 179: rs6000_override_options () 180: { 181: int i; 182: 183: /* Simplify the entries below by making a mask for any POWER 184: variant and any PowerPC variant. */ 185: 1.1.1.4 root 186: #define POWER_MASKS (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING) 1.1.1.3 root 187: #define POWERPC_MASKS (MASK_POWERPC | MASK_PPC_GPOPT \ 188: | MASK_PPC_GFXOPT | MASK_POWERPC64) 189: #define POWERPC_OPT_MASKS (MASK_PPC_GPOPT | MASK_PPC_GFXOPT) 1.1.1.2 root 190: 191: static struct ptt 192: { 193: char *name; /* Canonical processor name. */ 194: enum processor_type processor; /* Processor type enum value. */ 195: int target_enable; /* Target flags to enable. */ 196: int target_disable; /* Target flags to disable. */ 197: } processor_target_table[] 1.1.1.3 root 198: = {{"common", PROCESSOR_COMMON, 0, POWER_MASKS | POWERPC_MASKS}, 199: {"power", PROCESSOR_POWER, 1.1.1.4 root 200: MASK_POWER | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 201: MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS}, 202: {"powerpc", PROCESSOR_POWERPC, 203: MASK_POWERPC | MASK_NEW_MNEMONICS, 204: POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64}, 205: {"rios", PROCESSOR_RIOS1, 1.1.1.4 root 206: MASK_POWER | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 207: MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS}, 208: {"rios1", PROCESSOR_RIOS1, 1.1.1.4 root 209: MASK_POWER | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 210: MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS}, 211: {"rsc", PROCESSOR_PPC601, 1.1.1.4 root 212: MASK_POWER | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 213: MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS}, 214: {"rsc1", PROCESSOR_PPC601, 1.1.1.4 root 215: MASK_POWER | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 216: MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS}, 217: {"rios2", PROCESSOR_RIOS2, 1.1.1.4 root 218: MASK_POWER | MASK_MULTIPLE | MASK_STRING | MASK_POWER2, 1.1.1.3 root 219: POWERPC_MASKS | MASK_NEW_MNEMONICS}, 1.1.1.4 root 220: {"403", PROCESSOR_PPC403, 221: MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS, 222: POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64}, 1.1.1.2 root 223: {"601", PROCESSOR_PPC601, 1.1.1.4 root 224: MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_MULTIPLE | MASK_STRING, 1.1.1.3 root 225: MASK_POWER2 | POWERPC_OPT_MASKS | MASK_POWERPC64}, 1.1.1.2 root 226: {"603", PROCESSOR_PPC603, 1.1.1.3 root 227: MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS, 228: POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64}, 1.1.1.2 root 229: {"604", PROCESSOR_PPC604, 1.1.1.3 root 230: MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS, 1.1.1.4 root 231: POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64}}; 1.1.1.2 root 232: 233: int ptt_size = sizeof (processor_target_table) / sizeof (struct ptt); 234: 1.1.1.4 root 235: int multiple = TARGET_MULTIPLE; /* save current -mmultiple/-mno-multiple status */ 236: int string = TARGET_STRING; /* save current -mstring/-mno-string status */ 237: 1.1.1.2 root 238: profile_block_flag = 0; 239: 240: /* Identify the processor type */ 241: if (rs6000_cpu_string == 0) 242: rs6000_cpu = PROCESSOR_DEFAULT; 243: else 244: { 245: for (i = 0; i < ptt_size; i++) 246: if (! strcmp (rs6000_cpu_string, processor_target_table[i].name)) 247: { 248: rs6000_cpu = processor_target_table[i].processor; 249: target_flags |= processor_target_table[i].target_enable; 250: target_flags &= ~processor_target_table[i].target_disable; 251: break; 252: } 253: 254: if (i == ptt_size) 255: { 256: error ("bad value (%s) for -mcpu= switch", rs6000_cpu_string); 257: rs6000_cpu_string = "default"; 258: rs6000_cpu = PROCESSOR_DEFAULT; 259: } 260: } 1.1.1.4 root 261: 262: /* If -mmultiple or -mno-multiple was explicitly used, don't 263: override with the processor default */ 264: if (TARGET_MULTIPLE_SET) 265: target_flags = (target_flags & ~MASK_MULTIPLE) | multiple; 266: 267: /* If -mstring or -mno-string was explicitly used, don't 268: override with the processor default */ 269: if (TARGET_STRING_SET) 270: target_flags = (target_flags & ~MASK_STRING) | string; 271: 272: /* Don't allow -mmultiple or -mstring on little endian systems, because the 273: hardware doesn't support the instructions used in little endian mode */ 274: if (!BYTES_BIG_ENDIAN) 275: { 276: if (TARGET_MULTIPLE) 277: { 278: target_flags &= ~MASK_MULTIPLE; 279: if (TARGET_MULTIPLE_SET) 280: warning ("-mmultiple is not supported on little endian systems"); 281: } 282: 283: if (TARGET_STRING) 284: { 285: target_flags &= ~MASK_STRING; 286: if (TARGET_STRING_SET) 287: warning ("-mstring is not supported on little endian systems"); 288: } 289: } 290: 291: #ifdef SUBTARGET_OVERRIDE_OPTIONS 292: SUBTARGET_OVERRIDE_OPTIONS; 293: #endif 294: } 295: 296: /* Create a CONST_DOUBLE from a string. */ 297: 298: struct rtx_def * 299: rs6000_float_const (string, mode) 300: char *string; 301: enum machine_mode mode; 302: { 303: REAL_VALUE_TYPE value = REAL_VALUE_ATOF (string, mode); 304: return immed_real_const_1 (value, mode); 1.1.1.2 root 305: } 1.1.1.4 root 306: 307: 308: /* Create a CONST_DOUBLE like immed_double_const, except reverse the 309: two parts of the constant if the target is little endian. */ 310: 311: struct rtx_def * 312: rs6000_immed_double_const (i0, i1, mode) 313: HOST_WIDE_INT i0, i1; 314: enum machine_mode mode; 315: { 316: if (! WORDS_BIG_ENDIAN) 317: return immed_double_const (i1, i0, mode); 318: 319: return immed_double_const (i0, i1, mode); 320: } 321: 1.1.1.2 root 322: 1.1 root 323: /* Return non-zero if this function is known to have a null epilogue. */ 324: 325: int 326: direct_return () 327: { 1.1.1.4 root 328: if (reload_completed) 329: { 330: rs6000_stack_t *info = rs6000_stack_info (); 331: 332: if (info->first_gp_reg_save == 32 333: && info->first_fp_reg_save == 64 334: && !info->lr_save_p 335: && !info->cr_save_p 336: && !info->push_p) 337: return 1; 338: } 339: 340: return 0; 1.1 root 341: } 342: 343: /* Returns 1 always. */ 344: 345: int 346: any_operand (op, mode) 347: register rtx op; 348: enum machine_mode mode; 349: { 350: return 1; 351: } 352: 353: /* Return 1 if OP is a constant that can fit in a D field. */ 354: 355: int 356: short_cint_operand (op, mode) 357: register rtx op; 358: enum machine_mode mode; 359: { 360: return (GET_CODE (op) == CONST_INT 361: && (unsigned) (INTVAL (op) + 0x8000) < 0x10000); 362: } 363: 364: /* Similar for a unsigned D field. */ 365: 366: int 367: u_short_cint_operand (op, mode) 368: register rtx op; 369: enum machine_mode mode; 370: { 371: return (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff0000) == 0); 372: } 373: 374: /* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */ 375: 376: int 377: non_short_cint_operand (op, mode) 378: register rtx op; 379: enum machine_mode mode; 380: { 381: return (GET_CODE (op) == CONST_INT 382: && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000); 383: } 384: 385: /* Returns 1 if OP is a register that is not special (i.e., not MQ, 386: ctr, or lr). */ 387: 388: int 389: gpc_reg_operand (op, mode) 390: register rtx op; 391: enum machine_mode mode; 392: { 393: return (register_operand (op, mode) 394: && (GET_CODE (op) != REG || REGNO (op) >= 67 || REGNO (op) < 64)); 395: } 396: 397: /* Returns 1 if OP is either a pseudo-register or a register denoting a 398: CR field. */ 399: 400: int 401: cc_reg_operand (op, mode) 402: register rtx op; 403: enum machine_mode mode; 404: { 405: return (register_operand (op, mode) 406: && (GET_CODE (op) != REG 407: || REGNO (op) >= FIRST_PSEUDO_REGISTER 408: || CR_REGNO_P (REGNO (op)))); 409: } 410: 411: /* Returns 1 if OP is either a constant integer valid for a D-field or a 412: non-special register. If a register, it must be in the proper mode unless 413: MODE is VOIDmode. */ 414: 415: int 416: reg_or_short_operand (op, mode) 417: register rtx op; 418: enum machine_mode mode; 419: { 1.1.1.2 root 420: return short_cint_operand (op, mode) || gpc_reg_operand (op, mode); 1.1 root 421: } 422: 423: /* Similar, except check if the negation of the constant would be valid for 424: a D-field. */ 425: 426: int 427: reg_or_neg_short_operand (op, mode) 428: register rtx op; 429: enum machine_mode mode; 430: { 431: if (GET_CODE (op) == CONST_INT) 432: return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P'); 433: 434: return gpc_reg_operand (op, mode); 435: } 436: 437: /* Return 1 if the operand is either a register or an integer whose high-order 438: 16 bits are zero. */ 439: 440: int 441: reg_or_u_short_operand (op, mode) 442: register rtx op; 443: enum machine_mode mode; 444: { 445: if (GET_CODE (op) == CONST_INT 446: && (INTVAL (op) & 0xffff0000) == 0) 447: return 1; 448: 449: return gpc_reg_operand (op, mode); 450: } 451: 452: /* Return 1 is the operand is either a non-special register or ANY 453: constant integer. */ 454: 455: int 456: reg_or_cint_operand (op, mode) 457: register rtx op; 458: enum machine_mode mode; 459: { 460: return GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode); 461: } 462: 1.1.1.2 root 463: /* Return 1 if the operand is a CONST_DOUBLE and it can be put into a register 464: with one instruction per word. We only do this if we can safely read 465: CONST_DOUBLE_{LOW,HIGH}. */ 1.1 root 466: 467: int 468: easy_fp_constant (op, mode) 469: register rtx op; 470: register enum machine_mode mode; 471: { 472: rtx low, high; 473: 474: if (GET_CODE (op) != CONST_DOUBLE 475: || GET_MODE (op) != mode 476: || GET_MODE_CLASS (mode) != MODE_FLOAT) 477: return 0; 478: 479: high = operand_subword (op, 0, 0, mode); 480: low = operand_subword (op, 1, 0, mode); 481: 1.1.1.2 root 482: if (high == 0 || ! input_operand (high, word_mode)) 1.1 root 483: return 0; 484: 485: return (mode == SFmode 1.1.1.2 root 486: || (low != 0 && input_operand (low, word_mode))); 1.1 root 487: } 1.1.1.4 root 488: 489: /* Return 1 if the operand is an offsettable memory address. */ 490: 491: int 492: offsettable_addr_operand (op, mode) 493: register rtx op; 494: enum machine_mode mode; 495: { 496: return offsettable_address_p (reload_completed | reload_in_progress, 497: mode, op); 498: } 499: 1.1 root 500: /* Return 1 if the operand is either a floating-point register, a pseudo 501: register, or memory. */ 502: 503: int 504: fp_reg_or_mem_operand (op, mode) 505: register rtx op; 506: enum machine_mode mode; 507: { 508: return (memory_operand (op, mode) 509: || (register_operand (op, mode) 510: && (GET_CODE (op) != REG 511: || REGNO (op) >= FIRST_PSEUDO_REGISTER 512: || FP_REGNO_P (REGNO (op))))); 513: } 514: 515: /* Return 1 if the operand is either an easy FP constant (see above) or 516: memory. */ 517: 518: int 519: mem_or_easy_const_operand (op, mode) 520: register rtx op; 521: enum machine_mode mode; 522: { 523: return memory_operand (op, mode) || easy_fp_constant (op, mode); 524: } 525: 526: /* Return 1 if the operand is either a non-special register or an item 527: that can be used as the operand of an SI add insn. */ 528: 529: int 530: add_operand (op, mode) 531: register rtx op; 532: enum machine_mode mode; 533: { 534: return (reg_or_short_operand (op, mode) 535: || (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff) == 0)); 536: } 537: 538: /* Return 1 if OP is a constant but not a valid add_operand. */ 539: 540: int 541: non_add_cint_operand (op, mode) 542: register rtx op; 543: enum machine_mode mode; 544: { 545: return (GET_CODE (op) == CONST_INT 546: && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000 547: && (INTVAL (op) & 0xffff) != 0); 548: } 549: 550: /* Return 1 if the operand is a non-special register or a constant that 551: can be used as the operand of an OR or XOR insn on the RS/6000. */ 552: 553: int 554: logical_operand (op, mode) 555: register rtx op; 556: enum machine_mode mode; 557: { 558: return (gpc_reg_operand (op, mode) 559: || (GET_CODE (op) == CONST_INT 560: && ((INTVAL (op) & 0xffff0000) == 0 561: || (INTVAL (op) & 0xffff) == 0))); 562: } 563: 564: /* Return 1 if C is a constant that is not a logical operand (as 565: above). */ 566: 567: int 568: non_logical_cint_operand (op, mode) 569: register rtx op; 570: enum machine_mode mode; 571: { 572: return (GET_CODE (op) == CONST_INT 573: && (INTVAL (op) & 0xffff0000) != 0 574: && (INTVAL (op) & 0xffff) != 0); 575: } 576: 577: /* Return 1 if C is a constant that can be encoded in a mask on the 578: RS/6000. It is if there are no more than two 1->0 or 0->1 transitions. 579: Reject all ones and all zeros, since these should have been optimized 580: away and confuse the making of MB and ME. */ 581: 582: int 583: mask_constant (c) 584: register int c; 585: { 586: int i; 587: int last_bit_value; 588: int transitions = 0; 589: 590: if (c == 0 || c == ~0) 591: return 0; 592: 593: last_bit_value = c & 1; 594: 595: for (i = 1; i < 32; i++) 596: if (((c >>= 1) & 1) != last_bit_value) 597: last_bit_value ^= 1, transitions++; 598: 599: return transitions <= 2; 600: } 601: 602: /* Return 1 if the operand is a constant that is a mask on the RS/6000. */ 603: 604: int 605: mask_operand (op, mode) 606: register rtx op; 607: enum machine_mode mode; 608: { 609: return GET_CODE (op) == CONST_INT && mask_constant (INTVAL (op)); 610: } 611: 612: /* Return 1 if the operand is either a non-special register or a 613: constant that can be used as the operand of an RS/6000 logical AND insn. */ 614: 615: int 616: and_operand (op, mode) 617: register rtx op; 618: enum machine_mode mode; 619: { 620: return (reg_or_short_operand (op, mode) 621: || logical_operand (op, mode) 622: || mask_operand (op, mode)); 623: } 624: 625: /* Return 1 if the operand is a constant but not a valid operand for an AND 626: insn. */ 627: 628: int 629: non_and_cint_operand (op, mode) 630: register rtx op; 631: enum machine_mode mode; 632: { 633: return GET_CODE (op) == CONST_INT && ! and_operand (op, mode); 634: } 635: 636: /* Return 1 if the operand is a general register or memory operand. */ 637: 638: int 639: reg_or_mem_operand (op, mode) 640: register rtx op; 641: register enum machine_mode mode; 642: { 643: return gpc_reg_operand (op, mode) || memory_operand (op, mode); 644: } 645: 1.1.1.4 root 646: /* Return 1 if the operand is a general register or memory operand without 647: pre-inc or pre_dec which produces invalid form of PowerPC lwa 648: instruction. */ 649: 650: int 651: lwa_operand (op, mode) 652: register rtx op; 653: register enum machine_mode mode; 654: { 655: rtx inner = op; 656: 657: if (reload_completed && GET_CODE (inner) == SUBREG) 658: inner = SUBREG_REG (inner); 659: 660: return gpc_reg_operand (inner, mode) 661: || (memory_operand (inner, mode) 662: && GET_CODE (XEXP (inner, 0)) != PRE_INC 663: && GET_CODE (XEXP (inner, 0)) != PRE_DEC); 664: } 665: 1.1 root 666: /* Return 1 if the operand, used inside a MEM, is a valid first argument 667: to CALL. This is a SYMBOL_REF or a pseudo-register, which will be 668: forced to lr. */ 669: 670: int 671: call_operand (op, mode) 672: register rtx op; 673: enum machine_mode mode; 674: { 675: if (mode != VOIDmode && GET_MODE (op) != mode) 676: return 0; 677: 678: return (GET_CODE (op) == SYMBOL_REF 679: || (GET_CODE (op) == REG && REGNO (op) >= FIRST_PSEUDO_REGISTER)); 680: } 681: 1.1.1.2 root 682: 683: /* Return 1 if the operand is a SYMBOL_REF for a function known to be in 684: this file. */ 685: 686: int 687: current_file_function_operand (op, mode) 688: register rtx op; 689: enum machine_mode mode; 690: { 691: return (GET_CODE (op) == SYMBOL_REF 692: && (SYMBOL_REF_FLAG (op) 693: || op == XEXP (DECL_RTL (current_function_decl), 0))); 694: } 695: 696: 1.1 root 697: /* Return 1 if this operand is a valid input for a move insn. */ 698: 699: int 700: input_operand (op, mode) 701: register rtx op; 702: enum machine_mode mode; 703: { 1.1.1.2 root 704: /* Memory is always valid. */ 1.1 root 705: if (memory_operand (op, mode)) 706: return 1; 707: 1.1.1.2 root 708: /* For floating-point, easy constants are valid. */ 709: if (GET_MODE_CLASS (mode) == MODE_FLOAT 710: && CONSTANT_P (op) 711: && easy_fp_constant (op, mode)) 712: return 1; 713: 714: /* For floating-point or multi-word mode, the only remaining valid type 715: is a register. */ 1.1 root 716: if (GET_MODE_CLASS (mode) == MODE_FLOAT 717: || GET_MODE_SIZE (mode) > UNITS_PER_WORD) 1.1.1.2 root 718: return register_operand (op, mode); 1.1 root 719: 720: /* The only cases left are integral modes one word or smaller (we 721: do not get called for MODE_CC values). These can be in any 722: register. */ 723: if (register_operand (op, mode)) 1.1.1.2 root 724: return 1; 1.1 root 725: 726: /* For HImode and QImode, any constant is valid. */ 727: if ((mode == HImode || mode == QImode) 728: && GET_CODE (op) == CONST_INT) 729: return 1; 730: 1.1.1.3 root 731: /* A SYMBOL_REF referring to the TOC is valid. */ 1.1.1.4 root 732: if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (op)) 1.1.1.3 root 733: return 1; 734: 1.1 root 735: /* Otherwise, we will be doing this SET with an add, so anything valid 736: for an add will be valid. */ 737: return add_operand (op, mode); 738: } 739: 1.1.1.4 root 740: /* Initialize a variable CUM of type CUMULATIVE_ARGS 741: for a call to a function whose data type is FNTYPE. 742: For a library call, FNTYPE is 0. 743: 744: For incoming args we set the number of arguments in the prototype large 745: so we never return an EXPR_LIST. */ 746: 747: void 748: init_cumulative_args (cum, fntype, libname, incoming) 749: CUMULATIVE_ARGS *cum; 750: tree fntype; 751: rtx libname; 752: int incoming; 753: { 754: static CUMULATIVE_ARGS zero_cumulative; 755: 756: *cum = zero_cumulative; 757: cum->words = 0; 758: cum->fregno = FP_ARG_MIN_REG; 759: cum->prototype = (fntype && TYPE_ARG_TYPES (fntype)); 760: 761: if (incoming) 762: { 763: cum->nargs_prototype = 1000; /* don't return an EXPR_LIST */ 764: #ifdef TARGET_V4_CALLS 765: if (TARGET_V4_CALLS) 766: cum->varargs_offset = RS6000_VARARGS_OFFSET; 767: #endif 768: } 769: 770: else if (cum->prototype) 771: cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1 772: + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode 773: || RETURN_IN_MEMORY (TREE_TYPE (fntype)))); 774: 775: else 776: cum->nargs_prototype = 0; 777: 778: cum->orig_nargs = cum->nargs_prototype; 779: if (TARGET_DEBUG_ARG) 780: { 781: fprintf (stderr, "\ninit_cumulative_args:"); 782: if (fntype) 783: { 784: tree ret_type = TREE_TYPE (fntype); 785: fprintf (stderr, " ret code = %s,", 786: tree_code_name[ (int)TREE_CODE (ret_type) ]); 787: } 788: 789: #ifdef TARGET_V4_CALLS 790: if (TARGET_V4_CALLS && incoming) 791: fprintf (stderr, " varargs = %d, ", cum->varargs_offset); 792: #endif 793: 794: fprintf (stderr, " proto = %d, nargs = %d\n", 795: cum->prototype, cum->nargs_prototype); 796: } 797: } 798: 799: /* Update the data in CUM to advance over an argument 800: of mode MODE and data type TYPE. 801: (TYPE is null for libcalls where that information may not be available.) */ 802: 803: void 804: function_arg_advance (cum, mode, type, named) 805: CUMULATIVE_ARGS *cum; 806: enum machine_mode mode; 807: tree type; 808: int named; 809: { 810: cum->nargs_prototype--; 811: 812: #ifdef TARGET_V4_CALLS 813: if (TARGET_V4_CALLS) 814: { 815: /* Long longs must not be split between registers and stack */ 816: if ((GET_MODE_CLASS (mode) != MODE_FLOAT || TARGET_SOFT_FLOAT) 817: && type && !AGGREGATE_TYPE_P (type) 818: && cum->words < GP_ARG_NUM_REG 819: && cum->words + RS6000_ARG_SIZE (mode, type, named) > GP_ARG_NUM_REG) 820: { 821: cum->words = GP_ARG_NUM_REG; 822: } 823: 824: /* Aggregates get passed as pointers */ 825: if (type && AGGREGATE_TYPE_P (type)) 826: cum->words++; 827: 828: /* Floats go in registers, & don't occupy space in the GP registers 829: like they do for AIX unless software floating point. */ 830: else if (GET_MODE_CLASS (mode) == MODE_FLOAT 831: && TARGET_HARD_FLOAT 832: && cum->fregno <= FP_ARG_V4_MAX_REG) 833: cum->fregno++; 834: 835: else 836: cum->words += RS6000_ARG_SIZE (mode, type, 1); 837: } 838: else 839: #endif 840: if (named) 841: { 842: cum->words += RS6000_ARG_SIZE (mode, type, named); 843: if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT) 844: cum->fregno++; 845: } 846: 847: if (TARGET_DEBUG_ARG) 848: fprintf (stderr, 849: "function_adv: words = %2d, fregno = %2d, nargs = %4d, proto = %d, mode = %4s, named = %d\n", 850: cum->words, cum->fregno, cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode), named); 851: } 852: 853: /* Determine where to put an argument to a function. 854: Value is zero to push the argument on the stack, 855: or a hard register in which to store the argument. 856: 857: MODE is the argument's machine mode. 858: TYPE is the data type of the argument (as a tree). 859: This is null for libcalls where that information may 860: not be available. 861: CUM is a variable of type CUMULATIVE_ARGS which gives info about 862: the preceding args and about the function being called. 863: NAMED is nonzero if this argument is a named parameter 864: (otherwise it is an extra parameter matching an ellipsis). 865: 866: On RS/6000 the first eight words of non-FP are normally in registers 867: and the rest are pushed. Under AIX, the first 13 FP args are in registers. 868: Under V.4, the first 8 FP args are in registers. 869: 870: If this is floating-point and no prototype is specified, we use 871: both an FP and integer register (or possibly FP reg and stack). Library 872: functions (when TYPE is zero) always have the proper types for args, 873: so we can pass the FP value just in one register. emit_library_function 874: doesn't support EXPR_LIST anyway. */ 875: 876: struct rtx_def * 877: function_arg (cum, mode, type, named) 878: CUMULATIVE_ARGS *cum; 879: enum machine_mode mode; 880: tree type; 881: int named; 882: { 883: if (TARGET_DEBUG_ARG) 884: fprintf (stderr, 885: "function_arg: words = %2d, fregno = %2d, nargs = %4d, proto = %d, mode = %4s, named = %d\n", 886: cum->words, cum->fregno, cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode), named); 887: 888: /* Return a marker to indicate whether CR1 needs to set or clear the bit that V.4 889: uses to say fp args were passed in registers. Assume that we don't need the 890: marker for software floating point, or compiler generated library calls. */ 891: if (mode == VOIDmode) 892: { 893: #ifdef TARGET_V4_CALLS 894: if (TARGET_V4_CALLS && TARGET_HARD_FLOAT && cum->nargs_prototype < 0 895: && type && (cum->prototype || TARGET_NO_PROTOTYPE)) 896: return GEN_INT ((cum->fregno == FP_ARG_MIN_REG) ? -1 : 1); 897: #endif 898: 899: return GEN_INT (0); 900: } 901: 902: if (!named) 903: { 904: #ifdef TARGET_V4_CALLS 905: if (!TARGET_V4_CALLS) 906: #endif 907: return NULL_RTX; 908: } 909: 910: if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) 911: return NULL_RTX; 912: 913: if (USE_FP_FOR_ARG_P (*cum, mode, type)) 914: { 915: if ((cum->nargs_prototype > 0) 916: #ifdef TARGET_V4_CALLS 917: || TARGET_V4_CALLS /* V.4 never passes FP values in GP registers */ 918: #endif 919: || !type) 920: return gen_rtx (REG, mode, cum->fregno); 921: 922: return gen_rtx (EXPR_LIST, VOIDmode, 923: ((cum->words < GP_ARG_NUM_REG) 924: ? gen_rtx (REG, mode, GP_ARG_MIN_REG + cum->words) 925: : NULL_RTX), 926: gen_rtx (REG, mode, cum->fregno)); 927: } 928: 929: #ifdef TARGET_V4_CALLS 930: /* Long longs won't be split between register and stack */ 931: else if (TARGET_V4_CALLS && 932: cum->words + RS6000_ARG_SIZE (mode, type, named) > GP_ARG_NUM_REG) 933: { 934: return NULL_RTX; 935: } 936: #endif 937: 938: else if (cum->words < GP_ARG_NUM_REG) 939: return gen_rtx (REG, mode, GP_ARG_MIN_REG + cum->words); 940: 941: return NULL_RTX; 942: } 943: 944: /* For an arg passed partly in registers and partly in memory, 945: this is the number of registers used. 946: For args passed entirely in registers or entirely in memory, zero. */ 947: 948: int 949: function_arg_partial_nregs (cum, mode, type, named) 950: CUMULATIVE_ARGS *cum; 951: enum machine_mode mode; 952: tree type; 953: int named; 954: { 955: if (! named) 956: return 0; 957: 958: #ifdef TARGET_V4_CALLS 959: if (TARGET_V4_CALLS) 960: return 0; 961: #endif 962: 963: if (USE_FP_FOR_ARG_P (*cum, mode, type)) 964: { 965: if (cum->nargs_prototype >= 0) 966: return 0; 967: } 968: 969: if (cum->words < GP_ARG_NUM_REG 970: && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type, named))) 971: { 972: int ret = GP_ARG_NUM_REG - cum->words; 973: if (ret && TARGET_DEBUG_ARG) 974: fprintf (stderr, "function_arg_partial_nregs: %d\n", ret); 975: 976: return ret; 977: } 978: 979: return 0; 980: } 981: 982: /* A C expression that indicates when an argument must be passed by 983: reference. If nonzero for an argument, a copy of that argument is 984: made in memory and a pointer to the argument is passed instead of 985: the argument itself. The pointer is passed in whatever way is 986: appropriate for passing a pointer to that type. 987: 988: Under V.4, structures and unions are passed by reference. */ 989: 990: int 991: function_arg_pass_by_reference (cum, mode, type, named) 992: CUMULATIVE_ARGS *cum; 993: enum machine_mode mode; 994: tree type; 995: int named; 996: { 997: #ifdef TARGET_V4_CALLS 998: if (TARGET_V4_CALLS && type && AGGREGATE_TYPE_P (type)) 999: { 1000: if (TARGET_DEBUG_ARG) 1001: fprintf (stderr, "function_arg_pass_by_reference: aggregate\n"); 1002: 1003: return 1; 1004: } 1005: #endif 1006: 1007: return 0; 1008: } 1009: 1010: 1011: /* Perform any needed actions needed for a function that is receiving a 1012: variable number of arguments. 1013: 1014: CUM is as above. 1015: 1016: MODE and TYPE are the mode and type of the current parameter. 1017: 1018: PRETEND_SIZE is a variable that should be set to the amount of stack 1019: that must be pushed by the prolog to pretend that our caller pushed 1020: it. 1021: 1022: Normally, this macro will push all remaining incoming registers on the 1023: stack and set PRETEND_SIZE to the length of the registers pushed. */ 1024: 1025: void 1026: setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl) 1027: CUMULATIVE_ARGS *cum; 1028: enum machine_mode mode; 1029: tree type; 1030: int *pretend_size; 1031: int no_rtl; 1032: 1033: { 1034: rtx save_area = virtual_incoming_args_rtx; 1035: int reg_size = (TARGET_64BIT) ? 8 : 4; 1036: 1037: if (TARGET_DEBUG_ARG) 1038: fprintf (stderr, 1039: "setup_vararg: words = %2d, fregno = %2d, nargs = %4d, proto = %d, mode = %4s, no_rtl= %d\n", 1040: cum->words, cum->fregno, cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode), no_rtl); 1041: 1042: #ifdef TARGET_V4_CALLS 1043: if (TARGET_V4_CALLS && !no_rtl) 1044: { 1045: rs6000_sysv_varargs_p = 1; 1046: save_area = plus_constant (frame_pointer_rtx, RS6000_VARARGS_OFFSET); 1047: } 1048: #endif 1049: 1050: if (cum->words < 8) 1051: { 1052: int first_reg_offset = cum->words; 1053: 1054: if (MUST_PASS_IN_STACK (mode, type)) 1055: first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type, 1); 1056: 1057: if (first_reg_offset > GP_ARG_NUM_REG) 1058: first_reg_offset = GP_ARG_NUM_REG; 1059: 1060: if (!no_rtl && first_reg_offset != GP_ARG_NUM_REG) 1061: move_block_from_reg 1062: (GP_ARG_MIN_REG + first_reg_offset, 1063: gen_rtx (MEM, BLKmode, 1064: plus_constant (save_area, first_reg_offset * reg_size)), 1065: GP_ARG_NUM_REG - first_reg_offset, 1066: (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD); 1067: 1068: *pretend_size = (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD; 1069: } 1070: 1071: #ifdef TARGET_V4_CALLS 1072: /* Save FP registers if needed. */ 1073: if (TARGET_V4_CALLS && TARGET_HARD_FLOAT && !no_rtl) 1074: { 1075: int fregno = cum->fregno; 1076: int num_fp_reg = FP_ARG_V4_MAX_REG + 1 - fregno; 1077: 1078: if (num_fp_reg >= 0) 1079: { 1080: rtx cr1 = gen_rtx (REG, CCmode, 69); 1081: rtx lab = gen_label_rtx (); 1082: int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8); 1083: 1084: emit_jump_insn (gen_rtx (SET, VOIDmode, 1085: pc_rtx, 1086: gen_rtx (IF_THEN_ELSE, VOIDmode, 1087: gen_rtx (NE, VOIDmode, cr1, const0_rtx), 1088: gen_rtx (LABEL_REF, VOIDmode, lab), 1089: pc_rtx))); 1090: 1091: while ( num_fp_reg-- >= 0) 1092: { 1093: emit_move_insn (gen_rtx (MEM, DFmode, plus_constant (save_area, off)), 1094: gen_rtx (REG, DFmode, fregno++)); 1095: off += 8; 1096: } 1097: 1098: emit_label (lab); 1099: } 1100: } 1101: #endif 1102: } 1103: 1104: /* If defined, is a C expression that produces the machine-specific 1105: code for a call to `__builtin_saveregs'. This code will be moved 1106: to the very beginning of the function, before any parameter access 1107: are made. The return value of this function should be an RTX that 1108: contains the value to use as the return of `__builtin_saveregs'. 1109: 1110: The argument ARGS is a `tree_list' containing the arguments that 1111: were passed to `__builtin_saveregs'. 1112: 1113: If this macro is not defined, the compiler will output an ordinary 1114: call to the library function `__builtin_saveregs'. 1115: 1116: On the Power/PowerPC return the address of the area on the stack 1117: used to hold arguments. Under AIX, this includes the 8 word register 1118: save area. Under V.4 this does not. */ 1119: 1120: struct rtx_def * 1121: expand_builtin_saveregs (args) 1122: tree args; 1123: { 1124: return virtual_incoming_args_rtx; 1125: } 1126: 1127: 1128: /* Allocate a stack temp. Only allocate one stack temp per type for a 1129: function. */ 1130: 1131: struct rtx_def * 1132: rs6000_stack_temp (mode, size) 1133: enum machine_mode mode; 1134: int size; 1135: { 1136: rtx temp = stack_temps[ (int)mode ]; 1137: rtx addr; 1138: 1139: if (temp == NULL_RTX) 1140: { 1141: temp = assign_stack_local (mode, size, 0); 1142: addr = XEXP (temp, 0); 1143: 1144: if ((size > 4 && !offsettable_address_p (0, mode, addr)) 1145: || (size <= 4 && !memory_address_p (mode, addr))) 1146: { 1147: XEXP (temp, 0) = copy_addr_to_reg (addr); 1148: } 1149: 1150: stack_temps[ (int)mode ] = temp; 1151: } 1152: 1153: return temp; 1154: } 1155: 1156: 1157: /* Generate a memory reference for expand_block_move, copying volatile, 1158: and other bits from an original memory reference. */ 1159: 1160: static rtx 1161: expand_block_move_mem (mode, addr, orig_mem) 1162: enum machine_mode mode; 1163: rtx addr; 1164: rtx orig_mem; 1165: { 1166: rtx mem = gen_rtx (MEM, mode, addr); 1.1.1.5 ! root 1167: RTX_UNCHANGING_P (mem) = RTX_UNCHANGING_P (orig_mem); 1.1.1.4 root 1168: MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem); 1169: MEM_IN_STRUCT_P (mem) = MEM_IN_STRUCT_P (orig_mem); 1170: return mem; 1171: } 1172: 1173: /* Expand a block move operation, and return 1 if successful. Return 0 1174: if we should let the compiler generate normal code. 1175: 1176: operands[0] is the destination 1177: operands[1] is the source 1178: operands[2] is the length 1179: operands[3] is the alignment */ 1180: 1181: #define MAX_MOVE_REG 4 1182: 1183: int 1184: expand_block_move (operands) 1185: rtx operands[]; 1186: { 1.1.1.5 ! root 1187: rtx orig_dest = operands[0]; ! 1188: rtx orig_src = operands[1]; 1.1.1.4 root 1189: rtx bytes_rtx = operands[2]; 1190: rtx align_rtx = operands[3]; 1191: int constp = (GET_CODE (bytes_rtx) == CONST_INT); 1192: int align = XINT (align_rtx, 0); 1193: int bytes; 1194: int offset; 1195: int num_reg; 1196: int i; 1197: rtx src_reg; 1198: rtx dest_reg; 1199: rtx src_addr; 1200: rtx dest_addr; 1201: rtx tmp_reg; 1202: rtx stores[MAX_MOVE_REG]; 1203: int move_bytes; 1204: 1205: /* If this is not a fixed size move, just call memcpy */ 1206: if (!constp) 1207: return 0; 1208: 1209: /* Anything to move? */ 1210: bytes = INTVAL (bytes_rtx); 1211: if (bytes <= 0) 1212: return 1; 1213: 1214: /* Don't support real large moves. If string instructions are not used, 1215: then don't generate more than 8 loads. */ 1216: if (TARGET_STRING) 1217: { 1218: if (bytes > 4*8) 1219: return 0; 1220: } 1221: else if (!STRICT_ALIGNMENT) 1222: { 1223: if (bytes > 4*8) 1224: return 0; 1225: } 1226: else if (bytes > 8*align) 1227: return 0; 1228: 1229: /* Move the address into scratch registers. */ 1.1.1.5 ! root 1230: dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0)); ! 1231: src_reg = copy_addr_to_reg (XEXP (orig_src, 0)); 1.1.1.4 root 1232: 1233: if (TARGET_STRING) /* string instructions are available */ 1234: { 1235: for ( ; bytes > 0; bytes -= move_bytes) 1236: { 1237: if (bytes > 24 /* move up to 32 bytes at a time */ 1238: && !fixed_regs[5] 1239: && !fixed_regs[6] 1240: && !fixed_regs[7] 1241: && !fixed_regs[8] 1242: && !fixed_regs[9] 1243: && !fixed_regs[10] 1244: && !fixed_regs[11] 1245: && !fixed_regs[12]) 1246: { 1247: move_bytes = (bytes > 32) ? 32 : bytes; 1.1.1.5 ! root 1248: emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), ! 1249: expand_block_move_mem (BLKmode, src_reg, orig_src), 1.1.1.4 root 1250: GEN_INT ((move_bytes == 32) ? 0 : move_bytes), 1251: align_rtx)); 1252: } 1253: else if (bytes > 16 /* move up to 24 bytes at a time */ 1254: && !fixed_regs[7] 1255: && !fixed_regs[8] 1256: && !fixed_regs[9] 1257: && !fixed_regs[10] 1258: && !fixed_regs[11] 1259: && !fixed_regs[12]) 1260: { 1261: move_bytes = (bytes > 24) ? 24 : bytes; 1.1.1.5 ! root 1262: emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), ! 1263: expand_block_move_mem (BLKmode, src_reg, orig_src), 1.1.1.4 root 1264: GEN_INT (move_bytes), 1265: align_rtx)); 1266: } 1267: else if (bytes > 8 /* move up to 16 bytes at a time */ 1268: && !fixed_regs[9] 1269: && !fixed_regs[10] 1270: && !fixed_regs[11] 1271: && !fixed_regs[12]) 1272: { 1273: move_bytes = (bytes > 16) ? 16 : bytes; 1.1.1.5 ! root 1274: emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), ! 1275: expand_block_move_mem (BLKmode, src_reg, orig_src), 1.1.1.4 root 1276: GEN_INT (move_bytes), 1277: align_rtx)); 1278: } 1279: else if (bytes > 4 && !TARGET_64BIT) 1280: { /* move up to 8 bytes at a time */ 1281: move_bytes = (bytes > 8) ? 8 : bytes; 1.1.1.5 ! root 1282: emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), ! 1283: expand_block_move_mem (BLKmode, src_reg, orig_src), 1.1.1.4 root 1284: GEN_INT (move_bytes), 1285: align_rtx)); 1286: } 1287: else if (bytes >= 4 && (align >= 4 || !STRICT_ALIGNMENT)) 1288: { /* move 4 bytes */ 1289: move_bytes = 4; 1290: tmp_reg = gen_reg_rtx (SImode); 1.1.1.5 ! root 1291: emit_move_insn (tmp_reg, expand_block_move_mem (SImode, src_reg, orig_src)); ! 1292: emit_move_insn (expand_block_move_mem (SImode, dest_reg, orig_dest), tmp_reg); 1.1.1.4 root 1293: } 1294: else if (bytes == 2 && (align >= 2 || !STRICT_ALIGNMENT)) 1295: { /* move 2 bytes */ 1296: move_bytes = 2; 1297: tmp_reg = gen_reg_rtx (HImode); 1.1.1.5 ! root 1298: emit_move_insn (tmp_reg, expand_block_move_mem (HImode, src_reg, orig_src)); ! 1299: emit_move_insn (expand_block_move_mem (HImode, dest_reg, orig_dest), tmp_reg); 1.1.1.4 root 1300: } 1301: else if (bytes == 1) /* move 1 byte */ 1302: { 1303: move_bytes = 1; 1304: tmp_reg = gen_reg_rtx (QImode); 1.1.1.5 ! root 1305: emit_move_insn (tmp_reg, expand_block_move_mem (QImode, src_reg, orig_src)); ! 1306: emit_move_insn (expand_block_move_mem (QImode, dest_reg, orig_dest), tmp_reg); 1.1.1.4 root 1307: } 1308: else 1309: { /* move up to 4 bytes at a time */ 1310: move_bytes = (bytes > 4) ? 4 : bytes; 1.1.1.5 ! root 1311: emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), ! 1312: expand_block_move_mem (BLKmode, src_reg, orig_src), 1.1.1.4 root 1313: GEN_INT (move_bytes), 1314: align_rtx)); 1315: } 1316: 1317: if (bytes > move_bytes) 1318: { 1319: emit_insn (gen_addsi3 (src_reg, src_reg, GEN_INT (move_bytes))); 1320: emit_insn (gen_addsi3 (dest_reg, dest_reg, GEN_INT (move_bytes))); 1321: } 1322: } 1323: } 1324: 1325: else /* string instructions not available */ 1326: { 1327: num_reg = offset = 0; 1328: for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes)) 1329: { 1330: /* Calculate the correct offset for src/dest */ 1331: if (offset == 0) 1332: { 1333: src_addr = src_reg; 1334: dest_addr = dest_reg; 1335: } 1336: else 1337: { 1338: src_addr = gen_rtx (PLUS, Pmode, src_reg, GEN_INT (offset)); 1339: dest_addr = gen_rtx (PLUS, Pmode, dest_reg, GEN_INT (offset)); 1340: } 1341: 1342: /* Generate the appropriate load and store, saving the stores for later */ 1.1.1.5 ! root 1343: if (bytes >= 8 && TARGET_64BIT && (align >= 8 || !STRICT_ALIGNMENT)) ! 1344: { ! 1345: move_bytes = 8; ! 1346: tmp_reg = gen_reg_rtx (DImode); ! 1347: emit_insn (gen_movdi (tmp_reg, expand_block_move_mem (DImode, src_addr, orig_src))); ! 1348: stores[ num_reg++ ] = gen_movdi (expand_block_move_mem (DImode, dest_addr, orig_dest), tmp_reg); ! 1349: } ! 1350: else if (bytes >= 4 && (align >= 4 || !STRICT_ALIGNMENT)) 1.1.1.4 root 1351: { 1352: move_bytes = 4; 1353: tmp_reg = gen_reg_rtx (SImode); 1.1.1.5 ! root 1354: emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (SImode, src_addr, orig_src))); ! 1355: stores[ num_reg++ ] = gen_movsi (expand_block_move_mem (SImode, dest_addr, orig_dest), tmp_reg); 1.1.1.4 root 1356: } 1357: else if (bytes >= 2 && (align >= 2 || !STRICT_ALIGNMENT)) 1358: { 1359: move_bytes = 2; 1360: tmp_reg = gen_reg_rtx (HImode); 1.1.1.5 ! root 1361: emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (HImode, src_addr, orig_src))); ! 1362: stores[ num_reg++ ] = gen_movhi (expand_block_move_mem (HImode, dest_addr, orig_dest), tmp_reg); 1.1.1.4 root 1363: } 1364: else 1365: { 1366: move_bytes = 1; 1367: tmp_reg = gen_reg_rtx (QImode); 1.1.1.5 ! root 1368: emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (QImode, src_addr, orig_src))); ! 1369: stores[ num_reg++ ] = gen_movqi (expand_block_move_mem (QImode, dest_addr, orig_dest), tmp_reg); 1.1.1.4 root 1370: } 1371: 1372: if (num_reg >= MAX_MOVE_REG) 1373: { 1374: for (i = 0; i < num_reg; i++) 1375: emit_insn (stores[i]); 1376: num_reg = 0; 1377: } 1378: } 1379: 1.1.1.5 ! root 1380: for (i = 0; i < num_reg; i++) ! 1381: emit_insn (stores[i]); 1.1.1.4 root 1382: } 1383: 1384: return 1; 1385: } 1386: 1387: 1.1 root 1388: /* Return 1 if OP is a load multiple operation. It is known to be a 1389: PARALLEL and the first section will be tested. */ 1390: 1391: int 1392: load_multiple_operation (op, mode) 1393: rtx op; 1394: enum machine_mode mode; 1395: { 1396: int count = XVECLEN (op, 0); 1397: int dest_regno; 1398: rtx src_addr; 1399: int i; 1400: 1401: /* Perform a quick check so we don't blow up below. */ 1402: if (count <= 1 1403: || GET_CODE (XVECEXP (op, 0, 0)) != SET 1404: || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG 1405: || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM) 1406: return 0; 1407: 1408: dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0))); 1409: src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0); 1410: 1411: for (i = 1; i < count; i++) 1412: { 1413: rtx elt = XVECEXP (op, 0, i); 1414: 1415: if (GET_CODE (elt) != SET 1416: || GET_CODE (SET_DEST (elt)) != REG 1417: || GET_MODE (SET_DEST (elt)) != SImode 1418: || REGNO (SET_DEST (elt)) != dest_regno + i 1419: || GET_CODE (SET_SRC (elt)) != MEM 1420: || GET_MODE (SET_SRC (elt)) != SImode 1421: || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS 1422: || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr) 1423: || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT 1424: || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4) 1425: return 0; 1426: } 1427: 1428: return 1; 1429: } 1430: 1431: /* Similar, but tests for store multiple. Here, the second vector element 1432: is a CLOBBER. It will be tested later. */ 1433: 1434: int 1435: store_multiple_operation (op, mode) 1436: rtx op; 1437: enum machine_mode mode; 1438: { 1439: int count = XVECLEN (op, 0) - 1; 1440: int src_regno; 1441: rtx dest_addr; 1442: int i; 1443: 1444: /* Perform a quick check so we don't blow up below. */ 1445: if (count <= 1 1446: || GET_CODE (XVECEXP (op, 0, 0)) != SET 1447: || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM 1448: || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG) 1449: return 0; 1450: 1451: src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0))); 1452: dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0); 1453: 1454: for (i = 1; i < count; i++) 1455: { 1456: rtx elt = XVECEXP (op, 0, i + 1); 1457: 1458: if (GET_CODE (elt) != SET 1459: || GET_CODE (SET_SRC (elt)) != REG 1460: || GET_MODE (SET_SRC (elt)) != SImode 1461: || REGNO (SET_SRC (elt)) != src_regno + i 1462: || GET_CODE (SET_DEST (elt)) != MEM 1463: || GET_MODE (SET_DEST (elt)) != SImode 1464: || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS 1465: || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr) 1466: || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT 1467: || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4) 1468: return 0; 1469: } 1470: 1471: return 1; 1472: } 1473: 1474: /* Return 1 if OP is a comparison operation that is valid for a branch insn. 1475: We only check the opcode against the mode of the CC value here. */ 1476: 1477: int 1478: branch_comparison_operator (op, mode) 1479: register rtx op; 1480: enum machine_mode mode; 1481: { 1482: enum rtx_code code = GET_CODE (op); 1483: enum machine_mode cc_mode; 1484: 1485: if (GET_RTX_CLASS (code) != '<') 1486: return 0; 1487: 1488: cc_mode = GET_MODE (XEXP (op, 0)); 1489: if (GET_MODE_CLASS (cc_mode) != MODE_CC) 1490: return 0; 1491: 1492: if ((code == GT || code == LT || code == GE || code == LE) 1493: && cc_mode == CCUNSmode) 1494: return 0; 1495: 1496: if ((code == GTU || code == LTU || code == GEU || code == LEU) 1497: && (cc_mode != CCUNSmode)) 1498: return 0; 1499: 1500: return 1; 1501: } 1502: 1503: /* Return 1 if OP is a comparison operation that is valid for an scc insn. 1504: We check the opcode against the mode of the CC value and disallow EQ or 1505: NE comparisons for integers. */ 1506: 1507: int 1508: scc_comparison_operator (op, mode) 1509: register rtx op; 1510: enum machine_mode mode; 1511: { 1512: enum rtx_code code = GET_CODE (op); 1513: enum machine_mode cc_mode; 1514: 1515: if (GET_MODE (op) != mode && mode != VOIDmode) 1516: return 0; 1517: 1518: if (GET_RTX_CLASS (code) != '<') 1519: return 0; 1520: 1521: cc_mode = GET_MODE (XEXP (op, 0)); 1522: if (GET_MODE_CLASS (cc_mode) != MODE_CC) 1523: return 0; 1524: 1525: if (code == NE && cc_mode != CCFPmode) 1526: return 0; 1527: 1528: if ((code == GT || code == LT || code == GE || code == LE) 1529: && cc_mode == CCUNSmode) 1530: return 0; 1531: 1532: if ((code == GTU || code == LTU || code == GEU || code == LEU) 1533: && (cc_mode != CCUNSmode)) 1534: return 0; 1535: 1536: if (cc_mode == CCEQmode && code != EQ && code != NE) 1537: return 0; 1538: 1539: return 1; 1540: } 1541: 1542: /* Return 1 if ANDOP is a mask that has no bits on that are not in the 1543: mask required to convert the result of a rotate insn into a shift 1544: left insn of SHIFTOP bits. Both are known to be CONST_INT. */ 1545: 1546: int 1547: includes_lshift_p (shiftop, andop) 1548: register rtx shiftop; 1549: register rtx andop; 1550: { 1551: int shift_mask = (~0 << INTVAL (shiftop)); 1552: 1553: return (INTVAL (andop) & ~shift_mask) == 0; 1554: } 1555: 1556: /* Similar, but for right shift. */ 1557: 1558: int 1559: includes_rshift_p (shiftop, andop) 1560: register rtx shiftop; 1561: register rtx andop; 1562: { 1563: unsigned shift_mask = ~0; 1564: 1565: shift_mask >>= INTVAL (shiftop); 1566: 1567: return (INTVAL (andop) & ~ shift_mask) == 0; 1568: } 1.1.1.4 root 1569: 1570: /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates 1571: for lfq and stfq insns. 1572: 1573: Note reg1 and reg2 *must* be hard registers. To be sure we will 1574: abort if we are passed pseudo registers. */ 1575: 1576: int 1577: registers_ok_for_quad_peep (reg1, reg2) 1578: rtx reg1, reg2; 1579: { 1580: /* We might have been passed a SUBREG. */ 1581: if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG) 1582: return 0; 1583: 1584: return (REGNO (reg1) == REGNO (reg2) - 1); 1585: } 1586: 1587: /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn. addr1 and 1588: addr2 must be in consecutive memory locations (addr2 == addr1 + 8). */ 1589: 1590: int 1591: addrs_ok_for_quad_peep (addr1, addr2) 1592: register rtx addr1; 1593: register rtx addr2; 1594: { 1595: int reg1; 1596: int offset1; 1597: 1598: /* Extract an offset (if used) from the first addr. */ 1599: if (GET_CODE (addr1) == PLUS) 1600: { 1601: /* If not a REG, return zero. */ 1602: if (GET_CODE (XEXP (addr1, 0)) != REG) 1603: return 0; 1604: else 1605: { 1606: reg1 = REGNO (XEXP (addr1, 0)); 1607: /* The offset must be constant! */ 1608: if (GET_CODE (XEXP (addr1, 1)) != CONST_INT) 1609: return 0; 1610: offset1 = INTVAL (XEXP (addr1, 1)); 1611: } 1612: } 1613: else if (GET_CODE (addr1) != REG) 1614: return 0; 1615: else 1616: { 1617: reg1 = REGNO (addr1); 1618: /* This was a simple (mem (reg)) expression. Offset is 0. */ 1619: offset1 = 0; 1620: } 1621: 1622: /* Make sure the second address is a (mem (plus (reg) (const_int). */ 1623: if (GET_CODE (addr2) != PLUS) 1624: return 0; 1625: 1626: if (GET_CODE (XEXP (addr2, 0)) != REG 1627: || GET_CODE (XEXP (addr2, 1)) != CONST_INT) 1628: return 0; 1629: 1630: if (reg1 != REGNO (XEXP (addr2, 0))) 1631: return 0; 1632: 1633: /* The offset for the second addr must be 8 more than the first addr. */ 1634: if (INTVAL (XEXP (addr2, 1)) != offset1 + 8) 1635: return 0; 1636: 1637: /* All the tests passed. addr1 and addr2 are valid for lfq or stfq 1638: instructions. */ 1639: return 1; 1640: } 1.1 root 1641: 1642: /* Return the register class of a scratch register needed to copy IN into 1643: or out of a register in CLASS in MODE. If it can be done directly, 1644: NO_REGS is returned. */ 1645: 1646: enum reg_class 1647: secondary_reload_class (class, mode, in) 1648: enum reg_class class; 1649: enum machine_mode mode; 1650: rtx in; 1651: { 1652: int regno = true_regnum (in); 1653: 1654: if (regno >= FIRST_PSEUDO_REGISTER) 1655: regno = -1; 1656: 1657: /* We can place anything into GENERAL_REGS and can put GENERAL_REGS 1658: into anything. */ 1659: if (class == GENERAL_REGS || class == BASE_REGS 1660: || (regno >= 0 && INT_REGNO_P (regno))) 1661: return NO_REGS; 1662: 1663: /* Constants, memory, and FP registers can go into FP registers. */ 1664: if ((regno == -1 || FP_REGNO_P (regno)) 1665: && (class == FLOAT_REGS || class == NON_SPECIAL_REGS)) 1666: return NO_REGS; 1667: 1668: /* We can copy among the CR registers. */ 1669: if ((class == CR_REGS || class == CR0_REGS) 1670: && regno >= 0 && CR_REGNO_P (regno)) 1671: return NO_REGS; 1672: 1673: /* Otherwise, we need GENERAL_REGS. */ 1674: return GENERAL_REGS; 1675: } 1676: 1677: /* Given a comparison operation, return the bit number in CCR to test. We 1678: know this is a valid comparison. 1679: 1680: SCC_P is 1 if this is for an scc. That means that %D will have been 1681: used instead of %C, so the bits will be in different places. 1682: 1683: Return -1 if OP isn't a valid comparison for some reason. */ 1684: 1685: int 1686: ccr_bit (op, scc_p) 1687: register rtx op; 1688: int scc_p; 1689: { 1690: enum rtx_code code = GET_CODE (op); 1691: enum machine_mode cc_mode; 1692: int cc_regnum; 1693: int base_bit; 1694: 1695: if (GET_RTX_CLASS (code) != '<') 1696: return -1; 1697: 1698: cc_mode = GET_MODE (XEXP (op, 0)); 1699: cc_regnum = REGNO (XEXP (op, 0)); 1700: base_bit = 4 * (cc_regnum - 68); 1701: 1702: /* In CCEQmode cases we have made sure that the result is always in the 1703: third bit of the CR field. */ 1704: 1705: if (cc_mode == CCEQmode) 1706: return base_bit + 3; 1707: 1708: switch (code) 1709: { 1710: case NE: 1711: return scc_p ? base_bit + 3 : base_bit + 2; 1712: case EQ: 1713: return base_bit + 2; 1714: case GT: case GTU: 1715: return base_bit + 1; 1716: case LT: case LTU: 1717: return base_bit; 1718: 1719: case GE: case GEU: 1720: /* If floating-point, we will have done a cror to put the bit in the 1721: unordered position. So test that bit. For integer, this is ! LT 1722: unless this is an scc insn. */ 1723: return cc_mode == CCFPmode || scc_p ? base_bit + 3 : base_bit; 1724: 1725: case LE: case LEU: 1726: return cc_mode == CCFPmode || scc_p ? base_bit + 3 : base_bit + 1; 1727: 1728: default: 1729: abort (); 1730: } 1731: } 1732: 1733: /* Print an operand. Recognize special options, documented below. */ 1734: 1735: void 1736: print_operand (file, x, code) 1737: FILE *file; 1738: rtx x; 1739: char code; 1740: { 1741: int i; 1742: int val; 1743: 1744: /* These macros test for integers and extract the low-order bits. */ 1745: #define INT_P(X) \ 1746: ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \ 1747: && GET_MODE (X) == VOIDmode) 1748: 1749: #define INT_LOWPART(X) \ 1750: (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X)) 1751: 1752: switch (code) 1753: { 1.1.1.2 root 1754: case '.': 1755: /* Write out an instruction after the call which may be replaced 1756: with glue code by the loader. This depends on the AIX version. */ 1757: asm_fprintf (file, RS6000_CALL_GLUE); 1758: return; 1759: 1.1.1.3 root 1760: case '*': 1761: /* Write the register number of the TOC register. */ 1.1.1.4 root 1762: fputs (TARGET_MINIMAL_TOC ? reg_names[30] : reg_names[2], file); 1.1.1.3 root 1763: return; 1764: 1.1 root 1765: case 'A': 1766: /* If X is a constant integer whose low-order 5 bits are zero, 1767: write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug 1.1.1.2 root 1768: in the AIX assembler where "sri" with a zero shift count 1.1 root 1769: write a trash instruction. */ 1770: if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0) 1.1.1.2 root 1771: putc ('l', file); 1.1 root 1772: else 1.1.1.2 root 1773: putc ('r', file); 1.1 root 1774: return; 1775: 1776: case 'b': 1777: /* Low-order 16 bits of constant, unsigned. */ 1778: if (! INT_P (x)) 1779: output_operand_lossage ("invalid %%b value"); 1780: 1781: fprintf (file, "%d", INT_LOWPART (x) & 0xffff); 1782: return; 1783: 1784: case 'C': 1785: /* This is an optional cror needed for LE or GE floating-point 1786: comparisons. Otherwise write nothing. */ 1787: if ((GET_CODE (x) == LE || GET_CODE (x) == GE) 1788: && GET_MODE (XEXP (x, 0)) == CCFPmode) 1789: { 1790: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68); 1791: 1792: fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3, 1793: base_bit + 2, base_bit + (GET_CODE (x) == GE)); 1794: } 1795: return; 1796: 1797: case 'D': 1798: /* Similar, except that this is for an scc, so we must be able to 1799: encode the test in a single bit that is one. We do the above 1800: for any LE, GE, GEU, or LEU and invert the bit for NE. */ 1801: if (GET_CODE (x) == LE || GET_CODE (x) == GE 1802: || GET_CODE (x) == LEU || GET_CODE (x) == GEU) 1803: { 1804: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68); 1805: 1806: fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3, 1807: base_bit + 2, 1808: base_bit + (GET_CODE (x) == GE || GET_CODE (x) == GEU)); 1809: } 1810: 1811: else if (GET_CODE (x) == NE) 1812: { 1813: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68); 1814: 1815: fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 3, 1816: base_bit + 2, base_bit + 2); 1817: } 1818: return; 1819: 1820: case 'E': 1821: /* X is a CR register. Print the number of the third bit of the CR */ 1822: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x))) 1823: output_operand_lossage ("invalid %%E value"); 1824: 1825: fprintf(file, "%d", 4 * (REGNO (x) - 68) + 3); 1.1.1.2 root 1826: return; 1.1 root 1827: 1828: case 'f': 1829: /* X is a CR register. Print the shift count needed to move it 1830: to the high-order four bits. */ 1831: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x))) 1832: output_operand_lossage ("invalid %%f value"); 1833: else 1834: fprintf (file, "%d", 4 * (REGNO (x) - 68)); 1835: return; 1836: 1837: case 'F': 1838: /* Similar, but print the count for the rotate in the opposite 1839: direction. */ 1840: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x))) 1841: output_operand_lossage ("invalid %%F value"); 1842: else 1843: fprintf (file, "%d", 32 - 4 * (REGNO (x) - 68)); 1844: return; 1845: 1846: case 'G': 1847: /* X is a constant integer. If it is negative, print "m", 1848: otherwise print "z". This is to make a aze or ame insn. */ 1849: if (GET_CODE (x) != CONST_INT) 1850: output_operand_lossage ("invalid %%G value"); 1851: else if (INTVAL (x) >= 0) 1.1.1.2 root 1852: putc ('z', file); 1.1 root 1853: else 1.1.1.2 root 1854: putc ('m', file); 1.1 root 1855: return; 1856: 1857: case 'h': 1858: /* If constant, output low-order five bits. Otherwise, 1859: write normally. */ 1860: if (INT_P (x)) 1861: fprintf (file, "%d", INT_LOWPART (x) & 31); 1862: else 1863: print_operand (file, x, 0); 1864: return; 1865: 1866: case 'I': 1867: /* Print `i' if this is a constant, else nothing. */ 1868: if (INT_P (x)) 1.1.1.2 root 1869: putc ('i', file); 1.1 root 1870: return; 1871: 1872: case 'j': 1873: /* Write the bit number in CCR for jump. */ 1874: i = ccr_bit (x, 0); 1875: if (i == -1) 1876: output_operand_lossage ("invalid %%j code"); 1877: else 1878: fprintf (file, "%d", i); 1879: return; 1880: 1881: case 'J': 1882: /* Similar, but add one for shift count in rlinm for scc and pass 1883: scc flag to `ccr_bit'. */ 1884: i = ccr_bit (x, 1); 1885: if (i == -1) 1886: output_operand_lossage ("invalid %%J code"); 1887: else 1.1.1.2 root 1888: /* If we want bit 31, write a shift count of zero, not 32. */ 1889: fprintf (file, "%d", i == 31 ? 0 : i + 1); 1.1 root 1890: return; 1891: 1892: case 'k': 1893: /* X must be a constant. Write the 1's complement of the 1894: constant. */ 1895: if (! INT_P (x)) 1896: output_operand_lossage ("invalid %%k value"); 1897: 1898: fprintf (file, "%d", ~ INT_LOWPART (x)); 1899: return; 1900: 1901: case 'L': 1902: /* Write second word of DImode or DFmode reference. Works on register 1903: or non-indexed memory only. */ 1904: if (GET_CODE (x) == REG) 1905: fprintf (file, "%d", REGNO (x) + 1); 1906: else if (GET_CODE (x) == MEM) 1907: { 1908: /* Handle possible auto-increment. Since it is pre-increment and 1909: we have already done it, we can just use an offset of four. */ 1910: if (GET_CODE (XEXP (x, 0)) == PRE_INC 1911: || GET_CODE (XEXP (x, 0)) == PRE_DEC) 1912: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4)); 1913: else 1914: output_address (plus_constant (XEXP (x, 0), 4)); 1915: } 1916: return; 1917: 1918: case 'm': 1919: /* MB value for a mask operand. */ 1920: if (! mask_operand (x, VOIDmode)) 1921: output_operand_lossage ("invalid %%m value"); 1922: 1923: val = INT_LOWPART (x); 1924: 1925: /* If the high bit is set and the low bit is not, the value is zero. 1926: If the high bit is zero, the value is the first 1 bit we find from 1927: the left. */ 1928: if (val < 0 && (val & 1) == 0) 1929: { 1930: fprintf (file, "0"); 1931: return; 1932: } 1933: else if (val >= 0) 1934: { 1935: for (i = 1; i < 32; i++) 1936: if ((val <<= 1) < 0) 1937: break; 1938: fprintf (file, "%d", i); 1939: return; 1940: } 1941: 1942: /* Otherwise, look for the first 0 bit from the right. The result is its 1943: number plus 1. We know the low-order bit is one. */ 1944: for (i = 0; i < 32; i++) 1945: if (((val >>= 1) & 1) == 0) 1946: break; 1947: 1948: /* If we ended in ...01, I would be 0. The correct value is 31, so 1949: we want 31 - i. */ 1950: fprintf (file, "%d", 31 - i); 1951: return; 1952: 1953: case 'M': 1954: /* ME value for a mask operand. */ 1955: if (! mask_operand (x, VOIDmode)) 1956: output_operand_lossage ("invalid %%m value"); 1957: 1958: val = INT_LOWPART (x); 1959: 1960: /* If the low bit is set and the high bit is not, the value is 31. 1961: If the low bit is zero, the value is the first 1 bit we find from 1962: the right. */ 1963: if ((val & 1) && val >= 0) 1964: { 1.1.1.2 root 1965: fputs ("31", file); 1.1 root 1966: return; 1967: } 1968: else if ((val & 1) == 0) 1969: { 1970: for (i = 0; i < 32; i++) 1971: if ((val >>= 1) & 1) 1972: break; 1973: 1974: /* If we had ....10, I would be 0. The result should be 1975: 30, so we need 30 - i. */ 1976: fprintf (file, "%d", 30 - i); 1977: return; 1978: } 1979: 1980: /* Otherwise, look for the first 0 bit from the left. The result is its 1981: number minus 1. We know the high-order bit is one. */ 1982: for (i = 0; i < 32; i++) 1983: if ((val <<= 1) >= 0) 1984: break; 1985: 1986: fprintf (file, "%d", i); 1987: return; 1988: 1989: case 'N': 1990: /* Write the number of elements in the vector times 4. */ 1991: if (GET_CODE (x) != PARALLEL) 1992: output_operand_lossage ("invalid %%N value"); 1993: 1994: fprintf (file, "%d", XVECLEN (x, 0) * 4); 1995: return; 1996: 1997: case 'O': 1998: /* Similar, but subtract 1 first. */ 1999: if (GET_CODE (x) != PARALLEL) 2000: output_operand_lossage ("invalid %%N value"); 2001: 2002: fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4); 2003: return; 2004: 2005: case 'p': 2006: /* X is a CONST_INT that is a power of two. Output the logarithm. */ 2007: if (! INT_P (x) 2008: || (i = exact_log2 (INT_LOWPART (x))) < 0) 2009: output_operand_lossage ("invalid %%p value"); 2010: 2011: fprintf (file, "%d", i); 2012: return; 2013: 2014: case 'P': 2015: /* The operand must be an indirect memory reference. The result 2016: is the register number. */ 2017: if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG 2018: || REGNO (XEXP (x, 0)) >= 32) 2019: output_operand_lossage ("invalid %%P value"); 2020: 2021: fprintf (file, "%d", REGNO (XEXP (x, 0))); 2022: return; 2023: 2024: case 'R': 2025: /* X is a CR register. Print the mask for `mtcrf'. */ 2026: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x))) 2027: output_operand_lossage ("invalid %%R value"); 2028: else 2029: fprintf (file, "%d", 128 >> (REGNO (x) - 68)); 2030: return; 2031: 2032: case 's': 2033: /* Low 5 bits of 32 - value */ 2034: if (! INT_P (x)) 2035: output_operand_lossage ("invalid %%s value"); 2036: 2037: fprintf (file, "%d", (32 - INT_LOWPART (x)) & 31); 2038: return; 2039: 2040: case 't': 2041: /* Write 12 if this jump operation will branch if true, 4 otherwise. 2042: All floating-point operations except NE branch true and integer 2043: EQ, LT, GT, LTU and GTU also branch true. */ 2044: if (GET_RTX_CLASS (GET_CODE (x)) != '<') 2045: output_operand_lossage ("invalid %%t value"); 2046: 2047: else if ((GET_MODE (XEXP (x, 0)) == CCFPmode 2048: && GET_CODE (x) != NE) 2049: || GET_CODE (x) == EQ 2050: || GET_CODE (x) == LT || GET_CODE (x) == GT 2051: || GET_CODE (x) == LTU || GET_CODE (x) == GTU) 1.1.1.2 root 2052: fputs ("12", file); 1.1 root 2053: else 1.1.1.2 root 2054: putc ('4', file); 1.1 root 2055: return; 2056: 2057: case 'T': 2058: /* Opposite of 't': write 4 if this jump operation will branch if true, 2059: 12 otherwise. */ 2060: if (GET_RTX_CLASS (GET_CODE (x)) != '<') 2061: output_operand_lossage ("invalid %%t value"); 2062: 2063: else if ((GET_MODE (XEXP (x, 0)) == CCFPmode 2064: && GET_CODE (x) != NE) 2065: || GET_CODE (x) == EQ 2066: || GET_CODE (x) == LT || GET_CODE (x) == GT 2067: || GET_CODE (x) == LTU || GET_CODE (x) == GTU) 1.1.1.2 root 2068: putc ('4', file); 1.1 root 2069: else 1.1.1.2 root 2070: fputs ("12", file); 1.1 root 2071: return; 2072: 2073: case 'u': 2074: /* High-order 16 bits of constant. */ 2075: if (! INT_P (x)) 2076: output_operand_lossage ("invalid %%u value"); 2077: 1.1.1.2 root 2078: fprintf (file, "0x%x", (INT_LOWPART (x) >> 16) & 0xffff); 1.1 root 2079: return; 2080: 2081: case 'U': 2082: /* Print `u' if this has an auto-increment or auto-decrement. */ 2083: if (GET_CODE (x) == MEM 2084: && (GET_CODE (XEXP (x, 0)) == PRE_INC 2085: || GET_CODE (XEXP (x, 0)) == PRE_DEC)) 1.1.1.2 root 2086: putc ('u', file); 1.1 root 2087: return; 2088: 2089: case 'w': 2090: /* If constant, low-order 16 bits of constant, signed. Otherwise, write 2091: normally. */ 2092: if (INT_P (x)) 2093: fprintf (file, "%d", 2094: (INT_LOWPART (x) & 0xffff) - 2 * (INT_LOWPART (x) & 0x8000)); 2095: else 2096: print_operand (file, x, 0); 2097: return; 2098: 2099: case 'W': 2100: /* If constant, low-order 16 bits of constant, unsigned. 2101: Otherwise, write normally. */ 2102: if (INT_P (x)) 2103: fprintf (file, "%d", INT_LOWPART (x) & 0xffff); 2104: else 2105: print_operand (file, x, 0); 2106: return; 2107: 2108: case 'X': 2109: if (GET_CODE (x) == MEM 2110: && LEGITIMATE_INDEXED_ADDRESS_P (XEXP (x, 0))) 1.1.1.2 root 2111: putc ('x', file); 1.1 root 2112: return; 2113: 2114: case 'Y': 2115: /* Like 'L', for third word of TImode */ 2116: if (GET_CODE (x) == REG) 2117: fprintf (file, "%d", REGNO (x) + 2); 2118: else if (GET_CODE (x) == MEM) 2119: { 2120: if (GET_CODE (XEXP (x, 0)) == PRE_INC 2121: || GET_CODE (XEXP (x, 0)) == PRE_DEC) 2122: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8)); 2123: else 2124: output_address (plus_constant (XEXP (x, 0), 8)); 2125: } 2126: return; 2127: 2128: case 'z': 2129: /* X is a SYMBOL_REF. Write out the name preceded by a 2130: period and without any trailing data in brackets. Used for function 1.1.1.4 root 2131: names. If we are configured for System V (or the embedded ABI) on 2132: the PowerPC, do not emit the period, since those systems do not use 2133: TOCs and the like. */ 1.1 root 2134: if (GET_CODE (x) != SYMBOL_REF) 2135: abort (); 2136: 1.1.1.4 root 2137: #ifndef USING_SVR4_H 1.1.1.2 root 2138: putc ('.', file); 1.1.1.4 root 2139: #endif 1.1 root 2140: RS6000_OUTPUT_BASENAME (file, XSTR (x, 0)); 2141: return; 2142: 2143: case 'Z': 2144: /* Like 'L', for last word of TImode. */ 2145: if (GET_CODE (x) == REG) 2146: fprintf (file, "%d", REGNO (x) + 3); 2147: else if (GET_CODE (x) == MEM) 2148: { 2149: if (GET_CODE (XEXP (x, 0)) == PRE_INC 2150: || GET_CODE (XEXP (x, 0)) == PRE_DEC) 2151: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12)); 2152: else 2153: output_address (plus_constant (XEXP (x, 0), 12)); 2154: } 2155: return; 2156: 2157: case 0: 2158: if (GET_CODE (x) == REG) 2159: fprintf (file, "%s", reg_names[REGNO (x)]); 2160: else if (GET_CODE (x) == MEM) 2161: { 2162: /* We need to handle PRE_INC and PRE_DEC here, since we need to 2163: know the width from the mode. */ 2164: if (GET_CODE (XEXP (x, 0)) == PRE_INC) 2165: fprintf (file, "%d(%d)", GET_MODE_SIZE (GET_MODE (x)), 2166: REGNO (XEXP (XEXP (x, 0), 0))); 2167: else if (GET_CODE (XEXP (x, 0)) == PRE_DEC) 2168: fprintf (file, "%d(%d)", - GET_MODE_SIZE (GET_MODE (x)), 2169: REGNO (XEXP (XEXP (x, 0), 0))); 2170: else 2171: output_address (XEXP (x, 0)); 2172: } 2173: else 2174: output_addr_const (file, x); 1.1.1.2 root 2175: return; 1.1 root 2176: 2177: default: 2178: output_operand_lossage ("invalid %%xn code"); 2179: } 2180: } 2181: 2182: /* Print the address of an operand. */ 2183: 2184: void 2185: print_operand_address (file, x) 2186: FILE *file; 2187: register rtx x; 2188: { 2189: if (GET_CODE (x) == REG) 1.1.1.4 root 2190: fprintf (file, "0(%s)", reg_names[ REGNO (x) ]); 1.1 root 2191: else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST) 2192: { 2193: output_addr_const (file, x); 1.1.1.2 root 2194: /* When TARGET_MINIMAL_TOC, use the indirected toc table pointer instead 2195: of the toc pointer. */ 1.1.1.4 root 2196: #ifdef TARGET_NO_TOC 2197: if (TARGET_NO_TOC) 2198: ; 1.1.1.2 root 2199: else 1.1.1.4 root 2200: #endif 2201: fprintf (file, "(%s)", reg_names[ TARGET_MINIMAL_TOC ? 30 : 2 ]); 1.1 root 2202: } 2203: else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG) 2204: { 2205: if (REGNO (XEXP (x, 0)) == 0) 1.1.1.4 root 2206: fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ], 2207: reg_names[ REGNO (XEXP (x, 0)) ]); 1.1 root 2208: else 1.1.1.4 root 2209: fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ], 2210: reg_names[ REGNO (XEXP (x, 1)) ]); 1.1 root 2211: } 2212: else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT) 1.1.1.4 root 2213: fprintf (file, "%d(%s)", INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]); 2214: else if (TARGET_ELF && !TARGET_64BIT && GET_CODE (x) == LO_SUM 2215: && GET_CODE (XEXP (x, 0)) == REG && CONSTANT_P (XEXP (x, 1))) 2216: { 2217: output_addr_const (file, XEXP (x, 1)); 2218: fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]); 2219: } 1.1 root 2220: else 2221: abort (); 2222: } 2223: 2224: /* This page contains routines that are used to determine what the function 2225: prologue and epilogue code will do and write them out. */ 2226: 2227: /* Return the first fixed-point register that is required to be saved. 32 if 2228: none. */ 2229: 2230: int 2231: first_reg_to_save () 2232: { 2233: int first_reg; 2234: 2235: /* Find lowest numbered live register. */ 2236: for (first_reg = 13; first_reg <= 31; first_reg++) 2237: if (regs_ever_live[first_reg]) 2238: break; 2239: 2240: /* If profiling, then we must save/restore every register that contains 2241: a parameter before/after the .mcount call. Use registers from 30 down 2242: to 23 to do this. Don't use the frame pointer in reg 31. 2243: 2244: For now, save enough room for all of the parameter registers. */ 1.1.1.4 root 2245: #ifndef USING_SVR4_H 1.1 root 2246: if (profile_flag) 2247: if (first_reg > 23) 2248: first_reg = 23; 1.1.1.4 root 2249: #endif 1.1 root 2250: 2251: return first_reg; 2252: } 2253: 2254: /* Similar, for FP regs. */ 2255: 2256: int 2257: first_fp_reg_to_save () 2258: { 2259: int first_reg; 2260: 2261: /* Find lowest numbered live register. */ 2262: for (first_reg = 14 + 32; first_reg <= 63; first_reg++) 2263: if (regs_ever_live[first_reg]) 2264: break; 2265: 2266: return first_reg; 2267: } 2268: 2269: /* Return non-zero if this function makes calls. */ 2270: 2271: int 2272: rs6000_makes_calls () 2273: { 2274: rtx insn; 2275: 2276: /* If we are profiling, we will be making a call to mcount. */ 2277: if (profile_flag) 2278: return 1; 2279: 2280: for (insn = get_insns (); insn; insn = next_insn (insn)) 2281: if (GET_CODE (insn) == CALL_INSN) 2282: return 1; 2283: 2284: return 0; 2285: } 2286: 1.1.1.4 root 2287: 2288: /* Calculate the stack information for the current function. This is 2289: complicated by having two separate calling sequences, the AIX calling 2290: sequence and the V.4 calling sequence. 2291: 2292: AIX stack frames look like: 2293: 2294: SP----> +---------------------------------------+ 2295: | back chain to caller | 0 2296: +---------------------------------------+ 2297: | saved CR | 4 2298: +---------------------------------------+ 2299: | saved LR | 8 2300: +---------------------------------------+ 2301: | reserved for compilers | 12 2302: +---------------------------------------+ 2303: | reserved for binders | 16 2304: +---------------------------------------+ 2305: | saved TOC pointer | 20 2306: +---------------------------------------+ 2307: | Parameter save area (P) | 24 2308: +---------------------------------------+ 2309: | Alloca space (A) | 24+P 2310: +---------------------------------------+ 2311: | Local variable space (L) | 24+P+A 2312: +---------------------------------------+ 2313: | Save area for GP registers (G) | 24+P+A+L 2314: +---------------------------------------+ 2315: | Save area for FP registers (F) | 24+P+A+L+G 2316: +---------------------------------------+ 2317: old SP->| back chain to caller's caller | 2318: +---------------------------------------+ 2319: 2320: V.4 stack frames look like: 2321: 2322: SP----> +---------------------------------------+ 2323: | back chain to caller | 0 2324: +---------------------------------------+ 2325: | caller's saved LR | 4 2326: +---------------------------------------+ 2327: | Parameter save area (P) | 8 2328: +---------------------------------------+ 2329: | Alloca space (A) | 8+P 2330: +---------------------------------------+ 2331: | Varargs save area (V) | 8+P+A 2332: +---------------------------------------+ 2333: | Local variable space (L) | 8+P+A+V 2334: +---------------------------------------+ 2335: | saved CR (C) | 8+P+A+V+L 2336: +---------------------------------------+ 2337: | Save area for GP registers (G) | 8+P+A+V+L+C 2338: +---------------------------------------+ 2339: | Save area for FP registers (F) | 8+P+A+V+L+C+G 2340: +---------------------------------------+ 2341: old SP->| back chain to caller's caller | 2342: +---------------------------------------+ 2343: */ 2344: 2345: rs6000_stack_t * 2346: rs6000_stack_info () 2347: { 2348: static rs6000_stack_t info, zero_info; 2349: rs6000_stack_t *info_ptr = &info; 2350: int reg_size = TARGET_64BIT ? 8 : 4; 2351: enum rs6000_abi abi; 2352: 2353: /* Zero all fields portably */ 2354: info = zero_info; 2355: 2356: /* Select which calling sequence */ 2357: #ifdef TARGET_V4_CALLS 2358: if (TARGET_V4_CALLS) 2359: abi = ABI_V4; 2360: else 2361: #endif 2362: abi = ABI_AIX; 1.1 root 2363: 1.1.1.4 root 2364: info_ptr->abi = abi; 2365: 2366: /* Calculate which registers need to be saved & save area size */ 2367: info_ptr->first_gp_reg_save = first_reg_to_save (); 2368: info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save); 2369: 2370: info_ptr->first_fp_reg_save = first_fp_reg_to_save (); 2371: info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save); 2372: 2373: /* Does this function call anything? */ 2374: info_ptr->calls_p = rs6000_makes_calls (); 2375: 2376: /* Determine if we need to save the link register */ 2377: if (regs_ever_live[65] || profile_flag 2378: #ifdef TARGET_RELOCATABLE 2379: || (TARGET_RELOCATABLE && (get_pool_size () != 0)) 2380: #endif 2381: || (info_ptr->first_fp_reg_save != 64 2382: && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save)) 2383: || (abi == ABI_V4 && current_function_calls_alloca) 2384: || info_ptr->calls_p) 2385: { 2386: info_ptr->lr_save_p = 1; 2387: regs_ever_live[65] = 1; 2388: } 2389: 2390: /* Determine if we need to save the condition code registers */ 2391: if (regs_ever_live[70] || regs_ever_live[71] || regs_ever_live[72]) 2392: { 2393: info_ptr->cr_save_p = 1; 2394: if (abi == ABI_V4) 2395: info_ptr->cr_size = reg_size; 2396: } 2397: 2398: /* Determine various sizes */ 2399: info_ptr->reg_size = reg_size; 2400: info_ptr->fixed_size = RS6000_SAVE_AREA; 2401: info_ptr->varargs_size = RS6000_VARARGS_AREA; 2402: info_ptr->vars_size = ALIGN (get_frame_size (), 8); 2403: info_ptr->parm_size = ALIGN (current_function_outgoing_args_size, 8); 2404: info_ptr->save_size = ALIGN (info_ptr->fp_size + info_ptr->gp_size + info_ptr->cr_size, 8); 2405: info_ptr->total_size = ALIGN (info_ptr->vars_size 2406: + info_ptr->parm_size 2407: + info_ptr->save_size 2408: + info_ptr->varargs_size 2409: + info_ptr->fixed_size, STACK_BOUNDARY / BITS_PER_UNIT); 2410: 2411: /* Determine if we need to allocate any stack frame. 2412: For AIX We need to push the stack if a frame pointer is needed (because 2413: the stack might be dynamically adjusted), if we are debugging, if the 2414: total stack size is more than 220 bytes, or if we make calls. 2415: 2416: For V.4 we don't have the stack cushion that AIX uses, but assume that 2417: the debugger can handle stackless frames. */ 2418: 2419: if (info_ptr->calls_p) 2420: info_ptr->push_p = 1; 2421: 2422: else if (abi == ABI_V4) 2423: info_ptr->push_p = (info_ptr->total_size > info_ptr->fixed_size 2424: || info_ptr->lr_save_p); 2425: 2426: else 2427: info_ptr->push_p = (frame_pointer_needed 2428: || write_symbols != NO_DEBUG 2429: || info_ptr->total_size > 220); 2430: 2431: /* Calculate the offsets */ 2432: info_ptr->fp_save_offset = - info_ptr->fp_size; 2433: info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size; 2434: switch (abi) 2435: { 2436: default: 2437: info_ptr->cr_save_offset = 4; 2438: info_ptr->lr_save_offset = 8; 2439: break; 2440: 2441: case ABI_V4: 2442: info_ptr->cr_save_offset = info_ptr->gp_save_offset - reg_size; 2443: info_ptr->lr_save_offset = reg_size; 2444: break; 2445: } 2446: 2447: /* Zero offsets if we're not saving those registers */ 2448: if (!info_ptr->fp_size) 2449: info_ptr->fp_save_offset = 0; 2450: 2451: if (!info_ptr->gp_size) 2452: info_ptr->gp_save_offset = 0; 2453: 2454: if (!info_ptr->lr_save_p) 2455: info_ptr->lr_save_offset = 0; 2456: 2457: if (!info_ptr->cr_save_p) 2458: info_ptr->cr_save_offset = 0; 2459: 2460: return info_ptr; 2461: } 2462: 2463: void 2464: debug_stack_info (info) 2465: rs6000_stack_t *info; 1.1 root 2466: { 1.1.1.4 root 2467: char *abi_string; 2468: 2469: if (!info) 2470: info = rs6000_stack_info (); 2471: 2472: fprintf (stderr, "\nStack information for function %s:\n", 2473: ((current_function_decl && DECL_NAME (current_function_decl)) 2474: ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl)) 2475: : "<unknown>")); 2476: 2477: switch (info->abi) 2478: { 2479: default: abi_string = "Unknown"; break; 2480: case ABI_NONE: abi_string = "NONE"; break; 2481: case ABI_AIX: abi_string = "AIX"; break; 2482: case ABI_V4: abi_string = "V.4"; break; 2483: } 2484: 2485: fprintf (stderr, "\tABI = %5s\n", abi_string); 2486: 2487: if (info->first_gp_reg_save != 32) 2488: fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save); 2489: 2490: if (info->first_fp_reg_save != 64) 2491: fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save); 2492: 2493: if (info->lr_save_p) 2494: fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p); 2495: 2496: if (info->cr_save_p) 2497: fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p); 2498: 2499: if (info->push_p) 2500: fprintf (stderr, "\tpush_p = %5d\n", info->push_p); 2501: 2502: if (info->calls_p) 2503: fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p); 2504: 2505: if (info->gp_save_offset) 2506: fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset); 1.1 root 2507: 1.1.1.4 root 2508: if (info->fp_save_offset) 2509: fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset); 1.1 root 2510: 1.1.1.4 root 2511: if (info->lr_save_offset) 2512: fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset); 2513: 2514: if (info->cr_save_offset) 2515: fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset); 2516: 2517: if (info->varargs_save_offset) 2518: fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset); 2519: 2520: if (info->total_size) 2521: fprintf (stderr, "\ttotal_size = %5d\n", info->total_size); 2522: 2523: if (info->varargs_size) 2524: fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size); 2525: 2526: if (info->vars_size) 2527: fprintf (stderr, "\tvars_size = %5d\n", info->vars_size); 2528: 2529: if (info->parm_size) 2530: fprintf (stderr, "\tparm_size = %5d\n", info->parm_size); 2531: 2532: if (info->fixed_size) 2533: fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size); 2534: 2535: if (info->gp_size) 2536: fprintf (stderr, "\tgp_size = %5d\n", info->gp_size); 2537: 2538: if (info->fp_size) 2539: fprintf (stderr, "\tfp_size = %5d\n", info->fp_size); 2540: 2541: if (info->cr_size) 2542: fprintf (stderr, "\tcr_size = %5d\n", info->cr_size); 2543: 2544: if (info->save_size) 2545: fprintf (stderr, "\tsave_size = %5d\n", info->save_size); 2546: 2547: if (info->reg_size != 4) 2548: fprintf (stderr, "\treg_size = %5d\n", info->reg_size); 2549: 2550: fprintf (stderr, "\n"); 1.1 root 2551: } 2552: 1.1.1.4 root 2553: 2554: 2555: #ifdef USING_SVR4_H 2556: /* Write out a System V.4 style traceback table before the prologue 2557: 2558: At present, only emit the basic tag table (ie, do not emit tag_types other 2559: than 0, which might use more than 1 tag word). 2560: 2561: The first tag word looks like: 2562: 2563: 0 1 2 3 2564: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2565: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2566: | 0 |ver| tag |e|s| alloca | # fprs | # gprs |s|l|c|f| 2567: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2568: 2569: */ 2570: 2571: void 2572: svr4_traceback (file, name, decl) 2573: FILE *file; 2574: tree name, decl; 2575: { 2576: rs6000_stack_t *info = rs6000_stack_info (); 2577: long tag; 2578: long version = 0; /* version number */ 2579: long tag_type = 0; /* function type */ 2580: long extended_tag = 0; /* additional tag words needed */ 2581: long spare = 0; /* reserved for future use */ 2582: long fpscr_max = 0; /* 1 if the function has a FPSCR save word */ 2583: long fpr_max = 64 - info->first_fp_reg_save; /* # of floating point registers saved */ 2584: long gpr_max = 32 - info->first_gp_reg_save; /* # of general purpose registers saved */ 2585: long alloca_reg; /* stack/frame register */ 2586: 2587: if (frame_pointer_needed) 2588: alloca_reg = 31; 2589: 2590: else if (info->push_p != 0) 2591: alloca_reg = 1; 2592: 2593: else 2594: alloca_reg = 0; 1.1 root 2595: 1.1.1.4 root 2596: tag = ((version << 24) 2597: | (tag_type << 21) 2598: | (extended_tag << 20) 2599: | (spare << 19) 2600: | (alloca_reg << 14) 2601: | (fpr_max << 9) 2602: | (gpr_max << 4) 2603: | (info->push_p << 3) 2604: | (info->lr_save_p << 2) 2605: | (info->cr_save_p << 1) 2606: | (fpscr_max << 0)); 2607: 2608: fprintf (file, "\t.long 0x%lx\n", tag); 2609: } 2610: 2611: #endif /* USING_SVR4_H */ 2612: 2613: /* Write function prologue. */ 1.1 root 2614: void 2615: output_prolog (file, size) 2616: FILE *file; 2617: int size; 2618: { 1.1.1.4 root 2619: rs6000_stack_t *info = rs6000_stack_info (); 2620: char *store_reg = (TARGET_64BIT) ? "\tstd %s,%d(%s)" : "\t{st|stw} %s,%d(%s)\n"; 1.1.1.5 ! root 2621: int reg_size = info->reg_size; ! 2622: int sp_reg = 1; ! 2623: int sp_offset = 0; 1.1 root 2624: 1.1.1.4 root 2625: if (TARGET_DEBUG_STACK) 2626: debug_stack_info (info); 1.1 root 2627: 2628: /* Write .extern for any function we will call to save and restore fp 2629: values. */ 1.1.1.4 root 2630: #ifndef USING_SVR4_H 2631: if (info->first_fp_reg_save < 62) 2632: fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n", 2633: SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX, 2634: RESTORE_FP_PREFIX, info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX); 2635: #endif 1.1 root 2636: 2637: /* Write .extern for truncation routines, if needed. */ 2638: if (rs6000_trunc_used && ! trunc_defined) 2639: { 1.1.1.3 root 2640: fprintf (file, "\t.extern .%s\n\t.extern .%s\n", 2641: RS6000_ITRUNC, RS6000_UITRUNC); 1.1 root 2642: trunc_defined = 1; 2643: } 1.1.1.4 root 2644: 1.1.1.3 root 2645: /* Write .extern for AIX common mode routines, if needed. */ 2646: if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined) 2647: { 2648: fputs ("\t.extern __mulh\n", file); 2649: fputs ("\t.extern __mull\n", file); 2650: fputs ("\t.extern __divss\n", file); 2651: fputs ("\t.extern __divus\n", file); 2652: fputs ("\t.extern __quoss\n", file); 2653: fputs ("\t.extern __quous\n", file); 2654: common_mode_defined = 1; 2655: } 1.1 root 2656: 1.1.1.5 ! root 2657: /* For V.4, update stack before we do any saving and set back pointer. */ ! 2658: #ifdef USING_SVR4_H ! 2659: if (info->push_p && TARGET_V4_CALLS) ! 2660: { ! 2661: if (info->total_size < 32767) ! 2662: { ! 2663: asm_fprintf (file, ! 2664: (!TARGET_64BIT) ? "\t{stu|stwu} %s,%d(%s)\n" : "\tstdu %s,%d(%s)\n", ! 2665: reg_names[1], - info->total_size, reg_names[1]); ! 2666: sp_offset = info->total_size; ! 2667: } ! 2668: else ! 2669: { ! 2670: int neg_size = - info->total_size; ! 2671: sp_reg = 12; ! 2672: asm_fprintf (file, "\tmr %s,%s\n", reg_names[12], reg_names[1]); ! 2673: asm_fprintf (file, "\t{liu|lis} %s,%d\n\t{oril|ori} %s,%s,%d\n", ! 2674: reg_names[0], (neg_size >> 16) & 0xffff, ! 2675: reg_names[0], reg_names[0], neg_size & 0xffff); ! 2676: asm_fprintf (file, ! 2677: (!TARGET_64BIT) ? "\t{stux|stwux} %s,%s,%s\n" : "\tstdux %s,%s,%s\n", ! 2678: reg_names[1], reg_names[1], reg_names[0]); ! 2679: } ! 2680: } ! 2681: #endif ! 2682: 1.1 root 2683: /* If we use the link register, get it into r0. */ 1.1.1.4 root 2684: if (info->lr_save_p) 2685: asm_fprintf (file, "\tmflr %s\n", reg_names[0]); 1.1 root 2686: 2687: /* If we need to save CR, put it into r12. */ 1.1.1.5 ! root 2688: if (info->cr_save_p && sp_reg != 12) 1.1.1.4 root 2689: asm_fprintf (file, "\tmfcr %s\n", reg_names[12]); 1.1 root 2690: 2691: /* Do any required saving of fpr's. If only one or two to save, do it 1.1.1.2 root 2692: ourself. Otherwise, call function. Note that since they are statically 2693: linked, we do not need a nop following them. */ 1.1.1.4 root 2694: if (FP_SAVE_INLINE (info->first_fp_reg_save)) 2695: { 2696: int regno = info->first_fp_reg_save; 1.1.1.5 ! root 2697: int loc = info->fp_save_offset + sp_offset; 1.1.1.4 root 2698: 2699: for ( ; regno < 64; regno++, loc += 8) 1.1.1.5 ! root 2700: asm_fprintf (file, "\tstfd %s,%d(%s)\n", reg_names[regno], loc, reg_names[sp_reg]); 1.1.1.4 root 2701: } 2702: else if (info->first_fp_reg_save != 64) 2703: asm_fprintf (file, "\tbl %s%d%s\n", SAVE_FP_PREFIX, 2704: info->first_fp_reg_save - 32, SAVE_FP_SUFFIX); 1.1 root 2705: 2706: /* Now save gpr's. */ 1.1.1.4 root 2707: if (! TARGET_MULTIPLE || info->first_gp_reg_save == 31 || TARGET_64BIT) 1.1.1.2 root 2708: { 1.1.1.4 root 2709: int regno = info->first_gp_reg_save; 1.1.1.5 ! root 2710: int loc = info->gp_save_offset + sp_offset; 1.1.1.2 root 2711: 1.1.1.4 root 2712: for ( ; regno < 32; regno++, loc += reg_size) 1.1.1.5 ! root 2713: asm_fprintf (file, store_reg, reg_names[regno], loc, reg_names[sp_reg]); 1.1.1.2 root 2714: } 2715: 1.1.1.4 root 2716: else if (info->first_gp_reg_save != 32) 2717: asm_fprintf (file, "\t{stm|stmw} %s,%d(%s)\n", 2718: reg_names[info->first_gp_reg_save], 1.1.1.5 ! root 2719: info->gp_save_offset + sp_offset, ! 2720: reg_names[sp_reg]); 1.1 root 2721: 2722: /* Save lr if we used it. */ 1.1.1.4 root 2723: if (info->lr_save_p) 1.1.1.5 ! root 2724: asm_fprintf (file, store_reg, reg_names[0], info->lr_save_offset + sp_offset, ! 2725: reg_names[sp_reg]); 1.1 root 2726: 2727: /* Save CR if we use any that must be preserved. */ 1.1.1.4 root 2728: if (info->cr_save_p) 1.1.1.5 ! root 2729: { ! 2730: if (sp_reg == 12) /* If r12 is used to hold the original sp, copy cr now */ ! 2731: { ! 2732: asm_fprintf (file, "\tmfcr %s\n", reg_names[0]); ! 2733: asm_fprintf (file, store_reg, reg_names[0], ! 2734: info->cr_save_offset + sp_offset, ! 2735: reg_names[sp_reg]); ! 2736: } ! 2737: else ! 2738: asm_fprintf (file, store_reg, reg_names[12], info->cr_save_offset + sp_offset, ! 2739: reg_names[sp_reg]); ! 2740: } 1.1 root 2741: 1.1.1.5 ! root 2742: /* Update stack and set back pointer and we have already done so for V.4. */ ! 2743: if (info->push_p ! 2744: #ifdef USING_SVR4_H ! 2745: && TARGET_AIX_CALLS ! 2746: #endif ! 2747: ) 1.1 root 2748: { 1.1.1.4 root 2749: if (info->total_size < 32767) 2750: asm_fprintf (file, 2751: (TARGET_64BIT) ? "\tstdu %s,%d(%s)\n" : "\t{stu|stwu} %s,%d(%s)\n", 2752: reg_names[1], - info->total_size, reg_names[1]); 1.1 root 2753: else 2754: { 1.1.1.4 root 2755: int neg_size = - info->total_size; 2756: asm_fprintf (file, "\t{liu|lis} %s,%d\n\t{oril|ori} %s,%s,%d\n", 2757: reg_names[0], (neg_size >> 16) & 0xffff, 2758: reg_names[0], reg_names[0], neg_size & 0xffff); 2759: asm_fprintf (file, 2760: (TARGET_64BIT) ? "\tstdux %s,%s,%s\n" : "\t{stux|stwux} %s,%s,%s\n", 2761: reg_names[1], reg_names[1], reg_names[0]); 1.1 root 2762: } 2763: } 2764: 2765: /* Set frame pointer, if needed. */ 2766: if (frame_pointer_needed) 1.1.1.4 root 2767: asm_fprintf (file, "\tmr %s,%s\n", reg_names[31], reg_names[1]); 1.1.1.2 root 2768: 2769: /* If TARGET_MINIMAL_TOC, and the constant pool is needed, then load the 2770: TOC_TABLE address into register 30. */ 1.1.1.4 root 2771: if (TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0) 1.1.1.3 root 2772: { 1.1.1.4 root 2773: char buf[256]; 1.1.1.3 root 2774: 1.1.1.4 root 2775: #ifdef USING_SVR4_H 2776: if (TARGET_RELOCATABLE) 2777: { 2778: ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno); 2779: fprintf (file, "\tbl "); 2780: assemble_name (file, buf); 2781: fprintf (file, "\n"); 2782: 2783: ASM_OUTPUT_INTERNAL_LABEL (file, "LCF", rs6000_pic_labelno); 2784: fprintf (file, "\tmflr %s\n", reg_names[30]); 2785: 2786: if (TARGET_POWERPC64) 2787: fprintf (file, "\tld"); 2788: else if (TARGET_NEW_MNEMONICS) 2789: fprintf (file, "\tlwz"); 2790: else 2791: fprintf (file, "\tl"); 2792: 2793: fprintf (file, " %s,(", reg_names[0]); 2794: ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno); 2795: assemble_name (file, buf); 2796: fprintf (file, "-"); 2797: ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno); 2798: assemble_name (file, buf); 2799: fprintf (file, ")(%s)\n", reg_names[30]); 2800: asm_fprintf (file, "\t{cax|add} %s,%s,%s\n", 2801: reg_names[30], reg_names[0], reg_names[30]); 2802: rs6000_pic_labelno++; 2803: } 2804: else if (!TARGET_64BIT) 2805: { 2806: ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1); 2807: asm_fprintf (file, "\t{cau|addis} %s,%s,", reg_names[30], reg_names[0]); 2808: assemble_name (file, buf); 2809: asm_fprintf (file, "@ha\n"); 2810: if (TARGET_NEW_MNEMONICS) 2811: { 2812: asm_fprintf (file, "\taddi %s,%s,", reg_names[30], reg_names[30]); 2813: assemble_name (file, buf); 2814: asm_fprintf (file, "@l\n"); 2815: } 2816: else 2817: { 2818: asm_fprintf (file, "\tcal %s,", reg_names[30]); 2819: assemble_name (file, buf); 2820: asm_fprintf (file, "@l(%s)\n", reg_names[30]); 2821: } 2822: } 2823: else 2824: abort (); 2825: 2826: #else /* !USING_SVR4_H */ 1.1.1.3 root 2827: ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 0); 1.1.1.4 root 2828: asm_fprintf (file, "\t{l|lwz} %s,", reg_names[30]); 1.1.1.3 root 2829: assemble_name (file, buf); 1.1.1.4 root 2830: asm_fprintf (file, "(%s)\n", reg_names[2]); 2831: #endif /* USING_SVR4_H */ 1.1.1.3 root 2832: } 1.1 root 2833: } 2834: 2835: /* Write function epilogue. */ 2836: 2837: void 2838: output_epilog (file, size) 2839: FILE *file; 2840: int size; 2841: { 1.1.1.4 root 2842: rs6000_stack_t *info = rs6000_stack_info (); 2843: char *load_reg = (TARGET_64BIT) ? "\tld %s,%d(%s)" : "\t{l|lwz} %s,%d(%s)\n"; 1.1 root 2844: rtx insn = get_last_insn (); 1.1.1.5 ! root 2845: int sp_reg = 1; ! 2846: int sp_offset = 0; 1.1.1.4 root 2847: int i; 1.1 root 2848: 1.1.1.4 root 2849: /* Forget about any temporaries created */ 2850: for (i = 0; i < NUM_MACHINE_MODES; i++) 2851: stack_temps[i] = NULL_RTX; 1.1 root 2852: 2853: /* If the last insn was a BARRIER, we don't have to write anything except 2854: the trace table. */ 2855: if (GET_CODE (insn) == NOTE) 2856: insn = prev_nonnote_insn (insn); 2857: if (insn == 0 || GET_CODE (insn) != BARRIER) 2858: { 2859: /* If we have a frame pointer, a call to alloca, or a large stack 2860: frame, restore the old stack pointer using the backchain. Otherwise, 2861: we know what size to update it with. */ 2862: if (frame_pointer_needed || current_function_calls_alloca 1.1.1.4 root 2863: || info->total_size > 32767) 1.1.1.5 ! root 2864: { ! 2865: /* Under V.4, don't reset the stack pointer until after we're done ! 2866: loading the saved registers. */ ! 2867: #ifdef USING_SVR4_H ! 2868: if (TARGET_V4_CALLS) ! 2869: sp_reg = 11; ! 2870: #endif ! 2871: ! 2872: asm_fprintf (file, load_reg, reg_names[sp_reg], 0, reg_names[1]); ! 2873: } 1.1.1.4 root 2874: else if (info->push_p) 2875: { 1.1.1.5 ! root 2876: #ifdef USING_SVR4_H ! 2877: if (TARGET_V4_CALLS) ! 2878: sp_offset = info->total_size; ! 2879: else ! 2880: #endif 1.1.1.4 root 2881: if (TARGET_NEW_MNEMONICS) 2882: asm_fprintf (file, "\taddi %s,%s,%d\n", reg_names[1], reg_names[1], info->total_size); 2883: else 2884: asm_fprintf (file, "\tcal %s,%d(%s)\n", reg_names[1], info->total_size, reg_names[1]); 2885: } 1.1 root 2886: 2887: /* Get the old lr if we saved it. */ 1.1.1.4 root 2888: if (info->lr_save_p) 1.1.1.5 ! root 2889: asm_fprintf (file, load_reg, reg_names[0], info->lr_save_offset + sp_offset, reg_names[sp_reg]); 1.1 root 2890: 2891: /* Get the old cr if we saved it. */ 1.1.1.4 root 2892: if (info->cr_save_p) 1.1.1.5 ! root 2893: asm_fprintf (file, load_reg, reg_names[12], info->cr_save_offset + sp_offset, reg_names[sp_reg]); 1.1 root 2894: 2895: /* Set LR here to try to overlap restores below. */ 1.1.1.4 root 2896: if (info->lr_save_p) 2897: asm_fprintf (file, "\tmtlr %s\n", reg_names[0]); 1.1 root 2898: 2899: /* Restore gpr's. */ 1.1.1.4 root 2900: if (! TARGET_MULTIPLE || info->first_gp_reg_save == 31 || TARGET_64BIT) 1.1.1.2 root 2901: { 1.1.1.4 root 2902: int regno = info->first_gp_reg_save; 1.1.1.5 ! root 2903: int loc = info->gp_save_offset + sp_offset; 1.1.1.4 root 2904: int reg_size = (TARGET_64BIT) ? 8 : 4; 1.1.1.2 root 2905: 1.1.1.4 root 2906: for ( ; regno < 32; regno++, loc += reg_size) 1.1.1.5 ! root 2907: asm_fprintf (file, load_reg, reg_names[regno], loc, reg_names[sp_reg]); 1.1.1.2 root 2908: } 2909: 1.1.1.4 root 2910: else if (info->first_gp_reg_save != 32) 2911: asm_fprintf (file, "\t{lm|lmw} %s,%d(%s)\n", 2912: reg_names[info->first_gp_reg_save], 1.1.1.5 ! root 2913: info->gp_save_offset + sp_offset, ! 2914: reg_names[sp_reg]); 1.1 root 2915: 2916: /* Restore fpr's if we can do it without calling a function. */ 1.1.1.4 root 2917: if (FP_SAVE_INLINE (info->first_fp_reg_save)) 2918: { 2919: int regno = info->first_fp_reg_save; 1.1.1.5 ! root 2920: int loc = info->fp_save_offset + sp_offset; 1.1.1.4 root 2921: 2922: for ( ; regno < 64; regno++, loc += 8) 1.1.1.5 ! root 2923: asm_fprintf (file, "\tlfd %s,%d(%s)\n", reg_names[regno], loc, reg_names[sp_reg]); 1.1.1.4 root 2924: } 1.1 root 2925: 2926: /* If we saved cr, restore it here. Just those of cr2, cr3, and cr4 2927: that were used. */ 1.1.1.4 root 2928: if (info->cr_save_p) 2929: asm_fprintf (file, "\tmtcrf %d,%s\n", 1.1.1.2 root 2930: (regs_ever_live[70] != 0) * 0x20 2931: + (regs_ever_live[71] != 0) * 0x10 1.1.1.4 root 2932: + (regs_ever_live[72] != 0) * 0x8, reg_names[12]); 1.1 root 2933: 1.1.1.5 ! root 2934: /* If this is V.4, unwind the stack pointer after all of the loads have been done */ ! 2935: #ifdef USING_SVR4_H ! 2936: if (sp_offset) ! 2937: { ! 2938: if (TARGET_NEW_MNEMONICS) ! 2939: asm_fprintf (file, "\taddi %s,%s,%d\n", reg_names[1], reg_names[1], sp_offset); ! 2940: else ! 2941: asm_fprintf (file, "\tcal %s,%d(%s)\n", reg_names[1], sp_offset, reg_names[1]); ! 2942: } ! 2943: else if (sp_reg != 1) ! 2944: asm_fprintf (file, "\tmr %s,%s\n", reg_names[1], reg_names[sp_reg]); ! 2945: #endif ! 2946: 1.1 root 2947: /* If we have to restore more than two FP registers, branch to the 2948: restore function. It will return to our caller. */ 1.1.1.4 root 2949: if (info->first_fp_reg_save != 64 && !FP_SAVE_INLINE (info->first_fp_reg_save)) 2950: asm_fprintf (file, "\tb %s%d%s\n", RESTORE_FP_PREFIX, 2951: info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX); 1.1 root 2952: else 1.1.1.2 root 2953: asm_fprintf (file, "\t{br|blr}\n"); 1.1 root 2954: } 2955: 2956: /* Output a traceback table here. See /usr/include/sys/debug.h for info 1.1.1.3 root 2957: on its format. 1.1 root 2958: 1.1.1.3 root 2959: We don't output a traceback table if -finhibit-size-directive was 2960: used. The documentation for -finhibit-size-directive reads 2961: ``don't output a @code{.size} assembler directive, or anything 2962: else that would cause trouble if the function is split in the 2963: middle, and the two halves are placed at locations far apart in 2964: memory.'' The traceback table has this property, since it 2965: includes the offset from the start of the function to the 1.1.1.4 root 2966: traceback table itself. 2967: 2968: System V.4 Powerpc's (and the embedded ABI derived from it) use a 2969: different traceback table located before the prologue. */ 2970: #ifndef USING_SVR4_H 1.1.1.3 root 2971: if (! flag_inhibit_size_directive) 2972: { 2973: char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); 2974: int fixed_parms, float_parms, parm_info; 2975: int i; 2976: 2977: /* Need label immediately before tbtab, so we can compute its offset 2978: from the function start. */ 2979: if (*fname == '*') 2980: ++fname; 2981: ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT"); 2982: ASM_OUTPUT_LABEL (file, fname); 2983: 2984: /* The .tbtab pseudo-op can only be used for the first eight 2985: expressions, since it can't handle the possibly variable 2986: length fields that follow. However, if you omit the optional 2987: fields, the assembler outputs zeros for all optional fields 2988: anyways, giving each variable length field is minimum length 2989: (as defined in sys/debug.h). Thus we can not use the .tbtab 2990: pseudo-op at all. */ 2991: 2992: /* An all-zero word flags the start of the tbtab, for debuggers 2993: that have to find it by searching forward from the entry 2994: point or from the current pc. */ 2995: fprintf (file, "\t.long 0\n"); 2996: 2997: /* Tbtab format type. Use format type 0. */ 2998: fprintf (file, "\t.byte 0,"); 2999: 3000: /* Language type. Unfortunately, there doesn't seem to be any 3001: official way to get this info, so we use language_string. C 3002: is 0. C++ is 9. No number defined for Obj-C, so use the 3003: value for C for now. */ 3004: if (! strcmp (language_string, "GNU C") 3005: || ! strcmp (language_string, "GNU Obj-C")) 3006: i = 0; 3007: else if (! strcmp (language_string, "GNU F77")) 3008: i = 1; 3009: else if (! strcmp (language_string, "GNU Ada")) 3010: i = 3; 3011: else if (! strcmp (language_string, "GNU PASCAL")) 3012: i = 2; 3013: else if (! strcmp (language_string, "GNU C++")) 3014: i = 9; 3015: else 3016: abort (); 3017: fprintf (file, "%d,", i); 1.1 root 3018: 1.1.1.3 root 3019: /* 8 single bit fields: global linkage (not set for C extern linkage, 3020: apparently a PL/I convention?), out-of-line epilogue/prologue, offset 3021: from start of procedure stored in tbtab, internal function, function 3022: has controlled storage, function has no toc, function uses fp, 3023: function logs/aborts fp operations. */ 3024: /* Assume that fp operations are used if any fp reg must be saved. */ 1.1.1.4 root 3025: fprintf (file, "%d,", (1 << 5) | ((info->first_fp_reg_save != 64) << 1)); 1.1.1.3 root 3026: 3027: /* 6 bitfields: function is interrupt handler, name present in 3028: proc table, function calls alloca, on condition directives 3029: (controls stack walks, 3 bits), saves condition reg, saves 3030: link reg. */ 3031: /* The `function calls alloca' bit seems to be set whenever reg 31 is 3032: set up as a frame pointer, even when there is no alloca call. */ 3033: fprintf (file, "%d,", 3034: ((1 << 6) | (frame_pointer_needed << 5) 1.1.1.4 root 3035: | (info->cr_save_p << 1) | (info->lr_save_p))); 1.1.1.3 root 3036: 3037: /* 3 bitfields: saves backchain, spare bit, number of fpr saved 3038: (6 bits). */ 3039: fprintf (file, "%d,", 1.1.1.4 root 3040: (info->push_p << 7) | (64 - info->first_fp_reg_save)); 1.1.1.3 root 3041: 3042: /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */ 3043: fprintf (file, "%d,", (32 - first_reg_to_save ())); 3044: 3045: { 3046: /* Compute the parameter info from the function decl argument 3047: list. */ 3048: tree decl; 3049: int next_parm_info_bit; 3050: 3051: next_parm_info_bit = 31; 3052: parm_info = 0; 3053: fixed_parms = 0; 3054: float_parms = 0; 1.1 root 3055: 1.1.1.3 root 3056: for (decl = DECL_ARGUMENTS (current_function_decl); 3057: decl; decl = TREE_CHAIN (decl)) 3058: { 3059: rtx parameter = DECL_INCOMING_RTL (decl); 3060: enum machine_mode mode = GET_MODE (parameter); 3061: 3062: if (GET_CODE (parameter) == REG) 3063: { 3064: if (GET_MODE_CLASS (mode) == MODE_FLOAT) 3065: { 3066: int bits; 3067: 3068: float_parms++; 3069: 3070: if (mode == SFmode) 3071: bits = 0x2; 3072: else if (mode == DFmode) 3073: bits = 0x3; 3074: else 3075: abort (); 3076: 3077: /* If only one bit will fit, don't or in this entry. */ 3078: if (next_parm_info_bit > 0) 3079: parm_info |= (bits << (next_parm_info_bit - 1)); 3080: next_parm_info_bit -= 2; 3081: } 3082: else 3083: { 3084: fixed_parms += ((GET_MODE_SIZE (mode) 3085: + (UNITS_PER_WORD - 1)) 3086: / UNITS_PER_WORD); 3087: next_parm_info_bit -= 1; 3088: } 3089: } 3090: } 3091: } 1.1 root 3092: 1.1.1.3 root 3093: /* Number of fixed point parameters. */ 3094: /* This is actually the number of words of fixed point parameters; thus 3095: an 8 byte struct counts as 2; and thus the maximum value is 8. */ 3096: fprintf (file, "%d,", fixed_parms); 3097: 3098: /* 2 bitfields: number of floating point parameters (7 bits), parameters 3099: all on stack. */ 3100: /* This is actually the number of fp registers that hold parameters; 3101: and thus the maximum value is 13. */ 3102: /* Set parameters on stack bit if parameters are not in their original 3103: registers, regardless of whether they are on the stack? Xlc 3104: seems to set the bit when not optimizing. */ 3105: fprintf (file, "%d\n", ((float_parms << 1) | (! optimize))); 3106: 3107: /* Optional fields follow. Some are variable length. */ 3108: 3109: /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float, 3110: 11 double float. */ 3111: /* There is an entry for each parameter in a register, in the order that 3112: they occur in the parameter list. Any intervening arguments on the 3113: stack are ignored. If the list overflows a long (max possible length 3114: 34 bits) then completely leave off all elements that don't fit. */ 3115: /* Only emit this long if there was at least one parameter. */ 3116: if (fixed_parms || float_parms) 3117: fprintf (file, "\t.long %d\n", parm_info); 3118: 3119: /* Offset from start of code to tb table. */ 3120: fprintf (file, "\t.long "); 3121: ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT"); 3122: RS6000_OUTPUT_BASENAME (file, fname); 3123: fprintf (file, "-."); 3124: RS6000_OUTPUT_BASENAME (file, fname); 3125: fprintf (file, "\n"); 3126: 3127: /* Interrupt handler mask. */ 3128: /* Omit this long, since we never set the interrupt handler bit 3129: above. */ 3130: 3131: /* Number of CTL (controlled storage) anchors. */ 3132: /* Omit this long, since the has_ctl bit is never set above. */ 3133: 3134: /* Displacement into stack of each CTL anchor. */ 3135: /* Omit this list of longs, because there are no CTL anchors. */ 3136: 3137: /* Length of function name. */ 3138: fprintf (file, "\t.short %d\n", strlen (fname)); 3139: 3140: /* Function name. */ 3141: assemble_string (fname, strlen (fname)); 3142: 3143: /* Register for alloca automatic storage; this is always reg 31. 3144: Only emit this if the alloca bit was set above. */ 3145: if (frame_pointer_needed) 3146: fprintf (file, "\t.byte 31\n"); 3147: } 1.1.1.4 root 3148: #endif /* !USING_SVR4_H */ 3149: 3150: /* Reset varargs indicator */ 3151: rs6000_sysv_varargs_p = 0; 1.1 root 3152: } 3153: 3154: /* Output a TOC entry. We derive the entry name from what is 3155: being written. */ 3156: 3157: void 3158: output_toc (file, x, labelno) 3159: FILE *file; 3160: rtx x; 3161: int labelno; 3162: { 3163: char buf[256]; 3164: char *name = buf; 3165: rtx base = x; 3166: int offset = 0; 3167: 1.1.1.4 root 3168: if (TARGET_NO_TOC) 3169: abort (); 3170: 3171: /* if we're going to put a double constant in the TOC, make sure it's 3172: aligned properly when strict alignment is on. */ 3173: if (GET_CODE (x) == CONST_DOUBLE 3174: && STRICT_ALIGNMENT 3175: && GET_MODE (x) == DFmode 3176: && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) { 3177: ASM_OUTPUT_ALIGN (file, 3); 3178: } 3179: 3180: 3181: #ifdef USING_SVR4_H 3182: if (TARGET_MINIMAL_TOC) 3183: { 3184: ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC"); 3185: fprintf (file, "%d = .-", labelno); 3186: ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LCTOC"); 3187: fprintf (file, "1\n"); 3188: } 3189: else 3190: #endif /* USING_SVR4_H */ 3191: ASM_OUTPUT_INTERNAL_LABEL (file, "LC", labelno); 1.1 root 3192: 1.1.1.2 root 3193: /* Handle FP constants specially. Note that if we have a minimal 3194: TOC, things we put here aren't actually in the TOC, so we can allow 3195: FP constants. */ 1.1 root 3196: if (GET_CODE (x) == CONST_DOUBLE 3197: && GET_MODE (x) == DFmode 1.1.1.2 root 3198: && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) 1.1 root 3199: { 1.1.1.4 root 3200: REAL_VALUE_TYPE r; 3201: long l[2]; 3202: 3203: REAL_VALUE_FROM_CONST_DOUBLE (r, x); 3204: REAL_VALUE_TO_TARGET_DOUBLE (r, l); 1.1.1.2 root 3205: if (TARGET_MINIMAL_TOC) 1.1.1.4 root 3206: fprintf (file, "\t.long %ld\n\t.long %ld\n", l[0], l[1]); 1.1.1.2 root 3207: else 1.1.1.4 root 3208: fprintf (file, "\t.tc FD_%lx_%lx[TC],%ld,%ld\n", 3209: l[0], l[1], l[0], l[1]); 1.1 root 3210: return; 3211: } 3212: else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode 1.1.1.2 root 3213: && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) 1.1 root 3214: { 3215: rtx val = operand_subword (x, 0, 0, SFmode); 3216: 3217: if (val == 0 || GET_CODE (val) != CONST_INT) 3218: abort (); 3219: 1.1.1.2 root 3220: if (TARGET_MINIMAL_TOC) 3221: fprintf (file, "\t.long %d\n", INTVAL (val)); 3222: else 3223: fprintf (file, "\t.tc FS_%x[TC],%d\n", INTVAL (val), INTVAL (val)); 1.1 root 3224: return; 3225: } 3226: 3227: if (GET_CODE (x) == CONST) 3228: { 3229: base = XEXP (XEXP (x, 0), 0); 3230: offset = INTVAL (XEXP (XEXP (x, 0), 1)); 3231: } 3232: 3233: if (GET_CODE (base) == SYMBOL_REF) 3234: name = XSTR (base, 0); 3235: else if (GET_CODE (base) == LABEL_REF) 3236: ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0))); 3237: else if (GET_CODE (base) == CODE_LABEL) 3238: ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base)); 3239: else 3240: abort (); 3241: 1.1.1.2 root 3242: if (TARGET_MINIMAL_TOC) 3243: fprintf (file, "\t.long "); 3244: else 3245: { 3246: fprintf (file, "\t.tc "); 3247: RS6000_OUTPUT_BASENAME (file, name); 1.1 root 3248: 1.1.1.2 root 3249: if (offset < 0) 3250: fprintf (file, ".N%d", - offset); 3251: else if (offset) 3252: fprintf (file, ".P%d", offset); 1.1 root 3253: 1.1.1.2 root 3254: fprintf (file, "[TC],"); 3255: } 1.1 root 3256: output_addr_const (file, x); 3257: fprintf (file, "\n"); 3258: } 3259: 3260: /* Output an assembler pseudo-op to write an ASCII string of N characters 3261: starting at P to FILE. 3262: 3263: On the RS/6000, we have to do this using the .byte operation and 3264: write out special characters outside the quoted string. 3265: Also, the assembler is broken; very long strings are truncated, 3266: so we must artificially break them up early. */ 3267: 3268: void 3269: output_ascii (file, p, n) 3270: FILE *file; 3271: char *p; 3272: int n; 3273: { 3274: char c; 3275: int i, count_string; 3276: char *for_string = "\t.byte \""; 3277: char *for_decimal = "\t.byte "; 3278: char *to_close = NULL; 3279: 3280: count_string = 0; 3281: for (i = 0; i < n; i++) 3282: { 3283: c = *p++; 3284: if (c >= ' ' && c < 0177) 3285: { 3286: if (for_string) 3287: fputs (for_string, file); 3288: putc (c, file); 3289: 3290: /* Write two quotes to get one. */ 3291: if (c == '"') 3292: { 3293: putc (c, file); 3294: ++count_string; 3295: } 3296: 3297: for_string = NULL; 3298: for_decimal = "\"\n\t.byte "; 3299: to_close = "\"\n"; 3300: ++count_string; 3301: 3302: if (count_string >= 512) 3303: { 3304: fputs (to_close, file); 3305: 3306: for_string = "\t.byte \""; 3307: for_decimal = "\t.byte "; 3308: to_close = NULL; 3309: count_string = 0; 3310: } 3311: } 3312: else 3313: { 3314: if (for_decimal) 3315: fputs (for_decimal, file); 3316: fprintf (file, "%d", c); 3317: 3318: for_string = "\n\t.byte \""; 3319: for_decimal = ", "; 3320: to_close = "\n"; 3321: count_string = 0; 3322: } 3323: } 3324: 3325: /* Now close the string if we have written one. Then end the line. */ 3326: if (to_close) 3327: fprintf (file, to_close); 3328: } 3329: 3330: /* Generate a unique section name for FILENAME for a section type 3331: represented by SECTION_DESC. Output goes into BUF. 3332: 3333: SECTION_DESC can be any string, as long as it is different for each 3334: possible section type. 3335: 3336: We name the section in the same manner as xlc. The name begins with an 3337: underscore followed by the filename (after stripping any leading directory 3338: names) with the last period replaced by the string SECTION_DESC. If 3339: FILENAME does not contain a period, SECTION_DESC is appended to the end of 3340: the name. */ 3341: 3342: void 3343: rs6000_gen_section_name (buf, filename, section_desc) 3344: char **buf; 3345: char *filename; 3346: char *section_desc; 3347: { 3348: char *q, *after_last_slash, *last_period; 3349: char *p; 3350: int len; 3351: 3352: after_last_slash = filename; 3353: for (q = filename; *q; q++) 3354: { 3355: if (*q == '/') 3356: after_last_slash = q + 1; 3357: else if (*q == '.') 3358: last_period = q; 3359: } 3360: 3361: len = strlen (after_last_slash) + strlen (section_desc) + 2; 3362: *buf = (char *) permalloc (len); 3363: 3364: p = *buf; 3365: *p++ = '_'; 3366: 3367: for (q = after_last_slash; *q; q++) 3368: { 3369: if (q == last_period) 3370: { 3371: strcpy (p, section_desc); 3372: p += strlen (section_desc); 3373: } 3374: 3375: else if (isalnum (*q)) 3376: *p++ = *q; 3377: } 3378: 3379: if (last_period == 0) 3380: strcpy (p, section_desc); 3381: else 3382: *p = '\0'; 3383: } 3384: 3385: /* Write function profiler code. */ 3386: 3387: void 3388: output_function_profiler (file, labelno) 3389: FILE *file; 3390: int labelno; 3391: { 1.1.1.4 root 3392: #ifdef USING_SVR4_H 3393: abort (); 3394: #else 1.1 root 3395: /* The last used parameter register. */ 3396: int last_parm_reg; 3397: int i, j; 1.1.1.3 root 3398: char buf[100]; 1.1 root 3399: 3400: /* Set up a TOC entry for the profiler label. */ 3401: toc_section (); 1.1.1.3 root 3402: ASM_OUTPUT_INTERNAL_LABEL (file, "LPC", labelno); 3403: ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno); 1.1.1.2 root 3404: if (TARGET_MINIMAL_TOC) 1.1.1.3 root 3405: { 3406: fprintf (file, "\t.long "); 3407: assemble_name (file, buf); 3408: fprintf (file, "\n"); 3409: } 1.1.1.2 root 3410: else 1.1.1.3 root 3411: { 3412: fprintf (file, "\t.tc\t"); 3413: assemble_name (file, buf); 3414: fprintf (file, "[TC],"); 3415: assemble_name (file, buf); 3416: fprintf (file, "\n"); 3417: } 1.1 root 3418: text_section (); 3419: 3420: /* Figure out last used parameter register. The proper thing to do is 3421: to walk incoming args of the function. A function might have live 3422: parameter registers even if it has no incoming args. */ 3423: 3424: for (last_parm_reg = 10; 3425: last_parm_reg > 2 && ! regs_ever_live [last_parm_reg]; 3426: last_parm_reg--) 3427: ; 3428: 3429: /* Save parameter registers in regs 23-30. Don't overwrite reg 31, since 3430: it might be set up as the frame pointer. */ 3431: 3432: for (i = 3, j = 30; i <= last_parm_reg; i++, j--) 3433: fprintf (file, "\tai %d,%d,0\n", j, i); 3434: 3435: /* Load location address into r3, and call mcount. */ 3436: 1.1.1.3 root 3437: ASM_GENERATE_INTERNAL_LABEL (buf, "LPC", labelno); 3438: fprintf (file, "\tl 3,"); 3439: assemble_name (file, buf); 3440: fprintf (file, "(2)\n\tbl .mcount\n"); 1.1 root 3441: 3442: /* Restore parameter registers. */ 3443: 3444: for (i = 3, j = 30; i <= last_parm_reg; i++, j--) 3445: fprintf (file, "\tai %d,%d,0\n", i, j); 1.1.1.4 root 3446: #endif 1.1 root 3447: } 1.1.1.3 root 3448: 3449: /* Adjust the cost of a scheduling dependency. Return the new cost of 3450: a dependency LINK or INSN on DEP_INSN. COST is the current cost. */ 3451: 3452: int 3453: rs6000_adjust_cost (insn, link, dep_insn, cost) 3454: rtx insn; 3455: rtx link; 3456: rtx dep_insn; 3457: int cost; 3458: { 3459: if (! recog_memoized (insn)) 3460: return 0; 3461: 3462: if (REG_NOTE_KIND (link) != 0) 3463: return 0; 3464: 3465: if (REG_NOTE_KIND (link) == 0) 3466: { 3467: /* Data dependency; DEP_INSN writes a register that INSN reads some 3468: cycles later. */ 3469: 3470: /* Tell the first scheduling pass about the latency between a mtctr 3471: and bctr (and mtlr and br/blr). The first scheduling pass will not 3472: know about this latency since the mtctr instruction, which has the 3473: latency associated to it, will be generated by reload. */ 3474: if (get_attr_type (insn) == TYPE_JMPREG) 3475: return TARGET_POWER ? 5 : 4; 3476: 3477: /* Fall out to return default cost. */ 3478: } 3479: 3480: return cost; 3481: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.