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
00026 #define CPLUSPLUS_CPP_SPEC "\
00027 -D__LANGUAGE_C_PLUS_PLUS__ -D__LANGUAGE_C_PLUS_PLUS -D__cplusplus \
00028 %(cpp) \
00029 "
00030
00031
00032
00033 #define CPP_SPEC "\
00034 %{!undef:\
00035 %{.S:-D__LANGUAGE_ASSEMBLY__ -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY }}\
00036 %{.m:-D__LANGUAGE_OBJECTIVE_C__ -D__LANGUAGE_OBJECTIVE_C }\
00037 %{!.S:%{!.cc:%{!.cxx:%{!.cpp:%{!.cp:%{!.c++:%{!.C:%{!.m:-D__LANGUAGE_C__ -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C }}}}}}}}}\
00038 %{mieee:-D_IEEE_FP }\
00039 %{mieee-with-inexact:-D_IEEE_FP -D_IEEE_FP_INEXACT }}\
00040 %(cpp_cpu) %(cpp_subtarget)"
00041
00042 #ifndef CPP_SUBTARGET_SPEC
00043 #define CPP_SUBTARGET_SPEC ""
00044 #endif
00045
00046 #define WORD_SWITCH_TAKES_ARG(STR) \
00047 (!strcmp (STR, "rpath") || DEFAULT_WORD_SWITCH_TAKES_ARG(STR))
00048
00049
00050 #define TARGET_VERSION
00051
00052
00053
00054
00055
00056
00057 enum processor_type
00058 {PROCESSOR_EV4,
00059 PROCESSOR_EV5,
00060 PROCESSOR_EV6};
00061
00062 extern enum processor_type alpha_cpu;
00063
00064 enum alpha_trap_precision
00065 {
00066 ALPHA_TP_PROG,
00067 ALPHA_TP_FUNC,
00068 ALPHA_TP_INSN
00069 };
00070
00071 enum alpha_fp_rounding_mode
00072 {
00073 ALPHA_FPRM_NORM,
00074 ALPHA_FPRM_MINF,
00075 ALPHA_FPRM_CHOP,
00076 ALPHA_FPRM_DYN
00077 };
00078
00079 enum alpha_fp_trap_mode
00080 {
00081 ALPHA_FPTM_N,
00082 ALPHA_FPTM_U,
00083 ALPHA_FPTM_SU,
00084 ALPHA_FPTM_SUI
00085 };
00086
00087 extern int target_flags;
00088
00089 extern enum alpha_trap_precision alpha_tp;
00090 extern enum alpha_fp_rounding_mode alpha_fprm;
00091 extern enum alpha_fp_trap_mode alpha_fptm;
00092
00093
00094
00095 #define MASK_FP (1 << 0)
00096 #define TARGET_FP (target_flags & MASK_FP)
00097
00098
00099
00100
00101
00102 #define MASK_FPREGS (1 << 1)
00103 #define TARGET_FPREGS (target_flags & MASK_FPREGS)
00104
00105
00106
00107 #define MASK_GAS (1 << 2)
00108 #define TARGET_GAS (target_flags & MASK_GAS)
00109
00110
00111
00112 #define MASK_IEEE_CONFORMANT (1 << 3)
00113 #define TARGET_IEEE_CONFORMANT (target_flags & MASK_IEEE_CONFORMANT)
00114
00115
00116
00117 #define MASK_IEEE (1 << 4)
00118 #define TARGET_IEEE (target_flags & MASK_IEEE)
00119
00120
00121
00122 #define MASK_IEEE_WITH_INEXACT (1 << 5)
00123 #define TARGET_IEEE_WITH_INEXACT (target_flags & MASK_IEEE_WITH_INEXACT)
00124
00125
00126
00127
00128 #define MASK_BUILD_CONSTANTS (1 << 6)
00129 #define TARGET_BUILD_CONSTANTS (target_flags & MASK_BUILD_CONSTANTS)
00130
00131
00132
00133
00134 #define MASK_FLOAT_VAX (1 << 7)
00135 #define TARGET_FLOAT_VAX (target_flags & MASK_FLOAT_VAX)
00136
00137
00138
00139
00140 #define MASK_BWX (1 << 8)
00141 #define TARGET_BWX (target_flags & MASK_BWX)
00142
00143
00144 #define MASK_MAX (1 << 9)
00145 #define TARGET_MAX (target_flags & MASK_MAX)
00146
00147
00148 #define MASK_FIX (1 << 10)
00149 #define TARGET_FIX (target_flags & MASK_FIX)
00150
00151
00152 #define MASK_CIX (1 << 11)
00153 #define TARGET_CIX (target_flags & MASK_CIX)
00154
00155
00156 #define MASK_EXPLICIT_RELOCS (1 << 12)
00157 #define TARGET_EXPLICIT_RELOCS (target_flags & MASK_EXPLICIT_RELOCS)
00158
00159
00160 #define MASK_SMALL_DATA (1 << 13)
00161 #define TARGET_SMALL_DATA (target_flags & MASK_SMALL_DATA)
00162
00163
00164
00165 #define MASK_CPU_EV5 (1 << 28)
00166 #define TARGET_CPU_EV5 (target_flags & MASK_CPU_EV5)
00167
00168
00169 #define MASK_CPU_EV6 (1 << 29)
00170 #define TARGET_CPU_EV6 (target_flags & MASK_CPU_EV6)
00171
00172
00173
00174 #define MASK_SUPPORT_ARCH (1 << 30)
00175 #define TARGET_SUPPORT_ARCH (target_flags & MASK_SUPPORT_ARCH)
00176
00177
00178 #define TARGET_ABI_WINDOWS_NT 0
00179 #define TARGET_ABI_OPEN_VMS 0
00180 #define TARGET_ABI_UNICOSMK 0
00181 #define TARGET_ABI_OSF (!TARGET_ABI_WINDOWS_NT \
00182 && !TARGET_ABI_OPEN_VMS \
00183 && !TARGET_ABI_UNICOSMK)
00184
00185 #ifndef TARGET_AS_CAN_SUBTRACT_LABELS
00186 #define TARGET_AS_CAN_SUBTRACT_LABELS TARGET_GAS
00187 #endif
00188 #ifndef TARGET_AS_SLASH_BEFORE_SUFFIX
00189 #define TARGET_AS_SLASH_BEFORE_SUFFIX TARGET_GAS
00190 #endif
00191 #ifndef TARGET_CAN_FAULT_IN_PROLOGUE
00192 #define TARGET_CAN_FAULT_IN_PROLOGUE 0
00193 #endif
00194 #ifndef TARGET_HAS_XFLOATING_LIBS
00195 #define TARGET_HAS_XFLOATING_LIBS 0
00196 #endif
00197 #ifndef TARGET_PROFILING_NEEDS_GP
00198 #define TARGET_PROFILING_NEEDS_GP 0
00199 #endif
00200 #ifndef TARGET_LD_BUGGY_LDGP
00201 #define TARGET_LD_BUGGY_LDGP 0
00202 #endif
00203 #ifndef TARGET_FIXUP_EV5_PREFETCH
00204 #define TARGET_FIXUP_EV5_PREFETCH 0
00205 #endif
00206
00207
00208
00209
00210
00211
00212
00213 #define TARGET_SWITCHES \
00214 { {"no-soft-float", MASK_FP, N_("Use hardware fp")}, \
00215 {"soft-float", - MASK_FP, N_("Do not use hardware fp")}, \
00216 {"fp-regs", MASK_FPREGS, N_("Use fp registers")}, \
00217 {"no-fp-regs", - (MASK_FP|MASK_FPREGS), \
00218 N_("Do not use fp registers")}, \
00219 {"alpha-as", -MASK_GAS, N_("Do not assume GAS")}, \
00220 {"gas", MASK_GAS, N_("Assume GAS")}, \
00221 {"ieee-conformant", MASK_IEEE_CONFORMANT, \
00222 N_("Request IEEE-conformant math library routines (OSF/1)")}, \
00223 {"ieee", MASK_IEEE|MASK_IEEE_CONFORMANT, \
00224 N_("Emit IEEE-conformant code, without inexact exceptions")}, \
00225 {"ieee-with-inexact", MASK_IEEE_WITH_INEXACT|MASK_IEEE_CONFORMANT, \
00226 N_("Emit IEEE-conformant code, with inexact exceptions")}, \
00227 {"build-constants", MASK_BUILD_CONSTANTS, \
00228 N_("Do not emit complex integer constants to read-only memory")}, \
00229 {"float-vax", MASK_FLOAT_VAX, N_("Use VAX fp")}, \
00230 {"float-ieee", -MASK_FLOAT_VAX, N_("Do not use VAX fp")}, \
00231 {"bwx", MASK_BWX, N_("Emit code for the byte/word ISA extension")}, \
00232 {"no-bwx", -MASK_BWX, ""}, \
00233 {"max", MASK_MAX, \
00234 N_("Emit code for the motion video ISA extension")}, \
00235 {"no-max", -MASK_MAX, ""}, \
00236 {"fix", MASK_FIX, \
00237 N_("Emit code for the fp move and sqrt ISA extension")}, \
00238 {"no-fix", -MASK_FIX, ""}, \
00239 {"cix", MASK_CIX, N_("Emit code for the counting ISA extension")}, \
00240 {"no-cix", -MASK_CIX, ""}, \
00241 {"explicit-relocs", MASK_EXPLICIT_RELOCS, \
00242 N_("Emit code using explicit relocation directives")}, \
00243 {"no-explicit-relocs", -MASK_EXPLICIT_RELOCS, ""}, \
00244 {"small-data", MASK_SMALL_DATA, \
00245 N_("Emit 16-bit relocations to the small data areas")}, \
00246 {"large-data", -MASK_SMALL_DATA, \
00247 N_("Emit 32-bit relocations to the small data areas")}, \
00248 {"", TARGET_DEFAULT | TARGET_CPU_DEFAULT \
00249 | TARGET_DEFAULT_EXPLICIT_RELOCS, ""} }
00250
00251 #define TARGET_DEFAULT MASK_FP|MASK_FPREGS
00252
00253 #ifndef TARGET_CPU_DEFAULT
00254 #define TARGET_CPU_DEFAULT 0
00255 #endif
00256
00257 #ifndef TARGET_DEFAULT_EXPLICIT_RELOCS
00258 #ifdef HAVE_AS_EXPLICIT_RELOCS
00259 #define TARGET_DEFAULT_EXPLICIT_RELOCS MASK_EXPLICIT_RELOCS
00260 #else
00261 #define TARGET_DEFAULT_EXPLICIT_RELOCS 0
00262 #endif
00263 #endif
00264
00265 extern const char *alpha_cpu_string;
00266 extern const char *alpha_tune_string;
00267 extern const char *alpha_fprm_string;
00268 extern const char *alpha_fptm_string;
00269 extern const char *alpha_tp_string;
00270 extern const char *alpha_mlat_string;
00271
00272 #define TARGET_OPTIONS \
00273 { \
00274 {"cpu=", &alpha_cpu_string, \
00275 N_("Use features of and schedule given CPU")}, \
00276 {"tune=", &alpha_tune_string, \
00277 N_("Schedule given CPU")}, \
00278 {"fp-rounding-mode=", &alpha_fprm_string, \
00279 N_("Control the generated fp rounding mode")}, \
00280 {"fp-trap-mode=", &alpha_fptm_string, \
00281 N_("Control the IEEE trap mode")}, \
00282 {"trap-precision=", &alpha_tp_string, \
00283 N_("Control the precision given to fp exceptions")}, \
00284 {"memory-latency=", &alpha_mlat_string, \
00285 N_("Tune expected memory latency")}, \
00286 }
00287
00288
00289
00290
00291 #define CPP_AM_BWX_SPEC "-D__alpha_bwx__ -Acpu=bwx"
00292 #define CPP_AM_MAX_SPEC "-D__alpha_max__ -Acpu=max"
00293 #define CPP_AM_FIX_SPEC "-D__alpha_fix__ -Acpu=fix"
00294 #define CPP_AM_CIX_SPEC "-D__alpha_cix__ -Acpu=cix"
00295
00296
00297 #define CPP_IM_EV4_SPEC "-D__alpha_ev4__ -Acpu=ev4"
00298 #define CPP_IM_EV5_SPEC "-D__alpha_ev5__ -Acpu=ev5"
00299 #define CPP_IM_EV6_SPEC "-D__alpha_ev6__ -Acpu=ev6"
00300
00301
00302 #define CPP_CPU_EV4_SPEC "%(cpp_im_ev4)"
00303 #define CPP_CPU_EV5_SPEC "%(cpp_im_ev5)"
00304 #define CPP_CPU_EV56_SPEC "%(cpp_im_ev5) %(cpp_am_bwx)"
00305 #define CPP_CPU_PCA56_SPEC "%(cpp_im_ev5) %(cpp_am_bwx) %(cpp_am_max)"
00306 #define CPP_CPU_EV6_SPEC \
00307 "%(cpp_im_ev6) %(cpp_am_bwx) %(cpp_am_max) %(cpp_am_fix)"
00308 #define CPP_CPU_EV67_SPEC \
00309 "%(cpp_im_ev6) %(cpp_am_bwx) %(cpp_am_max) %(cpp_am_fix) %(cpp_am_cix)"
00310
00311 #ifndef CPP_CPU_DEFAULT_SPEC
00312 # if TARGET_CPU_DEFAULT & MASK_CPU_EV6
00313 # if TARGET_CPU_DEFAULT & MASK_CIX
00314 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_EV67_SPEC
00315 # else
00316 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_EV6_SPEC
00317 # endif
00318 # else
00319 # if TARGET_CPU_DEFAULT & MASK_CPU_EV5
00320 # if TARGET_CPU_DEFAULT & MASK_MAX
00321 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_PCA56_SPEC
00322 # else
00323 # if TARGET_CPU_DEFAULT & MASK_BWX
00324 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_EV56_SPEC
00325 # else
00326 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_EV5_SPEC
00327 # endif
00328 # endif
00329 # else
00330 # define CPP_CPU_DEFAULT_SPEC CPP_CPU_EV4_SPEC
00331 # endif
00332 # endif
00333 #endif
00334
00335 #ifndef CPP_CPU_SPEC
00336 #define CPP_CPU_SPEC "\
00337 %{!undef:-Acpu=alpha -Amachine=alpha -D__alpha -D__alpha__ \
00338 %{mcpu=ev4|mcpu=21064:%(cpp_cpu_ev4) }\
00339 %{mcpu=ev5|mcpu=21164:%(cpp_cpu_ev5) }\
00340 %{mcpu=ev56|mcpu=21164a:%(cpp_cpu_ev56) }\
00341 %{mcpu=pca56|mcpu=21164pc|mcpu=21164PC:%(cpp_cpu_pca56) }\
00342 %{mcpu=ev6|mcpu=21264:%(cpp_cpu_ev6) }\
00343 %{mcpu=ev67|mcpu=21264a:%(cpp_cpu_ev67) }\
00344 %{!mcpu*:%(cpp_cpu_default) }}"
00345 #endif
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 #ifndef SUBTARGET_EXTRA_SPECS
00358 #define SUBTARGET_EXTRA_SPECS
00359 #endif
00360
00361 #define EXTRA_SPECS \
00362 { "cpp_am_bwx", CPP_AM_BWX_SPEC }, \
00363 { "cpp_am_max", CPP_AM_MAX_SPEC }, \
00364 { "cpp_am_fix", CPP_AM_FIX_SPEC }, \
00365 { "cpp_am_cix", CPP_AM_CIX_SPEC }, \
00366 { "cpp_im_ev4", CPP_IM_EV4_SPEC }, \
00367 { "cpp_im_ev5", CPP_IM_EV5_SPEC }, \
00368 { "cpp_im_ev6", CPP_IM_EV6_SPEC }, \
00369 { "cpp_cpu_ev4", CPP_CPU_EV4_SPEC }, \
00370 { "cpp_cpu_ev5", CPP_CPU_EV5_SPEC }, \
00371 { "cpp_cpu_ev56", CPP_CPU_EV56_SPEC }, \
00372 { "cpp_cpu_pca56", CPP_CPU_PCA56_SPEC }, \
00373 { "cpp_cpu_ev6", CPP_CPU_EV6_SPEC }, \
00374 { "cpp_cpu_ev67", CPP_CPU_EV67_SPEC }, \
00375 { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \
00376 { "cpp_cpu", CPP_CPU_SPEC }, \
00377 { "cpp_subtarget", CPP_SUBTARGET_SPEC }, \
00378 SUBTARGET_EXTRA_SPECS
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390 #define OVERRIDE_OPTIONS override_options ()
00391
00392
00393
00394
00395
00396
00397
00398 #define CONDITIONAL_REGISTER_USAGE \
00399 { \
00400 int i; \
00401 if (! TARGET_FPREGS) \
00402 for (i = 32; i < 63; i++) \
00403 fixed_regs[i] = call_used_regs[i] = 1; \
00404 }
00405
00406
00407
00408 #define CAN_DEBUG_WITHOUT_FP
00409
00410
00411
00412
00413 #define REAL_ARITHMETIC
00414
00415
00416 #define INT_TYPE_SIZE 32
00417
00418
00419 #define LONG_LONG_TYPE_SIZE 64
00420
00421
00422
00423
00424
00425 #define FLOAT_TYPE_SIZE 32
00426 #define DOUBLE_TYPE_SIZE 64
00427 #define LONG_DOUBLE_TYPE_SIZE 64
00428
00429 #define WCHAR_TYPE "unsigned int"
00430 #define WCHAR_TYPE_SIZE 32
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
00442 if (GET_MODE_CLASS (MODE) == MODE_INT \
00443 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
00444 { \
00445 if ((MODE) == SImode) \
00446 (UNSIGNEDP) = 0; \
00447 (MODE) = DImode; \
00448 }
00449
00450
00451
00452
00453 #define PROMOTE_FUNCTION_ARGS
00454
00455
00456
00457 #define PROMOTE_FUNCTION_RETURN
00458
00459
00460
00461
00462
00463
00464 #define BITS_BIG_ENDIAN 0
00465
00466
00467
00468 #define BYTES_BIG_ENDIAN 0
00469
00470
00471
00472
00473
00474
00475 #define WORDS_BIG_ENDIAN 0
00476
00477
00478 #define BITS_PER_UNIT 8
00479
00480
00481
00482
00483
00484 #define BITS_PER_WORD 64
00485
00486
00487 #define UNITS_PER_WORD 8
00488
00489
00490
00491 #define POINTER_SIZE 64
00492
00493
00494 #define PARM_BOUNDARY 64
00495
00496
00497 #define STACK_BOUNDARY 64
00498
00499
00500 #define FUNCTION_BOUNDARY 32
00501
00502
00503 #define EMPTY_FIELD_BOUNDARY 64
00504
00505
00506 #define STRUCTURE_SIZE_BOUNDARY 8
00507
00508
00509 #define PCC_BITFIELD_TYPE_MATTERS 1
00510
00511
00512 #define BIGGEST_ALIGNMENT 128
00513
00514
00515
00516 #define MINIMUM_ATOMIC_ALIGNMENT ((unsigned int) (TARGET_BWX ? 8 : 32))
00517
00518
00519
00520
00521
00522 #if 0
00523 #define CONSTANT_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)
00524 #define DATA_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)
00525 #endif
00526
00527
00528
00529
00530
00531
00532 #define STRICT_ALIGNMENT 1
00533
00534
00535
00536
00537
00538 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) 1
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562 #define FIRST_PSEUDO_REGISTER 64
00563
00564
00565
00566
00567 #define FIXED_REGISTERS \
00568 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00569 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, \
00570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00571 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }
00572
00573
00574
00575
00576
00577
00578
00579 #define CALL_USED_REGISTERS \
00580 {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, \
00581 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, \
00582 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \
00583 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 #define REG_ALLOC_ORDER \
00608 {42, 43, 44, 45, 46, 47, \
00609 54, 55, 56, 57, 58, 59, 60, 61, 62, \
00610 53, 52, 51, 50, 49, 48, \
00611 32, 33, \
00612 34, 35, 36, 37, 38, 39, 40, 41, \
00613 1, 2, 3, 4, 5, 6, 7, 8, \
00614 22, 23, 24, 25, \
00615 28, \
00616 0, \
00617 21, 20, 19, 18, 17, 16, \
00618 27, \
00619 9, 10, 11, 12, 13, 14, \
00620 26, \
00621 15, \
00622 29, \
00623 30, 31, 63 }
00624
00625
00626
00627
00628
00629
00630 #define HARD_REGNO_NREGS(REGNO, MODE) \
00631 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00632
00633
00634
00635
00636
00637
00638 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
00639 ((REGNO) >= 32 && (REGNO) <= 62 \
00640 ? GET_MODE_UNIT_SIZE (MODE) == 8 || GET_MODE_UNIT_SIZE (MODE) == 4 \
00641 : 1)
00642
00643
00644
00645
00646
00647
00648
00649 #define MODES_TIEABLE_P(MODE1, MODE2) \
00650 (HARD_REGNO_MODE_OK (32, (MODE1)) \
00651 ? HARD_REGNO_MODE_OK (32, (MODE2)) \
00652 : 1)
00653
00654
00655
00656
00657
00658
00659
00660
00661 #define STACK_POINTER_REGNUM 30
00662
00663
00664 #define HARD_FRAME_POINTER_REGNUM 15
00665
00666
00667
00668
00669
00670 #define FRAME_POINTER_REQUIRED 0
00671
00672
00673 #define ARG_POINTER_REGNUM 31
00674
00675
00676 #define FRAME_POINTER_REGNUM 63
00677
00678
00679
00680
00681
00682 #define STATIC_CHAIN_REGNUM 1
00683
00684
00685
00686 #define PIC_OFFSET_TABLE_REGNUM 29
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699 #define STRUCT_VALUE 0
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 enum reg_class {
00722 NO_REGS, R24_REG, R25_REG, R27_REG,
00723 GENERAL_REGS, FLOAT_REGS, ALL_REGS,
00724 LIM_REG_CLASSES
00725 };
00726
00727 #define N_REG_CLASSES (int) LIM_REG_CLASSES
00728
00729
00730
00731 #define REG_CLASS_NAMES \
00732 {"NO_REGS", "R24_REG", "R25_REG", "R27_REG", \
00733 "GENERAL_REGS", "FLOAT_REGS", "ALL_REGS" }
00734
00735
00736
00737
00738
00739 #define REG_CLASS_CONTENTS \
00740 { {0x00000000, 0x00000000}, \
00741 {0x01000000, 0x00000000}, \
00742 {0x02000000, 0x00000000}, \
00743 {0x08000000, 0x00000000}, \
00744 {0xffffffff, 0x80000000}, \
00745 {0x00000000, 0x7fffffff}, \
00746 {0xffffffff, 0xffffffff} }
00747
00748
00749
00750
00751
00752
00753 #define REGNO_REG_CLASS(REGNO) \
00754 ((REGNO) == 24 ? R24_REG \
00755 : (REGNO) == 25 ? R25_REG \
00756 : (REGNO) == 27 ? R27_REG \
00757 : (REGNO) >= 32 && (REGNO) <= 62 ? FLOAT_REGS \
00758 : GENERAL_REGS)
00759
00760
00761 #define INDEX_REG_CLASS NO_REGS
00762 #define BASE_REG_CLASS GENERAL_REGS
00763
00764
00765
00766 #define REG_CLASS_FROM_LETTER(C) \
00767 ((C) == 'a' ? R24_REG \
00768 : (C) == 'b' ? R25_REG \
00769 : (C) == 'c' ? R27_REG \
00770 : (C) == 'f' ? FLOAT_REGS \
00771 : NO_REGS)
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 #define CONST_OK_FOR_LETTER_P alpha_const_ok_for_letter_p
00793
00794
00795
00796
00797
00798
00799
00800 #define CONST_DOUBLE_OK_FOR_LETTER_P alpha_const_double_ok_for_letter_p
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816 #define EXTRA_CONSTRAINT alpha_extra_constraint
00817
00818
00819
00820
00821
00822
00823 #define PREFERRED_RELOAD_CLASS alpha_preferred_reload_class
00824
00825
00826
00827
00828
00829
00830
00831
00832 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS,MODE,IN) \
00833 secondary_reload_class((CLASS), (MODE), (IN), 1)
00834
00835 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS,MODE,OUT) \
00836 secondary_reload_class((CLASS), (MODE), (OUT), 0)
00837
00838
00839
00840
00841 #define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \
00842 (! TARGET_FIX && (((CLASS1) == FLOAT_REGS && (CLASS2) != FLOAT_REGS) \
00843 || ((CLASS2) == FLOAT_REGS && (CLASS1) != FLOAT_REGS)))
00844
00845
00846
00847
00848
00849
00850 #define SECONDARY_MEMORY_NEEDED_MODE(MODE) \
00851 (GET_MODE_CLASS (MODE) == MODE_FLOAT ? (MODE) \
00852 : GET_MODE_SIZE (MODE) >= 4 ? (MODE) \
00853 : mode_for_size (BITS_PER_WORD, GET_MODE_CLASS (MODE), 0))
00854
00855
00856
00857
00858 #define CLASS_MAX_NREGS(CLASS, MODE) \
00859 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00860
00861
00862
00863
00864 #define CLASS_CANNOT_CHANGE_MODE FLOAT_REGS
00865
00866
00867
00868 #define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) \
00869 (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO))
00870
00871
00872
00873
00874
00875
00876
00877
00878 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
00879 (((CLASS1) == FLOAT_REGS) == ((CLASS2) == FLOAT_REGS) \
00880 ? 2 \
00881 : TARGET_FIX ? 3 : 4+2*alpha_memory_latency)
00882
00883
00884
00885
00886
00887
00888 extern int alpha_memory_latency;
00889 #define MEMORY_MOVE_COST(MODE,CLASS,IN) (2*alpha_memory_latency)
00890
00891
00892 #define BRANCH_COST 5
00893
00894
00895
00896
00897
00898 #define STACK_GROWS_DOWNWARD
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911 #define STARTING_FRAME_OFFSET 0
00912
00913
00914
00915
00916
00917
00918
00919 #define STACK_CHECK_BUILTIN 1
00920
00921
00922
00923
00924 #define ACCUMULATE_OUTGOING_ARGS 1
00925
00926
00927
00928 #define FIRST_PARM_OFFSET(FNDECL) 0
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942 #define ELIMINABLE_REGS \
00943 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
00944 { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
00945 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
00946 { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
00947
00948
00949
00950
00951
00952
00953
00954 #define CAN_ELIMINATE(FROM, TO) 1
00955
00956
00957 #define ALPHA_ROUND(X) (((X) + 15) & ~ 15)
00958
00959
00960
00961 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
00962 { if ((FROM) == FRAME_POINTER_REGNUM) \
00963 (OFFSET) = (ALPHA_ROUND (current_function_outgoing_args_size) \
00964 + alpha_sa_size ()); \
00965 else if ((FROM) == ARG_POINTER_REGNUM) \
00966 (OFFSET) = (ALPHA_ROUND (current_function_outgoing_args_size) \
00967 + alpha_sa_size () \
00968 + (ALPHA_ROUND (get_frame_size () \
00969 + current_function_pretend_args_size) \
00970 - current_function_pretend_args_size)); \
00971 else \
00972 abort (); \
00973 }
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996 #define FUNCTION_VALUE(VALTYPE, FUNC) \
00997 gen_rtx_REG (((INTEGRAL_TYPE_P (VALTYPE) \
00998 && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \
00999 || POINTER_TYPE_P (VALTYPE)) \
01000 ? word_mode : TYPE_MODE (VALTYPE), \
01001 ((TARGET_FPREGS \
01002 && (TREE_CODE (VALTYPE) == REAL_TYPE \
01003 || TREE_CODE (VALTYPE) == COMPLEX_TYPE)) \
01004 ? 32 : 0))
01005
01006
01007
01008
01009 #define LIBCALL_VALUE(MODE) \
01010 gen_rtx_REG (MODE, \
01011 (TARGET_FPREGS \
01012 && (GET_MODE_CLASS (MODE) == MODE_FLOAT \
01013 || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) \
01014 ? 32 : 0))
01015
01016
01017
01018
01019
01020
01021
01022 #define RETURN_IN_MEMORY(TYPE) \
01023 (TYPE_MODE (TYPE) == BLKmode \
01024 || TYPE_MODE (TYPE) == TFmode \
01025 || TYPE_MODE (TYPE) == TCmode \
01026 || (TREE_CODE (TYPE) == INTEGER_TYPE && TYPE_PRECISION (TYPE) > 64))
01027
01028
01029
01030
01031 #define FUNCTION_VALUE_REGNO_P(N) \
01032 ((N) == 0 || (N) == 1 || (N) == 32 || (N) == 33)
01033
01034
01035
01036
01037 #define FUNCTION_ARG_REGNO_P(N) \
01038 (((N) >= 16 && (N) <= 21) || ((N) >= 16 + 32 && (N) <= 21 + 32))
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050 #define CUMULATIVE_ARGS int
01051
01052
01053
01054
01055
01056 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) (CUM) = 0
01057
01058
01059
01060
01061 #define ALPHA_ARG_SIZE(MODE, TYPE, NAMED) \
01062 ((MODE) == TFmode || (MODE) == TCmode ? 1 \
01063 : (((MODE) == BLKmode ? int_size_in_bytes (TYPE) : GET_MODE_SIZE (MODE)) \
01064 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
01065
01066
01067
01068
01069
01070 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01071 if (MUST_PASS_IN_STACK (MODE, TYPE)) \
01072 (CUM) = 6; \
01073 else \
01074 (CUM) += ALPHA_ARG_SIZE (MODE, TYPE, NAMED)
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01093 function_arg((CUM), (MODE), (TYPE), (NAMED))
01094
01095
01096
01097
01098
01099
01100
01101 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
01102 ((MODE) == TFmode || (MODE) == TCmode)
01103
01104
01105
01106
01107
01108
01109 #define FUNCTION_ARG_PADDING(MODE, TYPE) upward
01110
01111
01112
01113
01114
01115 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
01116 ((CUM) < 6 && 6 < (CUM) + ALPHA_ARG_SIZE (MODE, TYPE, NAMED) \
01117 ? 6 - (CUM) : 0)
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147 #define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
01148 { if ((CUM) < 6) \
01149 { \
01150 if (! (NO_RTL)) \
01151 { \
01152 rtx tmp; int set = get_varargs_alias_set (); \
01153 tmp = gen_rtx_MEM (BLKmode, \
01154 plus_constant (virtual_incoming_args_rtx, \
01155 ((CUM) + 6)* UNITS_PER_WORD)); \
01156 set_mem_alias_set (tmp, set); \
01157 move_block_from_reg \
01158 (16 + CUM, tmp, \
01159 6 - (CUM), (6 - (CUM)) * UNITS_PER_WORD); \
01160 \
01161 tmp = gen_rtx_MEM (BLKmode, \
01162 plus_constant (virtual_incoming_args_rtx, \
01163 (CUM) * UNITS_PER_WORD)); \
01164 set_mem_alias_set (tmp, set); \
01165 move_block_from_reg \
01166 (16 + (TARGET_FPREGS ? 32 : 0) + CUM, tmp, \
01167 6 - (CUM), (6 - (CUM)) * UNITS_PER_WORD); \
01168 } \
01169 PRETEND_SIZE = 12 * UNITS_PER_WORD; \
01170 } \
01171 }
01172
01173
01174
01175
01176
01177 #define FUNCTION_OK_FOR_SIBCALL(DECL) \
01178 (DECL \
01179 && ((TREE_ASM_WRITTEN (DECL) && !flag_pic) \
01180 || ! TREE_PUBLIC (DECL)))
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192 struct alpha_compare
01193 {
01194 struct rtx_def *op0, *op1;
01195 int fp_p;
01196 };
01197
01198 extern struct alpha_compare alpha_compare;
01199
01200
01201
01202
01203
01204
01205 #define ASM_COMMENT_START " #"
01206
01207
01208
01209 #define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
01210 alpha_start_function(FILE,NAME,DECL);
01211
01212
01213
01214 #define ASM_DECLARE_FUNCTION_SIZE(FILE,NAME,DECL) \
01215 alpha_end_function(FILE,NAME,DECL)
01216
01217
01218
01219 #define PROFILE_BEFORE_PROLOGUE 1
01220
01221
01222
01223
01224
01225 #define FUNCTION_PROFILER(FILE, LABELNO)
01226
01227
01228
01229
01230
01231
01232 #define EXIT_IGNORE_STACK 1
01233
01234
01235
01236 #define EPILOGUE_USES(REGNO) ((REGNO) == 26)
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246 #define TRAMPOLINE_TEMPLATE(FILE) \
01247 do { \
01248 fprintf (FILE, "\tldq $1,24($27)\n"); \
01249 fprintf (FILE, "\tldq $27,16($27)\n"); \
01250 fprintf (FILE, "\tjmp $31,($27),0\n"); \
01251 fprintf (FILE, "\tnop\n"); \
01252 fprintf (FILE, "\t.quad 0,0\n"); \
01253 } while (0)
01254
01255
01256
01257
01258 #define TRAMPOLINE_SECTION text_section
01259
01260
01261
01262 #define TRAMPOLINE_SIZE 32
01263
01264
01265
01266 #define TRAMPOLINE_ALIGNMENT 64
01267
01268
01269
01270
01271
01272 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01273 alpha_initialize_trampoline (TRAMP, FNADDR, CXT, 16, 24, 8)
01274
01275
01276
01277
01278
01279
01280 #define RETURN_ADDR_RTX alpha_return_addr
01281
01282
01283 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 26)
01284 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26)
01285
01286
01287 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 16 : INVALID_REGNUM)
01288 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 28)
01289 #define EH_RETURN_HANDLER_RTX \
01290 gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, \
01291 current_function_outgoing_args_size))
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 #define REGNO_OK_FOR_INDEX_P(REGNO) 0
01310 #define REGNO_OK_FOR_BASE_P(REGNO) \
01311 ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32 \
01312 || (REGNO) == 63 || reg_renumber[REGNO] == 63)
01313
01314
01315 #define MAX_REGS_PER_ADDRESS 1
01316
01317
01318
01319
01320
01321 #define CONSTANT_ADDRESS_P(X) \
01322 (GET_CODE (X) == CONST_INT \
01323 && (unsigned HOST_WIDE_INT) (INTVAL (X) + 0x8000) < 0x10000)
01324
01325
01326
01327
01328 #define LEGITIMATE_CONSTANT_P(X) \
01329 (GET_MODE_CLASS (GET_MODE (X)) != MODE_FLOAT \
01330 || (X) == CONST0_RTX (GET_MODE (X)))
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347 #define REG_OK_FOR_INDEX_P(X) 0
01348
01349
01350
01351 #define NONSTRICT_REG_OK_FOR_BASE_P(X) \
01352 (REGNO (X) < 32 || REGNO (X) == 63 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
01353
01354
01355
01356
01357
01358
01359 #define NONSTRICT_REG_OK_FP_BASE_P(X) \
01360 (REGNO (X) == 31 || REGNO (X) == 63 \
01361 || (REGNO (X) >= FIRST_PSEUDO_REGISTER \
01362 && REGNO (X) < LAST_VIRTUAL_REGISTER))
01363
01364
01365 #define STRICT_REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01366
01367 #ifdef REG_OK_STRICT
01368 #define REG_OK_FOR_BASE_P(X) STRICT_REG_OK_FOR_BASE_P (X)
01369 #else
01370 #define REG_OK_FOR_BASE_P(X) NONSTRICT_REG_OK_FOR_BASE_P (X)
01371 #endif
01372
01373
01374
01375
01376 #ifdef REG_OK_STRICT
01377 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
01378 do { \
01379 if (alpha_legitimate_address_p (MODE, X, 1)) \
01380 goto WIN; \
01381 } while (0)
01382 #else
01383 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
01384 do { \
01385 if (alpha_legitimate_address_p (MODE, X, 0)) \
01386 goto WIN; \
01387 } while (0)
01388 #endif
01389
01390
01391
01392
01393
01394 #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
01395 do { \
01396 rtx new_x = alpha_legitimize_address (X, NULL_RTX, MODE); \
01397 if (new_x) \
01398 { \
01399 X = new_x; \
01400 goto WIN; \
01401 } \
01402 } while (0)
01403
01404
01405
01406
01407
01408 #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_L,WIN) \
01409 do { \
01410 rtx new_x = alpha_legitimize_reload_address (X, MODE, OPNUM, TYPE, IND_L); \
01411 if (new_x) \
01412 { \
01413 X = new_x; \
01414 goto WIN; \
01415 } \
01416 } while (0)
01417
01418
01419
01420
01421
01422
01423 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
01424 { if (GET_CODE (ADDR) == AND) goto LABEL; }
01425
01426
01427
01428
01429 #define ADDRESS_COST(X) 0
01430
01431
01432 #define MACHINE_DEPENDENT_REORG(X) alpha_reorg(X)
01433
01434
01435
01436 #define CASE_VECTOR_MODE SImode
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446 #define CASE_VECTOR_PC_RELATIVE 1
01447
01448
01449 #define DEFAULT_SIGNED_CHAR 1
01450
01451
01452
01453
01454
01455
01456
01457 #define FIXUNS_TRUNC_LIKE_FIX_TRUNC
01458
01459
01460
01461
01462 #define MOVE_MAX 8
01463
01464
01465
01466
01467
01468
01469
01470 #define MOVE_RATIO (TARGET_BWX ? 7 : 2)
01471
01472
01473
01474 #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TImode)
01475
01476
01477
01478
01479
01480
01481
01482
01483 #define SLOW_BYTE_ACCESS 1
01484
01485
01486
01487 #define WORD_REGISTER_OPERATIONS
01488
01489
01490
01491
01492
01493 #define LOAD_EXTEND_OP(MODE) ((MODE) == SImode ? SIGN_EXTEND : ZERO_EXTEND)
01494
01495
01496 #define SHORT_IMMEDIATES_SIGN_EXTEND
01497
01498
01499
01500 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
01501
01502
01503
01504
01505 #define STORE_FLAG_VALUE 1
01506
01507
01508
01509 #define FLOAT_STORE_FLAG_VALUE(MODE) \
01510 REAL_VALUE_ATOF ((TARGET_FLOAT_VAX ? "0.5" : "2.0"), (MODE))
01511
01512
01513
01514 #define CANONICALIZE_COMPARISON(CODE,OP0,OP1) \
01515 do { \
01516 if (((CODE) == GE || (CODE) == GT || (CODE) == GEU || (CODE) == GTU) \
01517 && (GET_CODE (OP1) == REG || (OP1) == const0_rtx)) \
01518 { \
01519 rtx tem = (OP0); \
01520 (OP0) = (OP1); \
01521 (OP1) = tem; \
01522 (CODE) = swap_condition (CODE); \
01523 } \
01524 if (((CODE) == LT || (CODE) == LTU) \
01525 && GET_CODE (OP1) == CONST_INT && INTVAL (OP1) == 256) \
01526 { \
01527 (CODE) = (CODE) == LT ? LE : LEU; \
01528 (OP1) = GEN_INT (255); \
01529 } \
01530 } while (0)
01531
01532
01533
01534
01535 #define Pmode DImode
01536
01537
01538
01539 #define FUNCTION_MODE Pmode
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551 #define NO_FUNCTION_CSE
01552
01553
01554
01555 #define SHIFT_COUNT_TRUNCATED 1
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568 #define CONST_COSTS(RTX,CODE,OUTER_CODE) \
01569 case CONST_INT: \
01570 if (INTVAL (RTX) >= 0 && INTVAL (RTX) < 256) \
01571 return 0; \
01572 case CONST_DOUBLE: \
01573 if ((RTX) == CONST0_RTX (GET_MODE (RTX))) \
01574 return 0; \
01575 else if (((OUTER_CODE) == PLUS && add_operand (RTX, VOIDmode)) \
01576 || ((OUTER_CODE) == AND && and_operand (RTX, VOIDmode))) \
01577 return 0; \
01578 else if (add_operand (RTX, VOIDmode) || and_operand (RTX, VOIDmode)) \
01579 return 2; \
01580 else \
01581 return COSTS_N_INSNS (2); \
01582 case CONST: \
01583 case SYMBOL_REF: \
01584 case LABEL_REF: \
01585 switch (alpha_cpu) \
01586 { \
01587 case PROCESSOR_EV4: \
01588 return COSTS_N_INSNS (3); \
01589 case PROCESSOR_EV5: \
01590 case PROCESSOR_EV6: \
01591 return COSTS_N_INSNS (2); \
01592 default: abort(); \
01593 }
01594
01595
01596
01597
01598 #define RTX_COSTS(X,CODE,OUTER_CODE) \
01599 case PLUS: case MINUS: \
01600 if (FLOAT_MODE_P (GET_MODE (X))) \
01601 switch (alpha_cpu) \
01602 { \
01603 case PROCESSOR_EV4: \
01604 return COSTS_N_INSNS (6); \
01605 case PROCESSOR_EV5: \
01606 case PROCESSOR_EV6: \
01607 return COSTS_N_INSNS (4); \
01608 default: abort(); \
01609 } \
01610 else if (GET_CODE (XEXP (X, 0)) == MULT \
01611 && const48_operand (XEXP (XEXP (X, 0), 1), VOIDmode)) \
01612 return (2 + rtx_cost (XEXP (XEXP (X, 0), 0), OUTER_CODE) \
01613 + rtx_cost (XEXP (X, 1), OUTER_CODE)); \
01614 break; \
01615 case MULT: \
01616 switch (alpha_cpu) \
01617 { \
01618 case PROCESSOR_EV4: \
01619 if (FLOAT_MODE_P (GET_MODE (X))) \
01620 return COSTS_N_INSNS (6); \
01621 return COSTS_N_INSNS (23); \
01622 case PROCESSOR_EV5: \
01623 if (FLOAT_MODE_P (GET_MODE (X))) \
01624 return COSTS_N_INSNS (4); \
01625 else if (GET_MODE (X) == DImode) \
01626 return COSTS_N_INSNS (12); \
01627 else \
01628 return COSTS_N_INSNS (8); \
01629 case PROCESSOR_EV6: \
01630 if (FLOAT_MODE_P (GET_MODE (X))) \
01631 return COSTS_N_INSNS (4); \
01632 else \
01633 return COSTS_N_INSNS (7); \
01634 default: abort(); \
01635 } \
01636 case ASHIFT: \
01637 if (GET_CODE (XEXP (X, 1)) == CONST_INT \
01638 && INTVAL (XEXP (X, 1)) <= 3) \
01639 break; \
01640 \
01641 case ASHIFTRT: case LSHIFTRT: \
01642 switch (alpha_cpu) \
01643 { \
01644 case PROCESSOR_EV4: \
01645 return COSTS_N_INSNS (2); \
01646 case PROCESSOR_EV5: \
01647 case PROCESSOR_EV6: \
01648 return COSTS_N_INSNS (1); \
01649 default: abort(); \
01650 } \
01651 case IF_THEN_ELSE: \
01652 switch (alpha_cpu) \
01653 { \
01654 case PROCESSOR_EV4: \
01655 case PROCESSOR_EV6: \
01656 return COSTS_N_INSNS (2); \
01657 case PROCESSOR_EV5: \
01658 return COSTS_N_INSNS (1); \
01659 default: abort(); \
01660 } \
01661 case DIV: case UDIV: case MOD: case UMOD: \
01662 switch (alpha_cpu) \
01663 { \
01664 case PROCESSOR_EV4: \
01665 if (GET_MODE (X) == SFmode) \
01666 return COSTS_N_INSNS (34); \
01667 else if (GET_MODE (X) == DFmode) \
01668 return COSTS_N_INSNS (63); \
01669 else \
01670 return COSTS_N_INSNS (70); \
01671 case PROCESSOR_EV5: \
01672 if (GET_MODE (X) == SFmode) \
01673 return COSTS_N_INSNS (15); \
01674 else if (GET_MODE (X) == DFmode) \
01675 return COSTS_N_INSNS (22); \
01676 else \
01677 return COSTS_N_INSNS (70); \
01678 case PROCESSOR_EV6: \
01679 if (GET_MODE (X) == SFmode) \
01680 return COSTS_N_INSNS (12); \
01681 else if (GET_MODE (X) == DFmode) \
01682 return COSTS_N_INSNS (15); \
01683 else \
01684 return COSTS_N_INSNS (70); \
01685 default: abort(); \
01686 } \
01687 case MEM: \
01688 switch (alpha_cpu) \
01689 { \
01690 case PROCESSOR_EV4: \
01691 case PROCESSOR_EV6: \
01692 return COSTS_N_INSNS (3); \
01693 case PROCESSOR_EV5: \
01694 return COSTS_N_INSNS (2); \
01695 default: abort(); \
01696 } \
01697 case NEG: case ABS: \
01698 if (! FLOAT_MODE_P (GET_MODE (X))) \
01699 break; \
01700 \
01701 case FLOAT: case UNSIGNED_FLOAT: case FIX: case UNSIGNED_FIX: \
01702 case FLOAT_EXTEND: case FLOAT_TRUNCATE: \
01703 switch (alpha_cpu) \
01704 { \
01705 case PROCESSOR_EV4: \
01706 return COSTS_N_INSNS (6); \
01707 case PROCESSOR_EV5: \
01708 case PROCESSOR_EV6: \
01709 return COSTS_N_INSNS (4); \
01710 default: abort(); \
01711 }
01712
01713
01714
01715
01716
01717 #define ASM_APP_ON (TARGET_EXPLICIT_RELOCS ? "\t.set\tmacro\n" : "")
01718
01719
01720
01721 #define ASM_APP_OFF (TARGET_EXPLICIT_RELOCS ? "\t.set\tnomacro\n" : "")
01722
01723 #define TEXT_SECTION_ASM_OP "\t.text"
01724
01725
01726
01727 #define READONLY_DATA_SECTION_ASM_OP "\t.rdata"
01728
01729
01730
01731 #define DATA_SECTION_ASM_OP "\t.data"
01732
01733
01734
01735
01736
01737
01738
01739
01740 #define EXTRA_SECTIONS readonly_data
01741
01742 #define EXTRA_SECTION_FUNCTIONS \
01743 void \
01744 literal_section () \
01745 { \
01746 if (in_section != readonly_data) \
01747 { \
01748 static int firsttime = 1; \
01749 \
01750 fprintf (asm_out_file, "%s\n", READONLY_DATA_SECTION_ASM_OP); \
01751 if (firsttime) \
01752 { \
01753 firsttime = 0; \
01754 assemble_aligned_integer (8, const0_rtx); \
01755 } \
01756 \
01757 in_section = readonly_data; \
01758 } \
01759 } \
01760
01761 #define READONLY_DATA_SECTION literal_section
01762
01763
01764
01765
01766
01767 #define ENCODE_SECTION_INFO(DECL) alpha_encode_section_info (DECL)
01768
01769
01770
01771
01772
01773 #define REDO_SECTION_INFO_P(DECL) \
01774 ((TREE_CODE (DECL) == VAR_DECL) \
01775 && (DECL_ONE_ONLY (DECL) || DECL_WEAK (DECL) || DECL_COMMON (DECL) \
01776 || DECL_SECTION_NAME (DECL) != 0))
01777
01778 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
01779 do { \
01780 (VAR) = (SYMBOL_NAME); \
01781 if ((VAR)[0] == '@') \
01782 (VAR) += 2; \
01783 if ((VAR)[0] == '*') \
01784 (VAR)++; \
01785 } while (0)
01786
01787
01788
01789
01790 #define REGISTER_NAMES \
01791 {"$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", \
01792 "$9", "$10", "$11", "$12", "$13", "$14", "$15", \
01793 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", \
01794 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "AP", \
01795 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", "$f8", \
01796 "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", \
01797 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",\
01798 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "FP"}
01799
01800
01801
01802 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
01803 do { \
01804 const char *name_ = NAME; \
01805 if (*name_ == '@') \
01806 name_ += 2; \
01807 if (*name_ == '*') \
01808 name_++; \
01809 else \
01810 fputs (user_label_prefix, STREAM); \
01811 fputs (name_, STREAM); \
01812 } while (0)
01813
01814
01815
01816
01817 #define ASM_OUTPUT_LABEL(FILE,NAME) \
01818 do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
01819
01820
01821
01822
01823 #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
01824 do { fputs ("\t.globl ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
01825
01826
01827
01828 #define USER_LABEL_PREFIX ""
01829
01830
01831
01832
01833 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
01834 fprintf (FILE, "$%s%d:\n", PREFIX, NUM)
01835
01836
01837
01838
01839
01840 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
01841 { ASM_OUTPUT_ALIGN (FILE, 2); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
01842
01843
01844
01845
01846
01847
01848 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
01849 sprintf ((LABEL), "*$%s%ld", (PREFIX), (long)(NUM))
01850
01851
01852
01853 #define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) \
01854 ((OVERFLOW) = check_float_value (MODE, &D, OVERFLOW))
01855
01856
01857
01858
01859 #define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
01860 do { \
01861 FILE *_hide_asm_out_file = (MYFILE); \
01862 const unsigned char *_hide_p = (const unsigned char *) (MYSTRING); \
01863 int _hide_thissize = (MYLENGTH); \
01864 int _size_so_far = 0; \
01865 { \
01866 FILE *asm_out_file = _hide_asm_out_file; \
01867 const unsigned char *p = _hide_p; \
01868 int thissize = _hide_thissize; \
01869 int i; \
01870 fprintf (asm_out_file, "\t.ascii \""); \
01871 \
01872 for (i = 0; i < thissize; i++) \
01873 { \
01874 register int c = p[i]; \
01875 \
01876 if (_size_so_far ++ > 50 && i < thissize - 4) \
01877 _size_so_far = 0, fprintf (asm_out_file, "\"\n\t.ascii \""); \
01878 \
01879 if (c == '\"' || c == '\\') \
01880 putc ('\\', asm_out_file); \
01881 if (c >= ' ' && c < 0177) \
01882 putc (c, asm_out_file); \
01883 else \
01884 { \
01885 fprintf (asm_out_file, "\\%o", c); \
01886
01887
01888
01889
01890 \
01891 if (i < thissize - 1 && ISDIGIT (p[i + 1])) \
01892 _size_so_far = 0, fprintf (asm_out_file, "\"\n\t.ascii \""); \
01893 } \
01894 } \
01895 fprintf (asm_out_file, "\"\n"); \
01896 } \
01897 } \
01898 while (0)
01899
01900
01901
01902
01903 #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
01904 fprintf (FILE, "\tsubq $30,8,$30\n\tst%s $%s%d,0($30)\n", \
01905 (REGNO) > 32 ? "t" : "q", (REGNO) > 32 ? "f" : "", \
01906 (REGNO) & 31);
01907
01908
01909
01910
01911 #define ASM_OUTPUT_REG_POP(FILE,REGNO) \
01912 fprintf (FILE, "\tld%s $%s%d,0($30)\n\taddq $30,8,$30\n", \
01913 (REGNO) > 32 ? "t" : "q", (REGNO) > 32 ? "f" : "", \
01914 (REGNO) & 31);
01915
01916
01917
01918
01919 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) abort ()
01920
01921
01922
01923 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
01924 fprintf (FILE, "\t.%s $L%d\n", TARGET_ABI_WINDOWS_NT ? "long" : "gprel32", \
01925 (VALUE))
01926
01927
01928
01929
01930
01931 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
01932 if ((LOG) != 0) \
01933 fprintf (FILE, "\t.align %d\n", LOG);
01934
01935
01936
01937 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
01938 fprintf (FILE, "\t.space %d\n", (SIZE))
01939
01940
01941
01942
01943 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
01944 ( fputs ("\t.comm ", (FILE)), \
01945 assemble_name ((FILE), (NAME)), \
01946 fprintf ((FILE), ",%d\n", (SIZE)))
01947
01948
01949
01950
01951 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE,ROUNDED) \
01952 ( fputs ("\t.lcomm ", (FILE)), \
01953 assemble_name ((FILE), (NAME)), \
01954 fprintf ((FILE), ",%d\n", (SIZE)))
01955
01956
01957
01958
01959
01960 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
01961 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
01962 sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
01963
01964
01965
01966
01967
01968
01969 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
01987 ((CODE) == '/' || (CODE) == ',' || (CODE) == '-' || (CODE) == '~' \
01988 || (CODE) == '#' || (CODE) == '*')
01989
01990
01991
01992 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
01993 print_operand_address((FILE), (ADDR))
01994
01995
01996
01997 #define PREDICATE_CODES \
01998 {"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
01999 {"reg_or_6bit_operand", {SUBREG, REG, CONST_INT}}, \
02000 {"reg_or_8bit_operand", {SUBREG, REG, CONST_INT}}, \
02001 {"cint8_operand", {CONST_INT}}, \
02002 {"reg_or_cint_operand", {SUBREG, REG, CONST_INT}}, \
02003 {"add_operand", {SUBREG, REG, CONST_INT}}, \
02004 {"sext_add_operand", {SUBREG, REG, CONST_INT}}, \
02005 {"const48_operand", {CONST_INT}}, \
02006 {"and_operand", {SUBREG, REG, CONST_INT}}, \
02007 {"or_operand", {SUBREG, REG, CONST_INT}}, \
02008 {"mode_mask_operand", {CONST_INT}}, \
02009 {"mul8_operand", {CONST_INT}}, \
02010 {"mode_width_operand", {CONST_INT}}, \
02011 {"reg_or_fp0_operand", {SUBREG, REG, CONST_DOUBLE}}, \
02012 {"alpha_comparison_operator", {EQ, LE, LT, LEU, LTU}}, \
02013 {"alpha_zero_comparison_operator", {EQ, NE, LE, LT, LEU, LTU}}, \
02014 {"alpha_swapped_comparison_operator", {EQ, GE, GT, GEU, GTU}}, \
02015 {"signed_comparison_operator", {EQ, NE, LE, LT, GE, GT}}, \
02016 {"alpha_fp_comparison_operator", {EQ, LE, LT, UNORDERED}}, \
02017 {"divmod_operator", {DIV, MOD, UDIV, UMOD}}, \
02018 {"fp0_operand", {CONST_DOUBLE}}, \
02019 {"current_file_function_operand", {SYMBOL_REF}}, \
02020 {"direct_call_operand", {SYMBOL_REF}}, \
02021 {"local_symbolic_operand", {SYMBOL_REF, CONST, LABEL_REF}}, \
02022 {"small_symbolic_operand", {SYMBOL_REF, CONST}}, \
02023 {"global_symbolic_operand", {SYMBOL_REF, CONST}}, \
02024 {"call_operand", {REG, SYMBOL_REF}}, \
02025 {"input_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE, \
02026 SYMBOL_REF, CONST, LABEL_REF, HIGH}}, \
02027 {"some_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE, \
02028 SYMBOL_REF, CONST, LABEL_REF, HIGH}}, \
02029 {"some_ni_operand", {SUBREG, REG, MEM}}, \
02030 {"aligned_memory_operand", {MEM}}, \
02031 {"unaligned_memory_operand", {MEM}}, \
02032 {"reg_or_unaligned_mem_operand", {SUBREG, REG, MEM}}, \
02033 {"any_memory_operand", {MEM}}, \
02034 {"hard_fp_register_operand", {SUBREG, REG}}, \
02035 {"hard_int_register_operand", {SUBREG, REG}}, \
02036 {"reg_not_elim_operand", {SUBREG, REG}}, \
02037 {"reg_no_subreg_operand", {REG}}, \
02038 {"addition_operation", {PLUS}}, \
02039 {"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
02040 {"some_small_symbolic_operand", {SET, PARALLEL, PREFETCH, UNSPEC, \
02041 UNSPEC_VOLATILE}},
02042
02043
02044 #define BUILD_VA_LIST_TYPE(VALIST) \
02045 (VALIST) = alpha_build_va_list ()
02046
02047
02048 #define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \
02049 alpha_va_start (stdarg, valist, nextarg)
02050
02051
02052 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
02053 alpha_va_arg (valist, type)
02054
02055
02056 #define OBJECT_FORMAT_COFF
02057 #define EXTENDED_COFF
02058
02059
02060 #define NM_FLAGS "-pg"
02061
02062
02063
02064 #define SDB_DEBUGGING_INFO
02065 #define DBX_DEBUGGING_INFO
02066 #define MIPS_DEBUGGING_INFO
02067
02068 #ifndef PREFERRED_DEBUGGING_TYPE
02069 #define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
02070 #endif
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086 extern long alpha_arg_offset;
02087 extern long alpha_auto_offset;
02088 #define DEBUGGER_AUTO_OFFSET(X) \
02089 ((GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0) + alpha_auto_offset)
02090 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET + alpha_arg_offset)
02091
02092
02093 #define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
02094 alpha_output_lineno (STREAM, LINE)
02095
02096 #define ASM_OUTPUT_SOURCE_FILENAME(STREAM, NAME) \
02097 alpha_output_filename (STREAM, NAME)
02098
02099
02100
02101
02102 #define DBX_CONTIN_LENGTH 3000
02103
02104
02105 #define DEFAULT_GDB_EXTENSIONS 1
02106
02107
02108 #define NO_DBX_FUNCTION_END 1
02109
02110
02111
02112
02113
02114
02115 #define ASM_STABS_OP ((TARGET_GAS) ? "\t.stabs\t" : " #.stabs\t")
02116 #define ASM_STABN_OP ((TARGET_GAS) ? "\t.stabn\t" : " #.stabn\t")
02117 #define ASM_STABD_OP ((TARGET_GAS) ? "\t.stabd\t" : " #.stabd\t")
02118
02119
02120 #define SDB_ALLOW_FORWARD_REFERENCES
02121
02122
02123 #define SDB_ALLOW_UNKNOWN_REFERENCES
02124
02125 #define PUT_SDB_DEF(a) \
02126 do { \
02127 fprintf (asm_out_file, "\t%s.def\t", \
02128 (TARGET_GAS) ? "" : "#"); \
02129 ASM_OUTPUT_LABELREF (asm_out_file, a); \
02130 fputc (';', asm_out_file); \
02131 } while (0)
02132
02133 #define PUT_SDB_PLAIN_DEF(a) \
02134 do { \
02135 fprintf (asm_out_file, "\t%s.def\t.%s;", \
02136 (TARGET_GAS) ? "" : "#", (a)); \
02137 } while (0)
02138
02139 #define PUT_SDB_TYPE(a) \
02140 do { \
02141 fprintf (asm_out_file, "\t.type\t0x%x;", (a)); \
02142 } while (0)
02143
02144
02145
02146
02147
02148
02149 extern int sdb_label_count;
02150
02151 #define PUT_SDB_BLOCK_START(LINE) \
02152 do { \
02153 fprintf (asm_out_file, \
02154 "$Lb%d:\n\t%s.begin\t$Lb%d\t%d\n", \
02155 sdb_label_count, \
02156 (TARGET_GAS) ? "" : "#", \
02157 sdb_label_count, \
02158 (LINE)); \
02159 sdb_label_count++; \
02160 } while (0)
02161
02162 #define PUT_SDB_BLOCK_END(LINE) \
02163 do { \
02164 fprintf (asm_out_file, \
02165 "$Le%d:\n\t%s.bend\t$Le%d\t%d\n", \
02166 sdb_label_count, \
02167 (TARGET_GAS) ? "" : "#", \
02168 sdb_label_count, \
02169 (LINE)); \
02170 sdb_label_count++; \
02171 } while (0)
02172
02173 #define PUT_SDB_FUNCTION_START(LINE)
02174
02175 #define PUT_SDB_FUNCTION_END(LINE)
02176
02177 #define PUT_SDB_EPILOGUE_END(NAME) ((void)(NAME))
02178
02179
02180
02181
02182
02183
02184
02185 #define CODE_MASK 0x8F300
02186 #define MIPS_IS_STAB(sym) (((sym)->index & 0xFFF00) == CODE_MASK)
02187 #define MIPS_MARK_STAB(code) ((code)+CODE_MASK)
02188 #define MIPS_UNMARK_STAB(code) ((code)-CODE_MASK)
02189
02190
02191
02192 #define SHASH_SIZE 511
02193 #define THASH_SIZE 55
02194
02195
02196
02197 #define ALIGN_SYMTABLE_OFFSET(OFFSET) (((OFFSET) + 7) & ~7)
02198
02199
02200 #define NO_IMPLICIT_EXTERN_C
02201
02202
02203 #define TARGET_MEM_FUNCTIONS 1
02204
02205
02206
02207 #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
02208 alpha_output_mi_thunk_osf (FILE, THUNK_FNDECL, DELTA, FUNCTION)