|
|
1.1 root 1: /* Definitions of target machine for GNU compiler, for the HP Spectrum. 1.1.1.4 ! root 2: Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. ! 3: Contributed by Michael Tiemann ([email protected]) of Cygnus Support 1.1 root 4: and Tim Moore ([email protected]) of the Center for 5: Software Science at the University of Utah. 6: 7: This file is part of GNU CC. 8: 9: GNU CC is free software; you can redistribute it and/or modify 10: it under the terms of the GNU General Public License as published by 11: the Free Software Foundation; either version 1, or (at your option) 12: any later version. 13: 14: GNU CC is distributed in the hope that it will be useful, 15: but WITHOUT ANY WARRANTY; without even the implied warranty of 16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17: GNU General Public License for more details. 18: 19: You should have received a copy of the GNU General Public License 20: along with GNU CC; see the file COPYING. If not, write to 1.1.1.4 ! root 21: the Free Software Foundation, 59 Temple Place - Suite 330, ! 22: Boston, MA 02111-1307, USA. */ 1.1 root 23: 24: enum cmp_type /* comparison type */ 25: { 26: CMP_SI, /* compare integers */ 27: CMP_SF, /* compare single precision floats */ 28: CMP_DF, /* compare double precision floats */ 29: CMP_MAX /* max comparison type */ 30: }; 31: 1.1.1.4 ! root 32: /* For long call handling. */ ! 33: extern unsigned int total_code_bytes; ! 34: ! 35: /* Which processor to schedule for. */ ! 36: ! 37: enum processor_type ! 38: { ! 39: PROCESSOR_700, ! 40: PROCESSOR_7100, ! 41: PROCESSOR_7100LC, ! 42: }; ! 43: ! 44: #define pa_cpu_attr ((enum attr_cpu)pa_cpu) ! 45: ! 46: /* For -mschedule= option. */ ! 47: extern char *pa_cpu_string; ! 48: extern enum processor_type pa_cpu; ! 49: 1.1 root 50: /* Print subsidiary information on the compiler version in use. */ 51: 52: #define TARGET_VERSION fprintf (stderr, " (hppa)"); 53: 54: /* Run-time compilation parameters selecting different hardware subsets. */ 55: 56: extern int target_flags; 57: 58: /* compile code for HP-PA 1.1 ("Snake") */ 59: 60: #define TARGET_SNAKE (target_flags & 1) 61: 62: /* Disable all FP registers (they all become fixed). This may be necessary 63: for compiling kernels which perform lazy context switching of FP regs. 1.1.1.3 root 64: Note if you use this option and try to perform floating point operations 1.1 root 65: the compiler will abort! */ 66: 67: #define TARGET_DISABLE_FPREGS (target_flags & 2) 68: 1.1.1.4 ! root 69: /* Generate code which assumes that calls through function pointers will ! 70: never cross a space boundary. Such assumptions are generally safe for ! 71: building kernels and statically linked executables. Code compiled with ! 72: this option will fail miserably if the executable is dynamically linked ! 73: or uses nested functions! */ ! 74: #define TARGET_FAST_INDIRECT_CALLS (target_flags & 4) ! 75: 1.1.1.2 root 76: /* Allow unconditional jumps in the delay slots of call instructions. */ 77: #define TARGET_JUMP_IN_DELAY (target_flags & 8) 1.1 root 78: 1.1.1.4 ! root 79: /* In rare cases, a millicode call via "bl" can not be turned into ! 80: a millicode call using "ble" (when SHLIB_INFO subspace is very large). ! 81: ! 82: This option forces just millicode calls to use inline long-calls ! 83: This is far more efficient than the old long-call option which forced ! 84: every function to be called indirectly (as is still the case for ! 85: TARGET_PORTABLE_RUNTIME). 1.1 root 86: 1.1.1.3 root 87: ??? What about simple jumps, they can suffer from the same problem. 1.1 root 88: Would require significant surgery in pa.md. */ 89: 1.1.1.4 ! root 90: #define TARGET_MILLICODE_LONG_CALLS (target_flags & 16) 1.1 root 91: 1.1.1.2 root 92: /* Disable indexed addressing modes. */ 1.1 root 93: 94: #define TARGET_DISABLE_INDEXING (target_flags & 32) 95: 1.1.1.3 root 96: /* Emit code which follows the new portable runtime calling conventions 97: HP wants everyone to use for ELF objects. If at all possible you want 98: to avoid this since it's a performance loss for non-prototyped code. 99: 1.1.1.4 ! root 100: Note TARGET_PORTABLE_RUNTIME also forces all calls to use inline ! 101: long-call stubs which is quite expensive. */ 1.1.1.3 root 102: 103: #define TARGET_PORTABLE_RUNTIME (target_flags & 64) 104: 1.1.1.2 root 105: /* Emit directives only understood by GAS. This allows parameter 106: relocations to work for static functions. There is no way 1.1.1.3 root 107: to make them work the HP assembler at this time. */ 1.1 root 108: 1.1.1.2 root 109: #define TARGET_GAS (target_flags & 128) 1.1 root 110: 1.1.1.4 ! root 111: /* Emit code for processors which do not have an FPU. */ ! 112: ! 113: #define TARGET_SOFT_FLOAT (target_flags & 256) ! 114: 1.1 root 115: /* Macro to define tables used to set the flags. 116: This is a list in braces of pairs in braces, 117: each pair being { "NAME", VALUE } 118: where VALUE is the bits to set or minus the bits to clear. 119: An empty string NAME is used to identify the default VALUE. */ 120: 121: #define TARGET_SWITCHES \ 1.1.1.2 root 122: {{"snake", 1}, \ 123: {"nosnake", -1}, \ 124: {"pa-risc-1-0", -1}, \ 125: {"pa-risc-1-1", 1}, \ 126: {"disable-fpregs", 2}, \ 1.1.1.4 ! root 127: {"no-disable-fpregs", -2}, \ ! 128: {"fast-indirect-calls", 4}, \ ! 129: {"no-fast-indirect-calls", -4},\ 1.1.1.2 root 130: {"jump-in-delay", 8}, \ 131: {"no-jump-in-delay", -8}, \ 1.1.1.4 ! root 132: {"millicode-long-calls", 16},\ ! 133: {"no-millicode-long-calls", -16},\ 1.1.1.2 root 134: {"disable-indexing", 32}, \ 135: {"no-disable-indexing", -32},\ 1.1.1.3 root 136: {"portable-runtime", 64+16},\ 137: {"no-portable-runtime", -(64+16)},\ 1.1.1.2 root 138: {"gas", 128}, \ 139: {"no-gas", -128}, \ 1.1.1.4 ! root 140: {"soft-float", 256}, \ ! 141: {"no-soft-float", -256}, \ 1.1 root 142: { "", TARGET_DEFAULT}} 143: 144: #ifndef TARGET_DEFAULT 1.1.1.3 root 145: #define TARGET_DEFAULT 0x88 /* TARGET_GAS + TARGET_JUMP_IN_DELAY */ 1.1 root 146: #endif 147: 1.1.1.4 ! root 148: #define TARGET_OPTIONS \ ! 149: { \ ! 150: { "schedule=", &pa_cpu_string }\ ! 151: } ! 152: ! 153: #define OVERRIDE_OPTIONS override_options () ! 154: 1.1 root 155: #define DBX_DEBUGGING_INFO 1.1.1.2 root 156: #define DEFAULT_GDB_EXTENSIONS 1 157: 1.1.1.3 root 158: /* This is the way other stabs-in-XXX tools do things. We will be 1.1.1.4 ! root 159: compatible. */ 1.1.1.3 root 160: #define DBX_BLOCKS_FUNCTION_RELATIVE 1 161: 162: /* Likewise for linenos. 163: 164: We make the first line stab special to avoid adding several 165: gross hacks to GAS. */ 166: #undef ASM_OUTPUT_SOURCE_LINE 167: #define ASM_OUTPUT_SOURCE_LINE(file, line) \ 168: { static int sym_lineno = 1; \ 169: static tree last_function_decl = NULL; \ 170: if (current_function_decl == last_function_decl) \ 171: fprintf (file, "\t.stabn 68,0,%d,L$M%d-%s\nL$M%d:\n", \ 172: line, sym_lineno, \ 173: XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0) + 1, \ 174: sym_lineno); \ 175: else \ 176: fprintf (file, "\t.stabn 68,0,%d,0\n", line); \ 177: last_function_decl = current_function_decl; \ 178: sym_lineno += 1; } 179: 180: /* But, to make this work, we have to output the stabs for the function 181: name *first*... */ 182: #define DBX_FUNCTION_FIRST 183: 1.1.1.4 ! root 184: /* Only labels should ever begin in column zero. */ 1.1.1.2 root 185: #define ASM_STABS_OP "\t.stabs" 186: #define ASM_STABN_OP "\t.stabn" 1.1 root 187: 1.1.1.3 root 188: /* GDB always assumes the current function's frame begins at the value 189: of the stack pointer upon entry to the current function. Accessing 190: local variables and parameters passed on the stack is done using the 191: base of the frame + an offset provided by GCC. 192: 193: For functions which have frame pointers this method works fine; 194: the (frame pointer) == (stack pointer at function entry) and GCC provides 195: an offset relative to the frame pointer. 196: 197: This loses for functions without a frame pointer; GCC provides an offset 198: which is relative to the stack pointer after adjusting for the function's 199: frame size. GDB would prefer the offset to be relative to the value of 200: the stack pointer at the function's entry. Yuk! */ 201: #define DEBUGGER_AUTO_OFFSET(X) \ 202: ((GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0) \ 203: + (frame_pointer_needed ? 0 : compute_frame_size (get_frame_size (), 0))) 204: 205: #define DEBUGGER_ARG_OFFSET(OFFSET, X) \ 206: ((GET_CODE (X) == PLUS ? OFFSET : 0) \ 207: + (frame_pointer_needed ? 0 : compute_frame_size (get_frame_size (), 0))) 208: 1.1.1.4 ! root 209: /* gdb needs a null N_SO at the end of each file for scattered loading. */ ! 210: ! 211: #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END ! 212: #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ ! 213: fprintf (FILE, \ ! 214: "%s\n\t.stabs \"%s\",%d,0,0,L$text_end\nL$text_end:\n",\ ! 215: TEXT_SECTION_ASM_OP, "" , N_SO) ! 216: 1.1 root 217: #if (TARGET_DEFAULT & 1) == 0 218: #define CPP_SPEC "%{msnake:-D__hp9000s700 -D_PA_RISC1_1}\ 219: %{mpa-risc-1-1:-D__hp9000s700 -D_PA_RISC1_1}" 220: #else 1.1.1.4 ! root 221: #define CPP_SPEC "%{!mpa-risc-1-0:%{!mnosnake:%{!msoft-float:-D__hp9000s700 -D_PA_RISC1_1}}}" 1.1 root 222: #endif 223: 224: /* Defines for a K&R CC */ 225: 226: #define CC1_SPEC "%{pg:} %{p:}" 1.1.1.3 root 227: 1.1.1.4 ! root 228: #define LINK_SPEC "%{!shared:-u main} %{shared:-b}" ! 229: ! 230: /* We don't want -lg. */ ! 231: #ifndef LIB_SPEC ! 232: #define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}" ! 233: #endif 1.1 root 234: 1.1.1.2 root 235: /* Allow $ in identifiers. */ 236: #define DOLLARS_IN_IDENTIFIERS 2 237: 1.1 root 238: /* Make gcc agree with <machine/ansi.h> */ 239: 240: #define SIZE_TYPE "unsigned int" 241: #define PTRDIFF_TYPE "int" 1.1.1.3 root 242: #define WCHAR_TYPE "unsigned int" 243: #define WCHAR_TYPE_SIZE 32 1.1 root 244: 1.1.1.3 root 245: /* Show we can debug even without a frame pointer. */ 246: #define CAN_DEBUG_WITHOUT_FP 1.1 root 247: 1.1.1.4 ! root 248: /* Machine dependent reorg pass. */ ! 249: #define MACHINE_DEPENDENT_REORG(X) pa_reorg(X) ! 250: 1.1 root 251: /* Names to predefine in the preprocessor for this target machine. */ 252: 1.1.1.2 root 253: #define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -D_HPUX_SOURCE -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Asystem(unix) -Asystem(bsd) -Acpu(hppa) -Amachine(hppa)" 1.1.1.4 ! root 254: ! 255: /* HPUX has a program 'chatr' to list the dependencies of dynamically ! 256: linked executables and shared libraries. */ ! 257: #define LDD_SUFFIX "chatr" ! 258: /* look for lines like "dynamic /usr/lib/X11R5/libX11.sl". */ ! 259: #define PARSE_LDD_OUTPUT(PTR) \ ! 260: do { \ ! 261: while (*PTR == ' ') PTR++; \ ! 262: if (strncmp (PTR, "dynamic", sizeof ("dynamic") - 1) == 0) \ ! 263: { \ ! 264: PTR += sizeof ("dynamic") - 1; \ ! 265: while (*p == ' ') PTR++; \ ! 266: } \ ! 267: else \ ! 268: PTR = 0; \ ! 269: } while (0) 1.1 root 270: 271: /* target machine storage layout */ 272: 1.1.1.4 ! root 273: /* Define for cross-compilation from a host with a different float format ! 274: or endianness (e.g. VAX, x86). */ ! 275: #define REAL_ARITHMETIC ! 276: ! 277: /* Define this macro if it is advisable to hold scalars in registers ! 278: in a wider mode than that declared by the program. In such cases, ! 279: the value is constrained to be within the bounds of the declared ! 280: type, but kept valid in the wider mode. The signedness of the ! 281: extension may differ from that of the type. */ ! 282: ! 283: #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ ! 284: if (GET_MODE_CLASS (MODE) == MODE_INT \ ! 285: && GET_MODE_SIZE (MODE) < 4) \ ! 286: (MODE) = SImode; ! 287: 1.1 root 288: /* Define this if most significant bit is lowest numbered 289: in instructions that operate on numbered bit-fields. */ 290: #define BITS_BIG_ENDIAN 1 291: 292: /* Define this if most significant byte of a word is the lowest numbered. */ 293: /* That is true on the HP-PA. */ 294: #define BYTES_BIG_ENDIAN 1 295: 296: /* Define this if most significant word of a multiword number is lowest 297: numbered. */ 298: #define WORDS_BIG_ENDIAN 1 299: 300: /* number of bits in an addressable storage unit */ 301: #define BITS_PER_UNIT 8 302: 303: /* Width in bits of a "word", which is the contents of a machine register. 304: Note that this is not necessarily the width of data type `int'; 305: if using 16-bit ints on a 68000, this would still be 32. 306: But on a machine with 16-bit registers, this would be 16. */ 307: #define BITS_PER_WORD 32 308: 309: /* Width of a word, in units (bytes). */ 310: #define UNITS_PER_WORD 4 311: 312: /* Width in bits of a pointer. 313: See also the macro `Pmode' defined below. */ 314: #define POINTER_SIZE 32 315: 316: /* Allocation boundary (in *bits*) for storing arguments in argument list. */ 317: #define PARM_BOUNDARY 32 318: 319: /* Largest alignment required for any stack parameter, in bits. 320: Don't define this if it is equal to PARM_BOUNDARY */ 321: #define MAX_PARM_BOUNDARY 64 322: 323: /* Boundary (in *bits*) on which stack pointer should be aligned. */ 1.1.1.2 root 324: #define STACK_BOUNDARY 512 1.1 root 325: 326: /* Allocation boundary (in *bits*) for the code of a function. */ 327: #define FUNCTION_BOUNDARY 32 328: 329: /* Alignment of field after `int : 0' in a structure. */ 330: #define EMPTY_FIELD_BOUNDARY 32 331: 332: /* Every structure's size must be a multiple of this. */ 333: #define STRUCTURE_SIZE_BOUNDARY 8 334: 335: /* A bitfield declared as `int' forces `int' alignment for the struct. */ 336: #define PCC_BITFIELD_TYPE_MATTERS 1 337: 338: /* No data type wants to be aligned rounder than this. */ 339: #define BIGGEST_ALIGNMENT 64 340: 1.1.1.3 root 341: /* The .align directive in the HP assembler allows up to a 32 alignment. */ 342: #define MAX_OFILE_ALIGNMENT 32768 343: 1.1 root 344: /* Get around hp-ux assembler bug, and make strcpy of constants fast. */ 345: #define CONSTANT_ALIGNMENT(CODE, TYPEALIGN) \ 346: ((TYPEALIGN) < 32 ? 32 : (TYPEALIGN)) 347: 348: /* Make arrays of chars word-aligned for the same reasons. */ 349: #define DATA_ALIGNMENT(TYPE, ALIGN) \ 350: (TREE_CODE (TYPE) == ARRAY_TYPE \ 351: && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ 352: && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN)) 353: 354: 355: /* Set this nonzero if move instructions will actually fail to work 356: when given unaligned data. */ 357: #define STRICT_ALIGNMENT 1 358: 359: /* Generate calls to memcpy, memcmp and memset. */ 360: #define TARGET_MEM_FUNCTIONS 361: 362: /* Standard register usage. */ 363: 364: /* Number of actual hardware registers. 365: The hardware registers are assigned numbers for the compiler 366: from 0 to just below FIRST_PSEUDO_REGISTER. 367: All registers that the compiler knows about must be given numbers, 368: even those that are not normally considered general registers. 369: 370: HP-PA 1.0 has 32 fullword registers and 16 floating point 371: registers. The floating point registers hold either word or double 372: word values. 1.1.1.3 root 373: 1.1 root 374: 16 additional registers are reserved. 1.1.1.3 root 375: 1.1 root 376: HP-PA 1.1 has 32 fullword registers and 32 floating point 377: registers. However, the floating point registers behave 378: differently: the left and right halves of registers are addressable 379: as 32 bit registers. So, we will set things up like the 68k which 380: has different fp units: define separate register sets for the 1.0 381: and 1.1 fp units. */ 382: 1.1.1.3 root 383: #define FIRST_PSEUDO_REGISTER 89 /* 32 general regs + 56 fp regs + 384: + 1 shift reg */ 1.1 root 385: 386: /* 1 for registers that have pervasive standard uses 387: and are not available for the register allocator. 388: 389: On the HP-PA, these are: 390: Reg 0 = 0 (hardware). However, 0 is used for condition code, 391: so is not fixed. 392: Reg 1 = ADDIL target/Temporary (hardware). 393: Reg 2 = Return Pointer 1.1.1.3 root 394: Reg 3 = Frame Pointer 395: Reg 4 = Frame Pointer (>8k varying frame with HP compilers only) 396: Reg 4-18 = Preserved Registers 1.1 root 397: Reg 19 = Linkage Table Register in HPUX 8.0 shared library scheme. 398: Reg 20-22 = Temporary Registers 399: Reg 23-26 = Temporary/Parameter Registers 400: Reg 27 = Global Data Pointer (hp) 401: Reg 28 = Temporary/???/Return Value register 1.1.1.4 ! root 402: Reg 29 = Temporary/Static Chain/Return Value register #2 1.1 root 403: Reg 30 = stack pointer 404: Reg 31 = Temporary/Millicode Return Pointer (hp) 405: 406: Freg 0-3 = Status Registers -- Not known to the compiler. 407: Freg 4-7 = Arguments/Return Value 408: Freg 8-11 = Temporary Registers 409: Freg 12-15 = Preserved Registers 410: 411: Freg 16-31 = Reserved 412: 413: On the Snake, fp regs are 414: 415: Freg 0-3 = Status Registers -- Not known to the compiler. 416: Freg 4L-7R = Arguments/Return Value 417: Freg 8L-11R = Temporary Registers 418: Freg 12L-21R = Preserved Registers 419: Freg 22L-31R = Temporary Registers 420: 421: */ 422: 423: #define FIXED_REGISTERS \ 424: {0, 0, 0, 0, 0, 0, 0, 0, \ 425: 0, 0, 0, 0, 0, 0, 0, 0, \ 426: 0, 0, 0, 0, 0, 0, 0, 0, \ 427: 0, 0, 0, 1, 0, 0, 1, 0, \ 1.1.1.3 root 428: /* fp registers */ \ 1.1 root 429: 0, 0, 0, 0, 0, 0, 0, 0, \ 430: 0, 0, 0, 0, 0, 0, 0, 0, \ 431: 0, 0, 0, 0, 0, 0, 0, 0, \ 432: 0, 0, 0, 0, 0, 0, 0, 0, \ 433: 0, 0, 0, 0, 0, 0, 0, 0, \ 434: 0, 0, 0, 0, 0, 0, 0, 0, \ 435: 0, 0, 0, 0, 0, 0, 0, 0, \ 436: 0} 437: 438: /* 1 for registers not available across function calls. 439: These must include the FIXED_REGISTERS and also any 440: registers that can be used without being saved. 441: The latter must include the registers where values are returned 442: and the register where structure-value addresses are passed. 443: Aside from that, you can include as many other registers as you like. */ 444: #define CALL_USED_REGISTERS \ 445: {1, 1, 1, 0, 0, 0, 0, 0, \ 446: 0, 0, 0, 0, 0, 0, 0, 0, \ 447: 0, 0, 0, 1, 1, 1, 1, 1, \ 448: 1, 1, 1, 1, 1, 1, 1, 1, \ 1.1.1.3 root 449: /* fp registers */ \ 1.1 root 450: 1, 1, 1, 1, 1, 1, 1, 1, \ 451: 1, 1, 1, 1, 1, 1, 1, 1, \ 452: 0, 0, 0, 0, 0, 0, 0, 0, \ 453: 0, 0, 0, 0, 0, 0, 0, 0, \ 454: 0, 0, 0, 0, 1, 1, 1, 1, \ 455: 1, 1, 1, 1, 1, 1, 1, 1, \ 456: 1, 1, 1, 1, 1, 1, 1, 1, \ 1.1.1.3 root 457: 1} 1.1 root 458: 459: #define CONDITIONAL_REGISTER_USAGE \ 460: { \ 461: if (!TARGET_SNAKE) \ 462: { \ 1.1.1.3 root 463: for (i = 56; i < 88; i++) \ 464: fixed_regs[i] = call_used_regs[i] = 1; \ 465: for (i = 33; i < 88; i += 2) \ 1.1 root 466: fixed_regs[i] = call_used_regs[i] = 1; \ 467: } \ 1.1.1.4 ! root 468: if (TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT)\ 1.1 root 469: { \ 1.1.1.3 root 470: for (i = 32; i < 88; i++) \ 1.1 root 471: fixed_regs[i] = call_used_regs[i] = 1; \ 472: } \ 473: if (flag_pic) \ 1.1.1.4 ! root 474: { \ ! 475: fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ ! 476: fixed_regs[PIC_OFFSET_TABLE_REGNUM_SAVED] = 1;\ ! 477: } \ 1.1 root 478: } 479: 1.1.1.3 root 480: /* Allocate the call used registers first. This should minimize 1.1 root 481: the number of registers that need to be saved (as call used 482: registers will generally not be allocated across a call). 483: 484: Experimentation has shown slightly better results by allocating 485: FP registers first. */ 486: 487: #define REG_ALLOC_ORDER \ 1.1.1.3 root 488: { \ 489: /* caller-saved fp regs. */ \ 490: 40, 41, 42, 43, 44, 45, 46, 47, \ 491: 68, 69, 70, 71, 72, 73, 74, 75, \ 492: 76, 77, 78, 79, 80, 81, 82, 83, \ 493: 84, 85, 86, 87, \ 494: 32, 33, 34, 35, 36, 37, 38, 39, \ 1.1 root 495: /* caller-saved general regs. */ \ 496: 19, 20, 21, 22, 23, 24, 25, 26, \ 497: 27, 28, 29, 31, 2, \ 1.1.1.3 root 498: /* callee-saved fp regs. */ \ 499: 48, 49, 50, 51, 52, 53, 54, 55, \ 500: 56, 57, 58, 59, 60, 61, 62, 63, \ 501: 64, 65, 66, 67, \ 1.1 root 502: /* callee-saved general regs. */ \ 503: 3, 4, 5, 6, 7, 8, 9, 10, \ 504: 11, 12, 13, 14, 15, 16, 17, 18, \ 505: /* special registers. */ \ 1.1.1.3 root 506: 1, 30, 0, 88} 1.1 root 507: 508: 1.1.1.3 root 509: /* True if register is floating-point. */ 510: #define FP_REGNO_P(N) ((N) >= 32 && (N) <= 87) 511: 1.1 root 512: /* Return number of consecutive hard regs needed starting at reg REGNO 513: to hold something of mode MODE. 514: This is ordinarily the length in words of a value of mode MODE 515: but can be less for certain modes in special long registers. 516: 517: On the HP-PA, ordinary registers hold 32 bits worth; 518: The floating point registers are 64 bits wide. Snake fp regs are 32 519: bits wide */ 1.1.1.3 root 520: #define HARD_REGNO_NREGS(REGNO, MODE) \ 521: (!TARGET_SNAKE && FP_REGNO_P (REGNO) ? 1 \ 522: : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)) 1.1 root 523: 524: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. 525: On the HP-PA, the cpu registers can hold any mode. We 526: force this to be an even register is it cannot hold the full mode. */ 527: #define HARD_REGNO_MODE_OK(REGNO, MODE) \ 528: ((REGNO) == 0 ? (MODE) == CCmode || (MODE) == CCFPmode \ 1.1.1.3 root 529: /* On 1.0 machines, don't allow wide non-fp modes in fp regs. */ \ 530: : !TARGET_SNAKE && FP_REGNO_P (REGNO) \ 531: ? GET_MODE_SIZE (MODE) <= 4 || GET_MODE_CLASS (MODE) == MODE_FLOAT \ 532: /* Make wide modes be in aligned registers. */ \ 533: : GET_MODE_SIZE (MODE) <= 4 || ((REGNO) & 1) == 0) 1.1 root 534: 535: /* Value is 1 if it is a good idea to tie two pseudo registers 536: when one has mode MODE1 and one has mode MODE2. 537: If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2, 538: for any hard reg, then this must be 0 for correct output. */ 539: #define MODES_TIEABLE_P(MODE1, MODE2) \ 540: (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2)) 541: 542: /* Specify the registers used for certain standard purposes. 543: The values of these macros are register numbers. */ 544: 545: /* The HP-PA pc isn't overloaded on a register that the compiler knows about. */ 546: /* #define PC_REGNUM */ 547: 548: /* Register to use for pushing function arguments. */ 549: #define STACK_POINTER_REGNUM 30 550: 551: /* Base register for access to local variables of the function. */ 1.1.1.3 root 552: #define FRAME_POINTER_REGNUM 3 1.1 root 553: 554: /* Value should be nonzero if functions must have frame pointers. */ 555: #define FRAME_POINTER_REQUIRED (current_function_calls_alloca) 1.1.1.3 root 556: 1.1 root 557: 558: /* C statement to store the difference between the frame pointer 559: and the stack pointer values immediately after the function prologue. 560: 561: Note, we always pretend that this is a leaf function because if 562: it's not, there's no point in trying to eliminate the 563: frame pointer. If it is a leaf function, we guessed right! */ 564: #define INITIAL_FRAME_POINTER_OFFSET(VAR) \ 565: do {(VAR) = - compute_frame_size (get_frame_size (), 0);} while (0) 566: 567: /* Base register for access to arguments of the function. */ 1.1.1.3 root 568: #define ARG_POINTER_REGNUM 3 1.1 root 569: 570: /* Register in which static-chain is passed to a function. */ 571: /* ??? */ 572: #define STATIC_CHAIN_REGNUM 29 573: 574: /* Register which holds offset table for position-independent 575: data references. */ 576: 577: #define PIC_OFFSET_TABLE_REGNUM 19 1.1.1.4 ! root 578: #define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1 1.1 root 579: 1.1.1.4 ! root 580: /* Register into which we save the PIC_OFFEST_TABLE_REGNUM so that it ! 581: can be restore across function calls. */ ! 582: #define PIC_OFFSET_TABLE_REGNUM_SAVED 4 1.1 root 583: 1.1.1.2 root 584: /* SOM ABI says that objects larger than 64 bits are returned in memory. */ 1.1.1.4 ! root 585: #define DEFAULT_PCC_STRUCT_RETURN 0 1.1.1.2 root 586: #define RETURN_IN_MEMORY(TYPE) \ 1.1.1.4 ! root 587: (int_size_in_bytes (TYPE) > 8 || TREE_ADDRESSABLE (TYPE)) 1.1.1.2 root 588: 1.1 root 589: /* Register in which address to store a structure value 590: is passed to a function. */ 591: #define STRUCT_VALUE_REGNUM 28 592: 593: /* Define the classes of registers for register constraints in the 594: machine description. Also define ranges of constants. 595: 596: One of the classes must always be named ALL_REGS and include all hard regs. 597: If there is more than one class, another class must be named NO_REGS 598: and contain no registers. 599: 600: The name GENERAL_REGS must be the name of a class (or an alias for 601: another name such as ALL_REGS). This is the class of registers 602: that is allowed by "g" or "r" in a register constraint. 603: Also, registers outside this class are allocated only when 604: instructions express preferences for them. 605: 606: The classes must be numbered in nondecreasing order; that is, 607: a larger-numbered class must never be contained completely 608: in a smaller-numbered class. 609: 610: For any two classes, it is very desirable that there be another 611: class that represents their union. */ 612: 613: /* The HP-PA has four kinds of registers: general regs, 1.0 fp regs, 614: 1.1 fp regs, and the high 1.1 fp regs, to which the operands of 1.1.1.3 root 615: fmpyadd and fmpysub are restricted. */ 1.1 root 616: 617: enum reg_class { NO_REGS, R1_REGS, GENERAL_REGS, FP_REGS, GENERAL_OR_FP_REGS, 1.1.1.3 root 618: SHIFT_REGS, ALL_REGS, LIM_REG_CLASSES}; 1.1 root 619: 620: #define N_REG_CLASSES (int) LIM_REG_CLASSES 621: 622: /* Give names of register classes as strings for dump file. */ 623: 624: #define REG_CLASS_NAMES \ 1.1.1.3 root 625: {"NO_REGS", "R1_REGS", "GENERAL_REGS", "FP_REGS", \ 626: "GENERAL_OR_FP_REGS", "SHIFT_REGS", "ALL_REGS"} 1.1 root 627: 628: /* Define which registers fit in which classes. 629: This is an initializer for a vector of HARD_REG_SET 630: of length N_REG_CLASSES. Register 0, the "condition code" register, 631: is in no class. */ 632: 633: #define REG_CLASS_CONTENTS \ 1.1.1.3 root 634: {{0x00000000, 0x00000000, 0x00000000}, /* NO_REGS */ \ 635: {0x00000002, 0x00000000, 0x00000000}, /* R1_REGS */ \ 636: {0xfffffffe, 0x00000000, 0x00000000}, /* GENERAL_REGS */ \ 637: {0x00000000, 0xffffffff, 0x00ffffff}, /* FP_REGS */ \ 638: {0xfffffffe, 0xffffffff, 0x00ffffff}, /* GENERAL_OR_FP_REGS */ \ 639: {0x00000000, 0x00000000, 0x01000000}, /* SHIFT_REGS */ \ 640: {0xfffffffe, 0xffffffff, 0x01ffffff}} /* ALL_REGS */ 1.1 root 641: 642: /* The same information, inverted: 643: Return the class number of the smallest class containing 644: reg number REGNO. This could be a conditional expression 645: or could index an array. */ 646: 1.1.1.3 root 647: #define REGNO_REG_CLASS(REGNO) \ 648: ((REGNO) == 0 ? NO_REGS \ 649: : (REGNO) == 1 ? R1_REGS \ 650: : (REGNO) < 32 ? GENERAL_REGS \ 651: : (REGNO) < 88 ? FP_REGS \ 1.1 root 652: : SHIFT_REGS) 653: 654: /* The class value for index registers, and the one for base regs. */ 655: #define INDEX_REG_CLASS GENERAL_REGS 656: #define BASE_REG_CLASS GENERAL_REGS 657: 658: #define FP_REG_CLASS_P(CLASS) \ 1.1.1.3 root 659: ((CLASS) == FP_REGS) 1.1 root 660: 1.1.1.3 root 661: /* Get reg_class from a letter such as appears in the machine description. */ 662: /* Keep 'x' for backward compatibility with user asm. */ 1.1 root 663: #define REG_CLASS_FROM_LETTER(C) \ 1.1.1.3 root 664: ((C) == 'f' ? FP_REGS : \ 665: (C) == 'x' ? FP_REGS : \ 666: (C) == 'q' ? SHIFT_REGS : \ 667: (C) == 'a' ? R1_REGS : \ 668: (C) == 'Z' ? ALL_REGS : NO_REGS) 1.1 root 669: 670: /* The letters I, J, K, L and M in a register constraint string 671: can be used to stand for particular ranges of immediate operands. 672: This macro defines what the ranges are. 673: C is the letter, and VALUE is a constant value. 674: Return 1 if VALUE is in the range specified by C. 675: 676: `I' is used for the 11 bit constants. 677: `J' is used for the 14 bit constants. 678: `K' is used for values that can be moved with a zdepi insn. 679: `L' is used for the 5 bit constants. 680: `M' is used for 0. 681: `N' is used for values with the least significant 11 bits equal to zero. 682: `O' is used for numbers n such that n+1 is a power of 2. 683: */ 684: 685: #define CONST_OK_FOR_LETTER_P(VALUE, C) \ 686: ((C) == 'I' ? VAL_11_BITS_P (VALUE) \ 687: : (C) == 'J' ? VAL_14_BITS_P (VALUE) \ 688: : (C) == 'K' ? zdepi_cint_p (VALUE) \ 689: : (C) == 'L' ? VAL_5_BITS_P (VALUE) \ 690: : (C) == 'M' ? (VALUE) == 0 \ 691: : (C) == 'N' ? ((VALUE) & 0x7ff) == 0 \ 692: : (C) == 'O' ? (((VALUE) & ((VALUE) + 1)) == 0) \ 693: : (C) == 'P' ? and_mask_p (VALUE) \ 694: : 0) 695: 696: /* Similar, but for floating or large integer constants, and defining letters 697: G and H. Here VALUE is the CONST_DOUBLE rtx itself. 698: 699: For PA, `G' is the floating-point constant zero. `H' is undefined. */ 700: 701: #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ 702: ((C) == 'G' ? (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT \ 703: && (VALUE) == CONST0_RTX (GET_MODE (VALUE))) \ 704: : 0) 705: 706: /* Given an rtx X being reloaded into a reg required to be 707: in class CLASS, return the class of reg to actually use. 708: In general this is just CLASS; but on some machines 709: in some cases it is preferable to use a more restrictive class. */ 710: #define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS) 711: 712: /* Return the register class of a scratch register needed to copy IN into 713: or out of a register in CLASS in MODE. If it can be done directly, 714: NO_REGS is returned. */ 715: 716: #define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \ 717: secondary_reload_class (CLASS, MODE, IN) 718: 1.1.1.3 root 719: /* On the PA it is not possible to directly move data between 1.1 root 720: GENERAL_REGS and FP_REGS. */ 721: #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \ 1.1.1.3 root 722: (FP_REG_CLASS_P (CLASS1) != FP_REG_CLASS_P (CLASS2)) 1.1 root 723: 724: /* Return the stack location to use for secondary memory needed reloads. */ 725: #define SECONDARY_MEMORY_NEEDED_RTX(MODE) \ 726: gen_rtx (MEM, MODE, gen_rtx (PLUS, Pmode, stack_pointer_rtx, GEN_INT (-16))) 727: 728: /* Return the maximum number of consecutive registers 729: needed to represent mode MODE in a register of class CLASS. */ 1.1.1.3 root 730: #define CLASS_MAX_NREGS(CLASS, MODE) \ 731: (!TARGET_SNAKE && (CLASS) == FP_REGS ? 1 : \ 732: ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)) 1.1 root 733: 734: /* Stack layout; function entry, exit and calling. */ 735: 736: /* Define this if pushing a word on the stack 737: makes the stack pointer a smaller address. */ 738: /* #define STACK_GROWS_DOWNWARD */ 739: 740: /* Believe it or not. */ 741: #define ARGS_GROW_DOWNWARD 742: 743: /* Define this if the nominal address of the stack frame 744: is at the high-address end of the local variables; 745: that is, each additional local variable allocated 746: goes at a more negative offset in the frame. */ 747: /* #define FRAME_GROWS_DOWNWARD */ 748: 749: /* Offset within stack frame to start allocating local variables at. 750: If FRAME_GROWS_DOWNWARD, this is the offset to the END of the 751: first local allocated. Otherwise, it is the offset to the BEGINNING 752: of the first local allocated. */ 753: #define STARTING_FRAME_OFFSET 8 754: 755: /* If we generate an insn to push BYTES bytes, 756: this says how many the stack pointer really advances by. 757: On the HP-PA, don't define this because there are no push insns. */ 758: /* #define PUSH_ROUNDING(BYTES) */ 759: 760: /* Offset of first parameter from the argument pointer register value. 761: This value will be negated because the arguments grow down. 762: Also note that on STACK_GROWS_UPWARD machines (such as this one) 763: this is the distance from the frame pointer to the end of the first 764: argument, not it's beginning. To get the real offset of the first 765: argument, the size of the argument must be added. 766: 767: ??? Have to check on this.*/ 768: 1.1.1.3 root 769: #define FIRST_PARM_OFFSET(FNDECL) -32 1.1 root 770: 771: /* Absolute value of offset from top-of-stack address to location to store the 772: function parameter if it can't go in a register. 773: Addresses for following parameters are computed relative to this one. */ 1.1.1.3 root 774: #define FIRST_PARM_CALLER_OFFSET(FNDECL) -32 1.1 root 775: 776: 777: /* When a parameter is passed in a register, stack space is still 778: allocated for it. */ 779: #define REG_PARM_STACK_SPACE(DECL) 16 780: 781: /* Define this if the above stack space is to be considered part of the 782: space allocated by the caller. */ 783: #define OUTGOING_REG_PARM_STACK_SPACE 784: 785: /* Keep the stack pointer constant throughout the function. 786: This is both an optimization and a necessity: longjmp 787: doesn't behave itself when the stack pointer moves within 788: the function! */ 789: #define ACCUMULATE_OUTGOING_ARGS 1.1.1.3 root 790: 791: /* The weird HPPA calling conventions require a minimum of 48 bytes on 1.1 root 792: the stack: 16 bytes for register saves, and 32 bytes for magic. 793: This is the difference between the logical top of stack and the 1.1.1.3 root 794: actual sp. */ 1.1 root 795: #define STACK_POINTER_OFFSET -32 796: 797: #define STACK_DYNAMIC_OFFSET(FNDECL) \ 798: ((STACK_POINTER_OFFSET) - current_function_outgoing_args_size) 799: 800: /* Value is 1 if returning from a function call automatically 801: pops the arguments described by the number-of-args field in the call. 1.1.1.4 ! root 802: FUNDECL is the declaration node of the function (as a tree), 1.1 root 803: FUNTYPE is the data type of the function (as a tree), 804: or for a library call it is an identifier node for the subroutine name. */ 805: 1.1.1.4 ! root 806: #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0 1.1 root 807: 808: /* Define how to find the value returned by a function. 809: VALTYPE is the data type of the value (as a tree). 810: If the precise function being called is known, FUNC is its FUNCTION_DECL; 811: otherwise, FUNC is 0. */ 812: 813: /* On the HP-PA the value is found in register(s) 28(-29), unless 814: the mode is SF or DF. Then the value is returned in fr4 (32, ) */ 815: 816: 817: #define FUNCTION_VALUE(VALTYPE, FUNC) \ 1.1.1.4 ! root 818: gen_rtx (REG, TYPE_MODE (VALTYPE), ((! TARGET_SOFT_FLOAT \ ! 819: && (TYPE_MODE (VALTYPE) == SFmode || \ ! 820: TYPE_MODE (VALTYPE) == DFmode)) ? \ 1.1.1.3 root 821: 32 : 28)) 1.1 root 822: 823: /* Define how to find the value returned by a library function 824: assuming the value has mode MODE. */ 825: 1.1.1.4 ! root 826: #define LIBCALL_VALUE(MODE) \ ! 827: gen_rtx (REG, MODE, \ ! 828: (! TARGET_SOFT_FLOAT \ ! 829: && ((MODE) == SFmode || (MODE) == DFmode) ? 32 : 28)) 1.1 root 830: 831: /* 1 if N is a possible register number for a function value 832: as seen by the caller. */ 833: 1.1.1.3 root 834: #define FUNCTION_VALUE_REGNO_P(N) \ 1.1.1.4 ! root 835: ((N) == 28 || (! TARGET_SOFT_FLOAT && (N) == 32)) 1.1 root 836: 837: /* 1 if N is a possible register number for function argument passing. */ 838: 1.1.1.3 root 839: #define FUNCTION_ARG_REGNO_P(N) \ 1.1.1.4 ! root 840: (((N) >= 23 && (N) <= 26) || (! TARGET_SOFT_FLOAT && (N) >= 32 && (N) <= 39)) 1.1 root 841: 842: /* Define a data type for recording info about an argument list 843: during the scan of that argument list. This data type should 844: hold all necessary information about the function itself 845: and about the args processed so far, enough to enable macros 846: such as FUNCTION_ARG to determine where the next arg should go. 847: 848: On the HP-PA, this is a single integer, which is a number of words 849: of arguments scanned so far (including the invisible argument, 850: if any, which holds the structure-value-address). 851: Thus 4 or more means all following args should go on the stack. */ 852: 1.1.1.3 root 853: struct hppa_args {int words, nargs_prototype; }; 854: 855: #define CUMULATIVE_ARGS struct hppa_args 1.1 root 856: 857: /* Initialize a variable CUM of type CUMULATIVE_ARGS 858: for a call to a function whose data type is FNTYPE. 1.1.1.3 root 859: For a library call, FNTYPE is 0. */ 860: 861: #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME) \ 862: (CUM).words = 0, \ 863: (CUM).nargs_prototype = (FNTYPE && TYPE_ARG_TYPES (FNTYPE) \ 864: ? (list_length (TYPE_ARG_TYPES (FNTYPE)) - 1 \ 865: + (TYPE_MODE (TREE_TYPE (FNTYPE)) == BLKmode \ 866: || RETURN_IN_MEMORY (TREE_TYPE (FNTYPE)))) \ 867: : 0) 868: 869: 870: 871: /* Similar, but when scanning the definition of a procedure. We always 872: set NARGS_PROTOTYPE large so we never return an EXPR_LIST. */ 1.1 root 873: 1.1.1.3 root 874: #define INIT_CUMULATIVE_INCOMING_ARGS(CUM,FNTYPE,IGNORE) \ 875: (CUM).words = 0, \ 876: (CUM).nargs_prototype = 1000 1.1 root 877: 878: /* Figure out the size in words of the function argument. */ 879: 880: #define FUNCTION_ARG_SIZE(MODE, TYPE) \ 881: ((((MODE) != BLKmode ? GET_MODE_SIZE (MODE) : int_size_in_bytes (TYPE))+3)/4) 882: 883: /* Update the data in CUM to advance over an argument 884: of mode MODE and data type TYPE. 885: (TYPE is null for libcalls where that information may not be available.) */ 886: 887: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ 1.1.1.3 root 888: { (CUM).nargs_prototype--; \ 889: ((((CUM).words & 01) && (TYPE) != 0 \ 890: && FUNCTION_ARG_SIZE(MODE, TYPE) > 1) \ 891: && (CUM).words++), \ 892: (CUM).words += FUNCTION_ARG_SIZE(MODE, TYPE); \ 893: } 1.1 root 894: 895: /* Determine where to put an argument to a function. 896: Value is zero to push the argument on the stack, 897: or a hard register in which to store the argument. 898: 899: MODE is the argument's machine mode. 900: TYPE is the data type of the argument (as a tree). 901: This is null for libcalls where that information may 902: not be available. 903: CUM is a variable of type CUMULATIVE_ARGS which gives info about 904: the preceding args and about the function being called. 905: NAMED is nonzero if this argument is a named parameter 1.1.1.3 root 906: (otherwise it is an extra parameter matching an ellipsis). 1.1 root 907: 1.1.1.3 root 908: On the HP-PA the first four words of args are normally in registers 1.1 root 909: and the rest are pushed. But any arg that won't entirely fit in regs 910: is pushed. 911: 912: Arguments passed in registers are either 1 or 2 words long. 913: 914: The caller must make a distinction between calls to explicitly named 915: functions and calls through pointers to functions -- the conventions 916: are different! Calls through pointers to functions only use general 1.1.1.4 ! root 917: registers for the first four argument words. 1.1.1.3 root 918: 919: Of course all this is different for the portable runtime model 920: HP wants everyone to use for ELF. Ugh. Here's a quick description 921: of how it's supposed to work. 922: 923: 1) callee side remains unchanged. It expects integer args to be 924: in the integer registers, float args in the float registers and 925: unnamed args in integer registers. 926: 927: 2) caller side now depends on if the function being called has 928: a prototype in scope (rather than if it's being called indirectly). 929: 930: 2a) If there is a prototype in scope, then arguments are passed 931: according to their type (ints in integer registers, floats in float 932: registers, unnamed args in integer registers. 933: 934: 2b) If there is no prototype in scope, then floating point arguments 935: are passed in both integer and float registers. egad. 936: 937: FYI: The portable parameter passing conventions are almost exactly like 938: the standard parameter passing conventions on the RS6000. That's why 939: you'll see lots of similar code in rs6000.h. */ 1.1 root 940: 941: #define FUNCTION_ARG_PADDING(MODE, TYPE) function_arg_padding ((MODE), (TYPE)) 942: 1.1.1.3 root 943: /* Do not expect to understand this without reading it several times. I'm 944: tempted to try and simply it, but I worry about breaking something. */ 1.1 root 945: 1.1.1.3 root 946: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ 947: (4 >= ((CUM).words + FUNCTION_ARG_SIZE ((MODE), (TYPE))) \ 948: ? (!TARGET_PORTABLE_RUNTIME || (TYPE) == 0 \ 1.1.1.4 ! root 949: || !FLOAT_MODE_P (MODE) || TARGET_SOFT_FLOAT \ ! 950: || (CUM).nargs_prototype > 0) \ 1.1.1.3 root 951: ? gen_rtx (REG, (MODE), \ 952: (FUNCTION_ARG_SIZE ((MODE), (TYPE)) > 1 \ 1.1.1.4 ! root 953: ? (((!current_call_is_indirect \ 1.1.1.3 root 954: || TARGET_PORTABLE_RUNTIME) \ 1.1.1.4 ! root 955: && (MODE) == DFmode \ ! 956: && ! TARGET_SOFT_FLOAT) \ 1.1.1.3 root 957: ? ((CUM).words ? 38 : 34) \ 958: : ((CUM).words ? 23 : 25)) \ 1.1.1.4 ! root 959: : (((!current_call_is_indirect \ 1.1.1.3 root 960: || TARGET_PORTABLE_RUNTIME) \ 1.1.1.4 ! root 961: && (MODE) == SFmode \ ! 962: && ! TARGET_SOFT_FLOAT) \ 1.1.1.3 root 963: ? (32 + 2 * (CUM).words) \ 964: : (27 - (CUM).words - FUNCTION_ARG_SIZE ((MODE), \ 965: (TYPE))))))\ 966: /* We are calling a non-prototyped function with floating point \ 967: arguments using the portable conventions. */ \ 968: : gen_rtx (EXPR_LIST, VOIDmode, \ 969: gen_rtx (REG, (MODE), \ 970: (FUNCTION_ARG_SIZE ((MODE), (TYPE)) > 1 \ 971: ? ((CUM).words ? 38 : 34) \ 972: : (32 + 2 * (CUM).words))), \ 973: gen_rtx (REG, (MODE), \ 974: (FUNCTION_ARG_SIZE ((MODE), (TYPE)) > 1 \ 975: ? ((CUM).words ? 23 : 25) \ 976: : (27 - (CUM).words - FUNCTION_ARG_SIZE ((MODE),\ 977: (TYPE)))))) \ 978: /* Pass this parameter in the stack. */ \ 979: : 0) 1.1 root 980: 981: /* For an arg passed partly in registers and partly in memory, 982: this is the number of registers used. 983: For args passed entirely in registers or entirely in memory, zero. */ 984: 985: #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 986: 987: /* If defined, a C expression that gives the alignment boundary, in 988: bits, of an argument with the specified mode and type. If it is 989: not defined, `PARM_BOUNDARY' is used for all arguments. */ 990: 991: #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \ 992: (((TYPE) != 0) \ 1.1.1.2 root 993: ? (((int_size_in_bytes (TYPE)) + 3) / 4) * BITS_PER_WORD \ 1.1 root 994: : ((GET_MODE_ALIGNMENT(MODE) <= PARM_BOUNDARY) \ 995: ? PARM_BOUNDARY \ 996: : GET_MODE_ALIGNMENT(MODE))) 997: 998: /* Arguments larger than eight bytes are passed by invisible reference */ 999: 1000: #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ 1001: ((TYPE) && int_size_in_bytes (TYPE) > 8) 1.1.1.4 ! root 1002: ! 1003: #define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \ ! 1004: ((TYPE) && int_size_in_bytes (TYPE) > 8) ! 1005: 1.1 root 1006: 1007: extern struct rtx_def *hppa_compare_op0, *hppa_compare_op1; 1008: extern enum cmp_type hppa_branch_type; 1009: 1010: /* Output the label for a function definition. */ 1.1.1.2 root 1011: #ifndef HP_FP_ARG_DESCRIPTOR_REVERSED 1.1 root 1012: #define ASM_DOUBLE_ARG_DESCRIPTORS(FILE, ARG0, ARG1) \ 1013: do { fprintf (FILE, ",ARGW%d=FR", (ARG0)); \ 1014: fprintf (FILE, ",ARGW%d=FU", (ARG1));} while (0) 1015: #else 1016: #define ASM_DOUBLE_ARG_DESCRIPTORS(FILE, ARG0, ARG1) \ 1017: do { fprintf (FILE, ",ARGW%d=FU", (ARG0)); \ 1018: fprintf (FILE, ",ARGW%d=FR", (ARG1));} while (0) 1019: #endif 1020: 1021: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 1022: do { tree fntype = TREE_TYPE (TREE_TYPE (DECL)); \ 1023: tree tree_type = TREE_TYPE (DECL); \ 1024: tree parm; \ 1025: int i; \ 1.1.1.2 root 1026: if (TREE_PUBLIC (DECL) || TARGET_GAS) \ 1.1 root 1027: { extern int current_function_varargs; \ 1.1.1.2 root 1028: if (TREE_PUBLIC (DECL)) \ 1029: { \ 1030: fputs ("\t.EXPORT ", FILE); \ 1031: assemble_name (FILE, NAME); \ 1032: fputs (",ENTRY,PRIV_LEV=3", FILE); \ 1033: } \ 1034: else \ 1035: { \ 1036: fputs ("\t.PARAM ", FILE); \ 1037: assemble_name (FILE, NAME); \ 1038: } \ 1.1.1.3 root 1039: if (TARGET_PORTABLE_RUNTIME) \ 1040: { \ 1041: fputs (",ARGW0=NO,ARGW1=NO,ARGW2=NO,ARGW3=NO,", FILE); \ 1042: fputs ("RTNVAL=NO\n", FILE); \ 1043: break; \ 1044: } \ 1.1 root 1045: for (parm = DECL_ARGUMENTS (DECL), i = 0; parm && i < 4; \ 1046: parm = TREE_CHAIN (parm)) \ 1047: { \ 1.1.1.4 ! root 1048: if (TYPE_MODE (DECL_ARG_TYPE (parm)) == SFmode \ ! 1049: && ! TARGET_SOFT_FLOAT) \ 1.1 root 1050: fprintf (FILE, ",ARGW%d=FR", i++); \ 1.1.1.4 ! root 1051: else if (TYPE_MODE (DECL_ARG_TYPE (parm)) == DFmode \ ! 1052: && ! TARGET_SOFT_FLOAT) \ 1.1 root 1053: { \ 1054: if (i <= 2) \ 1055: { \ 1056: if (i == 1) i++; \ 1057: ASM_DOUBLE_ARG_DESCRIPTORS (FILE, i++, i++); \ 1058: } \ 1059: else \ 1060: break; \ 1061: } \ 1062: else \ 1063: { \ 1064: int arg_size = \ 1065: FUNCTION_ARG_SIZE (TYPE_MODE (DECL_ARG_TYPE (parm)),\ 1066: DECL_ARG_TYPE (parm)); \ 1.1.1.4 ! root 1067: /* Passing structs by invisible reference uses \ ! 1068: one general register. */ \ ! 1069: if (arg_size > 2 \ ! 1070: || TYPE_NEEDS_CONSTRUCTING (DECL_ARG_TYPE (parm)))\ ! 1071: arg_size = 1; \ 1.1 root 1072: if (arg_size == 2 && i <= 2) \ 1073: { \ 1074: if (i == 1) i++; \ 1075: fprintf (FILE, ",ARGW%d=GR", i++); \ 1076: fprintf (FILE, ",ARGW%d=GR", i++); \ 1077: } \ 1078: else if (arg_size == 1) \ 1079: fprintf (FILE, ",ARGW%d=GR", i++); \ 1080: else \ 1081: i += arg_size; \ 1082: } \ 1083: } \ 1084: /* anonymous args */ \ 1085: if ((TYPE_ARG_TYPES (tree_type) != 0 \ 1086: && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (tree_type)))\ 1087: != void_type_node)) \ 1088: || current_function_varargs) \ 1089: { \ 1090: for (; i < 4; i++) \ 1091: fprintf (FILE, ",ARGW%d=GR", i); \ 1092: } \ 1.1.1.4 ! root 1093: if (TYPE_MODE (fntype) == DFmode && ! TARGET_SOFT_FLOAT) \ 1.1 root 1094: fprintf (FILE, ",RTNVAL=FR"); \ 1.1.1.4 ! root 1095: else if (TYPE_MODE (fntype) == SFmode && ! TARGET_SOFT_FLOAT) \ 1.1 root 1096: fprintf (FILE, ",RTNVAL=FU"); \ 1097: else if (fntype != void_type_node) \ 1098: fprintf (FILE, ",RTNVAL=GR"); \ 1099: fputs ("\n", FILE); \ 1.1.1.3 root 1100: }} while (0) 1.1 root 1101: 1102: /* This macro generates the assembly code for function entry. 1103: FILE is a stdio stream to output the code to. 1104: SIZE is an int: how many units of temporary storage to allocate. 1105: Refer to the array `regs_ever_live' to determine which registers 1106: to save; `regs_ever_live[I]' is nonzero if register number I 1107: is ever used in the function. This macro is responsible for 1108: knowing which registers should not be saved even if used. */ 1109: 1110: /* On HP-PA, move-double insns between fpu and cpu need an 8-byte block 1111: of memory. If any fpu reg is used in the function, we allocate 1112: such a block here, at the bottom of the frame, just in case it's needed. 1113: 1114: If this function is a leaf procedure, then we may choose not 1115: to do a "save" insn. The decision about whether or not 1116: to do this is made in regclass.c. */ 1117: 1118: #define FUNCTION_PROLOGUE(FILE, SIZE) \ 1119: output_function_prologue (FILE, SIZE) 1120: 1121: /* Output assembler code to FILE to increment profiler label # LABELNO 1122: for profiling a function entry. 1123: 1124: Because HPUX _mcount is so different, we actually emit the 1125: profiling code in function_prologue. This just stores LABELNO for 1126: that. */ 1127: 1128: #define PROFILE_BEFORE_PROLOGUE 1129: #define FUNCTION_PROFILER(FILE, LABELNO) \ 1130: { extern int hp_profile_labelno; hp_profile_labelno = (LABELNO);} 1131: 1132: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, 1133: the stack pointer does not matter. The value is tested only in 1134: functions that have frame pointers. 1135: No definition is equivalent to always zero. */ 1136: 1137: extern int may_call_alloca; 1138: extern int current_function_pretend_args_size; 1139: 1140: #define EXIT_IGNORE_STACK \ 1141: (get_frame_size () != 0 \ 1142: || current_function_calls_alloca || current_function_outgoing_args_size) 1143: 1144: 1145: /* This macro generates the assembly code for function exit, 1146: on machines that need it. If FUNCTION_EPILOGUE is not defined 1147: then individual return instructions are generated for each 1148: return statement. Args are same as for FUNCTION_PROLOGUE. 1149: 1150: The function epilogue should not depend on the current stack pointer! 1151: It should use the frame pointer only. This is mandatory because 1152: of alloca; we also take advantage of it to omit stack adjustments 1153: before returning. */ 1154: 1155: /* This declaration is needed due to traditional/ANSI 1156: incompatibilities which cannot be #ifdefed away 1157: because they occur inside of macros. Sigh. */ 1158: extern union tree_node *current_function_decl; 1159: 1160: #define FUNCTION_EPILOGUE(FILE, SIZE) \ 1161: output_function_epilogue (FILE, SIZE) 1162: 1163: /* Output assembler code for a block containing the constant parts 1164: of a trampoline, leaving space for the variable parts.\ 1165: 1166: The trampoline sets the static chain pointer to STATIC_CHAIN_REGNUM 1167: and then branches to the specified routine. 1168: 1169: This code template is copied from text segment to stack location 1170: and then patched with INITIALIZE_TRAMPOLINE to contain 1.1.1.3 root 1171: valid values, and then entered as a subroutine. 1.1 root 1172: 1.1.1.3 root 1173: It is best to keep this as small as possible to avoid having to 1.1 root 1174: flush multiple lines in the cache. */ 1175: 1176: #define TRAMPOLINE_TEMPLATE(FILE) \ 1.1.1.2 root 1177: { \ 1178: fprintf (FILE, "\tldw 36(0,%%r22),%%r21\n"); \ 1179: fprintf (FILE, "\tbb,>=,n %%r21,30,.+16\n"); \ 1180: fprintf (FILE, "\tdepi 0,31,2,%%r21\n"); \ 1181: fprintf (FILE, "\tldw 4(0,%%r21),%%r19\n"); \ 1182: fprintf (FILE, "\tldw 0(0,%%r21),%%r21\n"); \ 1183: fprintf (FILE, "\tldsid (0,%%r21),%%r1\n"); \ 1184: fprintf (FILE, "\tmtsp %%r1,%%sr0\n"); \ 1185: fprintf (FILE, "\tbe 0(%%sr0,%%r21)\n"); \ 1186: fprintf (FILE, "\tldw 40(0,%%r22),%%r29\n"); \ 1187: fprintf (FILE, "\t.word 0\n"); \ 1188: fprintf (FILE, "\t.word 0\n"); \ 1189: } 1.1 root 1190: 1191: /* Length in units of the trampoline for entering a nested function. 1192: 1193: Flush the cache entries corresponding to the first and last addresses 1194: of the trampoline. This is necessary as the trampoline may cross two 1.1.1.3 root 1195: cache lines. 1.1 root 1196: 1.1.1.2 root 1197: If the code part of the trampoline ever grows to > 32 bytes, then it 1198: will become necessary to hack on the cacheflush pattern in pa.md. */ 1.1 root 1199: 1.1.1.2 root 1200: #define TRAMPOLINE_SIZE (11 * 4) 1.1 root 1201: 1202: /* Emit RTL insns to initialize the variable parts of a trampoline. 1203: FNADDR is an RTX for the address of the function's pure code. 1204: CXT is an RTX for the static chain value for the function. 1205: 1206: Move the function address to the trampoline template at offset 12. 1207: Move the static chain value to trampoline template at offset 16. */ 1208: 1209: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ 1.1.1.2 root 1210: { \ 1.1.1.3 root 1211: rtx start_addr, end_addr; \ 1.1.1.2 root 1212: \ 1213: start_addr = memory_address (Pmode, plus_constant ((TRAMP), 36)); \ 1214: emit_move_insn (gen_rtx (MEM, Pmode, start_addr), (FNADDR)); \ 1215: start_addr = memory_address (Pmode, plus_constant ((TRAMP), 40)); \ 1216: emit_move_insn (gen_rtx (MEM, Pmode, start_addr), (CXT)); \ 1217: /* fdc and fic only use registers for the address to flush, \ 1218: they do not accept integer displacements. */ \ 1219: start_addr = force_reg (SImode, (TRAMP)); \ 1220: end_addr = force_reg (SImode, plus_constant ((TRAMP), 32)); \ 1221: emit_insn (gen_dcacheflush (start_addr, end_addr)); \ 1.1.1.3 root 1222: end_addr = force_reg (SImode, plus_constant (start_addr, 32)); \ 1223: emit_insn (gen_icacheflush (start_addr, end_addr, start_addr, \ 1.1.1.2 root 1224: gen_reg_rtx (SImode), gen_reg_rtx (SImode)));\ 1.1 root 1225: } 1226: 1227: /* Emit code for a call to builtin_saveregs. We must emit USE insns which 1228: reference the 4 integer arg registers and 4 fp arg registers. 1229: Ordinarily they are not call used registers, but they are for 1230: _builtin_saveregs, so we must make this explicit. */ 1231: 1.1.1.4 ! root 1232: extern struct rtx_def *hppa_builtin_saveregs (); ! 1233: #define EXPAND_BUILTIN_SAVEREGS(ARGLIST) hppa_builtin_saveregs (ARGLIST) 1.1 root 1234: 1235: 1236: /* Addressing modes, and classification of registers for them. */ 1237: 1238: #define HAVE_POST_INCREMENT 1239: #define HAVE_POST_DECREMENT 1240: 1241: #define HAVE_PRE_DECREMENT 1242: #define HAVE_PRE_INCREMENT 1243: 1244: /* Macros to check register numbers against specific register classes. */ 1245: 1246: /* These assume that REGNO is a hard or pseudo reg number. 1247: They give nonzero only if REGNO is a hard reg of the suitable class 1248: or a pseudo reg currently allocated to a suitable hard reg. 1249: Since they use reg_renumber, they are safe only once reg_renumber 1250: has been allocated, which happens in local-alloc.c. */ 1251: 1252: #define REGNO_OK_FOR_INDEX_P(REGNO) \ 1253: ((REGNO) && ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32)) 1254: #define REGNO_OK_FOR_BASE_P(REGNO) \ 1255: ((REGNO) && ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32)) 1256: #define REGNO_OK_FOR_FP_P(REGNO) \ 1.1.1.3 root 1257: (FP_REGNO_P (REGNO) || FP_REGNO_P (reg_renumber[REGNO])) 1.1 root 1258: 1259: /* Now macros that check whether X is a register and also, 1260: strictly, whether it is in a specified class. 1261: 1262: These macros are specific to the the HP-PA, and may be used only 1263: in code for printing assembler insns and in conditions for 1264: define_optimization. */ 1265: 1266: /* 1 if X is an fp register. */ 1267: 1268: #define FP_REG_P(X) (REG_P (X) && REGNO_OK_FOR_FP_P (REGNO (X))) 1269: 1270: /* Maximum number of registers that can appear in a valid memory address. */ 1271: 1272: #define MAX_REGS_PER_ADDRESS 2 1273: 1274: /* Recognize any constant value that is a valid address except 1275: for symbolic addresses. We get better CSE by rejecting them 1276: here and allowing hppa_legitimize_address to break them up. We 1277: use most of the constants accepted by CONSTANT_P, except CONST_DOUBLE. */ 1278: 1279: #define CONSTANT_ADDRESS_P(X) \ 1280: ((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \ 1281: || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \ 1282: || GET_CODE (X) == HIGH) \ 1283: && (reload_in_progress || reload_completed || ! symbolic_expression_p (X))) 1284: 1285: /* Include all constant integers and constant doubles, but not 1.1.1.3 root 1286: floating-point, except for floating-point zero. */ 1.1 root 1287: 1288: #define LEGITIMATE_CONSTANT_P(X) \ 1.1.1.4 ! root 1289: ((GET_MODE_CLASS (GET_MODE (X)) != MODE_FLOAT \ ! 1290: || (X) == CONST0_RTX (GET_MODE (X))) \ ! 1291: && !(flag_pic && function_label_operand (X, VOIDmode))) 1.1 root 1292: 1.1.1.3 root 1293: /* Subroutine for EXTRA_CONSTRAINT. 1.1 root 1294: 1295: Return 1 iff OP is a pseudo which did not get a hard register and 1296: we are running the reload pass. */ 1297: 1298: #define IS_RELOADING_PSEUDO_P(OP) \ 1299: ((reload_in_progress \ 1300: && GET_CODE (OP) == REG \ 1301: && REGNO (OP) >= FIRST_PSEUDO_REGISTER \ 1302: && reg_renumber [REGNO (OP)] < 0)) 1303: 1304: /* Optional extra constraints for this machine. Borrowed from sparc.h. 1305: 1306: For the HPPA, `Q' means that this is a memory operand but not a 1307: symbolic memory operand. Note that an unassigned pseudo register 1308: is such a memory operand. Needed because reload will generate 1309: these things in insns and then not re-recognize the insns, causing 1310: constrain_operands to fail. 1311: 1312: Also note `Q' accepts any memory operand during the reload pass. 1.1.1.3 root 1313: This includes out-of-range displacements in reg+d addressing. 1.1 root 1314: This makes for better code. (??? For 2.5 address this issue). 1315: 1316: `R' is unused. 1317: 1.1.1.2 root 1318: `S' is unused. 1.1 root 1319: 1320: `T' is for fp loads and stores. */ 1321: #define EXTRA_CONSTRAINT(OP, C) \ 1322: ((C) == 'Q' ? \ 1323: (IS_RELOADING_PSEUDO_P (OP) \ 1324: || (GET_CODE (OP) == MEM \ 1325: && reload_in_progress) \ 1326: || (GET_CODE (OP) == MEM \ 1327: && memory_address_p (GET_MODE (OP), XEXP (OP, 0))\ 1328: && ! symbolic_memory_operand (OP, VOIDmode))) \ 1329: : ((C) == 'T' ? \ 1330: (GET_CODE (OP) == MEM \ 1331: /* Using DFmode forces only short displacements \ 1332: to be recognized as valid in reg+d addresses. */\ 1.1.1.2 root 1333: && memory_address_p (DFmode, XEXP (OP, 0))) : 0)) 1.1 root 1334: 1335: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx 1336: and check its validity for a certain class. 1337: We have two alternate definitions for each of them. 1338: The usual definition accepts all pseudo regs; the other rejects 1339: them unless they have been allocated suitable hard regs. 1340: The symbol REG_OK_STRICT causes the latter definition to be used. 1341: 1342: Most source files want to accept pseudo regs in the hope that 1343: they will get allocated to the class that the insn wants them to be in. 1344: Source files for reload pass need to be strict. 1345: After reload, it makes no difference, since pseudo regs have 1346: been eliminated by then. */ 1347: 1348: #ifndef REG_OK_STRICT 1349: 1350: /* Nonzero if X is a hard reg that can be used as an index 1351: or if it is a pseudo reg. */ 1352: #define REG_OK_FOR_INDEX_P(X) \ 1353: (REGNO (X) && (REGNO (X) < 32 || REGNO (X) >= FIRST_PSEUDO_REGISTER)) 1354: /* Nonzero if X is a hard reg that can be used as a base reg 1355: or if it is a pseudo reg. */ 1356: #define REG_OK_FOR_BASE_P(X) \ 1357: (REGNO (X) && (REGNO (X) < 32 || REGNO (X) >= FIRST_PSEUDO_REGISTER)) 1358: 1359: #else 1360: 1361: /* Nonzero if X is a hard reg that can be used as an index. */ 1362: #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) 1363: /* Nonzero if X is a hard reg that can be used as a base reg. */ 1364: #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) 1365: 1366: #endif 1367: 1368: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression 1369: that is a valid memory address for an instruction. 1370: The MODE argument is the machine mode for the MEM expression 1371: that wants to use this address. 1372: 1373: On the HP-PA, the actual legitimate addresses must be 1374: REG+REG, REG+(REG*SCALE) or REG+SMALLINT. 1375: But we can treat a SYMBOL_REF as legitimate if it is part of this 1376: function's constant-pool, because such addresses can actually 1.1.1.3 root 1377: be output as REG+SMALLINT. 1378: 1379: Note we only allow 5 bit immediates for access to a constant address; 1380: doing so avoids losing for loading/storing a FP register at an address 1381: which will not fit in 5 bits. */ 1.1 root 1382: 1383: #define VAL_5_BITS_P(X) ((unsigned)(X) + 0x10 < 0x20) 1384: #define INT_5_BITS(X) VAL_5_BITS_P (INTVAL (X)) 1385: 1386: #define VAL_U5_BITS_P(X) ((unsigned)(X) < 0x20) 1387: #define INT_U5_BITS(X) VAL_U5_BITS_P (INTVAL (X)) 1388: 1389: #define VAL_11_BITS_P(X) ((unsigned)(X) + 0x400 < 0x800) 1390: #define INT_11_BITS(X) VAL_11_BITS_P (INTVAL (X)) 1391: 1392: #define VAL_14_BITS_P(X) ((unsigned)(X) + 0x2000 < 0x4000) 1393: #define INT_14_BITS(X) VAL_14_BITS_P (INTVAL (X)) 1394: 1395: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ 1396: { \ 1397: if ((REG_P (X) && REG_OK_FOR_BASE_P (X)) \ 1398: || ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC \ 1399: || GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC) \ 1400: && REG_P (XEXP (X, 0)) \ 1401: && REG_OK_FOR_BASE_P (XEXP (X, 0)))) \ 1402: goto ADDR; \ 1403: else if (GET_CODE (X) == PLUS) \ 1404: { \ 1405: rtx base = 0, index; \ 1406: if (flag_pic && XEXP (X, 0) == pic_offset_table_rtx)\ 1407: { \ 1408: if (GET_CODE (XEXP (X, 1)) == REG \ 1409: && REG_OK_FOR_BASE_P (XEXP (X, 1))) \ 1410: goto ADDR; \ 1411: else if (flag_pic == 1 \ 1.1.1.4 ! root 1412: && GET_CODE (XEXP (X, 1)) == SYMBOL_REF)\ 1.1 root 1413: goto ADDR; \ 1414: } \ 1415: else if (REG_P (XEXP (X, 0)) \ 1416: && REG_OK_FOR_BASE_P (XEXP (X, 0))) \ 1417: base = XEXP (X, 0), index = XEXP (X, 1); \ 1418: else if (REG_P (XEXP (X, 1)) \ 1419: && REG_OK_FOR_BASE_P (XEXP (X, 1))) \ 1420: base = XEXP (X, 1), index = XEXP (X, 0); \ 1421: if (base != 0) \ 1422: if (GET_CODE (index) == CONST_INT \ 1.1.1.4 ! root 1423: && ((INT_14_BITS (index) \ ! 1424: && (TARGET_SOFT_FLOAT \ ! 1425: || ((MODE) != SFmode && (MODE) != DFmode))) \ 1.1 root 1426: || INT_5_BITS (index))) \ 1427: goto ADDR; \ 1428: } \ 1429: else if (GET_CODE (X) == LO_SUM \ 1430: && GET_CODE (XEXP (X, 0)) == REG \ 1431: && REG_OK_FOR_BASE_P (XEXP (X, 0)) \ 1432: && CONSTANT_P (XEXP (X, 1)) \ 1.1.1.4 ! root 1433: && (TARGET_SOFT_FLOAT \ ! 1434: || ((MODE) != SFmode \ ! 1435: && (MODE) != DFmode))) \ 1.1 root 1436: goto ADDR; \ 1437: else if (GET_CODE (X) == LO_SUM \ 1438: && GET_CODE (XEXP (X, 0)) == SUBREG \ 1439: && GET_CODE (SUBREG_REG (XEXP (X, 0))) == REG\ 1440: && REG_OK_FOR_BASE_P (SUBREG_REG (XEXP (X, 0)))\ 1441: && CONSTANT_P (XEXP (X, 1)) \ 1.1.1.4 ! root 1442: && (TARGET_SOFT_FLOAT \ ! 1443: || ((MODE) != SFmode \ ! 1444: && (MODE) != DFmode))) \ 1.1 root 1445: goto ADDR; \ 1446: else if (GET_CODE (X) == LABEL_REF \ 1447: || (GET_CODE (X) == CONST_INT \ 1.1.1.3 root 1448: && INT_5_BITS (X))) \ 1.1 root 1449: goto ADDR; \ 1.1.1.4 ! root 1450: /* Needed for -fPIC */ \ ! 1451: else if (GET_CODE (X) == LO_SUM \ ! 1452: && GET_CODE (XEXP (X, 0)) == REG \ ! 1453: && REG_OK_FOR_BASE_P (XEXP (X, 0)) \ ! 1454: && GET_CODE (XEXP (X, 1)) == UNSPEC) \ ! 1455: goto ADDR; \ 1.1 root 1456: } 1457: 1458: /* Try machine-dependent ways of modifying an illegitimate address 1459: to be legitimate. If we find one, return the new, valid address. 1460: This macro is used in only one place: `memory_address' in explow.c. 1461: 1462: OLDX is the address as it was before break_out_memory_refs was called. 1463: In some cases it is useful to look at this to decide what needs to be done. 1464: 1465: MODE and WIN are passed so that this macro can use 1466: GO_IF_LEGITIMATE_ADDRESS. 1467: 1468: It is always safe for this macro to do nothing. It exists to recognize 1469: opportunities to optimize the output. */ 1470: 1471: extern struct rtx_def *hppa_legitimize_address (); 1472: #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \ 1473: { rtx orig_x = (X); \ 1474: (X) = hppa_legitimize_address (X, OLDX, MODE); \ 1475: if ((X) != orig_x && memory_address_p (MODE, X)) \ 1476: goto WIN; } 1477: 1478: /* Go to LABEL if ADDR (a legitimate address expression) 1479: has an effect that depends on the machine mode it is used for. */ 1480: 1481: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \ 1482: if (GET_CODE (ADDR) == PRE_DEC \ 1483: || GET_CODE (ADDR) == POST_DEC \ 1484: || GET_CODE (ADDR) == PRE_INC \ 1485: || GET_CODE (ADDR) == POST_INC) \ 1486: goto LABEL 1487: 1488: /* Define this macro if references to a symbol must be treated 1489: differently depending on something about the variable or 1490: function named by the symbol (such as what section it is in). 1491: 1492: The macro definition, if any, is executed immediately after the 1493: rtl for DECL or other node is created. 1494: The value of the rtl will be a `mem' whose address is a 1495: `symbol_ref'. 1496: 1497: The usual thing for this macro to do is to a flag in the 1498: `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified 1499: name string in the `symbol_ref' (if one bit is not enough 1500: information). 1501: 1502: On the HP-PA we use this to indicate if a symbol is in text or 1503: data space. Also, function labels need special treatment. */ 1504: 1505: #define TEXT_SPACE_P(DECL)\ 1506: (TREE_CODE (DECL) == FUNCTION_DECL \ 1507: || (TREE_CODE (DECL) == VAR_DECL \ 1508: && TREE_READONLY (DECL) && ! TREE_SIDE_EFFECTS (DECL) \ 1509: && !flag_pic) \ 1510: || (*tree_code_type[(int) TREE_CODE (DECL)] == 'c' \ 1511: && !(TREE_CODE (DECL) == STRING_CST && flag_writable_strings))) 1512: 1513: #define FUNCTION_NAME_P(NAME) \ 1514: (*(NAME) == '@' || (*(NAME) == '*' && *((NAME) + 1) == '@')) 1515: 1516: #define ENCODE_SECTION_INFO(DECL)\ 1517: do \ 1518: { if (TEXT_SPACE_P (DECL)) \ 1519: { rtx _rtl; \ 1520: if (TREE_CODE (DECL) == FUNCTION_DECL \ 1521: || TREE_CODE (DECL) == VAR_DECL) \ 1522: _rtl = DECL_RTL (DECL); \ 1523: else \ 1524: _rtl = TREE_CST_RTL (DECL); \ 1525: SYMBOL_REF_FLAG (XEXP (_rtl, 0)) = 1; \ 1526: if (TREE_CODE (DECL) == FUNCTION_DECL) \ 1.1.1.4 ! root 1527: hppa_encode_label (XEXP (DECL_RTL (DECL), 0), 0);\ 1.1 root 1528: } \ 1529: } \ 1530: while (0) 1.1.1.3 root 1531: 1.1 root 1532: /* Store the user-specified part of SYMBOL_NAME in VAR. 1533: This is sort of inverse to ENCODE_SECTION_INFO. */ 1534: 1535: #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \ 1536: (VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*' ? \ 1537: 1 + (SYMBOL_NAME)[1] == '@'\ 1538: : (SYMBOL_NAME)[0] == '@')) 1539: 1.1.1.4 ! root 1540: /* Arghh. This is used for stuff in the constant pool; this may include ! 1541: function addresses on the PA, which during PIC code generation must ! 1542: reside in the data space. Unfortunately, there's no way to determine ! 1543: if a particular label in the constant pool refers to a function address. ! 1544: So just force everything into the data space during PIC generation. */ ! 1545: #define SELECT_RTX_SECTION(RTX,MODE) \ ! 1546: if (flag_pic) \ ! 1547: data_section (); \ ! 1548: else \ ! 1549: readonly_data_section (); ! 1550: 1.1 root 1551: /* Specify the machine mode that this machine uses 1552: for the index in the tablejump instruction. */ 1.1.1.2 root 1553: #define CASE_VECTOR_MODE DImode 1.1 root 1554: 1555: /* Define this if the tablejump instruction expects the table 1556: to contain offsets from the address of the table. 1557: Do not define this if the table should contain absolute addresses. */ 1558: /* #define CASE_VECTOR_PC_RELATIVE */ 1559: 1560: #define CASE_DROPS_THROUGH 1561: /* Specify the tree operation to be used to convert reals to integers. */ 1562: #define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR 1563: 1564: /* This is the kind of divide that is easiest to do in the general case. */ 1565: #define EASY_DIV_EXPR TRUNC_DIV_EXPR 1566: 1567: /* Define this as 1 if `char' should by default be signed; else as 0. */ 1568: #define DEFAULT_SIGNED_CHAR 1 1569: 1570: /* Max number of bytes we can move from memory to memory 1571: in one reasonably fast instruction. */ 1572: #define MOVE_MAX 8 1573: 1.1.1.2 root 1574: /* Define if operations between registers always perform the operation 1575: on the full register even if a narrower mode is specified. */ 1576: #define WORD_REGISTER_OPERATIONS 1577: 1578: /* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD 1579: will either zero-extend or sign-extend. The value of this macro should 1580: be the code that says which one of the two operations is implicitly 1581: done, NIL if none. */ 1582: #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND 1.1 root 1583: 1584: /* Nonzero if access to memory by bytes is slow and undesirable. */ 1585: #define SLOW_BYTE_ACCESS 1 1586: 1587: /* Do not break .stabs pseudos into continuations. */ 1588: #define DBX_CONTIN_LENGTH 0 1589: 1590: /* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits 1591: is done just by pretending it is already truncated. */ 1592: #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 1593: 1594: /* We assume that the store-condition-codes instructions store 0 for false 1595: and some other value for true. This is the value stored for true. */ 1596: 1597: #define STORE_FLAG_VALUE 1 1598: 1599: /* When a prototype says `char' or `short', really pass an `int'. */ 1600: #define PROMOTE_PROTOTYPES 1601: 1602: /* Specify the machine mode that pointers have. 1603: After generation of rtl, the compiler makes no further distinction 1604: between pointers and any other objects of this machine mode. */ 1605: #define Pmode SImode 1606: 1607: /* Add any extra modes needed to represent the condition code. 1608: 1609: HPPA floating comparisons produce condition codes. */ 1610: #define EXTRA_CC_MODES CCFPmode 1611: 1612: /* Define the names for the modes specified above. */ 1613: #define EXTRA_CC_NAMES "CCFP" 1614: 1615: /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE, 1616: return the mode to be used for the comparison. For floating-point, CCFPmode 1617: should be used. CC_NOOVmode should be used when the first operand is a 1618: PLUS, MINUS, or NEG. CCmode should be used when no special processing is 1619: needed. */ 1620: #define SELECT_CC_MODE(OP,X,Y) \ 1621: (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode : CCmode) \ 1622: 1623: /* A function address in a call instruction 1624: is a byte address (for indexing purposes) 1625: so give the MEM rtx a byte's mode. */ 1626: #define FUNCTION_MODE SImode 1.1.1.3 root 1627: 1.1 root 1628: /* Define this if addresses of constant functions 1629: shouldn't be put through pseudo regs where they can be cse'd. 1630: Desirable on machines where ordinary constants are expensive 1631: but a CALL with constant address is cheap. */ 1632: #define NO_FUNCTION_CSE 1633: 1.1.1.2 root 1634: /* Define this to be nonzero if shift instructions ignore all but the low-order 1.1 root 1635: few bits. */ 1.1.1.2 root 1636: #define SHIFT_COUNT_TRUNCATED 1 1.1 root 1637: 1638: /* Use atexit for static constructors/destructors, instead of defining 1639: our own exit function. */ 1640: #define HAVE_ATEXIT 1641: 1642: /* Compute the cost of computing a constant rtl expression RTX 1643: whose rtx-code is CODE. The body of this macro is a portion 1644: of a switch statement. If the code is computed here, 1645: return it with a return statement. Otherwise, break from the switch. */ 1646: 1647: #define CONST_COSTS(RTX,CODE,OUTER_CODE) \ 1648: case CONST_INT: \ 1649: if (INTVAL (RTX) == 0) return 0; \ 1650: if (INT_14_BITS (RTX)) return 1; \ 1651: case HIGH: \ 1652: return 2; \ 1653: case CONST: \ 1654: case LABEL_REF: \ 1655: case SYMBOL_REF: \ 1656: return 4; \ 1657: case CONST_DOUBLE: \ 1658: if (RTX == CONST0_RTX (DFmode) || RTX == CONST0_RTX (SFmode)\ 1659: && OUTER_CODE != SET) \ 1660: return 0; \ 1661: else \ 1662: return 8; 1663: 1664: #define ADDRESS_COST(RTX) \ 1665: (GET_CODE (RTX) == REG ? 1 : hppa_address_cost (RTX)) 1666: 1667: /* Compute extra cost of moving data between one register class 1668: and another. 1669: 1.1.1.2 root 1670: Make moves from SAR so expensive they should never happen. We used to 1671: have 0xffff here, but that generates overflow in rare cases. 1.1 root 1672: 1.1.1.3 root 1673: Copies involving a FP register and a non-FP register are relatively 1.1 root 1674: expensive because they must go through memory. 1675: 1676: Other copies are reasonably cheap. */ 1677: #define REGISTER_MOVE_COST(CLASS1, CLASS2) \ 1.1.1.2 root 1678: (CLASS1 == SHIFT_REGS ? 0x100 \ 1.1 root 1679: : FP_REG_CLASS_P (CLASS1) && ! FP_REG_CLASS_P (CLASS2) ? 16 \ 1680: : FP_REG_CLASS_P (CLASS2) && ! FP_REG_CLASS_P (CLASS1) ? 16 \ 1681: : 2) 1682: 1683: 1684: /* Provide the costs of a rtl expression. This is in the body of a 1685: switch on CODE. The purpose for the cost of MULT is to encourage 1686: `synth_mult' to find a synthetic multiply when reasonable. */ 1687: 1.1.1.3 root 1688: #define RTX_COSTS(X,CODE,OUTER_CODE) \ 1689: case MULT: \ 1.1.1.4 ! root 1690: return (TARGET_SNAKE && ! TARGET_DISABLE_FPREGS \ ! 1691: && ! TARGET_SOFT_FLOAT \ ! 1692: ? COSTS_N_INSNS (8) : COSTS_N_INSNS (20)); \ 1.1.1.3 root 1693: case DIV: \ 1694: case UDIV: \ 1695: case MOD: \ 1696: case UMOD: \ 1697: return COSTS_N_INSNS (60); \ 1698: case PLUS: \ 1699: if (GET_CODE (XEXP (X, 0)) == MULT \ 1700: && shadd_operand (XEXP (XEXP (X, 0), 1), VOIDmode)) \ 1701: return (2 + rtx_cost (XEXP (XEXP (X, 0), 0), OUTER_CODE) \ 1702: + rtx_cost (XEXP (X, 1), OUTER_CODE)); \ 1703: break; 1.1 root 1704: 1705: /* Adjust the cost of dependencies. */ 1706: 1707: #define ADJUST_COST(INSN,LINK,DEP,COST) \ 1708: (COST) = pa_adjust_cost (INSN, LINK, DEP, COST) 1709: 1710: /* Handling the special cases is going to get too complicated for a macro, 1711: just call `pa_adjust_insn_length' to do the real work. */ 1712: #define ADJUST_INSN_LENGTH(INSN, LENGTH) \ 1713: LENGTH += pa_adjust_insn_length (INSN, LENGTH); 1714: 1715: /* Enable a bug fix. (This is for extra caution.) */ 1716: #define SHORTEN_WITH_ADJUST_INSN_LENGTH 1717: 1718: /* Millicode insns are actually function calls with some special 1719: constraints on arguments and register usage. 1720: 1721: Millicode calls always expect their arguments in the integer argument 1722: registers, and always return their result in %r29 (ret1). They 1723: are expected to clobber their arguments, %r1, %r29, and %r31 and 1724: nothing else. 1725: 1.1.1.3 root 1726: These macros tell reorg that the references to arguments and 1727: register clobbers for millicode calls do not appear to happen 1.1 root 1728: until after the millicode call. This allows reorg to put insns 1729: which set the argument registers into the delay slot of the millicode 1730: call -- thus they act more like traditional CALL_INSNs. 1731: 1732: get_attr_type will try to recognize the given insn, so make sure to 1733: filter out things it will not accept -- SEQUENCE, USE and CLOBBER insns 1734: in particular. */ 1735: #define INSN_SETS_ARE_DELAYED(X) \ 1736: ((GET_CODE (X) == INSN \ 1737: && GET_CODE (PATTERN (X)) != SEQUENCE \ 1738: && GET_CODE (PATTERN (X)) != USE \ 1739: && GET_CODE (PATTERN (X)) != CLOBBER \ 1740: && get_attr_type (X) == TYPE_MILLI)) 1741: 1742: #define INSN_REFERENCES_ARE_DELAYED(X) \ 1743: ((GET_CODE (X) == INSN \ 1744: && GET_CODE (PATTERN (X)) != SEQUENCE \ 1745: && GET_CODE (PATTERN (X)) != USE \ 1746: && GET_CODE (PATTERN (X)) != CLOBBER \ 1.1.1.3 root 1747: && get_attr_type (X) == TYPE_MILLI)) 1.1 root 1748: 1749: 1750: /* Control the assembler format that we output. */ 1751: 1752: /* Output at beginning of assembler file. */ 1753: 1754: #define ASM_FILE_START(FILE) \ 1755: do { fprintf (FILE, "\t.SPACE $PRIVATE$\n\ 1756: \t.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31\n\ 1757: \t.SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82\n\ 1758: \t.SPACE $TEXT$\n\ 1759: \t.SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44\n\ 1760: \t.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY\n\ 1761: \t.IMPORT $global$,DATA\n\ 1762: \t.IMPORT $$dyncall,MILLICODE\n");\ 1763: if (profile_flag)\ 1764: fprintf (FILE, "\t.IMPORT _mcount, CODE\n");\ 1.1.1.2 root 1765: if (write_symbols != NO_DEBUG) \ 1766: output_file_directive ((FILE), main_input_filename); \ 1.1 root 1767: } while (0) 1768: 1769: /* Output to assembler file text saying following lines 1770: may contain character constants, extra white space, comments, etc. */ 1771: 1772: #define ASM_APP_ON "" 1773: 1774: /* Output to assembler file text saying following lines 1775: no longer contain unusual constructs. */ 1776: 1777: #define ASM_APP_OFF "" 1778: 1779: /* We don't yet know how to identify GCC to HP-PA machines. */ 1780: #define ASM_IDENTIFY_GCC(FILE) fprintf (FILE, "; gcc_compiled.:\n") 1781: 1782: /* Output before code. */ 1783: 1784: /* Supposedly the assembler rejects the command if there is no tab! */ 1785: #define TEXT_SECTION_ASM_OP "\t.SPACE $TEXT$\n\t.SUBSPA $CODE$\n" 1786: 1.1.1.2 root 1787: /* Output before read-only data. */ 1788: 1789: /* Supposedly the assembler rejects the command if there is no tab! */ 1790: #define READONLY_DATA_ASM_OP "\t.SPACE $TEXT$\n\t.SUBSPA $LIT$\n" 1791: 1792: #define READONLY_DATA_SECTION readonly_data 1793: 1.1 root 1794: /* Output before writable data. */ 1795: 1796: /* Supposedly the assembler rejects the command if there is no tab! */ 1797: #define DATA_SECTION_ASM_OP "\t.SPACE $PRIVATE$\n\t.SUBSPA $DATA$\n" 1798: 1799: /* Output before uninitialized data. */ 1800: 1801: #define BSS_SECTION_ASM_OP "\t.SPACE $PRIVATE$\n\t.SUBSPA $BSS$\n" 1802: 1803: /* Define the .bss section for ASM_OUTPUT_LOCAL to use. */ 1804: 1.1.1.2 root 1805: #define EXTRA_SECTIONS in_bss, in_readonly_data 1.1 root 1806: 1.1.1.4 ! root 1807: /* FIXME: HPUX ld generates incorrect GOT entries for "T" fixups ! 1808: which reference data within the $TEXT$ space (for example constant ! 1809: strings in the $LIT$ subspace). ! 1810: ! 1811: The assemblers (GAS and HP as) both have problems with handling ! 1812: the difference of two symbols which is the other correct way to ! 1813: reference constant data during PIC code generation. ! 1814: ! 1815: So, there's no way to reference constant data which is in the ! 1816: $TEXT$ space during PIC generation. Instead place all constant ! 1817: data into the $PRIVATE$ subspace (this reduces sharing, but it ! 1818: works correctly). */ ! 1819: 1.1 root 1820: #define EXTRA_SECTION_FUNCTIONS \ 1821: void \ 1822: bss_section () \ 1823: { \ 1824: if (in_section != in_bss) \ 1825: { \ 1826: fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP); \ 1827: in_section = in_bss; \ 1828: } \ 1.1.1.2 root 1829: } \ 1830: void \ 1831: readonly_data () \ 1832: { \ 1833: if (in_section != in_readonly_data) \ 1834: { \ 1.1.1.4 ! root 1835: if (flag_pic) \ ! 1836: fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP); \ ! 1837: else \ ! 1838: fprintf (asm_out_file, "%s\n", READONLY_DATA_ASM_OP); \ 1.1.1.2 root 1839: in_section = in_readonly_data; \ 1840: } \ 1.1 root 1841: } 1842: 1843: 1844: /* How to refer to registers in assembler output. 1845: This sequence is indexed by compiler's hard-register-number (see above). */ 1846: 1847: #define REGISTER_NAMES \ 1.1.1.3 root 1848: {"%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", \ 1849: "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", \ 1850: "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23", \ 1851: "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31", \ 1852: "%fr4", "%fr4R", "%fr5", "%fr5R", "%fr6", "%fr6R", "%fr7", "%fr7R", \ 1853: "%fr8", "%fr8R", "%fr9", "%fr9R", "%fr10", "%fr10R", "%fr11", "%fr11R", \ 1854: "%fr12", "%fr12R", "%fr13", "%fr13R", "%fr14", "%fr14R", "%fr15", "%fr15R", \ 1855: "%fr16", "%fr16R", "%fr17", "%fr17R", "%fr18", "%fr18R", "%fr19", "%fr19R", \ 1856: "%fr20", "%fr20R", "%fr21", "%fr21R", "%fr22", "%fr22R", "%fr23", "%fr23R", \ 1857: "%fr24", "%fr24R", "%fr25", "%fr25R", "%fr26", "%fr26R", "%fr27", "%fr27R", \ 1858: "%fr28", "%fr28R", "%fr29", "%fr29R", "%fr30", "%fr30R", "%fr31", "%fr31R", \ 1.1 root 1859: "SAR"} 1860: 1.1.1.3 root 1861: #define ADDITIONAL_REGISTER_NAMES \ 1862: {{"%fr4L",32}, {"%fr5L",34}, {"%fr6L",36}, {"%fr7L",38}, \ 1863: {"%fr8L",40}, {"%fr9L",42}, {"%fr10L",44}, {"%fr11L",46}, \ 1864: {"%fr12L",48}, {"%fr13L",50}, {"%fr14L",52}, {"%fr15L",54}, \ 1865: {"%fr16L",56}, {"%fr17L",58}, {"%fr18L",60}, {"%fr19L",62}, \ 1866: {"%fr20L",64}, {"%fr21L",66}, {"%fr22L",68}, {"%fr23L",70}, \ 1867: {"%fr24L",72}, {"%fr25L",74}, {"%fr26L",76}, {"%fr27L",78}, \ 1868: {"%fr28L",80}, {"%fr29L",82}, {"%fr30L",84}, {"%fr31R",86}, \ 1869: {"%cr11",88}} 1870: 1871: /* How to renumber registers for dbx and gdb. 1872: 1873: Registers 0 - 31 remain unchanged. 1874: 1875: Registers 32 - 87 are mapped to 72 - 127 1876: 1877: Register 88 is mapped to 32. */ 1878: 1879: #define DBX_REGISTER_NUMBER(REGNO) \ 1880: ((REGNO) <= 31 ? (REGNO) : \ 1881: ((REGNO) > 31 && (REGNO) <= 87 ? (REGNO) + 40 : 32)) 1.1 root 1882: 1883: /* This is how to output the definition of a user-level label named NAME, 1884: such as the label on a static function or variable NAME. */ 1885: 1886: #define ASM_OUTPUT_LABEL(FILE, NAME) \ 1887: do { assemble_name (FILE, NAME); \ 1888: fputc ('\n', FILE); } while (0) 1889: 1890: /* This is how to output a command to make the user-level label named NAME 1891: defined for reference from other files. */ 1892: 1893: #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ 1894: do { fputs ("\t.IMPORT ", FILE); \ 1895: assemble_name (FILE, NAME); \ 1896: if (FUNCTION_NAME_P (NAME)) \ 1897: fputs (",CODE\n", FILE); \ 1898: else \ 1899: fputs (",DATA\n", FILE); \ 1900: } while (0) 1901: 1.1.1.3 root 1902: /* The bogus HP assembler requires ALL external references to be 1.1 root 1903: "imported", even library calls. They look a bit different, so 1.1.1.4 ! root 1904: here's this macro. ! 1905: ! 1906: Also note not all libcall names are passed to ENCODE_SECTION_INFO ! 1907: (__main for example). To make sure all libcall names have section ! 1908: info recorded in them, we do it here. */ 1.1 root 1909: 1910: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, RTL) \ 1911: do { fputs ("\t.IMPORT ", FILE); \ 1.1.1.4 ! root 1912: if (!function_label_operand (RTL, VOIDmode)) \ ! 1913: hppa_encode_label (RTL, 1); \ 1.1 root 1914: assemble_name (FILE, XSTR ((RTL), 0)); \ 1915: fputs (",CODE\n", FILE); \ 1916: } while (0) 1917: 1918: #define ASM_GLOBALIZE_LABEL(FILE, NAME) \ 1.1.1.3 root 1919: do { \ 1920: /* We only handle DATA objects here, functions are globalized in \ 1921: ASM_DECLARE_FUNCTION_NAME. */ \ 1922: if (! FUNCTION_NAME_P (NAME)) \ 1923: { \ 1924: fputs ("\t.EXPORT ", FILE); \ 1925: assemble_name (FILE, NAME); \ 1926: fputs (",DATA\n", FILE); \ 1927: } \ 1928: } while (0) 1.1 root 1929: 1930: /* This is how to output a reference to a user-level label named NAME. 1931: `assemble_name' uses this. */ 1932: 1933: #define ASM_OUTPUT_LABELREF(FILE,NAME) \ 1934: fprintf ((FILE), "%s", (NAME) + (FUNCTION_NAME_P (NAME) ? 1 : 0)) 1935: 1936: /* This is how to output an internal numbered label where 1937: PREFIX is the class of label and NUM is the number within the class. */ 1938: 1939: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 1.1.1.3 root 1940: {fprintf (FILE, "%c$%s%04d\n", (PREFIX)[0], (PREFIX) + 1, NUM);} 1.1 root 1941: 1942: /* This is how to store into the string LABEL 1943: the symbol_ref name of an internal numbered label where 1944: PREFIX is the class of label and NUM is the number within the class. 1945: This is suitable for output with `assemble_name'. */ 1946: 1947: #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 1.1.1.3 root 1948: sprintf (LABEL, "*%c$%s%04d", (PREFIX)[0], (PREFIX) + 1, NUM) 1.1 root 1949: 1950: /* This is how to output an assembler line defining a `double' constant. */ 1951: 1952: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ 1.1.1.4 ! root 1953: do { long l[2]; \ ! 1954: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \ ! 1955: fprintf (FILE, "\t.word 0x%lx\n\t.word 0x%lx\n", l[0], l[1]); \ ! 1956: } while (0) 1.1 root 1957: 1958: /* This is how to output an assembler line defining a `float' constant. */ 1959: 1960: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \ 1.1.1.4 ! root 1961: do { long l; \ ! 1962: REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \ ! 1963: fprintf (FILE, "\t.word 0x%lx\n", l); \ ! 1964: } while (0) 1.1 root 1965: 1966: /* This is how to output an assembler line defining an `int' constant. */ 1967: 1968: #define ASM_OUTPUT_INT(FILE,VALUE) \ 1969: { fprintf (FILE, "\t.word "); \ 1.1.1.3 root 1970: if (function_label_operand (VALUE, VOIDmode) \ 1971: && !TARGET_PORTABLE_RUNTIME) \ 1.1 root 1972: fprintf (FILE, "P%%"); \ 1973: output_addr_const (FILE, (VALUE)); \ 1974: fprintf (FILE, "\n");} 1975: 1976: /* Likewise for `short' and `char' constants. */ 1977: 1978: #define ASM_OUTPUT_SHORT(FILE,VALUE) \ 1979: ( fprintf (FILE, "\t.half "), \ 1980: output_addr_const (FILE, (VALUE)), \ 1981: fprintf (FILE, "\n")) 1982: 1983: #define ASM_OUTPUT_CHAR(FILE,VALUE) \ 1984: ( fprintf (FILE, "\t.byte "), \ 1985: output_addr_const (FILE, (VALUE)), \ 1986: fprintf (FILE, "\n")) 1987: 1988: /* This is how to output an assembler line for a numeric constant byte. */ 1989: 1990: #define ASM_OUTPUT_BYTE(FILE,VALUE) \ 1991: fprintf (FILE, "\t.byte 0x%x\n", (VALUE)) 1992: 1993: #define ASM_OUTPUT_ASCII(FILE, P, SIZE) \ 1994: output_ascii ((FILE), (P), (SIZE)) 1995: 1996: #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) 1.1.1.3 root 1997: #define ASM_OUTPUT_REG_POP(FILE,REGNO) 1.1 root 1998: /* This is how to output an element of a case-vector that is absolute. 1999: Note that this method makes filling these branch delay slots 2000: impossible. */ 2001: 2002: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ 2003: fprintf (FILE, "\tb L$%04d\n\tnop\n", VALUE) 2004: 2005: /* Jump tables are executable code and live in the TEXT section on the PA. */ 2006: #define JUMP_TABLES_IN_TEXT_SECTION 2007: 2008: /* This is how to output an element of a case-vector that is relative. 1.1.1.3 root 2009: This must be defined correctly as it is used when generating PIC code. 2010: 1.1.1.4 ! root 2011: I believe it safe to use the same definition as ASM_OUTPUT_ADDR_VEC_ELT 1.1.1.3 root 2012: on the PA since ASM_OUTPUT_ADDR_VEC_ELT uses pc-relative jump instructions 2013: rather than a table of absolute addresses. */ 1.1 root 2014: 2015: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ 1.1.1.3 root 2016: fprintf (FILE, "\tb L$%04d\n\tnop\n", VALUE) 1.1 root 2017: 2018: /* This is how to output an assembler line 2019: that says to advance the location counter 2020: to a multiple of 2**LOG bytes. */ 2021: 2022: #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 2023: fprintf (FILE, "\t.align %d\n", (1<<(LOG))) 2024: 2025: #define ASM_OUTPUT_SKIP(FILE,SIZE) \ 2026: fprintf (FILE, "\t.blockz %d\n", (SIZE)) 2027: 1.1.1.3 root 2028: /* This says how to output an assembler line to define a global common symbol 2029: with size SIZE (in bytes) and alignment ALIGN (in bits). */ 1.1 root 2030: 1.1.1.3 root 2031: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGNED) \ 2032: { bss_section (); \ 2033: assemble_name ((FILE), (NAME)); \ 2034: fputs ("\t.comm ", (FILE)); \ 2035: fprintf ((FILE), "%d\n", MAX ((SIZE), ((ALIGNED) / BITS_PER_UNIT)));} 2036: 2037: /* This says how to output an assembler line to define a local common symbol 2038: with size SIZE (in bytes) and alignment ALIGN (in bits). */ 2039: 2040: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGNED) \ 2041: { bss_section (); \ 2042: fprintf ((FILE), "\t.align %d\n", ((ALIGNED) / BITS_PER_UNIT)); \ 1.1 root 2043: assemble_name ((FILE), (NAME)); \ 1.1.1.3 root 2044: fprintf ((FILE), "\n\t.block %d\n", (SIZE));} 2045: 1.1 root 2046: /* Store in OUTPUT a string (made with alloca) containing 2047: an assembler-name for a local static variable named NAME. 2048: LABELNO is an integer which is different for each call. */ 2049: 2050: #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ 2051: ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \ 2052: sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO))) 2053: 2054: /* Define the parentheses used to group arithmetic operations 2055: in assembler code. */ 2056: 2057: #define ASM_OPEN_PAREN "(" 2058: #define ASM_CLOSE_PAREN ")" 2059: 1.1.1.3 root 2060: /* All HP assemblers use "!" to separate logical lines. */ 2061: #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == '!') 2062: 1.1 root 2063: /* Define results of standard character escape sequences. */ 2064: #define TARGET_BELL 007 2065: #define TARGET_BS 010 2066: #define TARGET_TAB 011 2067: #define TARGET_NEWLINE 012 2068: #define TARGET_VT 013 2069: #define TARGET_FF 014 2070: #define TARGET_CR 015 2071: 2072: #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \ 2073: ((CHAR) == '@' || (CHAR) == '#' || (CHAR) == '*' || (CHAR) == '^') 2074: 2075: /* Print operand X (an rtx) in assembler syntax to file FILE. 2076: CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. 2077: For `%' followed by punctuation, CODE is the punctuation and X is null. 2078: 2079: On the HP-PA, the CODE can be `r', meaning this is a register-only operand 2080: and an immediate zero should be represented as `r0'. 2081: 2082: Several % codes are defined: 2083: O an operation 2084: C compare conditions 2085: N extract conditions 2086: M modifier to handle preincrement addressing for memory refs. 2087: F modifier to handle preincrement addressing for fp memory refs */ 2088: 2089: #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE) 2090: 2091: 2092: /* Print a memory address as an operand to reference that memory location. */ 2093: 2094: #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ 2095: { register rtx addr = ADDR; \ 2096: register rtx base; \ 2097: int offset; \ 2098: switch (GET_CODE (addr)) \ 2099: { \ 2100: case REG: \ 2101: fprintf (FILE, "0(0,%s)", reg_names [REGNO (addr)]); \ 2102: break; \ 2103: case PLUS: \ 2104: if (GET_CODE (XEXP (addr, 0)) == CONST_INT) \ 2105: offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1); \ 2106: else if (GET_CODE (XEXP (addr, 1)) == CONST_INT) \ 2107: offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0); \ 2108: else \ 2109: abort (); \ 2110: fprintf (FILE, "%d(0,%s)", offset, reg_names [REGNO (base)]); \ 2111: break; \ 2112: case LO_SUM: \ 1.1.1.4 ! root 2113: if (!symbolic_operand (XEXP (addr, 1))) \ ! 2114: fputs ("R'", FILE); \ ! 2115: else if (flag_pic == 0) \ ! 2116: fputs ("RR'", FILE); \ ! 2117: else if (flag_pic == 1) \ ! 2118: abort (); \ ! 2119: else if (flag_pic == 2) \ ! 2120: fputs ("RT'", FILE); \ 1.1 root 2121: output_global_address (FILE, XEXP (addr, 1)); \ 2122: fputs ("(", FILE); \ 2123: output_operand (XEXP (addr, 0), 0); \ 2124: fputs (")", FILE); \ 2125: break; \ 2126: case CONST_INT: \ 2127: fprintf (FILE, "%d(0,0)", INTVAL (addr)); \ 2128: break; \ 2129: default: \ 2130: output_addr_const (FILE, addr); \ 2131: }} 2132: 2133: 2134: /* Define functions in pa.c and used in insn-output.c. */ 2135: 2136: extern char *output_and (); 2137: extern char *output_ior (); 2138: extern char *output_move_double (); 2139: extern char *output_fp_move_double (); 2140: extern char *output_block_move (); 2141: extern char *output_cbranch (); 2142: extern char *output_bb (); 1.1.1.2 root 2143: extern char *output_dbra (); 2144: extern char *output_movb (); 1.1 root 2145: extern char *output_return (); 1.1.1.2 root 2146: extern char *output_call (); 1.1 root 2147: extern char *output_mul_insn (); 2148: extern char *output_div_insn (); 2149: extern char *output_mod_insn (); 2150: extern char *singlemove_string (); 2151: extern void output_arg_descriptor (); 2152: extern void output_global_address (); 2153: extern struct rtx_def *legitimize_pic_address (); 2154: extern struct rtx_def *gen_cmp_fp (); 2155: extern void hppa_encode_label (); 2156: 1.1.1.3 root 2157: #if 0 2158: #define PREDICATE_CODES \ 1.1.1.4 ! root 2159: {"reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \ 1.1.1.3 root 2160: {"reg_or_cint_move_operand", {SUBREG, REG, CONST_INT}}, \ 2161: {"arith_operand", {SUBREG, REG, CONST_INT}}, \ 2162: {"arith32_operand", {SUBREG, REG, CONST_INT}}, \ 2163: {"arith11_operand", {SUBREG, REG, CONST_INT}}, \ 2164: {"arith5_operand", {SUBREG, REG, CONST_INT}}, \ 2165: {"pre_cint_operand", {CONST_INT}}, \ 2166: {"post_cint_operand", {CONST_INT}}, \ 2167: {"int5_operand", {CONST_INT}}, \ 2168: {"uint5_operand", {CONST_INT}}, \ 2169: {"uint32_operand", {CONST_INT}}, \ 2170: {"int11_operand", {CONST_INT}}, \ 2171: {"and_operand", {SUBREG, REG, CONST_INT}}, \ 2172: {"ior_operand", {CONST_INT}}, \ 2173: {"lhs_lshift_operand", {SUBREG, REG, CONST_INT}}, \ 2174: {"lhs_lshift_cint_operand", {CONST_INT}}, \ 2175: {"plus_xor_ior_operator", {PLUS, XOR, IOR}}, \ 2176: {"shadd_operand", {CONST_INT}}, \ 2177: {"eq_neq_comparison_operator", {EQ, NE}}, \ 2178: {"movb_comparison_operator", {EQ, NE, LT, GE}}, \ 2179: {"pc_or_label_operand", {LABEL_REF, PC}}, \ 2180: {"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \ 1.1.1.4 ! root 2181: {"reg_or_nonsymb_mem_operand", {SUBREG, REG, MEM}}, \ ! 2182: {"move_operand", {SUBREG, REG, CONST_INT, MEM}}, \ ! 2183: {"pic_label_operand", {LABEL_REF, CONST}}, \ 1.1.1.3 root 2184: {"function_label_operand", {SYMBOL_REF}}, \ 1.1.1.4 ! root 2185: {"reg_or_0_or_nonsymb_mem_operand", {SUBREG, REG, CONST_INT, \ ! 2186: CONST_DOUBLE, MEM}}, \ 1.1.1.3 root 2187: {"div_operand", {REG, CONST_INT}}, \ 1.1.1.4 ! root 2188: {"call_operand_address", {SYMBOL_REF, LABEL_REF, CONST_INT, \ ! 2189: CONST_DOUBLE, CONST, HIGH}}, 1.1.1.3 root 2190: #endif 1.1.1.4 ! root 2191: ! 2192: /* We want __gcc_plt_call to appear in every program built by ! 2193: gcc, so we make a reference to it out of __main. ! 2194: We use the asm statement to fool the optimizer into not ! 2195: removing the dead (but important) initialization of ! 2196: REFERENCE. */ ! 2197: ! 2198: #define DO_GLOBAL_DTORS_BODY \ ! 2199: do { \ ! 2200: extern void __gcc_plt_call (); \ ! 2201: void (*reference)() = &__gcc_plt_call; \ ! 2202: func_ptr *p; \ ! 2203: __asm__ ("" : : "r" (reference)); \ ! 2204: for (p = __DTOR_LIST__ + 1; *p; ) \ ! 2205: (*p++) (); \ ! 2206: } while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.