00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _BFIN_CONFIG
00023 #define _BFIN_CONFIG
00024
00025 #define OBJECT_FORMAT_ELF
00026
00027 #define BRT 1
00028 #define BRF 0
00029
00030
00031 #define TARGET_VERSION fprintf (stderr, " (BlackFin bfin)")
00032
00033
00034
00035 extern int target_flags;
00036
00037
00038 #ifndef TARGET_CPU_CPP_BUILTINS
00039 #define TARGET_CPU_CPP_BUILTINS() \
00040 do \
00041 { \
00042 builtin_define_std ("bfin"); \
00043 builtin_define_std ("BFIN"); \
00044 builtin_define ("__ADSPBLACKFIN__"); \
00045 if (TARGET_FDPIC) \
00046 builtin_define ("__BFIN_FDPIC__"); \
00047 if (TARGET_ID_SHARED_LIBRARY) \
00048 builtin_define ("__ID_SHARED_LIB__"); \
00049 } \
00050 while (0)
00051 #endif
00052
00053 #define DRIVER_SELF_SPECS SUBTARGET_DRIVER_SELF_SPECS "\
00054 %{mfdpic:%{!fpic:%{!fpie:%{!fPIC:%{!fPIE:\
00055 %{!fno-pic:%{!fno-pie:%{!fno-PIC:%{!fno-PIE:-fpie}}}}}}}}} \
00056 "
00057 #ifndef SUBTARGET_DRIVER_SELF_SPECS
00058 # define SUBTARGET_DRIVER_SELF_SPECS
00059 #endif
00060
00061 #define LINK_GCC_C_SEQUENCE_SPEC \
00062 "%{mfdpic:%{!static: %L} %{static: %G %L %G}} \
00063 %{!mfdpic:%G %L %G}"
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #undef ASM_SPEC
00074 #define ASM_SPEC "\
00075 %{G*} %{v} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
00076 %{mno-fdpic:-mnopic} %{mfdpic}"
00077
00078 #define LINK_SPEC "\
00079 %{h*} %{v:-V} \
00080 %{b} \
00081 %{mfdpic:-melf32bfinfd -z text} \
00082 %{static:-dn -Bstatic} \
00083 %{shared:-G -Bdynamic} \
00084 %{symbolic:-Bsymbolic} \
00085 %{G*} \
00086 %{YP,*} \
00087 %{Qy:} %{!Qn:-Qy} \
00088 -init __init -fini __fini "
00089
00090
00091 #define TARGET_DSP (1)
00092
00093 #define TARGET_DEFAULT (MASK_SPECLD_ANOMALY | MASK_CSYNC_ANOMALY)
00094
00095
00096 #define MAX_LIBRARY_ID 255
00097
00098 extern const char *bfin_library_id_string;
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 #define OVERRIDE_OPTIONS override_options ()
00110
00111 #define FUNCTION_MODE SImode
00112 #define Pmode SImode
00113
00114
00115
00116 #define STORE_FLAG_VALUE 1
00117
00118
00119
00120 #define STACK_GROWS_DOWNWARD
00121
00122 #define STACK_PUSH_CODE PRE_DEC
00123
00124
00125
00126
00127
00128 #define FRAME_GROWS_DOWNWARD 1
00129
00130
00131
00132 #define FIRST_PARM_OFFSET(DECL) 0
00133
00134
00135
00136
00137
00138 #define STARTING_FRAME_OFFSET 0
00139
00140
00141 #define STACK_POINTER_REGNUM REG_P6
00142
00143
00144 #define FRAME_POINTER_REGNUM REG_P7
00145
00146
00147 #define ARG_POINTER_REGNUM REG_ARGP
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 #define PIC_OFFSET_TABLE_REGNUM (REG_P5)
00158
00159 #define FDPIC_FPTR_REGNO REG_P1
00160 #define FDPIC_REGNO REG_P3
00161 #define OUR_FDPIC_REG get_hard_reg_initial_val (SImode, FDPIC_REGNO)
00162
00163
00164
00165 #define STATIC_CHAIN_REGNUM REG_P2
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 #define FIXED_STACK_AREA 12
00178 #define REG_PARM_STACK_SPACE(FNDECL) FIXED_STACK_AREA
00179
00180
00181
00182 #define OUTGOING_REG_PARM_STACK_SPACE
00183
00184
00185
00186
00187 #define ACCUMULATE_OUTGOING_ARGS 1
00188
00189
00190
00191
00192
00193
00194 #define FRAME_POINTER_REQUIRED (bfin_frame_pointer_required ())
00195
00196
00197
00198
00199 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
00200 (TREE_CODE (EXP) == STRING_CST \
00201 && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
00202
00203 #define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)
00204 #define TRAMPOLINE_TEMPLATE(FILE) \
00205 if (TARGET_FDPIC) \
00206 { \
00207 fprintf(FILE, "\t.dd\t0x00000000\n"); \
00208 fprintf(FILE, "\t.dd\t0x00000000\n"); \
00209 fprintf(FILE, "\t.dd\t0x0000e109\n"); \
00210 fprintf(FILE, "\t.dd\t0x0000e149\n"); \
00211 fprintf(FILE, "\t.dd\t0x0000e10a\n"); \
00212 fprintf(FILE, "\t.dd\t0x0000e14a\n"); \
00213 fprintf(FILE, "\t.dw\t0xac4b\n"); \
00214 fprintf(FILE, "\t.dw\t0x9149\n"); \
00215 fprintf(FILE, "\t.dw\t0x0051\n"); \
00216 } \
00217 else \
00218 { \
00219 fprintf(FILE, "\t.dd\t0x0000e109\n"); \
00220 fprintf(FILE, "\t.dd\t0x0000e149\n"); \
00221 fprintf(FILE, "\t.dd\t0x0000e10a\n"); \
00222 fprintf(FILE, "\t.dd\t0x0000e14a\n"); \
00223 fprintf(FILE, "\t.dw\t0x0051\n"); \
00224 }
00225
00226 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
00227 initialize_trampoline (TRAMP, FNADDR, CXT)
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 #define ELIMINABLE_REGS \
00243 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
00244 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
00245 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} \
00246
00247
00248
00249
00250
00251
00252 #define CAN_ELIMINATE(FROM, TO) \
00253 ((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1)
00254
00255
00256
00257
00258 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
00259 ((OFFSET) = bfin_initial_elimination_offset ((FROM), (TO)))
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 #define FIRST_PSEUDO_REGISTER 50
00272
00273 #define D_REGNO_P(X) ((X) <= REG_R7)
00274 #define P_REGNO_P(X) ((X) >= REG_P0 && (X) <= REG_P7)
00275 #define I_REGNO_P(X) ((X) >= REG_I0 && (X) <= REG_I3)
00276 #define DP_REGNO_P(X) (D_REGNO_P (X) || P_REGNO_P (X))
00277 #define ADDRESS_REGNO_P(X) ((X) >= REG_P0 && (X) <= REG_M3)
00278 #define DREG_P(X) (REG_P (X) && D_REGNO_P (REGNO (X)))
00279 #define PREG_P(X) (REG_P (X) && P_REGNO_P (REGNO (X)))
00280 #define IREG_P(X) (REG_P (X) && I_REGNO_P (REGNO (X)))
00281 #define DPREG_P(X) (REG_P (X) && DP_REGNO_P (REGNO (X)))
00282
00283 #define REGISTER_NAMES { \
00284 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", \
00285 "P0", "P1", "P2", "P3", "P4", "P5", "SP", "FP", \
00286 "I0", "I1", "I2", "I3", "B0", "B1", "B2", "B3", \
00287 "L0", "L1", "L2", "L3", "M0", "M1", "M2", "M3", \
00288 "A0", "A1", \
00289 "CC", \
00290 "RETS", "RETI", "RETX", "RETN", "RETE", "ASTAT", "SEQSTAT", "USP", \
00291 "ARGP", \
00292 "LT0", "LT1", "LC0", "LC1", "LB0", "LB1" \
00293 }
00294
00295 #define SHORT_REGISTER_NAMES { \
00296 "R0.L", "R1.L", "R2.L", "R3.L", "R4.L", "R5.L", "R6.L", "R7.L", \
00297 "P0.L", "P1.L", "P2.L", "P3.L", "P4.L", "P5.L", "SP.L", "FP.L", \
00298 "I0.L", "I1.L", "I2.L", "I3.L", "B0.L", "B1.L", "B2.L", "B3.L", \
00299 "L0.L", "L1.L", "L2.L", "L3.L", "M0.L", "M1.L", "M2.L", "M3.L", }
00300
00301 #define HIGH_REGISTER_NAMES { \
00302 "R0.H", "R1.H", "R2.H", "R3.H", "R4.H", "R5.H", "R6.H", "R7.H", \
00303 "P0.H", "P1.H", "P2.H", "P3.H", "P4.H", "P5.H", "SP.H", "FP.H", \
00304 "I0.H", "I1.H", "I2.H", "I3.H", "B0.H", "B1.H", "B2.H", "B3.H", \
00305 "L0.H", "L1.H", "L2.H", "L3.H", "M0.H", "M1.H", "M2.H", "M3.H", }
00306
00307 #define DREGS_PAIR_NAMES { \
00308 "R1:0.p", 0, "R3:2.p", 0, "R5:4.p", 0, "R7:6.p", 0, }
00309
00310 #define BYTE_REGISTER_NAMES { \
00311 "R0.B", "R1.B", "R2.B", "R3.B", "R4.B", "R5.B", "R6.B", "R7.B", }
00312
00313
00314
00315
00316
00317 #define FIXED_REGISTERS \
00318 \
00319 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \
00320 \
00321 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, \
00322 \
00323 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
00324 \
00325 1, 1 \
00326 }
00327
00328
00329
00330
00331
00332
00333
00334
00335 #define CALL_USED_REGISTERS \
00336 \
00337 { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, \
00338 \
00339 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
00340 \
00341 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
00342 \
00343 1, 1 \
00344 }
00345
00346
00347
00348
00349
00350
00351
00352 #define REG_ALLOC_ORDER \
00353 { REG_R0, REG_R1, REG_R2, REG_R3, REG_R7, REG_R6, REG_R5, REG_R4, \
00354 REG_P2, REG_P1, REG_P0, REG_P5, REG_P4, REG_P3, REG_P6, REG_P7, \
00355 REG_A0, REG_A1, \
00356 REG_I0, REG_I1, REG_I2, REG_I3, REG_B0, REG_B1, REG_B2, REG_B3, \
00357 REG_L0, REG_L1, REG_L2, REG_L3, REG_M0, REG_M1, REG_M2, REG_M3, \
00358 REG_RETS, REG_RETI, REG_RETX, REG_RETN, REG_RETE, \
00359 REG_ASTAT, REG_SEQSTAT, REG_USP, \
00360 REG_CC, REG_ARGP, \
00361 REG_LT0, REG_LT1, REG_LC0, REG_LC1, REG_LB0, REG_LB1 \
00362 }
00363
00364
00365 #define CONDITIONAL_REGISTER_USAGE \
00366 { \
00367 conditional_register_usage(); \
00368 if (TARGET_FDPIC) \
00369 call_used_regs[FDPIC_REGNO] = 1; \
00370 if (!TARGET_FDPIC && flag_pic) \
00371 { \
00372 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00373 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00374 } \
00375 }
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 enum reg_class
00399 {
00400 NO_REGS,
00401 IREGS,
00402 BREGS,
00403 LREGS,
00404 MREGS,
00405 CIRCREGS,
00406 DAGREGS,
00407 EVEN_AREGS,
00408 ODD_AREGS,
00409 AREGS,
00410 CCREGS,
00411 EVEN_DREGS,
00412 ODD_DREGS,
00413 DREGS,
00414 FDPIC_REGS,
00415 FDPIC_FPTR_REGS,
00416 PREGS_CLOBBERED,
00417 PREGS,
00418 IPREGS,
00419 DPREGS,
00420 MOST_REGS,
00421 LT_REGS,
00422 LC_REGS,
00423 LB_REGS,
00424 PROLOGUE_REGS,
00425 NON_A_CC_REGS,
00426 ALL_REGS, LIM_REG_CLASSES
00427 };
00428
00429 #define N_REG_CLASSES ((int)LIM_REG_CLASSES)
00430
00431 #define GENERAL_REGS DPREGS
00432
00433
00434
00435 #define REG_CLASS_NAMES \
00436 { "NO_REGS", \
00437 "IREGS", \
00438 "BREGS", \
00439 "LREGS", \
00440 "MREGS", \
00441 "CIRCREGS", \
00442 "DAGREGS", \
00443 "EVEN_AREGS", \
00444 "ODD_AREGS", \
00445 "AREGS", \
00446 "CCREGS", \
00447 "EVEN_DREGS", \
00448 "ODD_DREGS", \
00449 "DREGS", \
00450 "FDPIC_REGS", \
00451 "FDPIC_FPTR_REGS", \
00452 "PREGS_CLOBBERED", \
00453 "PREGS", \
00454 "IPREGS", \
00455 "DPREGS", \
00456 "MOST_REGS", \
00457 "LT_REGS", \
00458 "LC_REGS", \
00459 "LB_REGS", \
00460 "PROLOGUE_REGS", \
00461 "NON_A_CC_REGS", \
00462 "ALL_REGS" }
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478 #define REG_CLASS_CONTENTS \
00479 \
00480 { { 0x00000000, 0 }, \
00481 { 0x000f0000, 0 }, \
00482 { 0x00f00000, 0 }, \
00483 { 0x0f000000, 0 }, \
00484 { 0xf0000000, 0 }, \
00485 { 0x0fff0000, 0 }, \
00486 { 0xffff0000, 0 }, \
00487 { 0x00000000, 0x1 }, \
00488 { 0x00000000, 0x2 }, \
00489 { 0x00000000, 0x3 }, \
00490 { 0x00000000, 0x4 }, \
00491 { 0x00000055, 0 }, \
00492 { 0x000000aa, 0 }, \
00493 { 0x000000ff, 0 }, \
00494 { 0x00000800, 0x000 }, \
00495 { 0x00000200, 0x000 }, \
00496 { 0x00004700, 0x800 }, \
00497 { 0x0000ff00, 0x800 }, \
00498 { 0x000fff00, 0x800 }, \
00499 { 0x0000ffff, 0x800 }, \
00500 { 0xffffffff, 0x800 }, \
00501 { 0x00000000, 0x3000 }, \
00502 { 0x00000000, 0xc000 }, \
00503 { 0x00000000, 0x30000 }, \
00504 { 0x00000000, 0x3f7f8 }, \
00505 { 0xffffffff, 0x3fff8 }, \
00506 { 0xffffffff, 0x3ffff }}
00507
00508 #define IREG_POSSIBLE_P(OUTER) \
00509 ((OUTER) == POST_INC || (OUTER) == PRE_INC \
00510 || (OUTER) == POST_DEC || (OUTER) == PRE_DEC \
00511 || (OUTER) == MEM || (OUTER) == ADDRESS)
00512
00513 #define MODE_CODE_BASE_REG_CLASS(MODE, OUTER, INDEX) \
00514 ((MODE) == HImode && IREG_POSSIBLE_P (OUTER) ? IPREGS : PREGS)
00515
00516 #define INDEX_REG_CLASS PREGS
00517
00518 #define REGNO_OK_FOR_BASE_STRICT_P(X, MODE, OUTER, INDEX) \
00519 (P_REGNO_P (X) || (X) == REG_ARGP \
00520 || (IREG_POSSIBLE_P (OUTER) && (MODE) == HImode \
00521 && I_REGNO_P (X)))
00522
00523 #define REGNO_OK_FOR_BASE_NONSTRICT_P(X, MODE, OUTER, INDEX) \
00524 ((X) >= FIRST_PSEUDO_REGISTER \
00525 || REGNO_OK_FOR_BASE_STRICT_P (X, MODE, OUTER, INDEX))
00526
00527 #ifdef REG_OK_STRICT
00528 #define REGNO_MODE_CODE_OK_FOR_BASE_P(X, MODE, OUTER, INDEX) \
00529 REGNO_OK_FOR_BASE_STRICT_P (X, MODE, OUTER, INDEX)
00530 #else
00531 #define REGNO_MODE_CODE_OK_FOR_BASE_P(X, MODE, OUTER, INDEX) \
00532 REGNO_OK_FOR_BASE_NONSTRICT_P (X, MODE, OUTER, INDEX)
00533 #endif
00534
00535 #define REGNO_OK_FOR_INDEX_P(X) 0
00536
00537
00538
00539 #define REG_CLASS_FROM_LETTER(LETTER) \
00540 ((LETTER) == 'a' ? PREGS : \
00541 (LETTER) == 'Z' ? FDPIC_REGS : \
00542 (LETTER) == 'Y' ? FDPIC_FPTR_REGS : \
00543 (LETTER) == 'd' ? DREGS : \
00544 (LETTER) == 'z' ? PREGS_CLOBBERED : \
00545 (LETTER) == 'D' ? EVEN_DREGS : \
00546 (LETTER) == 'W' ? ODD_DREGS : \
00547 (LETTER) == 'e' ? AREGS : \
00548 (LETTER) == 'A' ? EVEN_AREGS : \
00549 (LETTER) == 'B' ? ODD_AREGS : \
00550 (LETTER) == 'b' ? IREGS : \
00551 (LETTER) == 'v' ? BREGS : \
00552 (LETTER) == 'f' ? MREGS : \
00553 (LETTER) == 'c' ? CIRCREGS : \
00554 (LETTER) == 'C' ? CCREGS : \
00555 (LETTER) == 't' ? LT_REGS : \
00556 (LETTER) == 'k' ? LC_REGS : \
00557 (LETTER) == 'u' ? LB_REGS : \
00558 (LETTER) == 'x' ? MOST_REGS : \
00559 (LETTER) == 'y' ? PROLOGUE_REGS : \
00560 (LETTER) == 'w' ? NON_A_CC_REGS : \
00561 NO_REGS)
00562
00563
00564
00565
00566
00567
00568 #define REGNO_REG_CLASS(REGNO) \
00569 ((REGNO) < REG_P0 ? DREGS \
00570 : (REGNO) < REG_I0 ? PREGS \
00571 : (REGNO) == REG_ARGP ? PREGS \
00572 : (REGNO) >= REG_I0 && (REGNO) <= REG_I3 ? IREGS \
00573 : (REGNO) >= REG_L0 && (REGNO) <= REG_L3 ? LREGS \
00574 : (REGNO) >= REG_B0 && (REGNO) <= REG_B3 ? BREGS \
00575 : (REGNO) >= REG_M0 && (REGNO) <= REG_M3 ? MREGS \
00576 : (REGNO) == REG_A0 || (REGNO) == REG_A1 ? AREGS \
00577 : (REGNO) == REG_LT0 || (REGNO) == REG_LT1 ? LT_REGS \
00578 : (REGNO) == REG_LC0 || (REGNO) == REG_LC1 ? LC_REGS \
00579 : (REGNO) == REG_LB0 || (REGNO) == REG_LB1 ? LB_REGS \
00580 : (REGNO) == REG_CC ? CCREGS \
00581 : (REGNO) >= REG_RETS ? PROLOGUE_REGS \
00582 : NO_REGS)
00583
00584
00585
00586
00587 #define SMALL_REGISTER_CLASSES 1
00588
00589 #define CLASS_LIKELY_SPILLED_P(CLASS) \
00590 ((CLASS) == PREGS_CLOBBERED \
00591 || (CLASS) == PROLOGUE_REGS \
00592 || (CLASS) == CCREGS)
00593
00594
00595
00596 #define HARD_REGNO_MODE_OK(REGNO, MODE) hard_regno_mode_ok((REGNO), (MODE))
00597
00598
00599
00600 #define CLASS_MAX_NREGS(CLASS, MODE) \
00601 ((MODE) == V2PDImode && (CLASS) == AREGS ? 2 \
00602 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
00603
00604 #define HARD_REGNO_NREGS(REGNO, MODE) \
00605 ((MODE) == PDImode && ((REGNO) == REG_A0 || (REGNO) == REG_A1) ? 1 \
00606 : (MODE) == V2PDImode && ((REGNO) == REG_A0 || (REGNO) == REG_A1) ? 2 \
00607 : CLASS_MAX_NREGS (GENERAL_REGS, MODE))
00608
00609
00610
00611 #define HARD_REGNO_RENAME_OK(FROM, TO) bfin_hard_regno_rename_ok (FROM, TO)
00612
00613
00614
00615
00616
00617
00618
00619
00620 #define MODES_TIEABLE_P(MODE1, MODE2) ((MODE1) == (MODE2))
00621
00622
00623
00624
00625
00626
00627 #define PREFERRED_RELOAD_CLASS(X, CLASS) (CLASS)
00628
00629
00630
00631
00632
00633 typedef enum {
00634 SUBROUTINE, INTERRUPT_HANDLER, EXCPT_HANDLER, NMI_HANDLER
00635 } e_funkind;
00636
00637 #define FUNCTION_ARG_REGISTERS { REG_R0, REG_R1, REG_R2, -1 }
00638
00639
00640 #define CALL_NORMAL 0x00000000
00641 #define CALL_LONG 0x00000001
00642 #define CALL_SHORT 0x00000002
00643
00644 typedef struct {
00645 int words;
00646 int nregs;
00647 int *arg_regs;
00648 int call_cookie;
00649 } CUMULATIVE_ARGS;
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
00665 (function_arg (&CUM, MODE, TYPE, NAMED))
00666
00667 #define FUNCTION_ARG_REGNO_P(REGNO) function_arg_regno_p (REGNO)
00668
00669
00670
00671
00672
00673 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT, N_NAMED_ARGS) \
00674 (init_cumulative_args (&CUM, FNTYPE, LIBNAME))
00675
00676
00677
00678
00679 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
00680 (function_arg_advance (&CUM, MODE, TYPE, NAMED))
00681
00682 #define RETURN_POPS_ARGS(FDECL, FUNTYPE, STKSIZE) 0
00683
00684
00685
00686
00687
00688
00689
00690 #define VALUE_REGNO(MODE) (REG_R0)
00691
00692 #define FUNCTION_VALUE(VALTYPE, FUNC) \
00693 gen_rtx_REG (TYPE_MODE (VALTYPE), \
00694 VALUE_REGNO(TYPE_MODE(VALTYPE)))
00695
00696
00697
00698
00699 #define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, VALUE_REGNO(MODE))
00700
00701 #define FUNCTION_VALUE_REGNO_P(N) ((N) == REG_R0)
00702
00703 #define DEFAULT_PCC_STRUCT_RETURN 0
00704 #define RETURN_IN_MEMORY(TYPE) bfin_return_in_memory(TYPE)
00705
00706
00707 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, REG_RETS)
00708
00709 #define RETURN_ADDR_RTX(COUNT, FRAME) bfin_return_addr_rtx (COUNT)
00710
00711 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (REG_RETS)
00712
00713
00714 #define INCOMING_FRAME_SP_OFFSET 0
00715
00716
00717 #define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) : INVALID_REGNUM)
00718 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, REG_P2)
00719 #define EH_RETURN_HANDLER_RTX \
00720 gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx, UNITS_PER_WORD))
00721
00722
00723
00724
00725 #define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X))
00726
00727
00728
00729
00730
00731
00732 #define LEGITIMATE_CONSTANT_P(x) 1
00733
00734
00735
00736
00737
00738 #define MAX_REGS_PER_ADDRESS 1
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 #define LEGITIMATE_MODE_FOR_AUTOINC_P(MODE) \
00760 (GET_MODE_SIZE (MODE) <= 4 || (MODE) == PDImode)
00761
00762 #ifdef REG_OK_STRICT
00763 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
00764 do { \
00765 if (bfin_legitimate_address_p (MODE, X, 1)) \
00766 goto WIN; \
00767 } while (0);
00768 #else
00769 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
00770 do { \
00771 if (bfin_legitimate_address_p (MODE, X, 0)) \
00772 goto WIN; \
00773 } while (0);
00774 #endif
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789 #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
00790 do { \
00791 rtx _q = legitimize_address(X, OLDX, MODE); \
00792 if (_q) { X = _q; goto WIN; } \
00793 } while (0)
00794
00795 #define HAVE_POST_INCREMENT 1
00796 #define HAVE_POST_DECREMENT 1
00797 #define HAVE_PRE_DECREMENT 1
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807 #define LEGITIMATE_PIC_OPERAND_P(X) ! SYMBOLIC_CONST (X)
00808
00809 #define SYMBOLIC_CONST(X) \
00810 (GET_CODE (X) == SYMBOL_REF \
00811 || GET_CODE (X) == LABEL_REF \
00812 || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
00830 do { \
00831 if (GET_CODE (ADDR) == POST_INC \
00832 || GET_CODE (ADDR) == POST_DEC \
00833 || GET_CODE (ADDR) == PRE_DEC) \
00834 goto LABEL; \
00835 } while (0)
00836
00837 #define NOTICE_UPDATE_CC(EXPR, INSN) 0
00838
00839
00840
00841 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
00842
00843
00844
00845 #define MOVE_MAX UNITS_PER_WORD
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862 #define SLOW_BYTE_ACCESS 0
00863 #define SLOW_SHORT_ACCESS 0
00864
00865
00866
00867 #define BITS_BIG_ENDIAN 0
00868
00869
00870
00871 #define BYTES_BIG_ENDIAN 0
00872
00873
00874 #define WORDS_BIG_ENDIAN 0
00875
00876
00877 #define BITS_PER_UNIT 8
00878
00879
00880
00881
00882
00883 #define BITS_PER_WORD 32
00884
00885
00886 #define UNITS_PER_WORD 4
00887
00888
00889
00890 #define POINTER_SIZE 32
00891
00892
00893 #define POINTER_BOUNDARY 32
00894
00895
00896 #define PARM_BOUNDARY 32
00897
00898
00899 #define STACK_BOUNDARY 32
00900
00901
00902 #define FUNCTION_BOUNDARY 32
00903
00904
00905 #define EMPTY_FIELD_BOUNDARY BITS_PER_WORD
00906
00907
00908 #define BIGGEST_ALIGNMENT 32
00909
00910
00911
00912 #define STRICT_ALIGNMENT 1
00913
00914
00915
00916
00917
00918
00919 #define UNITS_PER_FLOAT ((FLOAT_TYPE_SIZE + BITS_PER_UNIT - 1) / \
00920 BITS_PER_UNIT)
00921
00922 #define UNITS_PER_DOUBLE ((DOUBLE_TYPE_SIZE + BITS_PER_UNIT - 1) / \
00923 BITS_PER_UNIT)
00924
00925
00926
00927 #define SIZE_TYPE "long unsigned int"
00928
00929
00930 #define DEFAULT_SIGNED_CHAR 1
00931 #define FLOAT_TYPE_SIZE BITS_PER_WORD
00932 #define SHORT_TYPE_SIZE 16
00933 #define CHAR_TYPE_SIZE 8
00934 #define INT_TYPE_SIZE 32
00935 #define LONG_TYPE_SIZE 32
00936 #define LONG_LONG_TYPE_SIZE 64
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947 #define DOUBLE_TYPE_SIZE 64
00948 #define LONG_DOUBLE_TYPE_SIZE 64
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973 #define BFIN_PROMOTE_MODE_P(MODE) \
00974 (!TARGET_DSP && GET_MODE_CLASS (MODE) == MODE_INT \
00975 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)
00976
00977 #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
00978 if (BFIN_PROMOTE_MODE_P(MODE)) \
00979 { \
00980 if (MODE == QImode) \
00981 UNSIGNEDP = 1; \
00982 else if (MODE == HImode) \
00983 UNSIGNEDP = 0; \
00984 (MODE) = SImode; \
00985 }
00986
00987
00988
00989
00990 #define NO_FUNCTION_CSE 1
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
01002 bfin_register_move_cost ((MODE), (CLASS1), (CLASS2))
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012 #define MEMORY_MOVE_COST(MODE, CLASS, IN) \
01013 bfin_memory_move_cost ((MODE), (CLASS), (IN))
01014
01015
01016
01017 #define CASE_VECTOR_MODE SImode
01018
01019 #define JUMP_TABLES_IN_TEXT_SECTION flag_pic
01020
01021
01022
01023
01024
01025
01026 #define CONST_18UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 262140)
01027 #define CONST_16BIT_IMM_P(VALUE) ((VALUE) >= -32768 && (VALUE) <= 32767)
01028 #define CONST_16UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 65535)
01029 #define CONST_7BIT_IMM_P(VALUE) ((VALUE) >= -64 && (VALUE) <= 63)
01030 #define CONST_7NBIT_IMM_P(VALUE) ((VALUE) >= -64 && (VALUE) <= 0)
01031 #define CONST_5UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 31)
01032 #define CONST_4BIT_IMM_P(VALUE) ((VALUE) >= -8 && (VALUE) <= 7)
01033 #define CONST_4UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 15)
01034 #define CONST_3BIT_IMM_P(VALUE) ((VALUE) >= -4 && (VALUE) <= 3)
01035 #define CONST_3UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 7)
01036
01037 #define CONSTRAINT_LEN(C, STR) \
01038 ((C) == 'P' || (C) == 'M' || (C) == 'N' ? 2 \
01039 : (C) == 'K' ? 3 \
01040 : DEFAULT_CONSTRAINT_LEN ((C), (STR)))
01041
01042 #define CONST_OK_FOR_P(VALUE, STR) \
01043 ((STR)[1] == '0' ? (VALUE) == 0 \
01044 : (STR)[1] == '1' ? (VALUE) == 1 \
01045 : (STR)[1] == '2' ? (VALUE) == 2 \
01046 : (STR)[1] == '3' ? (VALUE) == 3 \
01047 : (STR)[1] == '4' ? (VALUE) == 4 \
01048 : 0)
01049
01050 #define CONST_OK_FOR_K(VALUE, STR) \
01051 ((STR)[1] == 'u' \
01052 ? ((STR)[2] == '3' ? CONST_3UBIT_IMM_P (VALUE) \
01053 : (STR)[2] == '4' ? CONST_4UBIT_IMM_P (VALUE) \
01054 : (STR)[2] == '5' ? CONST_5UBIT_IMM_P (VALUE) \
01055 : (STR)[2] == 'h' ? CONST_16UBIT_IMM_P (VALUE) \
01056 : 0) \
01057 : (STR)[1] == 's' \
01058 ? ((STR)[2] == '3' ? CONST_3BIT_IMM_P (VALUE) \
01059 : (STR)[2] == '4' ? CONST_4BIT_IMM_P (VALUE) \
01060 : (STR)[2] == '7' ? CONST_7BIT_IMM_P (VALUE) \
01061 : (STR)[2] == 'h' ? CONST_16BIT_IMM_P (VALUE) \
01062 : 0) \
01063 : (STR)[1] == 'n' \
01064 ? ((STR)[2] == '7' ? CONST_7NBIT_IMM_P (VALUE) \
01065 : 0) \
01066 : (STR)[1] == 'N' \
01067 ? ((STR)[2] == '7' ? CONST_7BIT_IMM_P (-(VALUE)) \
01068 : 0) \
01069 : 0)
01070
01071 #define CONST_OK_FOR_M(VALUE, STR) \
01072 ((STR)[1] == '1' ? (VALUE) == 255 \
01073 : (STR)[1] == '2' ? (VALUE) == 65535 \
01074 : 0)
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092 #define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \
01093 ((C) == 'J' ? (log2constp (VALUE)) \
01094 : (C) == 'K' ? CONST_OK_FOR_K (VALUE, STR) \
01095 : (C) == 'L' ? log2constp (~(VALUE)) \
01096 : (C) == 'M' ? CONST_OK_FOR_M (VALUE, STR) \
01097 : (C) == 'P' ? CONST_OK_FOR_P (VALUE, STR) \
01098 : 0)
01099
01100
01101 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
01102 ((C) == 'H' ? 1 : 0)
01103
01104 #define EXTRA_CONSTRAINT(VALUE, D) \
01105 ((D) == 'Q' ? GET_CODE (VALUE) == SYMBOL_REF : 0)
01106
01107
01108 #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
01109
01110 #define PRINT_OPERAND(FILE, RTX, CODE) print_operand (FILE, RTX, CODE)
01111 #define PRINT_OPERAND_ADDRESS(FILE, RTX) print_address_operand (FILE, RTX)
01112
01113 typedef enum sections {
01114 CODE_DIR,
01115 DATA_DIR,
01116 LAST_SECT_NM
01117 } SECT_ENUM_T;
01118
01119 typedef enum directives {
01120 LONG_CONST_DIR,
01121 SHORT_CONST_DIR,
01122 BYTE_CONST_DIR,
01123 SPACE_DIR,
01124 INIT_DIR,
01125 LAST_DIR_NM
01126 } DIR_ENUM_T;
01127
01128 #define TEXT_SECTION_ASM_OP ".text;"
01129 #define DATA_SECTION_ASM_OP ".data;"
01130
01131 #define ASM_APP_ON ""
01132 #define ASM_APP_OFF ""
01133
01134 #define ASM_GLOBALIZE_LABEL1(FILE, NAME) \
01135 do { fputs (".global ", FILE); \
01136 assemble_name (FILE, NAME); \
01137 fputc (';',FILE); \
01138 fputc ('\n',FILE); \
01139 } while (0)
01140
01141 #define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
01142 do { \
01143 fputs (".type ", FILE); \
01144 assemble_name (FILE, NAME); \
01145 fputs (", STT_FUNC", FILE); \
01146 fputc (';',FILE); \
01147 fputc ('\n',FILE); \
01148 ASM_OUTPUT_LABEL(FILE, NAME); \
01149 } while (0)
01150
01151 #define ASM_OUTPUT_LABEL(FILE, NAME) \
01152 do { assemble_name (FILE, NAME); \
01153 fputs (":\n",FILE); \
01154 } while (0)
01155
01156 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
01157 do { fprintf (FILE, "_%s", NAME); \
01158 } while (0)
01159
01160 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
01161 do { char __buf[256]; \
01162 fprintf (FILE, "\t.dd\t"); \
01163 ASM_GENERATE_INTERNAL_LABEL (__buf, "L", VALUE); \
01164 assemble_name (FILE, __buf); \
01165 fputc (';', FILE); \
01166 fputc ('\n', FILE); \
01167 } while (0)
01168
01169 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
01170 MY_ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)
01171
01172 #define MY_ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
01173 do { \
01174 char __buf[256]; \
01175 fprintf (FILE, "\t.dd\t"); \
01176 ASM_GENERATE_INTERNAL_LABEL (__buf, "L", VALUE); \
01177 assemble_name (FILE, __buf); \
01178 fputs (" - ", FILE); \
01179 ASM_GENERATE_INTERNAL_LABEL (__buf, "L", REL); \
01180 assemble_name (FILE, __buf); \
01181 fputc (';', FILE); \
01182 fputc ('\n', FILE); \
01183 } while (0)
01184
01185 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
01186 do { \
01187 if ((LOG) != 0) \
01188 fprintf (FILE, "\t.align %d\n", 1 << (LOG)); \
01189 } while (0)
01190
01191 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
01192 do { \
01193 asm_output_skip (FILE, SIZE); \
01194 } while (0)
01195
01196 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
01197 do { \
01198 switch_to_section (data_section); \
01199 if ((SIZE) >= (unsigned int) 4 ) ASM_OUTPUT_ALIGN(FILE,2); \
01200 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
01201 ASM_OUTPUT_LABEL (FILE, NAME); \
01202 fprintf (FILE, "%s %ld;\n", ASM_SPACE, \
01203 (ROUNDED) > (unsigned int) 1 ? (ROUNDED) : 1); \
01204 } while (0)
01205
01206 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
01207 do { \
01208 ASM_GLOBALIZE_LABEL1(FILE,NAME); \
01209 ASM_OUTPUT_LOCAL (FILE, NAME, SIZE, ROUNDED); } while(0)
01210
01211 #define ASM_COMMENT_START "//"
01212
01213 #define FUNCTION_PROFILER(FILE, LABELNO) \
01214 do { \
01215 fprintf (FILE, "\tCALL __mcount;\n"); \
01216 } while(0)
01217
01218 #undef NO_PROFILE_COUNTERS
01219 #define NO_PROFILE_COUNTERS 1
01220
01221 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) fprintf (FILE, "[SP--] = %s;\n", reg_names[REGNO])
01222 #define ASM_OUTPUT_REG_POP(FILE, REGNO) fprintf (FILE, "%s = [SP++];\n", reg_names[REGNO])
01223
01224 extern struct rtx_def *bfin_compare_op0, *bfin_compare_op1;
01225 extern struct rtx_def *bfin_cc_rtx, *bfin_rets_rtx;
01226
01227
01228 #define SET_ASM_OP ".set "
01229
01230
01231 #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
01232
01233 #define SIZE_ASM_OP "\t.size\t"
01234
01235 #endif