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 #ifndef GCC_H8300_H
00026 #define GCC_H8300_H
00027
00028
00029
00030 #if 0
00031 enum attr_cpu { CPU_H8300, CPU_H8300H };
00032 #endif
00033 extern int cpu_type;
00034
00035
00036
00037 extern const char *h8_push_op, *h8_pop_op, *h8_mov_op;
00038 extern const char * const *h8_reg_names;
00039
00040
00041
00042 #define CPP_PREDEFINES \
00043 "-D__LONG_MAX__=2147483647L -D__LONG_LONG_MAX__=2147483647L"
00044
00045 #define CPP_SPEC \
00046 "%{!mh:%{!ms:-D__H8300__}} %{mh:-D__H8300H__} %{ms:-D__H8300S__} \
00047 %{!mh:%{!ms:-D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int}} \
00048 %{mh:-D__SIZE_TYPE__=unsigned\\ long -D__PTRDIFF_TYPE__=long} \
00049 %{ms:-D__SIZE_TYPE__=unsigned\\ long -D__PTRDIFF_TYPE__=long} \
00050 %{!mh:%{!ms:-Acpu=h8300 -Amachine=h8300}} \
00051 %{mh:-Acpu=h8300h -Amachine=h8300h} \
00052 %{ms:-Acpu=h8300s -Amachine=h8300s} \
00053 %{!mint32:-D__INT_MAX__=32767} %{mint32:-D__INT_MAX__=2147483647} \
00054 %(subtarget_cpp_spec)"
00055
00056 #define SUBTARGET_CPP_SPEC ""
00057
00058 #define LINK_SPEC "%{mh:-m h8300h} %{ms:-m h8300s}"
00059
00060 #define LIB_SPEC "%{mrelax:-relax} %{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
00061
00062 #define EXTRA_SPECS \
00063 { "subtarget_cpp_spec", SUBTARGET_CPP_SPEC }, \
00064 SUBTARGET_EXTRA_SPECS
00065
00066 #define SUBTARGET_EXTRA_SPECS
00067
00068
00069
00070 #define TARGET_VERSION fprintf (stderr, " (Hitachi H8/300)");
00071
00072
00073
00074 extern int target_flags;
00075
00076
00077
00078
00079 #define TARGET_INT32 (target_flags & 8)
00080
00081
00082
00083 #define TARGET_ADDRESSES (target_flags & 64)
00084
00085
00086 #define TARGET_QUICKCALL (target_flags & 128)
00087
00088
00089 #define TARGET_SLOWBYTE (target_flags & 256)
00090
00091
00092
00093 #define TARGET_RTL_DUMP (target_flags & 2048)
00094
00095
00096 #define TARGET_H8300 (! TARGET_H8300H && ! TARGET_H8300S)
00097 #define TARGET_H8300H (target_flags & 4096)
00098 #define TARGET_H8300S (target_flags & 1)
00099
00100
00101 #define TARGET_MAC (target_flags & 2)
00102
00103
00104
00105
00106
00107
00108 #define TARGET_ALIGN_300 (target_flags & 8192)
00109
00110
00111
00112
00113
00114
00115
00116 #define TARGET_SWITCHES \
00117 { {"s", 1, N_("Generate H8/S code")}, \
00118 {"no-s", -1, N_("Do not generate H8/S code")}, \
00119 {"s2600", 2, N_("Generate H8/S2600 code")}, \
00120 {"no-s2600", -2, N_("Do not generate H8/S2600 code")}, \
00121 {"int32", 8, N_("Make integers 32 bits wide")}, \
00122 {"addresses", 64, NULL}, \
00123 {"quickcall", 128, \
00124 N_("Use registers for argument passing")}, \
00125 {"no-quickcall", -128, \
00126 N_("Do not use registers for argument passing")}, \
00127 {"slowbyte", 256, \
00128 N_("Consider access to byte sized memory slow")}, \
00129 {"relax", 1024, N_("Enable linker relaxing")}, \
00130 {"rtl-dump", 2048, NULL}, \
00131 {"h", 4096, N_("Generate H8/300H code")}, \
00132 {"no-h", -4096, N_("Do not generate H8/300H code")}, \
00133 {"align-300", 8192, N_("Use H8/300 alignment rules")}, \
00134 { "", TARGET_DEFAULT, NULL}}
00135
00136 #ifdef IN_LIBGCC2
00137 #undef TARGET_H8300H
00138 #undef TARGET_H8300S
00139
00140
00141 #ifdef __H8300H__
00142 #define TARGET_H8300H 1
00143 #else
00144 #define TARGET_H8300H 0
00145 #endif
00146 #ifdef __H8300S__
00147 #define TARGET_H8300S 1
00148 #else
00149 #define TARGET_H8300S 0
00150 #endif
00151 #endif
00152
00153
00154
00155 #define OVERRIDE_OPTIONS \
00156 do \
00157 { \
00158 h8300_init_once (); \
00159 } \
00160 while (0)
00161
00162
00163
00164 #ifndef TARGET_DEFAULT
00165 #define TARGET_DEFAULT (128)
00166 #endif
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 #define NO_FUNCTION_CSE
00180
00181
00182
00183
00184
00185 #define REAL_ARITHMETIC
00186
00187
00188
00189
00190 #define BITS_BIG_ENDIAN 0
00191
00192
00193
00194 #define BYTES_BIG_ENDIAN 1
00195
00196
00197
00198
00199
00200 #define WORDS_BIG_ENDIAN 1
00201
00202
00203 #define BITS_PER_UNIT 8
00204
00205
00206
00207
00208
00209 #define BITS_PER_WORD (TARGET_H8300H || TARGET_H8300S ? 32 : 16)
00210 #define MAX_BITS_PER_WORD 32
00211
00212
00213 #define UNITS_PER_WORD (TARGET_H8300H || TARGET_H8300S ? 4 : 2)
00214 #define MIN_UNITS_PER_WORD 2
00215
00216
00217
00218 #define POINTER_SIZE (TARGET_H8300H || TARGET_H8300S ? 32 : 16)
00219
00220 #define SHORT_TYPE_SIZE 16
00221 #define INT_TYPE_SIZE (TARGET_INT32 ? 32 : 16)
00222 #define LONG_TYPE_SIZE 32
00223 #define LONG_LONG_TYPE_SIZE 32
00224 #define FLOAT_TYPE_SIZE 32
00225 #define DOUBLE_TYPE_SIZE 32
00226 #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE
00227
00228 #define MAX_FIXED_MODE_SIZE 32
00229
00230
00231 #define PARM_BOUNDARY (TARGET_H8300H || TARGET_H8300S ? 32 : 16)
00232
00233
00234 #define FUNCTION_BOUNDARY 16
00235
00236
00237
00238
00239
00240 #define EMPTY_FIELD_BOUNDARY 16
00241
00242
00243 #define PCC_BITFIELD_TYPE_MATTERS 0
00244
00245
00246
00247 #define BIGGEST_ALIGNMENT \
00248 (((TARGET_H8300H || TARGET_H8300S) && ! TARGET_ALIGN_300) ? 32 : 16)
00249
00250
00251 #define STACK_BOUNDARY (TARGET_H8300 ? 16 : 32)
00252
00253
00254
00255
00256
00257 #define STRICT_ALIGNMENT 1
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 #define FIRST_PSEUDO_REGISTER 11
00274
00275
00276
00277
00278 #define FIXED_REGISTERS \
00279 { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1}
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 #define CALL_USED_REGISTERS \
00292 { 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1 }
00293
00294 #define REG_ALLOC_ORDER \
00295 { 2, 3, 0, 1, 4, 5, 6, 8, 7, 9, 10}
00296
00297 #define CONDITIONAL_REGISTER_USAGE \
00298 { \
00299 if (!TARGET_MAC) \
00300 fixed_regs[MAC_REG] = call_used_regs[MAC_REG] = 1; \
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 #define HARD_REGNO_NREGS(REGNO, MODE) \
00313 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00314
00315
00316
00317
00318
00319
00320
00321
00322 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
00323 (TARGET_H8300 \
00324 ? ((((REGNO) & 1) == 0) || ((MODE) == HImode) || ((MODE) == QImode)) \
00325 : (REGNO) == MAC_REG ? (MODE) == SImode : 1)
00326
00327
00328
00329
00330
00331 #define MODES_TIEABLE_P(MODE1, MODE2) \
00332 ((MODE1) == (MODE2) \
00333 || (((MODE1) == QImode || (MODE1) == HImode \
00334 || ((TARGET_H8300H || TARGET_H8300S) && (MODE1) == SImode)) \
00335 && ((MODE2) == QImode || (MODE2) == HImode \
00336 || ((TARGET_H8300H || TARGET_H8300S) && (MODE2) == SImode))))
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 #define STACK_POINTER_REGNUM SP_REG
00347
00348
00349 #define FRAME_POINTER_REGNUM FP_REG
00350
00351
00352
00353
00354
00355 #define FRAME_POINTER_REQUIRED 0
00356
00357
00358 #define ARG_POINTER_REGNUM AP_REG
00359
00360
00361 #define STATIC_CHAIN_REGNUM SC_REG
00362
00363
00364
00365 #define RETURN_ADDRESS_POINTER_REGNUM RAP_REG
00366
00367
00368
00369
00370
00371 #define RETURN_ADDR_RTX(COUNT, FRAME) h8300_return_addr_rtx ((COUNT), (FRAME))
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393 enum reg_class {
00394 NO_REGS, GENERAL_REGS, MAC_REGS, ALL_REGS, LIM_REG_CLASSES
00395 };
00396
00397 #define N_REG_CLASSES (int) LIM_REG_CLASSES
00398
00399
00400
00401 #define REG_CLASS_NAMES \
00402 { "NO_REGS", "GENERAL_REGS", "MAC_REGS", "ALL_REGS", "LIM_REGS" }
00403
00404
00405
00406
00407
00408 #define REG_CLASS_CONTENTS \
00409 { {0}, \
00410 {0x6ff}, \
00411 {0x100}, \
00412 {0x7ff}, \
00413 }
00414
00415
00416
00417
00418
00419
00420 #define REGNO_REG_CLASS(REGNO) (REGNO != MAC_REG ? GENERAL_REGS : MAC_REGS)
00421
00422
00423
00424 #define INDEX_REG_CLASS NO_REGS
00425 #define BASE_REG_CLASS GENERAL_REGS
00426
00427
00428
00429
00430
00431 #define REG_CLASS_FROM_LETTER(C) ((C) == 'a' ? MAC_REGS : NO_REGS)
00432
00433
00434
00435
00436
00437
00438
00439 #define CONST_OK_FOR_I(VALUE) ((VALUE) == 0)
00440 #define CONST_OK_FOR_J(VALUE) ((unsigned HOST_WIDE_INT) (VALUE) < 256)
00441 #define CONST_OK_FOR_K(VALUE) ((VALUE) == 1 || (VALUE) == 2)
00442 #define CONST_OK_FOR_L(VALUE) \
00443 (TARGET_H8300H || TARGET_H8300S \
00444 ? (VALUE) == 1 || (VALUE) == 2 || (VALUE) == 4 \
00445 : (VALUE) == 1 || (VALUE) == 2)
00446 #define CONST_OK_FOR_M(VALUE) ((VALUE) == 3 || (VALUE) == 4)
00447 #define CONST_OK_FOR_N(VALUE) \
00448 (TARGET_H8300H || TARGET_H8300S \
00449 ? (VALUE) == -1 || (VALUE) == -2 || (VALUE) == -4 \
00450 : (VALUE) == -1 || (VALUE) == -2)
00451 #define CONST_OK_FOR_O(VALUE) (ok_for_bclr (VALUE))
00452 #define CONST_OK_FOR_P(VALUE) (small_power_of_two (VALUE))
00453
00454 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
00455 ((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \
00456 (C) == 'J' ? CONST_OK_FOR_J (VALUE) : \
00457 (C) == 'K' ? CONST_OK_FOR_K (VALUE) : \
00458 (C) == 'L' ? CONST_OK_FOR_L (VALUE) : \
00459 (C) == 'M' ? CONST_OK_FOR_M (VALUE) : \
00460 (C) == 'N' ? CONST_OK_FOR_N (VALUE) : \
00461 (C) == 'O' ? CONST_OK_FOR_O (VALUE) : \
00462 (C) == 'P' ? CONST_OK_FOR_P (VALUE) : \
00463 0)
00464
00465
00466
00467
00468
00469
00470 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
00471 ((C) == 'G' ? (VALUE) == CONST0_RTX (DFmode) \
00472 : 0)
00473
00474
00475
00476
00477
00478
00479 #define PREFERRED_RELOAD_CLASS(X, CLASS) (CLASS)
00480
00481
00482
00483
00484
00485
00486 #define CLASS_MAX_NREGS(CLASS, MODE) \
00487 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
00488
00489
00490
00491
00492
00493 #define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
00494 (CLASS1 == MAC_REGS || CLASS2 == MAC_REGS ? 6 : 3)
00495
00496
00497
00498
00499
00500
00501 #define STACK_GROWS_DOWNWARD
00502
00503
00504
00505
00506
00507
00508 #define FRAME_GROWS_DOWNWARD
00509
00510
00511
00512
00513
00514
00515 #define STARTING_FRAME_OFFSET 0
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 #define PUSH_ROUNDING(BYTES) \
00528 (((BYTES) + PARM_BOUNDARY / 8 - 1) & -PARM_BOUNDARY / 8)
00529
00530
00531
00532
00533
00534 #define FIRST_PARM_OFFSET(FNDECL) 0
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559 #define ELIMINABLE_REGS \
00560 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
00561 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
00562 { RETURN_ADDRESS_POINTER_REGNUM, STACK_POINTER_REGNUM},\
00563 { RETURN_ADDRESS_POINTER_REGNUM, FRAME_POINTER_REGNUM},\
00564 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574 #define CAN_ELIMINATE(FROM, TO) \
00575 ((((FROM) == ARG_POINTER_REGNUM || (FROM) == RETURN_ADDRESS_POINTER_REGNUM) \
00576 && (TO) == STACK_POINTER_REGNUM) \
00577 ? ! frame_pointer_needed \
00578 : 1)
00579
00580
00581
00582
00583 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
00584 OFFSET = initial_offset (FROM, TO)
00585
00586
00587
00588
00589
00590
00591
00592
00593 #define FUNCTION_VALUE(VALTYPE, FUNC) \
00594 gen_rtx_REG (TYPE_MODE (VALTYPE), 0)
00595
00596
00597
00598
00599
00600
00601 #define LIBCALL_VALUE(MODE) \
00602 gen_rtx_REG (MODE, 0)
00603
00604
00605
00606
00607 #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617 #define FUNCTION_ARG_REGNO_P(N) (TARGET_QUICKCALL ? N < 3 : 0)
00618
00619
00620
00621
00622 #define STRUCT_VALUE 0
00623
00624
00625 #define RETURN_IN_MEMORY(X) \
00626 (TYPE_MODE (X) == BLKmode || GET_MODE_SIZE (TYPE_MODE (X)) > 4)
00627
00628
00629
00630
00631
00632 #define SMALL_REGISTER_CLASSES 1
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 #define CUMULATIVE_ARGS struct cum_arg
00645 struct cum_arg
00646 {
00647 int nbytes;
00648 struct rtx_def *libcall;
00649 };
00650
00651
00652
00653
00654
00655
00656
00657 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \
00658 ((CUM).nbytes = 0, (CUM).libcall = LIBNAME)
00659
00660
00661
00662
00663
00664 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
00665 ((CUM).nbytes += ((MODE) != BLKmode \
00666 ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD \
00667 : (int_size_in_bytes (TYPE) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD))
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
00687 function_arg (&CUM, MODE, TYPE, NAMED)
00688
00689
00690
00691
00692 #define FUNCTION_PROFILER(FILE, LABELNO) \
00693 fprintf (FILE, "\t%s\t#LP%d,%s\n\tjsr @mcount\n", \
00694 h8_mov_op, (LABELNO), h8_reg_names[0]);
00695
00696
00697
00698
00699
00700
00701 #define EXIT_IGNORE_STACK 0
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719 #define TRAMPOLINE_TEMPLATE(FILE) \
00720 do \
00721 { \
00722 if (TARGET_H8300) \
00723 { \
00724 fprintf (FILE, "\tmov.w #0x1234,r3\n"); \
00725 fprintf (FILE, "\tjmp @0x1234\n"); \
00726 } \
00727 else \
00728 { \
00729 fprintf (FILE, "\tmov.l #0x12345678,er3\n"); \
00730 fprintf (FILE, "\tjmp @0x123456\n"); \
00731 } \
00732 } \
00733 while (0)
00734
00735
00736
00737 #define TRAMPOLINE_SIZE (TARGET_H8300 ? 8 : 12)
00738
00739
00740
00741
00742
00743 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
00744 { \
00745 emit_move_insn (gen_rtx_MEM (Pmode, plus_constant ((TRAMP), 2)), CXT); \
00746 emit_move_insn (gen_rtx_MEM (Pmode, plus_constant ((TRAMP), 6)), FNADDR); \
00747 if (TARGET_H8300H || TARGET_H8300S) \
00748 emit_move_insn (gen_rtx_MEM (QImode, plus_constant ((TRAMP), 6)), \
00749 GEN_INT (0x5A)); \
00750 }
00751
00752
00753
00754 #define HAVE_POST_INCREMENT 1
00755 #define HAVE_PRE_DECREMENT 1
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 #define REGNO_OK_FOR_INDEX_P(regno) 0
00766
00767 #define REGNO_OK_FOR_BASE_P(regno) \
00768 (((regno) < FIRST_PSEUDO_REGISTER && regno != 8) || reg_renumber[regno] >= 0)
00769
00770
00771
00772 #define MAX_REGS_PER_ADDRESS 1
00773
00774
00775
00776 #define CONSTANT_ADDRESS_P(X) \
00777 (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
00778 || (GET_CODE (X) == CONST_INT \
00779 \
00780 && INTVAL (X) > (TARGET_H8300 ? -0x10000 : -0x1000000) \
00781 && INTVAL (X) < (TARGET_H8300 ? 0x10000 : 0x1000000)) \
00782 || ((GET_CODE (X) == HIGH || GET_CODE (X) == CONST) \
00783 && TARGET_H8300))
00784
00785
00786
00787
00788 #define LEGITIMATE_CONSTANT_P(X) (GET_CODE (X) != CONST_DOUBLE)
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803 #ifndef REG_OK_STRICT
00804
00805
00806
00807 #define REG_OK_FOR_INDEX_P(X) 0
00808
00809
00810
00811 #define REG_OK_FOR_BASE_P(X) \
00812 (REGNO (X) >= FIRST_PSEUDO_REGISTER || REGNO (X) != 8)
00813 #define REG_OK_FOR_INDEX_P_STRICT(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
00814 #define REG_OK_FOR_BASE_P_STRICT(X) REGNO_OK_FOR_BASE_P (REGNO (X))
00815 #define STRICT 0
00816
00817 #else
00818
00819
00820 #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
00821
00822 #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
00823 #define STRICT 1
00824
00825 #endif
00826
00827
00828
00829
00830
00831
00832 #define EIGHTBIT_CONSTANT_ADDRESS_P(X) \
00833 (GET_CODE (X) == CONST_INT && TARGET_H8300H \
00834 && 0xffff00 <= INTVAL (X) && INTVAL (X) <= 0xffffff)
00835
00836
00837
00838
00839
00840
00841 #define OK_FOR_U(OP) \
00842 ((GET_CODE (OP) == REG && REG_OK_FOR_BASE_P (OP)) \
00843 || (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
00844 && REG_OK_FOR_BASE_P (XEXP (OP, 0))) \
00845 || (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == SYMBOL_REF \
00846 && (TARGET_H8300S || SYMBOL_REF_FLAG (XEXP (OP, 0)))) \
00847 || ((GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == CONST \
00848 && GET_CODE (XEXP (XEXP (OP, 0), 0)) == PLUS \
00849 && GET_CODE (XEXP (XEXP (XEXP (OP, 0), 0), 0)) == SYMBOL_REF \
00850 && GET_CODE (XEXP (XEXP (XEXP (OP, 0), 0), 1)) == CONST_INT) \
00851 && (TARGET_H8300S || SYMBOL_REF_FLAG (XEXP (XEXP (OP, 0), 0)))) \
00852 || (GET_CODE (OP) == MEM \
00853 && EIGHTBIT_CONSTANT_ADDRESS_P (XEXP (OP, 0))) \
00854 || (GET_CODE (OP) == MEM && TARGET_H8300S \
00855 && GET_CODE (XEXP (OP, 0)) == CONST_INT))
00856
00857 #define EXTRA_CONSTRAINT(OP, C) \
00858 ((C) == 'U' ? OK_FOR_U (OP) : \
00859 0)
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875 #define RTX_OK_FOR_BASE_P(X) \
00876 ((REG_P (X) && REG_OK_FOR_BASE_P (X)) \
00877 || (GET_CODE (X) == SUBREG && REG_P (SUBREG_REG (X)) \
00878 && REG_OK_FOR_BASE_P (SUBREG_REG (X))))
00879
00880 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
00881 if (RTX_OK_FOR_BASE_P (X)) goto ADDR; \
00882 if (CONSTANT_ADDRESS_P (X)) goto ADDR; \
00883 if (GET_CODE (X) == PLUS \
00884 && CONSTANT_ADDRESS_P (XEXP (X, 1)) \
00885 && RTX_OK_FOR_BASE_P (XEXP (X, 0))) goto ADDR;
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) {}
00903
00904
00905
00906
00907
00908
00909
00910 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
00911 if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC) goto LABEL;
00912
00913
00914
00915 #define CASE_VECTOR_MODE Pmode
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 #define DEFAULT_SIGNED_CHAR 0
00928
00929
00930
00931 #define FIXUNS_TRUNC_LIKE_FIX_TRUNC
00932
00933
00934
00935 #define MOVE_MAX (TARGET_H8300H || TARGET_H8300S ? 4 : 2)
00936 #define MAX_MOVE_MAX 4
00937
00938
00939 #define SLOW_BYTE_ACCESS TARGET_SLOWBYTE
00940
00941
00942
00943
00944
00945
00946
00947
00948 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
00949
00950
00951
00952
00953 #define Pmode (TARGET_H8300H || TARGET_H8300S ? SImode : HImode)
00954
00955
00956
00957
00958 #define NO_BUILTIN_SIZE_TYPE
00959 #define NO_BUILTIN_PTRDIFF_TYPE
00960 #define SIZE_TYPE (TARGET_H8300 ? "unsigned int" : "long unsigned int")
00961 #define PTRDIFF_TYPE (TARGET_H8300 ? "int" : "long int")
00962
00963 #define WCHAR_TYPE "short unsigned int"
00964 #define WCHAR_TYPE_SIZE 16
00965 #define MAX_WCHAR_TYPE_SIZE 16
00966
00967
00968
00969
00970 #define FUNCTION_MODE QImode
00971
00972 #define ADJUST_INSN_LENGTH(INSN, LENGTH) \
00973 LENGTH += h8300_adjust_insn_length (INSN, LENGTH);
00974
00975
00976
00977
00978
00979
00980 #define DEFAULT_RTX_COSTS(RTX, CODE, OUTER_CODE) \
00981 return (const_costs (RTX, CODE, OUTER_CODE));
00982
00983 #define BRANCH_COST 0
00984
00985
00986
00987
00988
00989
00990
00991
00992 #define RTX_COSTS(RTX, CODE, OUTER_CODE) \
00993 case MOD: \
00994 case DIV: \
00995 return 60; \
00996 case MULT: \
00997 return 20; \
00998 case ASHIFT: \
00999 case ASHIFTRT: \
01000 case LSHIFTRT: \
01001 case ROTATE: \
01002 case ROTATERT: \
01003 if (GET_MODE (RTX) == HImode) return 2; \
01004 return 8;
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016 #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc (EXP, INSN)
01017
01018
01019 #define CC_OVERFLOW_UNUSABLE 01000
01020
01021
01022
01023
01024
01025 #define CC_NO_CARRY CC_NO_OVERFLOW
01026
01027
01028
01029
01030
01031 #define ASM_FILE_START(FILE) asm_file_start (FILE)
01032
01033 #define ASM_FILE_END(FILE) asm_file_end (FILE)
01034
01035
01036
01037
01038 #define ASM_APP_ON "; #APP\n"
01039
01040
01041
01042
01043 #define ASM_APP_OFF "; #NO_APP\n"
01044
01045 #define FILE_ASM_OP "\t.file\n"
01046 #define IDENT_ASM_OP "\t.ident\n"
01047
01048
01049 #define ASM_WORD_OP (TARGET_H8300 ? "\t.word\t" : "\t.long\t")
01050
01051
01052
01053
01054
01055
01056
01057
01058 #define READONLY_DATA_SECTION readonly_data
01059
01060 #define TEXT_SECTION_ASM_OP "\t.section .text"
01061 #define DATA_SECTION_ASM_OP "\t.section .data"
01062 #define BSS_SECTION_ASM_OP "\t.section .bss"
01063 #define INIT_SECTION_ASM_OP "\t.section .init"
01064 #define READONLY_DATA_SECTION_ASM_OP "\t.section .rodata"
01065
01066 #define EXTRA_SECTIONS in_readonly_data
01067
01068 #define EXTRA_SECTION_FUNCTIONS \
01069 extern void readonly_data PARAMS ((void)); \
01070 void \
01071 readonly_data () \
01072 { \
01073 if (in_section != in_readonly_data) \
01074 { \
01075 fprintf (asm_out_file, "%s\n", READONLY_DATA_SECTION_ASM_OP); \
01076 in_section = in_readonly_data; \
01077 } \
01078 }
01079
01080 #undef DO_GLOBAL_CTORS_BODY
01081 #define DO_GLOBAL_CTORS_BODY \
01082 { \
01083 typedef (*pfunc)(); \
01084 extern pfunc __ctors[]; \
01085 extern pfunc __ctors_end[]; \
01086 pfunc *p; \
01087 for (p = __ctors_end; p > __ctors; ) \
01088 { \
01089 (*--p)(); \
01090 } \
01091 }
01092
01093 #undef DO_GLOBAL_DTORS_BODY
01094 #define DO_GLOBAL_DTORS_BODY \
01095 { \
01096 typedef (*pfunc)(); \
01097 extern pfunc __dtors[]; \
01098 extern pfunc __dtors_end[]; \
01099 pfunc *p; \
01100 for (p = __dtors; p < __dtors_end; p++) \
01101 { \
01102 (*p)(); \
01103 } \
01104 }
01105
01106 #define TINY_DATA_NAME_P(NAME) (*(NAME) == '&')
01107
01108
01109
01110
01111 #define ENCODE_SECTION_INFO(DECL) \
01112 if (TREE_CODE (DECL) == FUNCTION_DECL \
01113 && h8300_funcvec_function_p (DECL)) \
01114 SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
01115 else if (TREE_CODE (DECL) == VAR_DECL \
01116 && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \
01117 && h8300_eightbit_data_p (DECL)) \
01118 SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
01119 else if (TREE_CODE (DECL) == VAR_DECL \
01120 && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \
01121 && h8300_tiny_data_p (DECL)) \
01122 h8300_encode_label (DECL);
01123
01124
01125
01126 #define STRIP_NAME_ENCODING(VAR, SYMBOL_NAME) \
01127 (VAR) = (SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*' \
01128 || (SYMBOL_NAME)[0] == '@' \
01129 || (SYMBOL_NAME)[0] == '&');
01130
01131
01132
01133
01134 #define REGISTER_NAMES \
01135 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "sp", "mac", "ap", "rap" }
01136
01137 #define ADDITIONAL_REGISTER_NAMES \
01138 { {"er0", 0}, {"er1", 1}, {"er2", 2}, {"er3", 3}, {"er4", 4}, \
01139 {"er5", 5}, {"er6", 6}, {"er7", 7}, {"r7", 7} }
01140
01141 #define SDB_DEBUGGING_INFO
01142 #define SDB_DELIM "\n"
01143
01144
01145
01146 #include "dbxcoff.h"
01147
01148
01149
01150
01151
01152
01153 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
01154 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
01155 fprintf (FILE, \
01156 "\t.text\n.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO)
01157
01158
01159 #define TARGET_ASM_NAMED_SECTION h8300_asm_named_section
01160
01161
01162
01163
01164 #define ASM_OUTPUT_LABEL(FILE, NAME) \
01165 do \
01166 { \
01167 assemble_name (FILE, NAME); \
01168 fputs (":\n", FILE); \
01169 } \
01170 while (0)
01171
01172 #define ASM_OUTPUT_LABELREF(FILE, NAME) \
01173 asm_fprintf ((FILE), "%U%s", (NAME) + (TINY_DATA_NAME_P (NAME) ? 1 : 0))
01174
01175 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)
01176
01177
01178
01179
01180 #define ASM_GLOBALIZE_LABEL(FILE, NAME) \
01181 do \
01182 { \
01183 fputs ("\t.global ", FILE); \
01184 assemble_name (FILE, NAME); \
01185 fputs ("\n", FILE); \
01186 } \
01187 while (0)
01188
01189 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
01190 ASM_OUTPUT_LABEL (FILE, NAME)
01191
01192
01193
01194 #define USER_LABEL_PREFIX "_"
01195
01196
01197
01198
01199
01200
01201
01202 #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
01203 fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
01204
01205
01206
01207
01208
01209
01210 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
01211 sprintf (LABEL, "*.%s%d", PREFIX, NUM)
01212
01213
01214
01215
01216 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \
01217 fprintf (FILE, "\t%s\t%s\n", h8_push_op, h8_reg_names[REGNO])
01218
01219
01220
01221
01222 #define ASM_OUTPUT_REG_POP(FILE, REGNO) \
01223 fprintf (FILE, "\t%s\t%s\n", h8_pop_op, h8_reg_names[REGNO])
01224
01225
01226
01227 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
01228 asm_fprintf (FILE, "%s.L%d\n", ASM_WORD_OP, VALUE)
01229
01230
01231
01232 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
01233 fprintf (FILE, "%s.L%d-.L%d\n", ASM_WORD_OP, VALUE, REL)
01234
01235
01236
01237
01238
01239 #define ASM_OUTPUT_ALIGN(FILE, LOG) \
01240 if ((LOG) != 0) \
01241 fprintf (FILE, "\t.align %d\n", (LOG))
01242
01243
01244
01245
01246 #define ASM_OUTPUT_IDENT(FILE, NAME) \
01247 fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME)
01248
01249 #define ASM_OUTPUT_SKIP(FILE, SIZE) \
01250 fprintf (FILE, "\t.space %d\n", (SIZE))
01251
01252
01253
01254
01255 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
01256 ( fputs ("\t.comm ", (FILE)), \
01257 assemble_name ((FILE), (NAME)), \
01258 fprintf ((FILE), ",%d\n", (SIZE)))
01259
01260
01261
01262
01263
01264 #define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED) \
01265 asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED))
01266
01267
01268
01269
01270 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
01271 ( fputs ("\t.lcomm ", (FILE)), \
01272 assemble_name ((FILE), (NAME)), \
01273 fprintf ((FILE), ",%d\n", (SIZE)))
01274
01275
01276
01277
01278
01279 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
01280 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
01281 sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
01282
01283
01284
01285
01286 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
01287 ((CODE) == '#')
01288
01289 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
01290
01291
01292
01293
01294 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
01295
01296
01297 #define REGISTER_TARGET_PRAGMAS(PFILE) \
01298 do \
01299 { \
01300 cpp_register_pragma (PFILE, 0, "saveall", h8300_pr_saveall); \
01301 cpp_register_pragma (PFILE, 0, "interrupt", h8300_pr_interrupt); \
01302 } \
01303 while (0)
01304
01305 #define FINAL_PRESCAN_INSN(insn, operand, nop) \
01306 final_prescan_insn (insn, operand, nop)
01307
01308
01309
01310
01311
01312 #define TARGET_MEM_FUNCTIONS 1
01313
01314 #define MULHI3_LIBCALL "__mulhi3"
01315 #define DIVHI3_LIBCALL "__divhi3"
01316 #define UDIVHI3_LIBCALL "__udivhi3"
01317 #define MODHI3_LIBCALL "__modhi3"
01318 #define UMODHI3_LIBCALL "__umodhi3"
01319
01320
01321
01322 #define INIT_TARGET_OPTABS \
01323 do \
01324 { \
01325 smul_optab->handlers[(int) HImode].libfunc \
01326 = init_one_libfunc (MULHI3_LIBCALL); \
01327 sdiv_optab->handlers[(int) HImode].libfunc \
01328 = init_one_libfunc (DIVHI3_LIBCALL); \
01329 udiv_optab->handlers[(int) HImode].libfunc \
01330 = init_one_libfunc (UDIVHI3_LIBCALL); \
01331 smod_optab->handlers[(int) HImode].libfunc \
01332 = init_one_libfunc (MODHI3_LIBCALL); \
01333 umod_optab->handlers[(int) HImode].libfunc \
01334 = init_one_libfunc (UMODHI3_LIBCALL); \
01335 } \
01336 while (0)
01337
01338 #define MOVE_RATIO 3
01339
01340 #endif