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 #ifndef GCC_ARM_H
00027 #define GCC_ARM_H
00028
00029
00030 extern char arm_arch_name[];
00031
00032
00033 #define TARGET_CPU_CPP_BUILTINS() \
00034 do \
00035 { \
00036
00037 \
00038 builtin_define ("__arm__"); \
00039 builtin_define ("__APCS_32__"); \
00040 if (TARGET_THUMB) \
00041 builtin_define ("__thumb__"); \
00042 \
00043 if (TARGET_BIG_END) \
00044 { \
00045 builtin_define ("__ARMEB__"); \
00046 if (TARGET_THUMB) \
00047 builtin_define ("__THUMBEB__"); \
00048 if (TARGET_LITTLE_WORDS) \
00049 builtin_define ("__ARMWEL__"); \
00050 } \
00051 else \
00052 { \
00053 builtin_define ("__ARMEL__"); \
00054 if (TARGET_THUMB) \
00055 builtin_define ("__THUMBEL__"); \
00056 } \
00057 \
00058 if (TARGET_SOFT_FLOAT) \
00059 builtin_define ("__SOFTFP__"); \
00060 \
00061 if (TARGET_VFP) \
00062 builtin_define ("__VFP_FP__"); \
00063 \
00064
00065 \
00066 if (arm_cpp_interwork) \
00067 builtin_define ("__THUMB_INTERWORK__"); \
00068 \
00069 builtin_assert ("cpu=arm"); \
00070 builtin_assert ("machine=arm"); \
00071 \
00072 builtin_define (arm_arch_name); \
00073 if (arm_arch_cirrus) \
00074 builtin_define ("__MAVERICK__"); \
00075 if (arm_arch_xscale) \
00076 builtin_define ("__XSCALE__"); \
00077 if (arm_arch_iwmmxt) \
00078 builtin_define ("__IWMMXT__"); \
00079 if (TARGET_AAPCS_BASED) \
00080 builtin_define ("__ARM_EABI__"); \
00081 } while (0)
00082
00083
00084 enum processor_type
00085 {
00086 #define ARM_CORE(NAME, IDENT, ARCH, FLAGS, COSTS) \
00087 IDENT,
00088 #include "arm-cores.def"
00089 #undef ARM_CORE
00090
00091 arm_none
00092 };
00093
00094 enum target_cpus
00095 {
00096 #define ARM_CORE(NAME, IDENT, ARCH, FLAGS, COSTS) \
00097 TARGET_CPU_##IDENT,
00098 #include "arm-cores.def"
00099 #undef ARM_CORE
00100 TARGET_CPU_generic
00101 };
00102
00103
00104 extern enum processor_type arm_tune;
00105
00106 typedef enum arm_cond_code
00107 {
00108 ARM_EQ = 0, ARM_NE, ARM_CS, ARM_CC, ARM_MI, ARM_PL, ARM_VS, ARM_VC,
00109 ARM_HI, ARM_LS, ARM_GE, ARM_LT, ARM_GT, ARM_LE, ARM_AL, ARM_NV
00110 }
00111 arm_cc;
00112
00113 extern arm_cc arm_current_cc;
00114
00115 #define ARM_INVERSE_CONDITION_CODE(X) ((arm_cc) (((int)X) ^ 1))
00116
00117 extern int arm_target_label;
00118 extern int arm_ccfsm_state;
00119 extern GTY(()) rtx arm_target_insn;
00120
00121 extern int target_flags;
00122
00123 extern const char *target_fpu_name;
00124
00125 extern const char *target_fpe_name;
00126
00127 extern const char *target_float_abi_name;
00128
00129 extern const char *target_float_switch;
00130
00131 extern const char *target_abi_name;
00132
00133
00134 extern GTY(()) rtx arm_compare_op0;
00135 extern GTY(()) rtx arm_compare_op1;
00136
00137 extern rtx pool_vector_label;
00138
00139
00140 extern int return_used_this_function;
00141
00142 extern GTY(()) rtx aof_pic_label;
00143
00144
00145 #ifndef TARGET_CPU_DEFAULT
00146 #define TARGET_CPU_DEFAULT TARGET_CPU_generic
00147 #endif
00148
00149
00150 #undef CPP_SPEC
00151 #define CPP_SPEC "%(subtarget_cpp_spec) \
00152 %{msoft-float:%{mhard-float: \
00153 %e-msoft-float and -mhard_float may not be used together}} \
00154 %{mbig-endian:%{mlittle-endian: \
00155 %e-mbig-endian and -mlittle-endian may not be used together}}"
00156
00157 #ifndef CC1_SPEC
00158 #define CC1_SPEC ""
00159 #endif
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 #define EXTRA_SPECS \
00171 { "subtarget_cpp_spec", SUBTARGET_CPP_SPEC }, \
00172 SUBTARGET_EXTRA_SPECS
00173
00174 #ifndef SUBTARGET_EXTRA_SPECS
00175 #define SUBTARGET_EXTRA_SPECS
00176 #endif
00177
00178 #ifndef SUBTARGET_CPP_SPEC
00179 #define SUBTARGET_CPP_SPEC ""
00180 #endif
00181
00182
00183 #ifndef TARGET_VERSION
00184 #define TARGET_VERSION fputs (" (ARM/generic)", stderr);
00185 #endif
00186
00187
00188
00189 #define ARM_FLAG_APCS_FRAME (1 << 0)
00190
00191
00192
00193
00194
00195
00196 #define ARM_FLAG_POKE (1 << 1)
00197
00198
00199
00200 #define ARM_FLAG_FPE (1 << 2)
00201
00202
00203
00204
00205
00206 #define ARM_FLAG_APCS_STACK (1 << 4)
00207
00208
00209
00210 #define ARM_FLAG_APCS_FLOAT (1 << 5)
00211
00212
00213
00214 #define ARM_FLAG_APCS_REENT (1 << 6)
00215
00216
00217
00218
00219
00220 #define ARM_FLAG_BIG_END (1 << 9)
00221
00222
00223 #define ARM_FLAG_INTERWORK (1 << 10)
00224
00225
00226
00227 #define ARM_FLAG_LITTLE_WORDS (1 << 11)
00228
00229
00230 #define ARM_FLAG_NO_SCHED_PRO (1 << 12)
00231
00232
00233
00234 #define ARM_FLAG_ABORT_NORETURN (1 << 13)
00235
00236
00237 #define ARM_FLAG_SINGLE_PIC_BASE (1 << 14)
00238
00239
00240 #define ARM_FLAG_LONG_CALLS (1 << 15)
00241
00242
00243 #define ARM_FLAG_THUMB (1 << 16)
00244
00245
00246
00247 #define THUMB_FLAG_BACKTRACE (1 << 17)
00248
00249
00250
00251 #define THUMB_FLAG_LEAF_BACKTRACE (1 << 18)
00252
00253
00254
00255 #define THUMB_FLAG_CALLEE_SUPER_INTERWORKING (1 << 19)
00256
00257
00258
00259 #define THUMB_FLAG_CALLER_SUPER_INTERWORKING (1 << 20)
00260
00261
00262 #define CIRRUS_FIX_INVALID_INSNS (1 << 21)
00263
00264 #define TARGET_APCS_FRAME (target_flags & ARM_FLAG_APCS_FRAME)
00265 #define TARGET_POKE_FUNCTION_NAME (target_flags & ARM_FLAG_POKE)
00266 #define TARGET_FPE (target_flags & ARM_FLAG_FPE)
00267 #define TARGET_APCS_STACK (target_flags & ARM_FLAG_APCS_STACK)
00268 #define TARGET_APCS_FLOAT (target_flags & ARM_FLAG_APCS_FLOAT)
00269 #define TARGET_APCS_REENT (target_flags & ARM_FLAG_APCS_REENT)
00270 #define TARGET_SOFT_FLOAT (arm_float_abi == ARM_FLOAT_ABI_SOFT)
00271
00272 #define TARGET_HARD_FLOAT (arm_float_abi != ARM_FLOAT_ABI_SOFT)
00273
00274 #define TARGET_HARD_FLOAT_ABI (arm_float_abi == ARM_FLOAT_ABI_HARD)
00275 #define TARGET_FPA (arm_fp_model == ARM_FP_MODEL_FPA)
00276 #define TARGET_MAVERICK (arm_fp_model == ARM_FP_MODEL_MAVERICK)
00277 #define TARGET_VFP (arm_fp_model == ARM_FP_MODEL_VFP)
00278 #define TARGET_IWMMXT (arm_arch_iwmmxt)
00279 #define TARGET_REALLY_IWMMXT (TARGET_IWMMXT && TARGET_ARM)
00280 #define TARGET_IWMMXT_ABI (TARGET_ARM && arm_abi == ARM_ABI_IWMMXT)
00281 #define TARGET_BIG_END (target_flags & ARM_FLAG_BIG_END)
00282 #define TARGET_INTERWORK (target_flags & ARM_FLAG_INTERWORK)
00283 #define TARGET_LITTLE_WORDS (target_flags & ARM_FLAG_LITTLE_WORDS)
00284 #define TARGET_NO_SCHED_PRO (target_flags & ARM_FLAG_NO_SCHED_PRO)
00285 #define TARGET_ABORT_NORETURN (target_flags & ARM_FLAG_ABORT_NORETURN)
00286 #define TARGET_SINGLE_PIC_BASE (target_flags & ARM_FLAG_SINGLE_PIC_BASE)
00287 #define TARGET_LONG_CALLS (target_flags & ARM_FLAG_LONG_CALLS)
00288 #define TARGET_THUMB (target_flags & ARM_FLAG_THUMB)
00289 #define TARGET_ARM (! TARGET_THUMB)
00290 #define TARGET_EITHER 1
00291 #define TARGET_CALLEE_INTERWORKING (target_flags & THUMB_FLAG_CALLEE_SUPER_INTERWORKING)
00292 #define TARGET_CALLER_INTERWORKING (target_flags & THUMB_FLAG_CALLER_SUPER_INTERWORKING)
00293 #define TARGET_BACKTRACE (leaf_function_p () \
00294 ? (target_flags & THUMB_FLAG_LEAF_BACKTRACE) \
00295 : (target_flags & THUMB_FLAG_BACKTRACE))
00296 #define TARGET_CIRRUS_FIX_INVALID_INSNS (target_flags & CIRRUS_FIX_INVALID_INSNS)
00297 #define TARGET_LDRD (arm_arch5e && ARM_DOUBLEWORD_ALIGN)
00298 #define TARGET_AAPCS_BASED \
00299 (arm_abi != ARM_ABI_APCS && arm_abi != ARM_ABI_ATPCS)
00300
00301
00302
00303
00304
00305 #ifndef TARGET_BPABI
00306 #define TARGET_BPABI false
00307 #endif
00308
00309
00310 #ifndef SUBTARGET_SWITCHES
00311 #define SUBTARGET_SWITCHES
00312 #endif
00313
00314 #define TARGET_SWITCHES \
00315 { \
00316 {"apcs", ARM_FLAG_APCS_FRAME, "" }, \
00317 {"apcs-frame", ARM_FLAG_APCS_FRAME, \
00318 N_("Generate APCS conformant stack frames") }, \
00319 {"no-apcs-frame", -ARM_FLAG_APCS_FRAME, "" }, \
00320 {"poke-function-name", ARM_FLAG_POKE, \
00321 N_("Store function names in object code") }, \
00322 {"no-poke-function-name", -ARM_FLAG_POKE, "" }, \
00323 {"fpe", ARM_FLAG_FPE, "" }, \
00324 {"apcs-stack-check", ARM_FLAG_APCS_STACK, "" }, \
00325 {"no-apcs-stack-check", -ARM_FLAG_APCS_STACK, "" }, \
00326 {"apcs-float", ARM_FLAG_APCS_FLOAT, \
00327 N_("Pass FP arguments in FP registers") }, \
00328 {"no-apcs-float", -ARM_FLAG_APCS_FLOAT, "" }, \
00329 {"apcs-reentrant", ARM_FLAG_APCS_REENT, \
00330 N_("Generate re-entrant, PIC code") }, \
00331 {"no-apcs-reentrant", -ARM_FLAG_APCS_REENT, "" }, \
00332 {"big-endian", ARM_FLAG_BIG_END, \
00333 N_("Assume target CPU is configured as big endian") }, \
00334 {"little-endian", -ARM_FLAG_BIG_END, \
00335 N_("Assume target CPU is configured as little endian") }, \
00336 {"words-little-endian", ARM_FLAG_LITTLE_WORDS, \
00337 N_("Assume big endian bytes, little endian words") }, \
00338 {"thumb-interwork", ARM_FLAG_INTERWORK, \
00339 N_("Support calls between Thumb and ARM instruction sets") }, \
00340 {"no-thumb-interwork", -ARM_FLAG_INTERWORK, "" }, \
00341 {"abort-on-noreturn", ARM_FLAG_ABORT_NORETURN, \
00342 N_("Generate a call to abort if a noreturn function returns")}, \
00343 {"no-abort-on-noreturn", -ARM_FLAG_ABORT_NORETURN, "" }, \
00344 {"no-sched-prolog", ARM_FLAG_NO_SCHED_PRO, \
00345 N_("Do not move instructions into a function's prologue") }, \
00346 {"sched-prolog", -ARM_FLAG_NO_SCHED_PRO, "" }, \
00347 {"single-pic-base", ARM_FLAG_SINGLE_PIC_BASE, \
00348 N_("Do not load the PIC register in function prologues") }, \
00349 {"no-single-pic-base", -ARM_FLAG_SINGLE_PIC_BASE, "" }, \
00350 {"long-calls", ARM_FLAG_LONG_CALLS, \
00351 N_("Generate call insns as indirect calls, if necessary") }, \
00352 {"no-long-calls", -ARM_FLAG_LONG_CALLS, "" }, \
00353 {"thumb", ARM_FLAG_THUMB, \
00354 N_("Compile for the Thumb not the ARM") }, \
00355 {"no-thumb", -ARM_FLAG_THUMB, "" }, \
00356 {"arm", -ARM_FLAG_THUMB, "" }, \
00357 {"tpcs-frame", THUMB_FLAG_BACKTRACE, \
00358 N_("Thumb: Generate (non-leaf) stack frames even if not needed") }, \
00359 {"no-tpcs-frame", -THUMB_FLAG_BACKTRACE, "" }, \
00360 {"tpcs-leaf-frame", THUMB_FLAG_LEAF_BACKTRACE, \
00361 N_("Thumb: Generate (leaf) stack frames even if not needed") }, \
00362 {"no-tpcs-leaf-frame", -THUMB_FLAG_LEAF_BACKTRACE, "" }, \
00363 {"callee-super-interworking", THUMB_FLAG_CALLEE_SUPER_INTERWORKING, \
00364 N_("Thumb: Assume non-static functions may be called from ARM code") }, \
00365 {"no-callee-super-interworking", -THUMB_FLAG_CALLEE_SUPER_INTERWORKING, \
00366 "" }, \
00367 {"caller-super-interworking", THUMB_FLAG_CALLER_SUPER_INTERWORKING, \
00368 N_("Thumb: Assume function pointers may go to non-Thumb aware code") }, \
00369 {"no-caller-super-interworking", -THUMB_FLAG_CALLER_SUPER_INTERWORKING, \
00370 "" }, \
00371 {"cirrus-fix-invalid-insns", CIRRUS_FIX_INVALID_INSNS, \
00372 N_("Cirrus: Place NOPs to avoid invalid instruction combinations") }, \
00373 {"no-cirrus-fix-invalid-insns", -CIRRUS_FIX_INVALID_INSNS, \
00374 N_("Cirrus: Do not break up invalid instruction combinations with NOPs") },\
00375 SUBTARGET_SWITCHES \
00376 {"", TARGET_DEFAULT, "" } \
00377 }
00378
00379 #define TARGET_OPTIONS \
00380 { \
00381 {"cpu=", & arm_select[0].string, \
00382 N_("Specify the name of the target CPU"), 0}, \
00383 {"arch=", & arm_select[1].string, \
00384 N_("Specify the name of the target architecture"), 0}, \
00385 {"tune=", & arm_select[2].string, "", 0}, \
00386 {"fpe=", & target_fpe_name, "", 0}, \
00387 {"fp=", & target_fpe_name, "", 0}, \
00388 {"fpu=", & target_fpu_name, \
00389 N_("Specify the name of the target floating point hardware/format"), 0}, \
00390 {"float-abi=", & target_float_abi_name, \
00391 N_("Specify if floating point hardware should be used"), 0}, \
00392 {"structure-size-boundary=", & structure_size_string, \
00393 N_("Specify the minimum bit alignment of structures"), 0}, \
00394 {"pic-register=", & arm_pic_register_string, \
00395 N_("Specify the register to be used for PIC addressing"), 0}, \
00396 {"abi=", &target_abi_name, N_("Specify an ABI"), 0}, \
00397 {"soft-float", &target_float_switch, \
00398 N_("Alias for -mfloat-abi=soft"), "s"}, \
00399 {"hard-float", &target_float_switch, \
00400 N_("Alias for -mfloat-abi=hard"), "h"} \
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 #define OPTION_DEFAULT_SPECS \
00414 {"arch", "%{!march=*:%{!mcpu=*:-march=%(VALUE)}}" }, \
00415 {"cpu", "%{!march=*:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
00416 {"tune", "%{!mcpu=*:%{!mtune=*:-mtune=%(VALUE)}}" }, \
00417 {"float", \
00418 "%{!msoft-float:%{!mhard-float:%{!mfloat-abi=*:-mfloat-abi=%(VALUE)}}}" }, \
00419 {"fpu", "%{!mfpu=*:-mfpu=%(VALUE)}"}, \
00420 {"abi", "%{!mabi=*:-mabi=%(VALUE)}"},
00421
00422 struct arm_cpu_select
00423 {
00424 const char * string;
00425 const char * name;
00426 const struct processors * processors;
00427 };
00428
00429
00430
00431
00432 extern struct arm_cpu_select arm_select[];
00433
00434
00435 enum arm_fp_model
00436 {
00437 ARM_FP_MODEL_UNKNOWN,
00438
00439 ARM_FP_MODEL_FPA,
00440
00441 ARM_FP_MODEL_MAVERICK,
00442
00443 ARM_FP_MODEL_VFP
00444 };
00445
00446 extern enum arm_fp_model arm_fp_model;
00447
00448
00449
00450 enum fputype
00451 {
00452
00453 FPUTYPE_NONE,
00454
00455 FPUTYPE_FPA,
00456
00457 FPUTYPE_FPA_EMU2,
00458
00459 FPUTYPE_FPA_EMU3,
00460
00461 FPUTYPE_MAVERICK,
00462
00463 FPUTYPE_VFP
00464 };
00465
00466
00467 #define arm_fpu_attr ((enum attr_fpu) arm_fpu_tune)
00468
00469
00470 extern enum fputype arm_fpu_tune;
00471
00472
00473 extern enum fputype arm_fpu_arch;
00474
00475 enum float_abi_type
00476 {
00477 ARM_FLOAT_ABI_SOFT,
00478 ARM_FLOAT_ABI_SOFTFP,
00479 ARM_FLOAT_ABI_HARD
00480 };
00481
00482 extern enum float_abi_type arm_float_abi;
00483
00484 #ifndef TARGET_DEFAULT_FLOAT_ABI
00485 #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
00486 #endif
00487
00488
00489 enum arm_abi_type
00490 {
00491 ARM_ABI_APCS,
00492 ARM_ABI_ATPCS,
00493 ARM_ABI_AAPCS,
00494 ARM_ABI_IWMMXT
00495 };
00496
00497 extern enum arm_abi_type arm_abi;
00498
00499 #ifndef ARM_DEFAULT_ABI
00500 #define ARM_DEFAULT_ABI ARM_ABI_APCS
00501 #endif
00502
00503
00504 extern int arm_arch3m;
00505
00506
00507 extern int arm_arch4;
00508
00509
00510 extern int arm_arch4t;
00511
00512
00513 extern int arm_arch5;
00514
00515
00516 extern int arm_arch5e;
00517
00518
00519 extern int arm_arch6;
00520
00521
00522 extern int arm_ld_sched;
00523
00524
00525 extern int thumb_code;
00526
00527
00528 extern int arm_is_strong;
00529
00530
00531 extern int arm_arch_cirrus;
00532
00533
00534 extern int arm_arch_iwmmxt;
00535
00536
00537 extern int arm_arch_xscale;
00538
00539
00540 extern int arm_tune_xscale;
00541
00542
00543 extern int arm_is_6_or_7;
00544
00545
00546
00547
00548
00549
00550 extern int arm_cpp_interwork;
00551
00552 #ifndef TARGET_DEFAULT
00553 #define TARGET_DEFAULT (ARM_FLAG_APCS_FRAME)
00554 #endif
00555
00556
00557
00558 #define CAN_DEBUG_WITHOUT_FP
00559
00560 #define OVERRIDE_OPTIONS arm_override_options ()
00561
00562
00563
00564
00565 #ifndef NEED_GOT_RELOC
00566 #define NEED_GOT_RELOC 0
00567 #endif
00568 #ifndef NEED_PLT_RELOC
00569 #define NEED_PLT_RELOC 0
00570 #endif
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583 #ifndef GOT_PCREL
00584 #define GOT_PCREL 1
00585 #endif
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598 #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
00599 if (GET_MODE_CLASS (MODE) == MODE_INT \
00600 && GET_MODE_SIZE (MODE) < 4) \
00601 { \
00602 if (MODE == QImode) \
00603 UNSIGNEDP = 1; \
00604 else if (MODE == HImode) \
00605 UNSIGNEDP = 1; \
00606 (MODE) = SImode; \
00607 }
00608
00609 #define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE) \
00610 if (GET_MODE_CLASS (MODE) == MODE_INT \
00611 && GET_MODE_SIZE (MODE) < 4) \
00612 (MODE) = SImode; \
00613
00614
00615
00616 #define BITS_BIG_ENDIAN 0
00617
00618
00619
00620
00621
00622 #define BYTES_BIG_ENDIAN (TARGET_BIG_END != 0)
00623
00624
00625
00626
00627 #define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS)
00628
00629
00630
00631 #if defined(__ARMEB__) && !defined(__ARMWEL__)
00632 #define LIBGCC2_WORDS_BIG_ENDIAN 1
00633 #else
00634 #define LIBGCC2_WORDS_BIG_ENDIAN 0
00635 #endif
00636
00637
00638
00639
00640 #define FLOAT_WORDS_BIG_ENDIAN (arm_float_words_big_endian ())
00641
00642 #define UNITS_PER_WORD 4
00643
00644
00645 #define ARM_DOUBLEWORD_ALIGN TARGET_AAPCS_BASED
00646
00647 #define DOUBLEWORD_ALIGNMENT 64
00648
00649 #define PARM_BOUNDARY 32
00650
00651 #define STACK_BOUNDARY (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
00652
00653 #define PREFERRED_STACK_BOUNDARY \
00654 (arm_abi == ARM_ABI_ATPCS ? 64 : STACK_BOUNDARY)
00655
00656 #define FUNCTION_BOUNDARY 32
00657
00658
00659
00660
00661 #define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta
00662
00663 #define EMPTY_FIELD_BOUNDARY 32
00664
00665 #define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
00666
00667
00668
00669
00670 #ifdef IN_TARGET_LIBS
00671 #define BIGGEST_FIELD_ALIGNMENT 64
00672 #endif
00673
00674
00675 #define CONSTANT_ALIGNMENT_FACTOR (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2)
00676
00677 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
00678 ((TREE_CODE (EXP) == STRING_CST \
00679 && (ALIGN) < BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR) \
00680 ? BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR : (ALIGN))
00681
00682
00683
00684
00685
00686
00687
00688
00689 #define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
00690 extern int arm_structure_size_boundary;
00691
00692
00693
00694
00695
00696 #ifndef DEFAULT_STRUCTURE_SIZE_BOUNDARY
00697 #define DEFAULT_STRUCTURE_SIZE_BOUNDARY 32
00698 #endif
00699
00700
00701 extern const char * structure_size_string;
00702
00703
00704
00705 #define STRICT_ALIGNMENT 1
00706
00707
00708 #ifndef WCHAR_TYPE
00709 #define WCHAR_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "int")
00710
00711 #define WCHAR_TYPE_SIZE BITS_PER_WORD
00712 #endif
00713
00714 #ifndef SIZE_TYPE
00715 #define SIZE_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "long unsigned int")
00716 #endif
00717
00718
00719 #ifndef PCC_BITFIELD_TYPE_MATTERS
00720 #define PCC_BITFIELD_TYPE_MATTERS TARGET_AAPCS_BASED
00721 #endif
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
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
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794 #define FIXED_REGISTERS \
00795 { \
00796 0,0,0,0,0,0,0,0, \
00797 0,0,0,0,0,1,0,1, \
00798 0,0,0,0,0,0,0,0, \
00799 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 1,1,1,1,1,1,1,1, \
00804 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 1,1,1,1,1,1,1,1, \
00809 1 \
00810 }
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820 #define CALL_USED_REGISTERS \
00821 { \
00822 1,1,1,1,0,0,0,0, \
00823 0,0,0,0,1,1,1,1, \
00824 1,1,1,1,0,0,0,0, \
00825 1,1,1, \
00826 1,1,1,1,1,1,1,1, \
00827 1,1,1,1,1,1,1,1, \
00828 1,1,1,1,1,1,1,1, \
00829 1,1,1,1,1,1,1,1, \
00830 1,1,1,1, \
00831 1,1,1,1,1,1,1,1, \
00832 1,1,1,1,1,1,1,1, \
00833 1,1,1,1,1,1,1,1, \
00834 1,1,1,1,1,1,1,1, \
00835 1 \
00836 }
00837
00838 #ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE
00839 #define SUBTARGET_CONDITIONAL_REGISTER_USAGE
00840 #endif
00841
00842 #define CONDITIONAL_REGISTER_USAGE \
00843 { \
00844 int regno; \
00845 \
00846 if (TARGET_SOFT_FLOAT || TARGET_THUMB || !TARGET_FPA) \
00847 { \
00848 for (regno = FIRST_FPA_REGNUM; \
00849 regno <= LAST_FPA_REGNUM; ++regno) \
00850 fixed_regs[regno] = call_used_regs[regno] = 1; \
00851 } \
00852 \
00853 if (TARGET_THUMB && optimize_size) \
00854 { \
00855
00856
00857 \
00858 for (regno = FIRST_HI_REGNUM; \
00859 regno <= LAST_HI_REGNUM; ++regno) \
00860 fixed_regs[regno] = call_used_regs[regno] = 1; \
00861 } \
00862 \
00863
00864
00865 \
00866 if (TARGET_THUMB) \
00867 fixed_regs[LR_REGNUM] = call_used_regs[LR_REGNUM] = 1; \
00868 \
00869 if (TARGET_ARM && TARGET_HARD_FLOAT) \
00870 { \
00871 if (TARGET_MAVERICK) \
00872 { \
00873 for (regno = FIRST_FPA_REGNUM; \
00874 regno <= LAST_FPA_REGNUM; ++ regno) \
00875 fixed_regs[regno] = call_used_regs[regno] = 1; \
00876 for (regno = FIRST_CIRRUS_FP_REGNUM; \
00877 regno <= LAST_CIRRUS_FP_REGNUM; ++ regno) \
00878 { \
00879 fixed_regs[regno] = 0; \
00880 call_used_regs[regno] = regno < FIRST_CIRRUS_FP_REGNUM + 4; \
00881 } \
00882 } \
00883 if (TARGET_VFP) \
00884 { \
00885 for (regno = FIRST_VFP_REGNUM; \
00886 regno <= LAST_VFP_REGNUM; ++ regno) \
00887 { \
00888 fixed_regs[regno] = 0; \
00889 call_used_regs[regno] = regno < FIRST_VFP_REGNUM + 16; \
00890 } \
00891 } \
00892 } \
00893 \
00894 if (TARGET_REALLY_IWMMXT) \
00895 { \
00896 regno = FIRST_IWMMXT_GR_REGNUM; \
00897
00898
00899
00900 \
00901 for (regno = FIRST_IWMMXT_GR_REGNUM; \
00902 regno <= LAST_IWMMXT_GR_REGNUM; ++ regno) \
00903 fixed_regs[regno] = 0; \
00904
00905 \
00906 for (regno = FIRST_IWMMXT_REGNUM; \
00907 regno <= LAST_IWMMXT_REGNUM; ++ regno) \
00908 { \
00909 fixed_regs[regno] = 0; \
00910 call_used_regs[regno] = regno < FIRST_IWMMXT_REGNUM + 10; \
00911 } \
00912 } \
00913 \
00914 if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
00915 { \
00916 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00917 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00918 } \
00919 else if (TARGET_APCS_STACK) \
00920 { \
00921 fixed_regs[10] = 1; \
00922 call_used_regs[10] = 1; \
00923 } \
00924
00925
00926
00927 \
00928 if (TARGET_APCS_FRAME || TARGET_CALLER_INTERWORKING) \
00929 { \
00930 fixed_regs[ARM_HARD_FRAME_POINTER_REGNUM] = 1; \
00931 call_used_regs[ARM_HARD_FRAME_POINTER_REGNUM] = 1; \
00932 if (TARGET_CALLER_INTERWORKING) \
00933 global_regs[ARM_HARD_FRAME_POINTER_REGNUM] = 1; \
00934 } \
00935 SUBTARGET_CONDITIONAL_REGISTER_USAGE \
00936 }
00937
00938
00939
00940
00941
00942 #define ASM_FPRINTF_EXTENSIONS(FILE, ARGS, P) \
00943 case '@': \
00944 fputs (ASM_COMMENT_START, FILE); \
00945 break; \
00946 \
00947 case 'r': \
00948 fputs (REGISTER_PREFIX, FILE); \
00949 fputs (reg_names [va_arg (ARGS, int)], FILE); \
00950 break;
00951
00952
00953 #define ROUND_UP_WORD(X) (((X) + 3) & ~3)
00954
00955
00956 #define ARM_NUM_INTS(X) (((X) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00957
00958
00959
00960 #define ARM_NUM_REGS(MODE) \
00961 ARM_NUM_INTS (GET_MODE_SIZE (MODE))
00962
00963
00964 #define ARM_NUM_REGS2(MODE, TYPE) \
00965 ARM_NUM_INTS ((MODE) == BLKmode ? \
00966 int_size_in_bytes (TYPE) : GET_MODE_SIZE (MODE))
00967
00968
00969 #define NUM_ARG_REGS 4
00970
00971
00972 #define ARG_REGISTER(N) (N - 1)
00973
00974
00975
00976
00977
00978 #define LAST_ARG_REGNUM ARG_REGISTER (NUM_ARG_REGS)
00979
00980
00981 #define FIRST_LO_REGNUM 0
00982 #define LAST_LO_REGNUM 7
00983 #define FIRST_HI_REGNUM 8
00984 #define LAST_HI_REGNUM 11
00985
00986
00987 #define MUST_USE_SJLJ_EXCEPTIONS 1
00988
00989 #define DWARF2_UNWIND_INFO 1
00990
00991
00992 #define EH_RETURN_DATA_REGNO(N) (((N) < 2) ? N : INVALID_REGNUM)
00993
00994
00995 #define ARM_EH_STACKADJ_REGNUM 2
00996 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (SImode, ARM_EH_STACKADJ_REGNUM)
00997
00998
00999
01000
01001 #define STATIC_CHAIN_REGNUM (TARGET_ARM ? 12 : 9)
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019 #define ARM_HARD_FRAME_POINTER_REGNUM 11
01020 #define THUMB_HARD_FRAME_POINTER_REGNUM 7
01021
01022 #define HARD_FRAME_POINTER_REGNUM \
01023 (TARGET_ARM \
01024 ? ARM_HARD_FRAME_POINTER_REGNUM \
01025 : THUMB_HARD_FRAME_POINTER_REGNUM)
01026
01027 #define FP_REGNUM HARD_FRAME_POINTER_REGNUM
01028
01029
01030 #define STACK_POINTER_REGNUM SP_REGNUM
01031
01032
01033 #define FIRST_FPA_REGNUM 16
01034 #define LAST_FPA_REGNUM 23
01035
01036 #define FIRST_IWMMXT_GR_REGNUM 43
01037 #define LAST_IWMMXT_GR_REGNUM 46
01038 #define FIRST_IWMMXT_REGNUM 47
01039 #define LAST_IWMMXT_REGNUM 62
01040 #define IS_IWMMXT_REGNUM(REGNUM) \
01041 (((REGNUM) >= FIRST_IWMMXT_REGNUM) && ((REGNUM) <= LAST_IWMMXT_REGNUM))
01042 #define IS_IWMMXT_GR_REGNUM(REGNUM) \
01043 (((REGNUM) >= FIRST_IWMMXT_GR_REGNUM) && ((REGNUM) <= LAST_IWMMXT_GR_REGNUM))
01044
01045
01046 #define FRAME_POINTER_REGNUM 25
01047
01048
01049 #define ARG_POINTER_REGNUM 26
01050
01051 #define FIRST_CIRRUS_FP_REGNUM 27
01052 #define LAST_CIRRUS_FP_REGNUM 42
01053 #define IS_CIRRUS_REGNUM(REGNUM) \
01054 (((REGNUM) >= FIRST_CIRRUS_FP_REGNUM) && ((REGNUM) <= LAST_CIRRUS_FP_REGNUM))
01055
01056 #define FIRST_VFP_REGNUM 63
01057 #define LAST_VFP_REGNUM 94
01058 #define IS_VFP_REGNUM(REGNUM) \
01059 (((REGNUM) >= FIRST_VFP_REGNUM) && ((REGNUM) <= LAST_VFP_REGNUM))
01060
01061
01062
01063
01064
01065 #define FIRST_PSEUDO_REGISTER 96
01066
01067
01068
01069
01070
01071
01072
01073 #define FRAME_POINTER_REQUIRED \
01074 (current_function_has_nonlocal_label \
01075 || (TARGET_ARM && TARGET_APCS_FRAME && ! leaf_function_p ()))
01076
01077
01078
01079
01080
01081
01082
01083
01084 #define HARD_REGNO_NREGS(REGNO, MODE) \
01085 ((TARGET_ARM \
01086 && REGNO >= FIRST_FPA_REGNUM \
01087 && REGNO != FRAME_POINTER_REGNUM \
01088 && REGNO != ARG_POINTER_REGNUM) \
01089 && !IS_VFP_REGNUM (REGNO) \
01090 ? 1 : ARM_NUM_REGS (MODE))
01091
01092
01093 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
01094 arm_hard_regno_mode_ok ((REGNO), (MODE))
01095
01096
01097
01098
01099
01100 #define MODES_TIEABLE_P(MODE1, MODE2) \
01101 (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
01102
01103 #define VALID_IWMMXT_REG_MODE(MODE) \
01104 (arm_vector_mode_supported_p (MODE) || (MODE) == DImode)
01105
01106
01107
01108
01109
01110
01111
01112
01113 #define REG_ALLOC_ORDER \
01114 { \
01115 3, 2, 1, 0, 12, 14, 4, 5, \
01116 6, 7, 8, 10, 9, 11, 13, 15, \
01117 16, 17, 18, 19, 20, 21, 22, 23, \
01118 27, 28, 29, 30, 31, 32, 33, 34, \
01119 35, 36, 37, 38, 39, 40, 41, 42, \
01120 43, 44, 45, 46, 47, 48, 49, 50, \
01121 51, 52, 53, 54, 55, 56, 57, 58, \
01122 59, 60, 61, 62, \
01123 24, 25, 26, \
01124 78, 77, 76, 75, 74, 73, 72, 71, \
01125 70, 69, 68, 67, 66, 65, 64, 63, \
01126 79, 80, 81, 82, 83, 84, 85, 86, \
01127 87, 88, 89, 90, 91, 92, 93, 94, \
01128 95 \
01129 }
01130
01131
01132
01133
01134 #define HARD_REGNO_RENAME_OK(SRC, DST) \
01135 (! IS_INTERRUPT (cfun->machine->func_type) || \
01136 regs_ever_live[DST])
01137
01138
01139
01140
01141
01142 enum reg_class
01143 {
01144 NO_REGS,
01145 FPA_REGS,
01146 CIRRUS_REGS,
01147 VFP_REGS,
01148 IWMMXT_GR_REGS,
01149 IWMMXT_REGS,
01150 LO_REGS,
01151 STACK_REG,
01152 BASE_REGS,
01153 HI_REGS,
01154 CC_REG,
01155 VFPCC_REG,
01156 GENERAL_REGS,
01157 ALL_REGS,
01158 LIM_REG_CLASSES
01159 };
01160
01161 #define N_REG_CLASSES (int) LIM_REG_CLASSES
01162
01163
01164 #define REG_CLASS_NAMES \
01165 { \
01166 "NO_REGS", \
01167 "FPA_REGS", \
01168 "CIRRUS_REGS", \
01169 "VFP_REGS", \
01170 "IWMMXT_GR_REGS", \
01171 "IWMMXT_REGS", \
01172 "LO_REGS", \
01173 "STACK_REG", \
01174 "BASE_REGS", \
01175 "HI_REGS", \
01176 "CC_REG", \
01177 "VFPCC_REG", \
01178 "GENERAL_REGS", \
01179 "ALL_REGS", \
01180 }
01181
01182
01183
01184
01185 #define REG_CLASS_CONTENTS \
01186 { \
01187 { 0x00000000, 0x00000000, 0x00000000 }, \
01188 { 0x00FF0000, 0x00000000, 0x00000000 }, \
01189 { 0xF8000000, 0x000007FF, 0x00000000 }, \
01190 { 0x00000000, 0x80000000, 0x7FFFFFFF }, \
01191 { 0x00000000, 0x00007800, 0x00000000 }, \
01192 { 0x00000000, 0x7FFF8000, 0x00000000 }, \
01193 { 0x000000FF, 0x00000000, 0x00000000 }, \
01194 { 0x00002000, 0x00000000, 0x00000000 }, \
01195 { 0x000020FF, 0x00000000, 0x00000000 }, \
01196 { 0x0000FF00, 0x00000000, 0x00000000 }, \
01197 { 0x01000000, 0x00000000, 0x00000000 }, \
01198 { 0x00000000, 0x00000000, 0x80000000 }, \
01199 { 0x0200FFFF, 0x00000000, 0x00000000 }, \
01200 { 0xFAFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF } \
01201 }
01202
01203
01204
01205
01206
01207 #define REGNO_REG_CLASS(REGNO) arm_regno_class (REGNO)
01208
01209
01210
01211
01212 #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
01213 (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
01214 ? reg_classes_intersect_p (FPA_REGS, (CLASS)) \
01215 || reg_classes_intersect_p (VFP_REGS, (CLASS)) \
01216 : 0)
01217
01218
01219
01220
01221 #define CLASS_LIKELY_SPILLED_P(CLASS) \
01222 ((TARGET_THUMB && (CLASS) == LO_REGS) \
01223 || (CLASS) == CC_REG)
01224
01225
01226 #define INDEX_REG_CLASS (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
01227 #define BASE_REG_CLASS (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
01228
01229
01230
01231
01232 #define MODE_BASE_REG_CLASS(MODE) \
01233 (TARGET_ARM ? GENERAL_REGS : \
01234 (((MODE) == SImode) ? BASE_REGS : LO_REGS))
01235
01236
01237
01238 #define MODE_BASE_REG_REG_CLASS(MODE) BASE_REG_CLASS
01239
01240
01241
01242
01243
01244 #define SMALL_REGISTER_CLASSES TARGET_THUMB
01245
01246
01247
01248
01249 #define REG_CLASS_FROM_LETTER(C) \
01250 ( (C) == 'f' ? FPA_REGS \
01251 : (C) == 'v' ? CIRRUS_REGS \
01252 : (C) == 'w' ? VFP_REGS \
01253 : (C) == 'y' ? IWMMXT_REGS \
01254 : (C) == 'z' ? IWMMXT_GR_REGS \
01255 : (C) == 'l' ? (TARGET_ARM ? GENERAL_REGS : LO_REGS) \
01256 : TARGET_ARM ? NO_REGS \
01257 : (C) == 'h' ? HI_REGS \
01258 : (C) == 'b' ? BASE_REGS \
01259 : (C) == 'k' ? STACK_REG \
01260 : (C) == 'c' ? CC_REG \
01261 : NO_REGS)
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273 #define CONST_OK_FOR_ARM_LETTER(VALUE, C) \
01274 ((C) == 'I' ? const_ok_for_arm (VALUE) : \
01275 (C) == 'J' ? ((VALUE) < 4096 && (VALUE) > -4096) : \
01276 (C) == 'K' ? (const_ok_for_arm (~(VALUE))) : \
01277 (C) == 'L' ? (const_ok_for_arm (-(VALUE))) : \
01278 (C) == 'M' ? (((VALUE >= 0 && VALUE <= 32)) \
01279 || (((VALUE) & ((VALUE) - 1)) == 0)) \
01280 : 0)
01281
01282 #define CONST_OK_FOR_THUMB_LETTER(VAL, C) \
01283 ((C) == 'I' ? (unsigned HOST_WIDE_INT) (VAL) < 256 : \
01284 (C) == 'J' ? (VAL) > -256 && (VAL) < 0 : \
01285 (C) == 'K' ? thumb_shiftable_const (VAL) : \
01286 (C) == 'L' ? (VAL) > -8 && (VAL) < 8 : \
01287 (C) == 'M' ? ((unsigned HOST_WIDE_INT) (VAL) < 1024 \
01288 && ((VAL) & 3) == 0) : \
01289 (C) == 'N' ? ((unsigned HOST_WIDE_INT) (VAL) < 32) : \
01290 (C) == 'O' ? ((VAL) >= -508 && (VAL) <= 508) \
01291 : 0)
01292
01293 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
01294 (TARGET_ARM ? \
01295 CONST_OK_FOR_ARM_LETTER (VALUE, C) : CONST_OK_FOR_THUMB_LETTER (VALUE, C))
01296
01297
01298
01299 #define CONST_DOUBLE_OK_FOR_ARM_LETTER(X, C) \
01300 ((C) == 'G' ? arm_const_double_rtx (X) : \
01301 (C) == 'H' ? neg_const_double_rtx_ok_for_fpa (X) : 0)
01302
01303 #define CONST_DOUBLE_OK_FOR_LETTER_P(X, C) \
01304 (TARGET_ARM ? \
01305 CONST_DOUBLE_OK_FOR_ARM_LETTER (X, C) : 0)
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321 #define EXTRA_CONSTRAINT_STR_ARM(OP, C, STR) \
01322 (((C) == 'D') ? ((GET_CODE (OP) == CONST_DOUBLE \
01323 || GET_CODE (OP) == CONST_INT \
01324 || GET_CODE (OP) == CONST_VECTOR) \
01325 && (((STR)[1] == 'a' \
01326 && arm_const_double_inline_cost (OP) == 2) \
01327 || ((STR)[1] == 'b' \
01328 && arm_const_double_inline_cost (OP) == 3) \
01329 || ((STR)[1] == 'c' \
01330 && arm_const_double_inline_cost (OP) == 4 \
01331 && !(optimize_size || arm_ld_sched)))) : \
01332 ((C) == 'Q') ? (GET_CODE (OP) == MEM \
01333 && GET_CODE (XEXP (OP, 0)) == REG) : \
01334 ((C) == 'R') ? (GET_CODE (OP) == MEM \
01335 && GET_CODE (XEXP (OP, 0)) == SYMBOL_REF \
01336 && CONSTANT_POOL_ADDRESS_P (XEXP (OP, 0))) : \
01337 ((C) == 'S') ? (optimize > 0 && CONSTANT_ADDRESS_P (OP)) : \
01338 ((C) == 'T') ? cirrus_memory_offset (OP) : \
01339 ((C) == 'U' && (STR)[1] == 'v') ? arm_coproc_mem_operand (OP, FALSE) : \
01340 ((C) == 'U' && (STR)[1] == 'y') ? arm_coproc_mem_operand (OP, TRUE) : \
01341 ((C) == 'U' && (STR)[1] == 'q') \
01342 ? arm_extendqisi_mem_op (OP, GET_MODE (OP)) \
01343 : 0)
01344
01345 #define CONSTRAINT_LEN(C,STR) \
01346 (((C) == 'U' || (C) == 'D') ? 2 : DEFAULT_CONSTRAINT_LEN (C, STR))
01347
01348 #define EXTRA_CONSTRAINT_THUMB(X, C) \
01349 ((C) == 'Q' ? (GET_CODE (X) == MEM \
01350 && GET_CODE (XEXP (X, 0)) == LABEL_REF) : 0)
01351
01352 #define EXTRA_CONSTRAINT_STR(X, C, STR) \
01353 (TARGET_ARM \
01354 ? EXTRA_CONSTRAINT_STR_ARM (X, C, STR) \
01355 : EXTRA_CONSTRAINT_THUMB (X, C))
01356
01357 #define EXTRA_MEMORY_CONSTRAINT(C, STR) ((C) == 'U')
01358
01359
01360
01361
01362
01363 #define PREFERRED_RELOAD_CLASS(X, CLASS) \
01364 (TARGET_ARM ? (CLASS) : \
01365 ((CLASS) == BASE_REGS ? (CLASS) : LO_REGS))
01366
01367
01368 #define THUMB_SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
01369 ((CLASS) != LO_REGS && (CLASS) != BASE_REGS \
01370 ? ((true_regnum (X) == -1 ? LO_REGS \
01371 : (true_regnum (X) + HARD_REGNO_NREGS (0, MODE) > 8) ? LO_REGS \
01372 : NO_REGS)) \
01373 : NO_REGS)
01374
01375 #define THUMB_SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
01376 ((CLASS) != LO_REGS && (CLASS) != BASE_REGS \
01377 ? ((true_regnum (X) == -1 ? LO_REGS \
01378 : (true_regnum (X) + HARD_REGNO_NREGS (0, MODE) > 8) ? LO_REGS \
01379 : NO_REGS)) \
01380 : NO_REGS)
01381
01382
01383
01384
01385 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
01386 \
01387 ((TARGET_VFP && TARGET_HARD_FLOAT \
01388 && (CLASS) == VFP_REGS) \
01389 ? vfp_secondary_reload_class (MODE, X) \
01390 : TARGET_ARM \
01391 ? (((MODE) == HImode && ! arm_arch4 && true_regnum (X) == -1) \
01392 ? GENERAL_REGS : NO_REGS) \
01393 : THUMB_SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X))
01394
01395
01396 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
01397 \
01398 ((TARGET_VFP && TARGET_HARD_FLOAT \
01399 && (CLASS) == VFP_REGS) \
01400 ? vfp_secondary_reload_class (MODE, X) : \
01401 \
01402 (TARGET_MAVERICK && TARGET_HARD_FLOAT \
01403 && (CLASS) == CIRRUS_REGS \
01404 && (CONSTANT_P (X) || GET_CODE (X) == SYMBOL_REF)) \
01405 ? GENERAL_REGS : \
01406 (TARGET_ARM ? \
01407 (((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS) \
01408 && CONSTANT_P (X)) \
01409 ? GENERAL_REGS : \
01410 (((MODE) == HImode && ! arm_arch4 \
01411 && (GET_CODE (X) == MEM \
01412 || ((GET_CODE (X) == REG || GET_CODE (X) == SUBREG) \
01413 && true_regnum (X) == -1))) \
01414 ? GENERAL_REGS : NO_REGS) \
01415 : THUMB_SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)))
01416
01417
01418
01419
01420
01421
01422
01423
01424 #define ARM_LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND, WIN) \
01425 do \
01426 { \
01427 if (GET_CODE (X) == PLUS \
01428 && GET_CODE (XEXP (X, 0)) == REG \
01429 && REGNO (XEXP (X, 0)) < FIRST_PSEUDO_REGISTER \
01430 && REG_MODE_OK_FOR_BASE_P (XEXP (X, 0), MODE) \
01431 && GET_CODE (XEXP (X, 1)) == CONST_INT) \
01432 { \
01433 HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \
01434 HOST_WIDE_INT low, high; \
01435 \
01436 if (MODE == DImode || (MODE == DFmode && TARGET_SOFT_FLOAT)) \
01437 low = ((val & 0xf) ^ 0x8) - 0x8; \
01438 else if (TARGET_MAVERICK && TARGET_HARD_FLOAT) \
01439 \
01440 low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \
01441 else if (MODE == SImode \
01442 || (MODE == SFmode && TARGET_SOFT_FLOAT) \
01443 || ((MODE == HImode || MODE == QImode) && ! arm_arch4)) \
01444 \
01445 low = val >= 0 ? (val & 0xfff) : -((-val) & 0xfff); \
01446 else if ((MODE == HImode || MODE == QImode) && arm_arch4) \
01447 \
01448 low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \
01449 else if (GET_MODE_CLASS (MODE) == MODE_FLOAT \
01450 && TARGET_HARD_FLOAT && TARGET_FPA) \
01451 \
01452 low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \
01453 else \
01454 break; \
01455 \
01456 high = ((((val - low) & (unsigned HOST_WIDE_INT) 0xffffffff) \
01457 ^ (unsigned HOST_WIDE_INT) 0x80000000) \
01458 - (unsigned HOST_WIDE_INT) 0x80000000); \
01459 \
01460 if (low == 0 || high == 0 || (high + low != val)) \
01461 break; \
01462 \
01463
01464 \
01465 X = gen_rtx_PLUS (GET_MODE (X), \
01466 gen_rtx_PLUS (GET_MODE (X), XEXP (X, 0), \
01467 GEN_INT (high)), \
01468 GEN_INT (low)); \
01469 push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL, \
01470 MODE_BASE_REG_CLASS (MODE), GET_MODE (X), \
01471 VOIDmode, 0, 0, OPNUM, TYPE); \
01472 goto WIN; \
01473 } \
01474 } \
01475 while (0)
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485 #define THUMB_LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN) \
01486 { \
01487 if (GET_CODE (X) == PLUS \
01488 && GET_MODE_SIZE (MODE) < 4 \
01489 && GET_CODE (XEXP (X, 0)) == REG \
01490 && XEXP (X, 0) == stack_pointer_rtx \
01491 && GET_CODE (XEXP (X, 1)) == CONST_INT \
01492 && ! thumb_legitimate_offset_p (MODE, INTVAL (XEXP (X, 1)))) \
01493 { \
01494 rtx orig_X = X; \
01495 X = copy_rtx (X); \
01496 push_reload (orig_X, NULL_RTX, &X, NULL, \
01497 MODE_BASE_REG_CLASS (MODE), \
01498 Pmode, VOIDmode, 0, 0, OPNUM, TYPE); \
01499 goto WIN; \
01500 } \
01501 }
01502
01503 #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN) \
01504 if (TARGET_ARM) \
01505 ARM_LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, WIN); \
01506 else \
01507 THUMB_LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)
01508
01509
01510
01511
01512 #define CLASS_MAX_NREGS(CLASS, MODE) \
01513 (((CLASS) == FPA_REGS || (CLASS) == CIRRUS_REGS) ? 1 : ARM_NUM_REGS (MODE))
01514
01515
01516
01517
01518
01519 #define REGISTER_MOVE_COST(MODE, FROM, TO) \
01520 (TARGET_ARM ? \
01521 ((FROM) == FPA_REGS && (TO) != FPA_REGS ? 20 : \
01522 (FROM) != FPA_REGS && (TO) == FPA_REGS ? 20 : \
01523 (FROM) == VFP_REGS && (TO) != VFP_REGS ? 10 : \
01524 (FROM) != VFP_REGS && (TO) == VFP_REGS ? 10 : \
01525 (FROM) == IWMMXT_REGS && (TO) != IWMMXT_REGS ? 4 : \
01526 (FROM) != IWMMXT_REGS && (TO) == IWMMXT_REGS ? 4 : \
01527 (FROM) == IWMMXT_GR_REGS || (TO) == IWMMXT_GR_REGS ? 20 : \
01528 (FROM) == CIRRUS_REGS && (TO) != CIRRUS_REGS ? 20 : \
01529 (FROM) != CIRRUS_REGS && (TO) == CIRRUS_REGS ? 20 : \
01530 2) \
01531 : \
01532 ((FROM) == HI_REGS || (TO) == HI_REGS) ? 4 : 2)
01533
01534
01535
01536
01537
01538 #define STACK_GROWS_DOWNWARD 1
01539
01540
01541
01542
01543
01544 #define FRAME_GROWS_DOWNWARD 1
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555 #define CALLER_INTERWORKING_SLOT_SIZE \
01556 (TARGET_CALLER_INTERWORKING \
01557 && current_function_outgoing_args_size != 0 \
01558 ? UNITS_PER_WORD : 0)
01559
01560
01561
01562
01563
01564 #define STARTING_FRAME_OFFSET 0
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575 #define ACCUMULATE_OUTGOING_ARGS 1
01576
01577
01578 #define FIRST_PARM_OFFSET(FNDECL) (TARGET_ARM ? 4 : 0)
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
01590
01591
01592
01593 #define LIBCALL_VALUE(MODE) \
01594 (TARGET_ARM && TARGET_HARD_FLOAT_ABI && TARGET_FPA \
01595 && GET_MODE_CLASS (MODE) == MODE_FLOAT \
01596 ? gen_rtx_REG (MODE, FIRST_FPA_REGNUM) \
01597 : TARGET_ARM && TARGET_HARD_FLOAT_ABI && TARGET_MAVERICK \
01598 && GET_MODE_CLASS (MODE) == MODE_FLOAT \
01599 ? gen_rtx_REG (MODE, FIRST_CIRRUS_FP_REGNUM) \
01600 : TARGET_IWMMXT_ABI && arm_vector_mode_supported_p (MODE) \
01601 ? gen_rtx_REG (MODE, FIRST_IWMMXT_REGNUM) \
01602 : gen_rtx_REG (MODE, ARG_REGISTER (1)))
01603
01604
01605
01606
01607
01608 #define FUNCTION_VALUE(VALTYPE, FUNC) \
01609 arm_function_value (VALTYPE, FUNC);
01610
01611
01612
01613
01614 #define FUNCTION_VALUE_REGNO_P(REGNO) \
01615 ((REGNO) == ARG_REGISTER (1) \
01616 || (TARGET_ARM && ((REGNO) == FIRST_CIRRUS_FP_REGNUM) \
01617 && TARGET_HARD_FLOAT_ABI && TARGET_MAVERICK) \
01618 || ((REGNO) == FIRST_IWMMXT_REGNUM && TARGET_IWMMXT_ABI) \
01619 || (TARGET_ARM && ((REGNO) == FIRST_FPA_REGNUM) \
01620 && TARGET_HARD_FLOAT_ABI && TARGET_FPA))
01621
01622
01623
01624 #define APPLY_RESULT_SIZE arm_apply_result_size()
01625
01626
01627
01628
01629 #define RETURN_IN_MEMORY(TYPE) arm_return_in_memory (TYPE)
01630
01631
01632
01633
01634 #define DEFAULT_PCC_STRUCT_RETURN 0
01635
01636
01637 #define CALL_NORMAL 0x00000000
01638 #define CALL_LONG 0x00000001
01639 #define CALL_SHORT 0x00000002
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652 #define ARM_FT_UNKNOWN 0
01653 #define ARM_FT_NORMAL 1
01654 #define ARM_FT_INTERWORKED 2
01655 #define ARM_FT_ISR 4
01656 #define ARM_FT_FIQ 5
01657 #define ARM_FT_EXCEPTION 6
01658
01659 #define ARM_FT_TYPE_MASK ((1 << 3) - 1)
01660
01661
01662
01663 #define ARM_FT_INTERRUPT (1 << 2)
01664 #define ARM_FT_NAKED (1 << 3)
01665 #define ARM_FT_VOLATILE (1 << 4)
01666 #define ARM_FT_NESTED (1 << 5)
01667
01668
01669 #define ARM_FUNC_TYPE(t) (t & ARM_FT_TYPE_MASK)
01670 #define IS_INTERRUPT(t) (t & ARM_FT_INTERRUPT)
01671 #define IS_VOLATILE(t) (t & ARM_FT_VOLATILE)
01672 #define IS_NAKED(t) (t & ARM_FT_NAKED)
01673 #define IS_NESTED(t) (t & ARM_FT_NESTED)
01674
01675
01676
01677
01678
01679
01680
01681 typedef struct arm_stack_offsets GTY(())
01682 {
01683 int saved_args;
01684 int frame;
01685 int saved_regs;
01686 int soft_frame;
01687 int outgoing_args;
01688 }
01689 arm_stack_offsets;
01690
01691
01692
01693 typedef struct machine_function GTY(())
01694 {
01695
01696 rtx eh_epilogue_sp_ofs;
01697
01698 int far_jump_used;
01699
01700 int arg_pointer_live;
01701
01702 int lr_save_eliminated;
01703
01704 arm_stack_offsets stack_offsets;
01705
01706 unsigned long func_type;
01707
01708 int uses_anonymous_args;
01709
01710
01711 int sibcall_blocked;
01712
01713
01714
01715 rtx call_via[14];
01716 }
01717 machine_function;
01718
01719
01720
01721 extern GTY(()) rtx thumb_call_via_label[14];
01722
01723
01724
01725
01726 typedef struct
01727 {
01728
01729 int nregs;
01730
01731 int iwmmxt_nregs;
01732 int named_count;
01733 int nargs;
01734
01735 int call_cookie;
01736 int can_split;
01737 } CUMULATIVE_ARGS;
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01758 arm_function_arg (&(CUM), (MODE), (TYPE), (NAMED))
01759
01760
01761
01762
01763
01764 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
01765 arm_init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL))
01766
01767
01768
01769
01770 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01771 (CUM).nargs += 1; \
01772 if (arm_vector_mode_supported_p (MODE) \
01773 && (CUM).named_count > (CUM).nargs) \
01774 (CUM).iwmmxt_nregs += 1; \
01775 else \
01776 (CUM).nregs += ARM_NUM_REGS2 (MODE, TYPE)
01777
01778
01779
01780
01781 #define FUNCTION_ARG_BOUNDARY(MODE,TYPE) \
01782 ((ARM_DOUBLEWORD_ALIGN && arm_needs_doubleword_align (MODE, TYPE)) \
01783 ? DOUBLEWORD_ALIGNMENT \
01784 : PARM_BOUNDARY )
01785
01786
01787
01788 #define FUNCTION_ARG_REGNO_P(REGNO) \
01789 (IN_RANGE ((REGNO), 0, 3) \
01790 || (TARGET_IWMMXT_ABI \
01791 && IN_RANGE ((REGNO), FIRST_IWMMXT_REGNUM, FIRST_IWMMXT_REGNUM + 9)))
01792
01793
01794
01795
01796
01797 #ifndef ARM_MCOUNT_NAME
01798 #define ARM_MCOUNT_NAME "*mcount"
01799 #endif
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820 #ifndef ARM_FUNCTION_PROFILER
01821 #define ARM_FUNCTION_PROFILER(STREAM, LABELNO) \
01822 { \
01823 char temp[20]; \
01824 rtx sym; \
01825 \
01826 asm_fprintf (STREAM, "\tmov\t%r, %r\n\tbl\t", \
01827 IP_REGNUM, LR_REGNUM); \
01828 assemble_name (STREAM, ARM_MCOUNT_NAME); \
01829 fputc ('\n', STREAM); \
01830 ASM_GENERATE_INTERNAL_LABEL (temp, "LP", LABELNO); \
01831 sym = gen_rtx_SYMBOL_REF (Pmode, temp); \
01832 assemble_aligned_integer (UNITS_PER_WORD, sym); \
01833 }
01834 #endif
01835
01836 #ifdef THUMB_FUNCTION_PROFILER
01837 #define FUNCTION_PROFILER(STREAM, LABELNO) \
01838 if (TARGET_ARM) \
01839 ARM_FUNCTION_PROFILER (STREAM, LABELNO) \
01840 else \
01841 THUMB_FUNCTION_PROFILER (STREAM, LABELNO)
01842 #else
01843 #define FUNCTION_PROFILER(STREAM, LABELNO) \
01844 ARM_FUNCTION_PROFILER (STREAM, LABELNO)
01845 #endif
01846
01847
01848
01849
01850
01851
01852
01853
01854 #define EXIT_IGNORE_STACK 1
01855
01856 #define EPILOGUE_USES(REGNO) (reload_completed && (REGNO) == LR_REGNUM)
01857
01858
01859
01860 #define USE_RETURN_INSN(ISCOND) \
01861 (TARGET_ARM ? use_return_insn (ISCOND, NULL) : 0)
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877 #define ELIMINABLE_REGS \
01878 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM },\
01879 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM },\
01880 { ARG_POINTER_REGNUM, ARM_HARD_FRAME_POINTER_REGNUM },\
01881 { ARG_POINTER_REGNUM, THUMB_HARD_FRAME_POINTER_REGNUM },\
01882 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM },\
01883 { FRAME_POINTER_REGNUM, ARM_HARD_FRAME_POINTER_REGNUM },\
01884 { FRAME_POINTER_REGNUM, THUMB_HARD_FRAME_POINTER_REGNUM }}
01885
01886
01887
01888
01889
01890
01891
01892
01893
01894 #define CAN_ELIMINATE(FROM, TO) \
01895 (((TO) == FRAME_POINTER_REGNUM && (FROM) == ARG_POINTER_REGNUM) ? 0 : \
01896 ((TO) == STACK_POINTER_REGNUM && frame_pointer_needed) ? 0 : \
01897 ((TO) == ARM_HARD_FRAME_POINTER_REGNUM && TARGET_THUMB) ? 0 : \
01898 ((TO) == THUMB_HARD_FRAME_POINTER_REGNUM && TARGET_ARM) ? 0 : \
01899 1)
01900
01901
01902
01903 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01904 if (TARGET_ARM) \
01905 (OFFSET) = arm_compute_initial_elimination_offset (FROM, TO); \
01906 else \
01907 (OFFSET) = thumb_compute_initial_elimination_offset (FROM, TO)
01908
01909
01910 #define DEBUGGER_ARG_OFFSET(value, addr) value ? value : arm_debugger_arg_offset (value, addr)
01911
01912
01913
01914 #define INIT_EXPANDERS arm_init_expanders ()
01915
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926 #define ARM_TRAMPOLINE_TEMPLATE(FILE) \
01927 { \
01928 asm_fprintf (FILE, "\tldr\t%r, [%r, #0]\n", \
01929 STATIC_CHAIN_REGNUM, PC_REGNUM); \
01930 asm_fprintf (FILE, "\tldr\t%r, [%r, #0]\n", \
01931 PC_REGNUM, PC_REGNUM); \
01932 assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
01933 assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
01934 }
01935
01936
01937
01938
01939
01940
01941
01942
01943 #define THUMB_TRAMPOLINE_TEMPLATE(FILE) \
01944 { \
01945 fprintf (FILE, "\t.code 32\n"); \
01946 fprintf (FILE, ".Ltrampoline_start:\n"); \
01947 asm_fprintf (FILE, "\tldr\t%r, [%r, #8]\n", \
01948 STATIC_CHAIN_REGNUM, PC_REGNUM); \
01949 asm_fprintf (FILE, "\tldr\t%r, [%r, #8]\n", \
01950 IP_REGNUM, PC_REGNUM); \
01951 asm_fprintf (FILE, "\torr\t%r, %r, #1\n", \
01952 IP_REGNUM, IP_REGNUM); \
01953 asm_fprintf (FILE, "\tbx\t%r\n", IP_REGNUM); \
01954 fprintf (FILE, "\t.word\t0\n"); \
01955 fprintf (FILE, "\t.word\t0\n"); \
01956 fprintf (FILE, "\t.code 16\n"); \
01957 }
01958
01959 #define TRAMPOLINE_TEMPLATE(FILE) \
01960 if (TARGET_ARM) \
01961 ARM_TRAMPOLINE_TEMPLATE (FILE) \
01962 else \
01963 THUMB_TRAMPOLINE_TEMPLATE (FILE)
01964
01965
01966 #define TRAMPOLINE_SIZE (TARGET_ARM ? 16 : 24)
01967
01968
01969 #define TRAMPOLINE_ALIGNMENT 32
01970
01971
01972
01973
01974 #ifndef INITIALIZE_TRAMPOLINE
01975 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01976 { \
01977 emit_move_insn (gen_rtx_MEM (SImode, \
01978 plus_constant (TRAMP, \
01979 TARGET_ARM ? 8 : 16)), \
01980 CXT); \
01981 emit_move_insn (gen_rtx_MEM (SImode, \
01982 plus_constant (TRAMP, \
01983 TARGET_ARM ? 12 : 20)), \
01984 FNADDR); \
01985 }
01986 #endif
01987
01988
01989
01990 #define HAVE_POST_INCREMENT 1
01991 #define HAVE_PRE_INCREMENT TARGET_ARM
01992 #define HAVE_POST_DECREMENT TARGET_ARM
01993 #define HAVE_PRE_DECREMENT TARGET_ARM
01994 #define HAVE_PRE_MODIFY_DISP TARGET_ARM
01995 #define HAVE_POST_MODIFY_DISP TARGET_ARM
01996 #define HAVE_PRE_MODIFY_REG TARGET_ARM
01997 #define HAVE_POST_MODIFY_REG TARGET_ARM
01998
01999
02000
02001
02002
02003
02004
02005
02006 #define TEST_REGNO(R, TEST, VALUE) \
02007 ((R TEST VALUE) || ((unsigned) reg_renumber[R] TEST VALUE))
02008
02009
02010 #define ARM_REGNO_OK_FOR_BASE_P(REGNO) \
02011 (TEST_REGNO (REGNO, <, PC_REGNUM) \
02012 || TEST_REGNO (REGNO, ==, FRAME_POINTER_REGNUM) \
02013 || TEST_REGNO (REGNO, ==, ARG_POINTER_REGNUM))
02014
02015 #define THUMB_REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE) \
02016 (TEST_REGNO (REGNO, <=, LAST_LO_REGNUM) \
02017 || (GET_MODE_SIZE (MODE) >= 4 \
02018 && TEST_REGNO (REGNO, ==, STACK_POINTER_REGNUM)))
02019
02020 #define REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE) \
02021 (TARGET_THUMB \
02022 ? THUMB_REGNO_MODE_OK_FOR_BASE_P (REGNO, MODE) \
02023 : ARM_REGNO_OK_FOR_BASE_P (REGNO))
02024
02025
02026
02027 #define REGNO_MODE_OK_FOR_REG_BASE_P(X, MODE) \
02028 REGNO_OK_FOR_INDEX_P (X)
02029
02030
02031
02032 #define REGNO_OK_FOR_INDEX_P(REGNO) \
02033 REGNO_MODE_OK_FOR_BASE_P (REGNO, QImode)
02034
02035
02036
02037 #define MAX_REGS_PER_ADDRESS 2
02038
02039
02040
02041
02042 #ifdef AOF_ASSEMBLER
02043
02044 #define CONSTANT_ADDRESS_P(X) \
02045 (GET_CODE (X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (X))
02046
02047 #else
02048
02049 #define CONSTANT_ADDRESS_P(X) \
02050 (GET_CODE (X) == SYMBOL_REF \
02051 && (CONSTANT_POOL_ADDRESS_P (X) \
02052 || (TARGET_ARM && optimize > 0 && SYMBOL_REF_FLAG (X))))
02053
02054 #endif
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064 #define ARM_LEGITIMATE_CONSTANT_P(X) (flag_pic || ! label_mentioned_p (X))
02065
02066 #define THUMB_LEGITIMATE_CONSTANT_P(X) \
02067 ( GET_CODE (X) == CONST_INT \
02068 || GET_CODE (X) == CONST_DOUBLE \
02069 || CONSTANT_ADDRESS_P (X) \
02070 || flag_pic)
02071
02072 #define LEGITIMATE_CONSTANT_P(X) \
02073 (TARGET_ARM ? ARM_LEGITIMATE_CONSTANT_P (X) : THUMB_LEGITIMATE_CONSTANT_P (X))
02074
02075
02076
02077
02078 #define SHORT_CALL_FLAG_CHAR '^'
02079 #define LONG_CALL_FLAG_CHAR '#'
02080
02081 #define ENCODED_SHORT_CALL_ATTR_P(SYMBOL_NAME) \
02082 (*(SYMBOL_NAME) == SHORT_CALL_FLAG_CHAR)
02083
02084 #define ENCODED_LONG_CALL_ATTR_P(SYMBOL_NAME) \
02085 (*(SYMBOL_NAME) == LONG_CALL_FLAG_CHAR)
02086
02087 #ifndef SUBTARGET_NAME_ENCODING_LENGTHS
02088 #define SUBTARGET_NAME_ENCODING_LENGTHS
02089 #endif
02090
02091
02092
02093
02094
02095 #define ARM_NAME_ENCODING_LENGTHS \
02096 case SHORT_CALL_FLAG_CHAR: return 1; \
02097 case LONG_CALL_FLAG_CHAR: return 1; \
02098 case '*': return 1; \
02099 SUBTARGET_NAME_ENCODING_LENGTHS
02100
02101
02102
02103 #undef ASM_OUTPUT_LABELREF
02104 #define ASM_OUTPUT_LABELREF(FILE, NAME) \
02105 arm_asm_output_labelref (FILE, NAME)
02106
02107
02108
02109
02110
02111
02112 #define ARM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL) \
02113 if (!TARGET_LONG_CALLS || ! DECL_SECTION_NAME (DECL)) \
02114 arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR)
02115
02116
02117
02118
02119
02120
02121
02122 #ifndef REG_OK_STRICT
02123
02124 #define ARM_REG_OK_FOR_BASE_P(X) \
02125 (REGNO (X) <= LAST_ARM_REGNUM \
02126 || REGNO (X) >= FIRST_PSEUDO_REGISTER \
02127 || REGNO (X) == FRAME_POINTER_REGNUM \
02128 || REGNO (X) == ARG_POINTER_REGNUM)
02129
02130 #define THUMB_REG_MODE_OK_FOR_BASE_P(X, MODE) \
02131 (REGNO (X) <= LAST_LO_REGNUM \
02132 || REGNO (X) >= FIRST_PSEUDO_REGISTER \
02133 || (GET_MODE_SIZE (MODE) >= 4 \
02134 && (REGNO (X) == STACK_POINTER_REGNUM \
02135 || (X) == hard_frame_pointer_rtx \
02136 || (X) == arg_pointer_rtx)))
02137
02138 #define REG_STRICT_P 0
02139
02140 #else
02141
02142 #define ARM_REG_OK_FOR_BASE_P(X) \
02143 ARM_REGNO_OK_FOR_BASE_P (REGNO (X))
02144
02145 #define THUMB_REG_MODE_OK_FOR_BASE_P(X, MODE) \
02146 THUMB_REGNO_MODE_OK_FOR_BASE_P (REGNO (X), MODE)
02147
02148 #define REG_STRICT_P 1
02149
02150 #endif
02151
02152
02153
02154 #define REG_MODE_OK_FOR_BASE_P(X, MODE) \
02155 (TARGET_THUMB \
02156 ? THUMB_REG_MODE_OK_FOR_BASE_P (X, MODE) \
02157 : ARM_REG_OK_FOR_BASE_P (X))
02158
02159 #define ARM_REG_OK_FOR_INDEX_P(X) ARM_REG_OK_FOR_BASE_P (X)
02160
02161
02162
02163 #define THUMB_REG_OK_FOR_INDEX_P(X) THUMB_REG_MODE_OK_FOR_BASE_P (X, QImode)
02164
02165
02166
02167
02168 #define REG_OK_FOR_INDEX_P(X) \
02169 (TARGET_THUMB \
02170 ? THUMB_REG_OK_FOR_INDEX_P (X) \
02171 : ARM_REG_OK_FOR_INDEX_P (X))
02172
02173
02174
02175 #define REG_MODE_OK_FOR_REG_BASE_P(X, MODE) \
02176 REG_OK_FOR_INDEX_P (X)
02177
02178
02179
02180
02181
02182
02183 #define ARM_BASE_REGISTER_RTX_P(X) \
02184 (GET_CODE (X) == REG && ARM_REG_OK_FOR_BASE_P (X))
02185
02186 #define ARM_INDEX_REGISTER_RTX_P(X) \
02187 (GET_CODE (X) == REG && ARM_REG_OK_FOR_INDEX_P (X))
02188
02189 #define ARM_GO_IF_LEGITIMATE_ADDRESS(MODE,X,WIN) \
02190 { \
02191 if (arm_legitimate_address_p (MODE, X, SET, REG_STRICT_P)) \
02192 goto WIN; \
02193 }
02194
02195 #define THUMB_GO_IF_LEGITIMATE_ADDRESS(MODE,X,WIN) \
02196 { \
02197 if (thumb_legitimate_address_p (MODE, X, REG_STRICT_P)) \
02198 goto WIN; \
02199 }
02200
02201 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
02202 if (TARGET_ARM) \
02203 ARM_GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN) \
02204 else \
02205 THUMB_GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN)
02206
02207
02208
02209
02210 #define ARM_LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
02211 do { \
02212 X = arm_legitimize_address (X, OLDX, MODE); \
02213 } while (0)
02214
02215 #define THUMB_LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
02216 do { \
02217 X = thumb_legitimize_address (X, OLDX, MODE); \
02218 } while (0)
02219
02220 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
02221 do { \
02222 if (TARGET_ARM) \
02223 ARM_LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN); \
02224 else \
02225 THUMB_LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN); \
02226 \
02227 if (memory_address_p (MODE, X)) \
02228 goto WIN; \
02229 } while (0)
02230
02231
02232
02233 #define ARM_GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
02234 { \
02235 if ( GET_CODE (ADDR) == PRE_DEC || GET_CODE (ADDR) == POST_DEC \
02236 || GET_CODE (ADDR) == PRE_INC || GET_CODE (ADDR) == POST_INC) \
02237 goto LABEL; \
02238 }
02239
02240
02241 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
02242 if (TARGET_ARM) \
02243 ARM_GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)
02244
02245
02246
02247
02248 #define CASE_VECTOR_MODE Pmode
02249
02250
02251
02252 #ifndef DEFAULT_SIGNED_CHAR
02253 #define DEFAULT_SIGNED_CHAR 0
02254 #endif
02255
02256
02257
02258 #define MOVE_MAX 4
02259
02260 #undef MOVE_RATIO
02261 #define MOVE_RATIO (arm_tune_xscale ? 4 : 2)
02262
02263
02264
02265 #define WORD_REGISTER_OPERATIONS
02266
02267
02268
02269
02270
02271 #define LOAD_EXTEND_OP(MODE) \
02272 (TARGET_THUMB ? ZERO_EXTEND : \
02273 ((arm_arch4 || (MODE) == QImode) ? ZERO_EXTEND \
02274 : ((BYTES_BIG_ENDIAN && (MODE) == HImode) ? SIGN_EXTEND : UNKNOWN)))
02275
02276
02277 #define SLOW_BYTE_ACCESS 0
02278
02279 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) 1
02280
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
02294
02295
02296 #define NO_FUNCTION_CSE 1
02297
02298
02299 #define Pmode SImode
02300 #define FUNCTION_MODE Pmode
02301
02302 #define ARM_FRAME_RTX(X) \
02303 ( (X) == frame_pointer_rtx || (X) == stack_pointer_rtx \
02304 || (X) == arg_pointer_rtx)
02305
02306
02307 #define MEMORY_MOVE_COST(M, CLASS, IN) \
02308 (TARGET_ARM ? 10 : \
02309 ((GET_MODE_SIZE (M) < 4 ? 8 : 2 * GET_MODE_SIZE (M)) \
02310 * (CLASS == LO_REGS ? 1 : 2)))
02311
02312
02313
02314 #define BRANCH_COST \
02315 (TARGET_ARM ? 4 : (optimize > 1 ? 1 : 0))
02316
02317
02318
02319
02320
02321 extern int arm_pic_register;
02322
02323
02324 extern const char * arm_pic_register_string;
02325
02326
02327
02328 #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
02329
02330
02331
02332 #define LEGITIMATE_PIC_OPERAND_P(X) \
02333 (!(symbol_mentioned_p (X) \
02334 || label_mentioned_p (X) \
02335 || (GET_CODE (X) == SYMBOL_REF \
02336 && CONSTANT_POOL_ADDRESS_P (X) \
02337 && (symbol_mentioned_p (get_pool_constant (X)) \
02338 || label_mentioned_p (get_pool_constant (X))))))
02339
02340
02341
02342
02343 extern int making_const_table;
02344
02345
02346 #define REGISTER_TARGET_PRAGMAS() do { \
02347 c_register_pragma (0, "long_calls", arm_pr_long_calls); \
02348 c_register_pragma (0, "no_long_calls", arm_pr_no_long_calls); \
02349 c_register_pragma (0, "long_calls_off", arm_pr_long_calls_off); \
02350 } while (0)
02351
02352
02353
02354
02355
02356 #define SELECT_CC_MODE(OP, X, Y) arm_select_cc_mode (OP, X, Y)
02357
02358 #define REVERSIBLE_CC_MODE(MODE) 1
02359
02360 #define REVERSE_CONDITION(CODE,MODE) \
02361 (((MODE) == CCFPmode || (MODE) == CCFPEmode) \
02362 ? reverse_condition_maybe_unordered (code) \
02363 : reverse_condition (code))
02364
02365 #define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \
02366 do \
02367 { \
02368 if (GET_CODE (OP1) == CONST_INT \
02369 && ! (const_ok_for_arm (INTVAL (OP1)) \
02370 || (const_ok_for_arm (- INTVAL (OP1))))) \
02371 { \
02372 rtx const_op = OP1; \
02373 CODE = arm_canonicalize_comparison ((CODE), &const_op); \
02374 OP1 = const_op; \
02375 } \
02376 } \
02377 while (0)
02378
02379
02380 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
02381
02382 #undef ASM_APP_OFF
02383 #define ASM_APP_OFF (TARGET_THUMB ? "\t.code\t16\n" : "")
02384
02385
02386 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
02387 do \
02388 { \
02389 if (TARGET_ARM) \
02390 asm_fprintf (STREAM,"\tstmfd\t%r!,{%r}\n", \
02391 STACK_POINTER_REGNUM, REGNO); \
02392 else \
02393 asm_fprintf (STREAM, "\tpush {%r}\n", REGNO); \
02394 } while (0)
02395
02396
02397 #define ASM_OUTPUT_REG_POP(STREAM, REGNO) \
02398 do \
02399 { \
02400 if (TARGET_ARM) \
02401 asm_fprintf (STREAM, "\tldmfd\t%r!,{%r}\n", \
02402 STACK_POINTER_REGNUM, REGNO); \
02403 else \
02404 asm_fprintf (STREAM, "\tpop {%r}\n", REGNO); \
02405 } while (0)
02406
02407
02408
02409 #undef ASM_OUTPUT_CASE_LABEL
02410 #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \
02411 do \
02412 { \
02413 if (TARGET_THUMB) \
02414 ASM_OUTPUT_ALIGN (FILE, 2); \
02415 (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
02416 } \
02417 while (0)
02418
02419 #define ARM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) \
02420 do \
02421 { \
02422 if (TARGET_THUMB) \
02423 { \
02424 if (is_called_in_ARM_mode (DECL) \
02425 || current_function_is_thunk) \
02426 fprintf (STREAM, "\t.code 32\n") ; \
02427 else \
02428 fprintf (STREAM, "\t.code 16\n\t.thumb_func\n") ; \
02429 } \
02430 if (TARGET_POKE_FUNCTION_NAME) \
02431 arm_poke_function_name (STREAM, (char *) NAME); \
02432 } \
02433 while (0)
02434
02435
02436 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL1, DECL2) \
02437 do \
02438 { \
02439 const char *const LABEL1 = XSTR (XEXP (DECL_RTL (decl), 0), 0); \
02440 const char *const LABEL2 = IDENTIFIER_POINTER (DECL2); \
02441 \
02442 if (TARGET_THUMB && TREE_CODE (DECL1) == FUNCTION_DECL) \
02443 { \
02444 fprintf (FILE, "\t.thumb_set "); \
02445 assemble_name (FILE, LABEL1); \
02446 fprintf (FILE, ","); \
02447 assemble_name (FILE, LABEL2); \
02448 fprintf (FILE, "\n"); \
02449 } \
02450 else \
02451 ASM_OUTPUT_DEF (FILE, LABEL1, LABEL2); \
02452 } \
02453 while (0)
02454
02455 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
02456
02457
02458
02459 #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \
02460 if ((LOG) != 0) \
02461 { \
02462 if ((MAX_SKIP) == 0) \
02463 fprintf ((FILE), "\t.p2align %d\n", (int) (LOG)); \
02464 else \
02465 fprintf ((FILE), "\t.p2align %d,,%d\n", \
02466 (int) (LOG), (int) (MAX_SKIP)); \
02467 }
02468 #endif
02469
02470
02471
02472 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
02473 if (TARGET_ARM && optimize) \
02474 arm_final_prescan_insn (INSN); \
02475 else if (TARGET_THUMB) \
02476 thumb_final_prescan_insn (INSN)
02477
02478 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
02479 (CODE == '@' || CODE == '|' \
02480 || (TARGET_ARM && (CODE == '?')) \
02481 || (TARGET_THUMB && (CODE == '_')))
02482
02483
02484 #define PRINT_OPERAND(STREAM, X, CODE) \
02485 arm_print_operand (STREAM, X, CODE)
02486
02487 #define ARM_SIGN_EXTEND(x) ((HOST_WIDE_INT) \
02488 (HOST_BITS_PER_WIDE_INT <= 32 ? (unsigned HOST_WIDE_INT) (x) \
02489 : ((((unsigned HOST_WIDE_INT)(x)) & (unsigned HOST_WIDE_INT) 0xffffffff) |\
02490 ((((unsigned HOST_WIDE_INT)(x)) & (unsigned HOST_WIDE_INT) 0x80000000) \
02491 ? ((~ (unsigned HOST_WIDE_INT) 0) \
02492 & ~ (unsigned HOST_WIDE_INT) 0xffffffff) \
02493 : 0))))
02494
02495
02496 #define ARM_PRINT_OPERAND_ADDRESS(STREAM, X) \
02497 { \
02498 int is_minus = GET_CODE (X) == MINUS; \
02499 \
02500 if (GET_CODE (X) == REG) \
02501 asm_fprintf (STREAM, "[%r, #0]", REGNO (X)); \
02502 else if (GET_CODE (X) == PLUS || is_minus) \
02503 { \
02504 rtx base = XEXP (X, 0); \
02505 rtx index = XEXP (X, 1); \
02506 HOST_WIDE_INT offset = 0; \
02507 if (GET_CODE (base) != REG) \
02508 { \
02509 \
02510 \
02511 rtx temp = base; \
02512 base = index; \
02513 index = temp; \
02514 } \
02515 switch (GET_CODE (index)) \
02516 { \
02517 case CONST_INT: \
02518 offset = INTVAL (index); \
02519 if (is_minus) \
02520 offset = -offset; \
02521 asm_fprintf (STREAM, "[%r, #%wd]", \
02522 REGNO (base), offset); \
02523 break; \
02524 \
02525 case REG: \
02526 asm_fprintf (STREAM, "[%r, %s%r]", \
02527 REGNO (base), is_minus ? "-" : "", \
02528 REGNO (index)); \
02529 break; \
02530 \
02531 case MULT: \
02532 case ASHIFTRT: \
02533 case LSHIFTRT: \
02534 case ASHIFT: \
02535 case ROTATERT: \
02536 { \
02537 asm_fprintf (STREAM, "[%r, %s%r", \
02538 REGNO (base), is_minus ? "-" : "", \
02539 REGNO (XEXP (index, 0))); \
02540 arm_print_operand (STREAM, index, 'S'); \
02541 fputs ("]", STREAM); \
02542 break; \
02543 } \
02544 \
02545 default: \
02546 abort(); \
02547 } \
02548 } \
02549 else if (GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC \
02550 || GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC) \
02551 { \
02552 extern enum machine_mode output_memory_reference_mode; \
02553 \
02554 if (GET_CODE (XEXP (X, 0)) != REG) \
02555 abort (); \
02556 \
02557 if (GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \
02558 asm_fprintf (STREAM, "[%r, #%s%d]!", \
02559 REGNO (XEXP (X, 0)), \
02560 GET_CODE (X) == PRE_DEC ? "-" : "", \
02561 GET_MODE_SIZE (output_memory_reference_mode)); \
02562 else \
02563 asm_fprintf (STREAM, "[%r], #%s%d", \
02564 REGNO (XEXP (X, 0)), \
02565 GET_CODE (X) == POST_DEC ? "-" : "", \
02566 GET_MODE_SIZE (output_memory_reference_mode)); \
02567 } \
02568 else if (GET_CODE (X) == PRE_MODIFY) \
02569 { \
02570 asm_fprintf (STREAM, "[%r, ", REGNO (XEXP (X, 0))); \
02571 if (GET_CODE (XEXP (XEXP (X, 1), 1)) == CONST_INT) \
02572 asm_fprintf (STREAM, "#%wd]!", \
02573 INTVAL (XEXP (XEXP (X, 1), 1))); \
02574 else \
02575 asm_fprintf (STREAM, "%r]!", \
02576 REGNO (XEXP (XEXP (X, 1), 1))); \
02577 } \
02578 else if (GET_CODE (X) == POST_MODIFY) \
02579 { \
02580 asm_fprintf (STREAM, "[%r], ", REGNO (XEXP (X, 0))); \
02581 if (GET_CODE (XEXP (XEXP (X, 1), 1)) == CONST_INT) \
02582 asm_fprintf (STREAM, "#%wd", \
02583 INTVAL (XEXP (XEXP (X, 1), 1))); \
02584 else \
02585 asm_fprintf (STREAM, "%r", \
02586 REGNO (XEXP (XEXP (X, 1), 1))); \
02587 } \
02588 else output_addr_const (STREAM, X); \
02589 }
02590
02591 #define THUMB_PRINT_OPERAND_ADDRESS(STREAM, X) \
02592 { \
02593 if (GET_CODE (X) == REG) \
02594 asm_fprintf (STREAM, "[%r]", REGNO (X)); \
02595 else if (GET_CODE (X) == POST_INC) \
02596 asm_fprintf (STREAM, "%r!", REGNO (XEXP (X, 0))); \
02597 else if (GET_CODE (X) == PLUS) \
02598 { \
02599 if (GET_CODE (XEXP (X, 0)) != REG) \
02600 abort (); \
02601 if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
02602 asm_fprintf (STREAM, "[%r, #%wd]", \
02603 REGNO (XEXP (X, 0)), \
02604 INTVAL (XEXP (X, 1))); \
02605 else \
02606 asm_fprintf (STREAM, "[%r, %r]", \
02607 REGNO (XEXP (X, 0)), \
02608 REGNO (XEXP (X, 1))); \
02609 } \
02610 else \
02611 output_addr_const (STREAM, X); \
02612 }
02613
02614 #define PRINT_OPERAND_ADDRESS(STREAM, X) \
02615 if (TARGET_ARM) \
02616 ARM_PRINT_OPERAND_ADDRESS (STREAM, X) \
02617 else \
02618 THUMB_PRINT_OPERAND_ADDRESS (STREAM, X)
02619
02620 #define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL) \
02621 if (GET_CODE (X) != CONST_VECTOR \
02622 || ! arm_emit_vector_const (FILE, X)) \
02623 goto FAIL;
02624
02625
02626
02627
02628 #define RETURN_ADDR_RTX(COUNT, FRAME) \
02629 arm_return_addr (COUNT, FRAME)
02630
02631
02632
02633 #define RETURN_ADDR_MASK26 (0x03fffffc)
02634
02635
02636
02637
02638 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LR_REGNUM)
02639 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LR_REGNUM)
02640
02641
02642
02643 #define MASK_RETURN_ADDR \
02644
02645
02646
02647 \
02648 ((arm_arch4 || TARGET_THUMB) \
02649 ? (gen_int_mode ((unsigned long)0xffffffff, Pmode)) \
02650 : arm_gen_return_addr_mask ())
02651
02652
02653 enum arm_builtins
02654 {
02655 ARM_BUILTIN_GETWCX,
02656 ARM_BUILTIN_SETWCX,
02657
02658 ARM_BUILTIN_WZERO,
02659
02660 ARM_BUILTIN_WAVG2BR,
02661 ARM_BUILTIN_WAVG2HR,
02662 ARM_BUILTIN_WAVG2B,
02663 ARM_BUILTIN_WAVG2H,
02664
02665 ARM_BUILTIN_WACCB,
02666 ARM_BUILTIN_WACCH,
02667 ARM_BUILTIN_WACCW,
02668
02669 ARM_BUILTIN_WMACS,
02670 ARM_BUILTIN_WMACSZ,
02671 ARM_BUILTIN_WMACU,
02672 ARM_BUILTIN_WMACUZ,
02673
02674 ARM_BUILTIN_WSADB,
02675 ARM_BUILTIN_WSADBZ,
02676 ARM_BUILTIN_WSADH,
02677 ARM_BUILTIN_WSADHZ,
02678
02679 ARM_BUILTIN_WALIGN,
02680
02681 ARM_BUILTIN_TMIA,
02682 ARM_BUILTIN_TMIAPH,
02683 ARM_BUILTIN_TMIABB,
02684 ARM_BUILTIN_TMIABT,
02685 ARM_BUILTIN_TMIATB,
02686 ARM_BUILTIN_TMIATT,
02687
02688 ARM_BUILTIN_TMOVMSKB,
02689 ARM_BUILTIN_TMOVMSKH,
02690 ARM_BUILTIN_TMOVMSKW,
02691
02692 ARM_BUILTIN_TBCSTB,
02693 ARM_BUILTIN_TBCSTH,
02694 ARM_BUILTIN_TBCSTW,
02695
02696 ARM_BUILTIN_WMADDS,
02697 ARM_BUILTIN_WMADDU,
02698
02699 ARM_BUILTIN_WPACKHSS,
02700 ARM_BUILTIN_WPACKWSS,
02701 ARM_BUILTIN_WPACKDSS,
02702 ARM_BUILTIN_WPACKHUS,
02703 ARM_BUILTIN_WPACKWUS,
02704 ARM_BUILTIN_WPACKDUS,
02705
02706 ARM_BUILTIN_WADDB,
02707 ARM_BUILTIN_WADDH,
02708 ARM_BUILTIN_WADDW,
02709 ARM_BUILTIN_WADDSSB,
02710 ARM_BUILTIN_WADDSSH,
02711 ARM_BUILTIN_WADDSSW,
02712 ARM_BUILTIN_WADDUSB,
02713 ARM_BUILTIN_WADDUSH,
02714 ARM_BUILTIN_WADDUSW,
02715 ARM_BUILTIN_WSUBB,
02716 ARM_BUILTIN_WSUBH,
02717 ARM_BUILTIN_WSUBW,
02718 ARM_BUILTIN_WSUBSSB,
02719 ARM_BUILTIN_WSUBSSH,
02720 ARM_BUILTIN_WSUBSSW,
02721 ARM_BUILTIN_WSUBUSB,
02722 ARM_BUILTIN_WSUBUSH,
02723 ARM_BUILTIN_WSUBUSW,
02724
02725 ARM_BUILTIN_WAND,
02726 ARM_BUILTIN_WANDN,
02727 ARM_BUILTIN_WOR,
02728 ARM_BUILTIN_WXOR,
02729
02730 ARM_BUILTIN_WCMPEQB,
02731 ARM_BUILTIN_WCMPEQH,
02732 ARM_BUILTIN_WCMPEQW,
02733 ARM_BUILTIN_WCMPGTUB,
02734 ARM_BUILTIN_WCMPGTUH,
02735 ARM_BUILTIN_WCMPGTUW,
02736 ARM_BUILTIN_WCMPGTSB,
02737 ARM_BUILTIN_WCMPGTSH,
02738 ARM_BUILTIN_WCMPGTSW,
02739
02740 ARM_BUILTIN_TEXTRMSB,
02741 ARM_BUILTIN_TEXTRMSH,
02742 ARM_BUILTIN_TEXTRMSW,
02743 ARM_BUILTIN_TEXTRMUB,
02744 ARM_BUILTIN_TEXTRMUH,
02745 ARM_BUILTIN_TEXTRMUW,
02746 ARM_BUILTIN_TINSRB,
02747 ARM_BUILTIN_TINSRH,
02748 ARM_BUILTIN_TINSRW,
02749
02750 ARM_BUILTIN_WMAXSW,
02751 ARM_BUILTIN_WMAXSH,
02752 ARM_BUILTIN_WMAXSB,
02753 ARM_BUILTIN_WMAXUW,
02754 ARM_BUILTIN_WMAXUH,
02755 ARM_BUILTIN_WMAXUB,
02756 ARM_BUILTIN_WMINSW,
02757 ARM_BUILTIN_WMINSH,
02758 ARM_BUILTIN_WMINSB,
02759 ARM_BUILTIN_WMINUW,
02760 ARM_BUILTIN_WMINUH,
02761 ARM_BUILTIN_WMINUB,
02762
02763 ARM_BUILTIN_WMULUM,
02764 ARM_BUILTIN_WMULSM,
02765 ARM_BUILTIN_WMULUL,
02766
02767 ARM_BUILTIN_PSADBH,
02768 ARM_BUILTIN_WSHUFH,
02769
02770 ARM_BUILTIN_WSLLH,
02771 ARM_BUILTIN_WSLLW,
02772 ARM_BUILTIN_WSLLD,
02773 ARM_BUILTIN_WSRAH,
02774 ARM_BUILTIN_WSRAW,
02775 ARM_BUILTIN_WSRAD,
02776 ARM_BUILTIN_WSRLH,
02777 ARM_BUILTIN_WSRLW,
02778 ARM_BUILTIN_WSRLD,
02779 ARM_BUILTIN_WRORH,
02780 ARM_BUILTIN_WRORW,
02781 ARM_BUILTIN_WRORD,
02782 ARM_BUILTIN_WSLLHI,
02783 ARM_BUILTIN_WSLLWI,
02784 ARM_BUILTIN_WSLLDI,
02785 ARM_BUILTIN_WSRAHI,
02786 ARM_BUILTIN_WSRAWI,
02787 ARM_BUILTIN_WSRADI,
02788 ARM_BUILTIN_WSRLHI,
02789 ARM_BUILTIN_WSRLWI,
02790 ARM_BUILTIN_WSRLDI,
02791 ARM_BUILTIN_WRORHI,
02792 ARM_BUILTIN_WRORWI,
02793 ARM_BUILTIN_WRORDI,
02794
02795 ARM_BUILTIN_WUNPCKIHB,
02796 ARM_BUILTIN_WUNPCKIHH,
02797 ARM_BUILTIN_WUNPCKIHW,
02798 ARM_BUILTIN_WUNPCKILB,
02799 ARM_BUILTIN_WUNPCKILH,
02800 ARM_BUILTIN_WUNPCKILW,
02801
02802 ARM_BUILTIN_WUNPCKEHSB,
02803 ARM_BUILTIN_WUNPCKEHSH,
02804 ARM_BUILTIN_WUNPCKEHSW,
02805 ARM_BUILTIN_WUNPCKEHUB,
02806 ARM_BUILTIN_WUNPCKEHUH,
02807 ARM_BUILTIN_WUNPCKEHUW,
02808 ARM_BUILTIN_WUNPCKELSB,
02809 ARM_BUILTIN_WUNPCKELSH,
02810 ARM_BUILTIN_WUNPCKELSW,
02811 ARM_BUILTIN_WUNPCKELUB,
02812 ARM_BUILTIN_WUNPCKELUH,
02813 ARM_BUILTIN_WUNPCKELUW,
02814
02815 ARM_BUILTIN_MAX
02816 };
02817 #endif