00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 struct processor_costs {
00044 const int add;
00045 const int lea;
00046 const int shift_var;
00047 const int shift_const;
00048 const int mult_init[5];
00049
00050 const int mult_bit;
00051 const int divide[5];
00052
00053 int movsx;
00054 int movzx;
00055 const int large_insn;
00056 const int move_ratio;
00057
00058 const int movzbl_load;
00059 const int int_load[3];
00060
00061
00062 const int int_store[3];
00063
00064 const int fp_move;
00065 const int fp_load[3];
00066
00067 const int fp_store[3];
00068
00069 const int mmx_move;
00070 const int mmx_load[2];
00071
00072 const int mmx_store[2];
00073
00074 const int sse_move;
00075 const int sse_load[3];
00076
00077 const int sse_store[3];
00078
00079 const int mmxsse_to_integer;
00080
00081 const int prefetch_block;
00082 const int simultaneous_prefetches;
00083
00084 const int branch_cost;
00085 const int fadd;
00086 const int fmul;
00087 const int fdiv;
00088 const int fabs;
00089 const int fchs;
00090 const int fsqrt;
00091 };
00092
00093 extern const struct processor_costs *ix86_cost;
00094
00095
00096
00097 extern int target_flags;
00098
00099
00100
00101
00102
00103 #ifndef TARGET_CPU_DEFAULT
00104 #ifdef TARGET_64BIT_DEFAULT
00105 #define TARGET_CPU_DEFAULT TARGET_CPU_DEFAULT_k8
00106 #else
00107 #define TARGET_CPU_DEFAULT 0
00108 #endif
00109 #endif
00110
00111
00112 #define MASK_80387 0x00000001
00113 #define MASK_RTD 0x00000002
00114 #define MASK_ALIGN_DOUBLE 0x00000004
00115 #define MASK_SVR3_SHLIB 0x00000008
00116 #define MASK_IEEE_FP 0x00000010
00117 #define MASK_FLOAT_RETURNS 0x00000020
00118 #define MASK_NO_FANCY_MATH_387 0x00000040
00119 #define MASK_OMIT_LEAF_FRAME_POINTER 0x080
00120 #define MASK_STACK_PROBE 0x00000100
00121 #define MASK_NO_ALIGN_STROPS 0x00000200
00122 #define MASK_INLINE_ALL_STROPS 0x00000400
00123 #define MASK_NO_PUSH_ARGS 0x00000800
00124 #define MASK_ACCUMULATE_OUTGOING_ARGS 0x00001000
00125 #define MASK_MMX 0x00002000
00126 #define MASK_SSE 0x00004000
00127 #define MASK_SSE2 0x00008000
00128 #define MASK_SSE3 0x00010000
00129 #define MASK_3DNOW 0x00020000
00130 #define MASK_3DNOW_A 0x00040000
00131 #define MASK_128BIT_LONG_DOUBLE 0x00080000
00132 #define MASK_64BIT 0x00100000
00133 #define MASK_MS_BITFIELD_LAYOUT 0x00200000
00134 #define MASK_TLS_DIRECT_SEG_REFS 0x00400000
00135
00136
00137
00138
00139 #define MASK_NO_RED_ZONE 0x04000000
00140
00141
00142 #define TARGET_80387 (target_flags & MASK_80387)
00143
00144
00145
00146
00147 #define TARGET_RTD (target_flags & MASK_RTD)
00148
00149
00150
00151
00152 #define TARGET_ALIGN_DOUBLE (target_flags & MASK_ALIGN_DOUBLE)
00153
00154
00155 #define TARGET_PUSH_ARGS (!(target_flags & MASK_NO_PUSH_ARGS))
00156
00157
00158 #define TARGET_ACCUMULATE_OUTGOING_ARGS \
00159 (target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)
00160
00161
00162
00163 #define TARGET_SVR3_SHLIB (target_flags & MASK_SVR3_SHLIB)
00164
00165
00166
00167
00168 #define TARGET_IEEE_FP (target_flags & MASK_IEEE_FP)
00169
00170
00171
00172
00173 #define TARGET_FLOAT_RETURNS_IN_80387 (target_flags & MASK_FLOAT_RETURNS)
00174
00175
00176
00177
00178 #define TARGET_128BIT_LONG_DOUBLE (target_flags & MASK_128BIT_LONG_DOUBLE)
00179
00180
00181
00182 #define TARGET_NO_FANCY_MATH_387 (target_flags & MASK_NO_FANCY_MATH_387)
00183
00184
00185 #define TARGET_USE_FANCY_MATH_387 (! TARGET_NO_FANCY_MATH_387)
00186
00187
00188 #define TARGET_OMIT_LEAF_FRAME_POINTER \
00189 (target_flags & MASK_OMIT_LEAF_FRAME_POINTER)
00190
00191
00192 #define TARGET_DEBUG_ADDR (ix86_debug_addr_string != 0)
00193
00194
00195 #define TARGET_DEBUG_ARG (ix86_debug_arg_string != 0)
00196
00197
00198
00199 #ifdef IN_LIBGCC2
00200 #ifdef __x86_64__
00201 #define TARGET_64BIT 1
00202 #else
00203 #define TARGET_64BIT 0
00204 #endif
00205 #else
00206 #ifdef TARGET_BI_ARCH
00207 #define TARGET_64BIT (target_flags & MASK_64BIT)
00208 #else
00209 #if TARGET_64BIT_DEFAULT
00210 #define TARGET_64BIT 1
00211 #else
00212 #define TARGET_64BIT 0
00213 #endif
00214 #endif
00215 #endif
00216
00217 #define HAS_LONG_COND_BRANCH 1
00218 #define HAS_LONG_UNCOND_BRANCH 1
00219
00220
00221 #define TARGET_TLS_DIRECT_SEG_REFS (target_flags & MASK_TLS_DIRECT_SEG_REFS)
00222
00223 #define TARGET_386 (ix86_tune == PROCESSOR_I386)
00224 #define TARGET_486 (ix86_tune == PROCESSOR_I486)
00225 #define TARGET_PENTIUM (ix86_tune == PROCESSOR_PENTIUM)
00226 #define TARGET_PENTIUMPRO (ix86_tune == PROCESSOR_PENTIUMPRO)
00227 #define TARGET_K6 (ix86_tune == PROCESSOR_K6)
00228 #define TARGET_ATHLON (ix86_tune == PROCESSOR_ATHLON)
00229 #define TARGET_PENTIUM4 (ix86_tune == PROCESSOR_PENTIUM4)
00230 #define TARGET_K8 (ix86_tune == PROCESSOR_K8)
00231 #define TARGET_ATHLON_K8 (TARGET_K8 || TARGET_ATHLON)
00232 #define TARGET_NOCONA (ix86_tune == PROCESSOR_NOCONA)
00233
00234 #define TUNEMASK (1 << ix86_tune)
00235 extern const int x86_use_leave, x86_push_memory, x86_zero_extend_with_and;
00236 extern const int x86_use_bit_test, x86_cmove, x86_deep_branch;
00237 extern const int x86_branch_hints, x86_unroll_strlen;
00238 extern const int x86_double_with_add, x86_partial_reg_stall, x86_movx;
00239 extern const int x86_use_loop, x86_use_fiop, x86_use_mov0;
00240 extern const int x86_use_cltd, x86_read_modify_write;
00241 extern const int x86_read_modify, x86_split_long_moves;
00242 extern const int x86_promote_QImode, x86_single_stringop, x86_fast_prefix;
00243 extern const int x86_himode_math, x86_qimode_math, x86_promote_qi_regs;
00244 extern const int x86_promote_hi_regs, x86_integer_DFmode_moves;
00245 extern const int x86_add_esp_4, x86_add_esp_8, x86_sub_esp_4, x86_sub_esp_8;
00246 extern const int x86_partial_reg_dependency, x86_memory_mismatch_stall;
00247 extern const int x86_accumulate_outgoing_args, x86_prologue_using_move;
00248 extern const int x86_epilogue_using_move, x86_decompose_lea;
00249 extern const int x86_arch_always_fancy_math_387, x86_shift1;
00250 extern const int x86_sse_partial_reg_dependency, x86_sse_split_regs;
00251 extern const int x86_sse_typeless_stores, x86_sse_load0_by_pxor;
00252 extern const int x86_use_ffreep;
00253 extern const int x86_inter_unit_moves, x86_schedule;
00254 extern const int x86_use_bt;
00255 extern int x86_prefetch_sse;
00256
00257 #define TARGET_USE_LEAVE (x86_use_leave & TUNEMASK)
00258 #define TARGET_PUSH_MEMORY (x86_push_memory & TUNEMASK)
00259 #define TARGET_ZERO_EXTEND_WITH_AND (x86_zero_extend_with_and & TUNEMASK)
00260 #define TARGET_USE_BIT_TEST (x86_use_bit_test & TUNEMASK)
00261 #define TARGET_UNROLL_STRLEN (x86_unroll_strlen & TUNEMASK)
00262
00263
00264 #define TARGET_CMOVE ((x86_cmove & (1 << ix86_arch)) || TARGET_SSE)
00265 #define TARGET_DEEP_BRANCH_PREDICTION (x86_deep_branch & TUNEMASK)
00266 #define TARGET_BRANCH_PREDICTION_HINTS (x86_branch_hints & TUNEMASK)
00267 #define TARGET_DOUBLE_WITH_ADD (x86_double_with_add & TUNEMASK)
00268 #define TARGET_USE_SAHF ((x86_use_sahf & TUNEMASK) && !TARGET_64BIT)
00269 #define TARGET_MOVX (x86_movx & TUNEMASK)
00270 #define TARGET_PARTIAL_REG_STALL (x86_partial_reg_stall & TUNEMASK)
00271 #define TARGET_USE_LOOP (x86_use_loop & TUNEMASK)
00272 #define TARGET_USE_FIOP (x86_use_fiop & TUNEMASK)
00273 #define TARGET_USE_MOV0 (x86_use_mov0 & TUNEMASK)
00274 #define TARGET_USE_CLTD (x86_use_cltd & TUNEMASK)
00275 #define TARGET_SPLIT_LONG_MOVES (x86_split_long_moves & TUNEMASK)
00276 #define TARGET_READ_MODIFY_WRITE (x86_read_modify_write & TUNEMASK)
00277 #define TARGET_READ_MODIFY (x86_read_modify & TUNEMASK)
00278 #define TARGET_PROMOTE_QImode (x86_promote_QImode & TUNEMASK)
00279 #define TARGET_FAST_PREFIX (x86_fast_prefix & TUNEMASK)
00280 #define TARGET_SINGLE_STRINGOP (x86_single_stringop & TUNEMASK)
00281 #define TARGET_QIMODE_MATH (x86_qimode_math & TUNEMASK)
00282 #define TARGET_HIMODE_MATH (x86_himode_math & TUNEMASK)
00283 #define TARGET_PROMOTE_QI_REGS (x86_promote_qi_regs & TUNEMASK)
00284 #define TARGET_PROMOTE_HI_REGS (x86_promote_hi_regs & TUNEMASK)
00285 #define TARGET_ADD_ESP_4 (x86_add_esp_4 & TUNEMASK)
00286 #define TARGET_ADD_ESP_8 (x86_add_esp_8 & TUNEMASK)
00287 #define TARGET_SUB_ESP_4 (x86_sub_esp_4 & TUNEMASK)
00288 #define TARGET_SUB_ESP_8 (x86_sub_esp_8 & TUNEMASK)
00289 #define TARGET_INTEGER_DFMODE_MOVES (x86_integer_DFmode_moves & TUNEMASK)
00290 #define TARGET_PARTIAL_REG_DEPENDENCY (x86_partial_reg_dependency & TUNEMASK)
00291 #define TARGET_SSE_PARTIAL_REG_DEPENDENCY \
00292 (x86_sse_partial_reg_dependency & TUNEMASK)
00293 #define TARGET_SSE_SPLIT_REGS (x86_sse_split_regs & TUNEMASK)
00294 #define TARGET_SSE_TYPELESS_STORES (x86_sse_typeless_stores & TUNEMASK)
00295 #define TARGET_SSE_LOAD0_BY_PXOR (x86_sse_load0_by_pxor & TUNEMASK)
00296 #define TARGET_MEMORY_MISMATCH_STALL (x86_memory_mismatch_stall & TUNEMASK)
00297 #define TARGET_PROLOGUE_USING_MOVE (x86_prologue_using_move & TUNEMASK)
00298 #define TARGET_EPILOGUE_USING_MOVE (x86_epilogue_using_move & TUNEMASK)
00299 #define TARGET_DECOMPOSE_LEA (x86_decompose_lea & TUNEMASK)
00300 #define TARGET_PREFETCH_SSE (x86_prefetch_sse)
00301 #define TARGET_SHIFT1 (x86_shift1 & TUNEMASK)
00302 #define TARGET_USE_FFREEP (x86_use_ffreep & TUNEMASK)
00303 #define TARGET_REP_MOVL_OPTIMAL (x86_rep_movl_optimal & TUNEMASK)
00304 #define TARGET_INTER_UNIT_MOVES (x86_inter_unit_moves & TUNEMASK)
00305 #define TARGET_FOUR_JUMP_LIMIT (x86_four_jump_limit & TUNEMASK)
00306 #define TARGET_SCHEDULE (x86_schedule & TUNEMASK)
00307 #define TARGET_USE_BT (x86_use_bt & TUNEMASK)
00308
00309 #define TARGET_STACK_PROBE (target_flags & MASK_STACK_PROBE)
00310
00311 #define TARGET_ALIGN_STRINGOPS (!(target_flags & MASK_NO_ALIGN_STROPS))
00312 #define TARGET_INLINE_ALL_STRINGOPS (target_flags & MASK_INLINE_ALL_STROPS)
00313
00314 #define ASSEMBLER_DIALECT (ix86_asm_dialect)
00315
00316 #define TARGET_SSE ((target_flags & MASK_SSE) != 0)
00317 #define TARGET_SSE2 ((target_flags & MASK_SSE2) != 0)
00318 #define TARGET_SSE3 ((target_flags & MASK_SSE3) != 0)
00319 #define TARGET_SSE_MATH ((ix86_fpmath & FPMATH_SSE) != 0)
00320 #define TARGET_MIX_SSE_I387 ((ix86_fpmath & FPMATH_SSE) \
00321 && (ix86_fpmath & FPMATH_387))
00322 #define TARGET_MMX ((target_flags & MASK_MMX) != 0)
00323 #define TARGET_3DNOW ((target_flags & MASK_3DNOW) != 0)
00324 #define TARGET_3DNOW_A ((target_flags & MASK_3DNOW_A) != 0)
00325
00326 #define TARGET_RED_ZONE (!(target_flags & MASK_NO_RED_ZONE))
00327
00328 #define TARGET_USE_MS_BITFIELD_LAYOUT (target_flags & MASK_MS_BITFIELD_LAYOUT)
00329
00330 #define TARGET_GNU_TLS (ix86_tls_dialect == TLS_DIALECT_GNU)
00331 #define TARGET_SUN_TLS (ix86_tls_dialect == TLS_DIALECT_SUN)
00332
00333
00334
00335
00336
00337
00338 #define TARGET_SWITCHES \
00339 { { "80387", MASK_80387, N_("Use hardware fp") }, \
00340 { "no-80387", -MASK_80387, N_("Do not use hardware fp") }, \
00341 { "hard-float", MASK_80387, N_("Use hardware fp") }, \
00342 { "soft-float", -MASK_80387, N_("Do not use hardware fp") }, \
00343 { "no-soft-float", MASK_80387, N_("Use hardware fp") }, \
00344 { "386", 0, "" }, \
00345 { "486", 0, "" }, \
00346 { "pentium", 0, "" }, \
00347 { "pentiumpro", 0, "" }, \
00348 { "intel-syntax", 0, "" }, \
00349 { "no-intel-syntax", 0, "" }, \
00350 { "rtd", MASK_RTD, \
00351 N_("Alternate calling convention") }, \
00352 { "no-rtd", -MASK_RTD, \
00353 N_("Use normal calling convention") }, \
00354 { "align-double", MASK_ALIGN_DOUBLE, \
00355 N_("Align some doubles on dword boundary") }, \
00356 { "no-align-double", -MASK_ALIGN_DOUBLE, \
00357 N_("Align doubles on word boundary") }, \
00358 { "svr3-shlib", MASK_SVR3_SHLIB, \
00359 N_("Uninitialized locals in .bss") }, \
00360 { "no-svr3-shlib", -MASK_SVR3_SHLIB, \
00361 N_("Uninitialized locals in .data") }, \
00362 { "ieee-fp", MASK_IEEE_FP, \
00363 N_("Use IEEE math for fp comparisons") }, \
00364 { "no-ieee-fp", -MASK_IEEE_FP, \
00365 N_("Do not use IEEE math for fp comparisons") }, \
00366 { "fp-ret-in-387", MASK_FLOAT_RETURNS, \
00367 N_("Return values of functions in FPU registers") }, \
00368 { "no-fp-ret-in-387", -MASK_FLOAT_RETURNS , \
00369 N_("Do not return values of functions in FPU registers")}, \
00370 { "no-fancy-math-387", MASK_NO_FANCY_MATH_387, \
00371 N_("Do not generate sin, cos, sqrt for FPU") }, \
00372 { "fancy-math-387", -MASK_NO_FANCY_MATH_387, \
00373 N_("Generate sin, cos, sqrt for FPU")}, \
00374 { "omit-leaf-frame-pointer", MASK_OMIT_LEAF_FRAME_POINTER, \
00375 N_("Omit the frame pointer in leaf functions") }, \
00376 { "no-omit-leaf-frame-pointer",-MASK_OMIT_LEAF_FRAME_POINTER, "" }, \
00377 { "stack-arg-probe", MASK_STACK_PROBE, \
00378 N_("Enable stack probing") }, \
00379 { "no-stack-arg-probe", -MASK_STACK_PROBE, "" }, \
00380 { "windows", 0, 0 }, \
00381 { "dll", 0, 0 }, \
00382 { "align-stringops", -MASK_NO_ALIGN_STROPS, \
00383 N_("Align destination of the string operations") }, \
00384 { "no-align-stringops", MASK_NO_ALIGN_STROPS, \
00385 N_("Do not align destination of the string operations") }, \
00386 { "inline-all-stringops", MASK_INLINE_ALL_STROPS, \
00387 N_("Inline all known string operations") }, \
00388 { "no-inline-all-stringops", -MASK_INLINE_ALL_STROPS, \
00389 N_("Do not inline all known string operations") }, \
00390 { "push-args", -MASK_NO_PUSH_ARGS, \
00391 N_("Use push instructions to save outgoing arguments") }, \
00392 { "no-push-args", MASK_NO_PUSH_ARGS, \
00393 N_("Do not use push instructions to save outgoing arguments") }, \
00394 { "accumulate-outgoing-args", MASK_ACCUMULATE_OUTGOING_ARGS, \
00395 N_("Use push instructions to save outgoing arguments") }, \
00396 { "no-accumulate-outgoing-args",-MASK_ACCUMULATE_OUTGOING_ARGS, \
00397 N_("Do not use push instructions to save outgoing arguments") }, \
00398 { "mmx", MASK_MMX, \
00399 N_("Support MMX built-in functions") }, \
00400 { "no-mmx", -(MASK_MMX|MASK_3DNOW|MASK_3DNOW_A), \
00401 N_("Do not support MMX built-in functions") }, \
00402 { "3dnow", MASK_3DNOW, \
00403 N_("Support 3DNow! built-in functions") }, \
00404 { "no-3dnow", -(MASK_3DNOW|MASK_3DNOW_A), \
00405 N_("Do not support 3DNow! built-in functions") }, \
00406 { "sse", MASK_SSE, \
00407 N_("Support MMX and SSE built-in functions and code generation") }, \
00408 { "no-sse", -(MASK_SSE|MASK_SSE2|MASK_SSE3), \
00409 N_("Do not support MMX and SSE built-in functions and code generation") },\
00410 { "sse2", MASK_SSE2, \
00411 N_("Support MMX, SSE and SSE2 built-in functions and code generation") }, \
00412 { "no-sse2", -(MASK_SSE2|MASK_SSE3), \
00413 N_("Do not support MMX, SSE and SSE2 built-in functions and code generation") }, \
00414 { "sse3", MASK_SSE3, \
00415 N_("Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation") },\
00416 { "no-sse3", -MASK_SSE3, \
00417 N_("Do not support MMX, SSE, SSE2 and SSE3 built-in functions and code generation") },\
00418 { "128bit-long-double", MASK_128BIT_LONG_DOUBLE, \
00419 N_("sizeof(long double) is 16") }, \
00420 { "96bit-long-double", -MASK_128BIT_LONG_DOUBLE, \
00421 N_("sizeof(long double) is 12") }, \
00422 { "64", MASK_64BIT, \
00423 N_("Generate 64bit x86-64 code") }, \
00424 { "32", -MASK_64BIT, \
00425 N_("Generate 32bit i386 code") }, \
00426 { "ms-bitfields", MASK_MS_BITFIELD_LAYOUT, \
00427 N_("Use native (MS) bitfield layout") }, \
00428 { "no-ms-bitfields", -MASK_MS_BITFIELD_LAYOUT, \
00429 N_("Use gcc default bitfield layout") }, \
00430 { "red-zone", -MASK_NO_RED_ZONE, \
00431 N_("Use red-zone in the x86-64 code") }, \
00432 { "no-red-zone", MASK_NO_RED_ZONE, \
00433 N_("Do not use red-zone in the x86-64 code") }, \
00434 { "tls-direct-seg-refs", MASK_TLS_DIRECT_SEG_REFS, \
00435 N_("Use direct references against %gs when accessing tls data") }, \
00436 { "no-tls-direct-seg-refs", -MASK_TLS_DIRECT_SEG_REFS, \
00437 N_("Do not use direct references against %gs when accessing tls data") }, \
00438 SUBTARGET_SWITCHES \
00439 { "", \
00440 TARGET_DEFAULT | TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_DEFAULT \
00441 | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT, 0 }}
00442
00443 #ifndef TARGET_64BIT_DEFAULT
00444 #define TARGET_64BIT_DEFAULT 0
00445 #endif
00446 #ifndef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
00447 #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT 0
00448 #endif
00449
00450
00451
00452
00453 #define TARGET_DEFAULT 0
00454
00455
00456
00457
00458 #define TARGET_MACHO 0
00459
00460
00461
00462 #define TARGET_96_ROUND_53_LONG_DOUBLE 0
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 #define TARGET_OPTIONS \
00474 { { "tune=", &ix86_tune_string, \
00475 N_("Schedule code for given CPU"), 0}, \
00476 { "fpmath=", &ix86_fpmath_string, \
00477 N_("Generate floating point mathematics using given instruction set"), 0},\
00478 { "arch=", &ix86_arch_string, \
00479 N_("Generate code for given CPU"), 0}, \
00480 { "regparm=", &ix86_regparm_string, \
00481 N_("Number of registers used to pass integer arguments"), 0},\
00482 { "align-loops=", &ix86_align_loops_string, \
00483 N_("Loop code aligned to this power of 2"), 0}, \
00484 { "align-jumps=", &ix86_align_jumps_string, \
00485 N_("Jump targets are aligned to this power of 2"), 0}, \
00486 { "align-functions=", &ix86_align_funcs_string, \
00487 N_("Function starts are aligned to this power of 2"), 0}, \
00488 { "preferred-stack-boundary=", \
00489 &ix86_preferred_stack_boundary_string, \
00490 N_("Attempt to keep stack aligned to this power of 2"), 0}, \
00491 { "branch-cost=", &ix86_branch_cost_string, \
00492 N_("Branches are this expensive (1-5, arbitrary units)"), 0},\
00493 { "cmodel=", &ix86_cmodel_string, \
00494 N_("Use given x86-64 code model"), 0}, \
00495 { "debug-arg", &ix86_debug_arg_string, \
00496 "" , 0}, \
00497 { "debug-addr", &ix86_debug_addr_string, \
00498 "" , 0}, \
00499 { "asm=", &ix86_asm_string, \
00500 N_("Use given assembler dialect"), 0}, \
00501 { "tls-dialect=", &ix86_tls_dialect_string, \
00502 N_("Use given thread-local storage dialect"), 0}, \
00503 SUBTARGET_OPTIONS \
00504 }
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515 #define OVERRIDE_OPTIONS override_options ()
00516
00517
00518 #define SUBTARGET_SWITCHES
00519 #define SUBTARGET_OPTIONS
00520
00521
00522 #define OPTIMIZATION_OPTIONS(LEVEL, SIZE) \
00523 optimization_options ((LEVEL), (SIZE))
00524
00525
00526 #define OPTION_DEFAULT_SPECS \
00527 {"arch", "%{!march=*:-march=%(VALUE)}"}, \
00528 {"tune", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}" }, \
00529 {"cpu", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}" }
00530
00531
00532
00533 #ifndef CC1_CPU_SPEC
00534 #define CC1_CPU_SPEC "\
00535 %{!mtune*: \
00536 %{m386:mtune=i386 \
00537 %n`-m386' is deprecated. Use `-march=i386' or `-mtune=i386' instead.\n} \
00538 %{m486:-mtune=i486 \
00539 %n`-m486' is deprecated. Use `-march=i486' or `-mtune=i486' instead.\n} \
00540 %{mpentium:-mtune=pentium \
00541 %n`-mpentium' is deprecated. Use `-march=pentium' or `-mtune=pentium' instead.\n} \
00542 %{mpentiumpro:-mtune=pentiumpro \
00543 %n`-mpentiumpro' is deprecated. Use `-march=pentiumpro' or `-mtune=pentiumpro' instead.\n} \
00544 %{mcpu=*:-mtune=%* \
00545 %n`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead.\n}} \
00546 %<mcpu=* \
00547 %{mintel-syntax:-masm=intel \
00548 %n`-mintel-syntax' is deprecated. Use `-masm=intel' instead.\n} \
00549 %{mno-intel-syntax:-masm=att \
00550 %n`-mno-intel-syntax' is deprecated. Use `-masm=att' instead.\n}"
00551 #endif
00552
00553
00554 #define TARGET_CPU_CPP_BUILTINS() \
00555 do \
00556 { \
00557 size_t arch_len = strlen (ix86_arch_string); \
00558 size_t tune_len = strlen (ix86_tune_string); \
00559 int last_arch_char = ix86_arch_string[arch_len - 1]; \
00560 int last_tune_char = ix86_tune_string[tune_len - 1]; \
00561 \
00562 if (TARGET_64BIT) \
00563 { \
00564 builtin_assert ("cpu=x86_64"); \
00565 builtin_assert ("machine=x86_64"); \
00566 builtin_define ("__amd64"); \
00567 builtin_define ("__amd64__"); \
00568 builtin_define ("__x86_64"); \
00569 builtin_define ("__x86_64__"); \
00570 } \
00571 else \
00572 { \
00573 builtin_assert ("cpu=i386"); \
00574 builtin_assert ("machine=i386"); \
00575 builtin_define_std ("i386"); \
00576 } \
00577 \
00578
00579 \
00580 if (TARGET_386) \
00581 builtin_define ("__tune_i386__"); \
00582 else if (TARGET_486) \
00583 builtin_define ("__tune_i486__"); \
00584 else if (TARGET_PENTIUM) \
00585 { \
00586 builtin_define ("__tune_i586__"); \
00587 builtin_define ("__tune_pentium__"); \
00588 if (last_tune_char == 'x') \
00589 builtin_define ("__tune_pentium_mmx__"); \
00590 } \
00591 else if (TARGET_PENTIUMPRO) \
00592 { \
00593 builtin_define ("__tune_i686__"); \
00594 builtin_define ("__tune_pentiumpro__"); \
00595 switch (last_tune_char) \
00596 { \
00597 case '3': \
00598 builtin_define ("__tune_pentium3__"); \
00599 \
00600 case '2': \
00601 builtin_define ("__tune_pentium2__"); \
00602 break; \
00603 } \
00604 } \
00605 else if (TARGET_K6) \
00606 { \
00607 builtin_define ("__tune_k6__"); \
00608 if (last_tune_char == '2') \
00609 builtin_define ("__tune_k6_2__"); \
00610 else if (last_tune_char == '3') \
00611 builtin_define ("__tune_k6_3__"); \
00612 } \
00613 else if (TARGET_ATHLON) \
00614 { \
00615 builtin_define ("__tune_athlon__"); \
00616 \
00617 if (last_tune_char != 'n') \
00618 builtin_define ("__tune_athlon_sse__"); \
00619 } \
00620 else if (TARGET_K8) \
00621 builtin_define ("__tune_k8__"); \
00622 else if (TARGET_PENTIUM4) \
00623 builtin_define ("__tune_pentium4__"); \
00624 else if (TARGET_NOCONA) \
00625 builtin_define ("__tune_nocona__"); \
00626 \
00627 if (TARGET_MMX) \
00628 builtin_define ("__MMX__"); \
00629 if (TARGET_3DNOW) \
00630 builtin_define ("__3dNOW__"); \
00631 if (TARGET_3DNOW_A) \
00632 builtin_define ("__3dNOW_A__"); \
00633 if (TARGET_SSE) \
00634 builtin_define ("__SSE__"); \
00635 if (TARGET_SSE2) \
00636 builtin_define ("__SSE2__"); \
00637 if (TARGET_SSE3) \
00638 builtin_define ("__SSE3__"); \
00639 if (TARGET_SSE_MATH && TARGET_SSE) \
00640 builtin_define ("__SSE_MATH__"); \
00641 if (TARGET_SSE_MATH && TARGET_SSE2) \
00642 builtin_define ("__SSE2_MATH__"); \
00643 \
00644 \
00645 if (ix86_arch == PROCESSOR_I486) \
00646 { \
00647 builtin_define ("__i486"); \
00648 builtin_define ("__i486__"); \
00649 } \
00650 else if (ix86_arch == PROCESSOR_PENTIUM) \
00651 { \
00652 builtin_define ("__i586"); \
00653 builtin_define ("__i586__"); \
00654 builtin_define ("__pentium"); \
00655 builtin_define ("__pentium__"); \
00656 if (last_arch_char == 'x') \
00657 builtin_define ("__pentium_mmx__"); \
00658 } \
00659 else if (ix86_arch == PROCESSOR_PENTIUMPRO) \
00660 { \
00661 builtin_define ("__i686"); \
00662 builtin_define ("__i686__"); \
00663 builtin_define ("__pentiumpro"); \
00664 builtin_define ("__pentiumpro__"); \
00665 } \
00666 else if (ix86_arch == PROCESSOR_K6) \
00667 { \
00668 \
00669 builtin_define ("__k6"); \
00670 builtin_define ("__k6__"); \
00671 if (last_arch_char == '2') \
00672 builtin_define ("__k6_2__"); \
00673 else if (last_arch_char == '3') \
00674 builtin_define ("__k6_3__"); \
00675 } \
00676 else if (ix86_arch == PROCESSOR_ATHLON) \
00677 { \
00678 builtin_define ("__athlon"); \
00679 builtin_define ("__athlon__"); \
00680 \
00681 if (last_arch_char != 'n') \
00682 builtin_define ("__athlon_sse__"); \
00683 } \
00684 else if (ix86_arch == PROCESSOR_K8) \
00685 { \
00686 builtin_define ("__k8"); \
00687 builtin_define ("__k8__"); \
00688 } \
00689 else if (ix86_arch == PROCESSOR_PENTIUM4) \
00690 { \
00691 builtin_define ("__pentium4"); \
00692 builtin_define ("__pentium4__"); \
00693 } \
00694 else if (ix86_arch == PROCESSOR_NOCONA) \
00695 { \
00696 builtin_define ("__nocona"); \
00697 builtin_define ("__nocona__"); \
00698 } \
00699 } \
00700 while (0)
00701
00702 #define TARGET_CPU_DEFAULT_i386 0
00703 #define TARGET_CPU_DEFAULT_i486 1
00704 #define TARGET_CPU_DEFAULT_pentium 2
00705 #define TARGET_CPU_DEFAULT_pentium_mmx 3
00706 #define TARGET_CPU_DEFAULT_pentiumpro 4
00707 #define TARGET_CPU_DEFAULT_pentium2 5
00708 #define TARGET_CPU_DEFAULT_pentium3 6
00709 #define TARGET_CPU_DEFAULT_pentium4 7
00710 #define TARGET_CPU_DEFAULT_k6 8
00711 #define TARGET_CPU_DEFAULT_k6_2 9
00712 #define TARGET_CPU_DEFAULT_k6_3 10
00713 #define TARGET_CPU_DEFAULT_athlon 11
00714 #define TARGET_CPU_DEFAULT_athlon_sse 12
00715 #define TARGET_CPU_DEFAULT_k8 13
00716 #define TARGET_CPU_DEFAULT_pentium_m 14
00717 #define TARGET_CPU_DEFAULT_prescott 15
00718 #define TARGET_CPU_DEFAULT_nocona 16
00719
00720 #define TARGET_CPU_DEFAULT_NAMES {"i386", "i486", "pentium", "pentium-mmx",\
00721 "pentiumpro", "pentium2", "pentium3", \
00722 "pentium4", "k6", "k6-2", "k6-3",\
00723 "athlon", "athlon-4", "k8", \
00724 "pentium-m", "prescott", "nocona"}
00725
00726 #ifndef CC1_SPEC
00727 #define CC1_SPEC "%(cc1_cpu) "
00728 #endif
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740 #ifndef SUBTARGET_EXTRA_SPECS
00741 #define SUBTARGET_EXTRA_SPECS
00742 #endif
00743
00744 #define EXTRA_SPECS \
00745 { "cc1_cpu", CC1_CPU_SPEC }, \
00746 SUBTARGET_EXTRA_SPECS
00747
00748
00749
00750 #define LONG_DOUBLE_TYPE_SIZE 80
00751
00752
00753
00754
00755
00756
00757 #define TARGET_FLT_EVAL_METHOD \
00758 (TARGET_MIX_SSE_I387 ? -1 : TARGET_SSE_MATH ? 0 : 2)
00759
00760 #define SHORT_TYPE_SIZE 16
00761 #define INT_TYPE_SIZE 32
00762 #define FLOAT_TYPE_SIZE 32
00763 #define LONG_TYPE_SIZE BITS_PER_WORD
00764 #define DOUBLE_TYPE_SIZE 64
00765 #define LONG_LONG_TYPE_SIZE 64
00766
00767 #if defined (TARGET_BI_ARCH) || TARGET_64BIT_DEFAULT
00768 #define MAX_BITS_PER_WORD 64
00769 #else
00770 #define MAX_BITS_PER_WORD 32
00771 #endif
00772
00773
00774
00775
00776 #define BITS_BIG_ENDIAN 0
00777
00778
00779
00780 #define BYTES_BIG_ENDIAN 0
00781
00782
00783
00784
00785 #define WORDS_BIG_ENDIAN 0
00786
00787
00788 #define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4)
00789 #ifdef IN_LIBGCC2
00790 #define MIN_UNITS_PER_WORD (TARGET_64BIT ? 8 : 4)
00791 #else
00792 #define MIN_UNITS_PER_WORD 4
00793 #endif
00794
00795
00796 #define PARM_BOUNDARY BITS_PER_WORD
00797
00798
00799 #define STACK_BOUNDARY BITS_PER_WORD
00800
00801
00802
00803 #define PREFERRED_STACK_BOUNDARY ix86_preferred_stack_boundary
00804
00805
00806
00807
00808
00809 #define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN \
00810 (ix86_preferred_stack_boundary > STACK_BOUNDARY && !TARGET_64BIT)
00811
00812
00813 #define FUNCTION_BOUNDARY 8
00814
00815
00816 #define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_pfn
00817
00818
00819
00820 #define EMPTY_FIELD_BOUNDARY BITS_PER_WORD
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830 #define BIGGEST_ALIGNMENT 128
00831
00832
00833 #define ALIGN_MODE_128(MODE) \
00834 ((MODE) == XFmode || (MODE) == TFmode || SSE_REG_MODE_P (MODE))
00835
00836
00837
00838
00839
00840
00841
00842
00843 #ifdef IN_TARGET_LIBS
00844 #ifdef __x86_64__
00845 #define BIGGEST_FIELD_ALIGNMENT 128
00846 #else
00847 #define BIGGEST_FIELD_ALIGNMENT 32
00848 #endif
00849 #else
00850 #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
00851 x86_field_alignment (FIELD, COMPUTED)
00852 #endif
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866 #define CONSTANT_ALIGNMENT(EXP, ALIGN) ix86_constant_alignment ((EXP), (ALIGN))
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880 #define DATA_ALIGNMENT(TYPE, ALIGN) ix86_data_alignment ((TYPE), (ALIGN))
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892 #define LOCAL_ALIGNMENT(TYPE, ALIGN) ix86_local_alignment ((TYPE), (ALIGN))
00893
00894
00895
00896
00897
00898 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
00899 ix86_function_arg_boundary ((MODE), (TYPE))
00900
00901
00902
00903 #define STRICT_ALIGNMENT 0
00904
00905
00906
00907
00908 #define PCC_BITFIELD_TYPE_MATTERS 1
00909
00910
00911
00912
00913
00914
00915 #define STACK_REGS
00916 #define IS_STACK_MODE(MODE) \
00917 ((MODE) == DFmode || (MODE) == SFmode || (MODE) == XFmode) \
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 #define FIRST_PSEUDO_REGISTER 53
00936
00937
00938
00939
00940 #define DWARF_FRAME_REGISTERS 17
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952 #define FIXED_REGISTERS \
00953 \
00954 { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
00955 \
00956 1, 1, 1, 1, 1, \
00957 \
00958 0, 0, 0, 0, 0, 0, 0, 0, \
00959 \
00960 0, 0, 0, 0, 0, 0, 0, 0, \
00961 \
00962 2, 2, 2, 2, 2, 2, 2, 2, \
00963 \
00964 2, 2, 2, 2, 2, 2, 2, 2}
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980 #define CALL_USED_REGISTERS \
00981 \
00982 { 1, 1, 1, 0, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
00983 \
00984 1, 1, 1, 1, 1, \
00985 \
00986 1, 1, 1, 1, 1, 1, 1, 1, \
00987 \
00988 1, 1, 1, 1, 1, 1, 1, 1, \
00989 \
00990 1, 1, 1, 1, 2, 2, 2, 2, \
00991 \
00992 1, 1, 1, 1, 1, 1, 1, 1} \
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003 #define REG_ALLOC_ORDER \
01004 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\
01005 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, \
01006 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \
01007 48, 49, 50, 51, 52 }
01008
01009
01010
01011
01012
01013 #define ORDER_REGS_FOR_LOCAL_ALLOC x86_order_regs_for_local_alloc ()
01014
01015
01016
01017 #define CONDITIONAL_REGISTER_USAGE \
01018 do { \
01019 int i; \
01020 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \
01021 { \
01022 if (fixed_regs[i] > 1) \
01023 fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2)); \
01024 if (call_used_regs[i] > 1) \
01025 call_used_regs[i] = (call_used_regs[i] \
01026 == (TARGET_64BIT ? 3 : 2)); \
01027 } \
01028 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
01029 { \
01030 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
01031 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
01032 } \
01033 if (! TARGET_MMX) \
01034 { \
01035 int i; \
01036 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \
01037 if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i)) \
01038 fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \
01039 } \
01040 if (! TARGET_SSE) \
01041 { \
01042 int i; \
01043 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \
01044 if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i)) \
01045 fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \
01046 } \
01047 if (! TARGET_80387 && ! TARGET_FLOAT_RETURNS_IN_80387) \
01048 { \
01049 int i; \
01050 HARD_REG_SET x; \
01051 COPY_HARD_REG_SET (x, reg_class_contents[(int)FLOAT_REGS]); \
01052 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \
01053 if (TEST_HARD_REG_BIT (x, i)) \
01054 fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \
01055 } \
01056 if (! TARGET_64BIT) \
01057 { \
01058 int i; \
01059 for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++) \
01060 reg_names[i] = ""; \
01061 for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++) \
01062 reg_names[i] = ""; \
01063 } \
01064 } while (0)
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076 #define HARD_REGNO_NREGS(REGNO, MODE) \
01077 (FP_REGNO_P (REGNO) || SSE_REGNO_P (REGNO) || MMX_REGNO_P (REGNO) \
01078 ? (COMPLEX_MODE_P (MODE) ? 2 : 1) \
01079 : ((MODE) == XFmode \
01080 ? (TARGET_64BIT ? 2 : 3) \
01081 : (MODE) == XCmode \
01082 ? (TARGET_64BIT ? 4 : 6) \
01083 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
01084
01085 #define VALID_SSE2_REG_MODE(MODE) \
01086 ((MODE) == V16QImode || (MODE) == V8HImode || (MODE) == V2DFmode \
01087 || (MODE) == V2DImode || (MODE) == DFmode)
01088
01089 #define VALID_SSE_REG_MODE(MODE) \
01090 ((MODE) == TImode || (MODE) == V4SFmode || (MODE) == V4SImode \
01091 || (MODE) == SFmode || (MODE) == TFmode)
01092
01093 #define VALID_MMX_REG_MODE_3DNOW(MODE) \
01094 ((MODE) == V2SFmode || (MODE) == SFmode)
01095
01096 #define VALID_MMX_REG_MODE(MODE) \
01097 ((MODE) == DImode || (MODE) == V8QImode || (MODE) == V4HImode \
01098 || (MODE) == V2SImode || (MODE) == SImode)
01099
01100
01101
01102 #define UNITS_PER_SIMD_WORD (TARGET_SSE ? 16 : 0)
01103
01104 #define VALID_FP_MODE_P(MODE) \
01105 ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode \
01106 || (MODE) == SCmode || (MODE) == DCmode || (MODE) == XCmode) \
01107
01108 #define VALID_INT_MODE_P(MODE) \
01109 ((MODE) == QImode || (MODE) == HImode || (MODE) == SImode \
01110 || (MODE) == DImode \
01111 || (MODE) == CQImode || (MODE) == CHImode || (MODE) == CSImode \
01112 || (MODE) == CDImode \
01113 || (TARGET_64BIT && ((MODE) == TImode || (MODE) == CTImode \
01114 || (MODE) == TFmode || (MODE) == TCmode)))
01115
01116
01117 #define SSE_REG_MODE_P(MODE) \
01118 ((MODE) == TImode || (MODE) == V16QImode || (MODE) == TFmode \
01119 || (MODE) == V8HImode || (MODE) == V2DFmode || (MODE) == V2DImode \
01120 || (MODE) == V4SFmode || (MODE) == V4SImode)
01121
01122
01123
01124 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
01125 ix86_hard_regno_mode_ok ((REGNO), (MODE))
01126
01127
01128
01129
01130
01131
01132 #define MODES_TIEABLE_P(MODE1, MODE2) ix86_modes_tieable_p (MODE1, MODE2)
01133
01134
01135
01136 #define AVOID_CCMODE_COPIES
01137
01138
01139
01140
01141
01142
01143 #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
01144 (CC_REGNO_P (REGNO) ? VOIDmode \
01145 : (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \
01146 : (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), false)\
01147 : (MODE) == HImode && !TARGET_PARTIAL_REG_STALL ? SImode \
01148 : (MODE) == QImode && (REGNO) >= 4 && !TARGET_64BIT ? SImode \
01149 : (MODE))
01150
01151
01152
01153
01154
01155
01156
01157
01158 #define STACK_POINTER_REGNUM 7
01159
01160
01161 #define HARD_FRAME_POINTER_REGNUM 6
01162
01163
01164 #define FRAME_POINTER_REGNUM 20
01165
01166
01167 #define FIRST_FLOAT_REG 8
01168
01169
01170 #define FIRST_STACK_REG FIRST_FLOAT_REG
01171 #define LAST_STACK_REG (FIRST_FLOAT_REG + 7)
01172
01173 #define FIRST_SSE_REG (FRAME_POINTER_REGNUM + 1)
01174 #define LAST_SSE_REG (FIRST_SSE_REG + 7)
01175
01176 #define FIRST_MMX_REG (LAST_SSE_REG + 1)
01177 #define LAST_MMX_REG (FIRST_MMX_REG + 7)
01178
01179 #define FIRST_REX_INT_REG (LAST_MMX_REG + 1)
01180 #define LAST_REX_INT_REG (FIRST_REX_INT_REG + 7)
01181
01182 #define FIRST_REX_SSE_REG (LAST_REX_INT_REG + 1)
01183 #define LAST_REX_SSE_REG (FIRST_REX_SSE_REG + 7)
01184
01185
01186
01187
01188
01189 #define FRAME_POINTER_REQUIRED ix86_frame_pointer_required ()
01190
01191
01192
01193 #ifndef SUBTARGET_FRAME_POINTER_REQUIRED
01194 #define SUBTARGET_FRAME_POINTER_REQUIRED 0
01195 #endif
01196
01197
01198 #define SETUP_FRAME_ADDRESSES() ix86_setup_frame_addresses ()
01199
01200
01201 #define ARG_POINTER_REGNUM 16
01202
01203
01204
01205
01206 #define STATIC_CHAIN_REGNUM (TARGET_64BIT ? FIRST_REX_INT_REG + 10 - 8 : 2)
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217 #define REAL_PIC_OFFSET_TABLE_REGNUM 3
01218
01219 #define PIC_OFFSET_TABLE_REGNUM \
01220 (TARGET_64BIT || !flag_pic ? INVALID_REGNUM \
01221 : reload_completed ? REGNO (pic_offset_table_rtx) \
01222 : REAL_PIC_OFFSET_TABLE_REGNUM)
01223
01224 #define GOT_SYMBOL_NAME "_GLOBAL_OFFSET_TABLE_"
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243 #define RETURN_IN_MEMORY(TYPE) \
01244 ix86_return_in_memory (TYPE)
01245
01246
01247 #define MS_AGGREGATE_RETURN 0
01248
01249
01250 #define KEEP_AGGREGATE_RETURN_POINTER 0
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278 enum reg_class
01279 {
01280 NO_REGS,
01281 AREG, DREG, CREG, BREG, SIREG, DIREG,
01282 AD_REGS,
01283 Q_REGS,
01284 NON_Q_REGS,
01285 INDEX_REGS,
01286 LEGACY_REGS,
01287 GENERAL_REGS,
01288 FP_TOP_REG, FP_SECOND_REG,
01289 FLOAT_REGS,
01290 SSE_REGS,
01291 MMX_REGS,
01292 FP_TOP_SSE_REGS,
01293 FP_SECOND_SSE_REGS,
01294 FLOAT_SSE_REGS,
01295 FLOAT_INT_REGS,
01296 INT_SSE_REGS,
01297 FLOAT_INT_SSE_REGS,
01298 ALL_REGS, LIM_REG_CLASSES
01299 };
01300
01301 #define N_REG_CLASSES ((int) LIM_REG_CLASSES)
01302
01303 #define INTEGER_CLASS_P(CLASS) \
01304 reg_class_subset_p ((CLASS), GENERAL_REGS)
01305 #define FLOAT_CLASS_P(CLASS) \
01306 reg_class_subset_p ((CLASS), FLOAT_REGS)
01307 #define SSE_CLASS_P(CLASS) \
01308 ((CLASS) == SSE_REGS)
01309 #define MMX_CLASS_P(CLASS) \
01310 ((CLASS) == MMX_REGS)
01311 #define MAYBE_INTEGER_CLASS_P(CLASS) \
01312 reg_classes_intersect_p ((CLASS), GENERAL_REGS)
01313 #define MAYBE_FLOAT_CLASS_P(CLASS) \
01314 reg_classes_intersect_p ((CLASS), FLOAT_REGS)
01315 #define MAYBE_SSE_CLASS_P(CLASS) \
01316 reg_classes_intersect_p (SSE_REGS, (CLASS))
01317 #define MAYBE_MMX_CLASS_P(CLASS) \
01318 reg_classes_intersect_p (MMX_REGS, (CLASS))
01319
01320 #define Q_CLASS_P(CLASS) \
01321 reg_class_subset_p ((CLASS), Q_REGS)
01322
01323
01324
01325 #define REG_CLASS_NAMES \
01326 { "NO_REGS", \
01327 "AREG", "DREG", "CREG", "BREG", \
01328 "SIREG", "DIREG", \
01329 "AD_REGS", \
01330 "Q_REGS", "NON_Q_REGS", \
01331 "INDEX_REGS", \
01332 "LEGACY_REGS", \
01333 "GENERAL_REGS", \
01334 "FP_TOP_REG", "FP_SECOND_REG", \
01335 "FLOAT_REGS", \
01336 "SSE_REGS", \
01337 "MMX_REGS", \
01338 "FP_TOP_SSE_REGS", \
01339 "FP_SECOND_SSE_REGS", \
01340 "FLOAT_SSE_REGS", \
01341 "FLOAT_INT_REGS", \
01342 "INT_SSE_REGS", \
01343 "FLOAT_INT_SSE_REGS", \
01344 "ALL_REGS" }
01345
01346
01347
01348
01349
01350 #define REG_CLASS_CONTENTS \
01351 { { 0x00, 0x0 }, \
01352 { 0x01, 0x0 }, { 0x02, 0x0 }, \
01353 { 0x04, 0x0 }, { 0x08, 0x0 }, \
01354 { 0x10, 0x0 }, { 0x20, 0x0 }, \
01355 { 0x03, 0x0 }, \
01356 { 0x0f, 0x0 }, \
01357 { 0x1100f0, 0x1fe0 }, \
01358 { 0x7f, 0x1fe0 }, \
01359 { 0x1100ff, 0x0 }, \
01360 { 0x1100ff, 0x1fe0 }, \
01361 { 0x100, 0x0 }, { 0x0200, 0x0 },\
01362 { 0xff00, 0x0 }, \
01363 { 0x1fe00000,0x1fe000 }, \
01364 { 0xe0000000, 0x1f }, \
01365 { 0x1fe00100,0x1fe000 }, \
01366 { 0x1fe00200,0x1fe000 }, \
01367 { 0x1fe0ff00,0x1fe000 }, \
01368 { 0x1ffff, 0x1fe0 }, \
01369 { 0x1fe100ff,0x1fffe0 }, \
01370 { 0x1fe1ffff,0x1fffe0 }, \
01371 { 0xffffffff,0x1fffff } \
01372 }
01373
01374
01375
01376
01377
01378
01379 #define REGNO_REG_CLASS(REGNO) (regclass_map[REGNO])
01380
01381
01382
01383
01384
01385 #define SMALL_REGISTER_CLASSES 1
01386
01387 #define QI_REG_P(X) \
01388 (REG_P (X) && REGNO (X) < 4)
01389
01390 #define GENERAL_REGNO_P(N) \
01391 ((N) < 8 || REX_INT_REGNO_P (N))
01392
01393 #define GENERAL_REG_P(X) \
01394 (REG_P (X) && GENERAL_REGNO_P (REGNO (X)))
01395
01396 #define ANY_QI_REG_P(X) (TARGET_64BIT ? GENERAL_REG_P(X) : QI_REG_P (X))
01397
01398 #define NON_QI_REG_P(X) \
01399 (REG_P (X) && REGNO (X) >= 4 && REGNO (X) < FIRST_PSEUDO_REGISTER)
01400
01401 #define REX_INT_REGNO_P(N) ((N) >= FIRST_REX_INT_REG && (N) <= LAST_REX_INT_REG)
01402 #define REX_INT_REG_P(X) (REG_P (X) && REX_INT_REGNO_P (REGNO (X)))
01403
01404 #define FP_REG_P(X) (REG_P (X) && FP_REGNO_P (REGNO (X)))
01405 #define FP_REGNO_P(N) ((N) >= FIRST_STACK_REG && (N) <= LAST_STACK_REG)
01406 #define ANY_FP_REG_P(X) (REG_P (X) && ANY_FP_REGNO_P (REGNO (X)))
01407 #define ANY_FP_REGNO_P(N) (FP_REGNO_P (N) || SSE_REGNO_P (N))
01408
01409 #define SSE_REGNO_P(N) \
01410 (((N) >= FIRST_SSE_REG && (N) <= LAST_SSE_REG) \
01411 || ((N) >= FIRST_REX_SSE_REG && (N) <= LAST_REX_SSE_REG))
01412
01413 #define REX_SSE_REGNO_P(N) \
01414 ((N) >= FIRST_REX_SSE_REG && (N) <= LAST_REX_SSE_REG)
01415
01416 #define SSE_REGNO(N) \
01417 ((N) < 8 ? FIRST_SSE_REG + (N) : FIRST_REX_SSE_REG + (N) - 8)
01418 #define SSE_REG_P(N) (REG_P (N) && SSE_REGNO_P (REGNO (N)))
01419
01420 #define SSE_FLOAT_MODE_P(MODE) \
01421 ((TARGET_SSE && (MODE) == SFmode) || (TARGET_SSE2 && (MODE) == DFmode))
01422
01423 #define MMX_REGNO_P(N) ((N) >= FIRST_MMX_REG && (N) <= LAST_MMX_REG)
01424 #define MMX_REG_P(XOP) (REG_P (XOP) && MMX_REGNO_P (REGNO (XOP)))
01425
01426 #define STACK_REG_P(XOP) \
01427 (REG_P (XOP) && \
01428 REGNO (XOP) >= FIRST_STACK_REG && \
01429 REGNO (XOP) <= LAST_STACK_REG)
01430
01431 #define NON_STACK_REG_P(XOP) (REG_P (XOP) && ! STACK_REG_P (XOP))
01432
01433 #define STACK_TOP_P(XOP) (REG_P (XOP) && REGNO (XOP) == FIRST_STACK_REG)
01434
01435 #define CC_REG_P(X) (REG_P (X) && CC_REGNO_P (REGNO (X)))
01436 #define CC_REGNO_P(X) ((X) == FLAGS_REG || (X) == FPSR_REG)
01437
01438
01439
01440 #define INDEX_REG_CLASS INDEX_REGS
01441 #define BASE_REG_CLASS GENERAL_REGS
01442
01443
01444
01445
01446
01447
01448
01449
01450 #define REG_CLASS_FROM_LETTER(C) \
01451 ((C) == 'r' ? GENERAL_REGS : \
01452 (C) == 'R' ? LEGACY_REGS : \
01453 (C) == 'q' ? TARGET_64BIT ? GENERAL_REGS : Q_REGS : \
01454 (C) == 'Q' ? Q_REGS : \
01455 (C) == 'f' ? (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 \
01456 ? FLOAT_REGS \
01457 : NO_REGS) : \
01458 (C) == 't' ? (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 \
01459 ? FP_TOP_REG \
01460 : NO_REGS) : \
01461 (C) == 'u' ? (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387 \
01462 ? FP_SECOND_REG \
01463 : NO_REGS) : \
01464 (C) == 'a' ? AREG : \
01465 (C) == 'b' ? BREG : \
01466 (C) == 'c' ? CREG : \
01467 (C) == 'd' ? DREG : \
01468 (C) == 'x' ? TARGET_SSE ? SSE_REGS : NO_REGS : \
01469 (C) == 'Y' ? TARGET_SSE2? SSE_REGS : NO_REGS : \
01470 (C) == 'y' ? TARGET_MMX ? MMX_REGS : NO_REGS : \
01471 (C) == 'A' ? AD_REGS : \
01472 (C) == 'D' ? DIREG : \
01473 (C) == 'S' ? SIREG : \
01474 (C) == 'l' ? INDEX_REGS : \
01475 NO_REGS)
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
01492 ((C) == 'I' ? (VALUE) >= 0 && (VALUE) <= 31 \
01493 : (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 63 \
01494 : (C) == 'K' ? (VALUE) >= -128 && (VALUE) <= 127 \
01495 : (C) == 'L' ? (VALUE) == 0xff || (VALUE) == 0xffff \
01496 : (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 \
01497 : (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 \
01498 : 0)
01499
01500
01501
01502
01503
01504
01505 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
01506 ((C) == 'G' ? standard_80387_constant_p (VALUE) \
01507 : 0)
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521 #define EXTRA_CONSTRAINT(VALUE, D) \
01522 ((D) == 'e' ? x86_64_immediate_operand (VALUE, VOIDmode) \
01523 : (D) == 'Z' ? x86_64_zext_immediate_operand (VALUE, VOIDmode) \
01524 : (D) == 'C' ? standard_sse_constant_p (VALUE) \
01525 : 0)
01526
01527
01528
01529
01530
01531 #define LIMIT_RELOAD_CLASS(MODE, CLASS) \
01532 ((MODE) == QImode && !TARGET_64BIT \
01533 && ((CLASS) == ALL_REGS || (CLASS) == GENERAL_REGS \
01534 || (CLASS) == LEGACY_REGS || (CLASS) == INDEX_REGS) \
01535 ? Q_REGS : (CLASS))
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550 #define PREFERRED_RELOAD_CLASS(X, CLASS) \
01551 ix86_preferred_reload_class ((X), (CLASS))
01552
01553
01554
01555 #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \
01556 ix86_secondary_memory_needed ((CLASS1), (CLASS2), (MODE), 1)
01557
01558
01559
01560
01561
01562 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, OUT) \
01563 (((CLASS) == GENERAL_REGS || (CLASS) == LEGACY_REGS \
01564 || (CLASS) == INDEX_REGS) && !TARGET_64BIT && (MODE) == QImode \
01565 ? Q_REGS : NO_REGS)
01566
01567
01568
01569
01570
01571 #define CLASS_MAX_NREGS(CLASS, MODE) \
01572 (!MAYBE_INTEGER_CLASS_P (CLASS) \
01573 ? (COMPLEX_MODE_P (MODE) ? 2 : 1) \
01574 : (((((MODE) == XFmode ? 12 : GET_MODE_SIZE (MODE))) \
01575 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593 #define CLASS_LIKELY_SPILLED_P(CLASS) \
01594 (((CLASS) == AREG) \
01595 || ((CLASS) == DREG) \
01596 || ((CLASS) == CREG) \
01597 || ((CLASS) == BREG) \
01598 || ((CLASS) == AD_REGS) \
01599 || ((CLASS) == SIREG) \
01600 || ((CLASS) == DIREG) \
01601 || ((CLASS) == FP_TOP_REG) \
01602 || ((CLASS) == FP_SECOND_REG))
01603
01604
01605
01606 #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
01607 ix86_cannot_change_mode_class (FROM, TO, CLASS)
01608
01609
01610
01611
01612
01613 #define STACK_GROWS_DOWNWARD
01614
01615
01616
01617
01618
01619 #define FRAME_GROWS_DOWNWARD
01620
01621
01622
01623
01624
01625 #define STARTING_FRAME_OFFSET 0
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636 #define PUSH_ROUNDING(BYTES) \
01637 (TARGET_64BIT \
01638 ? (((BYTES) + 7) & (-8)) \
01639 : (((BYTES) + 1) & (-2)))
01640
01641
01642
01643
01644
01645
01646
01647 #define ACCUMULATE_OUTGOING_ARGS TARGET_ACCUMULATE_OUTGOING_ARGS
01648
01649
01650
01651
01652 #define PUSH_ARGS (TARGET_PUSH_ARGS && !ACCUMULATE_OUTGOING_ARGS)
01653
01654
01655
01656 #define PUSH_ARGS_REVERSED 1
01657
01658
01659 #define FIRST_PARM_OFFSET(FNDECL) 0
01660
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670 #define REG_PARM_STACK_SPACE(FNDECL) 0
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) \
01690 ix86_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE))
01691
01692
01693
01694
01695
01696 #define FUNCTION_VALUE(VALTYPE, FUNC) \
01697 ix86_function_value (VALTYPE)
01698
01699 #define FUNCTION_VALUE_REGNO_P(N) \
01700 ix86_function_value_regno_p (N)
01701
01702
01703
01704
01705 #define LIBCALL_VALUE(MODE) \
01706 ix86_libcall_value (MODE)
01707
01708
01709
01710
01711
01712 #define APPLY_RESULT_SIZE (8+108)
01713
01714
01715 #define FUNCTION_ARG_REGNO_P(N) ix86_function_arg_regno_p (N)
01716
01717
01718
01719
01720
01721
01722
01723 typedef struct ix86_args {
01724 int words;
01725 int nregs;
01726 int regno;
01727 int fastcall;
01728 int sse_words;
01729 int sse_nregs;
01730 int warn_sse;
01731 int warn_mmx;
01732 int sse_regno;
01733 int mmx_words;
01734 int mmx_nregs;
01735 int mmx_regno;
01736 int maybe_vaarg;
01737 } CUMULATIVE_ARGS;
01738
01739
01740
01741
01742
01743 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
01744 init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL))
01745
01746
01747
01748
01749
01750 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01751 function_arg_advance (&(CUM), (MODE), (TYPE), (NAMED))
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01767 function_arg (&(CUM), (MODE), (TYPE), (NAMED))
01768
01769
01770 #define EXPAND_BUILTIN_VA_START(VALIST, NEXTARG) \
01771 ix86_va_start (VALIST, NEXTARG)
01772
01773 #define TARGET_ASM_FILE_END ix86_file_end
01774 #define NEED_INDICATE_EXEC_STACK 0
01775
01776
01777
01778
01779 #define FUNCTION_PROFILER(FILE, LABELNO) x86_function_profiler (FILE, LABELNO)
01780
01781 #define MCOUNT_NAME "_mcount"
01782
01783 #define PROFILE_COUNT_REGISTER "edx"
01784
01785
01786
01787
01788
01789
01790
01791
01792
01793 #define EXIT_IGNORE_STACK 1
01794
01795
01796
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807 #define TRAMPOLINE_SIZE (TARGET_64BIT ? 23 : 10)
01808
01809
01810
01811
01812
01813 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01814 x86_initialize_trampoline ((TRAMP), (FNADDR), (CXT))
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829 #define ELIMINABLE_REGS \
01830 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01831 { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
01832 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01833 { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}} \
01834
01835
01836
01837
01838
01839
01840 #define CAN_ELIMINATE(FROM, TO) \
01841 ((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1)
01842
01843
01844
01845
01846 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01847 ((OFFSET) = ix86_initial_elimination_offset ((FROM), (TO)))
01848
01849
01850
01851
01852
01853
01854
01855
01856
01857
01858
01859 #define REGNO_OK_FOR_INDEX_P(REGNO) \
01860 ((REGNO) < STACK_POINTER_REGNUM \
01861 || (REGNO >= FIRST_REX_INT_REG \
01862 && (REGNO) <= LAST_REX_INT_REG) \
01863 || ((unsigned) reg_renumber[(REGNO)] >= FIRST_REX_INT_REG \
01864 && (unsigned) reg_renumber[(REGNO)] <= LAST_REX_INT_REG) \
01865 || (unsigned) reg_renumber[(REGNO)] < STACK_POINTER_REGNUM)
01866
01867 #define REGNO_OK_FOR_BASE_P(REGNO) \
01868 ((REGNO) <= STACK_POINTER_REGNUM \
01869 || (REGNO) == ARG_POINTER_REGNUM \
01870 || (REGNO) == FRAME_POINTER_REGNUM \
01871 || (REGNO >= FIRST_REX_INT_REG \
01872 && (REGNO) <= LAST_REX_INT_REG) \
01873 || ((unsigned) reg_renumber[(REGNO)] >= FIRST_REX_INT_REG \
01874 && (unsigned) reg_renumber[(REGNO)] <= LAST_REX_INT_REG) \
01875 || (unsigned) reg_renumber[(REGNO)] <= STACK_POINTER_REGNUM)
01876
01877 #define REGNO_OK_FOR_SIREG_P(REGNO) \
01878 ((REGNO) == 4 || reg_renumber[(REGNO)] == 4)
01879 #define REGNO_OK_FOR_DIREG_P(REGNO) \
01880 ((REGNO) == 5 || reg_renumber[(REGNO)] == 5)
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892
01893
01894
01895
01896
01897 #define REG_OK_FOR_INDEX_NONSTRICT_P(X) \
01898 (REGNO (X) < STACK_POINTER_REGNUM \
01899 || (REGNO (X) >= FIRST_REX_INT_REG \
01900 && REGNO (X) <= LAST_REX_INT_REG) \
01901 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
01902
01903 #define REG_OK_FOR_BASE_NONSTRICT_P(X) \
01904 (REGNO (X) <= STACK_POINTER_REGNUM \
01905 || REGNO (X) == ARG_POINTER_REGNUM \
01906 || REGNO (X) == FRAME_POINTER_REGNUM \
01907 || (REGNO (X) >= FIRST_REX_INT_REG \
01908 && REGNO (X) <= LAST_REX_INT_REG) \
01909 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
01910
01911
01912 #define REG_OK_FOR_INDEX_STRICT_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
01913 #define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01914
01915 #ifndef REG_OK_STRICT
01916 #define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_NONSTRICT_P (X)
01917 #define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NONSTRICT_P (X)
01918
01919 #else
01920 #define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_STRICT_P (X)
01921 #define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X)
01922 #endif
01923
01924
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935 #define MAX_REGS_PER_ADDRESS 2
01936
01937 #define CONSTANT_ADDRESS_P(X) constant_address_p (X)
01938
01939
01940
01941
01942 #define LEGITIMATE_CONSTANT_P(X) legitimate_constant_p (X)
01943
01944 #ifdef REG_OK_STRICT
01945 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01946 do { \
01947 if (legitimate_address_p ((MODE), (X), 1)) \
01948 goto ADDR; \
01949 } while (0)
01950
01951 #else
01952 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01953 do { \
01954 if (legitimate_address_p ((MODE), (X), 0)) \
01955 goto ADDR; \
01956 } while (0)
01957
01958 #endif
01959
01960
01961
01962
01963
01964
01965
01966
01967
01968
01969 #define FIND_BASE_TERM(X) ix86_find_base_term (X)
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
01993 do { \
01994 (X) = legitimize_address ((X), (OLDX), (MODE)); \
01995 if (memory_address_p ((MODE), (X))) \
01996 goto WIN; \
01997 } while (0)
01998
01999 #define REWRITE_ADDRESS(X) rewrite_address (X)
02000
02001
02002
02003
02004
02005 #define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X)
02006
02007 #define SYMBOLIC_CONST(X) \
02008 (GET_CODE (X) == SYMBOL_REF \
02009 || GET_CODE (X) == LABEL_REF \
02010 || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))
02011
02012
02013
02014
02015
02016 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
02017 do { \
02018 if (GET_CODE (ADDR) == POST_INC \
02019 || GET_CODE (ADDR) == POST_DEC) \
02020 goto LABEL; \
02021 } while (0)
02022
02023
02024 enum ix86_builtins
02025 {
02026 IX86_BUILTIN_ADDPS,
02027 IX86_BUILTIN_ADDSS,
02028 IX86_BUILTIN_DIVPS,
02029 IX86_BUILTIN_DIVSS,
02030 IX86_BUILTIN_MULPS,
02031 IX86_BUILTIN_MULSS,
02032 IX86_BUILTIN_SUBPS,
02033 IX86_BUILTIN_SUBSS,
02034
02035 IX86_BUILTIN_CMPEQPS,
02036 IX86_BUILTIN_CMPLTPS,
02037 IX86_BUILTIN_CMPLEPS,
02038 IX86_BUILTIN_CMPGTPS,
02039 IX86_BUILTIN_CMPGEPS,
02040 IX86_BUILTIN_CMPNEQPS,
02041 IX86_BUILTIN_CMPNLTPS,
02042 IX86_BUILTIN_CMPNLEPS,
02043 IX86_BUILTIN_CMPNGTPS,
02044 IX86_BUILTIN_CMPNGEPS,
02045 IX86_BUILTIN_CMPORDPS,
02046 IX86_BUILTIN_CMPUNORDPS,
02047 IX86_BUILTIN_CMPNEPS,
02048 IX86_BUILTIN_CMPEQSS,
02049 IX86_BUILTIN_CMPLTSS,
02050 IX86_BUILTIN_CMPLESS,
02051 IX86_BUILTIN_CMPNEQSS,
02052 IX86_BUILTIN_CMPNLTSS,
02053 IX86_BUILTIN_CMPNLESS,
02054 IX86_BUILTIN_CMPNGTSS,
02055 IX86_BUILTIN_CMPNGESS,
02056 IX86_BUILTIN_CMPORDSS,
02057 IX86_BUILTIN_CMPUNORDSS,
02058 IX86_BUILTIN_CMPNESS,
02059
02060 IX86_BUILTIN_COMIEQSS,
02061 IX86_BUILTIN_COMILTSS,
02062 IX86_BUILTIN_COMILESS,
02063 IX86_BUILTIN_COMIGTSS,
02064 IX86_BUILTIN_COMIGESS,
02065 IX86_BUILTIN_COMINEQSS,
02066 IX86_BUILTIN_UCOMIEQSS,
02067 IX86_BUILTIN_UCOMILTSS,
02068 IX86_BUILTIN_UCOMILESS,
02069 IX86_BUILTIN_UCOMIGTSS,
02070 IX86_BUILTIN_UCOMIGESS,
02071 IX86_BUILTIN_UCOMINEQSS,
02072
02073 IX86_BUILTIN_CVTPI2PS,
02074 IX86_BUILTIN_CVTPS2PI,
02075 IX86_BUILTIN_CVTSI2SS,
02076 IX86_BUILTIN_CVTSI642SS,
02077 IX86_BUILTIN_CVTSS2SI,
02078 IX86_BUILTIN_CVTSS2SI64,
02079 IX86_BUILTIN_CVTTPS2PI,
02080 IX86_BUILTIN_CVTTSS2SI,
02081 IX86_BUILTIN_CVTTSS2SI64,
02082
02083 IX86_BUILTIN_MAXPS,
02084 IX86_BUILTIN_MAXSS,
02085 IX86_BUILTIN_MINPS,
02086 IX86_BUILTIN_MINSS,
02087
02088 IX86_BUILTIN_LOADUPS,
02089 IX86_BUILTIN_STOREUPS,
02090 IX86_BUILTIN_MOVSS,
02091
02092 IX86_BUILTIN_MOVHLPS,
02093 IX86_BUILTIN_MOVLHPS,
02094 IX86_BUILTIN_LOADHPS,
02095 IX86_BUILTIN_LOADLPS,
02096 IX86_BUILTIN_STOREHPS,
02097 IX86_BUILTIN_STORELPS,
02098
02099 IX86_BUILTIN_MASKMOVQ,
02100 IX86_BUILTIN_MOVMSKPS,
02101 IX86_BUILTIN_PMOVMSKB,
02102
02103 IX86_BUILTIN_MOVNTPS,
02104 IX86_BUILTIN_MOVNTQ,
02105
02106 IX86_BUILTIN_LOADDQU,
02107 IX86_BUILTIN_STOREDQU,
02108
02109 IX86_BUILTIN_PACKSSWB,
02110 IX86_BUILTIN_PACKSSDW,
02111 IX86_BUILTIN_PACKUSWB,
02112
02113 IX86_BUILTIN_PADDB,
02114 IX86_BUILTIN_PADDW,
02115 IX86_BUILTIN_PADDD,
02116 IX86_BUILTIN_PADDQ,
02117 IX86_BUILTIN_PADDSB,
02118 IX86_BUILTIN_PADDSW,
02119 IX86_BUILTIN_PADDUSB,
02120 IX86_BUILTIN_PADDUSW,
02121 IX86_BUILTIN_PSUBB,
02122 IX86_BUILTIN_PSUBW,
02123 IX86_BUILTIN_PSUBD,
02124 IX86_BUILTIN_PSUBQ,
02125 IX86_BUILTIN_PSUBSB,
02126 IX86_BUILTIN_PSUBSW,
02127 IX86_BUILTIN_PSUBUSB,
02128 IX86_BUILTIN_PSUBUSW,
02129
02130 IX86_BUILTIN_PAND,
02131 IX86_BUILTIN_PANDN,
02132 IX86_BUILTIN_POR,
02133 IX86_BUILTIN_PXOR,
02134
02135 IX86_BUILTIN_PAVGB,
02136 IX86_BUILTIN_PAVGW,
02137
02138 IX86_BUILTIN_PCMPEQB,
02139 IX86_BUILTIN_PCMPEQW,
02140 IX86_BUILTIN_PCMPEQD,
02141 IX86_BUILTIN_PCMPGTB,
02142 IX86_BUILTIN_PCMPGTW,
02143 IX86_BUILTIN_PCMPGTD,
02144
02145 IX86_BUILTIN_PMADDWD,
02146
02147 IX86_BUILTIN_PMAXSW,
02148 IX86_BUILTIN_PMAXUB,
02149 IX86_BUILTIN_PMINSW,
02150 IX86_BUILTIN_PMINUB,
02151
02152 IX86_BUILTIN_PMULHUW,
02153 IX86_BUILTIN_PMULHW,
02154 IX86_BUILTIN_PMULLW,
02155
02156 IX86_BUILTIN_PSADBW,
02157 IX86_BUILTIN_PSHUFW,
02158
02159 IX86_BUILTIN_PSLLW,
02160 IX86_BUILTIN_PSLLD,
02161 IX86_BUILTIN_PSLLQ,
02162 IX86_BUILTIN_PSRAW,
02163 IX86_BUILTIN_PSRAD,
02164 IX86_BUILTIN_PSRLW,
02165 IX86_BUILTIN_PSRLD,
02166 IX86_BUILTIN_PSRLQ,
02167 IX86_BUILTIN_PSLLWI,
02168 IX86_BUILTIN_PSLLDI,
02169 IX86_BUILTIN_PSLLQI,
02170 IX86_BUILTIN_PSRAWI,
02171 IX86_BUILTIN_PSRADI,
02172 IX86_BUILTIN_PSRLWI,
02173 IX86_BUILTIN_PSRLDI,
02174 IX86_BUILTIN_PSRLQI,
02175
02176 IX86_BUILTIN_PUNPCKHBW,
02177 IX86_BUILTIN_PUNPCKHWD,
02178 IX86_BUILTIN_PUNPCKHDQ,
02179 IX86_BUILTIN_PUNPCKLBW,
02180 IX86_BUILTIN_PUNPCKLWD,
02181 IX86_BUILTIN_PUNPCKLDQ,
02182
02183 IX86_BUILTIN_SHUFPS,
02184
02185 IX86_BUILTIN_RCPPS,
02186 IX86_BUILTIN_RCPSS,
02187 IX86_BUILTIN_RSQRTPS,
02188 IX86_BUILTIN_RSQRTSS,
02189 IX86_BUILTIN_SQRTPS,
02190 IX86_BUILTIN_SQRTSS,
02191
02192 IX86_BUILTIN_UNPCKHPS,
02193 IX86_BUILTIN_UNPCKLPS,
02194
02195 IX86_BUILTIN_ANDPS,
02196 IX86_BUILTIN_ANDNPS,
02197 IX86_BUILTIN_ORPS,
02198 IX86_BUILTIN_XORPS,
02199
02200 IX86_BUILTIN_EMMS,
02201 IX86_BUILTIN_LDMXCSR,
02202 IX86_BUILTIN_STMXCSR,
02203 IX86_BUILTIN_SFENCE,
02204
02205
02206 IX86_BUILTIN_FEMMS,
02207 IX86_BUILTIN_PAVGUSB,
02208 IX86_BUILTIN_PF2ID,
02209 IX86_BUILTIN_PFACC,
02210 IX86_BUILTIN_PFADD,
02211 IX86_BUILTIN_PFCMPEQ,
02212 IX86_BUILTIN_PFCMPGE,
02213 IX86_BUILTIN_PFCMPGT,
02214 IX86_BUILTIN_PFMAX,
02215 IX86_BUILTIN_PFMIN,
02216 IX86_BUILTIN_PFMUL,
02217 IX86_BUILTIN_PFRCP,
02218 IX86_BUILTIN_PFRCPIT1,
02219 IX86_BUILTIN_PFRCPIT2,
02220 IX86_BUILTIN_PFRSQIT1,
02221 IX86_BUILTIN_PFRSQRT,
02222 IX86_BUILTIN_PFSUB,
02223 IX86_BUILTIN_PFSUBR,
02224 IX86_BUILTIN_PI2FD,
02225 IX86_BUILTIN_PMULHRW,
02226
02227
02228 IX86_BUILTIN_PF2IW,
02229 IX86_BUILTIN_PFNACC,
02230 IX86_BUILTIN_PFPNACC,
02231 IX86_BUILTIN_PI2FW,
02232 IX86_BUILTIN_PSWAPDSI,
02233 IX86_BUILTIN_PSWAPDSF,
02234
02235
02236 IX86_BUILTIN_ADDPD,
02237 IX86_BUILTIN_ADDSD,
02238 IX86_BUILTIN_DIVPD,
02239 IX86_BUILTIN_DIVSD,
02240 IX86_BUILTIN_MULPD,
02241 IX86_BUILTIN_MULSD,
02242 IX86_BUILTIN_SUBPD,
02243 IX86_BUILTIN_SUBSD,
02244
02245 IX86_BUILTIN_CMPEQPD,
02246 IX86_BUILTIN_CMPLTPD,
02247 IX86_BUILTIN_CMPLEPD,
02248 IX86_BUILTIN_CMPGTPD,
02249 IX86_BUILTIN_CMPGEPD,
02250 IX86_BUILTIN_CMPNEQPD,
02251 IX86_BUILTIN_CMPNLTPD,
02252 IX86_BUILTIN_CMPNLEPD,
02253 IX86_BUILTIN_CMPNGTPD,
02254 IX86_BUILTIN_CMPNGEPD,
02255 IX86_BUILTIN_CMPORDPD,
02256 IX86_BUILTIN_CMPUNORDPD,
02257 IX86_BUILTIN_CMPNEPD,
02258 IX86_BUILTIN_CMPEQSD,
02259 IX86_BUILTIN_CMPLTSD,
02260 IX86_BUILTIN_CMPLESD,
02261 IX86_BUILTIN_CMPNEQSD,
02262 IX86_BUILTIN_CMPNLTSD,
02263 IX86_BUILTIN_CMPNLESD,
02264 IX86_BUILTIN_CMPORDSD,
02265 IX86_BUILTIN_CMPUNORDSD,
02266 IX86_BUILTIN_CMPNESD,
02267
02268 IX86_BUILTIN_COMIEQSD,
02269 IX86_BUILTIN_COMILTSD,
02270 IX86_BUILTIN_COMILESD,
02271 IX86_BUILTIN_COMIGTSD,
02272 IX86_BUILTIN_COMIGESD,
02273 IX86_BUILTIN_COMINEQSD,
02274 IX86_BUILTIN_UCOMIEQSD,
02275 IX86_BUILTIN_UCOMILTSD,
02276 IX86_BUILTIN_UCOMILESD,
02277 IX86_BUILTIN_UCOMIGTSD,
02278 IX86_BUILTIN_UCOMIGESD,
02279 IX86_BUILTIN_UCOMINEQSD,
02280
02281 IX86_BUILTIN_MAXPD,
02282 IX86_BUILTIN_MAXSD,
02283 IX86_BUILTIN_MINPD,
02284 IX86_BUILTIN_MINSD,
02285
02286 IX86_BUILTIN_ANDPD,
02287 IX86_BUILTIN_ANDNPD,
02288 IX86_BUILTIN_ORPD,
02289 IX86_BUILTIN_XORPD,
02290
02291 IX86_BUILTIN_SQRTPD,
02292 IX86_BUILTIN_SQRTSD,
02293
02294 IX86_BUILTIN_UNPCKHPD,
02295 IX86_BUILTIN_UNPCKLPD,
02296
02297 IX86_BUILTIN_SHUFPD,
02298
02299 IX86_BUILTIN_LOADUPD,
02300 IX86_BUILTIN_STOREUPD,
02301 IX86_BUILTIN_MOVSD,
02302
02303 IX86_BUILTIN_LOADHPD,
02304 IX86_BUILTIN_LOADLPD,
02305
02306 IX86_BUILTIN_CVTDQ2PD,
02307 IX86_BUILTIN_CVTDQ2PS,
02308
02309 IX86_BUILTIN_CVTPD2DQ,
02310 IX86_BUILTIN_CVTPD2PI,
02311 IX86_BUILTIN_CVTPD2PS,
02312 IX86_BUILTIN_CVTTPD2DQ,
02313 IX86_BUILTIN_CVTTPD2PI,
02314
02315 IX86_BUILTIN_CVTPI2PD,
02316 IX86_BUILTIN_CVTSI2SD,
02317 IX86_BUILTIN_CVTSI642SD,
02318
02319 IX86_BUILTIN_CVTSD2SI,
02320 IX86_BUILTIN_CVTSD2SI64,
02321 IX86_BUILTIN_CVTSD2SS,
02322 IX86_BUILTIN_CVTSS2SD,
02323 IX86_BUILTIN_CVTTSD2SI,
02324 IX86_BUILTIN_CVTTSD2SI64,
02325
02326 IX86_BUILTIN_CVTPS2DQ,
02327 IX86_BUILTIN_CVTPS2PD,
02328 IX86_BUILTIN_CVTTPS2DQ,
02329
02330 IX86_BUILTIN_MOVNTI,
02331 IX86_BUILTIN_MOVNTPD,
02332 IX86_BUILTIN_MOVNTDQ,
02333
02334
02335 IX86_BUILTIN_MASKMOVDQU,
02336 IX86_BUILTIN_MOVMSKPD,
02337 IX86_BUILTIN_PMOVMSKB128,
02338
02339 IX86_BUILTIN_PACKSSWB128,
02340 IX86_BUILTIN_PACKSSDW128,
02341 IX86_BUILTIN_PACKUSWB128,
02342
02343 IX86_BUILTIN_PADDB128,
02344 IX86_BUILTIN_PADDW128,
02345 IX86_BUILTIN_PADDD128,
02346 IX86_BUILTIN_PADDQ128,
02347 IX86_BUILTIN_PADDSB128,
02348 IX86_BUILTIN_PADDSW128,
02349 IX86_BUILTIN_PADDUSB128,
02350 IX86_BUILTIN_PADDUSW128,
02351 IX86_BUILTIN_PSUBB128,
02352 IX86_BUILTIN_PSUBW128,
02353 IX86_BUILTIN_PSUBD128,
02354 IX86_BUILTIN_PSUBQ128,
02355 IX86_BUILTIN_PSUBSB128,
02356 IX86_BUILTIN_PSUBSW128,
02357 IX86_BUILTIN_PSUBUSB128,
02358 IX86_BUILTIN_PSUBUSW128,
02359
02360 IX86_BUILTIN_PAND128,
02361 IX86_BUILTIN_PANDN128,
02362 IX86_BUILTIN_POR128,
02363 IX86_BUILTIN_PXOR128,
02364
02365 IX86_BUILTIN_PAVGB128,
02366 IX86_BUILTIN_PAVGW128,
02367
02368 IX86_BUILTIN_PCMPEQB128,
02369 IX86_BUILTIN_PCMPEQW128,
02370 IX86_BUILTIN_PCMPEQD128,
02371 IX86_BUILTIN_PCMPGTB128,
02372 IX86_BUILTIN_PCMPGTW128,
02373 IX86_BUILTIN_PCMPGTD128,
02374
02375 IX86_BUILTIN_PMADDWD128,
02376
02377 IX86_BUILTIN_PMAXSW128,
02378 IX86_BUILTIN_PMAXUB128,
02379 IX86_BUILTIN_PMINSW128,
02380 IX86_BUILTIN_PMINUB128,
02381
02382 IX86_BUILTIN_PMULUDQ,
02383 IX86_BUILTIN_PMULUDQ128,
02384 IX86_BUILTIN_PMULHUW128,
02385 IX86_BUILTIN_PMULHW128,
02386 IX86_BUILTIN_PMULLW128,
02387
02388 IX86_BUILTIN_PSADBW128,
02389 IX86_BUILTIN_PSHUFHW,
02390 IX86_BUILTIN_PSHUFLW,
02391 IX86_BUILTIN_PSHUFD,
02392
02393 IX86_BUILTIN_PSLLW128,
02394 IX86_BUILTIN_PSLLD128,
02395 IX86_BUILTIN_PSLLQ128,
02396 IX86_BUILTIN_PSRAW128,
02397 IX86_BUILTIN_PSRAD128,
02398 IX86_BUILTIN_PSRLW128,
02399 IX86_BUILTIN_PSRLD128,
02400 IX86_BUILTIN_PSRLQ128,
02401 IX86_BUILTIN_PSLLDQI128,
02402 IX86_BUILTIN_PSLLWI128,
02403 IX86_BUILTIN_PSLLDI128,
02404 IX86_BUILTIN_PSLLQI128,
02405 IX86_BUILTIN_PSRAWI128,
02406 IX86_BUILTIN_PSRADI128,
02407 IX86_BUILTIN_PSRLDQI128,
02408 IX86_BUILTIN_PSRLWI128,
02409 IX86_BUILTIN_PSRLDI128,
02410 IX86_BUILTIN_PSRLQI128,
02411
02412 IX86_BUILTIN_PUNPCKHBW128,
02413 IX86_BUILTIN_PUNPCKHWD128,
02414 IX86_BUILTIN_PUNPCKHDQ128,
02415 IX86_BUILTIN_PUNPCKHQDQ128,
02416 IX86_BUILTIN_PUNPCKLBW128,
02417 IX86_BUILTIN_PUNPCKLWD128,
02418 IX86_BUILTIN_PUNPCKLDQ128,
02419 IX86_BUILTIN_PUNPCKLQDQ128,
02420
02421 IX86_BUILTIN_CLFLUSH,
02422 IX86_BUILTIN_MFENCE,
02423 IX86_BUILTIN_LFENCE,
02424
02425
02426 IX86_BUILTIN_ADDSUBPS,
02427 IX86_BUILTIN_HADDPS,
02428 IX86_BUILTIN_HSUBPS,
02429 IX86_BUILTIN_MOVSHDUP,
02430 IX86_BUILTIN_MOVSLDUP,
02431 IX86_BUILTIN_ADDSUBPD,
02432 IX86_BUILTIN_HADDPD,
02433 IX86_BUILTIN_HSUBPD,
02434 IX86_BUILTIN_LDDQU,
02435
02436 IX86_BUILTIN_MONITOR,
02437 IX86_BUILTIN_MWAIT,
02438
02439 IX86_BUILTIN_VEC_INIT_V2SI,
02440 IX86_BUILTIN_VEC_INIT_V4HI,
02441 IX86_BUILTIN_VEC_INIT_V8QI,
02442 IX86_BUILTIN_VEC_EXT_V2DF,
02443 IX86_BUILTIN_VEC_EXT_V2DI,
02444 IX86_BUILTIN_VEC_EXT_V4SF,
02445 IX86_BUILTIN_VEC_EXT_V4SI,
02446 IX86_BUILTIN_VEC_EXT_V8HI,
02447 IX86_BUILTIN_VEC_EXT_V2SI,
02448 IX86_BUILTIN_VEC_EXT_V4HI,
02449 IX86_BUILTIN_VEC_SET_V8HI,
02450 IX86_BUILTIN_VEC_SET_V4HI,
02451
02452 IX86_BUILTIN_MAX
02453 };
02454
02455
02456
02457
02458
02459 #define REGPARM_MAX (TARGET_64BIT ? 6 : 3)
02460
02461 #define SSE_REGPARM_MAX (TARGET_64BIT ? 8 : (TARGET_SSE ? 3 : 0))
02462
02463 #define MMX_REGPARM_MAX (TARGET_64BIT ? 0 : (TARGET_MMX ? 3 : 0))
02464
02465
02466
02467
02468 #define CASE_VECTOR_MODE (!TARGET_64BIT || flag_pic ? SImode : DImode)
02469
02470
02471 #define DEFAULT_SIGNED_CHAR 1
02472
02473
02474 #define PREFETCH_BLOCK ix86_cost->prefetch_block
02475
02476
02477 #define SIMULTANEOUS_PREFETCHES ix86_cost->simultaneous_prefetches
02478
02479
02480
02481 #define MOVE_MAX 16
02482
02483
02484
02485
02486 #define MOVE_MAX_PIECES (TARGET_64BIT ? 8 : 4)
02487
02488
02489
02490
02491
02492
02493
02494
02495 #define MOVE_RATIO (optimize_size ? 3 : ix86_cost->move_ratio)
02496
02497
02498
02499
02500 #define CLEAR_RATIO (optimize_size ? 2 \
02501 : ix86_cost->move_ratio > 6 ? 6 : ix86_cost->move_ratio)
02502
02503
02504
02505
02506
02507
02508
02509
02510
02511
02512 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
02513
02514
02515
02516
02517
02518
02519
02520
02521
02522 #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
02523 do { \
02524 if (((MODE) == HImode && TARGET_PROMOTE_HI_REGS) \
02525 || ((MODE) == QImode && TARGET_PROMOTE_QI_REGS)) \
02526 (MODE) = SImode; \
02527 } while (0)
02528
02529
02530
02531
02532 #define Pmode (TARGET_64BIT ? DImode : SImode)
02533
02534
02535
02536
02537 #define FUNCTION_MODE QImode
02538
02539
02540
02541
02542
02543
02544
02545
02546
02547
02548 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
02549 ix86_register_move_cost ((MODE), (CLASS1), (CLASS2))
02550
02551
02552
02553
02554
02555
02556
02557
02558
02559 #define MEMORY_MOVE_COST(MODE, CLASS, IN) \
02560 ix86_memory_move_cost ((MODE), (CLASS), (IN))
02561
02562
02563
02564
02565 #define BRANCH_COST ix86_branch_cost
02566
02567
02568
02569
02570
02571
02572
02573
02574
02575
02576
02577
02578
02579
02580
02581 #define SLOW_BYTE_ACCESS 0
02582
02583
02584 #define SLOW_SHORT_ACCESS 0
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599
02600
02601
02602
02603
02604
02605
02606 #define NO_FUNCTION_CSE
02607
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617 #define SELECT_CC_MODE(OP, X, Y) ix86_cc_mode ((OP), (X), (Y))
02618
02619
02620
02621
02622 #define REVERSIBLE_CC_MODE(MODE) 1
02623
02624
02625
02626 #define REVERSE_CONDITION(CODE, MODE) ix86_reverse_condition ((CODE), (MODE))
02627
02628
02629
02630
02631
02632
02633
02634
02635
02636
02637
02638
02639
02640
02641 #define HI_REGISTER_NAMES \
02642 {"ax","dx","cx","bx","si","di","bp","sp", \
02643 "st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)", \
02644 "argp", "flags", "fpsr", "dirflag", "frame", \
02645 "xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7", \
02646 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" , \
02647 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \
02648 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"}
02649
02650 #define REGISTER_NAMES HI_REGISTER_NAMES
02651
02652
02653
02654 #define ADDITIONAL_REGISTER_NAMES \
02655 { { "eax", 0 }, { "edx", 1 }, { "ecx", 2 }, { "ebx", 3 }, \
02656 { "esi", 4 }, { "edi", 5 }, { "ebp", 6 }, { "esp", 7 }, \
02657 { "rax", 0 }, { "rdx", 1 }, { "rcx", 2 }, { "rbx", 3 }, \
02658 { "rsi", 4 }, { "rdi", 5 }, { "rbp", 6 }, { "rsp", 7 }, \
02659 { "al", 0 }, { "dl", 1 }, { "cl", 2 }, { "bl", 3 }, \
02660 { "ah", 0 }, { "dh", 1 }, { "ch", 2 }, { "bh", 3 } }
02661
02662
02663
02664
02665
02666
02667 #define QI_REGISTER_NAMES \
02668 {"al", "dl", "cl", "bl", "sil", "dil", "bpl", "spl",}
02669
02670
02671
02672
02673 #define QI_HIGH_REGISTER_NAMES \
02674 {"ah", "dh", "ch", "bh", }
02675
02676
02677
02678 #define DBX_REGISTER_NUMBER(N) \
02679 (TARGET_64BIT ? dbx64_register_map[(N)] : dbx_register_map[(N)])
02680
02681 extern int const dbx_register_map[FIRST_PSEUDO_REGISTER];
02682 extern int const dbx64_register_map[FIRST_PSEUDO_REGISTER];
02683 extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER];
02684
02685
02686 #define INCOMING_RETURN_ADDR_RTX \
02687 gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM))
02688
02689
02690 #define RETURN_ADDR_RTX(COUNT, FRAME) \
02691 ((COUNT) == 0 \
02692 ? gen_rtx_MEM (Pmode, plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) \
02693 : gen_rtx_MEM (Pmode, plus_constant (FRAME, UNITS_PER_WORD)))
02694
02695
02696 #define DWARF_FRAME_RETURN_COLUMN (TARGET_64BIT ? 16 : 8)
02697
02698
02699 #define INCOMING_FRAME_SP_OFFSET UNITS_PER_WORD
02700
02701
02702 #define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) : INVALID_REGNUM)
02703 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 2)
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713
02714 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
02715 (flag_pic \
02716 ? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
02717 : DW_EH_PE_absptr)
02718
02719
02720
02721
02722 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \
02723 do { \
02724 if (TARGET_64BIT) \
02725 asm_fprintf ((FILE), "\tpush{q}\t%%r%s\n", \
02726 reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \
02727 else \
02728 asm_fprintf ((FILE), "\tpush{l}\t%%e%s\n", reg_names[(REGNO)]); \
02729 } while (0)
02730
02731
02732
02733
02734 #define ASM_OUTPUT_REG_POP(FILE, REGNO) \
02735 do { \
02736 if (TARGET_64BIT) \
02737 asm_fprintf ((FILE), "\tpop{q}\t%%r%s\n", \
02738 reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \
02739 else \
02740 asm_fprintf ((FILE), "\tpop{l}\t%%e%s\n", reg_names[(REGNO)]); \
02741 } while (0)
02742
02743
02744
02745 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
02746 ix86_output_addr_vec_elt ((FILE), (VALUE))
02747
02748
02749
02750 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
02751 ix86_output_addr_diff_elt ((FILE), (VALUE), (REL))
02752
02753
02754
02755
02756 #define JUMP_TABLES_IN_TEXT_SECTION \
02757 (!TARGET_64BIT && flag_pic && !HAVE_AS_GOTOFF_IN_DATA)
02758
02759
02760
02761 #ifdef HAVE_AS_TLS
02762 #define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
02763 i386_output_dwarf_dtprel (FILE, SIZE, X)
02764 #endif
02765
02766
02767
02768
02769 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
02770 asm (SECTION_OP "\n\t" \
02771 "call " USER_LABEL_PREFIX #FUNC "\n" \
02772 TEXT_SECTION_ASM_OP);
02773
02774
02775
02776
02777
02778
02779 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
02780 ((CODE) == '*' || (CODE) == '+' || (CODE) == '&')
02781
02782 #define PRINT_OPERAND(FILE, X, CODE) \
02783 print_operand ((FILE), (X), (CODE))
02784
02785 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
02786 print_operand_address ((FILE), (ADDR))
02787
02788 #define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL) \
02789 do { \
02790 if (! output_addr_const_extra (FILE, (X))) \
02791 goto FAIL; \
02792 } while (0);
02793
02794
02795
02796
02797 #define ASM_OPERAND_LETTER '#'
02798 #define RET return ""
02799 #define AT_SP(MODE) (gen_rtx_MEM ((MODE), stack_pointer_rtx))
02800
02801
02802
02803
02804 enum processor_type
02805 {
02806 PROCESSOR_I386,
02807 PROCESSOR_I486,
02808 PROCESSOR_PENTIUM,
02809 PROCESSOR_PENTIUMPRO,
02810 PROCESSOR_K6,
02811 PROCESSOR_ATHLON,
02812 PROCESSOR_PENTIUM4,
02813 PROCESSOR_K8,
02814 PROCESSOR_NOCONA,
02815 PROCESSOR_max
02816 };
02817
02818 extern enum processor_type ix86_tune;
02819 extern const char *ix86_tune_string;
02820
02821 extern enum processor_type ix86_arch;
02822 extern const char *ix86_arch_string;
02823
02824 enum fpmath_unit
02825 {
02826 FPMATH_387 = 1,
02827 FPMATH_SSE = 2
02828 };
02829
02830 extern enum fpmath_unit ix86_fpmath;
02831 extern const char *ix86_fpmath_string;
02832
02833 enum tls_dialect
02834 {
02835 TLS_DIALECT_GNU,
02836 TLS_DIALECT_SUN
02837 };
02838
02839 extern enum tls_dialect ix86_tls_dialect;
02840 extern const char *ix86_tls_dialect_string;
02841
02842 enum cmodel {
02843 CM_32,
02844 CM_SMALL,
02845 CM_KERNEL,
02846 CM_MEDIUM,
02847 CM_LARGE,
02848 CM_SMALL_PIC
02849 };
02850
02851 extern enum cmodel ix86_cmodel;
02852 extern const char *ix86_cmodel_string;
02853
02854
02855 #define RED_ZONE_SIZE 128
02856
02857 #define RED_ZONE_RESERVE 8
02858
02859 enum asm_dialect {
02860 ASM_ATT,
02861 ASM_INTEL
02862 };
02863
02864 extern const char *ix86_asm_string;
02865 extern enum asm_dialect ix86_asm_dialect;
02866
02867 extern int ix86_regparm;
02868 extern const char *ix86_regparm_string;
02869
02870 extern unsigned int ix86_preferred_stack_boundary;
02871 extern const char *ix86_preferred_stack_boundary_string;
02872
02873 extern int ix86_branch_cost;
02874 extern const char *ix86_branch_cost_string;
02875
02876 extern const char *ix86_debug_arg_string;
02877 extern const char *ix86_debug_addr_string;
02878
02879
02880 extern const char *ix86_align_loops_string;
02881 extern const char *ix86_align_jumps_string;
02882 extern const char *ix86_align_funcs_string;
02883
02884
02885 extern enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER];
02886
02887 extern rtx ix86_compare_op0;
02888 extern rtx ix86_compare_op1;
02889
02890
02891
02892
02893
02894
02895
02896
02897
02898
02899
02900
02901
02902
02903
02904
02905
02906
02907
02908
02909 #define OPTIMIZE_MODE_SWITCHING(ENTITY) ix86_optimize_mode_switching
02910
02911
02912
02913
02914
02915
02916
02917
02918
02919 #define NUM_MODES_FOR_MODE_SWITCHING { I387_CW_ANY }
02920
02921
02922
02923
02924
02925
02926
02927
02928
02929
02930
02931
02932 #define MODE_NEEDED(ENTITY, I) \
02933 (GET_CODE (I) == CALL_INSN \
02934 || (GET_CODE (I) == INSN && (asm_noperands (PATTERN (I)) >= 0 \
02935 || GET_CODE (PATTERN (I)) == ASM_INPUT))\
02936 ? I387_CW_UNINITIALIZED \
02937 : recog_memoized (I) < 0 \
02938 ? I387_CW_ANY \
02939 : get_attr_i387_cw (I))
02940
02941
02942
02943
02944 #define MODE_PRIORITY_TO_MODE(ENTITY, N) (N)
02945
02946
02947
02948
02949
02950 #define EMIT_MODE_SET(ENTITY, MODE, HARD_REGS_LIVE) \
02951 ((MODE) != I387_CW_ANY && (MODE) != I387_CW_UNINITIALIZED \
02952 ? emit_i387_cw_initialization (assign_386_stack_local (HImode, 1), \
02953 assign_386_stack_local (HImode, 2), \
02954 MODE), 0 \
02955 : 0)
02956
02957
02958
02959
02960
02961
02962
02963 #define HARD_REGNO_RENAME_OK(SRC, TARGET) \
02964 ((SRC) < FIRST_STACK_REG || (SRC) > LAST_STACK_REG)
02965
02966
02967 #define DLL_IMPORT_EXPORT_PREFIX '#'
02968
02969 #define FASTCALL_PREFIX '@'
02970
02971 struct machine_function GTY(())
02972 {
02973 struct stack_local_entry *stack_locals;
02974 const char *some_ld_name;
02975 int save_varrargs_registers;
02976 int accesses_prev_frame;
02977 int optimize_mode_switching;
02978
02979
02980 int use_fast_prologue_epilogue;
02981
02982
02983 int use_fast_prologue_epilogue_nregs;
02984 };
02985
02986 #define ix86_stack_locals (cfun->machine->stack_locals)
02987 #define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers)
02988 #define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching)
02989
02990
02991 #define X86_FILE_START_VERSION_DIRECTIVE false
02992 #define X86_FILE_START_FLTUSED false
02993
02994
02995
02996
02997
02998