00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 enum cmp_type
00026 {
00027 CMP_SI,
00028 CMP_SF,
00029 CMP_DF,
00030 CMP_MAX
00031 };
00032
00033
00034 extern unsigned int total_code_bytes;
00035
00036
00037
00038 enum processor_type
00039 {
00040 PROCESSOR_700,
00041 PROCESSOR_7100,
00042 PROCESSOR_7100LC,
00043 PROCESSOR_7200,
00044 PROCESSOR_8000
00045 };
00046
00047
00048 extern const char *pa_cpu_string;
00049 extern enum processor_type pa_cpu;
00050
00051 #define pa_cpu_attr ((enum attr_cpu)pa_cpu)
00052
00053
00054
00055 enum architecture_type
00056 {
00057 ARCHITECTURE_10,
00058 ARCHITECTURE_11,
00059 ARCHITECTURE_20
00060 };
00061
00062 struct rtx_def;
00063
00064
00065 extern const char *pa_arch_string;
00066 extern enum architecture_type pa_arch;
00067
00068
00069
00070 #define TARGET_VERSION fputs (" (hppa)", stderr);
00071
00072
00073
00074 extern int target_flags;
00075
00076
00077
00078 #define MASK_PA_11 1
00079
00080 #ifndef TARGET_PA_11
00081 #define TARGET_PA_11 (target_flags & MASK_PA_11)
00082 #endif
00083
00084
00085
00086
00087
00088
00089 #define MASK_DISABLE_FPREGS 2
00090 #define TARGET_DISABLE_FPREGS (target_flags & MASK_DISABLE_FPREGS)
00091
00092
00093
00094
00095 #define MASK_NO_SPACE_REGS 4
00096 #define TARGET_NO_SPACE_REGS (target_flags & MASK_NO_SPACE_REGS)
00097
00098
00099 #define MASK_JUMP_IN_DELAY 8
00100 #define TARGET_JUMP_IN_DELAY (target_flags & MASK_JUMP_IN_DELAY)
00101
00102
00103 #define MASK_DISABLE_INDEXING 32
00104 #define TARGET_DISABLE_INDEXING (target_flags & MASK_DISABLE_INDEXING)
00105
00106
00107
00108
00109
00110
00111
00112 #define MASK_PORTABLE_RUNTIME 64
00113 #define TARGET_PORTABLE_RUNTIME (target_flags & MASK_PORTABLE_RUNTIME)
00114
00115
00116
00117
00118 #define MASK_GAS 128
00119 #define TARGET_GAS (target_flags & MASK_GAS)
00120
00121
00122 #define MASK_SOFT_FLOAT 256
00123 #define TARGET_SOFT_FLOAT (target_flags & MASK_SOFT_FLOAT)
00124
00125
00126
00127 #define MASK_LONG_LOAD_STORE 512
00128 #define TARGET_LONG_LOAD_STORE (target_flags & MASK_LONG_LOAD_STORE)
00129
00130
00131
00132
00133
00134
00135
00136 #define MASK_FAST_INDIRECT_CALLS 1024
00137 #define TARGET_FAST_INDIRECT_CALLS (target_flags & MASK_FAST_INDIRECT_CALLS)
00138
00139
00140
00141 #define MASK_BIG_SWITCH 2048
00142 #define TARGET_BIG_SWITCH (target_flags & MASK_BIG_SWITCH)
00143
00144
00145
00146
00147 #define MASK_PA_20 4096
00148 #ifndef TARGET_PA_20
00149 #define TARGET_PA_20 (target_flags & MASK_PA_20)
00150 #endif
00151
00152
00153 #ifndef TARGET_64BIT
00154 #define TARGET_64BIT 0
00155 #endif
00156
00157
00158 #ifndef TARGET_ELF32
00159 #define TARGET_ELF32 0
00160 #endif
00161
00162
00163 #ifndef TARGET_SOM
00164 #define TARGET_SOM 0
00165 #endif
00166
00167
00168
00169
00170
00171
00172
00173 #define TARGET_SWITCHES \
00174 {{"snake", MASK_PA_11, "Generate PA1.1 code"}, \
00175 {"nosnake", -(MASK_PA_11 | MASK_PA_20), "Generate PA1.0 code"}, \
00176 {"pa-risc-1-0", -(MASK_PA_11 | MASK_PA_20), "Generate PA1.0 code"}, \
00177 {"pa-risc-1-1", MASK_PA_11, "Generate PA1.1 code"}, \
00178 {"pa-risc-2-0", MASK_PA_20, "Generate PA2.0 code. This option requires binutils 2.10 or later"}, \
00179 {"disable-fpregs", MASK_DISABLE_FPREGS, "Disable FP regs"}, \
00180 {"no-disable-fpregs", -MASK_DISABLE_FPREGS, "Do not disable FP regs"},\
00181 {"no-space-regs", MASK_NO_SPACE_REGS, "Disable space regs"}, \
00182 {"space-regs", -MASK_NO_SPACE_REGS, "Do not disable space regs"}, \
00183 {"jump-in-delay", MASK_JUMP_IN_DELAY, "Put jumps in call delay slots"},\
00184 {"no-jump-in-delay", -MASK_JUMP_IN_DELAY, "Do not put jumps in call delay slots"}, \
00185 {"disable-indexing", MASK_DISABLE_INDEXING, "Disable indexed addressing"},\
00186 {"no-disable-indexing", -MASK_DISABLE_INDEXING, "Do not disable indexed addressing"},\
00187 {"portable-runtime", MASK_PORTABLE_RUNTIME, "Use portable calling conventions"}, \
00188 {"no-portable-runtime", -MASK_PORTABLE_RUNTIME, "Do not use portable calling conventions"},\
00189 {"gas", MASK_GAS, "Assume code will be assembled by GAS"}, \
00190 {"no-gas", -MASK_GAS, "Do not assume code will be assembled by GAS"}, \
00191 {"soft-float", MASK_SOFT_FLOAT, "Use software floating point"}, \
00192 {"no-soft-float", -MASK_SOFT_FLOAT, "Do not use software floating point"}, \
00193 {"long-load-store", MASK_LONG_LOAD_STORE, "Emit long load/store sequences"}, \
00194 {"no-long-load-store", -MASK_LONG_LOAD_STORE, "Do not emit long load/store sequences"},\
00195 {"fast-indirect-calls", MASK_FAST_INDIRECT_CALLS, "Generate fast indirect calls"},\
00196 {"no-fast-indirect-calls", -MASK_FAST_INDIRECT_CALLS, "Do not generate fast indirect calls"},\
00197 {"big-switch", MASK_BIG_SWITCH, "Generate code for huge switch statements"}, \
00198 {"no-big-switch", -MASK_BIG_SWITCH, "Do not generate code for huge switch statements"}, \
00199 {"linker-opt", 0, "Enable linker optimizations"}, \
00200 { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT, NULL}}
00201
00202 #ifndef TARGET_DEFAULT
00203 #define TARGET_DEFAULT (MASK_GAS | MASK_JUMP_IN_DELAY)
00204 #endif
00205
00206 #ifndef TARGET_CPU_DEFAULT
00207 #define TARGET_CPU_DEFAULT 0
00208 #endif
00209
00210 #define TARGET_OPTIONS \
00211 { \
00212 { "schedule=", &pa_cpu_string, "Specify CPU for scheduling purposes" },\
00213 { "arch=", &pa_arch_string, "Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later." }\
00214 }
00215
00216
00217
00218 #define ASSEMBLER_DIALECT (TARGET_PA_20 ? 1 : 0)
00219
00220 #define OVERRIDE_OPTIONS override_options ()
00221
00222
00223
00224 #include "dbxelf.h"
00225
00226
00227
00228 #define DEFAULT_GDB_EXTENSIONS 1
00229
00230
00231
00232
00233
00234
00235 #undef DBX_CONTIN_LENGTH
00236 #define DBX_CONTIN_LENGTH 3000
00237
00238
00239 #define ASM_STABS_OP "\t.stabs\t"
00240 #define ASM_STABN_OP "\t.stabn\t"
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 #define DEBUGGER_AUTO_OFFSET(X) \
00256 ((GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0) \
00257 + (frame_pointer_needed ? 0 : compute_frame_size (get_frame_size (), 0)))
00258
00259 #define DEBUGGER_ARG_OFFSET(OFFSET, X) \
00260 ((GET_CODE (X) == PLUS ? OFFSET : 0) \
00261 + (frame_pointer_needed ? 0 : compute_frame_size (get_frame_size (), 0)))
00262
00263 #define CPP_PA10_SPEC ""
00264 #define CPP_PA11_SPEC "-D_PA_RISC1_1 -D__hp9000s700"
00265 #define CPP_PA20_SPEC "-D_PA_RISC2_0 -D__hp9000s800"
00266 #define CPP_64BIT_SPEC "-D__LP64__ -D__LONG_MAX__=9223372036854775807L"
00267
00268 #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11) == 0
00269 #define CPP_CPU_DEFAULT_SPEC "%(cpp_pa10)"
00270 #endif
00271
00272 #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11) != 0
00273 #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_20) != 0
00274 #define CPP_CPU_DEFAULT_SPEC "%(cpp_pa11) %(cpp_pa20)"
00275 #else
00276 #define CPP_CPU_DEFAULT_SPEC "%(cpp_pa11)"
00277 #endif
00278 #endif
00279
00280 #if TARGET_64BIT
00281 #define CPP_64BIT_DEFAULT_SPEC "%(cpp_64bit)"
00282 #else
00283 #define CPP_64BIT_DEFAULT_SPEC ""
00284 #endif
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 #ifndef SUBTARGET_EXTRA_SPECS
00297 #define SUBTARGET_EXTRA_SPECS
00298 #endif
00299
00300 #define EXTRA_SPECS \
00301 { "cpp_pa10", CPP_PA10_SPEC}, \
00302 { "cpp_pa11", CPP_PA11_SPEC}, \
00303 { "cpp_pa20", CPP_PA20_SPEC}, \
00304 { "cpp_64bit", CPP_64BIT_SPEC}, \
00305 { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \
00306 { "cpp_64bit_default", CPP_64BIT_DEFAULT_SPEC }, \
00307 SUBTARGET_EXTRA_SPECS
00308
00309 #define CPP_SPEC "\
00310 %{mpa-risc-1-0:%(cpp_pa10)} \
00311 %{mpa-risc-1-1:%(cpp_pa11)} \
00312 %{msnake:%(cpp_pa11)} \
00313 %{mpa-risc-2-0:%(cpp_pa20)} \
00314 %{!mpa-risc-1-0:%{!mpa-risc-1-1:%{!mpa-risc-2-0:%{!msnake:%(cpp_cpu_default)}}}} \
00315 %{m64bit:%(cpp_64bit)} \
00316 %{!m64bit:%(cpp_64bit_default)} \
00317 %{!ansi: -D_HPUX_SOURCE -D_HIUX_SOURCE -D__STDC_EXT__ -D_INCLUDE_LONGLONG} \
00318 %{threads: -D_REENTRANT -D_DCE_THREADS}"
00319
00320 #define CPLUSPLUS_CPP_SPEC "\
00321 -D_HPUX_SOURCE -D_HIUX_SOURCE -D__STDC_EXT__ -D_INCLUDE_LONGLONG \
00322 %{mpa-risc-1-0:%(cpp_pa10)} \
00323 %{mpa-risc-1-1:%(cpp_pa11)} \
00324 %{msnake:%(cpp_pa11)} \
00325 %{mpa-risc-2-0:%(cpp_pa20)} \
00326 %{!mpa-risc-1-0:%{!mpa-risc-1-1:%{!mpa-risc-2-0:%{!msnake:%(cpp_cpu_default)}}}} \
00327 %{m64bit:%(cpp_64bit)} \
00328 %{!m64bit:%(cpp_64bit_default)} \
00329 %{threads: -D_REENTRANT -D_DCE_THREADS}"
00330
00331
00332
00333 #define CC1_SPEC "%{pg:} %{p:}"
00334
00335 #define LINK_SPEC "%{mlinker-opt:-O} %{!shared:-u main} %{shared:-b}"
00336
00337
00338 #ifndef LIB_SPEC
00339 #define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
00340 #endif
00341
00342
00343
00344
00345
00346
00347
00348
00349 #define MODIFY_TARGET_NAME {{"-32", DELETE, "64"}, {"-64", ADD, "64"}}
00350
00351
00352
00353 #define SIZE_TYPE "unsigned int"
00354 #define PTRDIFF_TYPE "int"
00355 #define WCHAR_TYPE "unsigned int"
00356 #define WCHAR_UNSIGNED 1
00357 #define WCHAR_TYPE_SIZE 32
00358
00359
00360 #define CAN_DEBUG_WITHOUT_FP
00361
00362
00363 #define MACHINE_DEPENDENT_REORG(X) pa_reorg(X)
00364
00365
00366
00367 #define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Asystem=unix -Asystem=bsd -Acpu=hppa -Amachine=hppa"
00368
00369
00370
00371
00372
00373 #define REAL_ARITHMETIC
00374
00375
00376
00377
00378
00379
00380
00381 #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
00382 if (GET_MODE_CLASS (MODE) == MODE_INT \
00383 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
00384 (MODE) = word_mode;
00385
00386
00387
00388 #define BITS_BIG_ENDIAN 1
00389
00390
00391
00392 #define BYTES_BIG_ENDIAN 1
00393
00394
00395
00396 #define WORDS_BIG_ENDIAN 1
00397
00398
00399 #define BITS_PER_UNIT 8
00400
00401
00402
00403
00404
00405 #define BITS_PER_WORD (TARGET_64BIT ? 64 : 32)
00406 #define MAX_BITS_PER_WORD 64
00407 #define MAX_LONG_TYPE_SIZE 32
00408 #define MAX_WCHAR_TYPE_SIZE 32
00409
00410
00411 #define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4)
00412 #define MIN_UNITS_PER_WORD 4
00413
00414
00415
00416 #define POINTER_SIZE BITS_PER_WORD
00417
00418
00419 #define PARM_BOUNDARY BITS_PER_WORD
00420
00421
00422
00423 #define MAX_PARM_BOUNDARY BIGGEST_ALIGNMENT
00424
00425
00426
00427
00428
00429
00430 #define STACK_BOUNDARY BIGGEST_ALIGNMENT
00431
00432 #define PREFERRED_STACK_BOUNDARY (8 * STACK_BOUNDARY)
00433
00434
00435 #define FUNCTION_BOUNDARY BITS_PER_WORD
00436
00437
00438 #define EMPTY_FIELD_BOUNDARY 32
00439
00440
00441 #define STRUCTURE_SIZE_BOUNDARY 8
00442
00443
00444 #define PCC_BITFIELD_TYPE_MATTERS 1
00445
00446
00447 #define BIGGEST_ALIGNMENT (2 * BITS_PER_WORD)
00448
00449
00450 #define CONSTANT_ALIGNMENT(CODE, TYPEALIGN) \
00451 ((TYPEALIGN) < 32 ? 32 : (TYPEALIGN))
00452
00453
00454 #define DATA_ALIGNMENT(TYPE, ALIGN) \
00455 (TREE_CODE (TYPE) == ARRAY_TYPE \
00456 && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
00457 && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
00458
00459
00460
00461 #define STRICT_ALIGNMENT 1
00462
00463
00464 #define TARGET_MEM_FUNCTIONS
00465
00466
00467
00468
00469
00470 #define MODES_TIEABLE_P(MODE1, MODE2) \
00471 (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
00472
00473
00474
00475
00476
00477
00478
00479
00480 #define STACK_POINTER_REGNUM 30
00481
00482
00483 #define FRAME_POINTER_REGNUM 3
00484
00485
00486 #define FRAME_POINTER_REQUIRED \
00487 (current_function_calls_alloca)
00488
00489
00490
00491
00492
00493
00494
00495 #define INITIAL_FRAME_POINTER_OFFSET(VAR) \
00496 do {(VAR) = - compute_frame_size (get_frame_size (), 0);} while (0)
00497
00498
00499 #define ARG_POINTER_REGNUM 3
00500
00501
00502 #define STATIC_CHAIN_REGNUM 29
00503
00504
00505
00506
00507 #define PIC_OFFSET_TABLE_REGNUM (TARGET_64BIT ? 27 : 19)
00508 #define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1
00509
00510
00511
00512 extern struct rtx_def *hppa_pic_save_rtx PARAMS ((void));
00513
00514 #define DEFAULT_PCC_STRUCT_RETURN 0
00515
00516
00517
00518
00519
00520
00521 #define RETURN_IN_MEMORY(TYPE) \
00522 ((unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) > (TARGET_64BIT ? 16 : 8))
00523
00524
00525
00526 #define STRUCT_VALUE_REGNUM 28
00527
00528
00529 #define EH_RETURN_DATA_REGNO(N) \
00530 ((N) < 3 ? (N) + 20 : (N) == 4 ? 31 : INVALID_REGNUM)
00531 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 29)
00532 #define EH_RETURN_HANDLER_RTX gen_rtx_REG (Pmode, 2)
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
00552 ((C) == 'I' ? VAL_11_BITS_P (VALUE) \
00553 : (C) == 'J' ? VAL_14_BITS_P (VALUE) \
00554 : (C) == 'K' ? zdepi_cint_p (VALUE) \
00555 : (C) == 'L' ? VAL_5_BITS_P (VALUE) \
00556 : (C) == 'M' ? (VALUE) == 0 \
00557 : (C) == 'N' ? (((VALUE) & (((HOST_WIDE_INT) -1 << 31) | 0x7ff)) == 0 \
00558 || (((VALUE) & (((HOST_WIDE_INT) -1 << 31) | 0x7ff)) \
00559 == (HOST_WIDE_INT) -1 << 31)) \
00560 : (C) == 'O' ? (((VALUE) & ((VALUE) + 1)) == 0) \
00561 : (C) == 'P' ? and_mask_p (VALUE) \
00562 : 0)
00563
00564
00565
00566
00567
00568
00569 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
00570 ((C) == 'G' ? (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT \
00571 && (VALUE) == CONST0_RTX (GET_MODE (VALUE))) \
00572 : 0)
00573
00574
00575 #define INDEX_REG_CLASS GENERAL_REGS
00576 #define BASE_REG_CLASS GENERAL_REGS
00577
00578 #define FP_REG_CLASS_P(CLASS) \
00579 ((CLASS) == FP_REGS || (CLASS) == FPUPPER_REGS)
00580
00581
00582 #define FP_REGNO_P(N) ((N) >= FP_REG_FIRST && (N) <= FP_REG_LAST)
00583
00584
00585
00586
00587
00588 #define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS)
00589
00590
00591
00592
00593
00594
00595
00596 #define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \
00597 ((CLASS == BASE_REG_CLASS && GET_CODE (IN) == REG \
00598 && REGNO (IN) < FIRST_PSEUDO_REGISTER) \
00599 ? NO_REGS : secondary_reload_class (CLASS, MODE, IN))
00600
00601
00602
00603 #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \
00604 (FP_REG_CLASS_P (CLASS1) != FP_REG_CLASS_P (CLASS2))
00605
00606
00607 #define SECONDARY_MEMORY_NEEDED_RTX(MODE) \
00608 gen_rtx_MEM (MODE, gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-16)))
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 #define ARGS_GROW_DOWNWARD
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630 #define STARTING_FRAME_OFFSET 8
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 #define FIRST_PARM_OFFSET(FNDECL) (TARGET_64BIT ? -64 : -32)
00645
00646
00647
00648 #define REG_PARM_STACK_SPACE(DECL) (TARGET_64BIT ? 64 : 16)
00649
00650
00651
00652 #define OUTGOING_REG_PARM_STACK_SPACE
00653
00654
00655
00656
00657
00658 #define ACCUMULATE_OUTGOING_ARGS 1
00659
00660
00661
00662
00663
00664 #define STACK_POINTER_OFFSET \
00665 (TARGET_64BIT ? -(current_function_outgoing_args_size + 16): -32)
00666
00667 #define STACK_DYNAMIC_OFFSET(FNDECL) \
00668 (TARGET_64BIT \
00669 ? (STACK_POINTER_OFFSET) \
00670 : ((STACK_POINTER_OFFSET) - current_function_outgoing_args_size))
00671
00672
00673
00674
00675
00676
00677
00678 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690 #define FUNCTION_VALUE(VALTYPE, FUNC) \
00691 gen_rtx_REG (((INTEGRAL_TYPE_P (VALTYPE) \
00692 && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \
00693 || POINTER_TYPE_P (VALTYPE)) \
00694 ? word_mode : TYPE_MODE (VALTYPE), \
00695 TREE_CODE (VALTYPE) == REAL_TYPE && !TARGET_SOFT_FLOAT ? 32 : 28)
00696
00697
00698
00699
00700 #define LIBCALL_VALUE(MODE) \
00701 gen_rtx_REG (MODE, \
00702 (! TARGET_SOFT_FLOAT \
00703 && ((MODE) == SFmode || (MODE) == DFmode) ? 32 : 28))
00704
00705
00706
00707
00708 #define FUNCTION_VALUE_REGNO_P(N) \
00709 ((N) == 28 || (! TARGET_SOFT_FLOAT && (N) == 32))
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723 struct hppa_args {int words, nargs_prototype, indirect; };
00724
00725 #define CUMULATIVE_ARGS struct hppa_args
00726
00727
00728
00729
00730
00731 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
00732 (CUM).words = 0, \
00733 (CUM).indirect = INDIRECT, \
00734 (CUM).nargs_prototype = (FNTYPE && TYPE_ARG_TYPES (FNTYPE) \
00735 ? (list_length (TYPE_ARG_TYPES (FNTYPE)) - 1 \
00736 + (TYPE_MODE (TREE_TYPE (FNTYPE)) == BLKmode \
00737 || RETURN_IN_MEMORY (TREE_TYPE (FNTYPE)))) \
00738 : 0)
00739
00740
00741
00742
00743
00744
00745 #define INIT_CUMULATIVE_INCOMING_ARGS(CUM,FNTYPE,IGNORE) \
00746 (CUM).words = 0, \
00747 (CUM).indirect = 0, \
00748 (CUM).nargs_prototype = 1000
00749
00750
00751
00752 #define FUNCTION_ARG_SIZE(MODE, TYPE) \
00753 ((((MODE) != BLKmode \
00754 ? (HOST_WIDE_INT) GET_MODE_SIZE (MODE) \
00755 : int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00756
00757
00758
00759
00760
00761 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
00762 { (CUM).nargs_prototype--; \
00763 (CUM).words += FUNCTION_ARG_SIZE(MODE, TYPE) \
00764 + (((CUM).words & 01) && (TYPE) != 0 \
00765 && FUNCTION_ARG_SIZE(MODE, TYPE) > 1); \
00766 }
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814 #define FUNCTION_ARG_PADDING(MODE, TYPE) function_arg_padding ((MODE), (TYPE))
00815
00816
00817
00818
00819 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
00820 function_arg (&CUM, MODE, TYPE, NAMED, 0)
00821
00822 #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
00823 function_arg (&CUM, MODE, TYPE, NAMED, 1)
00824
00825
00826
00827
00828
00829
00830
00831 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
00832 (TARGET_64BIT ? function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED) : 0)
00833
00834
00835
00836
00837
00838 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
00839 (((TYPE) != 0) \
00840 ? ((integer_zerop (TYPE_SIZE (TYPE)) \
00841 || ! TREE_CONSTANT (TYPE_SIZE (TYPE))) \
00842 ? BITS_PER_UNIT \
00843 : (((int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) \
00844 / UNITS_PER_WORD) * BITS_PER_WORD) \
00845 : ((GET_MODE_ALIGNMENT(MODE) <= PARM_BOUNDARY) \
00846 ? PARM_BOUNDARY : GET_MODE_ALIGNMENT(MODE)))
00847
00848
00849
00850
00851 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
00852 (TARGET_64BIT \
00853 ? 0 \
00854 : (((TYPE) && int_size_in_bytes (TYPE) > 8) \
00855 || ((MODE) && GET_MODE_SIZE (MODE) > 8)))
00856
00857
00858
00859
00860 #define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \
00861 (TARGET_64BIT \
00862 ? 0 \
00863 : (((TYPE) && int_size_in_bytes (TYPE) > 8) \
00864 || ((MODE) && GET_MODE_SIZE (MODE) > 8)))
00865
00866
00867 extern struct rtx_def *hppa_compare_op0, *hppa_compare_op1;
00868 extern enum cmp_type hppa_branch_type;
00869
00870 #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
00871 { const char *target_name = XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0); \
00872 static unsigned int current_thunk_number; \
00873 char label[16]; \
00874 char *lab; \
00875 ASM_GENERATE_INTERNAL_LABEL (label, "LTHN", current_thunk_number); \
00876 STRIP_NAME_ENCODING (lab, label); \
00877 STRIP_NAME_ENCODING (target_name, target_name); \
00878
00879 \
00880 pa_output_function_prologue (FILE, 0); \
00881 if (VAL_14_BITS_P (DELTA)) \
00882 { \
00883 if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
00884 { \
00885 fprintf (FILE, "\taddil LT%%%s,%%r19\n", lab); \
00886 fprintf (FILE, "\tldw RT%%%s(%%r1),%%r22\n", lab); \
00887 fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
00888 fprintf (FILE, "\tbb,>=,n %%r22,30,.+16\n"); \
00889 fprintf (FILE, "\tdepi 0,31,2,%%r22\n"); \
00890 fprintf (FILE, "\tldw 4(%%sr0,%%r22),%%r19\n"); \
00891 fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
00892 fprintf (FILE, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n"); \
00893 fprintf (FILE, "\tbe 0(%%sr0,%%r22)\n\tldo "); \
00894 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00895 fprintf (FILE, "(%%r26),%%r26\n"); \
00896 } \
00897 else \
00898 { \
00899 fprintf (FILE, "\tb %s\n\tldo ", target_name); \
00900 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00901 fprintf (FILE, "(%%r26),%%r26\n"); \
00902 } \
00903 } \
00904 else \
00905 { \
00906 if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
00907 { \
00908 fprintf (FILE, "\taddil L%%"); \
00909 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00910 fprintf (FILE, ",%%r26\n\tldo R%%"); \
00911 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00912 fprintf (FILE, "(%%r1),%%r26\n"); \
00913 fprintf (FILE, "\taddil LT%%%s,%%r19\n", lab); \
00914 fprintf (FILE, "\tldw RT%%%s(%%r1),%%r22\n", lab); \
00915 fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
00916 fprintf (FILE, "\tbb,>=,n %%r22,30,.+16\n"); \
00917 fprintf (FILE, "\tdepi 0,31,2,%%r22\n"); \
00918 fprintf (FILE, "\tldw 4(%%sr0,%%r22),%%r19\n"); \
00919 fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
00920 fprintf (FILE, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n"); \
00921 fprintf (FILE, "\tbe,n 0(%%sr0,%%r22)\n"); \
00922 } \
00923 else \
00924 { \
00925 fprintf (FILE, "\taddil L%%"); \
00926 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00927 fprintf (FILE, ",%%r26\n\tb %s\n\tldo R%%", target_name); \
00928 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
00929 fprintf (FILE, "(%%r1),%%r26\n"); \
00930 } \
00931 } \
00932 fprintf (FILE, "\t.EXIT\n\t.PROCEND\n"); \
00933 if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
00934 { \
00935 data_section (); \
00936 fprintf (FILE, "\t.align 4\n"); \
00937 ASM_OUTPUT_INTERNAL_LABEL (FILE, "LTHN", current_thunk_number); \
00938 fprintf (FILE, "\t.word P%%%s\n", target_name); \
00939 function_section (THUNK_FNDECL); \
00940 } \
00941 current_thunk_number++; \
00942 }
00943
00944
00945
00946
00947
00948
00949 #ifndef FUNC_BEGIN_PROLOG_LABEL
00950 #define FUNC_BEGIN_PROLOG_LABEL "LFBP"
00951 #endif
00952
00953 #define FUNCTION_PROFILER(FILE, LABEL) \
00954 ASM_OUTPUT_INTERNAL_LABEL (FILE, FUNC_BEGIN_PROLOG_LABEL, LABEL)
00955
00956 #define PROFILE_HOOK(label_no) hppa_profile_hook (label_no)
00957 void hppa_profile_hook PARAMS ((int label_no));
00958
00959
00960 #define PROFILE_BEFORE_PROLOGUE 1
00961
00962
00963
00964
00965
00966
00967 extern int may_call_alloca;
00968
00969 #define EXIT_IGNORE_STACK \
00970 (get_frame_size () != 0 \
00971 || current_function_calls_alloca || current_function_outgoing_args_size)
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986 #define TRAMPOLINE_TEMPLATE(FILE) \
00987 { \
00988 if (! TARGET_64BIT) \
00989 { \
00990 fputs ("\tldw 36(%r22),%r21\n", FILE); \
00991 fputs ("\tbb,>=,n %r21,30,.+16\n", FILE); \
00992 if (ASSEMBLER_DIALECT == 0) \
00993 fputs ("\tdepi 0,31,2,%r21\n", FILE); \
00994 else \
00995 fputs ("\tdepwi 0,31,2,%r21\n", FILE); \
00996 fputs ("\tldw 4(%r21),%r19\n", FILE); \
00997 fputs ("\tldw 0(%r21),%r21\n", FILE); \
00998 fputs ("\tldsid (%r21),%r1\n", FILE); \
00999 fputs ("\tmtsp %r1,%sr0\n", FILE); \
01000 fputs ("\tbe 0(%sr0,%r21)\n", FILE); \
01001 fputs ("\tldw 40(%r22),%r29\n", FILE); \
01002 fputs ("\t.word 0\n", FILE); \
01003 fputs ("\t.word 0\n", FILE); \
01004 fputs ("\t.word 0\n", FILE); \
01005 fputs ("\t.word 0\n", FILE); \
01006 } \
01007 else \
01008 { \
01009 fputs ("\t.dword 0\n", FILE); \
01010 fputs ("\t.dword 0\n", FILE); \
01011 fputs ("\t.dword 0\n", FILE); \
01012 fputs ("\t.dword 0\n", FILE); \
01013 fputs ("\tmfia %r31\n", FILE); \
01014 fputs ("\tldd 24(%r31),%r1\n", FILE); \
01015 fputs ("\tldd 24(%r1),%r27\n", FILE); \
01016 fputs ("\tldd 16(%r1),%r1\n", FILE); \
01017 fputs ("\tbve (%r1)\n", FILE); \
01018 fputs ("\tldd 32(%r31),%r31\n", FILE); \
01019 fputs ("\t.dword 0 ; fptr\n", FILE); \
01020 fputs ("\t.dword 0 ; static link\n", FILE); \
01021 } \
01022 }
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033 #define TRAMPOLINE_SIZE (TARGET_64BIT ? 72 : 52)
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01046 { \
01047 if (! TARGET_64BIT) \
01048 { \
01049 rtx start_addr, end_addr; \
01050 \
01051 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 36)); \
01052 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), (FNADDR)); \
01053 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 40)); \
01054 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), (CXT)); \
01055 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 44)); \
01056 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), (TRAMP)); \
01057 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 48)); \
01058 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), \
01059 gen_rtx_REG (Pmode, 19)); \
01060
01061 \
01062 start_addr = force_reg (Pmode, (TRAMP)); \
01063 end_addr = force_reg (Pmode, plus_constant ((TRAMP), 32)); \
01064 emit_insn (gen_dcacheflush (start_addr, end_addr)); \
01065 end_addr = force_reg (Pmode, plus_constant (start_addr, 32)); \
01066 emit_insn (gen_icacheflush (start_addr, end_addr, start_addr, \
01067 gen_reg_rtx (Pmode), gen_reg_rtx (Pmode)));\
01068 } \
01069 else \
01070 { \
01071 rtx start_addr, end_addr; \
01072 \
01073 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 56)); \
01074 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), (FNADDR)); \
01075 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 64)); \
01076 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), (CXT)); \
01077 \
01078 end_addr = force_reg (Pmode, plus_constant ((TRAMP), 32)); \
01079 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 16)); \
01080 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), end_addr); \
01081 end_addr = gen_rtx_REG (Pmode, 27); \
01082 start_addr = memory_address (Pmode, plus_constant ((TRAMP), 24)); \
01083 emit_move_insn (gen_rtx_MEM (Pmode, start_addr), end_addr); \
01084
01085 \
01086 start_addr = force_reg (Pmode, (TRAMP)); \
01087 end_addr = force_reg (Pmode, plus_constant ((TRAMP), 32)); \
01088 emit_insn (gen_dcacheflush (start_addr, end_addr)); \
01089 end_addr = force_reg (Pmode, plus_constant (start_addr, 32)); \
01090 emit_insn (gen_icacheflush (start_addr, end_addr, start_addr, \
01091 gen_reg_rtx (Pmode), gen_reg_rtx (Pmode)));\
01092 } \
01093 }
01094
01095
01096
01097
01098
01099 #define TRAMPOLINE_ADJUST_ADDRESS(ADDR) \
01100 if (!TARGET_64BIT) (ADDR) = memory_address (Pmode, plus_constant ((ADDR), 46))
01101
01102
01103
01104
01105
01106
01107 #define EXPAND_BUILTIN_SAVEREGS() hppa_builtin_saveregs ()
01108
01109
01110
01111 #define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \
01112 hppa_va_start (stdarg, valist, nextarg)
01113
01114
01115
01116 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
01117 hppa_va_arg (valist, type)
01118
01119
01120
01121
01122
01123
01124 #define HAVE_POST_INCREMENT (pa_cpu < PROCESSOR_8000)
01125 #define HAVE_POST_DECREMENT (pa_cpu < PROCESSOR_8000)
01126
01127 #define HAVE_PRE_DECREMENT (pa_cpu < PROCESSOR_8000)
01128 #define HAVE_PRE_INCREMENT (pa_cpu < PROCESSOR_8000)
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138 #define REGNO_OK_FOR_INDEX_P(REGNO) \
01139 ((REGNO) && ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32))
01140 #define REGNO_OK_FOR_BASE_P(REGNO) \
01141 ((REGNO) && ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32))
01142 #define REGNO_OK_FOR_FP_P(REGNO) \
01143 (FP_REGNO_P (REGNO) || FP_REGNO_P (reg_renumber[REGNO]))
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154 #define FP_REG_P(X) (REG_P (X) && REGNO_OK_FOR_FP_P (REGNO (X)))
01155
01156
01157
01158 #define MAX_REGS_PER_ADDRESS 2
01159
01160
01161
01162
01163
01164
01165 #define CONSTANT_ADDRESS_P(X) \
01166 ((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
01167 || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \
01168 || GET_CODE (X) == HIGH) \
01169 && (reload_in_progress || reload_completed || ! symbolic_expression_p (X)))
01170
01171
01172
01173
01174
01175
01176
01177
01178 #ifndef NEW_HP_ASSEMBLER
01179 #define NEW_HP_ASSEMBLER 0
01180 #endif
01181 #define LEGITIMATE_CONSTANT_P(X) \
01182 ((GET_MODE_CLASS (GET_MODE (X)) != MODE_FLOAT \
01183 || (X) == CONST0_RTX (GET_MODE (X))) \
01184 && (NEW_HP_ASSEMBLER || TARGET_GAS || GET_CODE (X) != LABEL_REF) \
01185 && !(TARGET_64BIT && GET_CODE (X) == CONST_DOUBLE) \
01186 && !(TARGET_64BIT && GET_CODE (X) == CONST_INT \
01187 && !(HOST_BITS_PER_WIDE_INT <= 32 \
01188 || (INTVAL (X) >= (HOST_WIDE_INT) -32 << 31 \
01189 && INTVAL (X) < (HOST_WIDE_INT) 32 << 31) \
01190 || cint_ok_for_move (INTVAL (X)))) \
01191 && !function_label_operand (X, VOIDmode))
01192
01193
01194
01195
01196
01197
01198 #define IS_RELOADING_PSEUDO_P(OP) \
01199 ((reload_in_progress \
01200 && GET_CODE (OP) == REG \
01201 && REGNO (OP) >= FIRST_PSEUDO_REGISTER \
01202 && reg_renumber [REGNO (OP)] < 0))
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217 #define EXTRA_CONSTRAINT(OP, C) \
01218 ((C) == 'Q' ? \
01219 (IS_RELOADING_PSEUDO_P (OP) \
01220 || (GET_CODE (OP) == MEM \
01221 && (memory_address_p (GET_MODE (OP), XEXP (OP, 0))\
01222 || reload_in_progress) \
01223 && ! symbolic_memory_operand (OP, VOIDmode) \
01224 && !(GET_CODE (XEXP (OP, 0)) == PLUS \
01225 && (GET_CODE (XEXP (XEXP (OP, 0), 0)) == MULT\
01226 || GET_CODE (XEXP (XEXP (OP, 0), 1)) == MULT))))\
01227 : ((C) == 'R' ? \
01228 (GET_CODE (OP) == MEM \
01229 && GET_CODE (XEXP (OP, 0)) == PLUS \
01230 && (GET_CODE (XEXP (XEXP (OP, 0), 0)) == MULT \
01231 || GET_CODE (XEXP (XEXP (OP, 0), 1)) == MULT) \
01232 && (move_operand (OP, GET_MODE (OP)) \
01233 || memory_address_p (GET_MODE (OP), XEXP (OP, 0))\
01234 || reload_in_progress)) \
01235 : ((C) == 'T' ? \
01236 (GET_CODE (OP) == MEM \
01237
01238
01239
01240 \
01241 && memory_address_p ((TARGET_PA_20 \
01242 ? GET_MODE (OP) \
01243 : DFmode), \
01244 XEXP (OP, 0)) \
01245 && !(GET_CODE (XEXP (OP, 0)) == LO_SUM \
01246 && GET_CODE (XEXP (XEXP (OP, 0), 0)) == REG \
01247 && REG_OK_FOR_BASE_P (XEXP (XEXP (OP, 0), 0))\
01248 && GET_CODE (XEXP (XEXP (OP, 0), 1)) == UNSPEC\
01249 && GET_MODE (XEXP (OP, 0)) == Pmode) \
01250 && !(GET_CODE (XEXP (OP, 0)) == PLUS \
01251 && (GET_CODE (XEXP (XEXP (OP, 0), 0)) == MULT\
01252 || GET_CODE (XEXP (XEXP (OP, 0), 1)) == MULT)))\
01253 : ((C) == 'U' ? \
01254 (GET_CODE (OP) == CONST_INT && INTVAL (OP) == 63) \
01255 : ((C) == 'A' ? \
01256 (GET_CODE (OP) == MEM \
01257 && GET_CODE (XEXP (OP, 0)) == LO_SUM \
01258 && GET_CODE (XEXP (XEXP (OP, 0), 0)) == REG \
01259 && REG_OK_FOR_BASE_P (XEXP (XEXP (OP, 0), 0)) \
01260 && GET_CODE (XEXP (XEXP (OP, 0), 1)) == UNSPEC \
01261 && GET_MODE (XEXP (OP, 0)) == Pmode) \
01262 : ((C) == 'S' ? \
01263 (GET_CODE (OP) == CONST_INT && INTVAL (OP) == 31) : 0))))))
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279 #ifndef REG_OK_STRICT
01280
01281
01282
01283 #define REG_OK_FOR_INDEX_P(X) \
01284 (REGNO (X) && (REGNO (X) < 32 || REGNO (X) >= FIRST_PSEUDO_REGISTER))
01285
01286
01287 #define REG_OK_FOR_BASE_P(X) \
01288 (REGNO (X) && (REGNO (X) < 32 || REGNO (X) >= FIRST_PSEUDO_REGISTER))
01289
01290 #else
01291
01292
01293 #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
01294
01295 #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01296
01297 #endif
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314 #define VAL_5_BITS_P(X) ((unsigned HOST_WIDE_INT)(X) + 0x10 < 0x20)
01315 #define INT_5_BITS(X) VAL_5_BITS_P (INTVAL (X))
01316
01317 #define VAL_U5_BITS_P(X) ((unsigned HOST_WIDE_INT)(X) < 0x20)
01318 #define INT_U5_BITS(X) VAL_U5_BITS_P (INTVAL (X))
01319
01320 #define VAL_11_BITS_P(X) ((unsigned HOST_WIDE_INT)(X) + 0x400 < 0x800)
01321 #define INT_11_BITS(X) VAL_11_BITS_P (INTVAL (X))
01322
01323 #define VAL_14_BITS_P(X) ((unsigned HOST_WIDE_INT)(X) + 0x2000 < 0x4000)
01324 #define INT_14_BITS(X) VAL_14_BITS_P (INTVAL (X))
01325
01326 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01327 { \
01328 if ((REG_P (X) && REG_OK_FOR_BASE_P (X)) \
01329 || ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC \
01330 || GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC) \
01331 && REG_P (XEXP (X, 0)) \
01332 && REG_OK_FOR_BASE_P (XEXP (X, 0)))) \
01333 goto ADDR; \
01334 else if (GET_CODE (X) == PLUS) \
01335 { \
01336 rtx base = 0, index = 0; \
01337 if (REG_P (XEXP (X, 0)) \
01338 && REG_OK_FOR_BASE_P (XEXP (X, 0))) \
01339 base = XEXP (X, 0), index = XEXP (X, 1); \
01340 else if (REG_P (XEXP (X, 1)) \
01341 && REG_OK_FOR_BASE_P (XEXP (X, 1))) \
01342 base = XEXP (X, 1), index = XEXP (X, 0); \
01343 if (base != 0) \
01344 if (GET_CODE (index) == CONST_INT \
01345 && ((INT_14_BITS (index) \
01346 && (TARGET_SOFT_FLOAT \
01347 || (TARGET_PA_20 \
01348 && ((MODE == SFmode \
01349 && (INTVAL (index) % 4) == 0)\
01350 || (MODE == DFmode \
01351 && (INTVAL (index) % 8) == 0)))\
01352 || ((MODE) != SFmode && (MODE) != DFmode))) \
01353 || INT_5_BITS (index))) \
01354 goto ADDR; \
01355 if (! TARGET_SOFT_FLOAT \
01356 && ! TARGET_DISABLE_INDEXING \
01357 && base \
01358 && ((MODE) == SFmode || (MODE) == DFmode) \
01359 && GET_CODE (index) == MULT \
01360 && GET_CODE (XEXP (index, 0)) == REG \
01361 && REG_OK_FOR_BASE_P (XEXP (index, 0)) \
01362 && GET_CODE (XEXP (index, 1)) == CONST_INT \
01363 && INTVAL (XEXP (index, 1)) == ((MODE) == SFmode ? 4 : 8))\
01364 goto ADDR; \
01365 } \
01366 else if (GET_CODE (X) == LO_SUM \
01367 && GET_CODE (XEXP (X, 0)) == REG \
01368 && REG_OK_FOR_BASE_P (XEXP (X, 0)) \
01369 && CONSTANT_P (XEXP (X, 1)) \
01370 && (TARGET_SOFT_FLOAT \
01371
01372 \
01373 || (TARGET_PA_20 \
01374 && GET_CODE (XEXP (X, 1)) != CONST_INT)\
01375 || ((MODE) != SFmode \
01376 && (MODE) != DFmode))) \
01377 goto ADDR; \
01378 else if (GET_CODE (X) == LO_SUM \
01379 && GET_CODE (XEXP (X, 0)) == SUBREG \
01380 && GET_CODE (SUBREG_REG (XEXP (X, 0))) == REG\
01381 && REG_OK_FOR_BASE_P (SUBREG_REG (XEXP (X, 0)))\
01382 && CONSTANT_P (XEXP (X, 1)) \
01383 && (TARGET_SOFT_FLOAT \
01384
01385 \
01386 || (TARGET_PA_20 \
01387 && GET_CODE (XEXP (X, 1)) != CONST_INT)\
01388 || ((MODE) != SFmode \
01389 && (MODE) != DFmode))) \
01390 goto ADDR; \
01391 else if (GET_CODE (X) == LABEL_REF \
01392 || (GET_CODE (X) == CONST_INT \
01393 && INT_5_BITS (X))) \
01394 goto ADDR; \
01395 \
01396 else if (GET_CODE (X) == LO_SUM \
01397 && GET_CODE (XEXP (X, 0)) == REG \
01398 && REG_OK_FOR_BASE_P (XEXP (X, 0)) \
01399 && GET_CODE (XEXP (X, 1)) == UNSPEC \
01400 && (TARGET_SOFT_FLOAT \
01401 || TARGET_PA_20 \
01402 || ((MODE) != SFmode \
01403 && (MODE) != DFmode))) \
01404 goto ADDR; \
01405 }
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427 #define LEGITIMIZE_RELOAD_ADDRESS(AD, MODE, OPNUM, TYPE, IND, WIN) \
01428 do { \
01429 int offset, newoffset, mask; \
01430 rtx new, temp = NULL_RTX; \
01431 \
01432 mask = (GET_MODE_CLASS (MODE) == MODE_FLOAT \
01433 ? (TARGET_PA_20 ? 0x3fff : 0x1f) : 0x3fff); \
01434 \
01435 if (optimize \
01436 && GET_CODE (AD) == PLUS) \
01437 temp = simplify_binary_operation (PLUS, Pmode, \
01438 XEXP (AD, 0), XEXP (AD, 1)); \
01439 \
01440 new = temp ? temp : AD; \
01441 \
01442 if (optimize \
01443 && GET_CODE (new) == PLUS \
01444 && GET_CODE (XEXP (new, 0)) == REG \
01445 && GET_CODE (XEXP (new, 1)) == CONST_INT) \
01446 { \
01447 offset = INTVAL (XEXP ((new), 1)); \
01448 \
01449 \
01450 if ((offset & mask) >= ((mask + 1) / 2)) \
01451 newoffset = (offset & ~mask) + mask + 1; \
01452 else \
01453 newoffset = offset & ~mask; \
01454 \
01455 if (newoffset != 0 \
01456 && VAL_14_BITS_P (newoffset)) \
01457 { \
01458 \
01459 temp = gen_rtx_PLUS (Pmode, XEXP (new, 0), \
01460 GEN_INT (newoffset)); \
01461 AD = gen_rtx_PLUS (Pmode, temp, GEN_INT (offset - newoffset));\
01462 push_reload (XEXP (AD, 0), 0, &XEXP (AD, 0), 0, \
01463 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, \
01464 (OPNUM), (TYPE)); \
01465 goto WIN; \
01466 } \
01467 } \
01468 } while (0)
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
01487 { rtx orig_x = (X); \
01488 (X) = hppa_legitimize_address (X, OLDX, MODE); \
01489 if ((X) != orig_x && memory_address_p (MODE, X)) \
01490 goto WIN; }
01491
01492
01493
01494
01495 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
01496 if (GET_CODE (ADDR) == PRE_DEC \
01497 || GET_CODE (ADDR) == POST_DEC \
01498 || GET_CODE (ADDR) == PRE_INC \
01499 || GET_CODE (ADDR) == POST_INC) \
01500 goto LABEL
01501
01502
01503
01504
01505
01506
01507 #define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
01508 if (symbolic_operand (RTX, MODE)) \
01509 data_section (); \
01510 else \
01511 readonly_data_section ();
01512
01513
01514
01515
01516
01517 #define SELECT_SECTION(EXP,RELOC,ALIGN) \
01518 if (TREE_CODE (EXP) == VAR_DECL \
01519 && TREE_READONLY (EXP) \
01520 && !TREE_THIS_VOLATILE (EXP) \
01521 && DECL_INITIAL (EXP) \
01522 && (DECL_INITIAL (EXP) == error_mark_node \
01523 || TREE_CONSTANT (DECL_INITIAL (EXP))) \
01524 && !RELOC) \
01525 readonly_data_section (); \
01526 else if (TREE_CODE_CLASS (TREE_CODE (EXP)) == 'c' \
01527 && !(TREE_CODE (EXP) == STRING_CST && flag_writable_strings) \
01528 && !RELOC) \
01529 readonly_data_section (); \
01530 else \
01531 data_section ();
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550 #define TEXT_SPACE_P(DECL)\
01551 (TREE_CODE (DECL) == FUNCTION_DECL \
01552 || (TREE_CODE (DECL) == VAR_DECL \
01553 && TREE_READONLY (DECL) && ! TREE_SIDE_EFFECTS (DECL) \
01554 && (! DECL_INITIAL (DECL) || ! reloc_needed (DECL_INITIAL (DECL))) \
01555 && !flag_pic) \
01556 || (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'c' \
01557 && !(TREE_CODE (DECL) == STRING_CST && flag_writable_strings)))
01558
01559 #define FUNCTION_NAME_P(NAME) (*(NAME) == '@')
01560
01561 #define ENCODE_SECTION_INFO(DECL)\
01562 do \
01563 { if (TEXT_SPACE_P (DECL)) \
01564 { rtx _rtl; \
01565 if (TREE_CODE (DECL) == FUNCTION_DECL \
01566 || TREE_CODE (DECL) == VAR_DECL) \
01567 _rtl = DECL_RTL (DECL); \
01568 else \
01569 _rtl = TREE_CST_RTL (DECL); \
01570 SYMBOL_REF_FLAG (XEXP (_rtl, 0)) = 1; \
01571 if (TREE_CODE (DECL) == FUNCTION_DECL) \
01572 hppa_encode_label (XEXP (DECL_RTL (DECL), 0));\
01573 } \
01574 } \
01575 while (0)
01576
01577
01578
01579
01580 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
01581 (VAR) = ((SYMBOL_NAME) \
01582 + (*(SYMBOL_NAME) == '*' || *(SYMBOL_NAME) == '@'))
01583
01584
01585
01586 #define CASE_VECTOR_MODE (TARGET_BIG_SWITCH ? TImode : DImode)
01587
01588
01589 #define ADDR_VEC_ALIGN(ADDR_VEC) 2
01590
01591
01592 #define DEFAULT_SIGNED_CHAR 1
01593
01594
01595
01596 #define MOVE_MAX 8
01597
01598
01599
01600
01601
01602
01603
01604
01605
01606 #define MOVE_RATIO (TARGET_64BIT ? 8 : 4)
01607
01608
01609
01610 #define WORD_REGISTER_OPERATIONS
01611
01612
01613
01614
01615
01616 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
01617
01618
01619 #define SLOW_BYTE_ACCESS 1
01620
01621
01622
01623 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
01624
01625
01626
01627
01628 #define STORE_FLAG_VALUE 1
01629
01630
01631 #define PROMOTE_PROTOTYPES 1
01632 #define PROMOTE_FUNCTION_RETURN 1
01633
01634
01635
01636
01637 #define Pmode word_mode
01638
01639
01640
01641
01642 #define EXTRA_CC_MODES CC(CCFPmode, "CCFP")
01643
01644
01645
01646
01647
01648
01649 #define SELECT_CC_MODE(OP,X,Y) \
01650 (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode : CCmode) \
01651
01652
01653
01654
01655 #define FUNCTION_MODE SImode
01656
01657
01658
01659
01660
01661 #define NO_FUNCTION_CSE
01662
01663
01664
01665 #define SHIFT_COUNT_TRUNCATED 1
01666
01667
01668
01669
01670
01671
01672 #define CONST_COSTS(RTX,CODE,OUTER_CODE) \
01673 case CONST_INT: \
01674 if (INTVAL (RTX) == 0) return 0; \
01675 if (INT_14_BITS (RTX)) return 1; \
01676 case HIGH: \
01677 return 2; \
01678 case CONST: \
01679 case LABEL_REF: \
01680 case SYMBOL_REF: \
01681 return 4; \
01682 case CONST_DOUBLE: \
01683 if ((RTX == CONST0_RTX (DFmode) || RTX == CONST0_RTX (SFmode)) \
01684 && OUTER_CODE != SET) \
01685 return 0; \
01686 else \
01687 return 8;
01688
01689 #define ADDRESS_COST(RTX) \
01690 (GET_CODE (RTX) == REG ? 1 : hppa_address_cost (RTX))
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
01703 (CLASS1 == SHIFT_REGS ? 0x100 \
01704 : FP_REG_CLASS_P (CLASS1) && ! FP_REG_CLASS_P (CLASS2) ? 16 \
01705 : FP_REG_CLASS_P (CLASS2) && ! FP_REG_CLASS_P (CLASS1) ? 16 \
01706 : 2)
01707
01708
01709
01710
01711
01712
01713 #define RTX_COSTS(X,CODE,OUTER_CODE) \
01714 case MULT: \
01715 if (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
01716 return COSTS_N_INSNS (3); \
01717 return (TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT) \
01718 ? COSTS_N_INSNS (8) : COSTS_N_INSNS (20); \
01719 case DIV: \
01720 if (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
01721 return COSTS_N_INSNS (14); \
01722 case UDIV: \
01723 case MOD: \
01724 case UMOD: \
01725 return COSTS_N_INSNS (60); \
01726 case PLUS: \
01727 case MINUS: \
01728 if (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
01729 return COSTS_N_INSNS (3); \
01730 return COSTS_N_INSNS (1); \
01731 case ASHIFT: \
01732 case ASHIFTRT: \
01733 case LSHIFTRT: \
01734 return COSTS_N_INSNS (1);
01735
01736
01737 #define BRANCH_COST (pa_cpu == PROCESSOR_8000 ? 2 : 1)
01738
01739
01740
01741 #define ADJUST_INSN_LENGTH(INSN, LENGTH) \
01742 LENGTH += pa_adjust_insn_length (INSN, LENGTH);
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765 #define INSN_REFERENCES_ARE_DELAYED(X) (insn_refs_are_delayed (X))
01766
01767
01768
01769
01770
01771
01772
01773 #define ASM_APP_ON ""
01774
01775
01776
01777
01778 #define ASM_APP_OFF ""
01779
01780
01781
01782 #define ASM_FILE_END(FILE) output_deferred_plabels (FILE)
01783
01784
01785
01786
01787 #define ASM_OUTPUT_LABEL(FILE, NAME) \
01788 do { assemble_name (FILE, NAME); \
01789 fputc ('\n', FILE); } while (0)
01790
01791
01792
01793
01794 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
01795 fprintf ((FILE), "%s", (NAME) + (FUNCTION_NAME_P (NAME) ? 1 : 0))
01796
01797
01798
01799
01800 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
01801 {fprintf (FILE, "%c$%s%04d\n", (PREFIX)[0], (PREFIX) + 1, NUM);}
01802
01803
01804
01805
01806
01807
01808 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
01809 sprintf (LABEL, "*%c$%s%04ld", (PREFIX)[0], (PREFIX) + 1, (long)(NUM))
01810
01811 #define ASM_GLOBALIZE_LABEL(FILE, NAME) \
01812 do { \
01813
01814 \
01815 if (! FUNCTION_NAME_P (NAME)) \
01816 { \
01817 fputs ("\t.EXPORT ", FILE); \
01818 assemble_name (FILE, NAME); \
01819 fputs (",DATA\n", FILE); \
01820 } \
01821 } while (0)
01822
01823 #define ASM_OUTPUT_ASCII(FILE, P, SIZE) \
01824 output_ascii ((FILE), (P), (SIZE))
01825
01826
01827
01828
01829
01830 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
01831 if (TARGET_BIG_SWITCH) \
01832 fprintf (FILE, "\tstw %%r1,-16(%%r30)\n\tldil LR'L$%04d,%%r1\n\tbe RR'L$%04d(%%sr4,%%r1)\n\tldw -16(%%r30),%%r1\n", VALUE, VALUE); \
01833 else \
01834 fprintf (FILE, "\tb L$%04d\n\tnop\n", VALUE)
01835
01836
01837 #define JUMP_TABLES_IN_TEXT_SECTION 1
01838
01839
01840
01841
01842
01843
01844
01845
01846 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
01847 if (TARGET_BIG_SWITCH) \
01848 fprintf (FILE, "\tstw %%r1,-16(%%r30)\n\tldw T'L$%04d(%%r19),%%r1\n\tbv %%r0(%%r1)\n\tldw -16(%%r30),%%r1\n", VALUE); \
01849 else \
01850 fprintf (FILE, "\tb L$%04d\n\tnop\n", VALUE)
01851
01852
01853
01854
01855
01856 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
01857 fprintf (FILE, "\t.align %d\n", (1<<(LOG)))
01858
01859 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
01860 fprintf (FILE, "\t.blockz %d\n", (SIZE))
01861
01862
01863
01864
01865 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGNED) \
01866 { bss_section (); \
01867 assemble_name ((FILE), (NAME)); \
01868 fputs ("\t.comm ", (FILE)); \
01869 fprintf ((FILE), "%d\n", MAX ((SIZE), ((ALIGNED) / BITS_PER_UNIT)));}
01870
01871
01872
01873
01874 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGNED) \
01875 { bss_section (); \
01876 fprintf ((FILE), "\t.align %d\n", ((ALIGNED) / BITS_PER_UNIT)); \
01877 assemble_name ((FILE), (NAME)); \
01878 fprintf ((FILE), "\n\t.block %d\n", (SIZE));}
01879
01880
01881
01882
01883
01884 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
01885 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
01886 sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
01887
01888
01889 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == '!')
01890
01891 #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
01892 ((CHAR) == '@' || (CHAR) == '#' || (CHAR) == '*' || (CHAR) == '^')
01893
01894
01895
01896
01897
01898
01899
01900
01901
01902
01903
01904
01905
01906
01907
01908 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
01909
01910
01911
01912
01913 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
01914 { register rtx addr = ADDR; \
01915 register rtx base; \
01916 int offset; \
01917 switch (GET_CODE (addr)) \
01918 { \
01919 case REG: \
01920 fprintf (FILE, "0(%s)", reg_names [REGNO (addr)]); \
01921 break; \
01922 case PLUS: \
01923 if (GET_CODE (XEXP (addr, 0)) == CONST_INT) \
01924 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1); \
01925 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT) \
01926 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0); \
01927 else \
01928 abort (); \
01929 fprintf (FILE, "%d(%s)", offset, reg_names [REGNO (base)]); \
01930 break; \
01931 case LO_SUM: \
01932 if (!symbolic_operand (XEXP (addr, 1), VOIDmode)) \
01933 fputs ("R'", FILE); \
01934 else if (flag_pic == 0) \
01935 fputs ("RR'", FILE); \
01936 else \
01937 fputs ("RT'", FILE); \
01938 output_global_address (FILE, XEXP (addr, 1), 0); \
01939 fputs ("(", FILE); \
01940 output_operand (XEXP (addr, 0), 0); \
01941 fputs (")", FILE); \
01942 break; \
01943 case CONST_INT: \
01944 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr)); \
01945 fprintf (FILE, "(%%r0)"); \
01946 break; \
01947 default: \
01948 output_addr_const (FILE, addr); \
01949 }}
01950
01951
01952
01953
01954 #define RETURN_ADDR_RTX(COUNT, FRAMEADDR) \
01955 (return_addr_rtx (COUNT, FRAMEADDR))
01956
01957
01958
01959 #define MASK_RETURN_ADDR \
01960
01961 \
01962 (GEN_INT (-4))
01963
01964
01965 #define JMP_BUF_SIZE 50
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990 #define FUNCTION_OK_FOR_SIBCALL(DECL) \
01991 (DECL \
01992 && ! TARGET_PORTABLE_RUNTIME \
01993 && ! TARGET_64BIT \
01994 && ! TREE_PUBLIC (DECL))
01995
01996 #define PREDICATE_CODES \
01997 {"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
01998 {"call_operand_address", {LABEL_REF, SYMBOL_REF, CONST_INT, \
01999 CONST_DOUBLE, CONST, HIGH, CONSTANT_P_RTX}}, \
02000 {"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
02001 {"symbolic_memory_operand", {SUBREG, MEM}}, \
02002 {"reg_before_reload_operand", {REG, MEM}}, \
02003 {"reg_or_nonsymb_mem_operand", {SUBREG, REG, MEM}}, \
02004 {"reg_or_0_or_nonsymb_mem_operand", {SUBREG, REG, MEM, CONST_INT, \
02005 CONST_DOUBLE}}, \
02006 {"move_operand", {SUBREG, REG, CONSTANT_P_RTX, CONST_INT, MEM}}, \
02007 {"reg_or_cint_move_operand", {SUBREG, REG, CONST_INT}}, \
02008 {"pic_label_operand", {LABEL_REF, CONST}}, \
02009 {"fp_reg_operand", {REG}}, \
02010 {"arith_operand", {SUBREG, REG, CONST_INT}}, \
02011 {"arith11_operand", {SUBREG, REG, CONST_INT}}, \
02012 {"pre_cint_operand", {CONST_INT}}, \
02013 {"post_cint_operand", {CONST_INT}}, \
02014 {"arith_double_operand", {SUBREG, REG, CONST_DOUBLE}}, \
02015 {"ireg_or_int5_operand", {CONST_INT, REG}}, \
02016 {"int5_operand", {CONST_INT}}, \
02017 {"uint5_operand", {CONST_INT}}, \
02018 {"int11_operand", {CONST_INT}}, \
02019 {"uint32_operand", {CONST_INT, \
02020 HOST_BITS_PER_WIDE_INT > 32 ? 0 : CONST_DOUBLE}}, \
02021 {"arith5_operand", {SUBREG, REG, CONST_INT}}, \
02022 {"and_operand", {SUBREG, REG, CONST_INT}}, \
02023 {"ior_operand", {CONST_INT}}, \
02024 {"lhs_lshift_cint_operand", {CONST_INT}}, \
02025 {"lhs_lshift_operand", {SUBREG, REG, CONST_INT}}, \
02026 {"arith32_operand", {SUBREG, REG, CONST_INT}}, \
02027 {"pc_or_label_operand", {PC, LABEL_REF}}, \
02028 {"plus_xor_ior_operator", {PLUS, XOR, IOR}}, \
02029 {"shadd_operand", {CONST_INT}}, \
02030 {"basereg_operand", {REG}}, \
02031 {"div_operand", {REG, CONST_INT}}, \
02032 {"ireg_operand", {REG}}, \
02033 {"cmpib_comparison_operator", {EQ, NE, LT, LE, LEU, \
02034 GT, GTU, GE}}, \
02035 {"movb_comparison_operator", {EQ, NE, LT, GE}},