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 #include "hwint.h"
00026
00027
00028
00029 #define C4x 1
00030
00031
00032
00033 #define ASM_PROG "c4x-as"
00034
00035
00036
00037 #define LD_PROG "c4x-ld"
00038
00039
00040
00041 #define ASM_SPEC "\
00042 %{!mcpu=30:%{!mcpu=31:%{!mcpu=32:%{!mcpu=33:%{!mcpu=40:%{!mcpu=44:\
00043 %{!m30:%{!m40:-m40}}}}}}}} \
00044 %{mcpu=30:-m30} \
00045 %{mcpu=31:-m31} \
00046 %{mcpu=32:-m32} \
00047 %{mcpu=33:-m33} \
00048 %{mcpu=40:-m40} \
00049 %{mcpu=44:-m44} \
00050 %{m30:-m30} \
00051 %{m31:-m31} \
00052 %{m32:-m32} \
00053 %{m33:-m33} \
00054 %{m40:-m40} \
00055 %{m44:-m44} \
00056 %{mmemparm:-p} %{mregparm:-r} \
00057 %{!mmemparm:%{!mregparm:-r}} \
00058 %{mbig:-b} %{msmall:-s} \
00059 %{!msmall:%{!mbig:-b}}"
00060
00061
00062
00063 #define LINK_SPEC "\
00064 %{m30:--architecture c3x} \
00065 %{m31:--architecture c3x} \
00066 %{m32:--architecture c3x} \
00067 %{m33:--architecture c3x} \
00068 %{mcpu=30:--architecture c3x} \
00069 %{mcpu=31:--architecture c3x} \
00070 %{mcpu=32:--architecture c3x} \
00071 %{mcpu=33:--architecture c3x}"
00072
00073
00074
00075 #define CPP_SPEC "\
00076 %{!m30:%{!m31:%{!m32:%{!m33:%{!mcpu=30:%{!mcpu=31:%{!mcpu=32:%{!mcpu=33:\
00077 %{!mcpu=40:%{!mcpu=44:%{\
00078 !m40:%{!m44:-D_TMS320C4x -D_C4x -D_TMS320C40 -D_C40}}}}}}}}}}}} \
00079 %{mcpu=30:-D_TMS320C3x -D_C3x -D_TMS320C30 -D_C30 } \
00080 %{m30:-D_TMS320C3x -D_C3x -D_TMS320C30 -D_C30 } \
00081 %{mcpu=31:-D_TMS320C3x -D_C3x -D_TMS320C31 -D_C31 } \
00082 %{m31:-D_TMS320C3x -D_C3x -D_TMS320C31 -D_C31 } \
00083 %{mcpu=32:-D_TMS320C3x -D_C3x -D_TMS320C32 -D_C32 } \
00084 %{m32:-D_TMS320C3x -D_C3x -D_TMS320C32 -D_C32 } \
00085 %{mcpu=33:-D_TMS320C3x -D_C3x -D_TMS320C33 -D_C33 } \
00086 %{m33:-D_TMS320C3x -D_C3x -D_TMS320C33 -D_C33 } \
00087 %{mcpu=40:-D_TMS320C4x -D_C4x -D_TMS320C40 -D_C40 } \
00088 %{m40:-D_TMS320C4x -D_C4x -D_TMS320C40 -D_C40 } \
00089 %{mcpu=44:-D_TMS320C4x -D_C4x -D_TMS320C44 -D_C44 } \
00090 %{m44:-D_TMS320C4x -D_C4x -D_TMS320C44 -D_C44 } \
00091 %{mmemparm:-U_REGPARM }%{mregparm:-D_REGPARM } \
00092 %{!mmemparm:%{!mregparm:-D_REGPARM }} \
00093 %{msmall:-U_BIGMODEL } %{mbig:-D_BIGMODEL } \
00094 %{!msmall:%{!mbig:-D_BIGMODEL }} \
00095 %{finline-functions:-D_INLINE }"
00096
00097
00098
00099 #define ENDFILE_SPEC ""
00100
00101
00102
00103 #define SMALL_MEMORY_FLAG 0x0000001
00104 #define MPYI_FLAG 0x0000002
00105 #define FAST_FIX_FLAG 0x0000004
00106 #define RPTS_FLAG 0x0000008
00107 #define C3X_FLAG 0x0000010
00108 #define TI_FLAG 0x0000020
00109 #define PARANOID_FLAG 0x0000040
00110 #define MEMPARM_FLAG 0x0000080
00111 #define DEVEL_FLAG 0x0000100
00112 #define RPTB_FLAG 0x0000200
00113 #define BK_FLAG 0x0000400
00114 #define DB_FLAG 0x0000800
00115 #define DEBUG_FLAG 0x0001000
00116 #define HOIST_FLAG 0x0002000
00117 #define LOOP_UNSIGNED_FLAG 0x0004000
00118 #define FORCE_FLAG 0x0008000
00119 #define PRESERVE_FLOAT_FLAG 0x0010000
00120 #define PARALLEL_INSN_FLAG 0x0020000
00121 #define PARALLEL_MPY_FLAG 0x0040000
00122 #define ALIASES_FLAG 0x0080000
00123
00124 #define C30_FLAG 0x0100000
00125 #define C31_FLAG 0x0200000
00126 #define C32_FLAG 0x0400000
00127 #define C33_FLAG 0x0400000
00128 #define C40_FLAG 0x1000000
00129 #define C44_FLAG 0x2000000
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 #define TARGET_SWITCHES \
00140 { { "small", SMALL_MEMORY_FLAG, \
00141 N_("Small memory model") }, \
00142 { "big", -SMALL_MEMORY_FLAG, \
00143 N_("Big memory model") }, \
00144 { "mpyi", MPYI_FLAG, \
00145 N_("Use MPYI instruction for C3x") }, \
00146 { "no-mpyi", -MPYI_FLAG, \
00147 N_("Do not use MPYI instruction for C3x") }, \
00148 { "fast-fix", FAST_FIX_FLAG, \
00149 N_("Use fast but approximate float to integer conversion") }, \
00150 { "no-fast-fix", -FAST_FIX_FLAG, \
00151 N_("Use slow but accurate float to integer conversion") }, \
00152 { "rpts", RPTS_FLAG, \
00153 N_("Enable use of RTPS instruction") }, \
00154 { "no-rpts", -RPTS_FLAG, \
00155 N_("Disable use of RTPS instruction") }, \
00156 { "rptb", RPTB_FLAG, \
00157 N_("Enable use of RTPB instruction") }, \
00158 { "no-rptb", -RPTB_FLAG, \
00159 N_("Disable use of RTPB instruction") }, \
00160 { "30", C30_FLAG, \
00161 N_("Generate code for C30 CPU")}, \
00162 { "31", C31_FLAG, \
00163 N_("Generate code for C31 CPU")}, \
00164 { "32", C32_FLAG, \
00165 N_("Generate code for C32 CPU")}, \
00166 { "33", C33_FLAG, \
00167 N_("Generate code for C33 CPU")}, \
00168 { "40", C40_FLAG, \
00169 N_("Generate code for C40 CPU")}, \
00170 { "44", C44_FLAG, \
00171 N_("Generate code for C44 CPU")}, \
00172 { "ti", TI_FLAG, \
00173 N_("Emit code compatible with TI tools")}, \
00174 { "no-ti", -TI_FLAG, \
00175 N_("Emit code to use GAS extensions")}, \
00176 { "paranoid", PARANOID_FLAG, \
00177 N_("Save DP across ISR in small memory model") }, \
00178 { "no-paranoid", -PARANOID_FLAG, \
00179 N_("Don't save DP across ISR in small memory model") }, \
00180 { "isr-dp-reload", PARANOID_FLAG, \
00181 N_("Save DP across ISR in small memory model") }, \
00182 { "no-isr-dp-reload", -PARANOID_FLAG, \
00183 N_("Don't save DP across ISR in small memory model") }, \
00184 { "memparm", MEMPARM_FLAG, \
00185 N_("Pass arguments on the stack") }, \
00186 { "regparm", -MEMPARM_FLAG, \
00187 N_("Pass arguments in registers") }, \
00188 { "devel", DEVEL_FLAG, \
00189 N_("Enable new features under development") }, \
00190 { "no-devel", -DEVEL_FLAG, \
00191 N_("Disable new features under development") }, \
00192 { "bk", BK_FLAG, \
00193 N_("Use the BK register as a general purpose register") }, \
00194 { "no-bk", -BK_FLAG, \
00195 N_("Do not allocate BK register") }, \
00196 { "db", DB_FLAG, \
00197 N_("Enable use of DB instruction") }, \
00198 { "no-db", -DB_FLAG, \
00199 N_("Disable use of DB instruction") }, \
00200 { "debug", DEBUG_FLAG, \
00201 N_("Enable debugging") }, \
00202 { "no-debug", -DEBUG_FLAG, \
00203 N_("Disable debugging") }, \
00204 { "hoist", HOIST_FLAG, \
00205 N_("Force constants into registers to improve hoisting") }, \
00206 { "no-hoist", -HOIST_FLAG, \
00207 N_("Don't force constants into registers") }, \
00208 { "force", FORCE_FLAG, \
00209 N_("Force RTL generation to emit valid 3 operand insns") }, \
00210 { "no-force", -FORCE_FLAG, \
00211 N_("Allow RTL generation to emit invalid 3 operand insns") }, \
00212 { "loop-unsigned", LOOP_UNSIGNED_FLAG, \
00213 N_("Allow unsigned interation counts for RPTB/DB") }, \
00214 { "no-loop-unsigned", -LOOP_UNSIGNED_FLAG, \
00215 N_("Disallow unsigned iteration counts for RPTB/DB") }, \
00216 { "preserve-float", PRESERVE_FLOAT_FLAG, \
00217 N_("Preserve all 40 bits of FP reg across call") }, \
00218 { "no-preserve-float", -PRESERVE_FLOAT_FLAG, \
00219 N_("Only preserve 32 bits of FP reg across call") }, \
00220 { "parallel-insns", PARALLEL_INSN_FLAG, \
00221 N_("Enable parallel instructions") }, \
00222 { "no-parallel-insns", -PARALLEL_INSN_FLAG, \
00223 N_("Disable parallel instructions") }, \
00224 { "parallel-mpy", PARALLEL_MPY_FLAG, \
00225 N_("Enable MPY||ADD and MPY||SUB instructions") }, \
00226 { "no-parallel-mpy", -PARALLEL_MPY_FLAG, \
00227 N_("Disable MPY||ADD and MPY||SUB instructions") }, \
00228 { "aliases", ALIASES_FLAG, \
00229 N_("Assume that pointers may be aliased") }, \
00230 { "no-aliases", -ALIASES_FLAG, \
00231 N_("Assume that pointers not aliased") }, \
00232 { "", TARGET_DEFAULT, ""} }
00233
00234
00235
00236
00237 #define TARGET_DEFAULT ALIASES_FLAG | PARALLEL_INSN_FLAG \
00238 | PARALLEL_MPY_FLAG | RPTB_FLAG
00239
00240
00241
00242
00243
00244
00245
00246 extern int target_flags;
00247
00248 #define TARGET_INLINE (! optimize_size)
00249 #define TARGET_SMALL_REG_CLASS 0
00250
00251 #define TARGET_SMALL (target_flags & SMALL_MEMORY_FLAG)
00252 #define TARGET_MPYI (!TARGET_C3X || (target_flags & MPYI_FLAG))
00253 #define TARGET_FAST_FIX (target_flags & FAST_FIX_FLAG)
00254 #define TARGET_RPTS (target_flags & RPTS_FLAG)
00255 #define TARGET_TI (target_flags & TI_FLAG)
00256 #define TARGET_PARANOID (target_flags & PARANOID_FLAG)
00257 #define TARGET_MEMPARM (target_flags & MEMPARM_FLAG)
00258 #define TARGET_DEVEL (target_flags & DEVEL_FLAG)
00259 #define TARGET_RPTB (target_flags & RPTB_FLAG \
00260 && optimize >= 2)
00261 #define TARGET_BK (target_flags & BK_FLAG)
00262 #define TARGET_DB (! TARGET_C3X || (target_flags & DB_FLAG))
00263 #define TARGET_DEBUG (target_flags & DEBUG_FLAG)
00264 #define TARGET_HOIST (target_flags & HOIST_FLAG)
00265 #define TARGET_LOOP_UNSIGNED (target_flags & LOOP_UNSIGNED_FLAG)
00266 #define TARGET_FORCE (target_flags & FORCE_FLAG)
00267 #define TARGET_PRESERVE_FLOAT (target_flags & PRESERVE_FLOAT_FLAG)
00268 #define TARGET_PARALLEL ((target_flags & PARALLEL_INSN_FLAG) \
00269 && optimize >= 2)
00270 #define TARGET_PARALLEL_MPY (TARGET_PARALLEL \
00271 && (target_flags & PARALLEL_MPY_FLAG))
00272 #define TARGET_ALIASES (target_flags & ALIASES_FLAG)
00273
00274 #define TARGET_C3X (target_flags & C3X_FLAG)
00275 #define TARGET_C30 (target_flags & C30_FLAG)
00276 #define TARGET_C31 (target_flags & C31_FLAG)
00277 #define TARGET_C32 (target_flags & C32_FLAG)
00278 #define TARGET_C33 (target_flags & C33_FLAG)
00279 #define TARGET_C40 (target_flags & C40_FLAG)
00280 #define TARGET_C44 (target_flags & C44_FLAG)
00281
00282
00283 #define TARGET_LOAD_ADDRESS (1 || (! TARGET_C3X && ! TARGET_SMALL))
00284
00285
00286 #define TARGET_EXPOSE_LDP 0
00287
00288 #define TARGET_LOAD_DIRECT_MEMS 0
00289
00290
00291
00292
00293
00294 #define TARGET_RPTS_CYCLES(CYCLES) (TARGET_RPTS || (CYCLES) < c4x_rpts_cycles)
00295
00296 #define BCT_CHECK_LOOP_ITERATIONS !(TARGET_LOOP_UNSIGNED)
00297
00298
00299
00300 extern const char *c4x_rpts_cycles_string, *c4x_cpu_version_string;
00301
00302 #define TARGET_OPTIONS \
00303 { {"rpts=", &c4x_rpts_cycles_string, \
00304 N_("Specify maximum number of iterations for RPTS") }, \
00305 {"cpu=", &c4x_cpu_version_string, \
00306 N_("Select CPU to generate code for") } }
00307
00308
00309
00310
00311
00312
00313
00314 #define OVERRIDE_OPTIONS c4x_override_options ()
00315
00316
00317
00318 #define OPTIMIZATION_OPTIONS(LEVEL,SIZE) c4x_optimization_options(LEVEL, SIZE)
00319
00320
00321
00322 #define TARGET_VERSION fprintf (stderr, " (TMS320C[34]x, TI syntax)");
00323
00324
00325
00326 #define BITS_BIG_ENDIAN 0
00327 #define BYTES_BIG_ENDIAN 0
00328 #define WORDS_BIG_ENDIAN 0
00329
00330
00331
00332
00333 #define FLOAT_WORDS_BIG_ENDIAN 1
00334
00335
00336
00337
00338
00339
00340
00341 #define BITS_PER_UNIT 32
00342 #define BITS_PER_WORD 32
00343 #define UNITS_PER_WORD 1
00344 #define POINTER_SIZE 32
00345 #define PARM_BOUNDARY 32
00346 #define STACK_BOUNDARY 32
00347 #define FUNCTION_BOUNDARY 32
00348 #define BIGGEST_ALIGNMENT 32
00349 #define EMPTY_FIELD_BOUNDARY 32
00350 #define STRICT_ALIGNMENT 0
00351 #define TARGET_FLOAT_FORMAT C4X_FLOAT_FORMAT
00352 #define MAX_FIXED_MODE_SIZE 64
00353
00354
00355
00356 #define MEMBER_TYPE_FORCES_BLK(FIELD) \
00357 (TREE_CODE (TREE_TYPE (FIELD)) == REAL_TYPE)
00358
00359
00360
00361 #define BITS_PER_HIGH 16
00362 #define BITS_PER_LO_SUM 16
00363
00364
00365
00366
00367 #define REAL_ARITHMETIC
00368
00369
00370
00371
00372
00373 #define R0_REGNO 0
00374 #define R1_REGNO 1
00375 #define R2_REGNO 2
00376 #define R3_REGNO 3
00377 #define R4_REGNO 4
00378 #define R5_REGNO 5
00379 #define R6_REGNO 6
00380 #define R7_REGNO 7
00381
00382
00383
00384 #define AR0_REGNO 8
00385 #define AR1_REGNO 9
00386 #define AR2_REGNO 10
00387 #define AR3_REGNO 11
00388 #define AR4_REGNO 12
00389 #define AR5_REGNO 13
00390 #define AR6_REGNO 14
00391 #define AR7_REGNO 15
00392
00393
00394
00395 #define DP_REGNO 16
00396
00397
00398
00399 #define IR0_REGNO 17
00400 #define IR1_REGNO 18
00401
00402
00403
00404 #define BK_REGNO 19
00405
00406
00407
00408 #define SP_REGNO 20
00409
00410
00411
00412 #define ST_REGNO 21
00413
00414
00415
00416 #define DIE_REGNO 22
00417 #define IE_REGNO 22
00418 #define IIE_REGNO 23
00419 #define IF_REGNO 23
00420 #define IIF_REGNO 24
00421 #define IOF_REGNO 24
00422
00423
00424
00425 #define RS_REGNO 25
00426 #define RE_REGNO 26
00427 #define RC_REGNO 27
00428
00429
00430
00431 #define R8_REGNO 28
00432 #define R9_REGNO 29
00433 #define R10_REGNO 30
00434 #define R11_REGNO 31
00435
00436 #define FIRST_PSEUDO_REGISTER 32
00437
00438
00439
00440 #define IS_R0R1_REGNO(r) \
00441 ((unsigned int)((r) - R0_REGNO) <= (R1_REGNO - R0_REGNO))
00442 #define IS_R2R3_REGNO(r) \
00443 ((unsigned int)((r) - R2_REGNO) <= (R3_REGNO - R2_REGNO))
00444 #define IS_EXT_LOW_REGNO(r) \
00445 ((unsigned int)((r) - R0_REGNO) <= (R7_REGNO - R0_REGNO))
00446
00447
00448
00449 #define IS_EXT_HIGH_REGNO(r) \
00450 (! TARGET_C3X \
00451 && ((unsigned int) ((r) - R8_REGNO) <= (R11_REGNO - R8_REGNO)))
00452
00453
00454
00455 #define IS_AUX_REGNO(r) \
00456 ((unsigned int)((r) - AR0_REGNO) <= (AR7_REGNO - AR0_REGNO))
00457 #define IS_ADDR_REGNO(r) IS_AUX_REGNO(r)
00458 #define IS_DP_REGNO(r) ((r) == DP_REGNO)
00459 #define IS_INDEX_REGNO(r) (((r) == IR0_REGNO) || ((r) == IR1_REGNO))
00460 #define IS_SP_REGNO(r) ((r) == SP_REGNO)
00461 #define IS_BK_REGNO(r) (TARGET_BK && (r) == BK_REGNO)
00462
00463
00464
00465 #define IS_ST_REGNO(r) ((r) == ST_REGNO)
00466 #define IS_RC_REGNO(r) ((r) == RC_REGNO)
00467 #define IS_REPEAT_REGNO(r) (((r) >= RS_REGNO) && ((r) <= RC_REGNO))
00468
00469
00470
00471 #define IS_ADDR_OR_INDEX_REGNO(r) (IS_ADDR_REGNO(r) || IS_INDEX_REGNO(r))
00472 #define IS_EXT_REGNO(r) (IS_EXT_LOW_REGNO(r) || IS_EXT_HIGH_REGNO(r))
00473 #define IS_STD_REGNO(r) (IS_ADDR_OR_INDEX_REGNO(r) \
00474 || IS_REPEAT_REGNO(r) \
00475 || IS_SP_REGNO(r) \
00476 || IS_BK_REGNO(r))
00477 #define IS_INT_REGNO(r) (IS_EXT_REGNO(r) || IS_STD_REGNO(r))
00478 #define IS_GROUP1_REGNO(r) (IS_ADDR_OR_INDEX_REGNO(r) || IS_BK_REGNO(r))
00479 #define IS_INT_CALL_SAVED_REGNO(r) (((r) == R4_REGNO) || ((r) == R5_REGNO) \
00480 || ((r) == R8_REGNO))
00481 #define IS_FLOAT_CALL_SAVED_REGNO(r) (((r) == R6_REGNO) || ((r) == R7_REGNO))
00482
00483 #define IS_PSEUDO_REGNO(r) ((r) >= FIRST_PSEUDO_REGISTER)
00484 #define IS_R0R1_OR_PSEUDO_REGNO(r) (IS_R0R1_REGNO(r) || IS_PSEUDO_REGNO(r))
00485 #define IS_R2R3_OR_PSEUDO_REGNO(r) (IS_R2R3_REGNO(r) || IS_PSEUDO_REGNO(r))
00486 #define IS_EXT_OR_PSEUDO_REGNO(r) (IS_EXT_REGNO(r) || IS_PSEUDO_REGNO(r))
00487 #define IS_STD_OR_PSEUDO_REGNO(r) (IS_STD_REGNO(r) || IS_PSEUDO_REGNO(r))
00488 #define IS_INT_OR_PSEUDO_REGNO(r) (IS_INT_REGNO(r) || IS_PSEUDO_REGNO(r))
00489 #define IS_ADDR_OR_PSEUDO_REGNO(r) (IS_ADDR_REGNO(r) || IS_PSEUDO_REGNO(r))
00490 #define IS_INDEX_OR_PSEUDO_REGNO(r) (IS_INDEX_REGNO(r) || IS_PSEUDO_REGNO(r))
00491 #define IS_EXT_LOW_OR_PSEUDO_REGNO(r) (IS_EXT_LOW_REGNO(r) \
00492 || IS_PSEUDO_REGNO(r))
00493 #define IS_DP_OR_PSEUDO_REGNO(r) (IS_DP_REGNO(r) || IS_PSEUDO_REGNO(r))
00494 #define IS_SP_OR_PSEUDO_REGNO(r) (IS_SP_REGNO(r) || IS_PSEUDO_REGNO(r))
00495 #define IS_ST_OR_PSEUDO_REGNO(r) (IS_ST_REGNO(r) || IS_PSEUDO_REGNO(r))
00496 #define IS_RC_OR_PSEUDO_REGNO(r) (IS_RC_REGNO(r) || IS_PSEUDO_REGNO(r))
00497
00498 #define IS_PSEUDO_REG(op) (IS_PSEUDO_REGNO(REGNO(op)))
00499 #define IS_ADDR_REG(op) (IS_ADDR_REGNO(REGNO(op)))
00500 #define IS_INDEX_REG(op) (IS_INDEX_REGNO(REGNO(op)))
00501 #define IS_GROUP1_REG(r) (IS_GROUP1_REGNO(REGNO(op)))
00502 #define IS_SP_REG(op) (IS_SP_REGNO(REGNO(op)))
00503 #define IS_STD_REG(op) (IS_STD_REGNO(REGNO(op)))
00504 #define IS_EXT_REG(op) (IS_EXT_REGNO(REGNO(op)))
00505
00506 #define IS_R0R1_OR_PSEUDO_REG(op) (IS_R0R1_OR_PSEUDO_REGNO(REGNO(op)))
00507 #define IS_R2R3_OR_PSEUDO_REG(op) (IS_R2R3_OR_PSEUDO_REGNO(REGNO(op)))
00508 #define IS_EXT_OR_PSEUDO_REG(op) (IS_EXT_OR_PSEUDO_REGNO(REGNO(op)))
00509 #define IS_STD_OR_PSEUDO_REG(op) (IS_STD_OR_PSEUDO_REGNO(REGNO(op)))
00510 #define IS_EXT_LOW_OR_PSEUDO_REG(op) (IS_EXT_LOW_OR_PSEUDO_REGNO(REGNO(op)))
00511 #define IS_INT_OR_PSEUDO_REG(op) (IS_INT_OR_PSEUDO_REGNO(REGNO(op)))
00512
00513 #define IS_ADDR_OR_PSEUDO_REG(op) (IS_ADDR_OR_PSEUDO_REGNO(REGNO(op)))
00514 #define IS_INDEX_OR_PSEUDO_REG(op) (IS_INDEX_OR_PSEUDO_REGNO(REGNO(op)))
00515 #define IS_DP_OR_PSEUDO_REG(op) (IS_DP_OR_PSEUDO_REGNO(REGNO(op)))
00516 #define IS_SP_OR_PSEUDO_REG(op) (IS_SP_OR_PSEUDO_REGNO(REGNO(op)))
00517 #define IS_ST_OR_PSEUDO_REG(op) (IS_ST_OR_PSEUDO_REGNO(REGNO(op)))
00518 #define IS_RC_OR_PSEUDO_REG(op) (IS_RC_OR_PSEUDO_REGNO(REGNO(op)))
00519
00520
00521
00522
00523 #define FIXED_REGISTERS \
00524 { \
00525 \
00526 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00527 \
00528 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 \
00529 }
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542 #define CALL_USED_REGISTERS \
00543 { \
00544 \
00545 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, \
00546 \
00547 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 \
00548 }
00549
00550
00551
00552 #define CONDITIONAL_REGISTER_USAGE \
00553 { \
00554 if (! TARGET_BK) \
00555 { \
00556 fixed_regs[BK_REGNO] = 1; \
00557 call_used_regs[BK_REGNO] = 1; \
00558 c4x_regclass_map[BK_REGNO] = NO_REGS; \
00559 } \
00560 if (TARGET_C3X) \
00561 { \
00562 int i; \
00563 \
00564 reg_names[DIE_REGNO] = "ie"; \
00565 reg_names[IF_REGNO] = "if"; \
00566 reg_names[IOF_REGNO] = "iof"; \
00567 \
00568 for (i = R8_REGNO; i <= R11_REGNO; i++) \
00569 { \
00570 fixed_regs[i] = call_used_regs[i] = 1; \
00571 c4x_regclass_map[i] = NO_REGS; \
00572 } \
00573 } \
00574 if (TARGET_PRESERVE_FLOAT) \
00575 { \
00576 c4x_caller_save_map[R6_REGNO] = HFmode; \
00577 c4x_caller_save_map[R7_REGNO] = HFmode; \
00578 } \
00579 }
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594 #define REG_ALLOC_ORDER \
00595 {R0_REGNO, R1_REGNO, R2_REGNO, R3_REGNO, \
00596 R9_REGNO, R10_REGNO, R11_REGNO, \
00597 RS_REGNO, RE_REGNO, RC_REGNO, BK_REGNO, \
00598 R4_REGNO, R5_REGNO, R6_REGNO, R7_REGNO, R8_REGNO, \
00599 AR0_REGNO, AR1_REGNO, AR2_REGNO, AR3_REGNO, \
00600 AR4_REGNO, AR5_REGNO, AR6_REGNO, AR7_REGNO, \
00601 IR0_REGNO, IR1_REGNO, \
00602 SP_REGNO, DP_REGNO, ST_REGNO, IE_REGNO, IF_REGNO, IOF_REGNO}
00603
00604
00605
00606
00607 #define HARD_REGNO_RENAME_OK(REGNO1,REGNO2) \
00608 c4x_hard_regno_rename_ok((REGNO1), (REGNO2))
00609
00610
00611
00612
00613
00614 #define CLASS_LIKELY_SPILLED_P(CLASS) ((CLASS) == INDEX_REGS)
00615
00616
00617
00618
00619
00620
00621 #define HARD_REGNO_NREGS(REGNO, MODE) \
00622 (((MODE) == CCmode || (MODE) == CC_NOOVmode) ? 1 : \
00623 ((MODE) == HFmode) ? 1 : \
00624 ((MODE) == HCmode) ? 2 : \
00625 ((GET_MODE_SIZE(MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
00626
00627
00628
00629
00630
00631
00632 #define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \
00633 ((IS_FLOAT_CALL_SAVED_REGNO (REGNO) && ! ((MODE) == QFmode)) \
00634 || (IS_INT_CALL_SAVED_REGNO (REGNO) \
00635 && ! ((MODE) == QImode || (MODE) == HImode || (MODE) == Pmode)))
00636
00637
00638
00639 #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) (c4x_caller_save_map[REGNO])
00640
00641 #define HARD_REGNO_MODE_OK(REGNO, MODE) c4x_hard_regno_mode_ok(REGNO, MODE)
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652 #define MODES_TIEABLE_P(MODE1, MODE2) 0
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675 enum reg_class
00676 {
00677 NO_REGS,
00678 R0R1_REGS,
00679 R2R3_REGS,
00680 EXT_LOW_REGS,
00681 EXT_REGS,
00682 ADDR_REGS,
00683 INDEX_REGS,
00684 BK_REG,
00685 SP_REG,
00686 RC_REG,
00687 COUNTER_REGS,
00688 INT_REGS,
00689 GENERAL_REGS,
00690 DP_REG,
00691 ST_REG,
00692 ALL_REGS,
00693 LIM_REG_CLASSES
00694 };
00695
00696 #define N_REG_CLASSES (int) LIM_REG_CLASSES
00697
00698 #define REG_CLASS_NAMES \
00699 { \
00700 "NO_REGS", \
00701 "R0R1_REGS", \
00702 "R2R3_REGS", \
00703 "EXT_LOW_REGS", \
00704 "EXT_REGS", \
00705 "ADDR_REGS", \
00706 "INDEX_REGS", \
00707 "BK_REG", \
00708 "SP_REG", \
00709 "RC_REG", \
00710 "COUNTER_REGS", \
00711 "INT_REGS", \
00712 "GENERAL_REGS", \
00713 "DP_REG", \
00714 "ST_REG", \
00715 "ALL_REGS" \
00716 }
00717
00718
00719
00720
00721
00722
00723
00724 #define REG_CLASS_CONTENTS \
00725 { \
00726 {0x00000000}, \
00727 {0x00000003}, \
00728 {0x0000000c}, \
00729 {0x000000ff}, \
00730 {0xf00000ff}, \
00731 {0x0000ff00}, \
00732 {0x00060000}, \
00733 {0x00080000}, \
00734 {0x00100000}, \
00735 {0x08000000}, \
00736 {0x0800ff00}, \
00737 {0x0e1eff00}, \
00738 {0xfe1effff}, \
00739 {0x00010000}, \
00740 {0x00200000}, \
00741 {0xffffffff}, \
00742 }
00743
00744
00745
00746
00747
00748
00749 #define REGNO_REG_CLASS(REGNO) (c4x_regclass_map[REGNO])
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764 #define SMALL_REGISTER_CLASSES (TARGET_SMALL_REG_CLASS && TARGET_PARALLEL_MPY)
00765
00766 #define BASE_REG_CLASS ADDR_REGS
00767 #define INDEX_REG_CLASS INDEX_REGS
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807 #define REG_CLASS_FROM_LETTER(CC) \
00808 ( ((CC) == 'a') ? ADDR_REGS \
00809 : ((CC) == 'b') ? SP_REG \
00810 : ((CC) == 'c') ? INT_REGS \
00811 : ((CC) == 'd') ? EXT_REGS \
00812 : ((CC) == 'f') ? EXT_REGS \
00813 : ((CC) == 'h') ? EXT_REGS \
00814 : ((CC) == 'k') ? BK_REG \
00815 : ((CC) == 'q') ? EXT_LOW_REGS \
00816 : ((CC) == 't') ? R0R1_REGS \
00817 : ((CC) == 'u') ? R2R3_REGS \
00818 : ((CC) == 'v') ? RC_REG \
00819 : ((CC) == 'x') ? INDEX_REGS \
00820 : ((CC) == 'y') ? ST_REG \
00821 : ((CC) == 'z') ? DP_REG \
00822 : NO_REGS )
00823
00824
00825
00826
00827
00828
00829
00830 #define REGNO_OK_FOR_BASE_P(REGNO) \
00831 (IS_ADDR_REGNO(REGNO) || IS_ADDR_REGNO((unsigned)reg_renumber[REGNO]))
00832
00833 #define REGNO_OK_FOR_INDEX_P(REGNO) \
00834 (IS_INDEX_REGNO(REGNO) || IS_INDEX_REGNO((unsigned)reg_renumber[REGNO]))
00835
00836
00837
00838
00839 #define PREFERRED_RELOAD_CLASS(X, CLASS) \
00840 (GET_CODE (X) == PLUS \
00841 && GET_MODE (X) == Pmode \
00842 && GET_CODE (XEXP ((X), 0)) == REG \
00843 && GET_MODE (XEXP ((X), 0)) == Pmode \
00844 && REGNO (XEXP ((X), 0)) == FRAME_POINTER_REGNUM \
00845 && GET_CODE (XEXP ((X), 1)) == CONST_INT \
00846 ? ADDR_REGS : (CLASS))
00847
00848 #define LIMIT_RELOAD_CLASS(X, CLASS) (CLASS)
00849
00850 #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) 0
00851
00852 #define CLASS_MAX_NREGS(CLASS, MODE) \
00853 (((MODE) == CCmode || (MODE) == CC_NOOVmode) ? 1 : ((MODE) == HFmode) ? 1 : \
00854 ((GET_MODE_SIZE(MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
00855
00856 #define IS_INT5_CONST(VAL) (((VAL) <= 15) && ((VAL) >= -16))
00857
00858 #define IS_UINT5_CONST(VAL) (((VAL) <= 31) && ((VAL) >= 0))
00859
00860 #define IS_INT8_CONST(VAL) (((VAL) <= 127) && ((VAL) >= -128))
00861
00862 #define IS_UINT8_CONST(VAL) (((VAL) <= 255) && ((VAL) >= 0))
00863
00864 #define IS_INT16_CONST(VAL) (((VAL) <= 32767) && ((VAL) >= -32768))
00865
00866 #define IS_UINT16_CONST(VAL) (((VAL) <= 65535) && ((VAL) >= 0))
00867
00868 #define IS_NOT_UINT16_CONST(VAL) IS_UINT16_CONST(~(VAL))
00869
00870 #define IS_HIGH_CONST(VAL) \
00871 (! TARGET_C3X && (((VAL) & 0xffff) == 0))
00872
00873
00874 #define IS_DISP1_CONST(VAL) (((VAL) <= 1) && ((VAL) >= -1))
00875
00876 #define IS_DISP8_CONST(VAL) (((VAL) <= 255) && ((VAL) >= -255))
00877
00878 #define IS_DISP1_OFF_CONST(VAL) (IS_DISP1_CONST (VAL) \
00879 && IS_DISP1_CONST (VAL + 1))
00880
00881 #define IS_DISP8_OFF_CONST(VAL) (IS_DISP8_CONST (VAL) \
00882 && IS_DISP8_CONST (VAL + 1))
00883
00884 #define CONST_OK_FOR_LETTER_P(VAL, C) \
00885 ( ((C) == 'I') ? (IS_INT16_CONST (VAL)) \
00886 : ((C) == 'J') ? (! TARGET_C3X && IS_INT8_CONST (VAL)) \
00887 : ((C) == 'K') ? (! TARGET_C3X && IS_INT5_CONST (VAL)) \
00888 : ((C) == 'L') ? (IS_UINT16_CONST (VAL)) \
00889 : ((C) == 'M') ? (! TARGET_C3X && IS_UINT8_CONST (VAL)) \
00890 : ((C) == 'N') ? (IS_NOT_UINT16_CONST (VAL)) \
00891 : ((C) == 'O') ? (IS_HIGH_CONST (VAL)) \
00892 : 0 )
00893
00894 #define CONST_DOUBLE_OK_FOR_LETTER_P(OP, C) \
00895 ( ((C) == 'G') ? (fp_zero_operand (OP, QFmode)) \
00896 : ((C) == 'H') ? (c4x_H_constant (OP)) \
00897 : 0 )
00898
00899 #define EXTRA_CONSTRAINT(OP, C) \
00900 ( ((C) == 'Q') ? (c4x_Q_constraint (OP)) \
00901 : ((C) == 'R') ? (c4x_R_constraint (OP)) \
00902 : ((C) == 'S') ? (c4x_S_constraint (OP)) \
00903 : ((C) == 'T') ? (c4x_T_constraint (OP)) \
00904 : ((C) == 'U') ? (c4x_U_constraint (OP)) \
00905 : 0 )
00906
00907 #define SMALL_CONST(VAL, insn) \
00908 ( ((insn == NULL_RTX) || (get_attr_data (insn) == DATA_INT16)) \
00909 ? IS_INT16_CONST (VAL) \
00910 : ( (get_attr_data (insn) == DATA_NOT_UINT16) \
00911 ? IS_NOT_UINT16_CONST (VAL) \
00912 : ( (get_attr_data (insn) == DATA_HIGH_16) \
00913 ? IS_HIGH_CONST (VAL) \
00914 : IS_UINT16_CONST (VAL) \
00915 ) \
00916 ) \
00917 )
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006 #define C4X_ARG0 -2
01007 #define C4X_LOC0 1
01008
01009
01010
01011
01012
01013
01014 #define STARTING_FRAME_OFFSET C4X_LOC0
01015 #define FIRST_PARM_OFFSET(FNDECL) (C4X_ARG0 + 1)
01016 #define ARGS_GROW_DOWNWARD
01017 #define STACK_POINTER_OFFSET 1
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035 #define STACK_POINTER_REGNUM SP_REGNO
01036 #define FRAME_POINTER_REGNUM AR3_REGNO
01037 #define ARG_POINTER_REGNUM AR3_REGNO
01038 #define STATIC_CHAIN_REGNUM AR0_REGNO
01039
01040
01041
01042 #define FRAME_POINTER_REQUIRED 0
01043
01044 #define INITIAL_FRAME_POINTER_OFFSET(DEPTH) \
01045 { \
01046 int regno; \
01047 int offset = 0; \
01048 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
01049 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
01050 offset += TARGET_PRESERVE_FLOAT \
01051 && IS_FLOAT_CALL_SAVED_REGNO (regno) ? 2 : 1; \
01052 (DEPTH) = -(offset + get_frame_size ()); \
01053 }
01054
01055
01056 #define ELIMINABLE_REGS \
01057 {{ FRAME_POINTER_REGNUM, FRAME_POINTER_REGNUM }}
01058
01059 #define CAN_ELIMINATE(FROM, TO) \
01060 (! (((FROM) == FRAME_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
01061 || ((FROM) == FRAME_POINTER_REGNUM && (TO) == FRAME_POINTER_REGNUM)))
01062
01063 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01064 { \
01065 int regno; \
01066 int offset = 0; \
01067 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
01068 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
01069 offset += TARGET_PRESERVE_FLOAT \
01070 && IS_FLOAT_CALL_SAVED_REGNO (regno) ? 2 : 1; \
01071 (OFFSET) = -(offset + get_frame_size ()); \
01072 }
01073
01074
01075
01076
01077 #define PUSH_ARGS 1
01078 #define PUSH_ROUNDING(BYTES) (BYTES)
01079 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
01080
01081
01082
01083 typedef struct c4x_args
01084 {
01085 int floats;
01086 int ints;
01087 int maxfloats;
01088 int maxints;
01089 int init;
01090 int var;
01091 int prototype;
01092 int args;
01093 }
01094 CUMULATIVE_ARGS;
01095
01096 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
01097 (c4x_init_cumulative_args (&CUM, FNTYPE, LIBNAME))
01098
01099 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
01100 (c4x_function_arg_advance (&CUM, MODE, TYPE, NAMED))
01101
01102 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
01103 (c4x_function_arg(&CUM, MODE, TYPE, NAMED))
01104
01105
01106
01107
01108
01109
01110 #define CALLER_SAVE_PROFITABLE(REFS,CALLS) 0
01111
01112
01113
01114 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0
01115
01116 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0
01117
01118
01119
01120 #define FUNCTION_ARG_REGNO_P(REGNO) \
01121 ( ( ((REGNO) == AR2_REGNO) \
01122 || ((REGNO) == R2_REGNO) \
01123 || ((REGNO) == R3_REGNO) \
01124 || ((REGNO) == RC_REGNO) \
01125 || ((REGNO) == RS_REGNO) \
01126 || ((REGNO) == RE_REGNO)) \
01127 ? 1 \
01128 : 0)
01129
01130
01131
01132 #define FUNCTION_VALUE(VALTYPE, FUNC) \
01133 gen_rtx(REG, TYPE_MODE(VALTYPE), R0_REGNO)
01134
01135 #define LIBCALL_VALUE(MODE) \
01136 gen_rtx(REG, MODE, R0_REGNO)
01137
01138 #define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == R0_REGNO)
01139
01140
01141
01142 #define DEFAULT_PCC_STRUCT_RETURN 0
01143 #define STRUCT_VALUE_REGNUM AR0_REGNO
01144
01145
01146
01147 #define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \
01148 c4x_va_start (stdarg, valist, nextarg)
01149
01150 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
01151 c4x_va_arg (valist, type)
01152
01153
01154
01155
01156
01157
01158
01159
01160 #define FUNCTION_PROFILER(FILE, LABELNO) \
01161 if (! TARGET_C3X) \
01162 { \
01163 fprintf (FILE, "\tpush\tar2\n"); \
01164 fprintf (FILE, "\tldhi\t^LP%d,ar2\n", (LABELNO)); \
01165 fprintf (FILE, "\tor\t#LP%d,ar2\n", (LABELNO)); \
01166 fprintf (FILE, "\tcall\tmcount\n"); \
01167 fprintf (FILE, "\tpop\tar2\n"); \
01168 } \
01169 else \
01170 { \
01171 fprintf (FILE, "\tpush\tar2\n"); \
01172 fprintf (FILE, "\tldiu\t^LP%d,ar2\n", (LABELNO)); \
01173 fprintf (FILE, "\tlsh\t16,ar2\n"); \
01174 fprintf (FILE, "\tor\t#LP%d,ar2\n", (LABELNO)); \
01175 fprintf (FILE, "\tcall\tmcount\n"); \
01176 fprintf (FILE, "\tpop\tar2\n"); \
01177 }
01178
01179
01180
01181 #define MULQI3_LIBCALL "__mulqi3"
01182 #define DIVQI3_LIBCALL "__divqi3"
01183 #define UDIVQI3_LIBCALL "__udivqi3"
01184 #define MODQI3_LIBCALL "__modqi3"
01185 #define UMODQI3_LIBCALL "__umodqi3"
01186
01187 #define DIVQF3_LIBCALL "__divqf3"
01188
01189 #define MULHF3_LIBCALL "__mulhf3"
01190 #define DIVHF3_LIBCALL "__divhf3"
01191
01192 #define MULHI3_LIBCALL "__mulhi3"
01193 #define SMULHI3_LIBCALL "__smulhi3_high"
01194 #define UMULHI3_LIBCALL "__umulhi3_high"
01195 #define DIVHI3_LIBCALL "__divhi3"
01196 #define UDIVHI3_LIBCALL "__udivhi3"
01197 #define MODHI3_LIBCALL "__modhi3"
01198 #define UMODHI3_LIBCALL "__umodhi3"
01199
01200 #define FLOATHIQF2_LIBCALL "__floathiqf2"
01201 #define FLOATUNSHIQF2_LIBCALL "__ufloathiqf2"
01202 #define FIX_TRUNCQFHI2_LIBCALL "__fix_truncqfhi2"
01203 #define FIXUNS_TRUNCQFHI2_LIBCALL "__ufix_truncqfhi2"
01204
01205 #define FLOATHIHF2_LIBCALL "__floathihf2"
01206 #define FLOATUNSHIHF2_LIBCALL "__ufloathihf2"
01207 #define FIX_TRUNCHFHI2_LIBCALL "__fix_trunchfhi2"
01208 #define FIXUNS_TRUNCHFHI2_LIBCALL "__ufix_trunchfhi2"
01209
01210 #define FFS_LIBCALL "__ffs"
01211
01212 #define INIT_TARGET_OPTABS \
01213 do { \
01214 smul_optab->handlers[(int) QImode].libfunc \
01215 = init_one_libfunc (MULQI3_LIBCALL); \
01216 sdiv_optab->handlers[(int) QImode].libfunc \
01217 = init_one_libfunc (DIVQI3_LIBCALL); \
01218 udiv_optab->handlers[(int) QImode].libfunc \
01219 = init_one_libfunc (UDIVQI3_LIBCALL); \
01220 smod_optab->handlers[(int) QImode].libfunc \
01221 = init_one_libfunc (MODQI3_LIBCALL); \
01222 umod_optab->handlers[(int) QImode].libfunc \
01223 = init_one_libfunc (UMODQI3_LIBCALL); \
01224 sdiv_optab->handlers[(int) QFmode].libfunc \
01225 = init_one_libfunc (DIVQF3_LIBCALL); \
01226 smul_optab->handlers[(int) HFmode].libfunc \
01227 = init_one_libfunc (MULHF3_LIBCALL); \
01228 sdiv_optab->handlers[(int) HFmode].libfunc \
01229 = init_one_libfunc (DIVHF3_LIBCALL); \
01230 smul_optab->handlers[(int) HImode].libfunc \
01231 = init_one_libfunc (MULHI3_LIBCALL); \
01232 sdiv_optab->handlers[(int) HImode].libfunc \
01233 = init_one_libfunc (DIVHI3_LIBCALL); \
01234 udiv_optab->handlers[(int) HImode].libfunc \
01235 = init_one_libfunc (UDIVHI3_LIBCALL); \
01236 smod_optab->handlers[(int) HImode].libfunc \
01237 = init_one_libfunc (MODHI3_LIBCALL); \
01238 umod_optab->handlers[(int) HImode].libfunc \
01239 = init_one_libfunc (UMODHI3_LIBCALL); \
01240 ffs_optab->handlers[(int) QImode].libfunc \
01241 = init_one_libfunc (FFS_LIBCALL); \
01242 smulhi3_libfunc \
01243 = init_one_libfunc(SMULHI3_LIBCALL); \
01244 umulhi3_libfunc \
01245 = init_one_libfunc(UMULHI3_LIBCALL); \
01246 fix_truncqfhi2_libfunc \
01247 = init_one_libfunc(FIX_TRUNCQFHI2_LIBCALL); \
01248 fixuns_truncqfhi2_libfunc \
01249 = init_one_libfunc(FIXUNS_TRUNCQFHI2_LIBCALL); \
01250 fix_trunchfhi2_libfunc \
01251 = init_one_libfunc(FIX_TRUNCHFHI2_LIBCALL); \
01252 fixuns_trunchfhi2_libfunc \
01253 = init_one_libfunc(FIXUNS_TRUNCHFHI2_LIBCALL); \
01254 floathiqf2_libfunc \
01255 = init_one_libfunc(FLOATHIQF2_LIBCALL); \
01256 floatunshiqf2_libfunc \
01257 = init_one_libfunc(FLOATUNSHIQF2_LIBCALL); \
01258 floathihf2_libfunc \
01259 = init_one_libfunc(FLOATHIHF2_LIBCALL); \
01260 floatunshihf2_libfunc \
01261 = init_one_libfunc(FLOATUNSHIHF2_LIBCALL); \
01262 } while (0)
01263
01264 #define TARGET_MEM_FUNCTIONS
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343 #define EXTRA_CC_MODES CC(CC_NOOVmode, "CC_NOOV")
01344
01345
01346
01347
01348 #define SELECT_CC_MODE(OP,X,Y) \
01349 ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \
01350 || GET_CODE (X) == NEG || GET_CODE (X) == MULT \
01351 || GET_MODE (X) == ABS \
01352 || GET_CODE (Y) == PLUS || GET_CODE (Y) == MINUS \
01353 || GET_CODE (Y) == NEG || GET_CODE (Y) == MULT \
01354 || GET_MODE (Y) == ABS) \
01355 ? CC_NOOVmode : CCmode)
01356
01357
01358
01359 #define HAVE_POST_INCREMENT 1
01360 #define HAVE_PRE_INCREMENT 1
01361 #define HAVE_POST_DECREMENT 1
01362 #define HAVE_PRE_DECREMENT 1
01363 #define HAVE_PRE_MODIFY_REG 1
01364 #define HAVE_POST_MODIFY_REG 1
01365 #define HAVE_PRE_MODIFY_DISP 1
01366 #define HAVE_POST_MODIFY_DISP 1
01367
01368
01369 #define PACK_INSNS 2
01370
01371
01372
01373
01374
01375
01376 #define CONSTANT_ADDRESS_P(X) (GET_CODE (X) == SYMBOL_REF)
01377
01378
01379
01380 #define MAX_REGS_PER_ADDRESS 2
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395 #ifndef REG_OK_STRICT
01396
01397
01398
01399 #define REG_OK_FOR_BASE_P(X) IS_ADDR_OR_PSEUDO_REG(X)
01400
01401
01402
01403 #define REG_OK_FOR_INDEX_P(X) IS_INDEX_OR_PSEUDO_REG(X)
01404
01405 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01406 { \
01407 if (c4x_check_legit_addr (MODE, X, 0)) \
01408 goto ADDR; \
01409 }
01410
01411 #else
01412
01413
01414
01415 #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
01416
01417
01418
01419 #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01420
01421 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01422 { \
01423 if (c4x_check_legit_addr (MODE, X, 1)) \
01424 goto ADDR; \
01425 }
01426
01427 #endif
01428
01429 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
01430 { \
01431 rtx new; \
01432 new = c4x_legitimize_address (X, MODE); \
01433 if (new != NULL_RTX) \
01434 { \
01435 (X) = new; \
01436 goto WIN; \
01437 } \
01438 }
01439
01440 #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \
01441 { \
01442 if (MODE != HImode \
01443 && MODE != HFmode \
01444 && GET_MODE (X) != HImode \
01445 && GET_MODE (X) != HFmode \
01446 && (GET_CODE (X) == CONST \
01447 || GET_CODE (X) == SYMBOL_REF \
01448 || GET_CODE (X) == LABEL_REF)) \
01449 { \
01450 if (! TARGET_SMALL) \
01451 { \
01452 int i; \
01453 X = gen_rtx_LO_SUM (GET_MODE (X), \
01454 gen_rtx_HIGH (GET_MODE (X), X), X); \
01455 i = push_reload (XEXP (X, 0), NULL_RTX, \
01456 &XEXP (X, 0), NULL, \
01457 DP_REG, GET_MODE (X), VOIDmode, 0, 0, \
01458 OPNUM, TYPE); \
01459
01460 \
01461 rld[i].reg_rtx = gen_rtx_REG (Pmode, DP_REGNO); \
01462 rld[i].nocombine = 1; \
01463 } \
01464 goto WIN; \
01465 } \
01466 else if (MODE != HImode \
01467 && MODE != HFmode \
01468 && GET_MODE (X) != HImode \
01469 && GET_MODE (X) != HFmode \
01470 && GET_CODE (X) == LO_SUM \
01471 && GET_CODE (XEXP (X,0)) == HIGH \
01472 && (GET_CODE (XEXP (XEXP (X,0),0)) == CONST \
01473 || GET_CODE (XEXP (XEXP (X,0),0)) == SYMBOL_REF \
01474 || GET_CODE (XEXP (XEXP (X,0),0)) == LABEL_REF)) \
01475 { \
01476 if (! TARGET_SMALL) \
01477 { \
01478 int i = push_reload (XEXP (X, 0), NULL_RTX, \
01479 &XEXP (X, 0), NULL, \
01480 DP_REG, GET_MODE (X), VOIDmode, 0, 0, \
01481 OPNUM, TYPE); \
01482
01483 \
01484 rld[i].reg_rtx = gen_rtx_REG (Pmode, DP_REGNO); \
01485 rld[i].nocombine = 1; \
01486 } \
01487 goto WIN; \
01488 } \
01489 }
01490
01491
01492
01493 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
01494 if (GET_CODE (ADDR) == PRE_DEC \
01495 || GET_CODE (ADDR) == POST_DEC \
01496 || GET_CODE (ADDR) == PRE_INC \
01497 || GET_CODE (ADDR) == POST_INC \
01498 || GET_CODE (ADDR) == POST_MODIFY \
01499 || GET_CODE (ADDR) == PRE_MODIFY) \
01500 goto LABEL
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515 #define LEGITIMATE_CONSTANT_P(X) \
01516 ((GET_CODE (X) == CONST_DOUBLE && c4x_H_constant (X)) \
01517 || (GET_CODE (X) == CONST_INT) \
01518 || (GET_CODE (X) == SYMBOL_REF) \
01519 || (GET_CODE (X) == LABEL_REF) \
01520 || (GET_CODE (X) == CONST) \
01521 || (GET_CODE (X) == HIGH && ! TARGET_C3X) \
01522 || (GET_CODE (X) == LO_SUM && ! TARGET_C3X))
01523
01524 #define LEGITIMATE_DISPLACEMENT_P(X) IS_DISP8_CONST (INTVAL (X))
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543 #define ENCODE_SECTION_INFO(DECL) c4x_encode_section_info (DECL);
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559 #define RTX_COSTS(RTX, CODE, OUTER_CODE) \
01560 case PLUS: \
01561 case MINUS: \
01562 case AND: \
01563 case IOR: \
01564 case XOR: \
01565 case ASHIFT: \
01566 case ASHIFTRT: \
01567 case LSHIFTRT: \
01568 return COSTS_N_INSNS (1); \
01569 case MULT: \
01570 return COSTS_N_INSNS (GET_MODE_CLASS (GET_MODE (RTX)) == MODE_FLOAT \
01571 || TARGET_MPYI ? 1 : 14); \
01572 case DIV: \
01573 case UDIV: \
01574 case MOD: \
01575 case UMOD: \
01576 return COSTS_N_INSNS (GET_MODE_CLASS (GET_MODE (RTX)) == MODE_FLOAT \
01577 ? 15 : 50);
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598 #define SHIFT_CODE_P(C) ((C) == ASHIFT || (C) == ASHIFTRT || (C) == LSHIFTRT)
01599
01600 #define LOGICAL_CODE_P(C) ((C) == NOT || (C) == AND \
01601 || (C) == IOR || (C) == XOR)
01602
01603 #define NON_COMMUTATIVE_CODE_P ((C) == MINUS || (C) == COMPARE)
01604
01605 #define CONST_COSTS(RTX,CODE,OUTER_CODE) \
01606 case CONST_INT: \
01607 if (c4x_J_constant (RTX)) \
01608 return 0; \
01609 if (! TARGET_C3X \
01610 && OUTER_CODE == AND \
01611 && GET_CODE (RTX) == CONST_INT \
01612 && (INTVAL (RTX) == 255 || INTVAL (RTX) == 65535)) \
01613 return 0; \
01614 if (! TARGET_C3X \
01615 && (OUTER_CODE == ASHIFTRT || OUTER_CODE == LSHIFTRT) \
01616 && GET_CODE (RTX) == CONST_INT \
01617 && (INTVAL (RTX) == 16 || INTVAL (RTX) == 24)) \
01618 return 0; \
01619 if (TARGET_C3X && SHIFT_CODE_P (OUTER_CODE)) \
01620 return 3; \
01621 if (LOGICAL_CODE_P (OUTER_CODE) \
01622 ? c4x_L_constant (RTX) : c4x_I_constant (RTX)) \
01623 return 2; \
01624 case CONST: \
01625 case LABEL_REF: \
01626 case SYMBOL_REF: \
01627 return 4; \
01628 case CONST_DOUBLE: \
01629 if (c4x_H_constant (RTX)) \
01630 return 2; \
01631 if (GET_MODE (RTX) == QFmode) \
01632 return 4; \
01633 else \
01634 return 8;
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645 #define ADDRESS_COST(ADDR) (REG_P (ADDR) ? 1 : c4x_address_cost (ADDR))
01646
01647 #define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \
01648 if (REG_P (OP1) && ! REG_P (OP0)) \
01649 { \
01650 rtx tmp = OP0; OP0 = OP1 ; OP1 = tmp; \
01651 CODE = swap_condition (CODE); \
01652 }
01653
01654 #define EXT_CLASS_P(CLASS) (reg_class_subset_p (CLASS, EXT_REGS))
01655 #define ADDR_CLASS_P(CLASS) (reg_class_subset_p (CLASS, ADDR_REGS))
01656 #define INDEX_CLASS_P(CLASS) (reg_class_subset_p (CLASS, INDEX_REGS))
01657 #define EXPENSIVE_CLASS_P(CLASS) (ADDR_CLASS_P(CLASS) \
01658 || INDEX_CLASS_P(CLASS) || (CLASS) == SP_REG)
01659
01660
01661
01662
01663 #define REGISTER_MOVE_COST(MODE, FROM, TO) 2
01664
01665
01666
01667
01668 #define MEMORY_MOVE_COST(M,C,I) 4
01669
01670
01671
01672
01673 #define BRANCH_COST 8
01674
01675 #define WORD_REGISTER_OPERATIONS
01676
01677
01678
01679 #define TEXT_SECTION_ASM_OP "\t.text"
01680
01681 #define DATA_SECTION_ASM_OP "\t.data"
01682
01683 #define USE_CONST_SECTION 1
01684
01685 #define CONST_SECTION_ASM_OP "\t.sect\t\".const\""
01686
01687
01688
01689
01690 #if 0
01691 #define INIT_SECTION_ASM_OP "\t.sect\t\".init\""
01692 #endif
01693
01694 #define FINI_SECTION_ASM_OP "\t.sect\t\".fini\""
01695
01696 #undef EXTRA_SECTIONS
01697 #define EXTRA_SECTIONS in_const, in_init, in_fini
01698
01699 #undef EXTRA_SECTION_FUNCTIONS
01700 #define EXTRA_SECTION_FUNCTIONS \
01701 CONST_SECTION_FUNCTION \
01702 INIT_SECTION_FUNCTION \
01703 FINI_SECTION_FUNCTION
01704
01705 #define INIT_SECTION_FUNCTION \
01706 extern void init_section PARAMS ((void)); \
01707 void \
01708 init_section () \
01709 { \
01710 if (in_section != in_init) \
01711 { \
01712 fprintf (asm_out_file, ";\t.init\n"); \
01713 in_section = in_init; \
01714 } \
01715 }
01716
01717 #define FINI_SECTION_FUNCTION \
01718 void \
01719 fini_section () \
01720 { \
01721 if (in_section != in_fini) \
01722 { \
01723 fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP); \
01724 in_section = in_fini; \
01725 } \
01726 }
01727
01728 #define READONLY_DATA_SECTION() const_section ()
01729
01730 #define CONST_SECTION_FUNCTION \
01731 void \
01732 const_section () \
01733 { \
01734 if (! USE_CONST_SECTION) \
01735 text_section(); \
01736 else if (in_section != in_const) \
01737 { \
01738 fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
01739 in_section = in_const; \
01740 } \
01741 }
01742
01743 #define ASM_STABS_OP "\t.stabs\t"
01744
01745
01746 #define TARGET_ASM_NAMED_SECTION c4x_asm_named_section
01747
01748
01749
01750
01751
01752
01753 #define SELECT_SECTION(DECL, RELOC, ALIGN) \
01754 { \
01755 if (TREE_CODE (DECL) == STRING_CST) \
01756 { \
01757 if (! flag_writable_strings) \
01758 const_section (); \
01759 else \
01760 data_section (); \
01761 } \
01762 else if (TREE_CODE (DECL) == VAR_DECL) \
01763 { \
01764 if ((0 && RELOC) \
01765 || ! TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
01766 || ! DECL_INITIAL (DECL) \
01767 || (DECL_INITIAL (DECL) != error_mark_node \
01768 && ! TREE_CONSTANT (DECL_INITIAL (DECL)))) \
01769 data_section (); \
01770 else \
01771 const_section (); \
01772 } \
01773 else \
01774 const_section (); \
01775 }
01776
01777
01778
01779 #undef HOST_WIDE_INT_PRINT_HEX
01780 #ifndef HOST_WIDE_INT_PRINT_HEX
01781 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
01782 # define HOST_WIDE_INT_PRINT_HEX "0%xh"
01783 # else
01784 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
01785 # define HOST_WIDE_INT_PRINT_HEX "0%lxh"
01786 # else
01787 # define HOST_WIDE_INT_PRINT_HEX "0%llxh"
01788 # endif
01789 # endif
01790 #endif
01791
01792
01793
01794
01795
01796
01797
01798 #define SELECT_RTX_SECTION(MODE, RTX, ALIGN) const_section()
01799
01800
01801
01802
01803
01804
01805
01806
01807 #define ASM_FILE_START(FILE) \
01808 { \
01809 int dspversion = 0; \
01810 if (TARGET_C30) dspversion = 30; \
01811 if (TARGET_C31) dspversion = 31; \
01812 if (TARGET_C32) dspversion = 32; \
01813 if (TARGET_C40) dspversion = 40; \
01814 if (TARGET_C44) dspversion = 44; \
01815 fprintf (FILE, "\t.version\t%d\n", dspversion); \
01816 fprintf (FILE, "\t.file\t"); \
01817 if (TARGET_TI) \
01818 { \
01819 const char *p; \
01820 const char *after_dir = main_input_filename; \
01821 for (p = main_input_filename; *p; p++) \
01822 if (*p == '/') \
01823 after_dir = p + 1; \
01824 output_quoted_string (FILE, after_dir); \
01825 } \
01826 else \
01827 output_quoted_string (FILE, main_input_filename); \
01828 fputs ("\n\t.data\ndata_sec:\n", FILE); \
01829 }
01830
01831 #define ASM_COMMENT_START ";"
01832
01833 #define ASM_APP_ON ""
01834 #define ASM_APP_OFF ""
01835
01836 #define ASM_OUTPUT_ASCII(FILE, PTR, LEN) c4x_output_ascii (FILE, PTR, LEN)
01837
01838
01839
01840 #define NO_DOT_IN_LABEL
01841
01842 #define ASM_OUTPUT_LABEL(FILE, NAME) \
01843 do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0);
01844
01845 #define ASM_GLOBALIZE_LABEL(FILE, NAME) \
01846 do { \
01847 fprintf (FILE, "\t.global\t"); \
01848 assemble_name (FILE, NAME); \
01849 fputs ("\n", FILE); \
01850 c4x_global_label (NAME); \
01851 } while (0);
01852
01853 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
01854 c4x_external_ref (NAME)
01855
01856
01857
01858
01859
01860 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
01861 c4x_external_ref (XSTR (FUN, 0))
01862
01863 #define ASM_FILE_END(FILE) \
01864 c4x_file_end (FILE)
01865
01866
01867
01868 #define USER_LABEL_PREFIX "_"
01869
01870
01871
01872
01873 #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
01874 asm_fprintf (FILE, "%s%d:\n", PREFIX, NUM)
01875
01876
01877
01878
01879
01880
01881 #define ASM_GENERATE_INTERNAL_LABEL(BUFFER, PREFIX, NUM) \
01882 sprintf (BUFFER, "*%s%d", PREFIX, NUM)
01883
01884
01885
01886
01887
01888 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
01889 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
01890 sprintf ((OUTPUT), "%s$%d", (NAME), (LABELNO)))
01891
01892
01893
01894
01895 #define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
01896 do { \
01897 assemble_name (STREAM, NAME); \
01898 fprintf (STREAM, "\t.set\t%s\n", VALUE); \
01899 } while (0)
01900
01901
01902
01903
01904
01905 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
01906 fprintf (FILE, "\t.long\tL%d\n", VALUE);
01907
01908
01909
01910 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
01911 fprintf (FILE, "\t.long\tL%d-L%d\n", VALUE, REL);
01912
01913 #undef SIZE_TYPE
01914 #define SIZE_TYPE "unsigned int"
01915
01916 #undef PTRDIFF_TYPE
01917 #define PTRDIFF_TYPE "int"
01918
01919 #undef WCHAR_TYPE
01920 #define WCHAR_TYPE "long int"
01921
01922 #undef WCHAR_TYPE_SIZE
01923 #define WCHAR_TYPE_SIZE 32
01924
01925 #define INT_TYPE_SIZE 32
01926 #define LONG_LONG_TYPE_SIZE 64
01927 #define FLOAT_TYPE_SIZE 32
01928 #define DOUBLE_TYPE_SIZE 32
01929 #define LONG_DOUBLE_TYPE_SIZE 64
01930
01931
01932
01933 #define SCCS_DIRECTIVE
01934
01935
01936
01937 #define ASM_OUTPUT_IDENT(FILE, NAME) \
01938 fprintf (FILE, "\t.ident \"%s\"\n", NAME);
01939
01940 #define CPP_PREDEFINES ""
01941
01942
01943
01944
01945
01946
01947 #undef ASM_OUTPUT_LOCAL
01948 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
01949 ( fputs ("\t.bss\t", FILE), \
01950 assemble_name (FILE, (NAME)), \
01951 fprintf (FILE, ",%u\n", (ROUNDED)))
01952
01953
01954
01955
01956 #undef ASM_OUTPUT_COMMON
01957 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
01958 ( fputs ("\t.globl\t", FILE), \
01959 assemble_name (FILE, (NAME)), \
01960 fputs ("\n\t.bss\t", FILE), \
01961 assemble_name (FILE, (NAME)), \
01962 fprintf (FILE, ",%u\n", (ROUNDED)))
01963
01964 #undef ASM_OUTPUT_BSS
01965 #define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
01966 ( fputs ("\t.globl\t", FILE), \
01967 assemble_name (FILE, (NAME)), \
01968 fputs ("\n\t.bss\t", FILE), \
01969 assemble_name (FILE, (NAME)), \
01970 fprintf (FILE, ",%u\n", (SIZE)))
01971
01972
01973
01974 #define OBJECT_FORMAT_COFF
01975 #define REAL_NM_FILE_NAME "c4x-nm"
01976
01977
01978
01979
01980
01981 #define REGISTER_NAMES \
01982 { \
01983 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
01984 "ar0", "ar1", "ar2", "ar3", "ar4", "ar5", "ar6", "ar7", \
01985 "dp", "ir0", "ir1", "bk", "sp", "st", "die", "iie", \
01986 "iif", "rs", "re", "rc", "r8", "r9", "r10", "r11" \
01987 }
01988
01989
01990
01991 #define FLOAT_REGISTER_NAMES \
01992 { \
01993 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
01994 "ar0", "ar1", "ar2", "ar3", "ar4", "ar5", "ar6", "ar7", \
01995 "dp", "ir0", "ir1", "bk", "sp", "st", "die", "iie", \
01996 "iif", "rs", "re", "rc", "f8", "f9", "f10", "f11" \
01997 }
01998
01999 #define PRINT_OPERAND(FILE, X, CODE) c4x_print_operand(FILE, X, CODE)
02000
02001
02002
02003
02004 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) ((CODE) == '#')
02005
02006 #define PRINT_OPERAND_ADDRESS(FILE, X) c4x_print_operand_address(FILE, X)
02007
02008
02009 #define REGISTER_TARGET_PRAGMAS(PFILE) do { \
02010 cpp_register_pragma (PFILE, 0, "CODE_SECTION", c4x_pr_CODE_SECTION); \
02011 cpp_register_pragma (PFILE, 0, "DATA_SECTION", c4x_pr_DATA_SECTION); \
02012 cpp_register_pragma (PFILE, 0, "FUNC_CANNOT_INLINE", c4x_pr_ignored); \
02013 cpp_register_pragma (PFILE, 0, "FUNC_EXT_CALLED", c4x_pr_ignored); \
02014 cpp_register_pragma (PFILE, 0, "FUNC_IS_PURE", c4x_pr_FUNC_IS_PURE); \
02015 cpp_register_pragma (PFILE, 0, "FUNC_IS_SYSTEM", c4x_pr_ignored); \
02016 cpp_register_pragma (PFILE, 0, "FUNC_NEVER_RETURNS", \
02017 c4x_pr_FUNC_NEVER_RETURNS); \
02018 cpp_register_pragma (PFILE, 0, "FUNC_NO_GLOBAL_ASG", c4x_pr_ignored); \
02019 cpp_register_pragma (PFILE, 0, "FUNC_NO_IND_ASG", c4x_pr_ignored); \
02020 cpp_register_pragma (PFILE, 0, "INTERRUPT", c4x_pr_INTERRUPT); \
02021 } while (0)
02022
02023
02024
02025 #define ASM_OUTPUT_SKIP(FILE, SIZE) \
02026 { int c = SIZE; \
02027 for (; c > 0; --c) \
02028 fprintf (FILE,"\t.word\t0\n"); \
02029 }
02030
02031 #define ASM_NO_SKIP_IN_TEXT 1
02032
02033
02034
02035 #define ASM_OUTPUT_ALIGN(FILE, LOG) \
02036 if ((LOG) != 0) \
02037 fprintf (FILE, "\t.align\t%d\n", (1 << (LOG)))
02038
02039
02040
02041
02042
02043 #define SDB_DELIM "\n"
02044 #define SDB_DEBUGGING_INFO
02045
02046
02047 #define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\t.type\t0x%x%s", a, SDB_DELIM)
02048
02049 #define PUT_SDB_DEF(A) \
02050 do { fprintf (asm_out_file, "\t.sdef\t"); \
02051 ASM_OUTPUT_LABELREF (asm_out_file, A); \
02052 fprintf (asm_out_file, SDB_DELIM); } while (0)
02053
02054 #define PUT_SDB_PLAIN_DEF(A) \
02055 fprintf (asm_out_file,"\t.sdef\t.%s%s", A, SDB_DELIM)
02056
02057 #define PUT_SDB_BLOCK_START(LINE) \
02058 fprintf (asm_out_file, \
02059 "\t.sdef\t.bb%s\t.val\t.%s\t.scl\t100%s\t.line\t%d%s\t.endef\n", \
02060 SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
02061
02062 #define PUT_SDB_BLOCK_END(LINE) \
02063 fprintf (asm_out_file, \
02064 "\t.sdef\t.eb%s\t.val\t.%s\t.scl\t100%s\t.line\t%d%s\t.endef\n", \
02065 SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
02066
02067 #define PUT_SDB_FUNCTION_START(LINE) \
02068 fprintf (asm_out_file, \
02069 "\t.sdef\t.bf%s\t.val\t.%s\t.scl\t101%s\t.line\t%d%s\t.endef\n", \
02070 SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
02071
02072
02073
02074
02075 #define PUT_SDB_FUNCTION_END(LINE) \
02076 fprintf (asm_out_file, \
02077 "\t.sdef\t.ef%s\t.val\t.%s\t.scl\t101%s\t.line\t%d%s\t.endef\n", \
02078 SDB_DELIM, SDB_DELIM, SDB_DELIM, \
02079 (LINE), SDB_DELIM)
02080
02081 #define PUT_SDB_EPILOGUE_END(NAME) \
02082 do { fprintf (asm_out_file, "\t.sdef\t"); \
02083 ASM_OUTPUT_LABELREF (asm_out_file, NAME); \
02084 fprintf (asm_out_file, \
02085 "%s\t.val\t.%s\t.scl\t-1%s\t.endef\n", \
02086 SDB_DELIM, SDB_DELIM, SDB_DELIM); } while (0)
02087
02088
02089
02090 #define DEFAULT_SIGNED_CHAR 1
02091
02092
02093
02094
02095 #define FUNCTION_MODE QImode
02096
02097 #define SLOW_BYTE_ACCESS 0
02098
02099
02100
02101
02102
02103 #define Pmode QImode
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132
02133
02134 #define TRAMPOLINE_SIZE (TARGET_C3X ? 8 : 10)
02135
02136 #define TRAMPOLINE_TEMPLATE(FILE) \
02137 { \
02138 if (TARGET_C3X) \
02139 { \
02140 asm_fprintf (FILE, "\tldiu\t0,ar1\n"); \
02141 asm_fprintf (FILE, "\tlsh\t16,ar1\n"); \
02142 asm_fprintf (FILE, "\tor\t0,ar1\n"); \
02143 asm_fprintf (FILE, "\tldiu\t0,ar0\n"); \
02144 asm_fprintf (FILE, "\tbud\tar1\n"); \
02145 asm_fprintf (FILE, "\tlsh\t16,ar0\n"); \
02146 asm_fprintf (FILE, "\tor\t0,ar0\n"); \
02147 asm_fprintf (FILE, "\tor\t1000h,st\n"); \
02148 } \
02149 else \
02150 { \
02151 asm_fprintf (FILE, "\tlaj\t$+4\n"); \
02152 asm_fprintf (FILE, "\taddi3\t4,r11,ar0\n"); \
02153 asm_fprintf (FILE, "\tlda\t*ar0,ar1\n"); \
02154 asm_fprintf (FILE, "\tlda\t*+ar0(1),ar0\n"); \
02155 asm_fprintf (FILE, "\tbud\tar1\n"); \
02156 asm_fprintf (FILE, "\tnop\n"); \
02157 asm_fprintf (FILE, "\tnop\n"); \
02158 asm_fprintf (FILE, "\tor\t1000h,st\n"); \
02159 asm_fprintf (FILE, "\t.word\t0\n"); \
02160 asm_fprintf (FILE, "\t.word\t0\n"); \
02161 } \
02162 }
02163
02164 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
02165 { \
02166 if (TARGET_C3X) \
02167 { \
02168 rtx tmp1, tmp2; \
02169 tmp1 = expand_shift (RSHIFT_EXPR, QImode, FNADDR, \
02170 size_int (16), 0, 1); \
02171 tmp2 = expand_shift (LSHIFT_EXPR, QImode, \
02172 GEN_INT (0x5069), size_int (16), 0, 1); \
02173 emit_insn (gen_iorqi3 (tmp1, tmp1, tmp2)); \
02174 emit_move_insn (gen_rtx (MEM, QImode, \
02175 plus_constant (tramp, 0)), tmp1); \
02176 tmp1 = expand_and (QImode, FNADDR, GEN_INT (0xffff), 0); \
02177 tmp2 = expand_shift (LSHIFT_EXPR, QImode, \
02178 GEN_INT (0x1069), size_int (16), 0, 1); \
02179 emit_insn (gen_iorqi3 (tmp1, tmp1, tmp2)); \
02180 emit_move_insn (gen_rtx (MEM, QImode, \
02181 plus_constant (tramp, 2)), tmp1); \
02182 tmp1 = expand_shift (RSHIFT_EXPR, QImode, CXT, \
02183 size_int (16), 0, 1); \
02184 tmp2 = expand_shift (LSHIFT_EXPR, QImode, \
02185 GEN_INT (0x5068), size_int (16), 0, 1); \
02186 emit_insn (gen_iorqi3 (tmp1, tmp1, tmp2)); \
02187 emit_move_insn (gen_rtx (MEM, QImode, \
02188 plus_constant (tramp, 3)), tmp1); \
02189 tmp1 = expand_and (QImode, CXT, GEN_INT (0xffff), 0); \
02190 tmp2 = expand_shift (LSHIFT_EXPR, QImode, \
02191 GEN_INT (0x1068), size_int (16), 0, 1); \
02192 emit_insn (gen_iorqi3 (tmp1, tmp1, tmp2)); \
02193 emit_move_insn (gen_rtx (MEM, QImode, \
02194 plus_constant (tramp, 6)), tmp1); \
02195 } \
02196 else \
02197 { \
02198 emit_move_insn (gen_rtx (MEM, QImode, \
02199 plus_constant (TRAMP, 8)), FNADDR); \
02200 emit_move_insn (gen_rtx (MEM, QImode, \
02201 plus_constant (TRAMP, 9)), CXT); \
02202 } \
02203 }
02204
02205
02206
02207
02208 #define CASE_VECTOR_MODE Pmode
02209
02210
02211
02212
02213 #define MOVE_MAX 1
02214
02215
02216
02217
02218 #define MOVE_RATIO 3
02219
02220 #define BSS_SECTION_ASM_OP "\t.bss"
02221
02222 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \
02223 asm_fprintf (FILE, "\tpush\t%s\n", reg_names[REGNO])
02224
02225
02226
02227
02228 #define ASM_OUTPUT_REG_POP(FILE, REGNO) \
02229 asm_fprintf (FILE, "\tpop\t%s\n", reg_names[REGNO])
02230
02231
02232
02233
02234 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
02235
02236
02237
02238
02239
02240
02241
02242
02243 #define MACHINE_DEPENDENT_REORG(INSNS) c4x_process_after_reload(INSNS)
02244
02245 #define DBR_OUTPUT_SEQEND(FILE) \
02246 if (final_sequence != NULL_RTX) \
02247 { \
02248 int count; \
02249 rtx insn = XVECEXP (final_sequence, 0, 0); \
02250 int laj = GET_CODE (insn) == CALL_INSN \
02251 || (GET_CODE (insn) == INSN \
02252 && GET_CODE (PATTERN (insn)) == TRAP_IF);\
02253 \
02254 count = dbr_sequence_length(); \
02255 while (count < (laj ? 2 : 3)) \
02256 { \
02257 fputs("\tnop\n", FILE); \
02258 count++; \
02259 } \
02260 if (laj) \
02261 fputs("\tpush\tr11\n", FILE); \
02262 }
02263
02264 #define NO_FUNCTION_CSE
02265
02266
02267
02268 #define ASM_OUTPUT_ASM(FILE, STRING) fprintf (FILE, "%s\n", STRING)
02269
02270
02271
02272 #define PREDICATE_CODES \
02273 {"fp_zero_operand", {CONST_DOUBLE}}, \
02274 {"const_operand", {CONST_INT, CONST_DOUBLE}}, \
02275 {"stik_const_operand", {CONST_INT}}, \
02276 {"not_const_operand", {CONST_INT}}, \
02277 {"reg_operand", {REG, SUBREG}}, \
02278 {"reg_or_const_operand", {REG, SUBREG, CONST_INT, CONST_DOUBLE}},\
02279 {"r0r1_reg_operand", {REG, SUBREG}}, \
02280 {"r2r3_reg_operand", {REG, SUBREG}}, \
02281 {"ext_low_reg_operand", {REG, SUBREG}}, \
02282 {"ext_reg_operand", {REG, SUBREG}}, \
02283 {"std_reg_operand", {REG, SUBREG}}, \
02284 {"std_or_reg_operand", {REG, SUBREG}}, \
02285 {"addr_reg_operand", {REG, SUBREG}}, \
02286 {"index_reg_operand", {REG, SUBREG}}, \
02287 {"dp_reg_operand", {REG}}, \
02288 {"sp_reg_operand", {REG}}, \
02289 {"st_reg_operand", {REG}}, \
02290 {"rc_reg_operand", {REG}}, \
02291 {"call_address_operand", {REG, SYMBOL_REF, LABEL_REF, CONST}}, \
02292 {"dst_operand", {SUBREG, REG, MEM}}, \
02293 {"src_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
02294 {"src_hi_operand", {SUBREG, REG, MEM, CONST_DOUBLE}}, \
02295 {"lsrc_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
02296 {"tsrc_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
02297 {"any_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
02298 {"par_ind_operand", {MEM}}, \
02299 {"parallel_operand", {SUBREG, REG, MEM}}, \
02300 {"symbolic_address_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
02301 {"mem_operand", {MEM}},
02302
02303
02304
02305
02306 enum c4x_builtins
02307 {
02308
02309 C4X_BUILTIN_FIX,
02310 C4X_BUILTIN_FIX_ANSI,
02311 C4X_BUILTIN_MPYI,
02312 C4X_BUILTIN_TOIEEE,
02313 C4X_BUILTIN_FRIEEE,
02314 C4X_BUILTIN_RCPF
02315 };