Annotation of GNUtools/cc/config/pa/next.h, revision 1.1.1.1

1.1       root        1: /* Target definitions for GNU compiler for hppa running NeXTSTEP
                      2:    Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: #define TARGET_DEFAULT (1+128+256)     /* 1.1, gas, stub calls */
                     21: 
                     22: #define TARGET_ARCHITECTURE \
                     23:   { { "hppa", 1 },             /* same as snake.  */           \
                     24:     { "hppa1.0", -1 },         /* nosnake.  */                 \
                     25:   }
                     26: 
                     27: /* must before the inclusion of pa/pa.h */
                     28: #define NeXT_ASM
                     29: 
                     30: #define MACHO_PIC 1
                     31: 
                     32: #include "pa/pa.h"
                     33: #include "nextstep.h"
                     34: 
                     35: 
                     36: #define DEFAULT_TARGET_ARCH "hppa"
                     37: 
                     38: #define HP_FP_ARG_DESCRIPTOR_REVERSED
                     39: 
                     40: #undef CPP_PREDEFINES
                     41: #define CPP_PREDEFINES "-Dhppa -DNATURAL_ALIGNMENT -DNeXT -Dunix -D__MACH__ -D__BIG_ENDIAN__ -D__ARCHITECTURE__=\"hppa\" -D_PA_RISC1_1"
                     42: 
                     43: #undef ASM_FILE_START
                     44: #define ASM_FILE_START
                     45: 
                     46: #undef ASM_FILE_END
                     47: #undef ASM_OUTPUT_EXTERNAL_LIBCALL
                     48: #undef ASM_OUTPUT_EXTERNAL
                     49: 
                     50: #undef FUNCTION_PROLOGUE
                     51: #define FUNCTION_PROLOGUE
                     52: 
                     53: #undef FUNCTION_EPILOGUE
                     54: #define FUNCTION_EPILOGUE
                     55: 
                     56: #undef GLOBAL_ASM_OP
                     57: #define GLOBAL_ASM_OP ".globl"
                     58: 
                     59: #undef SIZE_TYPE
                     60: #define SIZE_TYPE "long unsigned int"
                     61: 
                     62: #undef ASM_GLOBALIZE_LABEL
                     63: #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
                     64:   do { fprintf (FILE, "%s ", GLOBAL_ASM_OP);           \
                     65:        assemble_name (FILE, NAME);                     \
                     66:        fputs ("\n", FILE);} while (0)
                     67: 
                     68: /* This is how to output an internal numbered label where
                     69:    PREFIX is the class of label and NUM is the number within the class.  */
                     70: 
                     71: #undef ASM_OUTPUT_INTERNAL_LABEL
                     72: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)     \
                     73:   asm_fprintf (FILE, "%0L%s%d:\n", PREFIX, NUM)
                     74: 
                     75: /* This is how to store into the string LABEL
                     76:    the symbol_ref name of an internal numbered label where
                     77:    PREFIX is the class of label and NUM is the number within the class.
                     78:    This is suitable for output with `assemble_name'.  */
                     79: 
                     80: #undef STRING_SECTION_NAME
                     81: #define STRING_SECTION_NAME "ascii"
                     82: 
                     83: #undef ASM_GENERATE_INTERNAL_LABEL
                     84: #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
                     85:   sprintf (LABEL, "*%s%d", PREFIX, NUM)
                     86: 
                     87: /* This is how to output an assembler line defining a `double' constant.  */
                     88: 
                     89: #undef ASM_OUTPUT_DOUBLE
                     90: #define ASM_OUTPUT_DOUBLE(FILE,VALUE)                                  \
                     91:   do {                                                                 \
                     92:     long hex[2];                                                       \
                     93:     REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex);                          \
                     94:     fprintf(FILE, "\t; .double %.20g\n", (VALUE));                     \
                     95:     fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]);    \
                     96:   } while (0)
                     97: 
                     98: /* This is how to output an assembler line defining a `float' constant.  */
                     99: 
                    100: #undef ASM_OUTPUT_FLOAT
                    101: #define ASM_OUTPUT_FLOAT(FILE,VALUE)                   \
                    102: do { long l;                                           \
                    103:      REAL_VALUE_TO_TARGET_SINGLE (VALUE, l);           \
                    104:      fprintf(FILE, "\t;        .single %.12e\n", (VALUE));     \
                    105:      fprintf (FILE, "\t.long 0x%x\n", l);              \
                    106:    } while (0)
                    107: 
                    108: #undef ASM_OUTPUT_SKIP
                    109: #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
                    110:   fprintf (FILE, "\t.space %u\n", (SIZE))
                    111: 
                    112: /* Output to assembler file text saying following lines
                    113:    may contain character constants, extra white space, comments, etc.  */
                    114: 
                    115: #undef ASM_APP_ON
                    116: #define ASM_APP_ON "#APP\n"
                    117: 
                    118: /* Output to assembler file text saying following lines
                    119:    no longer contain unusual constructs.  */
                    120: 
                    121: #undef ASM_APP_OFF
                    122: #define ASM_APP_OFF "#NO_APP\n"
                    123: 
                    124: /* This is how to output a reference to a user-level label named NAME.
                    125:    `assemble_name' uses this.  */
                    126: 
                    127: #define ASM_GENERATE_LABELREF(BUFFER,NAME)     \
                    128:   do { if (NAME[0] == '+' || NAME[0] == '-') sprintf (BUFFER, "\"%s\"", NAME);         \
                    129:        else if (!strncmp (NAME, "_OBJC_", 6)) sprintf (BUFFER, "L%s", NAME);           \
                    130:        else if (!strncmp (NAME, ".objc_class_name_", 17)                       \
                    131:                || !strncmp (NAME, "$$", 2)) strcpy (BUFFER, NAME);             \
                    132:        else if (!strncmp (NAME, "mcount", 6)) sprintf (BUFFER, "%s", NAME);    \
                    133:        else sprintf (BUFFER, "_%s", NAME); } while (0)
                    134: 
                    135: #undef ASM_OUTPUT_LABELREF
                    136: #define ASM_OUTPUT_LABELREF(FILE,NAME)                         \
                    137:   do { char __buf[256]; ASM_GENERATE_LABELREF (__buf, NAME);   \
                    138:        fprintf (FILE, "%s", __buf); } while (0)
                    139: 
                    140: /* Output before read-only data.  */
                    141: 
                    142: #undef TEXT_SECTION_ASM_OP
                    143: #define TEXT_SECTION_ASM_OP ".text"
                    144: 
                    145: /* Output before writable data.  */
                    146: 
                    147: #undef DATA_SECTION_ASM_OP
                    148: #define DATA_SECTION_ASM_OP ".data"
                    149: 
                    150: /* override how BSS is handled */
                    151: 
                    152: #undef BSS_SECTION_ASM_OP
                    153: 
                    154: /* This says how to output an assembler line
                    155:    to define a global common symbol.  */
                    156: 
                    157: #undef ASM_OUTPUT_COMMON
                    158: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
                    159: ( fputs (".comm ", (FILE)),                    \
                    160:   assemble_name ((FILE), (NAME)),              \
                    161:   fprintf ((FILE), ",%u\n", (ROUNDED)))
                    162: 
                    163: /* This says how to output an assembler line
                    164:    to define a local common symbol.  */
                    165: 
                    166: #undef ASM_OUTPUT_LOCAL
                    167: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
                    168: ( fputs (".lcomm ", (FILE)),                   \
                    169:   assemble_name ((FILE), (NAME)),              \
                    170:   fprintf ((FILE), ",%u\n", (ROUNDED)))
                    171: 
                    172: #undef ASM_FORMAT_PRIVATE_NAME
                    173: #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
                    174: ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),   \
                    175:   sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
                    176: 
                    177: #undef ENCODE_SECTION_INFO
                    178: 
                    179: #undef ASM_DECLARE_FUNCTION_NAME
                    180: 
                    181: #undef TRAMPOLINE_TEMPLATE(FILE)
                    182: #define TRAMPOLINE_TEMPLATE(FILE) \
                    183: {                                              \
                    184:   fprintf (FILE, "\tldw 12(0,%%r22),%%r21\n"); \
                    185:   fprintf (FILE, "\tbe 0(4,%%r21)\n");         \
                    186:   fprintf (FILE, "\tldw 16(0,%%r22),%%r29\n"); \
                    187:   fprintf (FILE, "\t.short 0\n");              \
                    188:   fprintf (FILE, "\t.short 0\n");              \
                    189: }
                    190: 
                    191: #undef ASM_OUTPUT_INT
                    192: #define ASM_OUTPUT_INT(FILE,VALUE)  \
                    193: { fprintf (FILE, "\t.long ");                  \
                    194:   if (function_label_operand (VALUE, VOIDmode)  \
                    195:       && in_section != in_text)                        \
                    196:     fprintf (FILE, "P%%");                     \
                    197:   output_addr_const (FILE, (VALUE));           \
                    198:   fprintf (FILE, "\n");}
                    199: 
                    200: #undef ASM_OUTPUT_SHORT
                    201: #define ASM_OUTPUT_SHORT(FILE,VALUE)  \
                    202: ( fprintf (FILE, "\t.short "),                 \
                    203:   output_addr_const (FILE, (VALUE)),           \
                    204:   fprintf (FILE, "\n"))
                    205: 
                    206: #undef ASM_OUTPUT_ADDR_VEC_ELT
                    207: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
                    208:   fprintf (FILE, "\tb L%d\n\tnop\n", VALUE)
                    209: 
                    210: #define OUTPUT_COMPILER_STUB
                    211: 
                    212: /* this may not work for double values --  hard coded to 32 bit entities */
                    213: 
                    214: #define OBJC_FORWARDING_REG_OFFSET(ISREG, OFF, REGNO) \
                    215:   do { OFF = (FP_REG_CLASS_P( REGNO_REG_CLASS(REGNO)) \
                    216:               ? -2 * ((REGNO) - 44) - 4               \
                    217:               :  4 * ((REGNO) - 26) - 4);             \
                    218:        ISREG = 0; } while (0)
                    219: 
                    220: #undef FUNCTION_ARG
                    221: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)                           \
                    222:   (4 >= ((CUM) + FUNCTION_ARG_SIZE ((MODE), (TYPE)))                   \
                    223:    ? gen_rtx (REG, (MODE),                                             \
                    224:              (FUNCTION_ARG_SIZE ((MODE), (TYPE)) > 1                   \
                    225:               ? (((MODE) == DFmode)                                    \
                    226:                  ? ((CUM) ? 50 : 46)                                   \
                    227:                  : ((CUM) ? 23 : 25))                                  \
                    228:               : (((MODE) == SFmode)                                    \
                    229:                  ? (44 + 2 * (CUM))                                    \
                    230:                  : (27 - (CUM) - FUNCTION_ARG_SIZE ((MODE), (TYPE))))))\
                    231:    : 0)
                    232: 
                    233: /*
                    234:    After the magic in calls.c has moved an argument into some register,
                    235:    this macro is expanded so the backend can choose to duplicate
                    236:    or spill that load to somewhere else.  
                    237:      The NeXTSTEP/PA backend uses this to spill arguments from float
                    238:    registers into the general purpose regs.  
                    239: 
                    240:    NAME is the name of the function being called.
                    241:    NREGS is the number of registers being loaded into.
                    242:    REG_RTX is the rtx for the (first) register being loaded.
                    243:    VALUE_RTX is the value being loaded.
                    244:    MODE is the mode the value is loaded in.
                    245: 
                    246:    The USE_DUP_REG_ARG_LOAD macro allows emitting USE insns 
                    247:    for possible registers changed.
                    248: */
                    249: 
                    250: #define DUP_REG_ARG_LOAD(NAME, NREGS, REG_RTX, VALUE_RTX, MODE)         \
                    251:   do { if ((MODE)==DFmode && REGNO(REG_RTX) >= 46) {                   \
                    252:            move_block_to_reg ((REGNO(REG_RTX)==46 ? 25 : 23),          \
                    253:                      validize_mem(VALUE_RTX), 2, MODE);                \
                    254:        } else if ((MODE)==SFmode && REGNO(REG_RTX) >= 44) {            \
                    255:            move_block_to_reg (26-((REGNO(REG_RTX)-44)/2),              \
                    256:                      validize_mem(VALUE_RTX), 1, MODE); }              \
                    257:   } while (0)
                    258: 
                    259: /* Emit insn's to actually use the spilled regs so the loads
                    260:    will not be handled wrong by the optimizer. */
                    261: #define USE_DUP_REG_ARG_LOAD(NAME, NREGS, REG_RTX, MODE)       \
                    262:   do { if (NREGS == 0) { if ((MODE)==DFmode && REGNO(REG_RTX) >= 46) { \
                    263:           use_regs ((REGNO(REG_RTX)==46 ? 25 : 23), 2);                \
                    264:        } else if ((MODE)==SFmode) {                                    \
                    265:            emit_insn (gen_rtx (USE, VOIDmode, gen_rtx (REG, SImode, 26-((REGNO (REG_RTX)-44)/2)))); }              \
                    266:   }} while (0)
                    267: 
                    268: #define PROFILE_LABEL_PREFIX    
                    269: 
                    270: #undef OVERRIDE_OPTIONS
                    271: 
                    272: #undef CONSTANT_ADDRESS_P
                    273: #define CONSTANT_ADDRESS_P(X) \
                    274:   ((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF            \
                    275:    || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST               \
                    276:    || GET_CODE (X) == HIGH)                                            \
                    277:    && (reload_in_progress || reload_completed                          \
                    278:        || ! symbolic_expression_p (X) || machopic_operand_p (X)))
                    279: 
                    280: #define HI_SUM_TARGET_RTX      (gen_rtx (REG, SImode, 1))
                    281: #define HI_SUM_TARGET_REGNO    1
                    282: 
                    283: #undef ASM_OUTPUT_ADDR_DIFF_ELT
                    284: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)  \
                    285:   fprintf (FILE, "\tb L%d\n\tnop\n", VALUE)
                    286: 
                    287: #undef PIC_OFFSET_TABLE_REGNUM
                    288: #define PIC_OFFSET_TABLE_REGNUM 18
                    289: 
                    290: #undef OPTIMIZATION_OPTIONS
                    291: #define OPTIMIZATION_OPTIONS(OPTIMIZE) \
                    292: {                                                              \
                    293:   if (OPTIMIZE >= 1)                                           \
                    294:     {                                                          \
                    295:       flag_cse_follow_jumps = 1;                               \
                    296:       flag_cse_skip_blocks = 1;                                        \
                    297:       flag_expensive_optimizations = 1;                                \
                    298:       flag_strength_reduce = 1;                                        \
                    299:       flag_rerun_cse_after_loop = 1;                           \
                    300:       flag_caller_saves = 1;                                   \
                    301:       flag_schedule_insns = 1;                                 \
                    302:       flag_schedule_insns_after_reload = 1;                    \
                    303:     }                                                          \
                    304:   if (OPTIMIZE >= 2)                                           \
                    305:     flag_omit_frame_pointer = 1;                               \
                    306: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.