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 #define OBJECT_XCOFF 1
00030 #define OBJECT_ELF 2
00031 #define OBJECT_PEF 3
00032 #define OBJECT_MACHO 4
00033
00034 #define TARGET_ELF (TARGET_OBJECT_FORMAT == OBJECT_ELF)
00035 #define TARGET_XCOFF (TARGET_OBJECT_FORMAT == OBJECT_XCOFF)
00036 #define TARGET_MACOS (TARGET_OBJECT_FORMAT == OBJECT_PEF)
00037 #define TARGET_MACHO (TARGET_OBJECT_FORMAT == OBJECT_MACHO)
00038
00039 #ifndef TARGET_AIX
00040 #define TARGET_AIX 0
00041 #endif
00042
00043
00044
00045 #define DOT_SYMBOLS 1
00046
00047
00048 #ifndef TARGET_CPU_DEFAULT
00049 #define TARGET_CPU_DEFAULT ((char *)0)
00050 #endif
00051
00052
00053
00054 #define ASM_CPU_SPEC \
00055 "%{!mcpu*: \
00056 %{mpower: %{!mpower2: -mpwr}} \
00057 %{mpower2: -mpwrx} \
00058 %{mpowerpc64*: -mppc64} \
00059 %{!mpowerpc64*: %{mpowerpc*: -mppc}} \
00060 %{mno-power: %{!mpowerpc*: -mcom}} \
00061 %{!mno-power: %{!mpower*: %(asm_default)}}} \
00062 %{mcpu=common: -mcom} \
00063 %{mcpu=power: -mpwr} \
00064 %{mcpu=power2: -mpwrx} \
00065 %{mcpu=power3: -mppc64} \
00066 %{mcpu=power4: -mpower4} \
00067 %{mcpu=power5: -mpower4} \
00068 %{mcpu=powerpc: -mppc} \
00069 %{mcpu=rios: -mpwr} \
00070 %{mcpu=rios1: -mpwr} \
00071 %{mcpu=rios2: -mpwrx} \
00072 %{mcpu=rsc: -mpwr} \
00073 %{mcpu=rsc1: -mpwr} \
00074 %{mcpu=rs64a: -mppc64} \
00075 %{mcpu=401: -mppc} \
00076 %{mcpu=403: -m403} \
00077 %{mcpu=405: -m405} \
00078 %{mcpu=405fp: -m405} \
00079 %{mcpu=440: -m440} \
00080 %{mcpu=440fp: -m440} \
00081 %{mcpu=505: -mppc} \
00082 %{mcpu=601: -m601} \
00083 %{mcpu=602: -mppc} \
00084 %{mcpu=603: -mppc} \
00085 %{mcpu=603e: -mppc} \
00086 %{mcpu=ec603e: -mppc} \
00087 %{mcpu=604: -mppc} \
00088 %{mcpu=604e: -mppc} \
00089 %{mcpu=620: -mppc64} \
00090 %{mcpu=630: -mppc64} \
00091 %{mcpu=740: -mppc} \
00092 %{mcpu=750: -mppc} \
00093 %{mcpu=G3: -mppc} \
00094 %{mcpu=7400: -mppc -maltivec} \
00095 %{mcpu=7450: -mppc -maltivec} \
00096 %{mcpu=G4: -mppc -maltivec} \
00097 %{mcpu=801: -mppc} \
00098 %{mcpu=821: -mppc} \
00099 %{mcpu=823: -mppc} \
00100 %{mcpu=860: -mppc} \
00101 %{mcpu=970: -mpower4 -maltivec} \
00102 %{mcpu=G5: -mpower4 -maltivec} \
00103 %{mcpu=8540: -me500} \
00104 %{maltivec: -maltivec} \
00105 -many"
00106
00107 #define CPP_DEFAULT_SPEC ""
00108
00109 #define ASM_DEFAULT_SPEC ""
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 #define SUBTARGET_EXTRA_SPECS
00122
00123 #define EXTRA_SPECS \
00124 { "cpp_default", CPP_DEFAULT_SPEC }, \
00125 { "asm_cpu", ASM_CPU_SPEC }, \
00126 { "asm_default", ASM_DEFAULT_SPEC }, \
00127 SUBTARGET_EXTRA_SPECS
00128
00129
00130
00131 extern int target_flags;
00132
00133
00134 #define MASK_POWER 0x00000001
00135
00136
00137 #define MASK_POWER2 0x00000002
00138
00139
00140 #define MASK_POWERPC 0x00000004
00141
00142
00143 #define MASK_PPC_GPOPT 0x00000008
00144
00145
00146 #define MASK_PPC_GFXOPT 0x00000010
00147
00148
00149 #define MASK_POWERPC64 0x00000020
00150
00151
00152 #define MASK_NEW_MNEMONICS 0x00000040
00153
00154
00155
00156 #define MASK_NO_FP_IN_TOC 0x00000080
00157
00158
00159
00160 #define MASK_NO_SUM_IN_TOC 0x00000100
00161
00162
00163
00164
00165
00166
00167
00168
00169 #define MASK_MINIMAL_TOC 0x00000200
00170
00171
00172
00173
00174
00175 #define MASK_64BIT 0x00000400
00176
00177
00178 #define MASK_SOFT_FLOAT 0x00000800
00179
00180
00181 #define MASK_MULTIPLE 0x00001000
00182
00183
00184 #define MASK_STRING 0x00002000
00185
00186
00187 #define MASK_NO_UPDATE 0x00004000
00188
00189
00190 #define MASK_NO_FUSED_MADD 0x00008000
00191
00192
00193 #define MASK_SCHED_PROLOG 0x00010000
00194
00195
00196 #define MASK_ALTIVEC 0x00020000
00197
00198
00199 #define MASK_AIX_STRUCT_RET 0x00040000
00200
00201
00202 #define MASK_MFCRF 0x00080000
00203
00204
00205
00206
00207
00208 #define TARGET_POWER (target_flags & MASK_POWER)
00209 #define TARGET_POWER2 (target_flags & MASK_POWER2)
00210 #define TARGET_POWERPC (target_flags & MASK_POWERPC)
00211 #define TARGET_PPC_GPOPT (target_flags & MASK_PPC_GPOPT)
00212 #define TARGET_PPC_GFXOPT (target_flags & MASK_PPC_GFXOPT)
00213 #define TARGET_NEW_MNEMONICS (target_flags & MASK_NEW_MNEMONICS)
00214 #define TARGET_NO_FP_IN_TOC (target_flags & MASK_NO_FP_IN_TOC)
00215 #define TARGET_NO_SUM_IN_TOC (target_flags & MASK_NO_SUM_IN_TOC)
00216 #define TARGET_MINIMAL_TOC (target_flags & MASK_MINIMAL_TOC)
00217 #define TARGET_64BIT (target_flags & MASK_64BIT)
00218 #define TARGET_SOFT_FLOAT (target_flags & MASK_SOFT_FLOAT)
00219 #define TARGET_MULTIPLE (target_flags & MASK_MULTIPLE)
00220 #define TARGET_STRING (target_flags & MASK_STRING)
00221 #define TARGET_NO_UPDATE (target_flags & MASK_NO_UPDATE)
00222 #define TARGET_NO_FUSED_MADD (target_flags & MASK_NO_FUSED_MADD)
00223 #define TARGET_SCHED_PROLOG (target_flags & MASK_SCHED_PROLOG)
00224 #define TARGET_ALTIVEC (target_flags & MASK_ALTIVEC)
00225 #define TARGET_AIX_STRUCT_RET (target_flags & MASK_AIX_STRUCT_RET)
00226
00227
00228
00229
00230
00231 #ifdef HAVE_AS_MFCRF
00232 #define TARGET_MFCRF (target_flags & MASK_MFCRF)
00233 #else
00234 #define TARGET_MFCRF 0
00235 #endif
00236
00237
00238 #define TARGET_32BIT (! TARGET_64BIT)
00239 #define TARGET_HARD_FLOAT (! TARGET_SOFT_FLOAT)
00240 #define TARGET_UPDATE (! TARGET_NO_UPDATE)
00241 #define TARGET_FUSED_MADD (! TARGET_NO_FUSED_MADD)
00242
00243
00244
00245 #ifdef HAVE_AS_TLS
00246 #define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
00247 rs6000_output_dwarf_dtprel (FILE, SIZE, X)
00248 #endif
00249
00250 #ifndef HAVE_AS_TLS
00251 #define HAVE_AS_TLS 0
00252 #endif
00253
00254 #ifdef IN_LIBGCC2
00255
00256 #if defined (__64BIT__) || defined (__powerpc64__)
00257 #define TARGET_POWERPC64 1
00258 #else
00259 #define TARGET_POWERPC64 0
00260 #endif
00261 #else
00262 #define TARGET_POWERPC64 (target_flags & MASK_POWERPC64)
00263 #endif
00264
00265 #define TARGET_XL_COMPAT 0
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 #define TARGET_SWITCHES \
00276 {{"power", MASK_POWER | MASK_MULTIPLE | MASK_STRING, \
00277 N_("Use POWER instruction set")}, \
00278 {"power2", (MASK_POWER | MASK_MULTIPLE | MASK_STRING \
00279 | MASK_POWER2), \
00280 N_("Use POWER2 instruction set")}, \
00281 {"no-power2", - MASK_POWER2, \
00282 N_("Do not use POWER2 instruction set")}, \
00283 {"no-power", - (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE \
00284 | MASK_STRING), \
00285 N_("Do not use POWER instruction set")}, \
00286 {"powerpc", MASK_POWERPC, \
00287 N_("Use PowerPC instruction set")}, \
00288 {"no-powerpc", - (MASK_POWERPC | MASK_PPC_GPOPT \
00289 | MASK_PPC_GFXOPT | MASK_POWERPC64), \
00290 N_("Do not use PowerPC instruction set")}, \
00291 {"powerpc-gpopt", MASK_POWERPC | MASK_PPC_GPOPT, \
00292 N_("Use PowerPC General Purpose group optional instructions")},\
00293 {"no-powerpc-gpopt", - MASK_PPC_GPOPT, \
00294 N_("Do not use PowerPC General Purpose group optional instructions")},\
00295 {"powerpc-gfxopt", MASK_POWERPC | MASK_PPC_GFXOPT, \
00296 N_("Use PowerPC Graphics group optional instructions")},\
00297 {"no-powerpc-gfxopt", - MASK_PPC_GFXOPT, \
00298 N_("Do not use PowerPC Graphics group optional instructions")},\
00299 {"powerpc64", MASK_POWERPC64, \
00300 N_("Use PowerPC-64 instruction set")}, \
00301 {"no-powerpc64", - MASK_POWERPC64, \
00302 N_("Do not use PowerPC-64 instruction set")}, \
00303 {"altivec", MASK_ALTIVEC , \
00304 N_("Use AltiVec instructions")}, \
00305 {"no-altivec", - MASK_ALTIVEC , \
00306 N_("Do not use AltiVec instructions")}, \
00307 {"new-mnemonics", MASK_NEW_MNEMONICS, \
00308 N_("Use new mnemonics for PowerPC architecture")},\
00309 {"old-mnemonics", -MASK_NEW_MNEMONICS, \
00310 N_("Use old mnemonics for PowerPC architecture")},\
00311 {"full-toc", - (MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC \
00312 | MASK_MINIMAL_TOC), \
00313 N_("Put everything in the regular TOC")}, \
00314 {"fp-in-toc", - MASK_NO_FP_IN_TOC, \
00315 N_("Place floating point constants in TOC")}, \
00316 {"no-fp-in-toc", MASK_NO_FP_IN_TOC, \
00317 N_("Do not place floating point constants in TOC")},\
00318 {"sum-in-toc", - MASK_NO_SUM_IN_TOC, \
00319 N_("Place symbol+offset constants in TOC")}, \
00320 {"no-sum-in-toc", MASK_NO_SUM_IN_TOC, \
00321 N_("Do not place symbol+offset constants in TOC")},\
00322 {"minimal-toc", MASK_MINIMAL_TOC, \
00323 "Use only one TOC entry per procedure"}, \
00324 {"minimal-toc", - (MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC), \
00325 ""}, \
00326 {"no-minimal-toc", - MASK_MINIMAL_TOC, \
00327 N_("Place variable addresses in the regular TOC")},\
00328 {"hard-float", - MASK_SOFT_FLOAT, \
00329 N_("Use hardware floating point")}, \
00330 {"soft-float", MASK_SOFT_FLOAT, \
00331 N_("Do not use hardware floating point")}, \
00332 {"multiple", MASK_MULTIPLE, \
00333 N_("Generate load/store multiple instructions")}, \
00334 {"no-multiple", - MASK_MULTIPLE, \
00335 N_("Do not generate load/store multiple instructions")},\
00336 {"string", MASK_STRING, \
00337 N_("Generate string instructions for block moves")},\
00338 {"no-string", - MASK_STRING, \
00339 N_("Do not generate string instructions for block moves")},\
00340 {"update", - MASK_NO_UPDATE, \
00341 N_("Generate load/store with update instructions")},\
00342 {"no-update", MASK_NO_UPDATE, \
00343 N_("Do not generate load/store with update instructions")},\
00344 {"fused-madd", - MASK_NO_FUSED_MADD, \
00345 N_("Generate fused multiply/add instructions")},\
00346 {"no-fused-madd", MASK_NO_FUSED_MADD, \
00347 N_("Do not generate fused multiply/add instructions")},\
00348 {"sched-prolog", MASK_SCHED_PROLOG, \
00349 ""}, \
00350 {"no-sched-prolog", -MASK_SCHED_PROLOG, \
00351 N_("Do not schedule the start and end of the procedure")},\
00352 {"sched-epilog", MASK_SCHED_PROLOG, \
00353 ""}, \
00354 {"no-sched-epilog", -MASK_SCHED_PROLOG, \
00355 ""}, \
00356 {"aix-struct-return", MASK_AIX_STRUCT_RET, \
00357 N_("Return all structures in memory (AIX default)")},\
00358 {"svr4-struct-return", - MASK_AIX_STRUCT_RET, \
00359 N_("Return small structures in registers (SVR4 default)")},\
00360 {"no-aix-struct-return", - MASK_AIX_STRUCT_RET, \
00361 ""}, \
00362 {"no-svr4-struct-return", MASK_AIX_STRUCT_RET, \
00363 ""}, \
00364 {"mfcrf", MASK_MFCRF, \
00365 N_("Generate single field mfcr instruction")}, \
00366 {"no-mfcrf", - MASK_MFCRF, \
00367 N_("Do not generate single field mfcr instruction")},\
00368 SUBTARGET_SWITCHES \
00369 {"", TARGET_DEFAULT | MASK_SCHED_PROLOG, \
00370 ""}}
00371
00372 #define TARGET_DEFAULT (MASK_POWER | MASK_MULTIPLE | MASK_STRING)
00373
00374
00375 #define SUBTARGET_SWITCHES
00376
00377
00378 enum processor_type
00379 {
00380 PROCESSOR_RIOS1,
00381 PROCESSOR_RIOS2,
00382 PROCESSOR_RS64A,
00383 PROCESSOR_MPCCORE,
00384 PROCESSOR_PPC403,
00385 PROCESSOR_PPC405,
00386 PROCESSOR_PPC440,
00387 PROCESSOR_PPC601,
00388 PROCESSOR_PPC603,
00389 PROCESSOR_PPC604,
00390 PROCESSOR_PPC604e,
00391 PROCESSOR_PPC620,
00392 PROCESSOR_PPC630,
00393 PROCESSOR_PPC750,
00394 PROCESSOR_PPC7400,
00395 PROCESSOR_PPC7450,
00396 PROCESSOR_PPC8540,
00397 PROCESSOR_POWER4,
00398 PROCESSOR_POWER5
00399 };
00400
00401 extern enum processor_type rs6000_cpu;
00402
00403
00404 #define rs6000_cpu_attr ((enum attr_cpu)rs6000_cpu)
00405
00406
00407 #define PROCESSOR_COMMON PROCESSOR_PPC601
00408 #define PROCESSOR_POWER PROCESSOR_RIOS1
00409 #define PROCESSOR_POWERPC PROCESSOR_PPC604
00410 #define PROCESSOR_POWERPC64 PROCESSOR_RS64A
00411
00412
00413 #define PROCESSOR_DEFAULT PROCESSOR_RIOS1
00414 #define PROCESSOR_DEFAULT64 PROCESSOR_RS64A
00415
00416
00417
00418 #define ASSEMBLER_DIALECT (TARGET_NEW_MNEMONICS ? 1 : 0)
00419
00420
00421 enum rs6000_dependence_cost
00422 {
00423 max_dep_latency = 1000,
00424 no_dep_costly,
00425 all_deps_costly,
00426 true_store_to_load_dep_costly,
00427 store_to_load_dep_costly
00428 };
00429
00430
00431 enum rs6000_nop_insertion
00432 {
00433 sched_finish_regroup_exact = 1000,
00434 sched_finish_pad_groups,
00435 sched_finish_none
00436 };
00437
00438
00439 enum group_termination
00440 {
00441 current_group,
00442 previous_group
00443 };
00444
00445
00446 #define SUBTARGET_OPTIONS
00447
00448 #define TARGET_OPTIONS \
00449 { \
00450 {"cpu=", &rs6000_select[1].string, \
00451 N_("Use features of and schedule code for given CPU"), 0}, \
00452 {"tune=", &rs6000_select[2].string, \
00453 N_("Schedule code for given CPU"), 0}, \
00454 {"debug=", &rs6000_debug_name, N_("Enable debug output"), 0}, \
00455 {"traceback=", &rs6000_traceback_name, \
00456 N_("Select full, part, or no traceback table"), 0}, \
00457 {"abi=", &rs6000_abi_string, N_("Specify ABI to use"), 0}, \
00458 {"long-double-", &rs6000_long_double_size_string, \
00459 N_("Specify size of long double (64 or 128 bits)"), 0}, \
00460 {"isel=", &rs6000_isel_string, \
00461 N_("Specify yes/no if isel instructions should be generated"), 0}, \
00462 {"spe=", &rs6000_spe_string, \
00463 N_("Specify yes/no if SPE SIMD instructions should be generated"), 0},\
00464 {"float-gprs=", &rs6000_float_gprs_string, \
00465 N_("Specify yes/no if using floating point in the GPRs"), 0}, \
00466 {"vrsave=", &rs6000_altivec_vrsave_string, \
00467 N_("Specify yes/no if VRSAVE instructions should be generated for AltiVec"), 0}, \
00468 {"longcall", &rs6000_longcall_switch, \
00469 N_("Avoid all range limits on call instructions"), 0}, \
00470 {"no-longcall", &rs6000_longcall_switch, "", 0}, \
00471 {"warn-altivec-long", &rs6000_warn_altivec_long_switch, \
00472 N_("Warn about deprecated 'vector long ...' AltiVec type usage"), 0}, \
00473 {"no-warn-altivec-long", &rs6000_warn_altivec_long_switch, "", 0}, \
00474 {"sched-costly-dep=", &rs6000_sched_costly_dep_str, \
00475 N_("Determine which dependences between insns are considered costly"), 0}, \
00476 {"insert-sched-nops=", &rs6000_sched_insert_nops_str, \
00477 N_("Specify which post scheduling nop insertion scheme to apply"), 0}, \
00478 {"align-", &rs6000_alignment_string, \
00479 N_("Specify alignment of structure fields default/natural"), 0}, \
00480 {"prioritize-restricted-insns=", &rs6000_sched_restricted_insns_priority_str, \
00481 N_("Specify scheduling priority for dispatch slot restricted insns"), 0}, \
00482 SUBTARGET_OPTIONS \
00483 }
00484
00485
00486
00487
00488
00489
00490 #define OPTION_DEFAULT_SPECS \
00491 {"cpu", "%{!mcpu=*:-mcpu=%(VALUE)}" }, \
00492 {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
00493 {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }
00494
00495
00496 struct rs6000_cpu_select
00497 {
00498 const char *string;
00499 const char *name;
00500 int set_tune_p;
00501 int set_arch_p;
00502 };
00503
00504 extern struct rs6000_cpu_select rs6000_select[];
00505
00506
00507 extern const char *rs6000_debug_name;
00508 extern const char *rs6000_abi_string;
00509 extern int rs6000_debug_stack;
00510 extern int rs6000_debug_arg;
00511
00512 #define TARGET_DEBUG_STACK rs6000_debug_stack
00513 #define TARGET_DEBUG_ARG rs6000_debug_arg
00514
00515 extern const char *rs6000_traceback_name;
00516
00517
00518
00519 extern const char *rs6000_long_double_size_string;
00520 extern int rs6000_long_double_type_size;
00521 extern int rs6000_altivec_abi;
00522 extern int rs6000_spe_abi;
00523 extern int rs6000_isel;
00524 extern int rs6000_spe;
00525 extern int rs6000_float_gprs;
00526 extern const char *rs6000_float_gprs_string;
00527 extern const char *rs6000_isel_string;
00528 extern const char *rs6000_spe_string;
00529 extern const char *rs6000_altivec_vrsave_string;
00530 extern int rs6000_altivec_vrsave;
00531 extern const char *rs6000_longcall_switch;
00532 extern int rs6000_default_long_calls;
00533 extern const char* rs6000_alignment_string;
00534 extern int rs6000_alignment_flags;
00535 extern const char *rs6000_sched_restricted_insns_priority_str;
00536 extern int rs6000_sched_restricted_insns_priority;
00537 extern const char *rs6000_sched_costly_dep_str;
00538 extern enum rs6000_dependence_cost rs6000_sched_costly_dep;
00539 extern const char *rs6000_sched_insert_nops_str;
00540 extern enum rs6000_nop_insertion rs6000_sched_insert_nops;
00541
00542 extern int rs6000_warn_altivec_long;
00543 extern const char *rs6000_warn_altivec_long_switch;
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554 #ifndef IN_TARGET_LIBS
00555 #define MASK_ALIGN_POWER 0x00000000
00556 #define MASK_ALIGN_NATURAL 0x00000001
00557 #define TARGET_ALIGN_NATURAL (rs6000_alignment_flags & MASK_ALIGN_NATURAL)
00558 #else
00559 #define TARGET_ALIGN_NATURAL 0
00560 #endif
00561
00562 #define TARGET_LONG_DOUBLE_128 (rs6000_long_double_type_size == 128)
00563 #define TARGET_ALTIVEC_ABI rs6000_altivec_abi
00564 #define TARGET_ALTIVEC_VRSAVE rs6000_altivec_vrsave
00565
00566 #define TARGET_SPE_ABI 0
00567 #define TARGET_SPE 0
00568 #define TARGET_E500 0
00569 #define TARGET_ISEL 0
00570 #define TARGET_FPRS 1
00571 #define TARGET_E500_SINGLE 0
00572 #define TARGET_E500_DOUBLE 0
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585 #define OVERRIDE_OPTIONS rs6000_override_options (TARGET_CPU_DEFAULT)
00586
00587
00588 #define OPTIMIZATION_OPTIONS(LEVEL,SIZE) optimization_options(LEVEL,SIZE)
00589
00590
00591 #define CAN_DEBUG_WITHOUT_FP
00592
00593
00594 #define REGISTER_TARGET_PRAGMAS() do { \
00595 c_register_pragma (0, "longcall", rs6000_pragma_longcall); \
00596 } while (0)
00597
00598
00599 #define TARGET_CPU_CPP_BUILTINS() \
00600 rs6000_cpu_cpp_builtins (pfile)
00601
00602
00603
00604 #define RS6000_CPU_CPP_ENDIAN_BUILTINS() \
00605 do \
00606 { \
00607 if (BYTES_BIG_ENDIAN) \
00608 { \
00609 builtin_define ("__BIG_ENDIAN__"); \
00610 builtin_define ("_BIG_ENDIAN"); \
00611 builtin_assert ("machine=bigendian"); \
00612 } \
00613 else \
00614 { \
00615 builtin_define ("__LITTLE_ENDIAN__"); \
00616 builtin_define ("_LITTLE_ENDIAN"); \
00617 builtin_assert ("machine=littleendian"); \
00618 } \
00619 } \
00620 while (0)
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630 #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
00631 if (GET_MODE_CLASS (MODE) == MODE_INT \
00632 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
00633 (MODE) = TARGET_32BIT ? SImode : DImode;
00634
00635
00636
00637
00638 #define BITS_BIG_ENDIAN 1
00639
00640
00641
00642 #define BYTES_BIG_ENDIAN 1
00643
00644
00645
00646
00647
00648
00649 #define WORDS_BIG_ENDIAN 1
00650
00651 #define MAX_BITS_PER_WORD 64
00652
00653
00654 #define UNITS_PER_WORD (! TARGET_POWERPC64 ? 4 : 8)
00655 #ifdef IN_LIBGCC2
00656 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
00657 #else
00658 #define MIN_UNITS_PER_WORD 4
00659 #endif
00660 #define UNITS_PER_FP_WORD 8
00661 #define UNITS_PER_ALTIVEC_WORD 16
00662 #define UNITS_PER_SPE_WORD 8
00663
00664
00665 #define PTRDIFF_TYPE "int"
00666
00667
00668 #define SIZE_TYPE "long unsigned int"
00669
00670
00671 #define WCHAR_TYPE "short unsigned int"
00672
00673
00674 #define WCHAR_TYPE_SIZE 16
00675
00676
00677
00678
00679
00680 #define SHORT_TYPE_SIZE 16
00681
00682
00683
00684
00685 #define INT_TYPE_SIZE 32
00686
00687
00688
00689
00690 #define LONG_TYPE_SIZE (TARGET_32BIT ? 32 : 64)
00691
00692
00693
00694
00695 #define LONG_LONG_TYPE_SIZE 64
00696
00697
00698
00699
00700 #define FLOAT_TYPE_SIZE 32
00701
00702
00703
00704
00705 #define DOUBLE_TYPE_SIZE 64
00706
00707
00708
00709
00710 #define LONG_DOUBLE_TYPE_SIZE rs6000_long_double_type_size
00711
00712
00713
00714 #ifdef __LONG_DOUBLE_128__
00715 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
00716 #else
00717 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
00718 #endif
00719
00720
00721 #define WIDEST_HARDWARE_FP_SIZE 64
00722
00723
00724
00725 #define POINTER_SIZE (TARGET_32BIT ? 32 : 64)
00726
00727
00728 #define PARM_BOUNDARY (TARGET_32BIT ? 32 : 64)
00729
00730
00731 #define STACK_BOUNDARY \
00732 ((TARGET_32BIT && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)
00733
00734
00735 #define FUNCTION_BOUNDARY 32
00736
00737
00738 #define BIGGEST_ALIGNMENT 128
00739
00740
00741
00742
00743 #define LOCAL_ALIGNMENT(TYPE, ALIGN) \
00744 ((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) ? 128 : \
00745 (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 : \
00746 (TARGET_SPE && TREE_CODE (TYPE) == VECTOR_TYPE) ? 64 : ALIGN)
00747
00748
00749 #define EMPTY_FIELD_BOUNDARY 32
00750
00751
00752 #define STRUCTURE_SIZE_BOUNDARY 8
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766 #define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
00767 ((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
00768 || (TARGET_E500_DOUBLE && (MODE) == DFmode))
00769
00770
00771 #define PCC_BITFIELD_TYPE_MATTERS 1
00772
00773
00774
00775 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
00776 (TREE_CODE (EXP) == STRING_CST \
00777 && (ALIGN) < BITS_PER_WORD \
00778 ? BITS_PER_WORD \
00779 : (ALIGN))
00780
00781
00782
00783
00784 #define DATA_ALIGNMENT(TYPE, ALIGN) \
00785 (TREE_CODE (TYPE) == VECTOR_TYPE ? (TARGET_SPE_ABI ? 64 : 128) \
00786 : (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 \
00787 : TREE_CODE (TYPE) == ARRAY_TYPE \
00788 && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
00789 && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
00790
00791
00792
00793 #define STRICT_ALIGNMENT 0
00794
00795
00796
00797
00798 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) \
00799 (STRICT_ALIGNMENT \
00800 || (((MODE) == SFmode || (MODE) == DFmode || (MODE) == TFmode \
00801 || (MODE) == DImode) \
00802 && (ALIGN) < 32))
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827 #define FIRST_PSEUDO_REGISTER 113
00828
00829
00830 #define PRE_GCC3_DWARF_FRAME_REGISTERS 77
00831
00832
00833 #define DWARF_FRAME_REGISTERS (FIRST_PSEUDO_REGISTER + 32)
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848 #define DWARF_REG_TO_UNWIND_COLUMN(r) \
00849 ((r) > 1200 ? ((r) - 1200 + FIRST_PSEUDO_REGISTER) : (r))
00850
00851
00852 #define DWARF_FRAME_REGNUM(REGNO) (REGNO)
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864 #define FIXED_REGISTERS \
00865 {0, 1, FIXED_R2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FIXED_R13, 0, 0, \
00866 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00867 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00868 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00869 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, \
00870 \
00871 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00872 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00873 1, 1 \
00874 , 1, 1 \
00875 }
00876
00877
00878
00879
00880
00881
00882
00883
00884 #define CALL_USED_REGISTERS \
00885 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, FIXED_R13, 0, 0, \
00886 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00887 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
00888 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00889 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \
00890 \
00891 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00892 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00893 1, 1 \
00894 , 1, 1 \
00895 }
00896
00897
00898
00899
00900
00901
00902
00903 #define CALL_REALLY_USED_REGISTERS \
00904 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, FIXED_R13, 0, 0, \
00905 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00906 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
00907 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00908 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \
00909 \
00910 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00911 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00912 0, 0 \
00913 , 0, 0 \
00914 }
00915
00916 #define MQ_REGNO 64
00917 #define CR0_REGNO 68
00918 #define CR1_REGNO 69
00919 #define CR2_REGNO 70
00920 #define CR3_REGNO 71
00921 #define CR4_REGNO 72
00922 #define MAX_CR_REGNO 75
00923 #define XER_REGNO 76
00924 #define FIRST_ALTIVEC_REGNO 77
00925 #define LAST_ALTIVEC_REGNO 108
00926 #define TOTAL_ALTIVEC_REGS (LAST_ALTIVEC_REGNO - FIRST_ALTIVEC_REGNO + 1)
00927 #define VRSAVE_REGNO 109
00928 #define VSCR_REGNO 110
00929 #define SPE_ACC_REGNO 111
00930 #define SPEFSCR_REGNO 112
00931
00932 #define FIRST_SAVED_ALTIVEC_REGNO (FIRST_ALTIVEC_REGNO+20)
00933 #define FIRST_SAVED_FP_REGNO (14+32)
00934 #define FIRST_SAVED_GP_REGNO 13
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968 #if FIXED_R2 == 1
00969 #define MAYBE_R2_AVAILABLE
00970 #define MAYBE_R2_FIXED 2,
00971 #else
00972 #define MAYBE_R2_AVAILABLE 2,
00973 #define MAYBE_R2_FIXED
00974 #endif
00975
00976 #define REG_ALLOC_ORDER \
00977 {32, \
00978 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, \
00979 33, \
00980 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, \
00981 50, 49, 48, 47, 46, \
00982 75, 74, 69, 68, 72, 71, 70, \
00983 0, MAYBE_R2_AVAILABLE \
00984 9, 11, 10, 8, 7, 6, 5, 4, \
00985 3, \
00986 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \
00987 18, 17, 16, 15, 14, 13, 12, \
00988 64, 66, 65, \
00989 73, 1, MAYBE_R2_FIXED 67, 76, \
00990 \
00991 77, 78, \
00992 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, \
00993 79, \
00994 96, 95, 94, 93, 92, 91, \
00995 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, \
00996 97, 109, 110 \
00997 , 111, 112 \
00998 }
00999
01000
01001 #define FP_REGNO_P(N) ((N) >= 32 && (N) <= 63)
01002
01003
01004 #define CR_REGNO_P(N) ((N) >= 68 && (N) <= 75)
01005
01006
01007 #define CR_REGNO_NOT_CR0_P(N) ((N) >= 69 && (N) <= 75)
01008
01009
01010 #define INT_REGNO_P(N) ((N) <= 31 || (N) == ARG_POINTER_REGNUM)
01011
01012
01013 #define SPE_SIMD_REGNO_P(N) ((N) <= 31)
01014
01015
01016 #define XER_REGNO_P(N) ((N) == XER_REGNO)
01017
01018
01019 #define ALTIVEC_REGNO_P(N) ((N) >= FIRST_ALTIVEC_REGNO && (N) <= LAST_ALTIVEC_REGNO)
01020
01021
01022
01023
01024 #define HARD_REGNO_NREGS(REGNO, MODE) rs6000_hard_regno_nregs ((REGNO), (MODE))
01025
01026 #define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \
01027 ((TARGET_32BIT && TARGET_POWERPC64 \
01028 && (GET_MODE_SIZE (MODE) > 4) \
01029 && INT_REGNO_P (REGNO)) ? 1 : 0)
01030
01031 #define ALTIVEC_VECTOR_MODE(MODE) \
01032 ((MODE) == V16QImode \
01033 || (MODE) == V8HImode \
01034 || (MODE) == V4SFmode \
01035 || (MODE) == V4SImode)
01036
01037 #define SPE_VECTOR_MODE(MODE) \
01038 ((MODE) == V4HImode \
01039 || (MODE) == V2SFmode \
01040 || (MODE) == V1DImode \
01041 || (MODE) == V2SImode)
01042
01043 #define UNITS_PER_SIMD_WORD \
01044 (TARGET_ALTIVEC ? 16 : (TARGET_SPE ? 8 : 0) )
01045
01046
01047
01048 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
01049 rs6000_hard_regno_mode_ok_p[(int)(MODE)][REGNO]
01050
01051
01052
01053
01054
01055 #define MODES_TIEABLE_P(MODE1, MODE2) \
01056 (GET_MODE_CLASS (MODE1) == MODE_FLOAT \
01057 ? GET_MODE_CLASS (MODE2) == MODE_FLOAT \
01058 : GET_MODE_CLASS (MODE2) == MODE_FLOAT \
01059 ? GET_MODE_CLASS (MODE1) == MODE_FLOAT \
01060 : GET_MODE_CLASS (MODE1) == MODE_CC \
01061 ? GET_MODE_CLASS (MODE2) == MODE_CC \
01062 : GET_MODE_CLASS (MODE2) == MODE_CC \
01063 ? GET_MODE_CLASS (MODE1) == MODE_CC \
01064 : SPE_VECTOR_MODE (MODE1) \
01065 ? SPE_VECTOR_MODE (MODE2) \
01066 : SPE_VECTOR_MODE (MODE2) \
01067 ? SPE_VECTOR_MODE (MODE1) \
01068 : ALTIVEC_VECTOR_MODE (MODE1) \
01069 ? ALTIVEC_VECTOR_MODE (MODE2) \
01070 : ALTIVEC_VECTOR_MODE (MODE2) \
01071 ? ALTIVEC_VECTOR_MODE (MODE1) \
01072 : 1)
01073
01074
01075
01076
01077 #define HARD_REGNO_RENAME_OK(SRC, DST) \
01078 (! ALTIVEC_REGNO_P (DST) || regs_ever_live[DST])
01079
01080
01081
01082
01083 #define REGISTER_MOVE_COST rs6000_register_move_cost
01084
01085
01086
01087
01088 #define MEMORY_MOVE_COST rs6000_memory_move_cost
01089
01090
01091
01092
01093
01094
01095
01096 #define BRANCH_COST 3
01097
01098
01099
01100
01101 #define LOGICAL_OP_NON_SHORT_CIRCUIT 0
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114 #define FIXED_SCRATCH (TARGET_SPE ? 14 : 11)
01115
01116
01117
01118
01119 #define CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage ()
01120
01121
01122
01123
01124
01125
01126
01127
01128 #define STACK_POINTER_REGNUM 1
01129
01130
01131 #define FRAME_POINTER_REGNUM 31
01132
01133
01134
01135
01136
01137 #define FRAME_POINTER_REQUIRED 0
01138
01139
01140 #define ARG_POINTER_REGNUM 67
01141
01142
01143 #define STATIC_CHAIN_REGNUM 11
01144
01145
01146 #define LINK_REGISTER_REGNUM 65
01147
01148
01149 #define COUNT_REGISTER_REGNUM 66
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181 enum reg_class
01182 {
01183 NO_REGS,
01184 BASE_REGS,
01185 GENERAL_REGS,
01186 FLOAT_REGS,
01187 ALTIVEC_REGS,
01188 VRSAVE_REGS,
01189 VSCR_REGS,
01190 SPE_ACC_REGS,
01191 SPEFSCR_REGS,
01192 NON_SPECIAL_REGS,
01193 MQ_REGS,
01194 LINK_REGS,
01195 CTR_REGS,
01196 LINK_OR_CTR_REGS,
01197 SPECIAL_REGS,
01198 SPEC_OR_GEN_REGS,
01199 CR0_REGS,
01200 CR_REGS,
01201 NON_FLOAT_REGS,
01202 XER_REGS,
01203 ALL_REGS,
01204 LIM_REG_CLASSES
01205 };
01206
01207 #define N_REG_CLASSES (int) LIM_REG_CLASSES
01208
01209
01210
01211 #define REG_CLASS_NAMES \
01212 { \
01213 "NO_REGS", \
01214 "BASE_REGS", \
01215 "GENERAL_REGS", \
01216 "FLOAT_REGS", \
01217 "ALTIVEC_REGS", \
01218 "VRSAVE_REGS", \
01219 "VSCR_REGS", \
01220 "SPE_ACC_REGS", \
01221 "SPEFSCR_REGS", \
01222 "NON_SPECIAL_REGS", \
01223 "MQ_REGS", \
01224 "LINK_REGS", \
01225 "CTR_REGS", \
01226 "LINK_OR_CTR_REGS", \
01227 "SPECIAL_REGS", \
01228 "SPEC_OR_GEN_REGS", \
01229 "CR0_REGS", \
01230 "CR_REGS", \
01231 "NON_FLOAT_REGS", \
01232 "XER_REGS", \
01233 "ALL_REGS" \
01234 }
01235
01236
01237
01238
01239
01240 #define REG_CLASS_CONTENTS \
01241 { \
01242 { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, \
01243 { 0xfffffffe, 0x00000000, 0x00000008, 0x00000000 }, \
01244 { 0xffffffff, 0x00000000, 0x00000008, 0x00000000 }, \
01245 { 0x00000000, 0xffffffff, 0x00000000, 0x00000000 }, \
01246 { 0x00000000, 0x00000000, 0xffffe000, 0x00001fff }, \
01247 { 0x00000000, 0x00000000, 0x00000000, 0x00002000 }, \
01248 { 0x00000000, 0x00000000, 0x00000000, 0x00004000 }, \
01249 { 0x00000000, 0x00000000, 0x00000000, 0x00008000 }, \
01250 { 0x00000000, 0x00000000, 0x00000000, 0x00010000 }, \
01251 { 0xffffffff, 0xffffffff, 0x00000008, 0x00000000 }, \
01252 { 0x00000000, 0x00000000, 0x00000001, 0x00000000 }, \
01253 { 0x00000000, 0x00000000, 0x00000002, 0x00000000 }, \
01254 { 0x00000000, 0x00000000, 0x00000004, 0x00000000 }, \
01255 { 0x00000000, 0x00000000, 0x00000006, 0x00000000 }, \
01256 { 0x00000000, 0x00000000, 0x00000007, 0x00002000 }, \
01257 { 0xffffffff, 0x00000000, 0x0000000f, 0x00000000 }, \
01258 { 0x00000000, 0x00000000, 0x00000010, 0x00000000 }, \
01259 { 0x00000000, 0x00000000, 0x00000ff0, 0x00000000 }, \
01260 { 0xffffffff, 0x00000000, 0x0000efff, 0x00000000 }, \
01261 { 0x00000000, 0x00000000, 0x00001000, 0x00000000 }, \
01262 { 0xffffffff, 0xffffffff, 0xffffffff, 0x00003fff } \
01263 }
01264
01265
01266
01267
01268
01269
01270 #define REGNO_REG_CLASS(REGNO) \
01271 ((REGNO) == 0 ? GENERAL_REGS \
01272 : (REGNO) < 32 ? BASE_REGS \
01273 : FP_REGNO_P (REGNO) ? FLOAT_REGS \
01274 : ALTIVEC_REGNO_P (REGNO) ? ALTIVEC_REGS \
01275 : (REGNO) == CR0_REGNO ? CR0_REGS \
01276 : CR_REGNO_P (REGNO) ? CR_REGS \
01277 : (REGNO) == MQ_REGNO ? MQ_REGS \
01278 : (REGNO) == LINK_REGISTER_REGNUM ? LINK_REGS \
01279 : (REGNO) == COUNT_REGISTER_REGNUM ? CTR_REGS \
01280 : (REGNO) == ARG_POINTER_REGNUM ? BASE_REGS \
01281 : (REGNO) == XER_REGNO ? XER_REGS \
01282 : (REGNO) == VRSAVE_REGNO ? VRSAVE_REGS \
01283 : (REGNO) == VSCR_REGNO ? VRSAVE_REGS \
01284 : (REGNO) == SPE_ACC_REGNO ? SPE_ACC_REGS \
01285 : (REGNO) == SPEFSCR_REGNO ? SPEFSCR_REGS \
01286 : NO_REGS)
01287
01288
01289 #define INDEX_REG_CLASS GENERAL_REGS
01290 #define BASE_REG_CLASS BASE_REGS
01291
01292
01293
01294 #define REG_CLASS_FROM_LETTER(C) \
01295 ((C) == 'f' ? ((TARGET_HARD_FLOAT && TARGET_FPRS) ? FLOAT_REGS : NO_REGS) \
01296 : (C) == 'b' ? BASE_REGS \
01297 : (C) == 'h' ? SPECIAL_REGS \
01298 : (C) == 'q' ? MQ_REGS \
01299 : (C) == 'c' ? CTR_REGS \
01300 : (C) == 'l' ? LINK_REGS \
01301 : (C) == 'v' ? ALTIVEC_REGS \
01302 : (C) == 'x' ? CR0_REGS \
01303 : (C) == 'y' ? CR_REGS \
01304 : (C) == 'z' ? XER_REGS \
01305 : NO_REGS)
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
01323 ( (C) == 'I' ? (unsigned HOST_WIDE_INT) ((VALUE) + 0x8000) < 0x10000 \
01324 : (C) == 'J' ? ((VALUE) & (~ (unsigned HOST_WIDE_INT) 0xffff0000)) == 0 \
01325 : (C) == 'K' ? ((VALUE) & (~ (HOST_WIDE_INT) 0xffff)) == 0 \
01326 : (C) == 'L' ? (((VALUE) & 0xffff) == 0 \
01327 && ((VALUE) >> 31 == -1 || (VALUE) >> 31 == 0)) \
01328 : (C) == 'M' ? (VALUE) > 31 \
01329 : (C) == 'N' ? (VALUE) > 0 && exact_log2 (VALUE) >= 0 \
01330 : (C) == 'O' ? (VALUE) == 0 \
01331 : (C) == 'P' ? (unsigned HOST_WIDE_INT) ((- (VALUE)) + 0x8000) < 0x10000 \
01332 : 0)
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
01343 ( (C) == 'G' ? (num_insns_constant (VALUE, GET_MODE (VALUE)) \
01344 == ((GET_MODE (VALUE) == SFmode) ? 1 : 2)) \
01345 : (C) == 'H' ? (num_insns_constant (VALUE, GET_MODE (VALUE)) == 3) \
01346 : 0)
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359 #define EXTRA_CONSTRAINT(OP, C) \
01360 ((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
01361 : (C) == 'R' ? legitimate_constant_pool_address_p (OP) \
01362 : (C) == 'S' ? mask64_operand (OP, DImode) \
01363 : (C) == 'T' ? mask_operand (OP, SImode) \
01364 : (C) == 'U' ? (DEFAULT_ABI == ABI_V4 \
01365 && small_data_operand (OP, GET_MODE (OP))) \
01366 : (C) == 't' ? (mask64_2_operand (OP, DImode) \
01367 && (fixed_regs[CR0_REGNO] \
01368 || !logical_operand (OP, DImode)) \
01369 && !mask64_operand (OP, DImode)) \
01370 : (C) == 'W' ? (easy_vector_constant (OP, GET_MODE (OP))) \
01371 : (C) == 'Y' ? (word_offset_memref_operand (OP, GET_MODE (OP))) \
01372 : 0)
01373
01374
01375
01376
01377
01378 #define EXTRA_MEMORY_CONSTRAINT(C, STR) \
01379 ((C) == 'Q' || (C) == 'Y')
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399 #define PREFERRED_RELOAD_CLASS(X,CLASS) \
01400 ((CONSTANT_P (X) \
01401 && reg_classes_intersect_p ((CLASS), FLOAT_REGS)) \
01402 ? NO_REGS \
01403 : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \
01404 && (CLASS) == NON_SPECIAL_REGS) \
01405 ? GENERAL_REGS \
01406 : (CLASS))
01407
01408
01409
01410
01411
01412 #define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \
01413 secondary_reload_class (CLASS, MODE, IN)
01414
01415
01416
01417
01418 #define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \
01419 ((CLASS1) != (CLASS2) && ((CLASS1) == FLOAT_REGS \
01420 || (CLASS2) == FLOAT_REGS \
01421 || (CLASS1) == ALTIVEC_REGS \
01422 || (CLASS2) == ALTIVEC_REGS))
01423
01424
01425
01426
01427
01428
01429 #define CLASS_MAX_NREGS(CLASS, MODE) \
01430 (((CLASS) == FLOAT_REGS) \
01431 ? ((GET_MODE_SIZE (MODE) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD) \
01432 : (TARGET_E500_DOUBLE && (CLASS) == GENERAL_REGS && (MODE) == DFmode) \
01433 ? 1 \
01434 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
01435
01436
01437
01438
01439 #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
01440 (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) \
01441 && GET_MODE_SIZE (FROM) >= 8 && GET_MODE_SIZE (TO) >= 8) \
01442 ? 0 \
01443 : GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
01444 ? reg_classes_intersect_p (FLOAT_REGS, CLASS) \
01445 : (TARGET_E500_DOUBLE && (((TO) == DFmode) + ((FROM) == DFmode)) == 1) \
01446 ? reg_classes_intersect_p (GENERAL_REGS, CLASS) \
01447 : (TARGET_E500_DOUBLE && (((TO) == DImode) + ((FROM) == DImode)) == 1) \
01448 ? reg_classes_intersect_p (GENERAL_REGS, CLASS) \
01449 : (TARGET_SPE && (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1) \
01450 ? reg_classes_intersect_p (GENERAL_REGS, CLASS) \
01451 : 0)
01452
01453
01454
01455
01456 enum rs6000_abi {
01457 ABI_NONE,
01458 ABI_AIX,
01459 ABI_V4,
01460 ABI_DARWIN
01461 };
01462
01463 extern enum rs6000_abi rs6000_current_abi;
01464
01465
01466
01467 #define STACK_GROWS_DOWNWARD
01468
01469
01470 #define DWARF_CIE_DATA_ALIGNMENT (-((int) (TARGET_32BIT ? 4 : 8)))
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482 #define RS6000_REG_SAVE ((DEFAULT_ABI == ABI_AIX \
01483 || DEFAULT_ABI == ABI_DARWIN) \
01484 ? (TARGET_64BIT ? 64 : 32) \
01485 : 0)
01486
01487
01488 #define RS6000_SAVE_AREA \
01489 (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) ? 24 : 8) \
01490 << (TARGET_64BIT ? 1 : 0))
01491
01492
01493 #define RS6000_SAVE_TOC gen_rtx_MEM (Pmode, \
01494 plus_constant (stack_pointer_rtx, \
01495 (TARGET_32BIT ? 20 : 40)))
01496
01497
01498 #define RS6000_VARARGS_AREA 0
01499
01500
01501 #define RS6000_ALIGN(n,a) (((n) + (a) - 1) & ~((a) - 1))
01502
01503
01504 #define RS6000_VARARGS_SIZE \
01505 ((GP_ARG_NUM_REG * (TARGET_32BIT ? 4 : 8)) + (FP_ARG_NUM_REG * 8) + 8)
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516 #define STARTING_FRAME_OFFSET \
01517 (RS6000_ALIGN (current_function_outgoing_args_size, \
01518 TARGET_ALTIVEC ? 16 : 8) \
01519 + RS6000_VARARGS_AREA \
01520 + RS6000_SAVE_AREA)
01521
01522
01523
01524
01525
01526
01527
01528 #define STACK_DYNAMIC_OFFSET(FUNDECL) \
01529 (RS6000_ALIGN (current_function_outgoing_args_size, \
01530 TARGET_ALTIVEC ? 16 : 8) \
01531 + (STACK_POINTER_OFFSET))
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541 #define FIRST_PARM_OFFSET(FNDECL) RS6000_SAVE_AREA
01542
01543
01544
01545
01546 #define ARG_POINTER_CFA_OFFSET(FNDECL) 0
01547
01548
01549
01550
01551 #define REG_PARM_STACK_SPACE(FNDECL) RS6000_REG_SAVE
01552
01553
01554
01555 #define OUTGOING_REG_PARM_STACK_SPACE
01556
01557
01558
01559
01560 #define STACK_POINTER_OFFSET RS6000_SAVE_AREA
01561
01562
01563
01564
01565 #define ACCUMULATE_OUTGOING_ARGS 1
01566
01567
01568
01569
01570
01571
01572
01573
01574 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
01575
01576
01577
01578
01579
01580
01581 #define FUNCTION_VALUE(VALTYPE, FUNC) rs6000_function_value ((VALTYPE), (FUNC))
01582
01583
01584
01585
01586 #define LIBCALL_VALUE(MODE) rs6000_libcall_value ((MODE))
01587
01588
01589 #define DRAFT_V4_STRUCT_RET 0
01590
01591
01592 #define DEFAULT_PCC_STRUCT_RETURN 0
01593
01594
01595
01596
01597
01598 #define STACK_SAVEAREA_MODE(LEVEL) \
01599 (LEVEL == SAVE_FUNCTION ? VOIDmode \
01600 : LEVEL == SAVE_NONLOCAL ? (TARGET_32BIT ? DImode : TImode) : Pmode)
01601
01602
01603 #define GP_ARG_MIN_REG 3
01604 #define GP_ARG_MAX_REG 10
01605 #define GP_ARG_NUM_REG (GP_ARG_MAX_REG - GP_ARG_MIN_REG + 1)
01606
01607
01608 #define FP_ARG_MIN_REG 33
01609 #define FP_ARG_AIX_MAX_REG 45
01610 #define FP_ARG_V4_MAX_REG 40
01611 #define FP_ARG_MAX_REG ((DEFAULT_ABI == ABI_AIX \
01612 || DEFAULT_ABI == ABI_DARWIN) \
01613 ? FP_ARG_AIX_MAX_REG : FP_ARG_V4_MAX_REG)
01614 #define FP_ARG_NUM_REG (FP_ARG_MAX_REG - FP_ARG_MIN_REG + 1)
01615
01616
01617 #define ALTIVEC_ARG_MIN_REG (FIRST_ALTIVEC_REGNO + 2)
01618 #define ALTIVEC_ARG_MAX_REG (ALTIVEC_ARG_MIN_REG + 11)
01619 #define ALTIVEC_ARG_NUM_REG (ALTIVEC_ARG_MAX_REG - ALTIVEC_ARG_MIN_REG + 1)
01620
01621
01622 #define GP_ARG_RETURN GP_ARG_MIN_REG
01623 #define FP_ARG_RETURN FP_ARG_MIN_REG
01624 #define ALTIVEC_ARG_RETURN (FIRST_ALTIVEC_REGNO + 2)
01625
01626
01627 #define CALL_NORMAL 0x00000000
01628
01629 #define CALL_V4_CLEAR_FP_ARGS 0x00000002
01630 #define CALL_V4_SET_FP_ARGS 0x00000004
01631 #define CALL_LONG 0x00000008
01632 #define CALL_LIBCALL 0x00000010
01633
01634
01635
01636 #define WORLD_SAVE_P(INFO) 0
01637
01638
01639
01640
01641
01642 #define FUNCTION_VALUE_REGNO_P(N) \
01643 ((N) == GP_ARG_RETURN \
01644 || ((N) == FP_ARG_RETURN && TARGET_HARD_FLOAT && TARGET_FPRS) \
01645 || ((N) == ALTIVEC_ARG_RETURN && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI))
01646
01647
01648
01649
01650 #define FUNCTION_ARG_REGNO_P(N) \
01651 ((unsigned) (N) - GP_ARG_MIN_REG < GP_ARG_NUM_REG \
01652 || ((unsigned) (N) - ALTIVEC_ARG_MIN_REG < ALTIVEC_ARG_NUM_REG \
01653 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI) \
01654 || ((unsigned) (N) - FP_ARG_MIN_REG < FP_ARG_NUM_REG \
01655 && TARGET_HARD_FLOAT && TARGET_FPRS))
01656
01657
01658
01659 typedef struct machine_function GTY(())
01660 {
01661
01662 int ra_needs_full_frame;
01663
01664 const char *some_ld_name;
01665
01666 int insn_chain_scanned_p;
01667
01668 int ra_need_lr;
01669 } machine_function;
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689 typedef struct rs6000_args
01690 {
01691 int words;
01692 int fregno;
01693 int vregno;
01694 int nargs_prototype;
01695 int prototype;
01696 int stdarg;
01697 int call_cookie;
01698 int sysv_gregno;
01699 int intoffset;
01700 int use_stack;
01701 int named;
01702 } CUMULATIVE_ARGS;
01703
01704
01705
01706
01707
01708 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
01709 init_cumulative_args (&CUM, FNTYPE, LIBNAME, FALSE, FALSE, N_NAMED_ARGS)
01710
01711
01712
01713
01714 #define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
01715 init_cumulative_args (&CUM, FNTYPE, LIBNAME, TRUE, FALSE, 1000)
01716
01717
01718
01719 #define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \
01720 init_cumulative_args (&CUM, NULL_TREE, LIBNAME, FALSE, TRUE, 0)
01721
01722
01723
01724
01725
01726 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01727 function_arg_advance (&CUM, MODE, TYPE, NAMED, 0)
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01752 function_arg (&CUM, MODE, TYPE, NAMED)
01753
01754
01755
01756
01757
01758
01759
01760 #define FUNCTION_ARG_PADDING(MODE, TYPE) function_arg_padding (MODE, TYPE)
01761
01762
01763
01764
01765
01766 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
01767 function_arg_boundary (MODE, TYPE)
01768
01769
01770 #define EXPAND_BUILTIN_VA_START(valist, nextarg) \
01771 rs6000_va_start (valist, nextarg)
01772
01773 #define PAD_VARARGS_DOWN \
01774 (FUNCTION_ARG_PADDING (TYPE_MODE (type), type) == downward)
01775
01776
01777
01778
01779 #define FUNCTION_PROFILER(FILE, LABELNO) \
01780 output_function_profiler ((FILE), (LABELNO));
01781
01782
01783
01784
01785
01786
01787
01788 #define EXIT_IGNORE_STACK 1
01789
01790
01791
01792
01793
01794
01795 #define EPILOGUE_USES(REGNO) \
01796 ((reload_completed && (REGNO) == LINK_REGISTER_REGNUM) \
01797 || (TARGET_ALTIVEC && (REGNO) == VRSAVE_REGNO) \
01798 || (current_function_calls_eh_return \
01799 && TARGET_AIX \
01800 && (REGNO) == 2))
01801
01802
01803
01804
01805
01806
01807 #define TRAMPOLINE_SIZE rs6000_trampoline_size ()
01808
01809
01810
01811
01812
01813 #define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, CXT) \
01814 rs6000_initialize_trampoline (ADDR, FNADDR, CXT)
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829 #define RETURN_ADDRESS_OFFSET \
01830 ((DEFAULT_ABI == ABI_AIX \
01831 || DEFAULT_ABI == ABI_DARWIN) ? (TARGET_32BIT ? 8 : 16) : \
01832 (DEFAULT_ABI == ABI_V4) ? 4 : \
01833 (internal_error ("RETURN_ADDRESS_OFFSET not supported"), 0))
01834
01835
01836
01837
01838 #define RETURN_ADDR_RTX(COUNT, FRAME) \
01839 (rs6000_return_addr (COUNT, FRAME))
01840
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850
01851
01852
01853
01854
01855
01856
01857
01858 #define ELIMINABLE_REGS \
01859 {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01860 { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01861 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
01862 { RS6000_PIC_OFFSET_TABLE_REGNUM, RS6000_PIC_OFFSET_TABLE_REGNUM } }
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873 #define CAN_ELIMINATE(FROM, TO) \
01874 ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM \
01875 ? ! frame_pointer_needed \
01876 : (FROM) == RS6000_PIC_OFFSET_TABLE_REGNUM \
01877 ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0 \
01878 : 1)
01879
01880
01881
01882 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01883 ((OFFSET) = rs6000_initial_elimination_offset(FROM, TO))
01884
01885
01886
01887 #define HAVE_PRE_DECREMENT 1
01888 #define HAVE_PRE_INCREMENT 1
01889
01890
01891
01892
01893
01894
01895
01896
01897
01898 #define REGNO_OK_FOR_INDEX_P(REGNO) \
01899 ((REGNO) < FIRST_PSEUDO_REGISTER \
01900 ? (REGNO) <= 31 || (REGNO) == 67 \
01901 : (reg_renumber[REGNO] >= 0 \
01902 && (reg_renumber[REGNO] <= 31 || reg_renumber[REGNO] == 67)))
01903
01904 #define REGNO_OK_FOR_BASE_P(REGNO) \
01905 ((REGNO) < FIRST_PSEUDO_REGISTER \
01906 ? ((REGNO) > 0 && (REGNO) <= 31) || (REGNO) == 67 \
01907 : (reg_renumber[REGNO] > 0 \
01908 && (reg_renumber[REGNO] <= 31 || reg_renumber[REGNO] == 67)))
01909
01910
01911
01912 #define MAX_REGS_PER_ADDRESS 2
01913
01914
01915
01916 #define CONSTANT_ADDRESS_P(X) \
01917 (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
01918 || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \
01919 || GET_CODE (X) == HIGH)
01920
01921
01922
01923
01924
01925
01926
01927
01928 #define LEGITIMATE_CONSTANT_P(X) \
01929 (((GET_CODE (X) != CONST_DOUBLE \
01930 && GET_CODE (X) != CONST_VECTOR) \
01931 || GET_MODE (X) == VOIDmode \
01932 || (TARGET_POWERPC64 && GET_MODE (X) == DImode) \
01933 || easy_fp_constant (X, GET_MODE (X)) \
01934 || easy_vector_constant (X, GET_MODE (X))) \
01935 && !rs6000_tls_referenced_p (X))
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950 #ifdef REG_OK_STRICT
01951 # define REG_OK_STRICT_FLAG 1
01952 #else
01953 # define REG_OK_STRICT_FLAG 0
01954 #endif
01955
01956
01957
01958 #define INT_REG_OK_FOR_INDEX_P(X, STRICT) \
01959 ((! (STRICT) \
01960 && (REGNO (X) <= 31 \
01961 || REGNO (X) == ARG_POINTER_REGNUM \
01962 || REGNO (X) >= FIRST_PSEUDO_REGISTER)) \
01963 || ((STRICT) && REGNO_OK_FOR_INDEX_P (REGNO (X))))
01964
01965
01966
01967 #define INT_REG_OK_FOR_BASE_P(X, STRICT) \
01968 (REGNO (X) > 0 && INT_REG_OK_FOR_INDEX_P (X, (STRICT)))
01969
01970 #define REG_OK_FOR_INDEX_P(X) INT_REG_OK_FOR_INDEX_P (X, REG_OK_STRICT_FLAG)
01971 #define REG_OK_FOR_BASE_P(X) INT_REG_OK_FOR_BASE_P (X, REG_OK_STRICT_FLAG)
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01992 { if (rs6000_legitimate_address (MODE, X, REG_OK_STRICT_FLAG)) \
01993 goto ADDR; \
01994 }
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019 #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
02020 { rtx result = rs6000_legitimize_address (X, OLDX, MODE); \
02021 if (result != NULL_RTX) \
02022 { \
02023 (X) = result; \
02024 goto WIN; \
02025 } \
02026 }
02027
02028
02029
02030
02031
02032
02033
02034
02035 #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \
02036 do { \
02037 int win; \
02038 (X) = rs6000_legitimize_reload_address ((X), (MODE), (OPNUM), \
02039 (int)(TYPE), (IND_LEVELS), &win); \
02040 if ( win ) \
02041 goto WIN; \
02042 } while (0)
02043
02044
02045
02046
02047 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
02048 do { \
02049 if (rs6000_mode_dependent_address (ADDR)) \
02050 goto LABEL; \
02051 } while (0)
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061 #define RS6000_PIC_OFFSET_TABLE_REGNUM 30
02062 #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? RS6000_PIC_OFFSET_TABLE_REGNUM : INVALID_REGNUM)
02063
02064 #define TOC_REGISTER (TARGET_MINIMAL_TOC ? RS6000_PIC_OFFSET_TABLE_REGNUM : 2)
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106 #define CASE_VECTOR_MODE SImode
02107
02108
02109
02110
02111
02112 #define CASE_VECTOR_PC_RELATIVE 1
02113
02114
02115 #define DEFAULT_SIGNED_CHAR 0
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126 #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TARGET_POWERPC64 ? TImode : DImode)
02127
02128
02129
02130 #define MOVE_MAX (! TARGET_POWERPC64 ? 4 : 8)
02131 #define MAX_MOVE_MAX 8
02132
02133
02134
02135
02136 #define SLOW_BYTE_ACCESS 1
02137
02138
02139
02140 #define WORD_REGISTER_OPERATIONS
02141
02142
02143
02144
02145
02146 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
02147
02148
02149 #define SHORT_IMMEDIATES_SIGN_EXTEND
02150
02151
02152
02153 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
02154
02155
02156 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
02157 ((VALUE) = ((MODE) == SImode ? 32 : 64))
02158
02159
02160 #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = -1)
02161
02162
02163
02164
02165 #define Pmode (TARGET_32BIT ? SImode : DImode)
02166
02167
02168 #define STACK_SIZE_MODE (TARGET_32BIT ? SImode : DImode)
02169
02170
02171
02172 #define FUNCTION_MODE SImode
02173
02174
02175
02176
02177
02178 #define NO_FUNCTION_CSE
02179
02180
02181
02182
02183
02184
02185
02186 #define SHIFT_COUNT_TRUNCATED (TARGET_POWER ? 1 : 0)
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202 #define SELECT_CC_MODE(OP,X,Y) \
02203 (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT ? CCFPmode \
02204 : (OP) == GTU || (OP) == LTU || (OP) == GEU || (OP) == LEU ? CCUNSmode \
02205 : (((OP) == EQ || (OP) == NE) && COMPARISON_P (X) \
02206 ? CCEQmode : CCmode))
02207
02208
02209
02210
02211 #define REVERSIBLE_CC_MODE(MODE) 1
02212
02213
02214 #define REVERSE_CONDITION(CODE, MODE) rs6000_reverse_condition (MODE, CODE)
02215
02216
02217
02218
02219 extern GTY(()) rtx rs6000_compare_op0;
02220 extern GTY(()) rtx rs6000_compare_op1;
02221 extern int rs6000_compare_fp_p;
02222
02223
02224
02225
02226
02227
02228 #define ASM_COMMENT_START " #"
02229
02230
02231 extern int toc_initialized;
02232
02233
02234
02235
02236
02237
02238 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY(FILE, X, MODE, ALIGN, LABELNO, WIN) \
02239 { if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (X, MODE)) \
02240 { \
02241 output_toc (FILE, X, LABELNO, MODE); \
02242 goto WIN; \
02243 } \
02244 }
02245
02246 #ifdef HAVE_GAS_WEAK
02247 #define RS6000_WEAK 1
02248 #else
02249 #define RS6000_WEAK 0
02250 #endif
02251
02252 #if RS6000_WEAK
02253
02254 #define ASM_WEAKEN_DECL(FILE, DECL, NAME, VAL) \
02255 do \
02256 { \
02257 fputs ("\t.weak\t", (FILE)); \
02258 RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \
02259 if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL \
02260 && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS) \
02261 { \
02262 if (TARGET_XCOFF) \
02263 fputs ("[DS]", (FILE)); \
02264 fputs ("\n\t.weak\t.", (FILE)); \
02265 RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \
02266 } \
02267 fputc ('\n', (FILE)); \
02268 if (VAL) \
02269 { \
02270 ASM_OUTPUT_DEF ((FILE), (NAME), (VAL)); \
02271 if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL \
02272 && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS) \
02273 { \
02274 fputs ("\t.set\t.", (FILE)); \
02275 RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \
02276 fputs (",.", (FILE)); \
02277 RS6000_OUTPUT_BASENAME ((FILE), (VAL)); \
02278 fputc ('\n', (FILE)); \
02279 } \
02280 } \
02281 } \
02282 while (0)
02283 #endif
02284
02285
02286 #undef ASM_OUTPUT_DEF_FROM_DECLS
02287 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \
02288 do \
02289 { \
02290 const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
02291 const char *name = IDENTIFIER_POINTER (TARGET); \
02292 if (TREE_CODE (DECL) == FUNCTION_DECL \
02293 && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS) \
02294 { \
02295 if (TREE_PUBLIC (DECL)) \
02296 { \
02297 if (!RS6000_WEAK || !DECL_WEAK (DECL)) \
02298 { \
02299 fputs ("\t.globl\t.", FILE); \
02300 RS6000_OUTPUT_BASENAME (FILE, alias); \
02301 putc ('\n', FILE); \
02302 } \
02303 } \
02304 else if (TARGET_XCOFF) \
02305 { \
02306 fputs ("\t.lglobl\t.", FILE); \
02307 RS6000_OUTPUT_BASENAME (FILE, alias); \
02308 putc ('\n', FILE); \
02309 } \
02310 fputs ("\t.set\t.", FILE); \
02311 RS6000_OUTPUT_BASENAME (FILE, alias); \
02312 fputs (",.", FILE); \
02313 RS6000_OUTPUT_BASENAME (FILE, name); \
02314 fputc ('\n', FILE); \
02315 } \
02316 ASM_OUTPUT_DEF (FILE, alias, name); \
02317 } \
02318 while (0)
02319
02320 #define TARGET_ASM_FILE_START rs6000_file_start
02321
02322
02323
02324
02325 #define ASM_APP_ON ""
02326
02327
02328
02329
02330 #define ASM_APP_OFF ""
02331
02332
02333
02334
02335 extern char rs6000_reg_names[][8];
02336
02337 #define REGISTER_NAMES \
02338 { \
02339 &rs6000_reg_names[ 0][0], \
02340 &rs6000_reg_names[ 1][0], \
02341 &rs6000_reg_names[ 2][0], \
02342 &rs6000_reg_names[ 3][0], \
02343 &rs6000_reg_names[ 4][0], \
02344 &rs6000_reg_names[ 5][0], \
02345 &rs6000_reg_names[ 6][0], \
02346 &rs6000_reg_names[ 7][0], \
02347 &rs6000_reg_names[ 8][0], \
02348 &rs6000_reg_names[ 9][0], \
02349 &rs6000_reg_names[10][0], \
02350 &rs6000_reg_names[11][0], \
02351 &rs6000_reg_names[12][0], \
02352 &rs6000_reg_names[13][0], \
02353 &rs6000_reg_names[14][0], \
02354 &rs6000_reg_names[15][0], \
02355 &rs6000_reg_names[16][0], \
02356 &rs6000_reg_names[17][0], \
02357 &rs6000_reg_names[18][0], \
02358 &rs6000_reg_names[19][0], \
02359 &rs6000_reg_names[20][0], \
02360 &rs6000_reg_names[21][0], \
02361 &rs6000_reg_names[22][0], \
02362 &rs6000_reg_names[23][0], \
02363 &rs6000_reg_names[24][0], \
02364 &rs6000_reg_names[25][0], \
02365 &rs6000_reg_names[26][0], \
02366 &rs6000_reg_names[27][0], \
02367 &rs6000_reg_names[28][0], \
02368 &rs6000_reg_names[29][0], \
02369 &rs6000_reg_names[30][0], \
02370 &rs6000_reg_names[31][0], \
02371 \
02372 &rs6000_reg_names[32][0], \
02373 &rs6000_reg_names[33][0], \
02374 &rs6000_reg_names[34][0], \
02375 &rs6000_reg_names[35][0], \
02376 &rs6000_reg_names[36][0], \
02377 &rs6000_reg_names[37][0], \
02378 &rs6000_reg_names[38][0], \
02379 &rs6000_reg_names[39][0], \
02380 &rs6000_reg_names[40][0], \
02381 &rs6000_reg_names[41][0], \
02382 &rs6000_reg_names[42][0], \
02383 &rs6000_reg_names[43][0], \
02384 &rs6000_reg_names[44][0], \
02385 &rs6000_reg_names[45][0], \
02386 &rs6000_reg_names[46][0], \
02387 &rs6000_reg_names[47][0], \
02388 &rs6000_reg_names[48][0], \
02389 &rs6000_reg_names[49][0], \
02390 &rs6000_reg_names[50][0], \
02391 &rs6000_reg_names[51][0], \
02392 &rs6000_reg_names[52][0], \
02393 &rs6000_reg_names[53][0], \
02394 &rs6000_reg_names[54][0], \
02395 &rs6000_reg_names[55][0], \
02396 &rs6000_reg_names[56][0], \
02397 &rs6000_reg_names[57][0], \
02398 &rs6000_reg_names[58][0], \
02399 &rs6000_reg_names[59][0], \
02400 &rs6000_reg_names[60][0], \
02401 &rs6000_reg_names[61][0], \
02402 &rs6000_reg_names[62][0], \
02403 &rs6000_reg_names[63][0], \
02404 \
02405 &rs6000_reg_names[64][0], \
02406 &rs6000_reg_names[65][0], \
02407 &rs6000_reg_names[66][0], \
02408 &rs6000_reg_names[67][0], \
02409 \
02410 &rs6000_reg_names[68][0], \
02411 &rs6000_reg_names[69][0], \
02412 &rs6000_reg_names[70][0], \
02413 &rs6000_reg_names[71][0], \
02414 &rs6000_reg_names[72][0], \
02415 &rs6000_reg_names[73][0], \
02416 &rs6000_reg_names[74][0], \
02417 &rs6000_reg_names[75][0], \
02418 \
02419 &rs6000_reg_names[76][0], \
02420 \
02421 &rs6000_reg_names[77][0], \
02422 &rs6000_reg_names[78][0], \
02423 &rs6000_reg_names[79][0], \
02424 &rs6000_reg_names[80][0], \
02425 &rs6000_reg_names[81][0], \
02426 &rs6000_reg_names[82][0], \
02427 &rs6000_reg_names[83][0], \
02428 &rs6000_reg_names[84][0], \
02429 &rs6000_reg_names[85][0], \
02430 &rs6000_reg_names[86][0], \
02431 &rs6000_reg_names[87][0], \
02432 &rs6000_reg_names[88][0], \
02433 &rs6000_reg_names[89][0], \
02434 &rs6000_reg_names[90][0], \
02435 &rs6000_reg_names[91][0], \
02436 &rs6000_reg_names[92][0], \
02437 &rs6000_reg_names[93][0], \
02438 &rs6000_reg_names[94][0], \
02439 &rs6000_reg_names[95][0], \
02440 &rs6000_reg_names[96][0], \
02441 &rs6000_reg_names[97][0], \
02442 &rs6000_reg_names[98][0], \
02443 &rs6000_reg_names[99][0], \
02444 &rs6000_reg_names[100][0], \
02445 &rs6000_reg_names[101][0], \
02446 &rs6000_reg_names[102][0], \
02447 &rs6000_reg_names[103][0], \
02448 &rs6000_reg_names[104][0], \
02449 &rs6000_reg_names[105][0], \
02450 &rs6000_reg_names[106][0], \
02451 &rs6000_reg_names[107][0], \
02452 &rs6000_reg_names[108][0], \
02453 &rs6000_reg_names[109][0], \
02454 &rs6000_reg_names[110][0], \
02455 &rs6000_reg_names[111][0], \
02456 &rs6000_reg_names[112][0], \
02457 }
02458
02459
02460
02461 #define ADDITIONAL_REGISTER_NAMES \
02462 {{"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3}, \
02463 {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7}, \
02464 {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11}, \
02465 {"r12", 12}, {"r13", 13}, {"r14", 14}, {"r15", 15}, \
02466 {"r16", 16}, {"r17", 17}, {"r18", 18}, {"r19", 19}, \
02467 {"r20", 20}, {"r21", 21}, {"r22", 22}, {"r23", 23}, \
02468 {"r24", 24}, {"r25", 25}, {"r26", 26}, {"r27", 27}, \
02469 {"r28", 28}, {"r29", 29}, {"r30", 30}, {"r31", 31}, \
02470 {"fr0", 32}, {"fr1", 33}, {"fr2", 34}, {"fr3", 35}, \
02471 {"fr4", 36}, {"fr5", 37}, {"fr6", 38}, {"fr7", 39}, \
02472 {"fr8", 40}, {"fr9", 41}, {"fr10", 42}, {"fr11", 43}, \
02473 {"fr12", 44}, {"fr13", 45}, {"fr14", 46}, {"fr15", 47}, \
02474 {"fr16", 48}, {"fr17", 49}, {"fr18", 50}, {"fr19", 51}, \
02475 {"fr20", 52}, {"fr21", 53}, {"fr22", 54}, {"fr23", 55}, \
02476 {"fr24", 56}, {"fr25", 57}, {"fr26", 58}, {"fr27", 59}, \
02477 {"fr28", 60}, {"fr29", 61}, {"fr30", 62}, {"fr31", 63}, \
02478 {"v0", 77}, {"v1", 78}, {"v2", 79}, {"v3", 80}, \
02479 {"v4", 81}, {"v5", 82}, {"v6", 83}, {"v7", 84}, \
02480 {"v8", 85}, {"v9", 86}, {"v10", 87}, {"v11", 88}, \
02481 {"v12", 89}, {"v13", 90}, {"v14", 91}, {"v15", 92}, \
02482 {"v16", 93}, {"v17", 94}, {"v18", 95}, {"v19", 96}, \
02483 {"v20", 97}, {"v21", 98}, {"v22", 99}, {"v23", 100}, \
02484 {"v24", 101},{"v25", 102},{"v26", 103},{"v27", 104}, \
02485 {"v28", 105},{"v29", 106},{"v30", 107},{"v31", 108}, \
02486 {"vrsave", 109}, {"vscr", 110}, \
02487 {"spe_acc", 111}, {"spefscr", 112}, \
02488 \
02489 {"cr0", 68}, {"cr1", 69}, {"cr2", 70}, {"cr3", 71}, \
02490 {"cr4", 72}, {"cr5", 73}, {"cr6", 74}, {"cr7", 75}, \
02491 {"cc", 68}, {"sp", 1}, {"toc", 2} }
02492
02493
02494
02495 #define RS6000_CALL_GLUE "cror 31,31,31"
02496
02497
02498
02499 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
02500 do { char buf[100]; \
02501 fputs ("\t.long ", FILE); \
02502 ASM_GENERATE_INTERNAL_LABEL (buf, "L", VALUE); \
02503 assemble_name (FILE, buf); \
02504 putc ('-', FILE); \
02505 ASM_GENERATE_INTERNAL_LABEL (buf, "L", REL); \
02506 assemble_name (FILE, buf); \
02507 putc ('\n', FILE); \
02508 } while (0)
02509
02510
02511
02512
02513
02514 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
02515 if ((LOG) != 0) \
02516 fprintf (FILE, "\t.align %d\n", (LOG))
02517
02518
02519
02520
02521
02522 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
02523 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LINK_REGISTER_REGNUM)
02524
02525
02526 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 3 : INVALID_REGNUM)
02527 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 10)
02528
02529
02530
02531
02532
02533 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
02534
02535
02536
02537 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
02538 ((CODE) == '.' || (CODE) == '&')
02539
02540
02541
02542 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
02543
02544
02545
02546 #define PREDICATE_CODES \
02547 {"any_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \
02548 LABEL_REF, SUBREG, REG, MEM}}, \
02549 {"any_parallel_operand", {PARALLEL}}, \
02550 {"zero_constant", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \
02551 LABEL_REF, SUBREG, REG, MEM}}, \
02552 {"short_cint_operand", {CONST_INT}}, \
02553 {"u_short_cint_operand", {CONST_INT}}, \
02554 {"non_short_cint_operand", {CONST_INT}}, \
02555 {"exact_log2_cint_operand", {CONST_INT}}, \
02556 {"gpc_reg_operand", {SUBREG, REG}}, \
02557 {"cc_reg_operand", {SUBREG, REG}}, \
02558 {"cc_reg_not_cr0_operand", {SUBREG, REG}}, \
02559 {"reg_or_short_operand", {SUBREG, REG, CONST_INT}}, \
02560 {"reg_or_neg_short_operand", {SUBREG, REG, CONST_INT}}, \
02561 {"reg_or_aligned_short_operand", {SUBREG, REG, CONST_INT}}, \
02562 {"reg_or_u_short_operand", {SUBREG, REG, CONST_INT}}, \
02563 {"reg_or_cint_operand", {SUBREG, REG, CONST_INT}}, \
02564 {"reg_or_arith_cint_operand", {SUBREG, REG, CONST_INT}}, \
02565 {"reg_or_add_cint64_operand", {SUBREG, REG, CONST_INT}}, \
02566 {"reg_or_sub_cint64_operand", {SUBREG, REG, CONST_INT}}, \
02567 {"reg_or_logical_cint_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
02568 {"got_operand", {SYMBOL_REF, CONST, LABEL_REF}}, \
02569 {"got_no_const_operand", {SYMBOL_REF, LABEL_REF}}, \
02570 {"easy_fp_constant", {CONST_DOUBLE}}, \
02571 {"easy_vector_constant", {CONST_VECTOR}}, \
02572 {"easy_vector_constant_add_self", {CONST_VECTOR}}, \
02573 {"zero_fp_constant", {CONST_DOUBLE}}, \
02574 {"reg_or_mem_operand", {SUBREG, MEM, REG}}, \
02575 {"lwa_operand", {SUBREG, MEM, REG}}, \
02576 {"volatile_mem_operand", {MEM}}, \
02577 {"offsettable_mem_operand", {MEM}}, \
02578 {"mem_or_easy_const_operand", {SUBREG, MEM, CONST_DOUBLE}}, \
02579 {"add_operand", {SUBREG, REG, CONST_INT}}, \
02580 {"non_add_cint_operand", {CONST_INT}}, \
02581 {"and_operand", {SUBREG, REG, CONST_INT}}, \
02582 {"and64_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
02583 {"and64_2_operand", {SUBREG, REG, CONST_INT}}, \
02584 {"logical_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
02585 {"non_logical_cint_operand", {CONST_INT, CONST_DOUBLE}}, \
02586 {"mask_operand", {CONST_INT}}, \
02587 {"mask_operand_wrap", {CONST_INT}}, \
02588 {"mask64_operand", {CONST_INT}}, \
02589 {"mask64_2_operand", {CONST_INT}}, \
02590 {"count_register_operand", {REG}}, \
02591 {"xer_operand", {REG}}, \
02592 {"symbol_ref_operand", {SYMBOL_REF}}, \
02593 {"rs6000_tls_symbol_ref", {SYMBOL_REF}}, \
02594 {"call_operand", {SYMBOL_REF, REG}}, \
02595 {"current_file_function_operand", {SYMBOL_REF}}, \
02596 {"input_operand", {SUBREG, MEM, REG, CONST_INT, \
02597 CONST_DOUBLE, SYMBOL_REF}}, \
02598 {"rs6000_nonimmediate_operand", {SUBREG, MEM, REG}}, \
02599 {"load_multiple_operation", {PARALLEL}}, \
02600 {"store_multiple_operation", {PARALLEL}}, \
02601 {"lmw_operation", {PARALLEL}}, \
02602 {"stmw_operation", {PARALLEL}}, \
02603 {"vrsave_operation", {PARALLEL}}, \
02604 {"save_world_operation", {PARALLEL}}, \
02605 {"restore_world_operation", {PARALLEL}}, \
02606 {"mfcr_operation", {PARALLEL}}, \
02607 {"mtcrf_operation", {PARALLEL}}, \
02608 {"branch_comparison_operator", {EQ, NE, LE, LT, GE, \
02609 GT, LEU, LTU, GEU, GTU, \
02610 UNORDERED, ORDERED, \
02611 UNGE, UNLE }}, \
02612 {"branch_positive_comparison_operator", {EQ, LT, GT, LTU, GTU, \
02613 UNORDERED }}, \
02614 {"scc_comparison_operator", {EQ, NE, LE, LT, GE, \
02615 GT, LEU, LTU, GEU, GTU, \
02616 UNORDERED, ORDERED, \
02617 UNGE, UNLE }}, \
02618 {"trap_comparison_operator", {EQ, NE, LE, LT, GE, \
02619 GT, LEU, LTU, GEU, GTU}}, \
02620 {"boolean_operator", {AND, IOR, XOR}}, \
02621 {"boolean_or_operator", {IOR, XOR}}, \
02622 {"altivec_register_operand", {REG}}, \
02623 {"min_max_operator", {SMIN, SMAX, UMIN, UMAX}},
02624
02625
02626
02627
02628
02629
02630
02631 extern int flag_pic;
02632 extern int optimize;
02633 extern int flag_expensive_optimizations;
02634 extern int frame_pointer_needed;
02635
02636 enum rs6000_builtins
02637 {
02638
02639 ALTIVEC_BUILTIN_ST_INTERNAL_4si,
02640 ALTIVEC_BUILTIN_LD_INTERNAL_4si,
02641 ALTIVEC_BUILTIN_ST_INTERNAL_8hi,
02642 ALTIVEC_BUILTIN_LD_INTERNAL_8hi,
02643 ALTIVEC_BUILTIN_ST_INTERNAL_16qi,
02644 ALTIVEC_BUILTIN_LD_INTERNAL_16qi,
02645 ALTIVEC_BUILTIN_ST_INTERNAL_4sf,
02646 ALTIVEC_BUILTIN_LD_INTERNAL_4sf,
02647 ALTIVEC_BUILTIN_VADDUBM,
02648 ALTIVEC_BUILTIN_VADDUHM,
02649 ALTIVEC_BUILTIN_VADDUWM,
02650 ALTIVEC_BUILTIN_VADDFP,
02651 ALTIVEC_BUILTIN_VADDCUW,
02652 ALTIVEC_BUILTIN_VADDUBS,
02653 ALTIVEC_BUILTIN_VADDSBS,
02654 ALTIVEC_BUILTIN_VADDUHS,
02655 ALTIVEC_BUILTIN_VADDSHS,
02656 ALTIVEC_BUILTIN_VADDUWS,
02657 ALTIVEC_BUILTIN_VADDSWS,
02658 ALTIVEC_BUILTIN_VAND,
02659 ALTIVEC_BUILTIN_VANDC,
02660 ALTIVEC_BUILTIN_VAVGUB,
02661 ALTIVEC_BUILTIN_VAVGSB,
02662 ALTIVEC_BUILTIN_VAVGUH,
02663 ALTIVEC_BUILTIN_VAVGSH,
02664 ALTIVEC_BUILTIN_VAVGUW,
02665 ALTIVEC_BUILTIN_VAVGSW,
02666 ALTIVEC_BUILTIN_VCFUX,
02667 ALTIVEC_BUILTIN_VCFSX,
02668 ALTIVEC_BUILTIN_VCTSXS,
02669 ALTIVEC_BUILTIN_VCTUXS,
02670 ALTIVEC_BUILTIN_VCMPBFP,
02671 ALTIVEC_BUILTIN_VCMPEQUB,
02672 ALTIVEC_BUILTIN_VCMPEQUH,
02673 ALTIVEC_BUILTIN_VCMPEQUW,
02674 ALTIVEC_BUILTIN_VCMPEQFP,
02675 ALTIVEC_BUILTIN_VCMPGEFP,
02676 ALTIVEC_BUILTIN_VCMPGTUB,
02677 ALTIVEC_BUILTIN_VCMPGTSB,
02678 ALTIVEC_BUILTIN_VCMPGTUH,
02679 ALTIVEC_BUILTIN_VCMPGTSH,
02680 ALTIVEC_BUILTIN_VCMPGTUW,
02681 ALTIVEC_BUILTIN_VCMPGTSW,
02682 ALTIVEC_BUILTIN_VCMPGTFP,
02683 ALTIVEC_BUILTIN_VEXPTEFP,
02684 ALTIVEC_BUILTIN_VLOGEFP,
02685 ALTIVEC_BUILTIN_VMADDFP,
02686 ALTIVEC_BUILTIN_VMAXUB,
02687 ALTIVEC_BUILTIN_VMAXSB,
02688 ALTIVEC_BUILTIN_VMAXUH,
02689 ALTIVEC_BUILTIN_VMAXSH,
02690 ALTIVEC_BUILTIN_VMAXUW,
02691 ALTIVEC_BUILTIN_VMAXSW,
02692 ALTIVEC_BUILTIN_VMAXFP,
02693 ALTIVEC_BUILTIN_VMHADDSHS,
02694 ALTIVEC_BUILTIN_VMHRADDSHS,
02695 ALTIVEC_BUILTIN_VMLADDUHM,
02696 ALTIVEC_BUILTIN_VMRGHB,
02697 ALTIVEC_BUILTIN_VMRGHH,
02698 ALTIVEC_BUILTIN_VMRGHW,
02699 ALTIVEC_BUILTIN_VMRGLB,
02700 ALTIVEC_BUILTIN_VMRGLH,
02701 ALTIVEC_BUILTIN_VMRGLW,
02702 ALTIVEC_BUILTIN_VMSUMUBM,
02703 ALTIVEC_BUILTIN_VMSUMMBM,
02704 ALTIVEC_BUILTIN_VMSUMUHM,
02705 ALTIVEC_BUILTIN_VMSUMSHM,
02706 ALTIVEC_BUILTIN_VMSUMUHS,
02707 ALTIVEC_BUILTIN_VMSUMSHS,
02708 ALTIVEC_BUILTIN_VMINUB,
02709 ALTIVEC_BUILTIN_VMINSB,
02710 ALTIVEC_BUILTIN_VMINUH,
02711 ALTIVEC_BUILTIN_VMINSH,
02712 ALTIVEC_BUILTIN_VMINUW,
02713 ALTIVEC_BUILTIN_VMINSW,
02714 ALTIVEC_BUILTIN_VMINFP,
02715 ALTIVEC_BUILTIN_VMULEUB,
02716 ALTIVEC_BUILTIN_VMULESB,
02717 ALTIVEC_BUILTIN_VMULEUH,
02718 ALTIVEC_BUILTIN_VMULESH,
02719 ALTIVEC_BUILTIN_VMULOUB,
02720 ALTIVEC_BUILTIN_VMULOSB,
02721 ALTIVEC_BUILTIN_VMULOUH,
02722 ALTIVEC_BUILTIN_VMULOSH,
02723 ALTIVEC_BUILTIN_VNMSUBFP,
02724 ALTIVEC_BUILTIN_VNOR,
02725 ALTIVEC_BUILTIN_VOR,
02726 ALTIVEC_BUILTIN_VSEL_4SI,
02727 ALTIVEC_BUILTIN_VSEL_4SF,
02728 ALTIVEC_BUILTIN_VSEL_8HI,
02729 ALTIVEC_BUILTIN_VSEL_16QI,
02730 ALTIVEC_BUILTIN_VPERM_4SI,
02731 ALTIVEC_BUILTIN_VPERM_4SF,
02732 ALTIVEC_BUILTIN_VPERM_8HI,
02733 ALTIVEC_BUILTIN_VPERM_16QI,
02734 ALTIVEC_BUILTIN_VPKUHUM,
02735 ALTIVEC_BUILTIN_VPKUWUM,
02736 ALTIVEC_BUILTIN_VPKPX,
02737 ALTIVEC_BUILTIN_VPKUHSS,
02738 ALTIVEC_BUILTIN_VPKSHSS,
02739 ALTIVEC_BUILTIN_VPKUWSS,
02740 ALTIVEC_BUILTIN_VPKSWSS,
02741 ALTIVEC_BUILTIN_VPKUHUS,
02742 ALTIVEC_BUILTIN_VPKSHUS,
02743 ALTIVEC_BUILTIN_VPKUWUS,
02744 ALTIVEC_BUILTIN_VPKSWUS,
02745 ALTIVEC_BUILTIN_VREFP,
02746 ALTIVEC_BUILTIN_VRFIM,
02747 ALTIVEC_BUILTIN_VRFIN,
02748 ALTIVEC_BUILTIN_VRFIP,
02749 ALTIVEC_BUILTIN_VRFIZ,
02750 ALTIVEC_BUILTIN_VRLB,
02751 ALTIVEC_BUILTIN_VRLH,
02752 ALTIVEC_BUILTIN_VRLW,
02753 ALTIVEC_BUILTIN_VRSQRTEFP,
02754 ALTIVEC_BUILTIN_VSLB,
02755 ALTIVEC_BUILTIN_VSLH,
02756 ALTIVEC_BUILTIN_VSLW,
02757 ALTIVEC_BUILTIN_VSL,
02758 ALTIVEC_BUILTIN_VSLO,
02759 ALTIVEC_BUILTIN_VSPLTB,
02760 ALTIVEC_BUILTIN_VSPLTH,
02761 ALTIVEC_BUILTIN_VSPLTW,
02762 ALTIVEC_BUILTIN_VSPLTISB,
02763 ALTIVEC_BUILTIN_VSPLTISH,
02764 ALTIVEC_BUILTIN_VSPLTISW,
02765 ALTIVEC_BUILTIN_VSRB,
02766 ALTIVEC_BUILTIN_VSRH,
02767 ALTIVEC_BUILTIN_VSRW,
02768 ALTIVEC_BUILTIN_VSRAB,
02769 ALTIVEC_BUILTIN_VSRAH,
02770 ALTIVEC_BUILTIN_VSRAW,
02771 ALTIVEC_BUILTIN_VSR,
02772 ALTIVEC_BUILTIN_VSRO,
02773 ALTIVEC_BUILTIN_VSUBUBM,
02774 ALTIVEC_BUILTIN_VSUBUHM,
02775 ALTIVEC_BUILTIN_VSUBUWM,
02776 ALTIVEC_BUILTIN_VSUBFP,
02777 ALTIVEC_BUILTIN_VSUBCUW,
02778 ALTIVEC_BUILTIN_VSUBUBS,
02779 ALTIVEC_BUILTIN_VSUBSBS,
02780 ALTIVEC_BUILTIN_VSUBUHS,
02781 ALTIVEC_BUILTIN_VSUBSHS,
02782 ALTIVEC_BUILTIN_VSUBUWS,
02783 ALTIVEC_BUILTIN_VSUBSWS,
02784 ALTIVEC_BUILTIN_VSUM4UBS,
02785 ALTIVEC_BUILTIN_VSUM4SBS,
02786 ALTIVEC_BUILTIN_VSUM4SHS,
02787 ALTIVEC_BUILTIN_VSUM2SWS,
02788 ALTIVEC_BUILTIN_VSUMSWS,
02789 ALTIVEC_BUILTIN_VXOR,
02790 ALTIVEC_BUILTIN_VSLDOI_16QI,
02791 ALTIVEC_BUILTIN_VSLDOI_8HI,
02792 ALTIVEC_BUILTIN_VSLDOI_4SI,
02793 ALTIVEC_BUILTIN_VSLDOI_4SF,
02794 ALTIVEC_BUILTIN_VUPKHSB,
02795 ALTIVEC_BUILTIN_VUPKHPX,
02796 ALTIVEC_BUILTIN_VUPKHSH,
02797 ALTIVEC_BUILTIN_VUPKLSB,
02798 ALTIVEC_BUILTIN_VUPKLPX,
02799 ALTIVEC_BUILTIN_VUPKLSH,
02800 ALTIVEC_BUILTIN_MTVSCR,
02801 ALTIVEC_BUILTIN_MFVSCR,
02802 ALTIVEC_BUILTIN_DSSALL,
02803 ALTIVEC_BUILTIN_DSS,
02804 ALTIVEC_BUILTIN_LVSL,
02805 ALTIVEC_BUILTIN_LVSR,
02806 ALTIVEC_BUILTIN_DSTT,
02807 ALTIVEC_BUILTIN_DSTST,
02808 ALTIVEC_BUILTIN_DSTSTT,
02809 ALTIVEC_BUILTIN_DST,
02810 ALTIVEC_BUILTIN_LVEBX,
02811 ALTIVEC_BUILTIN_LVEHX,
02812 ALTIVEC_BUILTIN_LVEWX,
02813 ALTIVEC_BUILTIN_LVXL,
02814 ALTIVEC_BUILTIN_LVX,
02815 ALTIVEC_BUILTIN_STVX,
02816 ALTIVEC_BUILTIN_STVEBX,
02817 ALTIVEC_BUILTIN_STVEHX,
02818 ALTIVEC_BUILTIN_STVEWX,
02819 ALTIVEC_BUILTIN_STVXL,
02820 ALTIVEC_BUILTIN_VCMPBFP_P,
02821 ALTIVEC_BUILTIN_VCMPEQFP_P,
02822 ALTIVEC_BUILTIN_VCMPEQUB_P,
02823 ALTIVEC_BUILTIN_VCMPEQUH_P,
02824 ALTIVEC_BUILTIN_VCMPEQUW_P,
02825 ALTIVEC_BUILTIN_VCMPGEFP_P,
02826 ALTIVEC_BUILTIN_VCMPGTFP_P,
02827 ALTIVEC_BUILTIN_VCMPGTSB_P,
02828 ALTIVEC_BUILTIN_VCMPGTSH_P,
02829 ALTIVEC_BUILTIN_VCMPGTSW_P,
02830 ALTIVEC_BUILTIN_VCMPGTUB_P,
02831 ALTIVEC_BUILTIN_VCMPGTUH_P,
02832 ALTIVEC_BUILTIN_VCMPGTUW_P,
02833 ALTIVEC_BUILTIN_ABSS_V4SI,
02834 ALTIVEC_BUILTIN_ABSS_V8HI,
02835 ALTIVEC_BUILTIN_ABSS_V16QI,
02836 ALTIVEC_BUILTIN_ABS_V4SI,
02837 ALTIVEC_BUILTIN_ABS_V4SF,
02838 ALTIVEC_BUILTIN_ABS_V8HI,
02839 ALTIVEC_BUILTIN_ABS_V16QI,
02840 ALTIVEC_BUILTIN_COMPILETIME_ERROR,
02841 ALTIVEC_BUILTIN_MASK_FOR_LOAD,
02842 ALTIVEC_BUILTIN_MASK_FOR_STORE,
02843
02844
02845 SPE_BUILTIN_EVADDW,
02846 SPE_BUILTIN_EVAND,
02847 SPE_BUILTIN_EVANDC,
02848 SPE_BUILTIN_EVDIVWS,
02849 SPE_BUILTIN_EVDIVWU,
02850 SPE_BUILTIN_EVEQV,
02851 SPE_BUILTIN_EVFSADD,
02852 SPE_BUILTIN_EVFSDIV,
02853 SPE_BUILTIN_EVFSMUL,
02854 SPE_BUILTIN_EVFSSUB,
02855 SPE_BUILTIN_EVLDDX,
02856 SPE_BUILTIN_EVLDHX,
02857 SPE_BUILTIN_EVLDWX,
02858 SPE_BUILTIN_EVLHHESPLATX,
02859 SPE_BUILTIN_EVLHHOSSPLATX,
02860 SPE_BUILTIN_EVLHHOUSPLATX,
02861 SPE_BUILTIN_EVLWHEX,
02862 SPE_BUILTIN_EVLWHOSX,
02863 SPE_BUILTIN_EVLWHOUX,
02864 SPE_BUILTIN_EVLWHSPLATX,
02865 SPE_BUILTIN_EVLWWSPLATX,
02866 SPE_BUILTIN_EVMERGEHI,
02867 SPE_BUILTIN_EVMERGEHILO,
02868 SPE_BUILTIN_EVMERGELO,
02869 SPE_BUILTIN_EVMERGELOHI,
02870 SPE_BUILTIN_EVMHEGSMFAA,
02871 SPE_BUILTIN_EVMHEGSMFAN,
02872 SPE_BUILTIN_EVMHEGSMIAA,
02873 SPE_BUILTIN_EVMHEGSMIAN,
02874 SPE_BUILTIN_EVMHEGUMIAA,
02875 SPE_BUILTIN_EVMHEGUMIAN,
02876 SPE_BUILTIN_EVMHESMF,
02877 SPE_BUILTIN_EVMHESMFA,
02878 SPE_BUILTIN_EVMHESMFAAW,
02879 SPE_BUILTIN_EVMHESMFANW,
02880 SPE_BUILTIN_EVMHESMI,
02881 SPE_BUILTIN_EVMHESMIA,
02882 SPE_BUILTIN_EVMHESMIAAW,
02883 SPE_BUILTIN_EVMHESMIANW,
02884 SPE_BUILTIN_EVMHESSF,
02885 SPE_BUILTIN_EVMHESSFA,
02886 SPE_BUILTIN_EVMHESSFAAW,
02887 SPE_BUILTIN_EVMHESSFANW,
02888 SPE_BUILTIN_EVMHESSIAAW,
02889 SPE_BUILTIN_EVMHESSIANW,
02890 SPE_BUILTIN_EVMHEUMI,
02891 SPE_BUILTIN_EVMHEUMIA,
02892 SPE_BUILTIN_EVMHEUMIAAW,
02893 SPE_BUILTIN_EVMHEUMIANW,
02894 SPE_BUILTIN_EVMHEUSIAAW,
02895 SPE_BUILTIN_EVMHEUSIANW,
02896 SPE_BUILTIN_EVMHOGSMFAA,
02897 SPE_BUILTIN_EVMHOGSMFAN,
02898 SPE_BUILTIN_EVMHOGSMIAA,
02899 SPE_BUILTIN_EVMHOGSMIAN,
02900 SPE_BUILTIN_EVMHOGUMIAA,
02901 SPE_BUILTIN_EVMHOGUMIAN,
02902 SPE_BUILTIN_EVMHOSMF,
02903 SPE_BUILTIN_EVMHOSMFA,
02904 SPE_BUILTIN_EVMHOSMFAAW,
02905 SPE_BUILTIN_EVMHOSMFANW,
02906 SPE_BUILTIN_EVMHOSMI,
02907 SPE_BUILTIN_EVMHOSMIA,
02908 SPE_BUILTIN_EVMHOSMIAAW,
02909 SPE_BUILTIN_EVMHOSMIANW,
02910 SPE_BUILTIN_EVMHOSSF,
02911 SPE_BUILTIN_EVMHOSSFA,
02912 SPE_BUILTIN_EVMHOSSFAAW,
02913 SPE_BUILTIN_EVMHOSSFANW,
02914 SPE_BUILTIN_EVMHOSSIAAW,
02915 SPE_BUILTIN_EVMHOSSIANW,
02916 SPE_BUILTIN_EVMHOUMI,
02917 SPE_BUILTIN_EVMHOUMIA,
02918 SPE_BUILTIN_EVMHOUMIAAW,
02919 SPE_BUILTIN_EVMHOUMIANW,
02920 SPE_BUILTIN_EVMHOUSIAAW,
02921 SPE_BUILTIN_EVMHOUSIANW,
02922 SPE_BUILTIN_EVMWHSMF,
02923 SPE_BUILTIN_EVMWHSMFA,
02924 SPE_BUILTIN_EVMWHSMI,
02925 SPE_BUILTIN_EVMWHSMIA,
02926 SPE_BUILTIN_EVMWHSSF,
02927 SPE_BUILTIN_EVMWHSSFA,
02928 SPE_BUILTIN_EVMWHUMI,
02929 SPE_BUILTIN_EVMWHUMIA,
02930 SPE_BUILTIN_EVMWLSMIAAW,
02931 SPE_BUILTIN_EVMWLSMIANW,
02932 SPE_BUILTIN_EVMWLSSIAAW,
02933 SPE_BUILTIN_EVMWLSSIANW,
02934 SPE_BUILTIN_EVMWLUMI,
02935 SPE_BUILTIN_EVMWLUMIA,
02936 SPE_BUILTIN_EVMWLUMIAAW,
02937 SPE_BUILTIN_EVMWLUMIANW,
02938 SPE_BUILTIN_EVMWLUSIAAW,
02939 SPE_BUILTIN_EVMWLUSIANW,
02940 SPE_BUILTIN_EVMWSMF,
02941 SPE_BUILTIN_EVMWSMFA,
02942 SPE_BUILTIN_EVMWSMFAA,
02943 SPE_BUILTIN_EVMWSMFAN,
02944 SPE_BUILTIN_EVMWSMI,
02945 SPE_BUILTIN_EVMWSMIA,
02946 SPE_BUILTIN_EVMWSMIAA,
02947 SPE_BUILTIN_EVMWSMIAN,
02948 SPE_BUILTIN_EVMWHSSFAA,
02949 SPE_BUILTIN_EVMWSSF,
02950 SPE_BUILTIN_EVMWSSFA,
02951 SPE_BUILTIN_EVMWSSFAA,
02952 SPE_BUILTIN_EVMWSSFAN,
02953 SPE_BUILTIN_EVMWUMI,
02954 SPE_BUILTIN_EVMWUMIA,
02955 SPE_BUILTIN_EVMWUMIAA,
02956 SPE_BUILTIN_EVMWUMIAN,
02957 SPE_BUILTIN_EVNAND,
02958 SPE_BUILTIN_EVNOR,
02959 SPE_BUILTIN_EVOR,
02960 SPE_BUILTIN_EVORC,
02961 SPE_BUILTIN_EVRLW,
02962 SPE_BUILTIN_EVSLW,
02963 SPE_BUILTIN_EVSRWS,
02964 SPE_BUILTIN_EVSRWU,
02965 SPE_BUILTIN_EVSTDDX,
02966 SPE_BUILTIN_EVSTDHX,
02967 SPE_BUILTIN_EVSTDWX,
02968 SPE_BUILTIN_EVSTWHEX,
02969 SPE_BUILTIN_EVSTWHOX,
02970 SPE_BUILTIN_EVSTWWEX,
02971 SPE_BUILTIN_EVSTWWOX,
02972 SPE_BUILTIN_EVSUBFW,
02973 SPE_BUILTIN_EVXOR,
02974 SPE_BUILTIN_EVABS,
02975 SPE_BUILTIN_EVADDSMIAAW,
02976 SPE_BUILTIN_EVADDSSIAAW,
02977 SPE_BUILTIN_EVADDUMIAAW,
02978 SPE_BUILTIN_EVADDUSIAAW,
02979 SPE_BUILTIN_EVCNTLSW,
02980 SPE_BUILTIN_EVCNTLZW,
02981 SPE_BUILTIN_EVEXTSB,
02982 SPE_BUILTIN_EVEXTSH,
02983 SPE_BUILTIN_EVFSABS,
02984 SPE_BUILTIN_EVFSCFSF,
02985 SPE_BUILTIN_EVFSCFSI,
02986 SPE_BUILTIN_EVFSCFUF,
02987 SPE_BUILTIN_EVFSCFUI,
02988 SPE_BUILTIN_EVFSCTSF,
02989 SPE_BUILTIN_EVFSCTSI,
02990 SPE_BUILTIN_EVFSCTSIZ,
02991 SPE_BUILTIN_EVFSCTUF,
02992 SPE_BUILTIN_EVFSCTUI,
02993 SPE_BUILTIN_EVFSCTUIZ,
02994 SPE_BUILTIN_EVFSNABS,
02995 SPE_BUILTIN_EVFSNEG,
02996 SPE_BUILTIN_EVMRA,
02997 SPE_BUILTIN_EVNEG,
02998 SPE_BUILTIN_EVRNDW,
02999 SPE_BUILTIN_EVSUBFSMIAAW,
03000 SPE_BUILTIN_EVSUBFSSIAAW,
03001 SPE_BUILTIN_EVSUBFUMIAAW,
03002 SPE_BUILTIN_EVSUBFUSIAAW,
03003 SPE_BUILTIN_EVADDIW,
03004 SPE_BUILTIN_EVLDD,
03005 SPE_BUILTIN_EVLDH,
03006 SPE_BUILTIN_EVLDW,
03007 SPE_BUILTIN_EVLHHESPLAT,
03008 SPE_BUILTIN_EVLHHOSSPLAT,
03009 SPE_BUILTIN_EVLHHOUSPLAT,
03010 SPE_BUILTIN_EVLWHE,
03011 SPE_BUILTIN_EVLWHOS,
03012 SPE_BUILTIN_EVLWHOU,
03013 SPE_BUILTIN_EVLWHSPLAT,
03014 SPE_BUILTIN_EVLWWSPLAT,
03015 SPE_BUILTIN_EVRLWI,
03016 SPE_BUILTIN_EVSLWI,
03017 SPE_BUILTIN_EVSRWIS,
03018 SPE_BUILTIN_EVSRWIU,
03019 SPE_BUILTIN_EVSTDD,
03020 SPE_BUILTIN_EVSTDH,
03021 SPE_BUILTIN_EVSTDW,
03022 SPE_BUILTIN_EVSTWHE,
03023 SPE_BUILTIN_EVSTWHO,
03024 SPE_BUILTIN_EVSTWWE,
03025 SPE_BUILTIN_EVSTWWO,
03026 SPE_BUILTIN_EVSUBIFW,
03027
03028
03029 SPE_BUILTIN_EVCMPEQ,
03030 SPE_BUILTIN_EVCMPGTS,
03031 SPE_BUILTIN_EVCMPGTU,
03032 SPE_BUILTIN_EVCMPLTS,
03033 SPE_BUILTIN_EVCMPLTU,
03034 SPE_BUILTIN_EVFSCMPEQ,
03035 SPE_BUILTIN_EVFSCMPGT,
03036 SPE_BUILTIN_EVFSCMPLT,
03037 SPE_BUILTIN_EVFSTSTEQ,
03038 SPE_BUILTIN_EVFSTSTGT,
03039 SPE_BUILTIN_EVFSTSTLT,
03040
03041
03042 SPE_BUILTIN_EVSEL_CMPEQ,
03043 SPE_BUILTIN_EVSEL_CMPGTS,
03044 SPE_BUILTIN_EVSEL_CMPGTU,
03045 SPE_BUILTIN_EVSEL_CMPLTS,
03046 SPE_BUILTIN_EVSEL_CMPLTU,
03047 SPE_BUILTIN_EVSEL_FSCMPEQ,
03048 SPE_BUILTIN_EVSEL_FSCMPGT,
03049 SPE_BUILTIN_EVSEL_FSCMPLT,
03050 SPE_BUILTIN_EVSEL_FSTSTEQ,
03051 SPE_BUILTIN_EVSEL_FSTSTGT,
03052 SPE_BUILTIN_EVSEL_FSTSTLT,
03053
03054 SPE_BUILTIN_EVSPLATFI,
03055 SPE_BUILTIN_EVSPLATI,
03056 SPE_BUILTIN_EVMWHSSMAA,
03057 SPE_BUILTIN_EVMWHSMFAA,
03058 SPE_BUILTIN_EVMWHSMIAA,
03059 SPE_BUILTIN_EVMWHUSIAA,
03060 SPE_BUILTIN_EVMWHUMIAA,
03061 SPE_BUILTIN_EVMWHSSFAN,
03062 SPE_BUILTIN_EVMWHSSIAN,
03063 SPE_BUILTIN_EVMWHSMFAN,
03064 SPE_BUILTIN_EVMWHSMIAN,
03065 SPE_BUILTIN_EVMWHUSIAN,
03066 SPE_BUILTIN_EVMWHUMIAN,
03067 SPE_BUILTIN_EVMWHGSSFAA,
03068 SPE_BUILTIN_EVMWHGSMFAA,
03069 SPE_BUILTIN_EVMWHGSMIAA,
03070 SPE_BUILTIN_EVMWHGUMIAA,
03071 SPE_BUILTIN_EVMWHGSSFAN,
03072 SPE_BUILTIN_EVMWHGSMFAN,
03073 SPE_BUILTIN_EVMWHGSMIAN,
03074 SPE_BUILTIN_EVMWHGUMIAN,
03075 SPE_BUILTIN_MTSPEFSCR,
03076 SPE_BUILTIN_MFSPEFSCR,
03077 SPE_BUILTIN_BRINC
03078 };