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