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
00027
00028
00029
00030 struct processor_costs {
00031
00032 const int int_load;
00033
00034
00035 const int int_sload;
00036
00037
00038 const int int_zload;
00039
00040
00041 const int float_load;
00042
00043
00044 const int float_move;
00045
00046
00047 const int float_plusminus;
00048
00049
00050 const int float_cmp;
00051
00052
00053 const int float_cmove;
00054
00055
00056 const int float_mul;
00057
00058
00059 const int float_div_sf;
00060
00061
00062 const int float_div_df;
00063
00064
00065 const int float_sqrt_sf;
00066
00067
00068 const int float_sqrt_df;
00069
00070
00071 const int int_mul;
00072
00073
00074 const int int_mulX;
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 const int int_mul_bit_factor;
00090
00091
00092 const int int_div;
00093
00094
00095 const int int_divX;
00096
00097
00098 const int int_cmove;
00099
00100
00101 const int shift_penalty;
00102 };
00103
00104 extern const struct processor_costs *sparc_costs;
00105
00106
00107
00108
00109 #define TARGET_CPU_CPP_BUILTINS() \
00110 do \
00111 { \
00112 builtin_define_std ("sparc"); \
00113 if (TARGET_64BIT) \
00114 { \
00115 builtin_assert ("cpu=sparc64"); \
00116 builtin_assert ("machine=sparc64"); \
00117 } \
00118 else \
00119 { \
00120 builtin_assert ("cpu=sparc"); \
00121 builtin_assert ("machine=sparc"); \
00122 } \
00123 } \
00124 while (0)
00125
00126
00127
00128
00129
00130 #define DEFAULT_ARCH32_P ((TARGET_DEFAULT & MASK_64BIT) == 0)
00131
00132
00133
00134
00135 #ifdef IN_LIBGCC2
00136 #if defined(__sparcv9) || defined(__arch64__)
00137 #define TARGET_ARCH32 0
00138 #else
00139 #define TARGET_ARCH32 1
00140 #endif
00141 #else
00142 #ifdef SPARC_BI_ARCH
00143 #define TARGET_ARCH32 (! TARGET_64BIT)
00144 #else
00145 #define TARGET_ARCH32 (DEFAULT_ARCH32_P)
00146 #endif
00147 #endif
00148 #define TARGET_ARCH64 (! TARGET_ARCH32)
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 enum cmodel {
00187 CM_32,
00188 CM_MEDLOW,
00189 CM_MEDMID,
00190 CM_MEDANY,
00191 CM_EMBMEDANY
00192 };
00193
00194
00195 extern enum cmodel sparc_cmodel;
00196
00197
00198 #define TARGET_CM_MEDLOW (sparc_cmodel == CM_MEDLOW)
00199 #define TARGET_CM_MEDMID (sparc_cmodel == CM_MEDMID)
00200 #define TARGET_CM_MEDANY (sparc_cmodel == CM_MEDANY)
00201 #define TARGET_CM_EMBMEDANY (sparc_cmodel == CM_EMBMEDANY)
00202
00203 #define SPARC_DEFAULT_CMODEL CM_32
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 #define SPARC_RELAXED_ORDERING false
00214
00215
00216 #define NEED_INDICATE_EXEC_STACK 0
00217
00218
00219
00220 #define EMBMEDANY_BASE_REG "%g4"
00221
00222
00223
00224
00225
00226
00227 #define TARGET_CPU_sparc 0
00228 #define TARGET_CPU_v7 0
00229 #define TARGET_CPU_sparclet 1
00230 #define TARGET_CPU_sparclite 2
00231 #define TARGET_CPU_v8 3
00232 #define TARGET_CPU_supersparc 4
00233 #define TARGET_CPU_hypersparc 5
00234 #define TARGET_CPU_sparc86x 6
00235 #define TARGET_CPU_sparclite86x 6
00236 #define TARGET_CPU_v9 7
00237 #define TARGET_CPU_sparcv9 7
00238 #define TARGET_CPU_sparc64 7
00239 #define TARGET_CPU_ultrasparc 8
00240 #define TARGET_CPU_ultrasparc3 9
00241 #define TARGET_CPU_niagara 10
00242
00243 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
00244 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \
00245 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 \
00246 || TARGET_CPU_DEFAULT == TARGET_CPU_niagara
00247
00248 #define CPP_CPU32_DEFAULT_SPEC ""
00249 #define ASM_CPU32_DEFAULT_SPEC ""
00250
00251 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9
00252
00253 #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
00254
00255
00256
00257 #define ASM_CPU64_DEFAULT_SPEC "-Av9"
00258 #endif
00259 #if TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
00260 #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
00261 #define ASM_CPU64_DEFAULT_SPEC "-Av9a"
00262 #endif
00263 #if TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3
00264 #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
00265 #define ASM_CPU64_DEFAULT_SPEC "-Av9b"
00266 #endif
00267 #if TARGET_CPU_DEFAULT == TARGET_CPU_niagara
00268 #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
00269 #define ASM_CPU64_DEFAULT_SPEC "-Av9b"
00270 #endif
00271
00272 #else
00273
00274 #define CPP_CPU64_DEFAULT_SPEC ""
00275 #define ASM_CPU64_DEFAULT_SPEC ""
00276
00277 #if TARGET_CPU_DEFAULT == TARGET_CPU_sparc \
00278 || TARGET_CPU_DEFAULT == TARGET_CPU_v8
00279 #define CPP_CPU32_DEFAULT_SPEC ""
00280 #define ASM_CPU32_DEFAULT_SPEC ""
00281 #endif
00282
00283 #if TARGET_CPU_DEFAULT == TARGET_CPU_sparclet
00284 #define CPP_CPU32_DEFAULT_SPEC "-D__sparclet__"
00285 #define ASM_CPU32_DEFAULT_SPEC "-Asparclet"
00286 #endif
00287
00288 #if TARGET_CPU_DEFAULT == TARGET_CPU_sparclite
00289 #define CPP_CPU32_DEFAULT_SPEC "-D__sparclite__"
00290 #define ASM_CPU32_DEFAULT_SPEC "-Asparclite"
00291 #endif
00292
00293 #if TARGET_CPU_DEFAULT == TARGET_CPU_supersparc
00294 #define CPP_CPU32_DEFAULT_SPEC "-D__supersparc__ -D__sparc_v8__"
00295 #define ASM_CPU32_DEFAULT_SPEC ""
00296 #endif
00297
00298 #if TARGET_CPU_DEFAULT == TARGET_CPU_hypersparc
00299 #define CPP_CPU32_DEFAULT_SPEC "-D__hypersparc__ -D__sparc_v8__"
00300 #define ASM_CPU32_DEFAULT_SPEC ""
00301 #endif
00302
00303 #if TARGET_CPU_DEFAULT == TARGET_CPU_sparclite86x
00304 #define CPP_CPU32_DEFAULT_SPEC "-D__sparclite86x__"
00305 #define ASM_CPU32_DEFAULT_SPEC "-Asparclite"
00306 #endif
00307
00308 #endif
00309
00310 #if !defined(CPP_CPU32_DEFAULT_SPEC) || !defined(CPP_CPU64_DEFAULT_SPEC)
00311 #error Unrecognized value in TARGET_CPU_DEFAULT.
00312 #endif
00313
00314 #ifdef SPARC_BI_ARCH
00315
00316 #define CPP_CPU_DEFAULT_SPEC \
00317 (DEFAULT_ARCH32_P ? "\
00318 %{m64:" CPP_CPU64_DEFAULT_SPEC "} \
00319 %{!m64:" CPP_CPU32_DEFAULT_SPEC "} \
00320 " : "\
00321 %{m32:" CPP_CPU32_DEFAULT_SPEC "} \
00322 %{!m32:" CPP_CPU64_DEFAULT_SPEC "} \
00323 ")
00324 #define ASM_CPU_DEFAULT_SPEC \
00325 (DEFAULT_ARCH32_P ? "\
00326 %{m64:" ASM_CPU64_DEFAULT_SPEC "} \
00327 %{!m64:" ASM_CPU32_DEFAULT_SPEC "} \
00328 " : "\
00329 %{m32:" ASM_CPU32_DEFAULT_SPEC "} \
00330 %{!m32:" ASM_CPU64_DEFAULT_SPEC "} \
00331 ")
00332
00333 #else
00334
00335 #define CPP_CPU_DEFAULT_SPEC (DEFAULT_ARCH32_P ? CPP_CPU32_DEFAULT_SPEC : CPP_CPU64_DEFAULT_SPEC)
00336 #define ASM_CPU_DEFAULT_SPEC (DEFAULT_ARCH32_P ? ASM_CPU32_DEFAULT_SPEC : ASM_CPU64_DEFAULT_SPEC)
00337
00338 #endif
00339
00340
00341
00342
00343
00344 #define CPP_CPU_SPEC "\
00345 %{msoft-float:-D_SOFT_FLOAT} \
00346 %{mcypress:} \
00347 %{msparclite:-D__sparclite__} \
00348 %{mf930:-D__sparclite__} %{mf934:-D__sparclite__} \
00349 %{mv8:-D__sparc_v8__} \
00350 %{msupersparc:-D__supersparc__ -D__sparc_v8__} \
00351 %{mcpu=sparclet:-D__sparclet__} %{mcpu=tsc701:-D__sparclet__} \
00352 %{mcpu=sparclite:-D__sparclite__} \
00353 %{mcpu=f930:-D__sparclite__} %{mcpu=f934:-D__sparclite__} \
00354 %{mcpu=v8:-D__sparc_v8__} \
00355 %{mcpu=supersparc:-D__supersparc__ -D__sparc_v8__} \
00356 %{mcpu=hypersparc:-D__hypersparc__ -D__sparc_v8__} \
00357 %{mcpu=sparclite86x:-D__sparclite86x__} \
00358 %{mcpu=v9:-D__sparc_v9__} \
00359 %{mcpu=ultrasparc:-D__sparc_v9__} \
00360 %{mcpu=ultrasparc3:-D__sparc_v9__} \
00361 %{mcpu=niagara:-D__sparc_v9__} \
00362 %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \
00363 "
00364 #define CPP_ARCH32_SPEC ""
00365 #define CPP_ARCH64_SPEC "-D__arch64__"
00366
00367 #define CPP_ARCH_DEFAULT_SPEC \
00368 (DEFAULT_ARCH32_P ? CPP_ARCH32_SPEC : CPP_ARCH64_SPEC)
00369
00370 #define CPP_ARCH_SPEC "\
00371 %{m32:%(cpp_arch32)} \
00372 %{m64:%(cpp_arch64)} \
00373 %{!m32:%{!m64:%(cpp_arch_default)}} \
00374 "
00375
00376
00377 #define CPP_ENDIAN_SPEC "\
00378 %{mlittle-endian:-D__LITTLE_ENDIAN__} \
00379 %{mlittle-endian-data:-D__LITTLE_ENDIAN_DATA__}"
00380
00381
00382 #define CPP_SUBTARGET_SPEC ""
00383
00384 #define CPP_SPEC "%(cpp_cpu) %(cpp_arch) %(cpp_endian) %(cpp_subtarget)"
00385
00386
00387
00388
00389
00390
00391
00392 #define CC1_SPEC "\
00393 %{sun4:} %{target:} \
00394 %{mcypress:-mcpu=cypress} \
00395 %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
00396 %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
00397 "
00398
00399
00400 #define ASM_CPU_SPEC "\
00401 %{mcpu=sparclet:-Asparclet} %{mcpu=tsc701:-Asparclet} \
00402 %{msparclite:-Asparclite} \
00403 %{mf930:-Asparclite} %{mf934:-Asparclite} \
00404 %{mcpu=sparclite:-Asparclite} \
00405 %{mcpu=sparclite86x:-Asparclite} \
00406 %{mcpu=f930:-Asparclite} %{mcpu=f934:-Asparclite} \
00407 %{mv8plus:-Av8plus} \
00408 %{mcpu=v9:-Av9} \
00409 %{mcpu=ultrasparc:%{!mv8plus:-Av9a}} \
00410 %{mcpu=ultrasparc3:%{!mv8plus:-Av9b}} \
00411 %{mcpu=niagara:%{!mv8plus:-Av9b}} \
00412 %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(asm_cpu_default)}}}}}}} \
00413 "
00414
00415
00416
00417
00418 #define ASM_ARCH32_SPEC "-32"
00419 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
00420 #define ASM_ARCH64_SPEC "-64 -no-undeclared-regs"
00421 #else
00422 #define ASM_ARCH64_SPEC "-64"
00423 #endif
00424 #define ASM_ARCH_DEFAULT_SPEC \
00425 (DEFAULT_ARCH32_P ? ASM_ARCH32_SPEC : ASM_ARCH64_SPEC)
00426
00427 #define ASM_ARCH_SPEC "\
00428 %{m32:%(asm_arch32)} \
00429 %{m64:%(asm_arch64)} \
00430 %{!m32:%{!m64:%(asm_arch_default)}} \
00431 "
00432
00433 #ifdef HAVE_AS_RELAX_OPTION
00434 #define ASM_RELAX_SPEC "%{!mno-relax:-relax}"
00435 #else
00436 #define ASM_RELAX_SPEC ""
00437 #endif
00438
00439
00440
00441 #define ASM_SPEC "\
00442 %{R} %{!pg:%{!p:%{fpic|fPIC|fpie|fPIE:-k}}} %{keep-local-as-symbols:-L} \
00443 %(asm_cpu) %(asm_relax)"
00444
00445 #define AS_NEEDS_DASH_FOR_PIPED_INPUT
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457 #define EXTRA_SPECS \
00458 { "cpp_cpu", CPP_CPU_SPEC }, \
00459 { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \
00460 { "cpp_arch32", CPP_ARCH32_SPEC }, \
00461 { "cpp_arch64", CPP_ARCH64_SPEC }, \
00462 { "cpp_arch_default", CPP_ARCH_DEFAULT_SPEC },\
00463 { "cpp_arch", CPP_ARCH_SPEC }, \
00464 { "cpp_endian", CPP_ENDIAN_SPEC }, \
00465 { "cpp_subtarget", CPP_SUBTARGET_SPEC }, \
00466 { "asm_cpu", ASM_CPU_SPEC }, \
00467 { "asm_cpu_default", ASM_CPU_DEFAULT_SPEC }, \
00468 { "asm_arch32", ASM_ARCH32_SPEC }, \
00469 { "asm_arch64", ASM_ARCH64_SPEC }, \
00470 { "asm_relax", ASM_RELAX_SPEC }, \
00471 { "asm_arch_default", ASM_ARCH_DEFAULT_SPEC },\
00472 { "asm_arch", ASM_ARCH_SPEC }, \
00473 SUBTARGET_EXTRA_SPECS
00474
00475 #define SUBTARGET_EXTRA_SPECS
00476
00477
00478
00479 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G %L"
00480
00481
00482 #define PTRDIFF_TYPE (TARGET_ARCH64 ? "long int" : "int")
00483 #define SIZE_TYPE (TARGET_ARCH64 ? "long unsigned int" : "unsigned int")
00484
00485
00486 #define WCHAR_TYPE "short unsigned int"
00487 #define WCHAR_TYPE_SIZE 16
00488
00489
00490 #define CAN_DEBUG_WITHOUT_FP
00491
00492
00493
00494 #define OVERRIDE_OPTIONS sparc_override_options ()
00495
00496
00497 #define MASK_ISA \
00498 (MASK_V8 + MASK_SPARCLITE + MASK_SPARCLET + MASK_V9 + MASK_DEPRECATED_V8_INSNS)
00499
00500
00501
00502
00503
00504
00505 #define TARGET_HARD_MUL32 \
00506 ((TARGET_V8 || TARGET_SPARCLITE \
00507 || TARGET_SPARCLET || TARGET_DEPRECATED_V8_INSNS) \
00508 && ! TARGET_V8PLUS && TARGET_ARCH32)
00509
00510 #define TARGET_HARD_MUL \
00511 (TARGET_V8 || TARGET_SPARCLITE || TARGET_SPARCLET \
00512 || TARGET_DEPRECATED_V8_INSNS || TARGET_V8PLUS)
00513
00514
00515
00516
00517 #define TARGET_DEFAULT (MASK_APP_REGS + MASK_FPU)
00518
00519
00520
00521 enum processor_type {
00522 PROCESSOR_V7,
00523 PROCESSOR_CYPRESS,
00524 PROCESSOR_V8,
00525 PROCESSOR_SUPERSPARC,
00526 PROCESSOR_SPARCLITE,
00527 PROCESSOR_F930,
00528 PROCESSOR_F934,
00529 PROCESSOR_HYPERSPARC,
00530 PROCESSOR_SPARCLITE86X,
00531 PROCESSOR_SPARCLET,
00532 PROCESSOR_TSC701,
00533 PROCESSOR_V9,
00534 PROCESSOR_ULTRASPARC,
00535 PROCESSOR_ULTRASPARC3,
00536 PROCESSOR_NIAGARA
00537 };
00538
00539
00540 extern enum processor_type sparc_cpu;
00541
00542
00543
00544 #define sparc_cpu_attr ((enum attr_cpu) sparc_cpu)
00545
00546
00547
00548
00549
00550
00551 #define OPTION_DEFAULT_SPECS \
00552 {"cpu", "%{!mcpu=*:-mcpu=%(VALUE)}" }, \
00553 {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
00554 {"float", "%{!msoft-float:%{!mhard-float:%{!fpu:%{!no-fpu:-m%(VALUE)-float}}}}" }
00555
00556
00557 struct sparc_cpu_select
00558 {
00559 const char *string;
00560 const char *const name;
00561 const int set_tune_p;
00562 const int set_arch_p;
00563 };
00564
00565 extern struct sparc_cpu_select sparc_select[];
00566
00567
00568
00569
00570
00571 #define BITS_BIG_ENDIAN 1
00572
00573
00574 #define BYTES_BIG_ENDIAN 1
00575
00576
00577
00578 #define WORDS_BIG_ENDIAN 1
00579
00580
00581
00582 #if defined (__LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN_DATA__)
00583 #define LIBGCC2_WORDS_BIG_ENDIAN 0
00584 #else
00585 #define LIBGCC2_WORDS_BIG_ENDIAN 1
00586 #endif
00587
00588 #define MAX_BITS_PER_WORD 64
00589
00590
00591 #define UNITS_PER_WORD (TARGET_ARCH64 ? 8 : 4)
00592 #ifdef IN_LIBGCC2
00593 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
00594 #else
00595 #define MIN_UNITS_PER_WORD 4
00596 #endif
00597
00598 #define UNITS_PER_SIMD_WORD (TARGET_VIS ? 8 : UNITS_PER_WORD)
00599
00600
00601
00602 #define SHORT_TYPE_SIZE 16
00603 #define INT_TYPE_SIZE 32
00604 #define LONG_TYPE_SIZE (TARGET_ARCH64 ? 64 : 32)
00605 #define LONG_LONG_TYPE_SIZE 64
00606 #define FLOAT_TYPE_SIZE 32
00607 #define DOUBLE_TYPE_SIZE 64
00608
00609
00610
00611
00612
00613
00614 #define POINTER_SIZE (TARGET_PTR64 ? 64 : 32)
00615
00616
00617
00618
00619 #define POINTERS_EXTEND_UNSIGNED 1
00620
00621
00622
00623
00624
00625 #define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE) \
00626 if (TARGET_ARCH64 \
00627 && GET_MODE_CLASS (MODE) == MODE_INT \
00628 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
00629 (MODE) = word_mode;
00630
00631
00632 #define PARM_BOUNDARY (TARGET_ARCH64 ? 64 : 32)
00633
00634
00635
00636
00637 #define STACK_BOUNDARY (TARGET_ARCH64 ? 128 : 64)
00638
00639 #define SPARC_STACK_BOUNDARY_HACK (TARGET_ARCH64 && TARGET_STACK_BIAS)
00640
00641
00642
00643 #define SPARC_STACK_ALIGN(LOC) \
00644 (TARGET_ARCH64 ? (((LOC)+15) & ~15) : (((LOC)+7) & ~7))
00645
00646
00647 #define FUNCTION_BOUNDARY 32
00648
00649
00650 #define EMPTY_FIELD_BOUNDARY (TARGET_ARCH64 ? 64 : 32)
00651
00652
00653 #define STRUCTURE_SIZE_BOUNDARY 8
00654
00655
00656 #define PCC_BITFIELD_TYPE_MATTERS 1
00657
00658
00659 #define BIGGEST_ALIGNMENT (TARGET_ARCH64 ? 128 : 64)
00660
00661
00662 #define FASTEST_ALIGNMENT 64
00663
00664
00665
00666
00667
00668
00669
00670
00671 #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
00672 (TARGET_FASTER_STRUCTS ? \
00673 ((TREE_CODE (STRUCT) == RECORD_TYPE \
00674 || TREE_CODE (STRUCT) == UNION_TYPE \
00675 || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
00676 && TYPE_FIELDS (STRUCT) != 0 \
00677 ? MAX (MAX ((COMPUTED), (SPECIFIED)), BIGGEST_ALIGNMENT) \
00678 : MAX ((COMPUTED), (SPECIFIED))) \
00679 : MAX ((COMPUTED), (SPECIFIED)))
00680
00681
00682 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
00683 ((TREE_CODE (EXP) == STRING_CST \
00684 && (ALIGN) < FASTEST_ALIGNMENT) \
00685 ? FASTEST_ALIGNMENT : (ALIGN))
00686
00687
00688 #define DATA_ALIGNMENT(TYPE, ALIGN) \
00689 (TREE_CODE (TYPE) == ARRAY_TYPE \
00690 && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
00691 && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
00692
00693
00694
00695 #define STRICT_ALIGNMENT 1
00696
00697
00698
00699
00700 #define MAX_TEXT_ALIGN 32
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718 #define FIRST_PSEUDO_REGISTER 102
00719
00720 #define SPARC_FIRST_FP_REG 32
00721
00722 #define SPARC_FIRST_V9_FP_REG 64
00723 #define SPARC_LAST_V9_FP_REG 95
00724
00725 #define SPARC_FIRST_V9_FCC_REG 96
00726 #define SPARC_LAST_V9_FCC_REG 99
00727
00728 #define SPARC_FCC_REG 96
00729
00730 #define SPARC_ICC_REG 100
00731
00732
00733 #define SPARC_FP_REG_P(REGNO) \
00734 ((REGNO) >= SPARC_FIRST_FP_REG && (REGNO) <= SPARC_LAST_V9_FP_REG)
00735
00736
00737 #define SPARC_OUTGOING_INT_ARG_FIRST 8
00738 #define SPARC_INCOMING_INT_ARG_FIRST 24
00739 #define SPARC_FP_ARG_FIRST 32
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768 #define FIXED_REGISTERS \
00769 {1, 0, 2, 2, 2, 2, 1, 1, \
00770 0, 0, 0, 0, 0, 0, 1, 0, \
00771 0, 0, 0, 0, 0, 0, 0, 0, \
00772 0, 0, 0, 0, 0, 0, 1, 1, \
00773 \
00774 0, 0, 0, 0, 0, 0, 0, 0, \
00775 0, 0, 0, 0, 0, 0, 0, 0, \
00776 0, 0, 0, 0, 0, 0, 0, 0, \
00777 0, 0, 0, 0, 0, 0, 0, 0, \
00778 \
00779 0, 0, 0, 0, 0, 0, 0, 0, \
00780 0, 0, 0, 0, 0, 0, 0, 0, \
00781 0, 0, 0, 0, 0, 0, 0, 0, \
00782 0, 0, 0, 0, 0, 0, 0, 0, \
00783 \
00784 0, 0, 0, 0, 0, 1}
00785
00786
00787
00788
00789
00790
00791
00792
00793 #define CALL_USED_REGISTERS \
00794 {1, 1, 1, 1, 1, 1, 1, 1, \
00795 1, 1, 1, 1, 1, 1, 1, 1, \
00796 0, 0, 0, 0, 0, 0, 0, 0, \
00797 0, 0, 0, 0, 0, 0, 1, 1, \
00798 \
00799 1, 1, 1, 1, 1, 1, 1, 1, \
00800 1, 1, 1, 1, 1, 1, 1, 1, \
00801 1, 1, 1, 1, 1, 1, 1, 1, \
00802 1, 1, 1, 1, 1, 1, 1, 1, \
00803 \
00804 1, 1, 1, 1, 1, 1, 1, 1, \
00805 1, 1, 1, 1, 1, 1, 1, 1, \
00806 1, 1, 1, 1, 1, 1, 1, 1, \
00807 1, 1, 1, 1, 1, 1, 1, 1, \
00808 \
00809 1, 1, 1, 1, 1, 1}
00810
00811
00812
00813
00814 #define CONDITIONAL_REGISTER_USAGE \
00815 do \
00816 { \
00817 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
00818 { \
00819 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00820 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00821 } \
00822 \
00823 \
00824 if (TARGET_ARCH32 && fixed_regs[5]) \
00825 fixed_regs[5] = 1; \
00826 else if (TARGET_ARCH64 && fixed_regs[5] == 2) \
00827 fixed_regs[5] = 0; \
00828 if (! TARGET_V9) \
00829 { \
00830 int regno; \
00831 for (regno = SPARC_FIRST_V9_FP_REG; \
00832 regno <= SPARC_LAST_V9_FP_REG; \
00833 regno++) \
00834 fixed_regs[regno] = 1; \
00835 \
00836 for (regno = SPARC_FIRST_V9_FCC_REG + 1; \
00837 regno <= SPARC_LAST_V9_FCC_REG; \
00838 regno++) \
00839 fixed_regs[regno] = 1; \
00840 } \
00841 if (! TARGET_FPU) \
00842 { \
00843 int regno; \
00844 for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++) \
00845 fixed_regs[regno] = 1; \
00846 } \
00847 \
00848 \
00849 if (fixed_regs[2] == 2) \
00850 fixed_regs[2] = ! TARGET_APP_REGS; \
00851 if (fixed_regs[3] == 2) \
00852 fixed_regs[3] = ! TARGET_APP_REGS; \
00853 if (TARGET_ARCH32 && fixed_regs[4] == 2) \
00854 fixed_regs[4] = ! TARGET_APP_REGS; \
00855 else if (TARGET_CM_EMBMEDANY) \
00856 fixed_regs[4] = 1; \
00857 else if (fixed_regs[4] == 2) \
00858 fixed_regs[4] = 0; \
00859 } \
00860 while (0)
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873 #define HARD_REGNO_NREGS(REGNO, MODE) \
00874 (TARGET_ARCH64 \
00875 ? ((REGNO) < 32 || (REGNO) == FRAME_POINTER_REGNUM \
00876 ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD \
00877 : (GET_MODE_SIZE (MODE) + 3) / 4) \
00878 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
00879
00880
00881
00882 #define REGMODE_NATURAL_SIZE(MODE) \
00883 ((TARGET_ARCH64 && FLOAT_MODE_P (MODE)) ? 4 : UNITS_PER_WORD)
00884
00885
00886
00887 extern const int *hard_regno_mode_classes;
00888 extern int sparc_mode_class[];
00889
00890
00891
00892
00893 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
00894 ((hard_regno_mode_classes[REGNO] & sparc_mode_class[MODE]) != 0)
00895
00896
00897
00898
00899 #define HARD_REGNO_RENAME_OK(FROM, TO) ((FROM) != 1)
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909 #define MODES_TIEABLE_P(MODE1, MODE2) \
00910 ((MODE1) == (MODE2) \
00911 || (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2) \
00912 && (! TARGET_V9 \
00913 || (GET_MODE_CLASS (MODE1) != MODE_FLOAT \
00914 || (MODE1 != SFmode && MODE2 != SFmode)))))
00915
00916
00917
00918
00919
00920 #define STACK_POINTER_REGNUM 14
00921
00922
00923 #define SPARC_STACK_BIAS ((TARGET_ARCH64 && TARGET_STACK_BIAS) ? 2047 : 0)
00924
00925
00926
00927
00928
00929
00930
00931 #define STACK_POINTER_OFFSET (FIRST_PARM_OFFSET(0) + SPARC_STACK_BIAS)
00932
00933
00934 #define HARD_FRAME_POINTER_REGNUM 30
00935
00936
00937 #define FRAME_POINTER_REGNUM 101
00938
00939
00940 #define INIT_EXPANDERS \
00941 do { \
00942 if (cfun && cfun->emit->regno_pointer_align && SPARC_STACK_BIAS) \
00943 { \
00944 REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = BITS_PER_UNIT; \
00945 REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = BITS_PER_UNIT; \
00946 } \
00947 } while (0)
00948
00949
00950
00951
00952
00953 #define FRAME_POINTER_REQUIRED \
00954 (! (leaf_function_p () && only_leaf_regs_used ()))
00955
00956
00957 #define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
00958
00959
00960
00961 #define STATIC_CHAIN_REGNUM (TARGET_ARCH64 ? 5 : 2)
00962
00963
00964
00965
00966 #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 23 : INVALID_REGNUM)
00967
00968
00969
00970
00971
00972 #define DEFAULT_PCC_STRUCT_RETURN -1
00973
00974
00975
00976
00977
00978
00979 #define STRUCT_VALUE_OFFSET 64
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036 enum reg_class { NO_REGS, FPCC_REGS, I64_REGS, GENERAL_REGS, FP_REGS,
01037 EXTRA_FP_REGS, GENERAL_OR_FP_REGS, GENERAL_OR_EXTRA_FP_REGS,
01038 ALL_REGS, LIM_REG_CLASSES };
01039
01040 #define N_REG_CLASSES (int) LIM_REG_CLASSES
01041
01042
01043
01044 #define REG_CLASS_NAMES \
01045 { "NO_REGS", "FPCC_REGS", "I64_REGS", "GENERAL_REGS", "FP_REGS", \
01046 "EXTRA_FP_REGS", "GENERAL_OR_FP_REGS", "GENERAL_OR_EXTRA_FP_REGS", \
01047 "ALL_REGS" }
01048
01049
01050
01051
01052
01053 #define REG_CLASS_CONTENTS \
01054 {{0, 0, 0, 0}, \
01055 {0, 0, 0, 0xf}, \
01056 {0xffff, 0, 0, 0}, \
01057 {-1, 0, 0, 0x20}, \
01058 {0, -1, 0, 0}, \
01059 {0, -1, -1, 0}, \
01060 {-1, -1, 0, 0x20}, \
01061 {-1, -1, -1, 0x20}, \
01062 {-1, -1, -1, 0x3f}}
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072 #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
01073 (TARGET_ARCH64 \
01074 && (FROM) == SImode \
01075 && GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
01076 ? reg_classes_intersect_p (CLASS, FP_REGS) : 0)
01077
01078
01079
01080
01081
01082
01083 extern enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
01084
01085 #define REGNO_REG_CLASS(REGNO) sparc_regno_reg_class[(REGNO)]
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108 #define REG_ALLOC_ORDER \
01109 { 1, 2, 3, 4, 5, 6, 7, \
01110 13, 12, 11, 10, 9, 8, \
01111 15, \
01112 16, 17, 18, 19, 20, 21, 22, 23, \
01113 29, 28, 27, 26, 25, 24, 31, \
01114 40, 41, 42, 43, 44, 45, 46, 47, \
01115 48, 49, 50, 51, 52, 53, 54, 55, \
01116 56, 57, 58, 59, 60, 61, 62, 63, \
01117 64, 65, 66, 67, 68, 69, 70, 71, \
01118 72, 73, 74, 75, 76, 77, 78, 79, \
01119 80, 81, 82, 83, 84, 85, 86, 87, \
01120 88, 89, 90, 91, 92, 93, 94, 95, \
01121 39, 38, 37, 36, 35, 34, 33, 32, \
01122 96, 97, 98, 99, \
01123 100, 0, 14, 30, 101}
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 REG_LEAF_ALLOC_ORDER \
01148 { 1, 2, 3, 4, 5, 6, 7, \
01149 29, 28, 27, 26, 25, 24, \
01150 15, \
01151 13, 12, 11, 10, 9, 8, \
01152 16, 17, 18, 19, 20, 21, 22, 23, \
01153 40, 41, 42, 43, 44, 45, 46, 47, \
01154 48, 49, 50, 51, 52, 53, 54, 55, \
01155 56, 57, 58, 59, 60, 61, 62, 63, \
01156 64, 65, 66, 67, 68, 69, 70, 71, \
01157 72, 73, 74, 75, 76, 77, 78, 79, \
01158 80, 81, 82, 83, 84, 85, 86, 87, \
01159 88, 89, 90, 91, 92, 93, 94, 95, \
01160 39, 38, 37, 36, 35, 34, 33, 32, \
01161 96, 97, 98, 99, \
01162 100, 0, 14, 30, 31, 101}
01163
01164 #define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
01165
01166 extern char sparc_leaf_regs[];
01167 #define LEAF_REGISTERS sparc_leaf_regs
01168
01169 extern char leaf_reg_remap[];
01170 #define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
01171
01172
01173 #define INDEX_REG_CLASS GENERAL_REGS
01174 #define BASE_REG_CLASS GENERAL_REGS
01175
01176
01177 #define FP_REG_CLASS_P(CLASS) ((CLASS) == FP_REGS || (CLASS) == EXTRA_FP_REGS)
01178
01179
01180
01181
01182
01183
01184
01185
01186 #define REG_CLASS_FROM_LETTER(C) \
01187 (TARGET_V9 \
01188 ? ((C) == 'f' ? FP_REGS \
01189 : (C) == 'e' ? EXTRA_FP_REGS \
01190 : (C) == 'c' ? FPCC_REGS \
01191 : ((C) == 'd' && TARGET_VIS) ? FP_REGS\
01192 : ((C) == 'b' && TARGET_VIS) ? EXTRA_FP_REGS\
01193 : ((C) == 'h' && TARGET_V8PLUS) ? I64_REGS\
01194 : NO_REGS) \
01195 : ((C) == 'f' ? FP_REGS \
01196 : (C) == 'e' ? FP_REGS \
01197 : (C) == 'c' ? FPCC_REGS \
01198 : NO_REGS))
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216 #define SPARC_SIMM10_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x200 < 0x400)
01217 #define SPARC_SIMM11_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x400 < 0x800)
01218 #define SPARC_SIMM13_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x1000 < 0x2000)
01219
01220
01221
01222 #define SMALL_INT(X) (SPARC_SIMM13_P (INTVAL (X)))
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233 #define SPARC_SETHI_P(X) \
01234 (((unsigned HOST_WIDE_INT) (X) \
01235 & ((unsigned HOST_WIDE_INT) 0x3ff - GET_MODE_MASK (SImode) - 1)) == 0)
01236
01237
01238 #define SPARC_SETHI32_P(X) \
01239 (SPARC_SETHI_P ((unsigned HOST_WIDE_INT) (X) & GET_MODE_MASK (SImode)))
01240
01241 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
01242 ((C) == 'I' ? SPARC_SIMM13_P (VALUE) \
01243 : (C) == 'J' ? (VALUE) == 0 \
01244 : (C) == 'K' ? SPARC_SETHI32_P (VALUE) \
01245 : (C) == 'L' ? SPARC_SIMM11_P (VALUE) \
01246 : (C) == 'M' ? SPARC_SIMM10_P (VALUE) \
01247 : (C) == 'N' ? SPARC_SETHI_P (VALUE) \
01248 : (C) == 'O' ? (VALUE) == 4096 \
01249 : 0)
01250
01251
01252
01253
01254 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
01255 ((C) == 'G' ? const_zero_operand (VALUE, GET_MODE (VALUE)) \
01256 : (C) == 'H' ? arith_double_operand (VALUE, DImode) \
01257 : 0)
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271 #define PREFERRED_RELOAD_CLASS(X,CLASS) \
01272 (CONSTANT_P (X) \
01273 ? ((FP_REG_CLASS_P (CLASS) \
01274 || (CLASS) == GENERAL_OR_FP_REGS \
01275 || (CLASS) == GENERAL_OR_EXTRA_FP_REGS \
01276 || (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
01277 && ! TARGET_FPU) \
01278 || (GET_MODE (X) == TFmode \
01279 && ! const_zero_operand (X, TFmode))) \
01280 ? NO_REGS \
01281 : (!FP_REG_CLASS_P (CLASS) \
01282 && GET_MODE_CLASS (GET_MODE (X)) == MODE_INT) \
01283 ? GENERAL_REGS \
01284 : (CLASS)) \
01285 : (CLASS))
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, IN) \
01298 ((FP_REG_CLASS_P (CLASS) \
01299 && ((MODE) == HImode || (MODE) == QImode) \
01300 && (GET_CODE (IN) == MEM \
01301 || ((GET_CODE (IN) == REG || GET_CODE (IN) == SUBREG) \
01302 && true_regnum (IN) == -1))) \
01303 ? GENERAL_REGS \
01304 : ((CLASS) == EXTRA_FP_REGS && (MODE) == DFmode \
01305 && GET_CODE (IN) == MEM && TARGET_ARCH32 \
01306 && ! mem_min_alignment ((IN), 8)) \
01307 ? FP_REGS \
01308 : (((TARGET_CM_MEDANY \
01309 && symbolic_operand ((IN), (MODE))) \
01310 || (TARGET_CM_EMBMEDANY \
01311 && text_segment_operand ((IN), (MODE)))) \
01312 && !flag_pic) \
01313 ? GENERAL_REGS \
01314 : NO_REGS)
01315
01316 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, IN) \
01317 ((FP_REG_CLASS_P (CLASS) \
01318 && ((MODE) == HImode || (MODE) == QImode) \
01319 && (GET_CODE (IN) == MEM \
01320 || ((GET_CODE (IN) == REG || GET_CODE (IN) == SUBREG) \
01321 && true_regnum (IN) == -1))) \
01322 ? GENERAL_REGS \
01323 : ((CLASS) == EXTRA_FP_REGS && (MODE) == DFmode \
01324 && GET_CODE (IN) == MEM && TARGET_ARCH32 \
01325 && ! mem_min_alignment ((IN), 8)) \
01326 ? FP_REGS \
01327 : (((TARGET_CM_MEDANY \
01328 && symbolic_operand ((IN), (MODE))) \
01329 || (TARGET_CM_EMBMEDANY \
01330 && text_segment_operand ((IN), (MODE)))) \
01331 && !flag_pic) \
01332 ? GENERAL_REGS \
01333 : NO_REGS)
01334
01335
01336
01337 #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \
01338 (FP_REG_CLASS_P (CLASS1) != FP_REG_CLASS_P (CLASS2))
01339
01340
01341
01342
01343
01344 #define SECONDARY_MEMORY_NEEDED_RTX(MODE) \
01345 (get_frame_size () == 0 \
01346 ? assign_stack_local (MODE, GET_MODE_SIZE (MODE), 0) \
01347 : gen_rtx_MEM (MODE, plus_constant (frame_pointer_rtx, \
01348 STARTING_FRAME_OFFSET)))
01349
01350
01351
01352
01353 #define SECONDARY_MEMORY_NEEDED_MODE(MODE) \
01354 (TARGET_ARCH64 \
01355 ? (GET_MODE_BITSIZE (MODE) < 32 \
01356 ? mode_for_size (32, GET_MODE_CLASS (MODE), 0) \
01357 : MODE) \
01358 : (GET_MODE_BITSIZE (MODE) < BITS_PER_WORD \
01359 ? mode_for_size (BITS_PER_WORD, GET_MODE_CLASS (MODE), 0) \
01360 : MODE))
01361
01362
01363
01364
01365 #define CLASS_MAX_NREGS(CLASS, MODE) \
01366 (FP_REG_CLASS_P (CLASS) ? (GET_MODE_SIZE (MODE) + 3) / 4 \
01367 : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
01368
01369
01370
01371
01372
01373 #define STACK_GROWS_DOWNWARD
01374
01375
01376
01377
01378
01379 #define FRAME_GROWS_DOWNWARD 1
01380
01381
01382
01383
01384
01385
01386
01387 #define STARTING_FRAME_OFFSET \
01388 (TARGET_ARCH64 ? -16 \
01389 : (-SPARC_STACK_ALIGN (LONG_DOUBLE_TYPE_SIZE / BITS_PER_UNIT)))
01390
01391
01392
01393
01394
01395 #define FIRST_PARM_OFFSET(FNDECL) \
01396 (TARGET_ARCH64 ? 16 * UNITS_PER_WORD : STRUCT_VALUE_OFFSET + UNITS_PER_WORD)
01397
01398
01399
01400
01401 #define ARG_POINTER_CFA_OFFSET(FNDECL) 0
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412 #define REG_PARM_STACK_SPACE(DECL) (6 * UNITS_PER_WORD)
01413
01414
01415
01416 #define ELIMINABLE_REGS \
01417 {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01418 { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM} }
01419
01420
01421
01422
01423
01424 #define CAN_ELIMINATE(FROM, TO) \
01425 ((TO) == HARD_FRAME_POINTER_REGNUM || !FRAME_POINTER_REQUIRED)
01426
01427
01428
01429
01430 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01431 do { \
01432 if ((TO) == STACK_POINTER_REGNUM) \
01433 (OFFSET) = sparc_compute_frame_size (get_frame_size (), 1); \
01434 else \
01435 (OFFSET) = 0; \
01436 (OFFSET) += SPARC_STACK_BIAS; \
01437 } while (0)
01438
01439
01440
01441
01442
01443 #define ACCUMULATE_OUTGOING_ARGS 1
01444
01445
01446
01447
01448
01449
01450
01451
01452 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
01453
01454
01455
01456
01457
01458
01459 #define INCOMING_REGNO(OUT) \
01460 (((OUT) < 8 || (OUT) > 15) ? (OUT) : (OUT) + 16)
01461
01462
01463
01464
01465
01466
01467 #define OUTGOING_REGNO(IN) \
01468 (((IN) < 24 || (IN) > 31) ? (IN) : (IN) - 16)
01469
01470
01471
01472
01473
01474 #define LOCAL_REGNO(REGNO) \
01475 ((REGNO) >= 16 && (REGNO) <= 31)
01476
01477
01478
01479
01480
01481
01482
01483
01484 #define FUNCTION_VALUE(VALTYPE, FUNC) \
01485 function_value ((VALTYPE), TYPE_MODE (VALTYPE), 1)
01486
01487
01488
01489 #define FUNCTION_OUTGOING_VALUE(VALTYPE, FUNC) \
01490 function_value ((VALTYPE), TYPE_MODE (VALTYPE), 0)
01491
01492
01493
01494
01495 #define LIBCALL_VALUE(MODE) \
01496 function_value (NULL_TREE, (MODE), 1)
01497
01498
01499
01500
01501
01502
01503 #define FUNCTION_VALUE_REGNO_P(N) ((N) == 8 || (N) == 32)
01504
01505
01506
01507
01508 #define APPLY_RESULT_SIZE (TARGET_ARCH64 ? 24 : 16)
01509
01510
01511
01512
01513 #define FUNCTION_ARG_REGNO_P(N) \
01514 (TARGET_ARCH64 \
01515 ? (((N) >= 8 && (N) <= 13) || ((N) >= 32 && (N) <= 63)) \
01516 : ((N) >= 8 && (N) <= 13))
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531 struct sparc_args {
01532 int words;
01533 int prototype_p;
01534 int libcall_p;
01535 };
01536 #define CUMULATIVE_ARGS struct sparc_args
01537
01538
01539
01540
01541
01542 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
01543 init_cumulative_args (& (CUM), (FNTYPE), (LIBNAME), (FNDECL));
01544
01545
01546
01547
01548
01549 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01550 function_arg_advance (& (CUM), (MODE), (TYPE), (NAMED))
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01566 function_arg (& (CUM), (MODE), (TYPE), (NAMED), 0)
01567
01568
01569
01570
01571 #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
01572 function_arg (& (CUM), (MODE), (TYPE), (NAMED), 1)
01573
01574
01575
01576
01577
01578
01579 #define FUNCTION_ARG_PADDING(MODE, TYPE) \
01580 function_arg_padding ((MODE), (TYPE))
01581
01582
01583
01584
01585
01586
01587 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
01588 ((TARGET_ARCH64 \
01589 && (GET_MODE_ALIGNMENT (MODE) == 128 \
01590 || ((TYPE) && TYPE_ALIGN (TYPE) == 128))) \
01591 ? 128 : PARM_BOUNDARY)
01592
01593
01594
01595
01596
01597 extern GTY(()) rtx sparc_compare_op0;
01598 extern GTY(()) rtx sparc_compare_op1;
01599 extern GTY(()) rtx sparc_compare_emitted;
01600
01601
01602
01603
01604
01605
01606
01607
01608
01609 #define ASM_DECLARE_RESULT(FILE, RESULT) \
01610 fprintf ((FILE), "\t.proc\t0%lo\n", sparc_type_code (TREE_TYPE (RESULT)))
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627 extern GTY(()) char sparc_hard_reg_printed[8];
01628
01629 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
01630 #define ASM_DECLARE_REGISTER_GLOBAL(FILE, DECL, REGNO, NAME) \
01631 do { \
01632 if (TARGET_ARCH64) \
01633 { \
01634 int end = HARD_REGNO_NREGS ((REGNO), DECL_MODE (decl)) + (REGNO); \
01635 int reg; \
01636 for (reg = (REGNO); reg < 8 && reg < end; reg++) \
01637 if ((reg & ~1) == 2 || (reg & ~1) == 6) \
01638 { \
01639 if (reg == (REGNO)) \
01640 fprintf ((FILE), "\t.register\t%%g%d, %s\n", reg, (NAME)); \
01641 else \
01642 fprintf ((FILE), "\t.register\t%%g%d, .gnu.part%d.%s\n", \
01643 reg, reg - (REGNO), (NAME)); \
01644 sparc_hard_reg_printed[reg] = 1; \
01645 } \
01646 } \
01647 } while (0)
01648 #endif
01649
01650
01651
01652 #define PROFILE_HOOK(LABEL) sparc_profile_hook (LABEL)
01653
01654
01655 #define FUNCTION_PROFILER(FILE, LABELNO) do { } while (0)
01656
01657
01658 #define MCOUNT_FUNCTION "*mcount"
01659
01660
01661
01662
01663
01664
01665 #define EXIT_IGNORE_STACK \
01666 (get_frame_size () != 0 \
01667 || current_function_calls_alloca || current_function_outgoing_args_size)
01668
01669
01670 #define EPILOGUE_USES(REGNO) ((REGNO) == 31 \
01671 || (current_function_calls_eh_return && (REGNO) == 1))
01672
01673
01674
01675 #define TRAMPOLINE_SIZE (TARGET_ARCH64 ? 32 : 16)
01676
01677 #define TRAMPOLINE_ALIGNMENT 128
01678
01679
01680
01681
01682
01683 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01684 if (TARGET_ARCH64) \
01685 sparc64_initialize_trampoline (TRAMP, FNADDR, CXT); \
01686 else \
01687 sparc_initialize_trampoline (TRAMP, FNADDR, CXT)
01688
01689
01690 #define EXPAND_BUILTIN_VA_START(valist, nextarg) \
01691 sparc_va_start (valist, nextarg)
01692
01693
01694
01695 #define SETUP_FRAME_ADDRESSES() \
01696 emit_insn (gen_flush_register_windows ())
01697
01698
01699
01700
01701 #define DYNAMIC_CHAIN_ADDRESS(frame) \
01702 plus_constant (frame, 14 * UNITS_PER_WORD + SPARC_STACK_BIAS)
01703
01704
01705
01706 #define FRAME_ADDR_RTX(frame) plus_constant (frame, SPARC_STACK_BIAS)
01707
01708
01709
01710
01711
01712 #define RETURN_ADDR_IN_PREVIOUS_FRAME
01713
01714
01715
01716 #define RETURN_ADDR_OFFSET \
01717 (8 + 4 * (! TARGET_ARCH64 && current_function_returns_struct))
01718
01719
01720
01721
01722
01723 #define RETURN_ADDR_RTX(count, frame) \
01724 ((count == -1) \
01725 ? gen_rtx_REG (Pmode, 31) \
01726 : gen_rtx_MEM (Pmode, \
01727 memory_address (Pmode, plus_constant (frame, \
01728 15 * UNITS_PER_WORD \
01729 + SPARC_STACK_BIAS))))
01730
01731
01732
01733
01734
01735 #define INCOMING_RETURN_ADDR_RTX \
01736 plus_constant (gen_rtx_REG (word_mode, 15), 8)
01737 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (15)
01738
01739
01740
01741
01742 #define INCOMING_FRAME_SP_OFFSET SPARC_STACK_BIAS
01743
01744
01745 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 24 : INVALID_REGNUM)
01746 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 1)
01747 #define EH_RETURN_HANDLER_RTX gen_rtx_REG (Pmode, 31)
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761 #ifdef HAVE_AS_SPARC_UA_PCREL
01762 #ifdef HAVE_AS_SPARC_UA_PCREL_HIDDEN
01763 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
01764 (flag_pic \
01765 ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
01766 : ((TARGET_ARCH64 && ! GLOBAL) \
01767 ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
01768 : DW_EH_PE_absptr))
01769 #else
01770 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
01771 (flag_pic \
01772 ? (GLOBAL ? DW_EH_PE_absptr : (DW_EH_PE_pcrel | DW_EH_PE_sdata4)) \
01773 : ((TARGET_ARCH64 && ! GLOBAL) \
01774 ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
01775 : DW_EH_PE_absptr))
01776 #endif
01777
01778
01779 #define ASM_OUTPUT_DWARF_PCREL(FILE, SIZE, LABEL) \
01780 do { \
01781 fputs (integer_asm_op (SIZE, FALSE), FILE); \
01782 fprintf (FILE, "%%r_disp%d(", SIZE * 8); \
01783 assemble_name (FILE, LABEL); \
01784 fputc (')', FILE); \
01785 } while (0)
01786 #endif
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798 #define REGNO_OK_FOR_INDEX_P(REGNO) \
01799 ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < (unsigned)32 \
01800 || (REGNO) == FRAME_POINTER_REGNUM \
01801 || reg_renumber[REGNO] == FRAME_POINTER_REGNUM)
01802
01803 #define REGNO_OK_FOR_BASE_P(REGNO) REGNO_OK_FOR_INDEX_P (REGNO)
01804
01805 #define REGNO_OK_FOR_FP_P(REGNO) \
01806 (((unsigned) (REGNO) - 32 < (TARGET_V9 ? (unsigned)64 : (unsigned)32)) \
01807 || ((unsigned) reg_renumber[REGNO] - 32 < (TARGET_V9 ? (unsigned)64 : (unsigned)32)))
01808 #define REGNO_OK_FOR_CCFP_P(REGNO) \
01809 (TARGET_V9 \
01810 && (((unsigned) (REGNO) - 96 < (unsigned)4) \
01811 || ((unsigned) reg_renumber[REGNO] - 96 < (unsigned)4)))
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822 #define FP_REG_P(X) (REG_P (X) && REGNO_OK_FOR_FP_P (REGNO (X)))
01823
01824
01825 #define IN_OR_GLOBAL_P(X) (REGNO (X) < 8 || (REGNO (X) >= 24 && REGNO (X) <= 31))
01826
01827
01828
01829 #define MAX_REGS_PER_ADDRESS 2
01830
01831
01832
01833
01834
01835 #define CONSTANT_ADDRESS_P(X) constant_address_p (X)
01836
01837
01838
01839
01840 #define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X)
01841
01842
01843
01844
01845
01846 #define LEGITIMATE_CONSTANT_P(X) legitimate_constant_p (X)
01847
01848
01849
01850
01851
01852
01853
01854
01855
01856
01857
01858
01859
01860
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
01883 #ifndef REG_OK_STRICT
01884
01885
01886
01887 #define REG_OK_FOR_INDEX_P(X) \
01888 (REGNO (X) < 32 \
01889 || REGNO (X) == FRAME_POINTER_REGNUM \
01890 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
01891
01892
01893
01894 #define REG_OK_FOR_BASE_P(X) REG_OK_FOR_INDEX_P (X)
01895
01896
01897
01898
01899
01900
01901
01902 #define EXTRA_CONSTRAINT(OP, C) \
01903 sparc_extra_constraint_check(OP, C, 0)
01904
01905 #else
01906
01907
01908 #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
01909
01910 #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01911
01912 #define EXTRA_CONSTRAINT(OP, C) \
01913 sparc_extra_constraint_check(OP, C, 1)
01914
01915 #endif
01916
01917
01918
01919 #ifdef HAVE_AS_OFFSETABLE_LO10
01920 #define USE_AS_OFFSETABLE_LO10 1
01921 #else
01922 #define USE_AS_OFFSETABLE_LO10 0
01923 #endif
01924
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935 #define SYMBOLIC_CONST(X) symbolic_operand (X, VOIDmode)
01936
01937 #define RTX_OK_FOR_BASE_P(X) \
01938 ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
01939 || (GET_CODE (X) == SUBREG \
01940 && GET_CODE (SUBREG_REG (X)) == REG \
01941 && REG_OK_FOR_BASE_P (SUBREG_REG (X))))
01942
01943 #define RTX_OK_FOR_INDEX_P(X) \
01944 ((GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X)) \
01945 || (GET_CODE (X) == SUBREG \
01946 && GET_CODE (SUBREG_REG (X)) == REG \
01947 && REG_OK_FOR_INDEX_P (SUBREG_REG (X))))
01948
01949 #define RTX_OK_FOR_OFFSET_P(X) \
01950 (GET_CODE (X) == CONST_INT && INTVAL (X) >= -0x1000 && INTVAL (X) < 0x1000 - 8)
01951
01952 #define RTX_OK_FOR_OLO10_P(X) \
01953 (GET_CODE (X) == CONST_INT && INTVAL (X) >= -0x1000 && INTVAL (X) < 0xc00 - 8)
01954
01955 #ifdef REG_OK_STRICT
01956 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01957 { \
01958 if (legitimate_address_p (MODE, X, 1)) \
01959 goto ADDR; \
01960 }
01961 #else
01962 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01963 { \
01964 if (legitimate_address_p (MODE, X, 0)) \
01965 goto ADDR; \
01966 }
01967 #endif
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
01983 { \
01984 if (flag_pic == 1) \
01985 { \
01986 if (GET_CODE (ADDR) == PLUS) \
01987 { \
01988 rtx op0 = XEXP (ADDR, 0); \
01989 rtx op1 = XEXP (ADDR, 1); \
01990 if (op0 == pic_offset_table_rtx \
01991 && SYMBOLIC_CONST (op1)) \
01992 goto LABEL; \
01993 } \
01994 } \
01995 }
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011 #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
02012 { \
02013 (X) = legitimize_address (X, OLDX, MODE); \
02014 if (memory_address_p (MODE, X)) \
02015 goto WIN; \
02016 }
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029 #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \
02030 do { \
02031
02032 \
02033 if (CONSTANT_P (X) \
02034 && (MODE != TFmode || TARGET_ARCH64) \
02035 && GET_MODE (X) == SImode \
02036 && GET_CODE (X) != LO_SUM && GET_CODE (X) != HIGH \
02037 && ! (flag_pic \
02038 && (symbolic_operand (X, Pmode) \
02039 || pic_address_needs_scratch (X))) \
02040 && sparc_cmodel <= CM_MEDLOW) \
02041 { \
02042 X = gen_rtx_LO_SUM (GET_MODE (X), \
02043 gen_rtx_HIGH (GET_MODE (X), X), X); \
02044 push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL, \
02045 BASE_REG_CLASS, GET_MODE (X), VOIDmode, 0, 0, \
02046 OPNUM, TYPE); \
02047 goto WIN; \
02048 } \
02049 \
02050 } while (0)
02051
02052
02053
02054
02055
02056 #ifdef HAVE_GAS_SUBSECTION_ORDERING
02057 #define CASE_VECTOR_MODE \
02058 (! TARGET_PTR64 ? SImode : flag_pic ? SImode : TARGET_CM_MEDLOW ? SImode : DImode)
02059 #else
02060
02061
02062 #define CASE_VECTOR_MODE \
02063 (! TARGET_PTR64 ? SImode : flag_pic ? DImode : TARGET_CM_MEDLOW ? SImode : DImode)
02064 #endif
02065
02066
02067 #define DEFAULT_SIGNED_CHAR 1
02068
02069
02070
02071 #define MOVE_MAX 8
02072
02073
02074
02075
02076 #define MOVE_RATIO (optimize_size ? 3 : 8)
02077
02078
02079
02080 #define WORD_REGISTER_OPERATIONS
02081
02082
02083
02084
02085
02086 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
02087
02088
02089
02090
02091
02092 #define SLOW_BYTE_ACCESS 1
02093
02094
02095
02096 #define SHIFT_COUNT_TRUNCATED 1
02097
02098
02099
02100 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
02101
02102
02103 #define Pmode (TARGET_ARCH64 ? DImode : SImode)
02104
02105
02106
02107
02108
02109
02110 #define SELECT_CC_MODE(OP,X,Y) select_cc_mode ((OP), (X), (Y))
02111
02112
02113
02114
02115
02116 #define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode && (MODE) != CCFPmode)
02117
02118
02119 #define FUNCTION_MODE Pmode
02120
02121
02122
02123
02124
02125 #define NO_FUNCTION_CSE
02126
02127
02128 #define SETJMP_VIA_SAVE_AREA
02129
02130
02131 #define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) ((MODE) == TFmode)
02132
02133
02134
02135
02136 #define TARGET_BUGGY_QP_LIB 0
02137
02138
02139
02140
02141 #define SUN_CONVERSION_LIBFUNCS 0
02142 #define DITF_CONVERSION_LIBFUNCS 0
02143 #define SUN_INTEGER_MULTIPLY_64 0
02144
02145
02146
02147 #define GENERAL_OR_I64(C) ((C) == GENERAL_REGS || (C) == I64_REGS)
02148 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
02149 (((FP_REG_CLASS_P (CLASS1) && GENERAL_OR_I64 (CLASS2)) \
02150 || (GENERAL_OR_I64 (CLASS1) && FP_REG_CLASS_P (CLASS2)) \
02151 || (CLASS1) == FPCC_REGS || (CLASS2) == FPCC_REGS) \
02152 ? ((sparc_cpu == PROCESSOR_ULTRASPARC \
02153 || sparc_cpu == PROCESSOR_ULTRASPARC3 \
02154 || sparc_cpu == PROCESSOR_NIAGARA) ? 12 : 6) : 2)
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169 #define BRANCH_COST \
02170 ((sparc_cpu == PROCESSOR_V9 \
02171 || sparc_cpu == PROCESSOR_ULTRASPARC) \
02172 ? 7 \
02173 : (sparc_cpu == PROCESSOR_ULTRASPARC3 \
02174 ? 9 \
02175 : (sparc_cpu == PROCESSOR_NIAGARA \
02176 ? 4 \
02177 : 3)))
02178
02179 #define PREFETCH_BLOCK \
02180 ((sparc_cpu == PROCESSOR_ULTRASPARC \
02181 || sparc_cpu == PROCESSOR_ULTRASPARC3 \
02182 || sparc_cpu == PROCESSOR_NIAGARA) \
02183 ? 64 : 32)
02184
02185 #define SIMULTANEOUS_PREFETCHES \
02186 ((sparc_cpu == PROCESSOR_ULTRASPARC \
02187 || sparc_cpu == PROCESSOR_NIAGARA) \
02188 ? 2 \
02189 : (sparc_cpu == PROCESSOR_ULTRASPARC3 \
02190 ? 8 : 3))
02191
02192
02193
02194
02195
02196
02197
02198 #define ASM_COMMENT_START "!"
02199
02200
02201
02202
02203 #define ASM_APP_ON ""
02204
02205
02206
02207
02208 #define ASM_APP_OFF ""
02209
02210
02211
02212
02213 #define REGISTER_NAMES \
02214 {"%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7", \
02215 "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7", \
02216 "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", \
02217 "%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7", \
02218 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", \
02219 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15", \
02220 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23", \
02221 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31", \
02222 "%f32", "%f33", "%f34", "%f35", "%f36", "%f37", "%f38", "%f39", \
02223 "%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47", \
02224 "%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55", \
02225 "%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63", \
02226 "%fcc0", "%fcc1", "%fcc2", "%fcc3", "%icc", "%sfp" }
02227
02228
02229
02230 #define ADDITIONAL_REGISTER_NAMES \
02231 {{"ccr", SPARC_ICC_REG}, {"cc", SPARC_ICC_REG}}
02232
02233
02234
02235
02236
02237
02238
02239 #define DBX_CONTIN_LENGTH 1000
02240
02241
02242
02243
02244
02245 #define GLOBAL_ASM_OP "\t.global "
02246
02247
02248
02249 #define USER_LABEL_PREFIX "_"
02250
02251
02252
02253
02254
02255
02256 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
02257 sprintf ((LABEL), "*%s%ld", (PREFIX), (long)(NUM))
02258
02259
02260
02261 #define ASM_OUTPUT_ADDR_VEC(LAB,VEC) \
02262 sparc_defer_case_vector ((LAB),(VEC), 0)
02263
02264 #define ASM_OUTPUT_ADDR_DIFF_VEC(LAB,VEC) \
02265 sparc_defer_case_vector ((LAB),(VEC), 1)
02266
02267
02268
02269 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
02270 do { \
02271 char label[30]; \
02272 ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE); \
02273 if (CASE_VECTOR_MODE == SImode) \
02274 fprintf (FILE, "\t.word\t"); \
02275 else \
02276 fprintf (FILE, "\t.xword\t"); \
02277 assemble_name (FILE, label); \
02278 fputc ('\n', FILE); \
02279 } while (0)
02280
02281
02282
02283
02284 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
02285 do { \
02286 char label[30]; \
02287 ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \
02288 if (CASE_VECTOR_MODE == SImode) \
02289 fprintf (FILE, "\t.word\t"); \
02290 else \
02291 fprintf (FILE, "\t.xword\t"); \
02292 assemble_name (FILE, label); \
02293 ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL)); \
02294 fputc ('-', FILE); \
02295 assemble_name (FILE, label); \
02296 fputc ('\n', FILE); \
02297 } while (0)
02298
02299
02300
02301
02302
02303 #ifdef HAVE_GAS_SUBSECTION_ORDERING
02304
02305 #define ASM_OUTPUT_ADDR_VEC_START(FILE) \
02306 fprintf(FILE, "\t.subsection\t-1\n")
02307
02308 #define ASM_OUTPUT_ADDR_VEC_END(FILE) \
02309 fprintf(FILE, "\t.previous\n")
02310
02311 #endif
02312
02313
02314
02315
02316
02317 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
02318 if ((LOG) != 0) \
02319 fprintf (FILE, "\t.align %d\n", (1<<(LOG)))
02320
02321
02322
02323
02324 #define ASM_OUTPUT_ALIGN_WITH_NOP(FILE,LOG) \
02325 if ((LOG) != 0) \
02326 fprintf (FILE, "\t.align %d,0x1000000\n", (1<<(LOG)))
02327
02328 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
02329 fprintf (FILE, "\t.skip "HOST_WIDE_INT_PRINT_UNSIGNED"\n", (SIZE))
02330
02331
02332
02333
02334 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
02335 ( fputs ("\t.common ", (FILE)), \
02336 assemble_name ((FILE), (NAME)), \
02337 fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",\"bss\"\n", (SIZE)))
02338
02339
02340
02341
02342 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGNED) \
02343 ( fputs ("\t.reserve ", (FILE)), \
02344 assemble_name ((FILE), (NAME)), \
02345 fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",\"bss\",%u\n", \
02346 (SIZE), ((ALIGNED) / BITS_PER_UNIT)))
02347
02348
02349
02350
02351
02352
02353 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
02354 do { \
02355 ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \
02356 } while (0)
02357
02358 #define IDENT_ASM_OP "\t.ident\t"
02359
02360
02361
02362 #define ASM_OUTPUT_IDENT(FILE, NAME) \
02363 fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
02364
02365
02366
02367 extern int sparc_indent_opcode;
02368
02369 #define ASM_OUTPUT_OPCODE(FILE, PTR) \
02370 do { \
02371 if (sparc_indent_opcode) \
02372 { \
02373 putc (' ', FILE); \
02374 sparc_indent_opcode = 0; \
02375 } \
02376 } while (0)
02377
02378 #define SPARC_SYMBOL_REF_TLS_P(RTX) \
02379 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
02380
02381 #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
02382 ((CHAR) == '#' || (CHAR) == '*' || (CHAR) == '(' \
02383 || (CHAR) == ')' || (CHAR) == '_' || (CHAR) == '&')
02384
02385
02386
02387
02388
02389 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
02390
02391
02392
02393 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
02394 { register rtx base, index = 0; \
02395 int offset = 0; \
02396 register rtx addr = ADDR; \
02397 if (GET_CODE (addr) == REG) \
02398 fputs (reg_names[REGNO (addr)], FILE); \
02399 else if (GET_CODE (addr) == PLUS) \
02400 { \
02401 if (GET_CODE (XEXP (addr, 0)) == CONST_INT) \
02402 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);\
02403 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT) \
02404 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);\
02405 else \
02406 base = XEXP (addr, 0), index = XEXP (addr, 1); \
02407 if (GET_CODE (base) == LO_SUM) \
02408 { \
02409 gcc_assert (USE_AS_OFFSETABLE_LO10 \
02410 && TARGET_ARCH64 \
02411 && ! TARGET_CM_MEDMID); \
02412 output_operand (XEXP (base, 0), 0); \
02413 fputs ("+%lo(", FILE); \
02414 output_address (XEXP (base, 1)); \
02415 fprintf (FILE, ")+%d", offset); \
02416 } \
02417 else \
02418 { \
02419 fputs (reg_names[REGNO (base)], FILE); \
02420 if (index == 0) \
02421 fprintf (FILE, "%+d", offset); \
02422 else if (GET_CODE (index) == REG) \
02423 fprintf (FILE, "+%s", reg_names[REGNO (index)]); \
02424 else if (GET_CODE (index) == SYMBOL_REF \
02425 || GET_CODE (index) == CONST) \
02426 fputc ('+', FILE), output_addr_const (FILE, index); \
02427 else gcc_unreachable (); \
02428 } \
02429 } \
02430 else if (GET_CODE (addr) == MINUS \
02431 && GET_CODE (XEXP (addr, 1)) == LABEL_REF) \
02432 { \
02433 output_addr_const (FILE, XEXP (addr, 0)); \
02434 fputs ("-(", FILE); \
02435 output_addr_const (FILE, XEXP (addr, 1)); \
02436 fputs ("-.)", FILE); \
02437 } \
02438 else if (GET_CODE (addr) == LO_SUM) \
02439 { \
02440 output_operand (XEXP (addr, 0), 0); \
02441 if (TARGET_CM_MEDMID) \
02442 fputs ("+%l44(", FILE); \
02443 else \
02444 fputs ("+%lo(", FILE); \
02445 output_address (XEXP (addr, 1)); \
02446 fputc (')', FILE); \
02447 } \
02448 else if (flag_pic && GET_CODE (addr) == CONST \
02449 && GET_CODE (XEXP (addr, 0)) == MINUS \
02450 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST \
02451 && GET_CODE (XEXP (XEXP (XEXP (addr, 0), 1), 0)) == MINUS \
02452 && XEXP (XEXP (XEXP (XEXP (addr, 0), 1), 0), 1) == pc_rtx) \
02453 { \
02454 addr = XEXP (addr, 0); \
02455 output_addr_const (FILE, XEXP (addr, 0)); \
02456 \
02457 fputs ("-(", FILE); \
02458 \
02459 output_addr_const (FILE, XEXP (XEXP (addr, 1), 0)); \
02460 \
02461 fputc (')', FILE); \
02462 } \
02463 else \
02464 { \
02465 output_addr_const (FILE, addr); \
02466 } \
02467 }
02468
02469
02470
02471 #ifdef HAVE_AS_TLS
02472 #define TARGET_TLS 1
02473 #else
02474 #define TARGET_TLS 0
02475 #endif
02476
02477 #define TARGET_SUN_TLS TARGET_TLS
02478 #define TARGET_GNU_TLS 0
02479
02480
02481 #define JMP_BUF_SIZE 12