00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #if !defined(DBX_DEBUGGING_INFO) && !defined(DWARF_DEBUGGING_INFO)
00066 #include "svr3.h"
00067 #endif
00068
00069
00070
00071
00072 enum m88k_instruction {
00073 m88k_zero,
00074 m88k_or,
00075 m88k_subu,
00076 m88k_or_lo16,
00077 m88k_or_lo8,
00078 m88k_set,
00079 m88k_oru_hi16,
00080 m88k_oru_or
00081 };
00082
00083
00084
00085
00086 enum processor_type {
00087 PROCESSOR_M88100,
00088 PROCESSOR_M88110,
00089 PROCESSOR_M88000
00090 };
00091
00092
00093 #define m88k_cpu_attr ((enum attr_cpu)m88k_cpu)
00094
00095
00096
00097 extern const char *m88k_pound_sign;
00098 extern const char *m88k_short_data;
00099 extern const char *m88k_version;
00100 extern char m88k_volatile_code;
00101
00102 extern unsigned m88k_gp_threshold;
00103 extern int m88k_prologue_done;
00104 extern int m88k_function_number;
00105 extern int m88k_fp_offset;
00106 extern int m88k_stack_size;
00107 extern int m88k_case_index;
00108
00109 extern struct rtx_def *m88k_compare_reg;
00110 extern struct rtx_def *m88k_compare_op0;
00111 extern struct rtx_def *m88k_compare_op1;
00112
00113 extern enum processor_type m88k_cpu;
00114
00115
00116
00117 extern int target_flags;
00118 extern int frame_pointer_needed;
00119 extern int flag_delayed_branch;
00120 extern int flag_pic;
00121
00122
00123
00124
00125
00126
00127 #ifndef MONITOR_GCC
00128 #define MONITOR_GCC 0
00129 #endif
00130
00131
00132
00133 #define CAN_DEBUG_WITHOUT_FP
00134
00135
00136
00137 #undef CPP_SPEC
00138 #define CPP_SPEC "%{!m88000:%{!m88100:%{m88110:-D__m88110__}}} \
00139 %{!m88000:%{!m88110:-D__m88100__}}"
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 #define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -D__CLASSIFY_TYPE__=2"
00152
00153 #define TARGET_VERSION fprintf (stderr, " (%s)", VERSION_INFO1)
00154
00155 #ifndef VERSION_INFO1
00156 #define VERSION_INFO1 "m88k"
00157 #endif
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 #define MASK_88100 0x00000001
00168 #define MASK_88110 0x00000002
00169 #define MASK_88000 (MASK_88100 | MASK_88110)
00170
00171 #define MASK_OCS_DEBUG_INFO 0x00000004
00172 #define MASK_OCS_FRAME_POSITION 0x00000008
00173 #define MASK_SVR4 0x00000010
00174 #define MASK_SVR3 0x00000020
00175 #define MASK_NO_UNDERSCORES 0x00000040
00176 #define MASK_BIG_PIC 0x00000080
00177 #define MASK_TRAP_LARGE_SHIFT 0x00000100
00178 #define MASK_HANDLE_LARGE_SHIFT 0x00000200
00179 #define MASK_CHECK_ZERO_DIV 0x00000400
00180 #define MASK_USE_DIV 0x00000800
00181 #define MASK_IDENTIFY_REVISION 0x00001000
00182 #define MASK_WARN_PASS_STRUCT 0x00002000
00183 #define MASK_OPTIMIZE_ARG_AREA 0x00004000
00184 #define MASK_NO_SERIALIZE_VOLATILE 0x00008000
00185 #define MASK_EITHER_LARGE_SHIFT (MASK_TRAP_LARGE_SHIFT | \
00186 MASK_HANDLE_LARGE_SHIFT)
00187 #define MASK_OMIT_LEAF_FRAME_POINTER 0x00020000
00188
00189
00190 #define TARGET_88100 ((target_flags & MASK_88000) == MASK_88100)
00191 #define TARGET_88110 ((target_flags & MASK_88000) == MASK_88110)
00192 #define TARGET_88000 ((target_flags & MASK_88000) == MASK_88000)
00193
00194 #define TARGET_OCS_DEBUG_INFO (target_flags & MASK_OCS_DEBUG_INFO)
00195 #define TARGET_OCS_FRAME_POSITION (target_flags & MASK_OCS_FRAME_POSITION)
00196 #define TARGET_SVR4 (target_flags & MASK_SVR4)
00197 #define TARGET_SVR3 (target_flags & MASK_SVR3)
00198 #define TARGET_NO_UNDERSCORES (target_flags & MASK_NO_UNDERSCORES)
00199 #define TARGET_BIG_PIC (target_flags & MASK_BIG_PIC)
00200 #define TARGET_TRAP_LARGE_SHIFT (target_flags & MASK_TRAP_LARGE_SHIFT)
00201 #define TARGET_HANDLE_LARGE_SHIFT (target_flags & MASK_HANDLE_LARGE_SHIFT)
00202 #define TARGET_CHECK_ZERO_DIV (target_flags & MASK_CHECK_ZERO_DIV)
00203 #define TARGET_USE_DIV (target_flags & MASK_USE_DIV)
00204 #define TARGET_IDENTIFY_REVISION (target_flags & MASK_IDENTIFY_REVISION)
00205 #define TARGET_WARN_PASS_STRUCT (target_flags & MASK_WARN_PASS_STRUCT)
00206 #define TARGET_OPTIMIZE_ARG_AREA (target_flags & MASK_OPTIMIZE_ARG_AREA)
00207 #define TARGET_SERIALIZE_VOLATILE (!(target_flags & MASK_NO_SERIALIZE_VOLATILE))
00208
00209 #define TARGET_EITHER_LARGE_SHIFT (target_flags & MASK_EITHER_LARGE_SHIFT)
00210 #define TARGET_OMIT_LEAF_FRAME_POINTER (target_flags & MASK_OMIT_LEAF_FRAME_POINTER)
00211
00212
00213 #define TARGET_DEFAULT (MASK_CHECK_ZERO_DIV)
00214 #define CPU_DEFAULT MASK_88100
00215
00216 #define TARGET_SWITCHES \
00217 { \
00218 { "88110", MASK_88110 }, \
00219 { "88100", MASK_88100 }, \
00220 { "88000", MASK_88000 }, \
00221 { "ocs-debug-info", MASK_OCS_DEBUG_INFO }, \
00222 { "no-ocs-debug-info", -MASK_OCS_DEBUG_INFO }, \
00223 { "ocs-frame-position", MASK_OCS_FRAME_POSITION }, \
00224 { "no-ocs-frame-position", -MASK_OCS_FRAME_POSITION }, \
00225 { "svr4", MASK_SVR4 }, \
00226 { "svr3", -MASK_SVR4 }, \
00227 { "no-underscores", MASK_NO_UNDERSCORES }, \
00228 { "big-pic", MASK_BIG_PIC }, \
00229 { "trap-large-shift", MASK_TRAP_LARGE_SHIFT }, \
00230 { "handle-large-shift", MASK_HANDLE_LARGE_SHIFT }, \
00231 { "check-zero-division", MASK_CHECK_ZERO_DIV }, \
00232 { "no-check-zero-division", -MASK_CHECK_ZERO_DIV }, \
00233 { "use-div-instruction", MASK_USE_DIV }, \
00234 { "identify-revision", MASK_IDENTIFY_REVISION }, \
00235 { "warn-passed-structs", MASK_WARN_PASS_STRUCT }, \
00236 { "optimize-arg-area", MASK_OPTIMIZE_ARG_AREA }, \
00237 { "no-optimize-arg-area", -MASK_OPTIMIZE_ARG_AREA }, \
00238 { "no-serialize-volatile", MASK_NO_SERIALIZE_VOLATILE }, \
00239 { "serialize-volatile", -MASK_NO_SERIALIZE_VOLATILE }, \
00240 { "omit-leaf-frame-pointer", MASK_OMIT_LEAF_FRAME_POINTER }, \
00241 { "no-omit-leaf-frame-pointer", -MASK_OMIT_LEAF_FRAME_POINTER }, \
00242 SUBTARGET_SWITCHES \
00243 \
00244 { "", TARGET_DEFAULT }, \
00245 }
00246
00247
00248 #define SUBTARGET_SWITCHES
00249
00250
00251
00252 #define TARGET_OPTIONS { { "short-data-", &m88k_short_data }, \
00253 { "version-", &m88k_version } }
00254
00255
00256
00257 #define OVERRIDE_OPTIONS \
00258 do { \
00259 register int i; \
00260 \
00261 if ((target_flags & MASK_88000) == 0) \
00262 target_flags |= CPU_DEFAULT; \
00263 \
00264 if (TARGET_88110) \
00265 { \
00266 target_flags |= MASK_USE_DIV; \
00267 target_flags &= ~MASK_CHECK_ZERO_DIV; \
00268 } \
00269 \
00270 m88k_cpu = (TARGET_88000 ? PROCESSOR_M88000 \
00271 : (TARGET_88100 ? PROCESSOR_M88100 : PROCESSOR_M88110)); \
00272 \
00273 if (TARGET_BIG_PIC) \
00274 flag_pic = 2; \
00275 \
00276 if ((target_flags & MASK_EITHER_LARGE_SHIFT) == MASK_EITHER_LARGE_SHIFT) \
00277 error ("-mtrap-large-shift and -mhandle-large-shift are incompatible");\
00278 \
00279 if (TARGET_SVR4) \
00280 { \
00281 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \
00282 reg_names[i]--; \
00283 m88k_pound_sign = "#"; \
00284 } \
00285 else \
00286 { \
00287 target_flags |= MASK_SVR3; \
00288 target_flags &= ~MASK_SVR4; \
00289 } \
00290 \
00291 if (m88k_short_data) \
00292 { \
00293 const char *p = m88k_short_data; \
00294 while (*p) \
00295 if (ISDIGIT (*p)) \
00296 p++; \
00297 else \
00298 { \
00299 error ("invalid option `-mshort-data-%s'", m88k_short_data); \
00300 break; \
00301 } \
00302 m88k_gp_threshold = atoi (m88k_short_data); \
00303 if (m88k_gp_threshold > 0x7fffffff) \
00304 error ("-mshort-data-%s is too large ", m88k_short_data); \
00305 if (flag_pic) \
00306 error ("-mshort-data-%s and PIC are incompatible", m88k_short_data); \
00307 } \
00308 if (TARGET_OMIT_LEAF_FRAME_POINTER) \
00309 flag_omit_frame_pointer = 1; \
00310 } while (0)
00311
00312
00313
00314
00315 #define CHAR_TYPE_SIZE 8
00316 #define SHORT_TYPE_SIZE 16
00317 #define INT_TYPE_SIZE 32
00318 #define LONG_TYPE_SIZE 32
00319 #define LONG_LONG_TYPE_SIZE 64
00320 #define FLOAT_TYPE_SIZE 32
00321 #define DOUBLE_TYPE_SIZE 64
00322 #define LONG_DOUBLE_TYPE_SIZE 64
00323
00324
00325
00326
00327 #define BITS_BIG_ENDIAN 1
00328
00329
00330
00331 #define BYTES_BIG_ENDIAN 1
00332
00333
00334
00335
00336
00337 #define WORDS_BIG_ENDIAN 1
00338
00339
00340 #define BITS_PER_UNIT 8
00341
00342
00343
00344
00345
00346 #define BITS_PER_WORD 32
00347
00348
00349 #define UNITS_PER_WORD 4
00350
00351
00352
00353 #define POINTER_SIZE 32
00354
00355
00356 #define PARM_BOUNDARY 32
00357
00358
00359 #define MAX_PARM_BOUNDARY 64
00360
00361
00362 #define STACK_BOUNDARY 128
00363
00364
00365
00366
00367
00368 #define FUNCTION_BOUNDARY (flag_inhibit_size_directive ? 32 : \
00369 (TARGET_88100 && TARGET_SVR4 ? 128 : 64))
00370
00371
00372 #define BIGGEST_ALIGNMENT 64
00373
00374
00375 #define FASTEST_ALIGNMENT (TARGET_88100 ? 32 : 64)
00376
00377
00378 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
00379 ((TREE_CODE (EXP) == STRING_CST \
00380 && (ALIGN) < FASTEST_ALIGNMENT) \
00381 ? FASTEST_ALIGNMENT : (ALIGN))
00382
00383
00384 #define DATA_ALIGNMENT(TYPE, ALIGN) \
00385 (TREE_CODE (TYPE) == ARRAY_TYPE \
00386 && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
00387 && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
00388
00389
00390
00391
00392
00393
00394 #define STRUCTURE_SIZE_BOUNDARY 8
00395
00396
00397
00398 #define STRICT_ALIGNMENT 1
00399
00400
00401 #define PCC_BITFIELD_TYPE_MATTERS 1
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425 #define FIRST_PSEUDO_REGISTER 64
00426 #define FIRST_EXTENDED_REGISTER 32
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552 #define FIXED_REGISTERS \
00553 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00554 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \
00555 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
00556 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}
00557
00558
00559
00560
00561
00562
00563
00564
00565 #define CALL_USED_REGISTERS \
00566 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
00567 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, \
00568 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
00569 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}
00570
00571
00572 #define CONDITIONAL_REGISTER_USAGE \
00573 { \
00574 if (! TARGET_88110) \
00575 { \
00576 register int i; \
00577 for (i = FIRST_EXTENDED_REGISTER; i < FIRST_PSEUDO_REGISTER; i++) \
00578 { \
00579 fixed_regs[i] = 1; \
00580 call_used_regs[i] = 1; \
00581 } \
00582 } \
00583 if (flag_pic) \
00584 { \
00585 \
00586 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00587 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00588 global_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
00589 } \
00590 }
00591
00592
00593 #define XRF_REGNO_P(N) ((N) < FIRST_PSEUDO_REGISTER && (N) >= FIRST_EXTENDED_REGISTER)
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603 #define HARD_REGNO_NREGS(REGNO, MODE) \
00604 (XRF_REGNO_P (REGNO) \
00605 ? 1 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
00617 (XRF_REGNO_P(REGNO) \
00618 ? (TARGET_88110 && GET_MODE_CLASS (MODE) == MODE_FLOAT) \
00619 : (((MODE) != DImode && (MODE) != DFmode && (MODE) != DCmode) \
00620 || ((REGNO) & 1) == 0))
00621
00622
00623
00624
00625
00626 #define MODES_TIEABLE_P(MODE1, MODE2) \
00627 (((MODE1) == DFmode || (MODE1) == DCmode || (MODE1) == DImode \
00628 || (TARGET_88110 && GET_MODE_CLASS (MODE1) == MODE_FLOAT)) \
00629 == ((MODE2) == DFmode || (MODE2) == DCmode || (MODE2) == DImode \
00630 || (TARGET_88110 && GET_MODE_CLASS (MODE2) == MODE_FLOAT)))
00631
00632
00633
00634
00635
00636
00637
00638
00639 #define STACK_POINTER_REGNUM 31
00640
00641
00642 #define FRAME_POINTER_REGNUM 30
00643
00644
00645 #define ARG_POINTER_REGNUM 0
00646
00647
00648 #define TEMP_REGNUM 10
00649
00650
00651 #define STATIC_CHAIN_REGNUM 11
00652
00653
00654
00655 #define STRUCT_VALUE_REGNUM 12
00656
00657
00658
00659 #define PIC_OFFSET_TABLE_REGNUM 25
00660
00661
00662
00663
00664
00665
00666 #define REG_ALLOC_ORDER \
00667 { \
00668 13, 12, 11, 10, 29, 28, 27, 26, \
00669 62, 63, 9, 8, 7, 6, 5, 4, \
00670 3, 2, 1, 53, 52, 51, 50, 49, \
00671 48, 47, 46, 45, 44, 43, 42, 41, \
00672 40, 39, 38, 37, 36, 35, 34, 33, \
00673 25, 24, 23, 22, 21, 20, 19, 18, \
00674 17, 16, 15, 14, 61, 60, 59, 58, \
00675 57, 56, 55, 54, 30, 31, 0, 32}
00676
00677
00678 #define REG_LEAF_ALLOC_ORDER \
00679 { \
00680 9, 8, 7, 6, 13, 12, 11, 10, \
00681 29, 28, 27, 26, 62, 63, 5, 4, \
00682 3, 2, 0, 53, 52, 51, 50, 49, \
00683 48, 47, 46, 45, 44, 43, 42, 41, \
00684 40, 39, 38, 37, 36, 35, 34, 33, \
00685 25, 24, 23, 22, 21, 20, 19, 18, \
00686 17, 16, 15, 14, 61, 60, 59, 58, \
00687 57, 56, 55, 54, 30, 31, 1, 32}
00688
00689
00690
00691 #define ORDER_REGS_FOR_LOCAL_ALLOC \
00692 { \
00693 static const int leaf[] = REG_LEAF_ALLOC_ORDER; \
00694 static const int nonleaf[] = REG_ALLOC_ORDER; \
00695 \
00696 memcpy (reg_alloc_order, regs_ever_live[1] ? nonleaf : leaf, \
00697 FIRST_PSEUDO_REGISTER * sizeof (int)); \
00698 }
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725 enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
00726 XGRF_REGS, ALL_REGS, LIM_REG_CLASSES };
00727
00728 #define N_REG_CLASSES (int) LIM_REG_CLASSES
00729
00730
00731 #define REG_CLASS_NAMES {"NO_REGS", "AP_REG", "XRF_REGS", "GENERAL_REGS", \
00732 "AGRF_REGS", "XGRF_REGS", "ALL_REGS" }
00733
00734
00735
00736
00737 #define REG_CLASS_CONTENTS {{0x00000000, 0x00000000}, \
00738 {0x00000001, 0x00000000}, \
00739 {0x00000000, 0xffffffff}, \
00740 {0xfffffffe, 0x00000000}, \
00741 {0xffffffff, 0x00000000}, \
00742 {0xfffffffe, 0xffffffff}, \
00743 {0xffffffff, 0xffffffff}}
00744
00745
00746
00747
00748
00749 #define REGNO_REG_CLASS(REGNO) \
00750 ((REGNO) ? ((REGNO < 32) ? GENERAL_REGS : XRF_REGS) : AP_REG)
00751
00752
00753 #define BASE_REG_CLASS AGRF_REGS
00754 #define INDEX_REG_CLASS GENERAL_REGS
00755
00756
00757
00758
00759 #define REG_CLASS_FROM_LETTER(C) \
00760 (((C) == 'x') ? XRF_REGS : NO_REGS)
00761
00762
00763
00764
00765
00766
00767
00768 #define REGNO_OK_FOR_BASE_P(REGNO) \
00769 ((REGNO) < FIRST_EXTENDED_REGISTER \
00770 || (unsigned) reg_renumber[REGNO] < FIRST_EXTENDED_REGISTER)
00771 #define REGNO_OK_FOR_INDEX_P(REGNO) \
00772 (((REGNO) && (REGNO) < FIRST_EXTENDED_REGISTER) \
00773 || (unsigned) reg_renumber[REGNO] < FIRST_EXTENDED_REGISTER)
00774
00775
00776
00777
00778
00779
00780 #define PREFERRED_RELOAD_CLASS(X,CLASS) \
00781 (CONSTANT_P(X) && (CLASS == XRF_REGS) ? NO_REGS : (CLASS))
00782
00783
00784
00785
00786 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, IN) \
00787 ((flag_pic \
00788 && GET_CODE (IN) == CONST \
00789 && GET_CODE (XEXP (IN, 0)) == PLUS \
00790 && GET_CODE (XEXP (XEXP (IN, 0), 0)) == CONST_INT \
00791 && ! SMALL_INT (XEXP (XEXP (IN, 0), 1))) ? GENERAL_REGS : NO_REGS)
00792
00793
00794
00795 #define CLASS_MAX_NREGS(CLASS, MODE) \
00796 ((((CLASS) == XRF_REGS) ? 1 \
00797 : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815 #define SMALL_INT(X) (SMALL_INTVAL (INTVAL (X)))
00816 #define SMALL_INTVAL(I) ((unsigned) (I) < 0x10000)
00817 #define ADD_INT(X) (ADD_INTVAL (INTVAL (X)))
00818 #define ADD_INTVAL(I) ((unsigned) (I) + 0xffff < 0x1ffff)
00819 #define POWER_OF_2(I) ((I) && POWER_OF_2_or_0(I))
00820 #define POWER_OF_2_or_0(I) (((I) & ((unsigned)(I) - 1)) == 0)
00821
00822 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
00823 ((C) == 'I' ? SMALL_INTVAL (VALUE) \
00824 : (C) == 'J' ? SMALL_INTVAL (-(VALUE)) \
00825 : (C) == 'K' ? (unsigned)(VALUE) < 32 \
00826 : (C) == 'L' ? ((VALUE) & 0xffff) == 0 \
00827 : (C) == 'M' ? integer_ok_for_set (VALUE) \
00828 : (C) == 'N' ? (VALUE) < 0 \
00829 : (C) == 'O' ? (VALUE) == 0 \
00830 : (C) == 'P' ? (VALUE) >= 0 \
00831 : 0)
00832
00833
00834
00835
00836 #define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
00837 ((C) == 'G' ? (CONST_DOUBLE_HIGH (VALUE) == 0 \
00838 && CONST_DOUBLE_LOW (VALUE) == 0) \
00839 : 0)
00840
00841
00842
00843
00844
00845
00846
00847 #define EXTRA_CONSTRAINT(OP, C) \
00848 ((C) == 'Q' ? symbolic_address_p (OP) : 0)
00849
00850
00851
00852
00853
00854 #define STACK_GROWS_DOWNWARD
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864 #define STARTING_FRAME_OFFSET 8
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875 #define ACCUMULATE_OUTGOING_ARGS 1
00876
00877
00878
00879
00880
00881
00882
00883
00884 #define FIRST_PARM_OFFSET(FNDECL) 0
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896 #define REG_PARM_STACK_SPACE(FNDECL) 32
00897
00898
00899
00900
00901
00902
00903
00904 #define STACK_PARMS_IN_REG_PARM_AREA
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
00928
00929
00930
00931
00932
00933 #define FUNCTION_VALUE(VALTYPE, FUNC) \
00934 gen_rtx_REG (TYPE_MODE (VALTYPE) == BLKmode ? SImode : TYPE_MODE (VALTYPE), \
00935 2)
00936
00937
00938
00939
00940
00941 #define RETURN_IN_MEMORY(TYPE) \
00942 (TYPE_MODE (TYPE) == BLKmode \
00943 || ((TREE_CODE (TYPE) == RECORD_TYPE || TREE_CODE(TYPE) == UNION_TYPE) \
00944 && !(TYPE_MODE (TYPE) == SImode \
00945 || (TYPE_MODE (TYPE) == BLKmode \
00946 && TYPE_ALIGN (TYPE) == BITS_PER_WORD \
00947 && int_size_in_bytes (TYPE) == UNITS_PER_WORD))))
00948
00949
00950
00951 #define DEFAULT_PCC_STRUCT_RETURN 0
00952
00953
00954
00955 #define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, 2)
00956
00957
00958
00959 #define FUNCTION_VALUE_REGNO_P(N) ((N) == 2)
00960
00961
00962
00963 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
00964 m88k_function_arg (CUM, MODE, TYPE, NAMED)
00965
00966
00967
00968
00969
00970
00971
00972
00973 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) (0)
00974
00975
00976
00977
00978
00979
00980 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) (0)
00981
00982
00983
00984
00985 #define CUMULATIVE_ARGS int
00986
00987
00988
00989 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) ((CUM) = 0)
00990
00991
00992
00993
00994
00995
00996
00997 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
00998 do { \
00999 enum machine_mode __mode = (TYPE) ? TYPE_MODE (TYPE) : (MODE); \
01000 if ((CUM & 1) \
01001 && (__mode == DImode || __mode == DFmode \
01002 || ((TYPE) && TYPE_ALIGN (TYPE) > BITS_PER_WORD))) \
01003 CUM++; \
01004 CUM += (((__mode != BLKmode) \
01005 ? GET_MODE_SIZE (MODE) : int_size_in_bytes (TYPE)) \
01006 + 3) / 4; \
01007 } while (0)
01008
01009
01010
01011 #define FUNCTION_ARG_REGNO_P(N) ((N) <= 9 && (N) >= 2)
01012
01013
01014
01015
01016
01017
01018
01019
01020 #define FUNCTION_ARG_PADDING(MODE, TYPE) \
01021 ((MODE) == BLKmode \
01022 || ((TYPE) && (TREE_CODE (TYPE) == RECORD_TYPE \
01023 || TREE_CODE (TYPE) == UNION_TYPE)) \
01024 ? upward : GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY ? downward : none)
01025
01026
01027
01028
01029 #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
01030 (((TYPE) ? TYPE_ALIGN (TYPE) : GET_MODE_BITSIZE (MODE)) <= PARM_BOUNDARY \
01031 ? PARM_BOUNDARY : 2 * PARM_BOUNDARY)
01032
01033
01034
01035 #define EXPAND_BUILTIN_SAVEREGS() m88k_builtin_saveregs ()
01036
01037
01038 #define BUILD_VA_LIST_TYPE(VALIST) \
01039 (VALIST) = m88k_build_va_list ()
01040
01041
01042 #define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \
01043 m88k_va_start (stdarg, valist, nextarg)
01044
01045
01046 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
01047 m88k_va_arg (valist, type)
01048
01049
01050
01051
01052 #define FUNCTION_PROFILER(FILE, LABELNO) \
01053 output_function_profiler (FILE, LABELNO, "mcount", 1)
01054
01055
01056 #define FUNCTION_PROFILER_LENGTH (5+3+1+5)
01057
01058
01059
01060
01061
01062 #define EXIT_IGNORE_STACK (1)
01063
01064
01065
01066
01067
01068 #define FRAME_POINTER_REQUIRED \
01069 (current_function_varargs \
01070 || (TARGET_OMIT_LEAF_FRAME_POINTER && !leaf_function_p ()) \
01071 || (write_symbols != NO_DEBUG && !TARGET_OCS_FRAME_POSITION))
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084 #define ELIMINABLE_REGS \
01085 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
01086 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
01087 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
01088
01089
01090
01091 #define CAN_ELIMINATE(FROM, TO) \
01092 (!((FROM) == FRAME_POINTER_REGNUM && FRAME_POINTER_REQUIRED))
01093
01094
01095
01096 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
01097 { m88k_layout_frame (); \
01098 if ((FROM) == FRAME_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
01099 (OFFSET) = m88k_fp_offset; \
01100 else if ((FROM) == ARG_POINTER_REGNUM && (TO) == FRAME_POINTER_REGNUM) \
01101 (OFFSET) = m88k_stack_size - m88k_fp_offset; \
01102 else if ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
01103 (OFFSET) = m88k_stack_size; \
01104 else \
01105 abort (); \
01106 }
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120 #define TRAMPOLINE_TEMPLATE(FILE) \
01121 { \
01122 char buf[256]; \
01123 static int labelno = 0; \
01124 labelno++; \
01125 ASM_GENERATE_INTERNAL_LABEL (buf, "LTRMP", labelno); \
01126 \
01127 fprintf (FILE, "\tor\t %s,%s,0\n", reg_names[11], reg_names[1]); \
01128 \
01129 fprintf (FILE, "\tbsr\t %s\n", &buf[1]); \
01130 ASM_OUTPUT_INTERNAL_LABEL (FILE, "LTRMP", labelno); \
01131 \
01132 fprintf (FILE, "\tst\t %s,%s,24\n", reg_names[10], reg_names[1]); \
01133 fprintf (FILE, "\tor\t %s,%s,0\n", reg_names[10], reg_names[1]); \
01134 fprintf (FILE, "\tor\t %s,%s,0\n", reg_names[1], reg_names[11]); \
01135 \
01136 fprintf (FILE, "\tld\t %s,%s,32\n", reg_names[11], reg_names[10]); \
01137 fprintf (FILE, "\tjmp.n\t %s\n", reg_names[11]); \
01138 \
01139 fprintf (FILE, "\tld.d\t %s,%s,24\n", reg_names[10], reg_names[10]); \
01140 \
01141 assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
01142 assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
01143 assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
01144 }
01145
01146
01147
01148
01149
01150
01151
01152 #define TRAMPOLINE_SIZE (32+12)
01153
01154
01155
01156
01157
01158 #define TRAMPOLINE_ALIGNMENT 128
01159
01160
01161
01162
01163
01164 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
01165 { \
01166 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 40)), FNADDR); \
01167 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 36)), CXT); \
01168 }
01169
01170
01171
01172
01173
01174
01175 #define TARGET_MEM_FUNCTIONS
01176
01177
01178
01179 #define EXTRA_CC_MODES CC(CCEVENmode, "CCEVEN")
01180
01181 #define SELECT_CC_MODE(OP,X,Y) CCmode
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193 #define CONSTANT_ADDRESS_P(X) \
01194 (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
01195 || GET_CODE (X) == CONST_INT || GET_CODE (X) == HIGH \
01196 || (GET_CODE (X) == CONST \
01197 && ! (flag_pic && pic_address_needs_scratch (X))))
01198
01199
01200
01201 #define MAX_REGS_PER_ADDRESS 2
01202
01203
01204 #define SCALED_ADDRESS_P(ADDR) \
01205 (GET_CODE (ADDR) == PLUS \
01206 && (GET_CODE (XEXP (ADDR, 0)) == MULT \
01207 || GET_CODE (XEXP (ADDR, 1)) == MULT))
01208
01209
01210 #define SHORT_ADDRESS_P(X,TEMP) \
01211 ((TEMP) = (GET_CODE (X) == CONST ? get_related_value (X) : X), \
01212 ((TEMP) && GET_CODE (TEMP) == SYMBOL_REF && SYMBOL_REF_FLAG (TEMP)))
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225 #define LEGITIMATE_INDEX_P(X, MODE) \
01226 ((GET_CODE (X) == CONST_INT \
01227 && SMALL_INT (X)) \
01228 || (REG_P (X) \
01229 && REG_OK_FOR_INDEX_P (X)) \
01230 || (GET_CODE (X) == MULT \
01231 && REG_P (XEXP (X, 0)) \
01232 && REG_OK_FOR_INDEX_P (XEXP (X, 0)) \
01233 && GET_CODE (XEXP (X, 1)) == CONST_INT \
01234 && INTVAL (XEXP (X, 1)) == GET_MODE_SIZE (MODE)))
01235
01236 #define RTX_OK_FOR_BASE_P(X) \
01237 ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
01238 || (GET_CODE (X) == SUBREG \
01239 && GET_CODE (SUBREG_REG (X)) == REG \
01240 && REG_OK_FOR_BASE_P (SUBREG_REG (X))))
01241
01242 #define RTX_OK_FOR_INDEX_P(X) \
01243 ((GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X)) \
01244 || (GET_CODE (X) == SUBREG \
01245 && GET_CODE (SUBREG_REG (X)) == REG \
01246 && REG_OK_FOR_INDEX_P (SUBREG_REG (X))))
01247
01248 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
01249 { \
01250 register rtx _x; \
01251 if (REG_P (X)) \
01252 { \
01253 if (REG_OK_FOR_BASE_P (X)) \
01254 goto ADDR; \
01255 } \
01256 else if (GET_CODE (X) == PLUS) \
01257 { \
01258 register rtx _x0 = XEXP (X, 0); \
01259 register rtx _x1 = XEXP (X, 1); \
01260 if ((flag_pic \
01261 && _x0 == pic_offset_table_rtx \
01262 && (flag_pic == 2 \
01263 ? RTX_OK_FOR_BASE_P (_x1) \
01264 : (GET_CODE (_x1) == SYMBOL_REF \
01265 || GET_CODE (_x1) == LABEL_REF))) \
01266 || (REG_P (_x0) \
01267 && (REG_OK_FOR_BASE_P (_x0) \
01268 && LEGITIMATE_INDEX_P (_x1, MODE))) \
01269 || (REG_P (_x1) \
01270 && (REG_OK_FOR_BASE_P (_x1) \
01271 && LEGITIMATE_INDEX_P (_x0, MODE)))) \
01272 goto ADDR; \
01273 } \
01274 else if (GET_CODE (X) == LO_SUM) \
01275 { \
01276 register rtx _x0 = XEXP (X, 0); \
01277 register rtx _x1 = XEXP (X, 1); \
01278 if (((REG_P (_x0) \
01279 && REG_OK_FOR_BASE_P (_x0)) \
01280 || (GET_CODE (_x0) == SUBREG \
01281 && REG_P (SUBREG_REG (_x0)) \
01282 && REG_OK_FOR_BASE_P (SUBREG_REG (_x0)))) \
01283 && CONSTANT_P (_x1)) \
01284 goto ADDR; \
01285 } \
01286 else if (GET_CODE (X) == CONST_INT \
01287 && SMALL_INT (X)) \
01288 goto ADDR; \
01289 else if (SHORT_ADDRESS_P (X, _x)) \
01290 goto ADDR; \
01291 }
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306 #ifndef REG_OK_STRICT
01307
01308
01309
01310 #define REG_OK_FOR_INDEX_P(X) \
01311 (!XRF_REGNO_P(REGNO (X)))
01312
01313
01314 #define REG_OK_FOR_BASE_P(X) (REG_OK_FOR_INDEX_P (X))
01315
01316 #else
01317
01318
01319 #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
01320
01321 #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
01322
01323 #endif
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340 #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
01341 { \
01342 if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1))) \
01343 (X) = gen_rtx_PLUS (SImode, XEXP (X, 0), \
01344 copy_to_mode_reg (SImode, XEXP (X, 1))); \
01345 if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 0))) \
01346 (X) = gen_rtx_PLUS (SImode, XEXP (X, 1), \
01347 copy_to_mode_reg (SImode, XEXP (X, 0))); \
01348 if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == MULT) \
01349 (X) = gen_rtx_PLUS (SImode, XEXP (X, 1), \
01350 force_operand (XEXP (X, 0), 0)); \
01351 if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == MULT) \
01352 (X) = gen_rtx_PLUS (SImode, XEXP (X, 0), \
01353 force_operand (XEXP (X, 1), 0)); \
01354 if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == PLUS) \
01355 (X) = gen_rtx_PLUS (Pmode, force_operand (XEXP (X, 0), NULL_RTX),\
01356 XEXP (X, 1)); \
01357 if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == PLUS) \
01358 (X) = gen_rtx_PLUS (Pmode, XEXP (X, 0), \
01359 force_operand (XEXP (X, 1), NULL_RTX)); \
01360 if (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST \
01361 || GET_CODE (X) == LABEL_REF) \
01362 (X) = legitimize_address (flag_pic, X, 0, 0); \
01363 if (memory_address_p (MODE, X)) \
01364 goto WIN; }
01365
01366
01367
01368
01369
01370 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
01371
01372
01373
01374 #define LEGITIMATE_CONSTANT_P(X) (1)
01375
01376
01377
01378
01379 #define LEGITIMATE_PIC_OPERAND_P(X) (! pic_address_needs_scratch (X))
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398 #define NOTICE_UPDATE_CC(EXP, INSN) (0)
01399
01400
01401
01402
01403 #define PREDICATE_CODES \
01404 {"move_operand", {SUBREG, REG, CONST_INT, LO_SUM, MEM}}, \
01405 {"call_address_operand", {SUBREG, REG, SYMBOL_REF, LABEL_REF, CONST}}, \
01406 {"arith_operand", {SUBREG, REG, CONST_INT}}, \
01407 {"arith5_operand", {SUBREG, REG, CONST_INT}}, \
01408 {"arith32_operand", {SUBREG, REG, CONST_INT}}, \
01409 {"arith64_operand", {SUBREG, REG, CONST_INT}}, \
01410 {"int5_operand", {CONST_INT}}, \
01411 {"int32_operand", {CONST_INT}}, \
01412 {"add_operand", {SUBREG, REG, CONST_INT}}, \
01413 {"reg_or_bbx_mask_operand", {SUBREG, REG, CONST_INT}}, \
01414 {"real_or_0_operand", {SUBREG, REG, CONST_DOUBLE}}, \
01415 {"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
01416 {"relop", {EQ, NE, LT, LE, GE, GT, LTU, LEU, GEU, GTU}}, \
01417 {"even_relop", {EQ, LT, GT, LTU, GTU}}, \
01418 {"odd_relop", { NE, LE, GE, LEU, GEU}}, \
01419 {"partial_ccmode_register_operand", { SUBREG, REG}}, \
01420 {"relop_no_unsigned", {EQ, NE, LT, LE, GE, GT}}, \
01421 {"equality_op", {EQ, NE}}, \
01422 {"pc_or_label_ref", {PC, LABEL_REF}},
01423
01424
01425
01426
01427 #define SPECIAL_MODE_PREDICATES \
01428 "partial_ccmode_register_operand", \
01429 "pc_or_label_ref",
01430
01431
01432
01433
01434 #define CASE_VECTOR_INSNS (TARGET_88100 || flag_pic)
01435
01436
01437
01438 #define CASE_VECTOR_MODE SImode
01439
01440
01441
01442
01443
01444 #define CASE_VECTOR_PC_RELATIVE 1
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458 #define CASE_VALUES_THRESHOLD (TARGET_88100 ? 4 : 7)
01459
01460
01461 #define DEFAULT_SIGNED_CHAR 1
01462
01463
01464 #define SIZE_TYPE "unsigned int"
01465
01466
01467 #define SCCS_DIRECTIVE
01468
01469
01470 #define HANDLE_SYSV_PRAGMA
01471
01472
01473 #define SUPPORTS_WEAK TARGET_SVR4
01474 #define SUPPORTS_ONE_ONLY TARGET_SVR4
01475
01476
01477
01478 #define MOVE_MAX 8
01479
01480
01481
01482 #define BYTE_LOADS_ZERO_EXTEND
01483
01484
01485 #define SLOW_BYTE_ACCESS 1
01486
01487
01488
01489 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
01490
01491
01492
01493
01494
01495 #define NO_FUNCTION_CSE
01496
01497
01498
01499
01500
01501 #define PROMOTE_PROTOTYPES 1
01502
01503
01504
01505 #define TRADITIONAL_RETURN_FLOAT
01506
01507
01508
01509 #define STORE_FLAG_VALUE (-1)
01510
01511
01512
01513
01514 #define Pmode SImode
01515
01516
01517
01518
01519 #define FUNCTION_MODE SImode
01520
01521
01522
01523
01524
01525 #define ADJUST_INSN_LENGTH(RTX, LENGTH) \
01526 if (GET_CODE (RTX) == BARRIER \
01527 || (TARGET_SERIALIZE_VOLATILE \
01528 && GET_CODE (RTX) == INSN \
01529 && GET_CODE (PATTERN (RTX)) == SET \
01530 && ((GET_CODE (SET_SRC (PATTERN (RTX))) == MEM \
01531 && MEM_VOLATILE_P (SET_SRC (PATTERN (RTX))))))) \
01532 LENGTH += 1; \
01533 else if (GET_CODE (RTX) == NOTE \
01534 && NOTE_LINE_NUMBER (RTX) == NOTE_INSN_PROLOGUE_END) \
01535 { \
01536 if (current_function_profile) \
01537 LENGTH += (FUNCTION_PROFILER_LENGTH + REG_PUSH_LENGTH \
01538 + REG_POP_LENGTH); \
01539 } \
01540
01541
01542
01543 #define CC_STATUS_INIT m88k_volatile_code = '\0'
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558 #define CONST_COSTS(RTX,CODE,OUTER_CODE) \
01559 case CONST_INT: \
01560 if (SMALL_INT (RTX)) \
01561 return 0; \
01562 else if (SMALL_INTVAL (- INTVAL (RTX))) \
01563 return 2; \
01564 else if (classify_integer (SImode, INTVAL (RTX)) != m88k_oru_or) \
01565 return 4; \
01566 return 7; \
01567 case HIGH: \
01568 return 2; \
01569 case CONST: \
01570 case LABEL_REF: \
01571 case SYMBOL_REF: \
01572 if (flag_pic) \
01573 return (flag_pic == 2) ? 11 : 8; \
01574 return 5; \
01575 case CONST_DOUBLE: \
01576 return 0;
01577
01578
01579
01580
01581
01582 #define ADDRESS_COST(ADDR) \
01583 (GET_CODE (ADDR) == REG ? 1 : \
01584 GET_CODE (ADDR) == LO_SUM ? 1 : \
01585 GET_CODE (ADDR) == HIGH ? 2 : \
01586 GET_CODE (ADDR) == MULT ? 1 : \
01587 GET_CODE (ADDR) != PLUS ? 4 : \
01588 (REG_P (XEXP (ADDR, 0)) && REG_P (XEXP (ADDR, 1))) ? 2 : 1)
01589
01590
01591
01592 #define RTX_COSTS(X,CODE,OUTER_CODE) \
01593 case MEM: \
01594 return COSTS_N_INSNS (2); \
01595 case MULT: \
01596 return COSTS_N_INSNS (3); \
01597 case DIV: \
01598 case UDIV: \
01599 case MOD: \
01600 case UMOD: \
01601 return COSTS_N_INSNS (38);
01602
01603
01604
01605 #define MEMORY_MOVE_COST(MODE,CLASS,IN) 4
01606
01607
01608 #define BRANCH_COST (TARGET_88100 ? 1 : 2)
01609
01610
01611 #define DBX_CONTIN_LENGTH 0
01612
01613
01614
01615
01616
01617
01618
01619
01620 #define ASM_COMMENT_START ";"
01621
01622
01623 #undef ASCII_DATA_ASM_OP
01624 #undef CONST_SECTION_ASM_OP
01625 #undef CTORS_SECTION_ASM_OP
01626 #undef DTORS_SECTION_ASM_OP
01627 #undef TARGET_ASM_NAMED_SECTION
01628 #undef INIT_SECTION_ASM_OP
01629 #undef FINI_SECTION_ASM_OP
01630 #undef TYPE_ASM_OP
01631 #undef SIZE_ASM_OP
01632 #undef SET_ASM_OP
01633 #undef SKIP_ASM_OP
01634 #undef COMMON_ASM_OP
01635 #undef ALIGN_ASM_OP
01636 #undef IDENT_ASM_OP
01637
01638
01639 #define TEXT_SECTION_ASM_OP "\ttext"
01640 #define DATA_SECTION_ASM_OP "\tdata"
01641
01642
01643 #define CONST_SECTION_ASM_OP (TARGET_SVR4 \
01644 ? "\tsection\t .rodata,\"a\"" \
01645 : "\tsection\t .rodata,\"x\"")
01646 #define TDESC_SECTION_ASM_OP (TARGET_SVR4 \
01647 ? "\tsection\t .tdesc,\"a\"" \
01648 : "\tsection\t .tdesc,\"x\"")
01649
01650
01651 #define CTORS_SECTION_ASM_OP "\tsection\t .ctors,\"d\""
01652 #define DTORS_SECTION_ASM_OP "\tsection\t .dtors,\"d\""
01653 #define INIT_SECTION_ASM_OP "\tsection\t .init,\"x\""
01654 #define FINI_SECTION_ASM_OP "\tsection\t .fini,\"x\""
01655
01656
01657 #define IDENT_ASM_OP "\tident\t"
01658 #define FILE_ASM_OP "\tfile\t"
01659 #define SECTION_ASM_OP "\tsection\t"
01660 #define SET_ASM_OP "\tdef\t"
01661 #define GLOBAL_ASM_OP "\tglobal\t"
01662 #define ALIGN_ASM_OP "\talign\t"
01663 #define SKIP_ASM_OP "\tzero\t"
01664 #define COMMON_ASM_OP "\tcomm\t"
01665 #define BSS_ASM_OP "\tbss\t"
01666 #define FLOAT_ASM_OP "\tfloat\t"
01667 #define DOUBLE_ASM_OP "\tdouble\t"
01668 #define ASCII_DATA_ASM_OP "\tstring\t"
01669
01670
01671 #define SBSS_ASM_OP "\tsbss\t"
01672 #define SCOMM_ASM_OP "\tscomm\t"
01673 #define SDATA_SECTION_ASM_OP "\tsdata"
01674
01675
01676 #define TYPE_ASM_OP "\ttype\t"
01677 #define SIZE_ASM_OP "\tsize\t"
01678 #ifndef AS_BUG_POUND_TYPE
01679 #undef TYPE_OPERAND_FMT
01680 #define TYPE_OPERAND_FMT "#%s"
01681 #endif
01682
01683
01684
01685 #undef ASM_WEAKEN_LABEL
01686 #define ASM_WEAKEN_LABEL(FILE,NAME) \
01687 do { fputs ("\tweak\t", FILE); assemble_name (FILE, NAME); \
01688 fputc ('\n', FILE); } while (0)
01689
01690
01691 #define INTERNAL_ASM_OP "\tlocal\t"
01692 #define VERSION_ASM_OP "\tversion\t"
01693 #define PUSHSECTION_ASM_OP "\tsection\t"
01694 #define POPSECTION_ASM_OP "\tprevious"
01695
01696
01697 #define REQUIRES_88110_ASM_OP "\trequires_88110"
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710
01711
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722 #ifdef SDB_DEBUGGING_INFO
01723 #define ASM_COFFSEM(FILE) \
01724 if (write_symbols == SDB_DEBUG) \
01725 { \
01726 fprintf (FILE, "\nsem.%x:\t\t; %s\n", \
01727 (((TARGET_OCS_FRAME_POSITION) ? 2 : 1) << 0) + (1 << 2) + (1 << 4),\
01728 (TARGET_OCS_FRAME_POSITION) \
01729 ? "frame is CFA, normal array dims, case unchanged" \
01730 : "frame is r30, normal array dims, case unchanged"); \
01731 }
01732 #else
01733 #define ASM_COFFSEM(FILE)
01734 #endif
01735
01736
01737
01738 #define ASM_FIRST_LINE(FILE) \
01739 do { \
01740 if (TARGET_SVR4) \
01741 { \
01742 if (TARGET_88110) \
01743 fprintf (FILE, "%s\"%s\"\n", VERSION_ASM_OP, "04.00"); \
01744 else \
01745 fprintf (FILE, "%s\"%s\"\n", VERSION_ASM_OP, "03.00"); \
01746 } \
01747 } while (0)
01748
01749
01750 #undef ASM_FILE_START
01751 #define ASM_FILE_START(FILE) \
01752 output_file_start (FILE, \
01753 (struct m88k_lang_independent_options *) f_options, \
01754 ARRAY_SIZE (f_options), \
01755 (struct m88k_lang_independent_options *) W_options, \
01756 ARRAY_SIZE (W_options))
01757
01758 #undef ASM_FILE_END
01759
01760 #define ASM_OUTPUT_SOURCE_FILENAME(FILE, NAME) \
01761 fprintf (FILE, "%s\"%s\"\n", FILE_ASM_OP, NAME)
01762
01763 #ifdef SDB_DEBUGGING_INFO
01764 #undef ASM_OUTPUT_SOURCE_LINE
01765 #define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \
01766 if (m88k_prologue_done) \
01767 fprintf (FILE, "\n\tln\t %d\t\t\t\t; Real source line %d\n",\
01768 LINE - sdb_begin_function_line, LINE)
01769 #endif
01770
01771
01772 #undef ASM_OUTPUT_IDENT
01773 #ifdef DBX_DEBUGGING_INFO
01774 #define ASM_OUTPUT_IDENT(FILE, NAME)
01775 #else
01776 #define ASM_OUTPUT_IDENT(FILE, NAME) \
01777 output_ascii (FILE, IDENT_ASM_OP, 4000, NAME, strlen (NAME));
01778 #endif
01779
01780
01781
01782 #define ASM_APP_ON ""
01783
01784
01785
01786 #define ASM_APP_OFF ""
01787
01788
01789
01790
01791
01792 #define ASM_OUTPUT_OPCODE(STREAM, PTR) \
01793 { \
01794 int ch; \
01795 const char *orig_ptr; \
01796 \
01797 for (orig_ptr = (PTR); \
01798 (ch = *(PTR)) && ch != ' ' && ch != '\t' && ch != '\n' && ch != '%'; \
01799 (PTR)++) \
01800 putc (ch, STREAM); \
01801 \
01802 if (ch == ' ' && orig_ptr != (PTR) && (PTR) - orig_ptr < 8) \
01803 putc ('\t', STREAM); \
01804 }
01805
01806
01807
01808
01809
01810 #define REGISTER_NAMES \
01811 {"#r0"+1, "#r1"+1, "#r2"+1, "#r3"+1, "#r4"+1, "#r5"+1, "#r6"+1, "#r7"+1, \
01812 "#r8"+1, "#r9"+1, "#r10"+1,"#r11"+1,"#r12"+1,"#r13"+1,"#r14"+1,"#r15"+1,\
01813 "#r16"+1,"#r17"+1,"#r18"+1,"#r19"+1,"#r20"+1,"#r21"+1,"#r22"+1,"#r23"+1,\
01814 "#r24"+1,"#r25"+1,"#r26"+1,"#r27"+1,"#r28"+1,"#r29"+1,"#r30"+1,"#r31"+1,\
01815 "#x0"+1, "#x1"+1, "#x2"+1, "#x3"+1, "#x4"+1, "#x5"+1, "#x6"+1, "#x7"+1, \
01816 "#x8"+1, "#x9"+1, "#x10"+1,"#x11"+1,"#x12"+1,"#x13"+1,"#x14"+1,"#x15"+1,\
01817 "#x16"+1,"#x17"+1,"#x18"+1,"#x19"+1,"#x20"+1,"#x21"+1,"#x22"+1,"#x23"+1,\
01818 "#x24"+1,"#x25"+1,"#x26"+1,"#x27"+1,"#x28"+1,"#x29"+1,"#x30"+1,"#x31"+1}
01819
01820
01821
01822
01823
01824
01825
01826 #define ADDITIONAL_REGISTER_NAMES {{"psr", 0}, {"cc", 0}}
01827
01828
01829 #undef DECLARE_ASM_NAME
01830 #define DECLARE_ASM_NAME TARGET_SVR4
01831
01832
01833 #undef ASM_DECLARE_FUNCTION_NAME
01834 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
01835 do { \
01836 if (DECLARE_ASM_NAME) \
01837 { \
01838 fprintf (FILE, "%s", TYPE_ASM_OP); \
01839 assemble_name (FILE, NAME); \
01840 putc (',', FILE); \
01841 fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
01842 putc ('\n', FILE); \
01843 } \
01844 ASM_OUTPUT_LABEL(FILE, NAME); \
01845 } while (0)
01846
01847
01848 #undef ASM_DECLARE_OBJECT_NAME
01849 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
01850 do { \
01851 if (DECLARE_ASM_NAME) \
01852 { \
01853 fprintf (FILE, "%s", TYPE_ASM_OP); \
01854 assemble_name (FILE, NAME); \
01855 putc (',', FILE); \
01856 fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
01857 putc ('\n', FILE); \
01858 size_directive_output = 0; \
01859 if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
01860 { \
01861 size_directive_output = 1; \
01862 fprintf (FILE, "%s", SIZE_ASM_OP); \
01863 assemble_name (FILE, NAME); \
01864 fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
01865 } \
01866 } \
01867 ASM_OUTPUT_LABEL(FILE, NAME); \
01868 } while (0)
01869
01870
01871
01872
01873
01874
01875
01876 #undef ASM_FINISH_DECLARE_OBJECT
01877 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
01878 do { \
01879 const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
01880 if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
01881 && DECLARE_ASM_NAME \
01882 && ! AT_END && TOP_LEVEL \
01883 && DECL_INITIAL (DECL) == error_mark_node \
01884 && !size_directive_output) \
01885 { \
01886 size_directive_output = 1; \
01887 fprintf (FILE, "%s", SIZE_ASM_OP); \
01888 assemble_name (FILE, name); \
01889 fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
01890 } \
01891 } while (0)
01892
01893
01894 #undef ASM_DECLARE_FUNCTION_SIZE
01895 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
01896 do { \
01897 if (DECLARE_ASM_NAME) \
01898 { \
01899 if (!flag_inhibit_size_directive) \
01900 { \
01901 char label[256]; \
01902 static int labelno = 0; \
01903 labelno++; \
01904 ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
01905 ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
01906 fprintf (FILE, "%s", SIZE_ASM_OP); \
01907 assemble_name (FILE, (FNAME)); \
01908 fprintf (FILE, ",%s-", &label[1]); \
01909 assemble_name (FILE, (FNAME)); \
01910 putc ('\n', FILE); \
01911 } \
01912 } \
01913 } while (0)
01914
01915
01916
01917 #define ASM_OUTPUT_LABEL(FILE,NAME) \
01918 do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
01919
01920
01921
01922 #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
01923 do { \
01924 fprintf (FILE, "%s", GLOBAL_ASM_OP); \
01925 assemble_name (FILE, NAME); \
01926 putc ('\n', FILE); \
01927 } while (0)
01928
01929
01930
01931 #undef USER_LABEL_PREFIX
01932 #define USER_LABEL_PREFIX "_"
01933
01934
01935
01936 #undef ASM_OUTPUT_LABELREF
01937 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
01938 { \
01939 if (!TARGET_NO_UNDERSCORES && !TARGET_SVR4) \
01940 fputc ('_', FILE); \
01941 fputs (NAME, FILE); \
01942 }
01943
01944
01945
01946
01947
01948 #undef ASM_OUTPUT_INTERNAL_LABEL
01949 #ifdef AS_BUG_DOT_LABELS
01950 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
01951 fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n%s.%s%d\n" : "@%s%d:\n", \
01952 PREFIX, NUM, INTERNAL_ASM_OP, PREFIX, NUM)
01953 #else
01954 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
01955 fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n" : "@%s%d:\n", PREFIX, NUM)
01956 #endif
01957
01958
01959
01960
01961
01962
01963
01964
01965 #undef ASM_GENERATE_INTERNAL_LABEL
01966 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
01967 sprintf (LABEL, TARGET_SVR4 ? "*.%s%ld" : "*@%s%ld", PREFIX, (long)(NUM))
01968
01969
01970 #undef ASM_OUTPUT_ASCII
01971 #define ASM_OUTPUT_ASCII(FILE, P, SIZE) \
01972 output_ascii (FILE, ASCII_DATA_ASM_OP, 48, P, SIZE)
01973
01974
01975
01976 #undef ASM_OUTPUT_CASE_LABEL
01977 #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \
01978 do { \
01979 if (! CASE_VECTOR_INSNS) \
01980 { \
01981 readonly_data_section (); \
01982 ASM_OUTPUT_ALIGN (FILE, 2); \
01983 } \
01984 ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
01985 } while (0)
01986
01987
01988
01989
01990 #define ASM_OUTPUT_CASE_END(FILE, NUM, TABLE) \
01991 do { \
01992 if (CASE_VECTOR_INSNS) \
01993 { \
01994 char label[256]; \
01995 ASM_GENERATE_INTERNAL_LABEL (label, "L", NUM); \
01996 fprintf (FILE, "%se:\n", &label[1]); \
01997 if (! flag_delayed_branch) \
01998 fprintf (FILE, "\tlda\t %s,%s[%s]\n", reg_names[1], \
01999 reg_names[1], reg_names[m88k_case_index]); \
02000 fprintf (FILE, "\tjmp\t %s\n", reg_names[1]); \
02001 } \
02002 } while (0)
02003
02004
02005 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
02006 do { \
02007 char buffer[256]; \
02008 ASM_GENERATE_INTERNAL_LABEL (buffer, "L", VALUE); \
02009 fprintf (FILE, CASE_VECTOR_INSNS ? "\tbr\t %s\n" : "\tword\t %s\n", \
02010 &buffer[1]); \
02011 } while (0)
02012
02013
02014 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
02015 ASM_OUTPUT_ADDR_VEC_ELT (FILE, VALUE)
02016
02017
02018
02019
02020 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
02021 if ((LOG) != 0) \
02022 fprintf (FILE, "%s%d\n", ALIGN_ASM_OP, 1<<(LOG))
02023
02024
02025
02026
02027 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) \
02028 (TARGET_88100 && !flag_inhibit_size_directive ? 3 : 2)
02029
02030
02031 #undef ASM_OUTPUT_SKIP
02032 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
02033 fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE))
02034
02035
02036 #undef ASM_OUTPUT_EXTERNAL_LIBCALL
02037
02038
02039
02040
02041 #undef ASM_OUTPUT_COMMON
02042 #undef ASM_OUTPUT_ALIGNED_COMMON
02043 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
02044 ( fprintf ((FILE), "%s", \
02045 ((SIZE) ? (SIZE) : 1) <= m88k_gp_threshold ? SCOMM_ASM_OP : COMMON_ASM_OP), \
02046 assemble_name ((FILE), (NAME)), \
02047 fprintf ((FILE), ",%u\n", (SIZE) ? (SIZE) : 1))
02048
02049
02050
02051 #undef ASM_OUTPUT_LOCAL
02052 #undef ASM_OUTPUT_ALIGNED_LOCAL
02053 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
02054 ( fprintf ((FILE), "%s", \
02055 ((SIZE) ? (SIZE) : 1) <= m88k_gp_threshold ? SBSS_ASM_OP : BSS_ASM_OP), \
02056 assemble_name ((FILE), (NAME)), \
02057 fprintf ((FILE), ",%u,%d\n", (SIZE) ? (SIZE) : 1, (SIZE) <= 4 ? 4 : 8))
02058
02059
02060
02061
02062 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
02063 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
02064 sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
02065
02066
02067
02068 #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
02069 fprintf (FILE, "\tsubu\t %s,%s,%d\n\tst\t %s,%s,0\n", \
02070 reg_names[STACK_POINTER_REGNUM], \
02071 reg_names[STACK_POINTER_REGNUM], \
02072 (STACK_BOUNDARY / BITS_PER_UNIT), \
02073 reg_names[REGNO], \
02074 reg_names[STACK_POINTER_REGNUM])
02075
02076
02077 #define REG_PUSH_LENGTH 2
02078
02079
02080 #define ASM_OUTPUT_REG_POP(FILE,REGNO) \
02081 fprintf (FILE, "\tld\t %s,%s,0\n\taddu\t %s,%s,%d\n", \
02082 reg_names[REGNO], \
02083 reg_names[STACK_POINTER_REGNUM], \
02084 reg_names[STACK_POINTER_REGNUM], \
02085 reg_names[STACK_POINTER_REGNUM], \
02086 (STACK_BOUNDARY / BITS_PER_UNIT))
02087
02088
02089 #define REG_POP_LENGTH 2
02090
02091
02092
02093 #define OCS_START_PREFIX "Ltb"
02094 #define OCS_END_PREFIX "Lte"
02095
02096 #define PUT_OCS_FUNCTION_START(FILE) \
02097 { ASM_OUTPUT_INTERNAL_LABEL (FILE, OCS_START_PREFIX, m88k_function_number); }
02098
02099 #define PUT_OCS_FUNCTION_END(FILE) \
02100 { ASM_OUTPUT_INTERNAL_LABEL (FILE, OCS_END_PREFIX, m88k_function_number); }
02101
02102
02103 #define DEBUGGER_AUTO_OFFSET(X) \
02104 (m88k_debugger_offset (X, 0) \
02105 + (TARGET_OCS_FRAME_POSITION ? 0 : m88k_stack_size - m88k_fp_offset))
02106
02107 #define DEBUGGER_ARG_OFFSET(OFFSET, X) \
02108 (m88k_debugger_offset (X, OFFSET) \
02109 + (TARGET_OCS_FRAME_POSITION ? 0 : m88k_stack_size - m88k_fp_offset))
02110
02111
02112 #ifdef SDB_DEBUGGING_INFO
02113
02114
02115 #define SDB_ALLOW_FORWARD_REFERENCES
02116
02117
02118 #define PUT_SDB_SCL(a) \
02119 do { \
02120 register int s = (a); \
02121 register const char *scl; \
02122 switch (s) \
02123 { \
02124 case C_EFCN: scl = "end of function"; break; \
02125 case C_NULL: scl = "NULL storage class"; break; \
02126 case C_AUTO: scl = "automatic"; break; \
02127 case C_EXT: scl = "external"; break; \
02128 case C_STAT: scl = "static"; break; \
02129 case C_REG: scl = "register"; break; \
02130 case C_EXTDEF: scl = "external definition"; break; \
02131 case C_LABEL: scl = "label"; break; \
02132 case C_ULABEL: scl = "undefined label"; break; \
02133 case C_MOS: scl = "structure member"; break; \
02134 case C_ARG: scl = "argument"; break; \
02135 case C_STRTAG: scl = "structure tag"; break; \
02136 case C_MOU: scl = "union member"; break; \
02137 case C_UNTAG: scl = "union tag"; break; \
02138 case C_TPDEF: scl = "typedef"; break; \
02139 case C_USTATIC: scl = "uninitialized static"; break; \
02140 case C_ENTAG: scl = "enumeration tag"; break; \
02141 case C_MOE: scl = "member of enumeration"; break; \
02142 case C_REGPARM: scl = "register parameter"; break; \
02143 case C_FIELD: scl = "bit field"; break; \
02144 case C_BLOCK: scl = "block start/end"; break; \
02145 case C_FCN: scl = "function start/end"; break; \
02146 case C_EOS: scl = "end of structure"; break; \
02147 case C_FILE: scl = "filename"; break; \
02148 case C_LINE: scl = "line"; break; \
02149 case C_ALIAS: scl = "duplicated tag"; break; \
02150 case C_HIDDEN: scl = "hidden"; break; \
02151 default: scl = "unknown"; break; \
02152 } \
02153 \
02154 fprintf(asm_out_file, "\tscl\t %d\t\t\t\t; %s\n", s, scl); \
02155 } while (0)
02156
02157 #define PUT_SDB_TYPE(a) \
02158 do { \
02159 register int t = (a); \
02160 static char buffer[100]; \
02161 register char *p = buffer; \
02162 register const char *q; \
02163 register int typ = t; \
02164 register int i; \
02165 \
02166 for (i = 0; i <= 5; i++) \
02167 { \
02168 switch ((typ >> ((i*N_TSHIFT) + N_BTSHFT)) & 03) \
02169 { \
02170 case DT_PTR: \
02171 strcpy (p, "ptr to "); \
02172 p += sizeof("ptr to"); \
02173 break; \
02174 \
02175 case DT_ARY: \
02176 strcpy (p, "array of "); \
02177 p += sizeof("array of"); \
02178 break; \
02179 \
02180 case DT_FCN: \
02181 strcpy (p, "func ret "); \
02182 p += sizeof("func ret"); \
02183 break; \
02184 } \
02185 } \
02186 \
02187 switch (typ & N_BTMASK) \
02188 { \
02189 case T_NULL: q = "<no type>"; break; \
02190 case T_CHAR: q = "char"; break; \
02191 case T_SHORT: q = "short"; break; \
02192 case T_INT: q = "int"; break; \
02193 case T_LONG: q = "long"; break; \
02194 case T_FLOAT: q = "float"; break; \
02195 case T_DOUBLE: q = "double"; break; \
02196 case T_STRUCT: q = "struct"; break; \
02197 case T_UNION: q = "union"; break; \
02198 case T_ENUM: q = "enum"; break; \
02199 case T_MOE: q = "enum member"; break; \
02200 case T_UCHAR: q = "unsigned char"; break; \
02201 case T_USHORT: q = "unsigned short"; break; \
02202 case T_UINT: q = "unsigned int"; break; \
02203 case T_ULONG: q = "unsigned long"; break; \
02204 default: q = "void"; break; \
02205 } \
02206 \
02207 strcpy (p, q); \
02208 fprintf(asm_out_file, "\ttype\t %d\t\t\t\t; %s\n", \
02209 t, buffer); \
02210 } while (0)
02211
02212 #define PUT_SDB_INT_VAL(a) \
02213 fprintf (asm_out_file, "\tval\t %d\n", (a))
02214
02215 #define PUT_SDB_VAL(a) \
02216 ( fprintf (asm_out_file, "\tval\t "), \
02217 output_addr_const (asm_out_file, (a)), \
02218 fputc ('\n', asm_out_file))
02219
02220 #define PUT_SDB_DEF(a) \
02221 do { fprintf (asm_out_file, "\tsdef\t "); \
02222 ASM_OUTPUT_LABELREF (asm_out_file, a); \
02223 fputc ('\n', asm_out_file); \
02224 } while (0)
02225
02226 #define PUT_SDB_PLAIN_DEF(a) \
02227 fprintf(asm_out_file,"\tsdef\t .%s\n", a)
02228
02229
02230 #define PUT_SDB_ENDEF \
02231 fputs("\tendef\n\n", asm_out_file)
02232
02233 #define PUT_SDB_SIZE(a) \
02234 fprintf (asm_out_file, "\tsize\t %d\n", (a))
02235
02236
02237 #define SDB_MAX_DIM 6
02238
02239
02240 #define PUT_SDB_START_DIM \
02241 fputs("\tdim\t ", asm_out_file)
02242
02243
02244 #define PUT_SDB_LAST_DIM(a) \
02245 fprintf(asm_out_file, "%d\n", a)
02246
02247 #define PUT_SDB_TAG(a) \
02248 do { \
02249 fprintf (asm_out_file, "\ttag\t "); \
02250 ASM_OUTPUT_LABELREF (asm_out_file, a); \
02251 fputc ('\n', asm_out_file); \
02252 } while( 0 )
02253
02254 #define PUT_SDB_BLOCK_OR_FUNCTION(NAME, SCL, LINE) \
02255 do { \
02256 fprintf (asm_out_file, "\n\tsdef\t %s\n\tval\t .\n", \
02257 NAME); \
02258 PUT_SDB_SCL( SCL ); \
02259 fprintf (asm_out_file, "\tline\t %d\n\tendef\n\n", \
02260 (LINE)); \
02261 } while (0)
02262
02263 #define PUT_SDB_BLOCK_START(LINE) \
02264 PUT_SDB_BLOCK_OR_FUNCTION (".bb", C_BLOCK, (LINE))
02265
02266 #define PUT_SDB_BLOCK_END(LINE) \
02267 PUT_SDB_BLOCK_OR_FUNCTION (".eb", C_BLOCK, (LINE))
02268
02269 #define PUT_SDB_FUNCTION_START(LINE) \
02270 do { \
02271 fprintf (asm_out_file, "\tln\t 1\n"); \
02272 PUT_SDB_BLOCK_OR_FUNCTION (".bf", C_FCN, (LINE)); \
02273 } while (0)
02274
02275 #define PUT_SDB_FUNCTION_END(LINE) \
02276 do { \
02277 PUT_SDB_BLOCK_OR_FUNCTION (".ef", C_FCN, (LINE)); \
02278 } while (0)
02279
02280 #define PUT_SDB_EPILOGUE_END(NAME) \
02281 do { \
02282 text_section (); \
02283 fprintf (asm_out_file, "\n\tsdef\t "); \
02284 ASM_OUTPUT_LABELREF(asm_out_file, (NAME)); \
02285 fputc('\n', asm_out_file); \
02286 PUT_SDB_SCL( C_EFCN ); \
02287 fprintf (asm_out_file, "\tendef\n\n"); \
02288 } while (0)
02289
02290 #define SDB_GENERATE_FAKE(BUFFER, NUMBER) \
02291 sprintf ((BUFFER), ".%dfake", (NUMBER));
02292
02293 #endif
02294
02295
02296
02297
02298
02299
02300 #undef USE_CONST_SECTION
02301 #undef EXTRA_SECTIONS
02302
02303 #define USE_CONST_SECTION DECLARE_ASM_NAME
02304
02305 #if defined(USING_SVR4_H)
02306
02307 #define EXTRA_SECTIONS in_const, in_tdesc, in_sdata
02308 #define INIT_SECTION_FUNCTION
02309 #define FINI_SECTION_FUNCTION
02310
02311 #else
02312 #if defined(USING_SVR3_H)
02313
02314 #define EXTRA_SECTIONS in_const, in_tdesc, in_sdata, in_init, in_fini
02315
02316 #else
02317
02318 #undef INIT_SECTION_ASM_OP
02319 #define EXTRA_SECTIONS in_const, in_tdesc, in_sdata
02320 #define CONST_SECTION_FUNCTION \
02321 void \
02322 const_section () \
02323 { \
02324 text_section(); \
02325 }
02326 #define INIT_SECTION_FUNCTION
02327 #define FINI_SECTION_FUNCTION
02328
02329 #endif
02330 #endif
02331
02332 #undef EXTRA_SECTION_FUNCTIONS
02333 #define EXTRA_SECTION_FUNCTIONS \
02334 CONST_SECTION_FUNCTION \
02335 \
02336 void \
02337 tdesc_section () \
02338 { \
02339 if (in_section != in_tdesc) \
02340 { \
02341 fprintf (asm_out_file, "%s\n", TDESC_SECTION_ASM_OP); \
02342 in_section = in_tdesc; \
02343 } \
02344 } \
02345 \
02346 void \
02347 sdata_section () \
02348 { \
02349 if (in_section != in_sdata) \
02350 { \
02351 fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP); \
02352 in_section = in_sdata; \
02353 } \
02354 } \
02355 \
02356 INIT_SECTION_FUNCTION \
02357 FINI_SECTION_FUNCTION
02358
02359
02360
02361
02362
02363
02364
02365 #undef SELECT_SECTION
02366 #define SELECT_SECTION(DECL,RELOC,ALIGN) \
02367 { \
02368 if (TREE_CODE (DECL) == STRING_CST) \
02369 { \
02370 if (! flag_writable_strings) \
02371 const_section (); \
02372 else if ( TREE_STRING_LENGTH (DECL) <= m88k_gp_threshold) \
02373 sdata_section (); \
02374 else \
02375 data_section (); \
02376 } \
02377 else if (TREE_CODE (DECL) == VAR_DECL) \
02378 { \
02379 if (SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0))) \
02380 sdata_section (); \
02381 else if ((flag_pic && RELOC) \
02382 || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
02383 || !DECL_INITIAL (DECL) \
02384 || (DECL_INITIAL (DECL) != error_mark_node \
02385 && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
02386 data_section (); \
02387 else \
02388 const_section (); \
02389 } \
02390 else \
02391 const_section (); \
02392 }
02393
02394
02395
02396
02397 #define JUMP_TABLES_IN_TEXT_SECTION 1
02398
02399
02400
02401
02402
02403
02404
02405
02406
02407
02408 #define ENCODE_SECTION_INFO(DECL) \
02409 do { \
02410 if (m88k_gp_threshold > 0) \
02411 { \
02412 if (TREE_CODE (DECL) == VAR_DECL) \
02413 { \
02414 if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \
02415 { \
02416 int size = int_size_in_bytes (TREE_TYPE (DECL)); \
02417 \
02418 if (size > 0 && size <= m88k_gp_threshold) \
02419 SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
02420 } \
02421 } \
02422 else if (TREE_CODE (DECL) == STRING_CST \
02423 && flag_writable_strings \
02424 && TREE_STRING_LENGTH (DECL) <= m88k_gp_threshold) \
02425 SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (DECL), 0)) = 1; \
02426 } \
02427 } while (0)
02428
02429
02430
02431
02432 #define PRINT_OPERAND_PUNCT_VALID_P(c) \
02433 ((c) == '#' || (c) == '.' || (c) == '!' || (c) == '*' || (c) == ';')
02434
02435 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
02436
02437
02438 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
02439
02440
02441
02442
02443 #define DONT_REDUCE_ADDR