Home | History | Annotate | Line # | Download | only in h8300
      1  1.1  mrg /* Subroutines for insn-output.cc for Renesas H8/300.
      2  1.1  mrg    Copyright (C) 1992-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Steve Chamberlain (sac (at) cygnus.com),
      4  1.1  mrg    Jim Wilson (wilson (at) cygnus.com), and Doug Evans (dje (at) cygnus.com).
      5  1.1  mrg 
      6  1.1  mrg This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg GCC is free software; you can redistribute it and/or modify
      9  1.1  mrg it under the terms of the GNU General Public License as published by
     10  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     11  1.1  mrg any later version.
     12  1.1  mrg 
     13  1.1  mrg GCC is distributed in the hope that it will be useful,
     14  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  mrg GNU General Public License for more details.
     17  1.1  mrg 
     18  1.1  mrg You should have received a copy of the GNU General Public License
     19  1.1  mrg along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg #define IN_TARGET_CODE 1
     23  1.1  mrg 
     24  1.1  mrg #include "config.h"
     25  1.1  mrg #include "system.h"
     26  1.1  mrg #include "coretypes.h"
     27  1.1  mrg #include "backend.h"
     28  1.1  mrg #include "target.h"
     29  1.1  mrg #include "rtl.h"
     30  1.1  mrg #include "tree.h"
     31  1.1  mrg #include "df.h"
     32  1.1  mrg #include "memmodel.h"
     33  1.1  mrg #include "tm_p.h"
     34  1.1  mrg #include "stringpool.h"
     35  1.1  mrg #include "attribs.h"
     36  1.1  mrg #include "optabs.h"
     37  1.1  mrg #include "regs.h"
     38  1.1  mrg #include "emit-rtl.h"
     39  1.1  mrg #include "recog.h"
     40  1.1  mrg #include "diagnostic-core.h"
     41  1.1  mrg #include "alias.h"
     42  1.1  mrg #include "stor-layout.h"
     43  1.1  mrg #include "varasm.h"
     44  1.1  mrg #include "calls.h"
     45  1.1  mrg #include "conditions.h"
     46  1.1  mrg #include "output.h"
     47  1.1  mrg #include "insn-attr.h"
     48  1.1  mrg #include "flags.h"
     49  1.1  mrg #include "explow.h"
     50  1.1  mrg #include "expr.h"
     51  1.1  mrg #include "tm-constrs.h"
     52  1.1  mrg #include "builtins.h"
     53  1.1  mrg 
     54  1.1  mrg /* This file should be included last.  */
     55  1.1  mrg #include "target-def.h"
     56  1.1  mrg 
     57  1.1  mrg /* Classifies a h8300_src_operand or h8300_dst_operand.
     58  1.1  mrg 
     59  1.1  mrg    H8OP_IMMEDIATE
     60  1.1  mrg 	A constant operand of some sort.
     61  1.1  mrg 
     62  1.1  mrg    H8OP_REGISTER
     63  1.1  mrg 	An ordinary register.
     64  1.1  mrg 
     65  1.1  mrg    H8OP_MEM_ABSOLUTE
     66  1.1  mrg 	A memory reference with a constant address.
     67  1.1  mrg 
     68  1.1  mrg    H8OP_MEM_BASE
     69  1.1  mrg 	A memory reference with a register as its address.
     70  1.1  mrg 
     71  1.1  mrg    H8OP_MEM_COMPLEX
     72  1.1  mrg 	Some other kind of memory reference.  */
     73  1.1  mrg enum h8300_operand_class
     74  1.1  mrg {
     75  1.1  mrg   H8OP_IMMEDIATE,
     76  1.1  mrg   H8OP_REGISTER,
     77  1.1  mrg   H8OP_MEM_ABSOLUTE,
     78  1.1  mrg   H8OP_MEM_BASE,
     79  1.1  mrg   H8OP_MEM_COMPLEX,
     80  1.1  mrg   NUM_H8OPS
     81  1.1  mrg };
     82  1.1  mrg 
     83  1.1  mrg /* For a general two-operand instruction, element [X][Y] gives
     84  1.1  mrg    the length of the opcode fields when the first operand has class
     85  1.1  mrg    (X + 1) and the second has class Y.  */
     86  1.1  mrg typedef unsigned char h8300_length_table[NUM_H8OPS - 1][NUM_H8OPS];
     87  1.1  mrg 
     88  1.1  mrg /* Forward declarations.  */
     89  1.1  mrg static const char *byte_reg (rtx, int);
     90  1.1  mrg static int h8300_interrupt_function_p (tree);
     91  1.1  mrg static int h8300_saveall_function_p (tree);
     92  1.1  mrg static int h8300_monitor_function_p (tree);
     93  1.1  mrg static int h8300_os_task_function_p (tree);
     94  1.1  mrg static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT);
     95  1.1  mrg static HOST_WIDE_INT round_frame_size (HOST_WIDE_INT);
     96  1.1  mrg static unsigned int compute_saved_regs (void);
     97  1.1  mrg static const char *cond_string (enum rtx_code);
     98  1.1  mrg static unsigned int h8300_asm_insn_count (const char *);
     99  1.1  mrg static tree h8300_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
    100  1.1  mrg static tree h8300_handle_eightbit_data_attribute (tree *, tree, tree, int, bool *);
    101  1.1  mrg static tree h8300_handle_tiny_data_attribute (tree *, tree, tree, int, bool *);
    102  1.1  mrg static void h8300_print_operand_address (FILE *, machine_mode, rtx);
    103  1.1  mrg static void h8300_print_operand (FILE *, rtx, int);
    104  1.1  mrg static bool h8300_print_operand_punct_valid_p (unsigned char code);
    105  1.1  mrg static int h8300_register_move_cost (machine_mode, reg_class_t, reg_class_t);
    106  1.1  mrg static int h8300_and_costs (rtx);
    107  1.1  mrg static int h8300_shift_costs (rtx);
    108  1.1  mrg static void          h8300_push_pop               (int, int, bool, bool);
    109  1.1  mrg static int           h8300_stack_offset_p         (rtx, int);
    110  1.1  mrg static int           h8300_ldm_stm_regno          (rtx, int, int, int);
    111  1.1  mrg static void          h8300_reorg                  (void);
    112  1.1  mrg static unsigned int  h8300_constant_length        (rtx);
    113  1.1  mrg static unsigned int  h8300_displacement_length    (rtx, int);
    114  1.1  mrg static unsigned int  h8300_classify_operand       (rtx, int, enum h8300_operand_class *);
    115  1.1  mrg static unsigned int  h8300_length_from_table      (rtx, rtx, const h8300_length_table *);
    116  1.1  mrg static unsigned int  h8300_unary_length           (rtx);
    117  1.1  mrg static unsigned int  h8300_short_immediate_length (rtx);
    118  1.1  mrg static unsigned int  h8300_bitfield_length        (rtx, rtx);
    119  1.1  mrg static unsigned int  h8300_binary_length          (rtx_insn *, const h8300_length_table *);
    120  1.1  mrg static bool          h8300_short_move_mem_p       (rtx, enum rtx_code);
    121  1.1  mrg static unsigned int  h8300_move_length            (rtx *, const h8300_length_table *);
    122  1.1  mrg static bool	     h8300_hard_regno_scratch_ok  (unsigned int);
    123  1.1  mrg static rtx	     h8300_get_index (rtx, machine_mode mode, int *);
    124  1.1  mrg 
    125  1.1  mrg /* CPU_TYPE, says what cpu we're compiling for.  */
    126  1.1  mrg int cpu_type;
    127  1.1  mrg 
    128  1.1  mrg /* True if a #pragma interrupt has been seen for the current function.  */
    129  1.1  mrg static int pragma_interrupt;
    130  1.1  mrg 
    131  1.1  mrg /* True if a #pragma saveall has been seen for the current function.  */
    132  1.1  mrg static int pragma_saveall;
    133  1.1  mrg 
    134  1.1  mrg static const char *const names_big[] =
    135  1.1  mrg { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "cc" };
    136  1.1  mrg 
    137  1.1  mrg static const char *const names_extended[] =
    138  1.1  mrg { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7", "cc" };
    139  1.1  mrg 
    140  1.1  mrg static const char *const names_upper_extended[] =
    141  1.1  mrg { "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "cc" };
    142  1.1  mrg 
    143  1.1  mrg /* Points to one of the above.  */
    144  1.1  mrg /* ??? The above could be put in an array indexed by CPU_TYPE.  */
    145  1.1  mrg const char * const *h8_reg_names;
    146  1.1  mrg 
    147  1.1  mrg /* Various operations needed by the following, indexed by CPU_TYPE.  */
    148  1.1  mrg 
    149  1.1  mrg const char *h8_push_op, *h8_pop_op, *h8_mov_op;
    150  1.1  mrg 
    151  1.1  mrg /* Value of MOVE_RATIO.  */
    152  1.1  mrg int h8300_move_ratio;
    153  1.1  mrg 
    154  1.1  mrg /* See below where shifts are handled for explanation of this enum.  */
    156  1.1  mrg 
    157  1.1  mrg enum shift_alg
    158  1.1  mrg {
    159  1.1  mrg   SHIFT_INLINE,
    160  1.1  mrg   SHIFT_ROT_AND,
    161  1.1  mrg   SHIFT_SPECIAL,
    162  1.1  mrg   SHIFT_LOOP
    163  1.1  mrg };
    164  1.1  mrg 
    165  1.1  mrg /* Symbols of the various shifts which can be used as indices.  */
    166  1.1  mrg 
    167  1.1  mrg enum shift_type
    168  1.1  mrg {
    169  1.1  mrg   SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
    170  1.1  mrg };
    171  1.1  mrg 
    172  1.1  mrg /* Macros to keep the shift algorithm tables small.  */
    173  1.1  mrg #define INL SHIFT_INLINE
    174  1.1  mrg #define ROT SHIFT_ROT_AND
    175  1.1  mrg #define LOP SHIFT_LOOP
    176  1.1  mrg #define SPC SHIFT_SPECIAL
    177  1.1  mrg 
    178  1.1  mrg /* The shift algorithms for each machine, mode, shift type, and shift
    179  1.1  mrg    count are defined below.  The three tables below correspond to
    180  1.1  mrg    QImode, HImode, and SImode, respectively.  Each table is organized
    181  1.1  mrg    by, in the order of indices, machine, shift type, and shift count.  */
    182  1.1  mrg 
    183  1.1  mrg static enum shift_alg shift_alg_qi[2][3][8] = {
    184  1.1  mrg   {
    185  1.1  mrg     /* TARGET_H8300H  */
    186  1.1  mrg     /* 0    1    2    3    4    5    6    7  */
    187  1.1  mrg     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
    188  1.1  mrg     { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
    189  1.1  mrg     { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
    190  1.1  mrg   },
    191  1.1  mrg   {
    192  1.1  mrg     /* TARGET_H8300S  */
    193  1.1  mrg     /*  0    1    2    3    4    5    6    7  */
    194  1.1  mrg     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT   */
    195  1.1  mrg     { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
    196  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, SPC }  /* SHIFT_ASHIFTRT */
    197  1.1  mrg   }
    198  1.1  mrg };
    199  1.1  mrg 
    200  1.1  mrg static enum shift_alg shift_alg_hi[2][3][16] = {
    201  1.1  mrg   {
    202  1.1  mrg     /* TARGET_H8300H  */
    203  1.1  mrg     /*  0    1    2    3    4    5    6    7  */
    204  1.1  mrg     /*  8    9   10   11   12   13   14   15  */
    205  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, SPC,
    206  1.1  mrg       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
    207  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, SPC,
    208  1.1  mrg       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
    209  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, SPC,
    210  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
    211  1.1  mrg   },
    212  1.1  mrg   {
    213  1.1  mrg     /* TARGET_H8300S  */
    214  1.1  mrg     /*  0    1    2    3    4    5    6    7  */
    215  1.1  mrg     /*  8    9   10   11   12   13   14   15  */
    216  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    217  1.1  mrg       SPC, SPC, SPC, SPC, ROT, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
    218  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    219  1.1  mrg       SPC, SPC, SPC, SPC, ROT, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
    220  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    221  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
    222  1.1  mrg   }
    223  1.1  mrg };
    224  1.1  mrg 
    225  1.1  mrg static enum shift_alg shift_alg_si[2][3][32] = {
    226  1.1  mrg   {
    227  1.1  mrg     /* TARGET_H8300H  */
    228  1.1  mrg     /*  0    1    2    3    4    5    6    7  */
    229  1.1  mrg     /*  8    9   10   11   12   13   14   15  */
    230  1.1  mrg     /* 16   17   18   19   20   21   22   23  */
    231  1.1  mrg     /* 24   25   26   27   28   29   30   31  */
    232  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, LOP,
    233  1.1  mrg       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
    234  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    235  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
    236  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, LOP,
    237  1.1  mrg       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
    238  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    239  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
    240  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, LOP,
    241  1.1  mrg       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
    242  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    243  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
    244  1.1  mrg   },
    245  1.1  mrg   {
    246  1.1  mrg     /* TARGET_H8300S  */
    247  1.1  mrg     /*  0    1    2    3    4    5    6    7  */
    248  1.1  mrg     /*  8    9   10   11   12   13   14   15  */
    249  1.1  mrg     /* 16   17   18   19   20   21   22   23  */
    250  1.1  mrg     /* 24   25   26   27   28   29   30   31  */
    251  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    252  1.1  mrg       INL, INL, INL, INL, INL, INL, INL, SPC,
    253  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    254  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
    255  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    256  1.1  mrg       INL, INL, INL, INL, INL, INL, INL, SPC,
    257  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    258  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
    259  1.1  mrg     { INL, INL, INL, INL, INL, INL, INL, INL,
    260  1.1  mrg       INL, INL, INL, INL, INL, INL, INL, SPC,
    261  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
    262  1.1  mrg       SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
    263  1.1  mrg   }
    264  1.1  mrg };
    265  1.1  mrg 
    266  1.1  mrg #undef INL
    267  1.1  mrg #undef ROT
    268  1.1  mrg #undef LOP
    269  1.1  mrg #undef SPC
    270  1.1  mrg 
    271  1.1  mrg enum h8_cpu
    272  1.1  mrg {
    273  1.1  mrg   H8_300H,
    274  1.1  mrg   H8_S
    275  1.1  mrg };
    276  1.1  mrg 
    277  1.1  mrg /* Initialize various cpu specific globals at start up.  */
    278  1.1  mrg 
    279  1.1  mrg static void
    280  1.1  mrg h8300_option_override (void)
    281  1.1  mrg {
    282  1.1  mrg   static const char *const h8_push_ops[2] = { "push" , "push.l" };
    283  1.1  mrg   static const char *const h8_pop_ops[2]  = { "pop"  , "pop.l"  };
    284  1.1  mrg   static const char *const h8_mov_ops[2]  = { "mov.w", "mov.l"  };
    285  1.1  mrg 
    286  1.1  mrg   /* For this we treat the H8/300H and H8S the same.  */
    287  1.1  mrg   cpu_type = (int) CPU_H8300H;
    288  1.1  mrg   h8_reg_names = names_extended;
    289  1.1  mrg   h8_push_op = h8_push_ops[cpu_type];
    290  1.1  mrg   h8_pop_op = h8_pop_ops[cpu_type];
    291  1.1  mrg   h8_mov_op = h8_mov_ops[cpu_type];
    292  1.1  mrg 
    293  1.1  mrg   /* If we're compiling for the H8/S, then turn off H8/300H.  */
    294  1.1  mrg   if (TARGET_H8300S)
    295  1.1  mrg     target_flags &= ~MASK_H8300H;
    296  1.1  mrg 
    297  1.1  mrg   if (!TARGET_H8300S && TARGET_MAC)
    298  1.1  mrg     {
    299  1.1  mrg       error ("%<-ms2600%> is used without %<-ms%>");
    300  1.1  mrg       target_flags |= MASK_H8300S_1;
    301  1.1  mrg     }
    302  1.1  mrg 
    303  1.1  mrg   if (! TARGET_H8300S &&  TARGET_EXR)
    304  1.1  mrg     {
    305  1.1  mrg       error ("%<-mexr%> is used without %<-ms%>");
    306  1.1  mrg       target_flags |= MASK_H8300S_1;
    307  1.1  mrg     }
    308  1.1  mrg 
    309  1.1  mrg  if ((!TARGET_H8300S  &&  TARGET_EXR) && (!TARGET_H8300SX && TARGET_EXR))
    310  1.1  mrg    {
    311  1.1  mrg       error ("%<-mexr%> is used without %<-ms%> or %<-msx%>");
    312  1.1  mrg       target_flags |= MASK_H8300S_1;
    313  1.1  mrg    }
    314  1.1  mrg 
    315  1.1  mrg  if ((!TARGET_H8300S  &&  TARGET_NEXR) && (!TARGET_H8300SX && TARGET_NEXR))
    316  1.1  mrg    {
    317  1.1  mrg       warning (OPT_mno_exr, "%<-mno-exr%> is valid only with %<-ms%> or "
    318  1.1  mrg 	       "%<-msx%> - option ignored");
    319  1.1  mrg    }
    320  1.1  mrg 
    321  1.1  mrg #ifdef H8300_LINUX
    322  1.1  mrg  if ((TARGET_NORMAL_MODE))
    323  1.1  mrg    {
    324  1.1  mrg       error ("%<-mn%> is not supported for linux targets");
    325  1.1  mrg       target_flags ^= MASK_NORMAL_MODE;
    326  1.1  mrg    }
    327  1.1  mrg #endif
    328  1.1  mrg 
    329  1.1  mrg   /* Some of the shifts are optimized for speed by default.
    330  1.1  mrg      See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
    331  1.1  mrg      If optimizing for size, change shift_alg for those shift to
    332  1.1  mrg      SHIFT_LOOP.  */
    333  1.1  mrg   if (optimize_size)
    334  1.1  mrg     {
    335  1.1  mrg       /* H8/300H */
    336  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
    337  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
    338  1.1  mrg 
    339  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
    340  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
    341  1.1  mrg 
    342  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
    343  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
    344  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
    345  1.1  mrg       shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
    346  1.1  mrg 
    347  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
    348  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
    349  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][20] = SHIFT_LOOP;
    350  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][21] = SHIFT_LOOP;
    351  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][22] = SHIFT_LOOP;
    352  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][23] = SHIFT_LOOP;
    353  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][25] = SHIFT_LOOP;
    354  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][26] = SHIFT_LOOP;
    355  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFT][27] = SHIFT_LOOP;
    356  1.1  mrg 
    357  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
    358  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
    359  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][20] = SHIFT_LOOP;
    360  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][21] = SHIFT_LOOP;
    361  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][22] = SHIFT_LOOP;
    362  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][23] = SHIFT_LOOP;
    363  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][25] = SHIFT_LOOP;
    364  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][26] = SHIFT_LOOP;
    365  1.1  mrg       shift_alg_si[H8_300H][SHIFT_LSHIFTRT][27] = SHIFT_LOOP;
    366  1.1  mrg 
    367  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
    368  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
    369  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][20] = SHIFT_LOOP;
    370  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][21] = SHIFT_LOOP;
    371  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][22] = SHIFT_LOOP;
    372  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][23] = SHIFT_LOOP;
    373  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][25] = SHIFT_LOOP;
    374  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][26] = SHIFT_LOOP;
    375  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][27] = SHIFT_LOOP;
    376  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][28] = SHIFT_LOOP;
    377  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][29] = SHIFT_LOOP;
    378  1.1  mrg       shift_alg_si[H8_300H][SHIFT_ASHIFTRT][30] = SHIFT_LOOP;
    379  1.1  mrg 
    380  1.1  mrg       /* H8S */
    381  1.1  mrg       shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
    382  1.1  mrg 
    383  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][11] = SHIFT_LOOP;
    384  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][12] = SHIFT_LOOP;
    385  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][13] = SHIFT_LOOP;
    386  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][14] = SHIFT_LOOP;
    387  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][22] = SHIFT_LOOP;
    388  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][23] = SHIFT_LOOP;
    389  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][26] = SHIFT_LOOP;
    390  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFT][27] = SHIFT_LOOP;
    391  1.1  mrg 
    392  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][11] = SHIFT_LOOP;
    393  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][12] = SHIFT_LOOP;
    394  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
    395  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
    396  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][22] = SHIFT_LOOP;
    397  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][23] = SHIFT_LOOP;
    398  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][26] = SHIFT_LOOP;
    399  1.1  mrg       shift_alg_si[H8_S][SHIFT_LSHIFTRT][27] = SHIFT_LOOP;
    400  1.1  mrg 
    401  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][11] = SHIFT_LOOP;
    402  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][12] = SHIFT_LOOP;
    403  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
    404  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
    405  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][22] = SHIFT_LOOP;
    406  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][23] = SHIFT_LOOP;
    407  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][26] = SHIFT_LOOP;
    408  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][27] = SHIFT_LOOP;
    409  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][28] = SHIFT_LOOP;
    410  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][29] = SHIFT_LOOP;
    411  1.1  mrg       shift_alg_si[H8_S][SHIFT_ASHIFTRT][30] = SHIFT_LOOP;
    412  1.1  mrg     }
    413  1.1  mrg 
    414  1.1  mrg   /* Work out a value for MOVE_RATIO.  */
    415  1.1  mrg   if (!TARGET_H8300SX)
    416  1.1  mrg     {
    417  1.1  mrg       /* Memory-memory moves are quite expensive without the
    418  1.1  mrg 	 h8sx instructions.  */
    419  1.1  mrg       h8300_move_ratio = 3;
    420  1.1  mrg     }
    421  1.1  mrg   else if (flag_omit_frame_pointer)
    422  1.1  mrg     {
    423  1.1  mrg       /* movmd sequences are fairly cheap when er6 isn't fixed.  They can
    424  1.1  mrg 	 sometimes be as short as two individual memory-to-memory moves,
    425  1.1  mrg 	 but since they use all the call-saved registers, it seems better
    426  1.1  mrg 	 to allow up to three moves here.  */
    427  1.1  mrg       h8300_move_ratio = 4;
    428  1.1  mrg     }
    429  1.1  mrg   else if (optimize_size)
    430  1.1  mrg     {
    431  1.1  mrg       /* In this case we don't use movmd sequences since they tend
    432  1.1  mrg 	 to be longer than calls to memcpy().  Memory-to-memory
    433  1.1  mrg 	 moves are cheaper than for !TARGET_H8300SX, so it makes
    434  1.1  mrg 	 sense to have a slightly higher threshold.  */
    435  1.1  mrg       h8300_move_ratio = 4;
    436  1.1  mrg     }
    437  1.1  mrg   else
    438  1.1  mrg     {
    439  1.1  mrg       /* We use movmd sequences for some moves since it can be quicker
    440  1.1  mrg 	 than calling memcpy().  The sequences will need to save and
    441  1.1  mrg 	 restore er6 though, so bump up the cost.  */
    442  1.1  mrg       h8300_move_ratio = 6;
    443  1.1  mrg     }
    444  1.1  mrg 
    445  1.1  mrg   /* This target defaults to strict volatile bitfields.  */
    446  1.1  mrg   if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
    447  1.1  mrg     flag_strict_volatile_bitfields = 1;
    448  1.1  mrg }
    449  1.1  mrg 
    450  1.1  mrg /* Return the byte register name for a register rtx X.  B should be 0
    451  1.1  mrg    if you want a lower byte register.  B should be 1 if you want an
    452  1.1  mrg    upper byte register.  */
    453  1.1  mrg 
    454  1.1  mrg static const char *
    455  1.1  mrg byte_reg (rtx x, int b)
    456  1.1  mrg {
    457  1.1  mrg   static const char *const names_small[] = {
    458  1.1  mrg     "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
    459  1.1  mrg     "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
    460  1.1  mrg   };
    461  1.1  mrg 
    462  1.1  mrg   gcc_assert (REG_P (x));
    463  1.1  mrg 
    464  1.1  mrg   return names_small[REGNO (x) * 2 + b];
    465  1.1  mrg }
    466  1.1  mrg 
    467  1.1  mrg /* REGNO must be saved/restored across calls if this macro is true.  */
    468  1.1  mrg 
    469  1.1  mrg #define WORD_REG_USED(regno)						\
    470  1.1  mrg   (regno < SP_REG							\
    471  1.1  mrg    /* No need to save registers if this function will not return.  */	\
    472  1.1  mrg    && ! TREE_THIS_VOLATILE (current_function_decl)			\
    473  1.1  mrg    && (h8300_saveall_function_p (current_function_decl)			\
    474  1.1  mrg        /* Save any call saved register that was used.  */		\
    475  1.1  mrg        || (df_regs_ever_live_p (regno)					\
    476  1.1  mrg 	   && !call_used_or_fixed_reg_p (regno))			\
    477  1.1  mrg        /* Save the frame pointer if it was used.  */			\
    478  1.1  mrg        || (regno == HARD_FRAME_POINTER_REGNUM && df_regs_ever_live_p (regno)) \
    479  1.1  mrg        /* Save any register used in an interrupt handler.  */		\
    480  1.1  mrg        || (h8300_current_function_interrupt_function_p ()		\
    481  1.1  mrg 	   && df_regs_ever_live_p (regno))				\
    482  1.1  mrg        /* Save call clobbered registers in non-leaf interrupt		\
    483  1.1  mrg 	  handlers.  */							\
    484  1.1  mrg        || (h8300_current_function_interrupt_function_p ()		\
    485  1.1  mrg 	   && call_used_or_fixed_reg_p (regno)				\
    486  1.1  mrg 	   && !crtl->is_leaf)))
    487  1.1  mrg 
    488  1.1  mrg /* We use this to wrap all emitted insns in the prologue.  */
    489  1.1  mrg static rtx_insn *
    490  1.1  mrg F (rtx_insn *x, bool set_it)
    491  1.1  mrg {
    492  1.1  mrg   if (set_it)
    493  1.1  mrg     RTX_FRAME_RELATED_P (x) = 1;
    494  1.1  mrg   return x;
    495  1.1  mrg }
    496  1.1  mrg 
    497  1.1  mrg /* Mark all the subexpressions of the PARALLEL rtx PAR as
    498  1.1  mrg    frame-related.  Return PAR.
    499  1.1  mrg 
    500  1.1  mrg    dwarf2out.cc:dwarf2out_frame_debug_expr ignores sub-expressions of a
    501  1.1  mrg    PARALLEL rtx other than the first if they do not have the
    502  1.1  mrg    FRAME_RELATED flag set on them.  */
    503  1.1  mrg static rtx
    504  1.1  mrg Fpa (rtx par)
    505  1.1  mrg {
    506  1.1  mrg   int len = XVECLEN (par, 0);
    507  1.1  mrg   int i;
    508  1.1  mrg 
    509  1.1  mrg   for (i = 0; i < len; i++)
    510  1.1  mrg     RTX_FRAME_RELATED_P (XVECEXP (par, 0, i)) = 1;
    511  1.1  mrg 
    512  1.1  mrg   return par;
    513  1.1  mrg }
    514  1.1  mrg 
    515  1.1  mrg /* Output assembly language to FILE for the operation OP with operand size
    516  1.1  mrg    SIZE to adjust the stack pointer.  */
    517  1.1  mrg 
    518  1.1  mrg static void
    519  1.1  mrg h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size)
    520  1.1  mrg {
    521  1.1  mrg   /* If the frame size is 0, we don't have anything to do.  */
    522  1.1  mrg   if (size == 0)
    523  1.1  mrg     return;
    524  1.1  mrg 
    525  1.1  mrg   /* The stack adjustment made here is further optimized by the
    526  1.1  mrg      splitter.  In case of H8/300, the splitter always splits the
    527  1.1  mrg      addition emitted here to make the adjustment interrupt-safe.
    528  1.1  mrg      FIXME: We don't always tag those, because we don't know what
    529  1.1  mrg      the splitter will do.  */
    530  1.1  mrg   if (Pmode == HImode)
    531  1.1  mrg     {
    532  1.1  mrg       rtx_insn *x = emit_insn (gen_addhi3 (stack_pointer_rtx,
    533  1.1  mrg 					   stack_pointer_rtx,
    534  1.1  mrg 					    GEN_INT (sign * size)));
    535  1.1  mrg       if (size < 4)
    536  1.1  mrg         F (x, 0);
    537  1.1  mrg     }
    538  1.1  mrg   else
    539  1.1  mrg     F (emit_insn (gen_addsi3 (stack_pointer_rtx,
    540  1.1  mrg 			      stack_pointer_rtx, GEN_INT (sign * size))), 0);
    541  1.1  mrg }
    542  1.1  mrg 
    543  1.1  mrg /* Round up frame size SIZE.  */
    544  1.1  mrg 
    545  1.1  mrg static HOST_WIDE_INT
    546  1.1  mrg round_frame_size (HOST_WIDE_INT size)
    547  1.1  mrg {
    548  1.1  mrg   return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
    549  1.1  mrg 	  & -STACK_BOUNDARY / BITS_PER_UNIT);
    550  1.1  mrg }
    551  1.1  mrg 
    552  1.1  mrg /* Compute which registers to push/pop.
    553  1.1  mrg    Return a bit vector of registers.  */
    554  1.1  mrg 
    555  1.1  mrg static unsigned int
    556  1.1  mrg compute_saved_regs (void)
    557  1.1  mrg {
    558  1.1  mrg   unsigned int saved_regs = 0;
    559  1.1  mrg   int regno;
    560  1.1  mrg 
    561  1.1  mrg   /* Construct a bit vector of registers to be pushed/popped.  */
    562  1.1  mrg   for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
    563  1.1  mrg     {
    564  1.1  mrg       if (WORD_REG_USED (regno))
    565  1.1  mrg 	saved_regs |= 1 << regno;
    566  1.1  mrg     }
    567  1.1  mrg 
    568  1.1  mrg   /* Don't push/pop the frame pointer as it is treated separately.  */
    569  1.1  mrg   if (frame_pointer_needed)
    570  1.1  mrg     saved_regs &= ~(1 << HARD_FRAME_POINTER_REGNUM);
    571  1.1  mrg 
    572  1.1  mrg   return saved_regs;
    573  1.1  mrg }
    574  1.1  mrg 
    575  1.1  mrg /* Emit an insn to push register RN.  */
    576  1.1  mrg 
    577  1.1  mrg static rtx
    578  1.1  mrg push (int rn)
    579  1.1  mrg {
    580  1.1  mrg   rtx reg = gen_rtx_REG (word_mode, rn);
    581  1.1  mrg   rtx x;
    582  1.1  mrg 
    583  1.1  mrg   if (!TARGET_NORMAL_MODE)
    584  1.1  mrg     x = gen_push_h8300hs_advanced (reg);
    585  1.1  mrg   else
    586  1.1  mrg     x = gen_push_h8300hs_normal (reg);
    587  1.1  mrg   x = F (emit_insn (x), 0);
    588  1.1  mrg   add_reg_note (x, REG_INC, stack_pointer_rtx);
    589  1.1  mrg   return x;
    590  1.1  mrg }
    591  1.1  mrg 
    592  1.1  mrg /* Emit an insn to pop register RN.  */
    593  1.1  mrg 
    594  1.1  mrg static rtx
    595  1.1  mrg pop (int rn)
    596  1.1  mrg {
    597  1.1  mrg   rtx reg = gen_rtx_REG (word_mode, rn);
    598  1.1  mrg   rtx x;
    599  1.1  mrg 
    600  1.1  mrg   if (!TARGET_NORMAL_MODE)
    601  1.1  mrg     x = gen_pop_h8300hs_advanced (reg);
    602  1.1  mrg   else
    603  1.1  mrg     x = gen_pop_h8300hs_normal (reg);
    604  1.1  mrg   x = emit_insn (x);
    605  1.1  mrg   add_reg_note (x, REG_INC, stack_pointer_rtx);
    606  1.1  mrg   return x;
    607  1.1  mrg }
    608  1.1  mrg 
    609  1.1  mrg /* Emit an instruction to push or pop NREGS consecutive registers
    610  1.1  mrg    starting at register REGNO.  POP_P selects a pop rather than a
    611  1.1  mrg    push and RETURN_P is true if the instruction should return.
    612  1.1  mrg 
    613  1.1  mrg    It must be possible to do the requested operation in a single
    614  1.1  mrg    instruction.  If NREGS == 1 && !RETURN_P, use a normal push
    615  1.1  mrg    or pop insn.  Otherwise emit a parallel of the form:
    616  1.1  mrg 
    617  1.1  mrg      (parallel
    618  1.1  mrg        [(return)  ;; if RETURN_P
    619  1.1  mrg 	(save or restore REGNO)
    620  1.1  mrg 	(save or restore REGNO + 1)
    621  1.1  mrg 	...
    622  1.1  mrg 	(save or restore REGNO + NREGS - 1)
    623  1.1  mrg 	(set sp (plus sp (const_int adjust)))]  */
    624  1.1  mrg 
    625  1.1  mrg static void
    626  1.1  mrg h8300_push_pop (int regno, int nregs, bool pop_p, bool return_p)
    627  1.1  mrg {
    628  1.1  mrg   int i, j;
    629  1.1  mrg   rtvec vec;
    630  1.1  mrg   rtx sp, offset, x;
    631  1.1  mrg 
    632  1.1  mrg   /* See whether we can use a simple push or pop.  */
    633  1.1  mrg   if (!return_p && nregs == 1)
    634  1.1  mrg     {
    635  1.1  mrg       if (pop_p)
    636  1.1  mrg 	pop (regno);
    637  1.1  mrg       else
    638  1.1  mrg 	push (regno);
    639  1.1  mrg       return;
    640  1.1  mrg     }
    641  1.1  mrg 
    642  1.1  mrg   /* We need one element for the return insn, if present, one for each
    643  1.1  mrg      register, and one for stack adjustment.  */
    644  1.1  mrg   vec = rtvec_alloc ((return_p ? 1 : 0) + nregs + 1);
    645  1.1  mrg   sp = stack_pointer_rtx;
    646  1.1  mrg   i = 0;
    647  1.1  mrg 
    648  1.1  mrg   /* Add the return instruction.  */
    649  1.1  mrg   if (return_p)
    650  1.1  mrg     {
    651  1.1  mrg       RTVEC_ELT (vec, i) = ret_rtx;
    652  1.1  mrg       i++;
    653  1.1  mrg     }
    654  1.1  mrg 
    655  1.1  mrg   /* Add the register moves.  */
    656  1.1  mrg   for (j = 0; j < nregs; j++)
    657  1.1  mrg     {
    658  1.1  mrg       rtx lhs, rhs;
    659  1.1  mrg 
    660  1.1  mrg       if (pop_p)
    661  1.1  mrg 	{
    662  1.1  mrg 	  /* Register REGNO + NREGS - 1 is popped first.  Before the
    663  1.1  mrg 	     stack adjustment, its slot is at address @sp.  */
    664  1.1  mrg 	  lhs = gen_rtx_REG (SImode, regno + j);
    665  1.1  mrg 	  rhs = gen_rtx_MEM (SImode, plus_constant (Pmode, sp,
    666  1.1  mrg 						    (nregs - j - 1) * 4));
    667  1.1  mrg 	}
    668  1.1  mrg       else
    669  1.1  mrg 	{
    670  1.1  mrg 	  /* Register REGNO is pushed first and will be stored at @(-4,sp).  */
    671  1.1  mrg 	  lhs = gen_rtx_MEM (SImode, plus_constant (Pmode, sp, (j + 1) * -4));
    672  1.1  mrg 	  rhs = gen_rtx_REG (SImode, regno + j);
    673  1.1  mrg 	}
    674  1.1  mrg       RTVEC_ELT (vec, i + j) = gen_rtx_SET (lhs, rhs);
    675  1.1  mrg     }
    676  1.1  mrg 
    677  1.1  mrg   /* Add the stack adjustment.  */
    678  1.1  mrg   offset = GEN_INT ((pop_p ? nregs : -nregs) * 4);
    679  1.1  mrg   RTVEC_ELT (vec, i + j) = gen_rtx_SET (sp, gen_rtx_PLUS (Pmode, sp, offset));
    680  1.1  mrg 
    681  1.1  mrg   x = gen_rtx_PARALLEL (VOIDmode, vec);
    682  1.1  mrg   if (!pop_p)
    683  1.1  mrg     x = Fpa (x);
    684  1.1  mrg 
    685  1.1  mrg   if (return_p)
    686  1.1  mrg     emit_jump_insn (x);
    687  1.1  mrg   else
    688  1.1  mrg     emit_insn (x);
    689  1.1  mrg }
    690  1.1  mrg 
    691  1.1  mrg /* Return true if X has the value sp + OFFSET.  */
    692  1.1  mrg 
    693  1.1  mrg static int
    694  1.1  mrg h8300_stack_offset_p (rtx x, int offset)
    695  1.1  mrg {
    696  1.1  mrg   if (offset == 0)
    697  1.1  mrg     return x == stack_pointer_rtx;
    698  1.1  mrg 
    699  1.1  mrg   return (GET_CODE (x) == PLUS
    700  1.1  mrg 	  && XEXP (x, 0) == stack_pointer_rtx
    701  1.1  mrg 	  && GET_CODE (XEXP (x, 1)) == CONST_INT
    702  1.1  mrg 	  && INTVAL (XEXP (x, 1)) == offset);
    703  1.1  mrg }
    704  1.1  mrg 
    705  1.1  mrg /* A subroutine of h8300_ldm_stm_parallel.  X is one pattern in
    706  1.1  mrg    something that may be an ldm or stm instruction.  If it fits
    707  1.1  mrg    the required template, return the register it loads or stores,
    708  1.1  mrg    otherwise return -1.
    709  1.1  mrg 
    710  1.1  mrg    LOAD_P is true if X should be a load, false if it should be a store.
    711  1.1  mrg    NREGS is the number of registers that the whole instruction is expected
    712  1.1  mrg    to load or store.  INDEX is the index of the register that X should
    713  1.1  mrg    load or store, relative to the lowest-numbered register.  */
    714  1.1  mrg 
    715  1.1  mrg static int
    716  1.1  mrg h8300_ldm_stm_regno (rtx x, int load_p, int index, int nregs)
    717  1.1  mrg {
    718  1.1  mrg   int regindex, memindex, offset;
    719  1.1  mrg 
    720  1.1  mrg   if (load_p)
    721  1.1  mrg     regindex = 0, memindex = 1, offset = (nregs - index - 1) * 4;
    722  1.1  mrg   else
    723  1.1  mrg     memindex = 0, regindex = 1, offset = (index + 1) * -4;
    724  1.1  mrg 
    725  1.1  mrg   if (GET_CODE (x) == SET
    726  1.1  mrg       && GET_CODE (XEXP (x, regindex)) == REG
    727  1.1  mrg       && GET_CODE (XEXP (x, memindex)) == MEM
    728  1.1  mrg       && h8300_stack_offset_p (XEXP (XEXP (x, memindex), 0), offset))
    729  1.1  mrg     return REGNO (XEXP (x, regindex));
    730  1.1  mrg 
    731  1.1  mrg   return -1;
    732  1.1  mrg }
    733  1.1  mrg 
    734  1.1  mrg /* Return true if the elements of VEC starting at FIRST describe an
    735  1.1  mrg    ldm or stm instruction (LOAD_P says which).  */
    736  1.1  mrg 
    737  1.1  mrg int
    738  1.1  mrg h8300_ldm_stm_parallel (rtvec vec, int load_p, int first)
    739  1.1  mrg {
    740  1.1  mrg   rtx last;
    741  1.1  mrg   int nregs, i, regno, adjust;
    742  1.1  mrg 
    743  1.1  mrg   /* There must be a stack adjustment, a register move, and at least one
    744  1.1  mrg      other operation (a return or another register move).  */
    745  1.1  mrg   if (GET_NUM_ELEM (vec) < 3)
    746  1.1  mrg     return false;
    747  1.1  mrg 
    748  1.1  mrg   /* Get the range of registers to be pushed or popped.  */
    749  1.1  mrg   nregs = GET_NUM_ELEM (vec) - first - 1;
    750  1.1  mrg   regno = h8300_ldm_stm_regno (RTVEC_ELT (vec, first), load_p, 0, nregs);
    751  1.1  mrg 
    752  1.1  mrg   /* Check that the call to h8300_ldm_stm_regno succeeded and
    753  1.1  mrg      that we're only dealing with GPRs.  */
    754  1.1  mrg   if (regno < 0 || regno + nregs > 8)
    755  1.1  mrg     return false;
    756  1.1  mrg 
    757  1.1  mrg   /* 2-register h8s instructions must start with an even-numbered register.
    758  1.1  mrg      3- and 4-register instructions must start with er0 or er4.  */
    759  1.1  mrg   if (!TARGET_H8300SX)
    760  1.1  mrg     {
    761  1.1  mrg       if ((regno & 1) != 0)
    762  1.1  mrg 	return false;
    763  1.1  mrg       if (nregs > 2 && (regno & 3) != 0)
    764  1.1  mrg 	return false;
    765  1.1  mrg     }
    766  1.1  mrg 
    767  1.1  mrg   /* Check the other loads or stores.  */
    768  1.1  mrg   for (i = 1; i < nregs; i++)
    769  1.1  mrg     if (h8300_ldm_stm_regno (RTVEC_ELT (vec, first + i), load_p, i, nregs)
    770  1.1  mrg 	!= regno + i)
    771  1.1  mrg       return false;
    772  1.1  mrg 
    773  1.1  mrg   /* Check the stack adjustment.  */
    774  1.1  mrg   last = RTVEC_ELT (vec, first + nregs);
    775  1.1  mrg   adjust = (load_p ? nregs : -nregs) * 4;
    776  1.1  mrg   return (GET_CODE (last) == SET
    777  1.1  mrg 	  && SET_DEST (last) == stack_pointer_rtx
    778  1.1  mrg 	  && h8300_stack_offset_p (SET_SRC (last), adjust));
    779  1.1  mrg }
    780  1.1  mrg 
    781  1.1  mrg /* This is what the stack looks like after the prolog of
    782  1.1  mrg    a function with a frame has been set up:
    783  1.1  mrg 
    784  1.1  mrg    <args>
    785  1.1  mrg    PC
    786  1.1  mrg    FP			<- fp
    787  1.1  mrg    <locals>
    788  1.1  mrg    <saved registers>	<- sp
    789  1.1  mrg 
    790  1.1  mrg    This is what the stack looks like after the prolog of
    791  1.1  mrg    a function which doesn't have a frame:
    792  1.1  mrg 
    793  1.1  mrg    <args>
    794  1.1  mrg    PC
    795  1.1  mrg    <locals>
    796  1.1  mrg    <saved registers>	<- sp
    797  1.1  mrg */
    798  1.1  mrg 
    799  1.1  mrg /* Generate RTL code for the function prologue.  */
    800  1.1  mrg 
    801  1.1  mrg void
    802  1.1  mrg h8300_expand_prologue (void)
    803  1.1  mrg {
    804  1.1  mrg   int regno;
    805  1.1  mrg   int saved_regs;
    806  1.1  mrg   int n_regs;
    807  1.1  mrg 
    808  1.1  mrg   /* If the current function has the OS_Task attribute set, then
    809  1.1  mrg      we have a naked prologue.  */
    810  1.1  mrg   if (h8300_os_task_function_p (current_function_decl))
    811  1.1  mrg     return;
    812  1.1  mrg 
    813  1.1  mrg   if (h8300_monitor_function_p (current_function_decl))
    814  1.1  mrg  /* The monitor function act as normal functions, which means it
    815  1.1  mrg     can accept parameters and return values. In addition to this,
    816  1.1  mrg     interrupts are masked in prologue and return with "rte" in epilogue. */
    817  1.1  mrg     emit_insn (gen_monitor_prologue ());
    818  1.1  mrg 
    819  1.1  mrg   if (frame_pointer_needed)
    820  1.1  mrg     {
    821  1.1  mrg       /* Push fp.  */
    822  1.1  mrg       push (HARD_FRAME_POINTER_REGNUM);
    823  1.1  mrg       F (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx), 0);
    824  1.1  mrg     }
    825  1.1  mrg 
    826  1.1  mrg   /* Push the rest of the registers in ascending order.  */
    827  1.1  mrg   saved_regs = compute_saved_regs ();
    828  1.1  mrg   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno += n_regs)
    829  1.1  mrg     {
    830  1.1  mrg       n_regs = 1;
    831  1.1  mrg       if (saved_regs & (1 << regno))
    832  1.1  mrg 	{
    833  1.1  mrg 	  if (TARGET_H8300S)
    834  1.1  mrg 	    {
    835  1.1  mrg 	      /* See how many registers we can push at the same time.  */
    836  1.1  mrg 	      if ((TARGET_H8300SX || (regno & 3) == 0)
    837  1.1  mrg 		  && ((saved_regs >> regno) & 0x0f) == 0x0f)
    838  1.1  mrg 		n_regs = 4;
    839  1.1  mrg 
    840  1.1  mrg 	      else if ((TARGET_H8300SX || (regno & 3) == 0)
    841  1.1  mrg 		       && ((saved_regs >> regno) & 0x07) == 0x07)
    842  1.1  mrg 		n_regs = 3;
    843  1.1  mrg 
    844  1.1  mrg 	      else if ((TARGET_H8300SX || (regno & 1) == 0)
    845  1.1  mrg 		       && ((saved_regs >> regno) & 0x03) == 0x03)
    846  1.1  mrg 		n_regs = 2;
    847  1.1  mrg 	    }
    848  1.1  mrg 
    849  1.1  mrg 	  h8300_push_pop (regno, n_regs, false, false);
    850  1.1  mrg 	}
    851  1.1  mrg     }
    852  1.1  mrg 
    853  1.1  mrg   /* Leave room for locals.  */
    854  1.1  mrg   h8300_emit_stack_adjustment (-1, round_frame_size (get_frame_size ()));
    855  1.1  mrg 
    856  1.1  mrg   if (flag_stack_usage_info)
    857  1.1  mrg     current_function_static_stack_size
    858  1.1  mrg       = round_frame_size (get_frame_size ())
    859  1.1  mrg       + (__builtin_popcount (saved_regs) * UNITS_PER_WORD)
    860  1.1  mrg       + (frame_pointer_needed ? UNITS_PER_WORD : 0);
    861  1.1  mrg }
    862  1.1  mrg 
    863  1.1  mrg /* Return nonzero if we can use "rts" for the function currently being
    864  1.1  mrg    compiled.  */
    865  1.1  mrg 
    866  1.1  mrg int
    867  1.1  mrg h8300_can_use_return_insn_p (void)
    868  1.1  mrg {
    869  1.1  mrg   return (reload_completed
    870  1.1  mrg 	  && !frame_pointer_needed
    871  1.1  mrg 	  && get_frame_size () == 0
    872  1.1  mrg 	  && compute_saved_regs () == 0);
    873  1.1  mrg }
    874  1.1  mrg 
    875  1.1  mrg /* Generate RTL code for the function epilogue.  */
    876  1.1  mrg 
    877  1.1  mrg void
    878  1.1  mrg h8300_expand_epilogue (bool sibcall_p)
    879  1.1  mrg {
    880  1.1  mrg   int regno;
    881  1.1  mrg   int saved_regs;
    882  1.1  mrg   int n_regs;
    883  1.1  mrg   HOST_WIDE_INT frame_size;
    884  1.1  mrg   bool returned_p;
    885  1.1  mrg 
    886  1.1  mrg   if (h8300_os_task_function_p (current_function_decl))
    887  1.1  mrg     /* OS_Task epilogues are nearly naked -- they just have an
    888  1.1  mrg        rts instruction.  */
    889  1.1  mrg     return;
    890  1.1  mrg 
    891  1.1  mrg   frame_size = round_frame_size (get_frame_size ());
    892  1.1  mrg   returned_p = false;
    893  1.1  mrg 
    894  1.1  mrg   /* Deallocate locals.  */
    895  1.1  mrg   h8300_emit_stack_adjustment (1, frame_size);
    896  1.1  mrg 
    897  1.1  mrg   /* Pop the saved registers in descending order.  */
    898  1.1  mrg   saved_regs = compute_saved_regs ();
    899  1.1  mrg   for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno -= n_regs)
    900  1.1  mrg     {
    901  1.1  mrg       n_regs = 1;
    902  1.1  mrg       if (saved_regs & (1 << regno))
    903  1.1  mrg 	{
    904  1.1  mrg 	  if (TARGET_H8300S)
    905  1.1  mrg 	    {
    906  1.1  mrg 	      /* See how many registers we can pop at the same time.  */
    907  1.1  mrg 	      if ((TARGET_H8300SX || (regno & 3) == 3)
    908  1.1  mrg 		  && ((saved_regs << 3 >> regno) & 0x0f) == 0x0f)
    909  1.1  mrg 		n_regs = 4;
    910  1.1  mrg 
    911  1.1  mrg 	      else if ((TARGET_H8300SX || (regno & 3) == 2)
    912  1.1  mrg 		       && ((saved_regs << 2 >> regno) & 0x07) == 0x07)
    913  1.1  mrg 		n_regs = 3;
    914  1.1  mrg 
    915  1.1  mrg 	      else if ((TARGET_H8300SX || (regno & 1) == 1)
    916  1.1  mrg 		       && ((saved_regs << 1 >> regno) & 0x03) == 0x03)
    917  1.1  mrg 		n_regs = 2;
    918  1.1  mrg 	    }
    919  1.1  mrg 
    920  1.1  mrg 	  /* See if this pop would be the last insn before the return.
    921  1.1  mrg 	     If so, use rte/l or rts/l instead of pop or ldm.l.  */
    922  1.1  mrg 	  if (TARGET_H8300SX
    923  1.1  mrg 	      && !sibcall_p
    924  1.1  mrg 	      && !frame_pointer_needed
    925  1.1  mrg 	      && frame_size == 0
    926  1.1  mrg 	      && (saved_regs & ((1 << (regno - n_regs + 1)) - 1)) == 0)
    927  1.1  mrg 	    returned_p = true;
    928  1.1  mrg 
    929  1.1  mrg 	  h8300_push_pop (regno - n_regs + 1, n_regs, true, returned_p);
    930  1.1  mrg 	}
    931  1.1  mrg     }
    932  1.1  mrg 
    933  1.1  mrg   /* Pop frame pointer if we had one.  */
    934  1.1  mrg   if (frame_pointer_needed)
    935  1.1  mrg     {
    936  1.1  mrg       if (TARGET_H8300SX && !sibcall_p)
    937  1.1  mrg 	returned_p = true;
    938  1.1  mrg       h8300_push_pop (HARD_FRAME_POINTER_REGNUM, 1, true, returned_p);
    939  1.1  mrg     }
    940  1.1  mrg 
    941  1.1  mrg   if (!returned_p && !sibcall_p)
    942  1.1  mrg     emit_jump_insn (ret_rtx);
    943  1.1  mrg }
    944  1.1  mrg 
    945  1.1  mrg /* Return nonzero if the current function is an interrupt
    946  1.1  mrg    function.  */
    947  1.1  mrg 
    948  1.1  mrg int
    949  1.1  mrg h8300_current_function_interrupt_function_p (void)
    950  1.1  mrg {
    951  1.1  mrg   return (h8300_interrupt_function_p (current_function_decl));
    952  1.1  mrg }
    953  1.1  mrg 
    954  1.1  mrg int
    955  1.1  mrg h8300_current_function_monitor_function_p ()
    956  1.1  mrg {
    957  1.1  mrg   return (h8300_monitor_function_p (current_function_decl));
    958  1.1  mrg }
    959  1.1  mrg 
    960  1.1  mrg /* Output assembly code for the start of the file.  */
    961  1.1  mrg 
    962  1.1  mrg static void
    963  1.1  mrg h8300_file_start (void)
    964  1.1  mrg {
    965  1.1  mrg   default_file_start ();
    966  1.1  mrg 
    967  1.1  mrg   if (TARGET_H8300SX)
    968  1.1  mrg     fputs (TARGET_NORMAL_MODE ? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file);
    969  1.1  mrg   else if (TARGET_H8300S)
    970  1.1  mrg     fputs (TARGET_NORMAL_MODE ? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file);
    971  1.1  mrg   else if (TARGET_H8300H)
    972  1.1  mrg     fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
    973  1.1  mrg }
    974  1.1  mrg 
    975  1.1  mrg /* Output assembly language code for the end of file.  */
    976  1.1  mrg 
    977  1.1  mrg static void
    978  1.1  mrg h8300_file_end (void)
    979  1.1  mrg {
    980  1.1  mrg   fputs ("\t.end\n", asm_out_file);
    981  1.1  mrg }
    982  1.1  mrg 
    983  1.1  mrg /* Split an add of a small constant into two adds/subs insns.
    985  1.1  mrg 
    986  1.1  mrg    If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
    987  1.1  mrg    instead of adds/subs.  */
    988  1.1  mrg 
    989  1.1  mrg void
    990  1.1  mrg split_adds_subs (machine_mode mode, rtx *operands)
    991  1.1  mrg {
    992  1.1  mrg   HOST_WIDE_INT val = INTVAL (operands[1]);
    993  1.1  mrg   rtx reg = operands[0];
    994  1.1  mrg   HOST_WIDE_INT sign = 1;
    995  1.1  mrg   HOST_WIDE_INT amount;
    996  1.1  mrg   rtx (*gen_add) (rtx, rtx, rtx);
    997  1.1  mrg 
    998  1.1  mrg   /* Force VAL to be positive so that we do not have to consider the
    999  1.1  mrg      sign.  */
   1000  1.1  mrg   if (val < 0)
   1001  1.1  mrg     {
   1002  1.1  mrg       val = -val;
   1003  1.1  mrg       sign = -1;
   1004  1.1  mrg     }
   1005  1.1  mrg 
   1006  1.1  mrg   switch (mode)
   1007  1.1  mrg     {
   1008  1.1  mrg     case E_HImode:
   1009  1.1  mrg       gen_add = gen_addhi3;
   1010  1.1  mrg       break;
   1011  1.1  mrg 
   1012  1.1  mrg     case E_SImode:
   1013  1.1  mrg       gen_add = gen_addsi3;
   1014  1.1  mrg       break;
   1015  1.1  mrg 
   1016  1.1  mrg     default:
   1017  1.1  mrg       gcc_unreachable ();
   1018  1.1  mrg     }
   1019  1.1  mrg 
   1020  1.1  mrg   /* Try different amounts in descending order.  */
   1021  1.1  mrg   for (amount = 4; amount > 0; amount /= 2)
   1022  1.1  mrg     {
   1023  1.1  mrg       for (; val >= amount; val -= amount)
   1024  1.1  mrg 	emit_insn (gen_add (reg, reg, GEN_INT (sign * amount)));
   1025  1.1  mrg     }
   1026  1.1  mrg 
   1027  1.1  mrg   return;
   1028  1.1  mrg }
   1029  1.1  mrg 
   1030  1.1  mrg /* Handle machine specific pragmas for compatibility with existing
   1031  1.1  mrg    compilers for the H8/300.
   1032  1.1  mrg 
   1033  1.1  mrg    pragma saveall generates prologue/epilogue code which saves and
   1034  1.1  mrg    restores all the registers on function entry.
   1035  1.1  mrg 
   1036  1.1  mrg    pragma interrupt saves and restores all registers, and exits with
   1037  1.1  mrg    an rte instruction rather than an rts.  A pointer to a function
   1038  1.1  mrg    with this attribute may be safely used in an interrupt vector.  */
   1039  1.1  mrg 
   1040  1.1  mrg void
   1041  1.1  mrg h8300_pr_interrupt (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
   1042  1.1  mrg {
   1043  1.1  mrg   pragma_interrupt = 1;
   1044  1.1  mrg }
   1045  1.1  mrg 
   1046  1.1  mrg void
   1047  1.1  mrg h8300_pr_saveall (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
   1048  1.1  mrg {
   1049  1.1  mrg   pragma_saveall = 1;
   1050  1.1  mrg }
   1051  1.1  mrg 
   1052  1.1  mrg /* If the next function argument ARG is to be passed in a register, return
   1053  1.1  mrg    a reg RTX for the hard register in which to pass the argument.  CUM
   1054  1.1  mrg    represents the state after the last argument.  If the argument is to
   1055  1.1  mrg    be pushed, NULL_RTX is returned.
   1056  1.1  mrg 
   1057  1.1  mrg    On the H8/300 all normal args are pushed, unless -mquickcall in which
   1058  1.1  mrg    case the first 3 arguments are passed in registers.  */
   1059  1.1  mrg 
   1060  1.1  mrg static rtx
   1061  1.1  mrg h8300_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
   1062  1.1  mrg {
   1063  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1064  1.1  mrg 
   1065  1.1  mrg   static const char *const hand_list[] = {
   1066  1.1  mrg     "__main",
   1067  1.1  mrg     "__cmpsi2",
   1068  1.1  mrg     "__divhi3",
   1069  1.1  mrg     "__modhi3",
   1070  1.1  mrg     "__udivhi3",
   1071  1.1  mrg     "__umodhi3",
   1072  1.1  mrg     "__divsi3",
   1073  1.1  mrg     "__modsi3",
   1074  1.1  mrg     "__udivsi3",
   1075  1.1  mrg     "__umodsi3",
   1076  1.1  mrg     "__mulhi3",
   1077  1.1  mrg     "__mulsi3",
   1078  1.1  mrg     "__reg_memcpy",
   1079  1.1  mrg     "__reg_memset",
   1080  1.1  mrg     "__ucmpsi2",
   1081  1.1  mrg     0,
   1082  1.1  mrg   };
   1083  1.1  mrg 
   1084  1.1  mrg   rtx result = NULL_RTX;
   1085  1.1  mrg   const char *fname;
   1086  1.1  mrg   int regpass = 0;
   1087  1.1  mrg 
   1088  1.1  mrg   /* Never pass unnamed arguments in registers.  */
   1089  1.1  mrg   if (!arg.named)
   1090  1.1  mrg     return NULL_RTX;
   1091  1.1  mrg 
   1092  1.1  mrg   /* Pass 3 regs worth of data in regs when user asked on the command line.  */
   1093  1.1  mrg   if (TARGET_QUICKCALL)
   1094  1.1  mrg     regpass = 3;
   1095  1.1  mrg 
   1096  1.1  mrg   /* If calling hand written assembler, use 4 regs of args.  */
   1097  1.1  mrg   if (cum->libcall)
   1098  1.1  mrg     {
   1099  1.1  mrg       const char * const *p;
   1100  1.1  mrg 
   1101  1.1  mrg       fname = XSTR (cum->libcall, 0);
   1102  1.1  mrg 
   1103  1.1  mrg       /* See if this libcall is one of the hand coded ones.  */
   1104  1.1  mrg       for (p = hand_list; *p && strcmp (*p, fname) != 0; p++)
   1105  1.1  mrg 	;
   1106  1.1  mrg 
   1107  1.1  mrg       if (*p)
   1108  1.1  mrg 	regpass = 4;
   1109  1.1  mrg     }
   1110  1.1  mrg 
   1111  1.1  mrg   if (regpass)
   1112  1.1  mrg     {
   1113  1.1  mrg       int size = arg.promoted_size_in_bytes ();
   1114  1.1  mrg       if (size + cum->nbytes <= regpass * UNITS_PER_WORD
   1115  1.1  mrg 	  && cum->nbytes / UNITS_PER_WORD <= 3)
   1116  1.1  mrg 	result = gen_rtx_REG (arg.mode, cum->nbytes / UNITS_PER_WORD);
   1117  1.1  mrg     }
   1118  1.1  mrg 
   1119  1.1  mrg   return result;
   1120  1.1  mrg }
   1121  1.1  mrg 
   1122  1.1  mrg /* Update the data in CUM to advance over argument ARG.  */
   1123  1.1  mrg 
   1124  1.1  mrg static void
   1125  1.1  mrg h8300_function_arg_advance (cumulative_args_t cum_v,
   1126  1.1  mrg 			    const function_arg_info &arg)
   1127  1.1  mrg {
   1128  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   1129  1.1  mrg 
   1130  1.1  mrg   cum->nbytes += ((arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1)
   1131  1.1  mrg 		  & -UNITS_PER_WORD);
   1132  1.1  mrg }
   1133  1.1  mrg 
   1134  1.1  mrg 
   1135  1.1  mrg /* Implements TARGET_REGISTER_MOVE_COST.
   1137  1.1  mrg 
   1138  1.1  mrg    Any SI register-to-register move may need to be reloaded,
   1139  1.1  mrg    so inmplement h8300_register_move_cost to return > 2 so that reload never
   1140  1.1  mrg    shortcuts.  */
   1141  1.1  mrg 
   1142  1.1  mrg static int
   1143  1.1  mrg h8300_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
   1144  1.1  mrg                          reg_class_t from, reg_class_t to)
   1145  1.1  mrg {
   1146  1.1  mrg   if (from == MAC_REGS || to == MAC_REG)
   1147  1.1  mrg     return 6;
   1148  1.1  mrg   else
   1149  1.1  mrg     return 3;
   1150  1.1  mrg }
   1151  1.1  mrg 
   1152  1.1  mrg /* Compute the cost of an and insn.  */
   1153  1.1  mrg 
   1154  1.1  mrg static int
   1155  1.1  mrg h8300_and_costs (rtx x)
   1156  1.1  mrg {
   1157  1.1  mrg   rtx operands[4];
   1158  1.1  mrg 
   1159  1.1  mrg   if (GET_MODE (x) == QImode)
   1160  1.1  mrg     return 1;
   1161  1.1  mrg 
   1162  1.1  mrg   if (GET_MODE (x) != HImode
   1163  1.1  mrg       && GET_MODE (x) != SImode)
   1164  1.1  mrg     return 100;
   1165  1.1  mrg 
   1166  1.1  mrg   operands[0] = NULL;
   1167  1.1  mrg   operands[1] = XEXP (x, 0);
   1168  1.1  mrg   operands[2] = XEXP (x, 1);
   1169  1.1  mrg   operands[3] = x;
   1170  1.1  mrg   return compute_logical_op_length (GET_MODE (x), AND, operands, NULL) / 2;
   1171  1.1  mrg }
   1172  1.1  mrg 
   1173  1.1  mrg /* Compute the cost of a shift insn.  */
   1174  1.1  mrg 
   1175  1.1  mrg static int
   1176  1.1  mrg h8300_shift_costs (rtx x)
   1177  1.1  mrg {
   1178  1.1  mrg   rtx operands[3];
   1179  1.1  mrg 
   1180  1.1  mrg   if (GET_MODE (x) != QImode
   1181  1.1  mrg       && GET_MODE (x) != HImode
   1182  1.1  mrg       && GET_MODE (x) != SImode)
   1183  1.1  mrg     return 100;
   1184  1.1  mrg 
   1185  1.1  mrg   operands[0] = gen_rtx_REG (GET_MODE (x), 0);
   1186  1.1  mrg   operands[1] = NULL;
   1187  1.1  mrg   operands[2] = XEXP (x, 1);
   1188  1.1  mrg   return compute_a_shift_length (operands, GET_CODE (x)) / 2;
   1189  1.1  mrg }
   1190  1.1  mrg 
   1191  1.1  mrg /* Worker function for TARGET_RTX_COSTS.  */
   1192  1.1  mrg 
   1193  1.1  mrg static bool
   1194  1.1  mrg h8300_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code,
   1195  1.1  mrg 		 int opno ATTRIBUTE_UNUSED, int *total, bool speed)
   1196  1.1  mrg {
   1197  1.1  mrg   int code = GET_CODE (x);
   1198  1.1  mrg 
   1199  1.1  mrg   if (TARGET_H8300SX && outer_code == MEM)
   1200  1.1  mrg     {
   1201  1.1  mrg       /* Estimate the number of execution states needed to calculate
   1202  1.1  mrg 	 the address.  */
   1203  1.1  mrg       if (register_operand (x, VOIDmode)
   1204  1.1  mrg 	  || GET_CODE (x) == POST_INC
   1205  1.1  mrg 	  || GET_CODE (x) == POST_DEC
   1206  1.1  mrg 	  || CONSTANT_P (x))
   1207  1.1  mrg 	*total = 0;
   1208  1.1  mrg       else
   1209  1.1  mrg 	*total = COSTS_N_INSNS (1);
   1210  1.1  mrg       return true;
   1211  1.1  mrg     }
   1212  1.1  mrg 
   1213  1.1  mrg   switch (code)
   1214  1.1  mrg     {
   1215  1.1  mrg     case CONST_INT:
   1216  1.1  mrg       {
   1217  1.1  mrg 	HOST_WIDE_INT n = INTVAL (x);
   1218  1.1  mrg 
   1219  1.1  mrg 	if (TARGET_H8300SX)
   1220  1.1  mrg 	  {
   1221  1.1  mrg 	    /* Constant operands need the same number of processor
   1222  1.1  mrg 	       states as register operands.  Although we could try to
   1223  1.1  mrg 	       use a size-based cost for !speed, the lack of
   1224  1.1  mrg 	       of a mode makes the results very unpredictable.  */
   1225  1.1  mrg 	    *total = 0;
   1226  1.1  mrg 	    return true;
   1227  1.1  mrg 	  }
   1228  1.1  mrg 	if (n >= -4 && n <= 4)
   1229  1.1  mrg 	  {
   1230  1.1  mrg 	    switch ((int) n)
   1231  1.1  mrg 	      {
   1232  1.1  mrg 	      case 0:
   1233  1.1  mrg 		*total = 0;
   1234  1.1  mrg 		return true;
   1235  1.1  mrg 	      case 1:
   1236  1.1  mrg 	      case 2:
   1237  1.1  mrg 	      case -1:
   1238  1.1  mrg 	      case -2:
   1239  1.1  mrg 		*total = 0 + (outer_code == SET);
   1240  1.1  mrg 		return true;
   1241  1.1  mrg 	      case 4:
   1242  1.1  mrg 	      case -4:
   1243  1.1  mrg 		*total = 0 + (outer_code == SET);
   1244  1.1  mrg 		return true;
   1245  1.1  mrg 	      }
   1246  1.1  mrg 	  }
   1247  1.1  mrg 	*total = 1;
   1248  1.1  mrg 	return true;
   1249  1.1  mrg       }
   1250  1.1  mrg 
   1251  1.1  mrg     case CONST:
   1252  1.1  mrg     case LABEL_REF:
   1253  1.1  mrg     case SYMBOL_REF:
   1254  1.1  mrg       if (TARGET_H8300SX)
   1255  1.1  mrg 	{
   1256  1.1  mrg 	  /* See comment for CONST_INT.  */
   1257  1.1  mrg 	  *total = 0;
   1258  1.1  mrg 	  return true;
   1259  1.1  mrg 	}
   1260  1.1  mrg       *total = 3;
   1261  1.1  mrg       return true;
   1262  1.1  mrg 
   1263  1.1  mrg     case CONST_DOUBLE:
   1264  1.1  mrg       *total = 20;
   1265  1.1  mrg       return true;
   1266  1.1  mrg 
   1267  1.1  mrg     case COMPARE:
   1268  1.1  mrg     case NE:
   1269  1.1  mrg     case EQ:
   1270  1.1  mrg     case GE:
   1271  1.1  mrg     case GT:
   1272  1.1  mrg     case LE:
   1273  1.1  mrg     case LT:
   1274  1.1  mrg     case GEU:
   1275  1.1  mrg     case GTU:
   1276  1.1  mrg     case LEU:
   1277  1.1  mrg     case LTU:
   1278  1.1  mrg       if (XEXP (x, 1) == const0_rtx)
   1279  1.1  mrg 	*total = 0;
   1280  1.1  mrg       return false;
   1281  1.1  mrg 
   1282  1.1  mrg     case AND:
   1283  1.1  mrg       if (!h8300_dst_operand (XEXP (x, 0), VOIDmode)
   1284  1.1  mrg 	  || !h8300_src_operand (XEXP (x, 1), VOIDmode))
   1285  1.1  mrg 	return false;
   1286  1.1  mrg       *total = COSTS_N_INSNS (h8300_and_costs (x));
   1287  1.1  mrg       return true;
   1288  1.1  mrg 
   1289  1.1  mrg     /* We say that MOD and DIV are so expensive because otherwise we'll
   1290  1.1  mrg        generate some really horrible code for division of a power of two.  */
   1291  1.1  mrg     case MOD:
   1292  1.1  mrg     case DIV:
   1293  1.1  mrg     case UMOD:
   1294  1.1  mrg     case UDIV:
   1295  1.1  mrg       if (TARGET_H8300SX)
   1296  1.1  mrg 	switch (GET_MODE (x))
   1297  1.1  mrg 	  {
   1298  1.1  mrg 	  case E_QImode:
   1299  1.1  mrg 	  case E_HImode:
   1300  1.1  mrg 	    *total = COSTS_N_INSNS (!speed ? 4 : 10);
   1301  1.1  mrg 	    return false;
   1302  1.1  mrg 
   1303  1.1  mrg 	  case E_SImode:
   1304  1.1  mrg 	    *total = COSTS_N_INSNS (!speed ? 4 : 18);
   1305  1.1  mrg 	    return false;
   1306  1.1  mrg 
   1307  1.1  mrg 	  default:
   1308  1.1  mrg 	    break;
   1309  1.1  mrg 	  }
   1310  1.1  mrg       *total = COSTS_N_INSNS (12);
   1311  1.1  mrg       return true;
   1312  1.1  mrg 
   1313  1.1  mrg     case MULT:
   1314  1.1  mrg       if (TARGET_H8300SX)
   1315  1.1  mrg 	switch (GET_MODE (x))
   1316  1.1  mrg 	  {
   1317  1.1  mrg 	  case E_QImode:
   1318  1.1  mrg 	  case E_HImode:
   1319  1.1  mrg 	    *total = COSTS_N_INSNS (2);
   1320  1.1  mrg 	    return false;
   1321  1.1  mrg 
   1322  1.1  mrg 	  case E_SImode:
   1323  1.1  mrg 	    *total = COSTS_N_INSNS (5);
   1324  1.1  mrg 	    return false;
   1325  1.1  mrg 
   1326  1.1  mrg 	  default:
   1327  1.1  mrg 	    break;
   1328  1.1  mrg 	  }
   1329  1.1  mrg       *total = COSTS_N_INSNS (4);
   1330  1.1  mrg       return true;
   1331  1.1  mrg 
   1332  1.1  mrg     case ASHIFT:
   1333  1.1  mrg     case ASHIFTRT:
   1334  1.1  mrg     case LSHIFTRT:
   1335  1.1  mrg       if (h8sx_binary_shift_operator (x, VOIDmode))
   1336  1.1  mrg 	{
   1337  1.1  mrg 	  *total = COSTS_N_INSNS (2);
   1338  1.1  mrg 	  return false;
   1339  1.1  mrg 	}
   1340  1.1  mrg       else if (h8sx_unary_shift_operator (x, VOIDmode))
   1341  1.1  mrg 	{
   1342  1.1  mrg 	  *total = COSTS_N_INSNS (1);
   1343  1.1  mrg 	  return false;
   1344  1.1  mrg 	}
   1345  1.1  mrg       *total = COSTS_N_INSNS (h8300_shift_costs (x));
   1346  1.1  mrg       return true;
   1347  1.1  mrg 
   1348  1.1  mrg     case ROTATE:
   1349  1.1  mrg     case ROTATERT:
   1350  1.1  mrg       if (GET_MODE (x) == HImode)
   1351  1.1  mrg 	*total = 2;
   1352  1.1  mrg       else
   1353  1.1  mrg 	*total = 8;
   1354  1.1  mrg       return true;
   1355  1.1  mrg 
   1356  1.1  mrg     default:
   1357  1.1  mrg       *total = COSTS_N_INSNS (1);
   1358  1.1  mrg       return false;
   1359  1.1  mrg     }
   1360  1.1  mrg }
   1361  1.1  mrg 
   1362  1.1  mrg /* Documentation for the machine specific operand escapes:
   1364  1.1  mrg 
   1365  1.1  mrg    'E' like s but negative.
   1366  1.1  mrg    'F' like t but negative.
   1367  1.1  mrg    'G' constant just the negative
   1368  1.1  mrg    'R' print operand as a byte:8 address if appropriate, else fall back to
   1369  1.1  mrg        'X' handling.
   1370  1.1  mrg    'S' print operand as a long word
   1371  1.1  mrg    'T' print operand as a word
   1372  1.1  mrg    'V' find the set bit, and print its number.
   1373  1.1  mrg    'W' find the clear bit, and print its number.
   1374  1.1  mrg    'X' print operand as a byte
   1375  1.1  mrg    'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
   1376  1.1  mrg        If this operand isn't a register, fall back to 'R' handling.
   1377  1.1  mrg    'Z' print int & 7.
   1378  1.1  mrg    'c' print the opcode corresponding to rtl
   1379  1.1  mrg    'e' first word of 32-bit value - if reg, then least reg. if mem
   1380  1.1  mrg        then least. if const then most sig word
   1381  1.1  mrg    'f' second word of 32-bit value - if reg, then biggest reg. if mem
   1382  1.1  mrg        then +2. if const then least sig word
   1383  1.1  mrg    'j' print operand as condition code.
   1384  1.1  mrg    'k' print operand as reverse condition code.
   1385  1.1  mrg    'm' convert an integer operand to a size suffix (.b, .w or .l)
   1386  1.1  mrg    'o' print an integer without a leading '#'
   1387  1.1  mrg    's' print as low byte of 16-bit value
   1388  1.1  mrg    't' print as high byte of 16-bit value
   1389  1.1  mrg    'w' print as low byte of 32-bit value
   1390  1.1  mrg    'x' print as 2nd byte of 32-bit value
   1391  1.1  mrg    'y' print as 3rd byte of 32-bit value
   1392  1.1  mrg    'z' print as msb of 32-bit value
   1393  1.1  mrg */
   1394  1.1  mrg 
   1395  1.1  mrg /* Return assembly language string which identifies a comparison type.  */
   1396  1.1  mrg 
   1397  1.1  mrg static const char *
   1398  1.1  mrg cond_string (enum rtx_code code)
   1399  1.1  mrg {
   1400  1.1  mrg   switch (code)
   1401  1.1  mrg     {
   1402  1.1  mrg     case NE:
   1403  1.1  mrg       return "ne";
   1404  1.1  mrg     case EQ:
   1405  1.1  mrg       return "eq";
   1406  1.1  mrg     case GE:
   1407  1.1  mrg       return "ge";
   1408  1.1  mrg     case GT:
   1409  1.1  mrg       return "gt";
   1410  1.1  mrg     case LE:
   1411  1.1  mrg       return "le";
   1412  1.1  mrg     case LT:
   1413  1.1  mrg       return "lt";
   1414  1.1  mrg     case GEU:
   1415  1.1  mrg       return "hs";
   1416  1.1  mrg     case GTU:
   1417  1.1  mrg       return "hi";
   1418  1.1  mrg     case LEU:
   1419  1.1  mrg       return "ls";
   1420  1.1  mrg     case LTU:
   1421  1.1  mrg       return "lo";
   1422  1.1  mrg     default:
   1423  1.1  mrg       gcc_unreachable ();
   1424  1.1  mrg     }
   1425  1.1  mrg }
   1426  1.1  mrg 
   1427  1.1  mrg /* Print operand X using operand code CODE to assembly language output file
   1428  1.1  mrg    FILE.  */
   1429  1.1  mrg 
   1430  1.1  mrg static void
   1431  1.1  mrg h8300_print_operand (FILE *file, rtx x, int code)
   1432  1.1  mrg {
   1433  1.1  mrg   /* This is used for communication between codes V,W,Z and Y.  */
   1434  1.1  mrg   static int bitint;
   1435  1.1  mrg 
   1436  1.1  mrg   switch (code)
   1437  1.1  mrg     {
   1438  1.1  mrg     case 'C':
   1439  1.1  mrg       if (h8300_constant_length (x) == 2)
   1440  1.1  mrg        fprintf (file, ":16");
   1441  1.1  mrg       else
   1442  1.1  mrg        fprintf (file, ":32");
   1443  1.1  mrg       return;
   1444  1.1  mrg     case 'E':
   1445  1.1  mrg       switch (GET_CODE (x))
   1446  1.1  mrg 	{
   1447  1.1  mrg 	case REG:
   1448  1.1  mrg 	  fprintf (file, "%sl", names_big[REGNO (x)]);
   1449  1.1  mrg 	  break;
   1450  1.1  mrg 	case CONST_INT:
   1451  1.1  mrg 	  fprintf (file, "#%ld", (-INTVAL (x)) & 0xff);
   1452  1.1  mrg 	  break;
   1453  1.1  mrg 	default:
   1454  1.1  mrg 	  gcc_unreachable ();
   1455  1.1  mrg 	}
   1456  1.1  mrg       break;
   1457  1.1  mrg     case 'F':
   1458  1.1  mrg       switch (GET_CODE (x))
   1459  1.1  mrg 	{
   1460  1.1  mrg 	case REG:
   1461  1.1  mrg 	  fprintf (file, "%sh", names_big[REGNO (x)]);
   1462  1.1  mrg 	  break;
   1463  1.1  mrg 	case CONST_INT:
   1464  1.1  mrg 	  fprintf (file, "#%ld", ((-INTVAL (x)) & 0xff00) >> 8);
   1465  1.1  mrg 	  break;
   1466  1.1  mrg 	default:
   1467  1.1  mrg 	  gcc_unreachable ();
   1468  1.1  mrg 	}
   1469  1.1  mrg       break;
   1470  1.1  mrg     case 'G':
   1471  1.1  mrg       gcc_assert (GET_CODE (x) == CONST_INT);
   1472  1.1  mrg       fprintf (file, "#%ld", 0xff & (-INTVAL (x)));
   1473  1.1  mrg       break;
   1474  1.1  mrg     case 'S':
   1475  1.1  mrg       if (GET_CODE (x) == REG)
   1476  1.1  mrg 	fprintf (file, "%s", names_extended[REGNO (x)]);
   1477  1.1  mrg       else
   1478  1.1  mrg 	goto def;
   1479  1.1  mrg       break;
   1480  1.1  mrg     case 'T':
   1481  1.1  mrg       if (GET_CODE (x) == REG)
   1482  1.1  mrg 	fprintf (file, "%s", names_big[REGNO (x)]);
   1483  1.1  mrg       else
   1484  1.1  mrg 	goto def;
   1485  1.1  mrg       break;
   1486  1.1  mrg     case 'V':
   1487  1.1  mrg       bitint = (INTVAL (x) & 0xffff);
   1488  1.1  mrg       if ((exact_log2 ((bitint >> 8) & 0xff)) == -1)
   1489  1.1  mrg 	bitint = exact_log2 (bitint & 0xff);
   1490  1.1  mrg       else
   1491  1.1  mrg         bitint = exact_log2 ((bitint >> 8) & 0xff);
   1492  1.1  mrg       gcc_assert (bitint >= 0);
   1493  1.1  mrg       fprintf (file, "#%d", bitint);
   1494  1.1  mrg       break;
   1495  1.1  mrg     case 'W':
   1496  1.1  mrg       bitint = ((~INTVAL (x)) & 0xffff);
   1497  1.1  mrg       if ((exact_log2 ((bitint >> 8) & 0xff)) == -1 )
   1498  1.1  mrg 	bitint = exact_log2 (bitint & 0xff);
   1499  1.1  mrg       else
   1500  1.1  mrg 	bitint = (exact_log2 ((bitint >> 8) & 0xff));
   1501  1.1  mrg       gcc_assert (bitint >= 0);
   1502  1.1  mrg       fprintf (file, "#%d", bitint);
   1503  1.1  mrg       break;
   1504  1.1  mrg     case 'R':
   1505  1.1  mrg     case 'X':
   1506  1.1  mrg       if (GET_CODE (x) == REG)
   1507  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 0));
   1508  1.1  mrg       else
   1509  1.1  mrg 	goto def;
   1510  1.1  mrg       break;
   1511  1.1  mrg     case 'Y':
   1512  1.1  mrg       gcc_assert (bitint >= 0);
   1513  1.1  mrg       if (GET_CODE (x) == REG)
   1514  1.1  mrg 	fprintf (file, "%s%c", names_big[REGNO (x)], bitint > 7 ? 'h' : 'l');
   1515  1.1  mrg       else
   1516  1.1  mrg 	h8300_print_operand (file, x, 'R');
   1517  1.1  mrg       bitint = -1;
   1518  1.1  mrg       break;
   1519  1.1  mrg     case 'Z':
   1520  1.1  mrg       bitint = INTVAL (x);
   1521  1.1  mrg       fprintf (file, "#%d", bitint & 7);
   1522  1.1  mrg       break;
   1523  1.1  mrg     case 'c':
   1524  1.1  mrg       switch (GET_CODE (x))
   1525  1.1  mrg 	{
   1526  1.1  mrg 	case IOR:
   1527  1.1  mrg 	  fprintf (file, "or");
   1528  1.1  mrg 	  break;
   1529  1.1  mrg 	case XOR:
   1530  1.1  mrg 	  fprintf (file, "xor");
   1531  1.1  mrg 	  break;
   1532  1.1  mrg 	case AND:
   1533  1.1  mrg 	  fprintf (file, "and");
   1534  1.1  mrg 	  break;
   1535  1.1  mrg 	default:
   1536  1.1  mrg 	  break;
   1537  1.1  mrg 	}
   1538  1.1  mrg       break;
   1539  1.1  mrg     case 'e':
   1540  1.1  mrg       switch (GET_CODE (x))
   1541  1.1  mrg 	{
   1542  1.1  mrg 	case REG:
   1543  1.1  mrg 	  fprintf (file, "%s", names_upper_extended[REGNO (x)]);
   1544  1.1  mrg 	  break;
   1545  1.1  mrg 	case MEM:
   1546  1.1  mrg 	  h8300_print_operand (file, x, 0);
   1547  1.1  mrg 	  break;
   1548  1.1  mrg 	case CONST_INT:
   1549  1.1  mrg 	  fprintf (file, "#%ld", ((INTVAL (x) >> 16) & 0xffff));
   1550  1.1  mrg 	  break;
   1551  1.1  mrg 	case CONST_DOUBLE:
   1552  1.1  mrg 	  {
   1553  1.1  mrg 	    long val;
   1554  1.1  mrg 	    REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
   1555  1.1  mrg 	    fprintf (file, "#%ld", ((val >> 16) & 0xffff));
   1556  1.1  mrg 	    break;
   1557  1.1  mrg 	  }
   1558  1.1  mrg 	default:
   1559  1.1  mrg 	  gcc_unreachable ();
   1560  1.1  mrg 	  break;
   1561  1.1  mrg 	}
   1562  1.1  mrg       break;
   1563  1.1  mrg     case 'f':
   1564  1.1  mrg       switch (GET_CODE (x))
   1565  1.1  mrg 	{
   1566  1.1  mrg 	case REG:
   1567  1.1  mrg 	  fprintf (file, "%s", names_big[REGNO (x)]);
   1568  1.1  mrg 	  break;
   1569  1.1  mrg 	case MEM:
   1570  1.1  mrg 	  x = adjust_address (x, HImode, 2);
   1571  1.1  mrg 	  h8300_print_operand (file, x, 0);
   1572  1.1  mrg 	  break;
   1573  1.1  mrg 	case CONST_INT:
   1574  1.1  mrg 	  fprintf (file, "#%ld", INTVAL (x) & 0xffff);
   1575  1.1  mrg 	  break;
   1576  1.1  mrg 	case CONST_DOUBLE:
   1577  1.1  mrg 	  {
   1578  1.1  mrg 	    long val;
   1579  1.1  mrg 	    REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
   1580  1.1  mrg 	    fprintf (file, "#%ld", (val & 0xffff));
   1581  1.1  mrg 	    break;
   1582  1.1  mrg 	  }
   1583  1.1  mrg 	default:
   1584  1.1  mrg 	  gcc_unreachable ();
   1585  1.1  mrg 	}
   1586  1.1  mrg       break;
   1587  1.1  mrg     case 'j':
   1588  1.1  mrg       if (GET_CODE (x) == LT && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
   1589  1.1  mrg 	fputs ("mi", file);
   1590  1.1  mrg       else if (GET_CODE (x) == GE && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
   1591  1.1  mrg 	fputs ("pl", file);
   1592  1.1  mrg       else
   1593  1.1  mrg 	fputs (cond_string (GET_CODE (x)), file);
   1594  1.1  mrg       break;
   1595  1.1  mrg     case 'k':
   1596  1.1  mrg       if (GET_CODE (x) == LT && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
   1597  1.1  mrg 	fputs ("pl", file);
   1598  1.1  mrg       else if (GET_CODE (x) == GE && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
   1599  1.1  mrg 	fputs ("mi", file);
   1600  1.1  mrg       else
   1601  1.1  mrg 	fputs (cond_string (reverse_condition (GET_CODE (x))), file);
   1602  1.1  mrg       break;
   1603  1.1  mrg     case 'm':
   1604  1.1  mrg       gcc_assert (GET_CODE (x) == CONST_INT);
   1605  1.1  mrg       switch (INTVAL (x))
   1606  1.1  mrg 	{
   1607  1.1  mrg 	case 1:
   1608  1.1  mrg 	  fputs (".b", file);
   1609  1.1  mrg 	  break;
   1610  1.1  mrg 
   1611  1.1  mrg 	case 2:
   1612  1.1  mrg 	  fputs (".w", file);
   1613  1.1  mrg 	  break;
   1614  1.1  mrg 
   1615  1.1  mrg 	case 4:
   1616  1.1  mrg 	  fputs (".l", file);
   1617  1.1  mrg 	  break;
   1618  1.1  mrg 
   1619  1.1  mrg 	default:
   1620  1.1  mrg 	  gcc_unreachable ();
   1621  1.1  mrg 	}
   1622  1.1  mrg       break;
   1623  1.1  mrg     case 'o':
   1624  1.1  mrg       h8300_print_operand_address (file, VOIDmode, x);
   1625  1.1  mrg       break;
   1626  1.1  mrg     case 's':
   1627  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1628  1.1  mrg 	fprintf (file, "#%ld", (INTVAL (x)) & 0xff);
   1629  1.1  mrg       else if (GET_CODE (x) == REG)
   1630  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 0));
   1631  1.1  mrg       else
   1632  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1633  1.1  mrg       break;
   1634  1.1  mrg     case 't':
   1635  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1636  1.1  mrg 	fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
   1637  1.1  mrg       else if (GET_CODE (x) == REG)
   1638  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 1));
   1639  1.1  mrg       else
   1640  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1641  1.1  mrg       break;
   1642  1.1  mrg     case 'w':
   1643  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1644  1.1  mrg 	fprintf (file, "#%ld", INTVAL (x) & 0xff);
   1645  1.1  mrg       else if (GET_CODE (x) == REG)
   1646  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 0));
   1647  1.1  mrg       else
   1648  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1649  1.1  mrg       break;
   1650  1.1  mrg     case 'x':
   1651  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1652  1.1  mrg 	fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
   1653  1.1  mrg       else if (GET_CODE (x) == REG)
   1654  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 1));
   1655  1.1  mrg       else
   1656  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1657  1.1  mrg       break;
   1658  1.1  mrg     case 'y':
   1659  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1660  1.1  mrg 	fprintf (file, "#%ld", (INTVAL (x) >> 16) & 0xff);
   1661  1.1  mrg       else if (GET_CODE (x) == REG)
   1662  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 0));
   1663  1.1  mrg       else
   1664  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1665  1.1  mrg       break;
   1666  1.1  mrg     case 'z':
   1667  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   1668  1.1  mrg 	fprintf (file, "#%ld", (INTVAL (x) >> 24) & 0xff);
   1669  1.1  mrg       else if (GET_CODE (x) == REG)
   1670  1.1  mrg 	fprintf (file, "%s", byte_reg (x, 1));
   1671  1.1  mrg       else
   1672  1.1  mrg 	output_operand_lossage ("Expected register or constant integer.");
   1673  1.1  mrg       break;
   1674  1.1  mrg 
   1675  1.1  mrg     default:
   1676  1.1  mrg     def:
   1677  1.1  mrg       switch (GET_CODE (x))
   1678  1.1  mrg 	{
   1679  1.1  mrg 	case REG:
   1680  1.1  mrg 	  switch (GET_MODE (x))
   1681  1.1  mrg 	    {
   1682  1.1  mrg 	    case E_QImode:
   1683  1.1  mrg #if 0 /* Is it asm ("mov.b %0,r2l", ...) */
   1684  1.1  mrg 	      fprintf (file, "%s", byte_reg (x, 0));
   1685  1.1  mrg #else /* ... or is it asm ("mov.b %0l,r2l", ...) */
   1686  1.1  mrg 	      fprintf (file, "%s", names_big[REGNO (x)]);
   1687  1.1  mrg #endif
   1688  1.1  mrg 	      break;
   1689  1.1  mrg 	    case E_HImode:
   1690  1.1  mrg 	      fprintf (file, "%s", names_big[REGNO (x)]);
   1691  1.1  mrg 	      break;
   1692  1.1  mrg 	    case E_SImode:
   1693  1.1  mrg 	    case E_SFmode:
   1694  1.1  mrg 	      fprintf (file, "%s", names_extended[REGNO (x)]);
   1695  1.1  mrg 	      break;
   1696  1.1  mrg 	    default:
   1697  1.1  mrg 	      gcc_unreachable ();
   1698  1.1  mrg 	    }
   1699  1.1  mrg 	  break;
   1700  1.1  mrg 
   1701  1.1  mrg 	case MEM:
   1702  1.1  mrg 	  {
   1703  1.1  mrg 	    rtx addr = XEXP (x, 0);
   1704  1.1  mrg 
   1705  1.1  mrg 	    fprintf (file, "@");
   1706  1.1  mrg 	    output_address (GET_MODE (x), addr);
   1707  1.1  mrg 
   1708  1.1  mrg 	    /* Add a length suffix to constant addresses.  Although this
   1709  1.1  mrg 	       is often unnecessary, it helps to avoid ambiguity in the
   1710  1.1  mrg 	       syntax of mova.  If we wrote an insn like:
   1711  1.1  mrg 
   1712  1.1  mrg 		    mova/w.l @(1,@foo.b),er0
   1713  1.1  mrg 
   1714  1.1  mrg 	       then .b would be considered part of the symbol name.
   1715  1.1  mrg 	       Adding a length after foo will avoid this.  */
   1716  1.1  mrg 	    if (CONSTANT_P (addr))
   1717  1.1  mrg 	      switch (code)
   1718  1.1  mrg 		{
   1719  1.1  mrg 		case 'R':
   1720  1.1  mrg 		  /* Used for mov.b and bit operations.  */
   1721  1.1  mrg 		  if (h8300_eightbit_constant_address_p (addr))
   1722  1.1  mrg 		    {
   1723  1.1  mrg 		      fprintf (file, ":8");
   1724  1.1  mrg 		      break;
   1725  1.1  mrg 		    }
   1726  1.1  mrg 
   1727  1.1  mrg 		  /* FALLTHRU */
   1728  1.1  mrg 
   1729  1.1  mrg 		  /* We should not get here if we are processing bit
   1730  1.1  mrg 		     operations on H8/300 or H8/300H because 'U'
   1731  1.1  mrg 		     constraint does not allow bit operations on the
   1732  1.1  mrg 		     tiny area on these machines.  */
   1733  1.1  mrg 
   1734  1.1  mrg 		case 'X':
   1735  1.1  mrg 		case 'T':
   1736  1.1  mrg 		case 'S':
   1737  1.1  mrg 		  if (h8300_constant_length (addr) == 2)
   1738  1.1  mrg 		    fprintf (file, ":16");
   1739  1.1  mrg 		  else
   1740  1.1  mrg 		    fprintf (file, ":32");
   1741  1.1  mrg 		  break;
   1742  1.1  mrg 		default:
   1743  1.1  mrg 		  break;
   1744  1.1  mrg 		}
   1745  1.1  mrg 	  }
   1746  1.1  mrg 	  break;
   1747  1.1  mrg 
   1748  1.1  mrg 	case CONST_INT:
   1749  1.1  mrg 	case SYMBOL_REF:
   1750  1.1  mrg 	case CONST:
   1751  1.1  mrg 	case LABEL_REF:
   1752  1.1  mrg 	  fprintf (file, "#");
   1753  1.1  mrg 	  h8300_print_operand_address (file, VOIDmode, x);
   1754  1.1  mrg 	  break;
   1755  1.1  mrg 	case CONST_DOUBLE:
   1756  1.1  mrg 	  {
   1757  1.1  mrg 	    long val;
   1758  1.1  mrg 	    REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
   1759  1.1  mrg 	    fprintf (file, "#%ld", val);
   1760  1.1  mrg 	    break;
   1761  1.1  mrg 	  }
   1762  1.1  mrg 	default:
   1763  1.1  mrg 	  break;
   1764  1.1  mrg 	}
   1765  1.1  mrg     }
   1766  1.1  mrg }
   1767  1.1  mrg 
   1768  1.1  mrg /* Implements TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
   1769  1.1  mrg 
   1770  1.1  mrg static bool
   1771  1.1  mrg h8300_print_operand_punct_valid_p (unsigned char code)
   1772  1.1  mrg {
   1773  1.1  mrg   return (code == '#');
   1774  1.1  mrg }
   1775  1.1  mrg 
   1776  1.1  mrg /* Output assembly language output for the address ADDR to FILE.  */
   1777  1.1  mrg 
   1778  1.1  mrg static void
   1779  1.1  mrg h8300_print_operand_address (FILE *file, machine_mode mode, rtx addr)
   1780  1.1  mrg {
   1781  1.1  mrg   rtx index;
   1782  1.1  mrg   int size;
   1783  1.1  mrg 
   1784  1.1  mrg   switch (GET_CODE (addr))
   1785  1.1  mrg     {
   1786  1.1  mrg     case REG:
   1787  1.1  mrg       fprintf (file, "%s", h8_reg_names[REGNO (addr)]);
   1788  1.1  mrg       break;
   1789  1.1  mrg 
   1790  1.1  mrg     case PRE_DEC:
   1791  1.1  mrg       fprintf (file, "-%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
   1792  1.1  mrg       break;
   1793  1.1  mrg 
   1794  1.1  mrg     case POST_INC:
   1795  1.1  mrg       fprintf (file, "%s+", h8_reg_names[REGNO (XEXP (addr, 0))]);
   1796  1.1  mrg       break;
   1797  1.1  mrg 
   1798  1.1  mrg     case PRE_INC:
   1799  1.1  mrg       fprintf (file, "+%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
   1800  1.1  mrg       break;
   1801  1.1  mrg 
   1802  1.1  mrg     case POST_DEC:
   1803  1.1  mrg       fprintf (file, "%s-", h8_reg_names[REGNO (XEXP (addr, 0))]);
   1804  1.1  mrg       break;
   1805  1.1  mrg 
   1806  1.1  mrg     case PLUS:
   1807  1.1  mrg       fprintf (file, "(");
   1808  1.1  mrg 
   1809  1.1  mrg       index = h8300_get_index (XEXP (addr, 0), VOIDmode, &size);
   1810  1.1  mrg       if (GET_CODE (index) == REG)
   1811  1.1  mrg 	{
   1812  1.1  mrg 	  /* reg,foo */
   1813  1.1  mrg 	  h8300_print_operand_address (file, mode, XEXP (addr, 1));
   1814  1.1  mrg 	  fprintf (file, ",");
   1815  1.1  mrg 	  switch (size)
   1816  1.1  mrg 	    {
   1817  1.1  mrg 	    case 0:
   1818  1.1  mrg 	      h8300_print_operand_address (file, mode, index);
   1819  1.1  mrg 	      break;
   1820  1.1  mrg 
   1821  1.1  mrg 	    case 1:
   1822  1.1  mrg 	      h8300_print_operand (file, index, 'X');
   1823  1.1  mrg 	      fputs (".b", file);
   1824  1.1  mrg 	      break;
   1825  1.1  mrg 
   1826  1.1  mrg 	    case 2:
   1827  1.1  mrg 	      h8300_print_operand (file, index, 'T');
   1828  1.1  mrg 	      fputs (".w", file);
   1829  1.1  mrg 	      break;
   1830  1.1  mrg 
   1831  1.1  mrg 	    case 4:
   1832  1.1  mrg 	      h8300_print_operand (file, index, 'S');
   1833  1.1  mrg 	      fputs (".l", file);
   1834  1.1  mrg 	      break;
   1835  1.1  mrg 	    }
   1836  1.1  mrg 	  /* h8300_print_operand_address (file, XEXP (addr, 0)); */
   1837  1.1  mrg 	}
   1838  1.1  mrg       else
   1839  1.1  mrg 	{
   1840  1.1  mrg 	  /* foo+k */
   1841  1.1  mrg 	  h8300_print_operand_address (file, mode, XEXP (addr, 0));
   1842  1.1  mrg 	  fprintf (file, "+");
   1843  1.1  mrg 	  h8300_print_operand_address (file, mode, XEXP (addr, 1));
   1844  1.1  mrg 	}
   1845  1.1  mrg       fprintf (file, ")");
   1846  1.1  mrg       break;
   1847  1.1  mrg 
   1848  1.1  mrg     case CONST_INT:
   1849  1.1  mrg       {
   1850  1.1  mrg 	int n = INTVAL (addr);
   1851  1.1  mrg 	fprintf (file, "%d", n);
   1852  1.1  mrg 	break;
   1853  1.1  mrg       }
   1854  1.1  mrg 
   1855  1.1  mrg     default:
   1856  1.1  mrg       output_addr_const (file, addr);
   1857  1.1  mrg       break;
   1858  1.1  mrg     }
   1859  1.1  mrg }
   1860  1.1  mrg 
   1861  1.1  mrg /* Output all insn addresses and their sizes into the assembly language
   1863  1.1  mrg    output file.  This is helpful for debugging whether the length attributes
   1864  1.1  mrg    in the md file are correct.  This is not meant to be a user selectable
   1865  1.1  mrg    option.  */
   1866  1.1  mrg 
   1867  1.1  mrg void
   1868  1.1  mrg final_prescan_insn (rtx_insn *insn, rtx *operand ATTRIBUTE_UNUSED,
   1869  1.1  mrg 		    int num_operands ATTRIBUTE_UNUSED)
   1870  1.1  mrg {
   1871  1.1  mrg   /* This holds the last insn address.  */
   1872  1.1  mrg   static int last_insn_address = 0;
   1873  1.1  mrg 
   1874  1.1  mrg   const int uid = INSN_UID (insn);
   1875  1.1  mrg 
   1876  1.1  mrg   if (TARGET_ADDRESSES)
   1877  1.1  mrg     {
   1878  1.1  mrg       fprintf (asm_out_file, "; 0x%x %d\n", INSN_ADDRESSES (uid),
   1879  1.1  mrg 	       INSN_ADDRESSES (uid) - last_insn_address);
   1880  1.1  mrg       last_insn_address = INSN_ADDRESSES (uid);
   1881  1.1  mrg     }
   1882  1.1  mrg }
   1883  1.1  mrg 
   1884  1.1  mrg /* Prepare for an SI sized move.  */
   1885  1.1  mrg 
   1886  1.1  mrg int
   1887  1.1  mrg h8300_expand_movsi (rtx operands[])
   1888  1.1  mrg {
   1889  1.1  mrg   rtx src = operands[1];
   1890  1.1  mrg   rtx dst = operands[0];
   1891  1.1  mrg   if (!reload_in_progress && !reload_completed)
   1892  1.1  mrg     {
   1893  1.1  mrg       if (!register_operand (dst, GET_MODE (dst)))
   1894  1.1  mrg 	{
   1895  1.1  mrg 	  rtx tmp = gen_reg_rtx (GET_MODE (dst));
   1896  1.1  mrg 	  emit_move_insn (tmp, src);
   1897  1.1  mrg 	  operands[1] = tmp;
   1898  1.1  mrg 	}
   1899  1.1  mrg     }
   1900  1.1  mrg   return 0;
   1901  1.1  mrg }
   1902  1.1  mrg 
   1903  1.1  mrg /* Given FROM and TO register numbers, say whether this elimination is allowed.
   1904  1.1  mrg    Frame pointer elimination is automatically handled.
   1905  1.1  mrg 
   1906  1.1  mrg    For the h8300, if frame pointer elimination is being done, we would like to
   1907  1.1  mrg    convert ap and rp into sp, not fp.
   1908  1.1  mrg 
   1909  1.1  mrg    All other eliminations are valid.  */
   1910  1.1  mrg 
   1911  1.1  mrg static bool
   1912  1.1  mrg h8300_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
   1913  1.1  mrg {
   1914  1.1  mrg   return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true);
   1915  1.1  mrg }
   1916  1.1  mrg 
   1917  1.1  mrg /* Conditionally modify register usage based on target flags.  */
   1918  1.1  mrg 
   1919  1.1  mrg static void
   1920  1.1  mrg h8300_conditional_register_usage (void)
   1921  1.1  mrg {
   1922  1.1  mrg   if (!TARGET_MAC)
   1923  1.1  mrg     fixed_regs[MAC_REG] = call_used_regs[MAC_REG] = 1;
   1924  1.1  mrg }
   1925  1.1  mrg 
   1926  1.1  mrg /* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
   1927  1.1  mrg    Define the offset between two registers, one to be eliminated, and
   1928  1.1  mrg    the other its replacement, at the start of a routine.  */
   1929  1.1  mrg 
   1930  1.1  mrg int
   1931  1.1  mrg h8300_initial_elimination_offset (int from, int to)
   1932  1.1  mrg {
   1933  1.1  mrg   /* The number of bytes that the return address takes on the stack.  */
   1934  1.1  mrg   int pc_size = POINTER_SIZE / BITS_PER_UNIT;
   1935  1.1  mrg 
   1936  1.1  mrg   /* The number of bytes that the saved frame pointer takes on the stack.  */
   1937  1.1  mrg   int fp_size = frame_pointer_needed * UNITS_PER_WORD;
   1938  1.1  mrg 
   1939  1.1  mrg   /* The number of bytes that the saved registers, excluding the frame
   1940  1.1  mrg      pointer, take on the stack.  */
   1941  1.1  mrg   int saved_regs_size = 0;
   1942  1.1  mrg 
   1943  1.1  mrg   /* The number of bytes that the locals takes on the stack.  */
   1944  1.1  mrg   int frame_size = round_frame_size (get_frame_size ());
   1945  1.1  mrg 
   1946  1.1  mrg   int regno;
   1947  1.1  mrg 
   1948  1.1  mrg   for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
   1949  1.1  mrg     if (WORD_REG_USED (regno))
   1950  1.1  mrg       saved_regs_size += UNITS_PER_WORD;
   1951  1.1  mrg 
   1952  1.1  mrg   /* Adjust saved_regs_size because the above loop took the frame
   1953  1.1  mrg      pointer int account.  */
   1954  1.1  mrg   saved_regs_size -= fp_size;
   1955  1.1  mrg 
   1956  1.1  mrg   switch (to)
   1957  1.1  mrg     {
   1958  1.1  mrg     case HARD_FRAME_POINTER_REGNUM:
   1959  1.1  mrg       switch (from)
   1960  1.1  mrg 	{
   1961  1.1  mrg 	case ARG_POINTER_REGNUM:
   1962  1.1  mrg 	  return pc_size + fp_size;
   1963  1.1  mrg 	case RETURN_ADDRESS_POINTER_REGNUM:
   1964  1.1  mrg 	  return fp_size;
   1965  1.1  mrg 	case FRAME_POINTER_REGNUM:
   1966  1.1  mrg 	  return -saved_regs_size;
   1967  1.1  mrg 	default:
   1968  1.1  mrg 	  gcc_unreachable ();
   1969  1.1  mrg 	}
   1970  1.1  mrg       break;
   1971  1.1  mrg     case STACK_POINTER_REGNUM:
   1972  1.1  mrg       switch (from)
   1973  1.1  mrg 	{
   1974  1.1  mrg 	case ARG_POINTER_REGNUM:
   1975  1.1  mrg 	  return pc_size + saved_regs_size + frame_size;
   1976  1.1  mrg 	case RETURN_ADDRESS_POINTER_REGNUM:
   1977  1.1  mrg 	  return saved_regs_size + frame_size;
   1978  1.1  mrg 	case FRAME_POINTER_REGNUM:
   1979  1.1  mrg 	  return frame_size;
   1980  1.1  mrg 	default:
   1981  1.1  mrg 	  gcc_unreachable ();
   1982  1.1  mrg 	}
   1983  1.1  mrg       break;
   1984  1.1  mrg     default:
   1985  1.1  mrg       gcc_unreachable ();
   1986  1.1  mrg     }
   1987  1.1  mrg   gcc_unreachable ();
   1988  1.1  mrg }
   1989  1.1  mrg 
   1990  1.1  mrg /* Worker function for RETURN_ADDR_RTX.  */
   1991  1.1  mrg 
   1992  1.1  mrg rtx
   1993  1.1  mrg h8300_return_addr_rtx (int count, rtx frame)
   1994  1.1  mrg {
   1995  1.1  mrg   rtx ret;
   1996  1.1  mrg 
   1997  1.1  mrg   if (count == 0)
   1998  1.1  mrg     ret = gen_rtx_MEM (Pmode,
   1999  1.1  mrg 		       gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM));
   2000  1.1  mrg   else if (flag_omit_frame_pointer)
   2001  1.1  mrg     return (rtx) 0;
   2002  1.1  mrg   else
   2003  1.1  mrg     ret = gen_rtx_MEM (Pmode,
   2004  1.1  mrg 		       memory_address (Pmode,
   2005  1.1  mrg 				       plus_constant (Pmode, frame,
   2006  1.1  mrg 						      UNITS_PER_WORD)));
   2007  1.1  mrg   set_mem_alias_set (ret, get_frame_alias_set ());
   2008  1.1  mrg   return ret;
   2009  1.1  mrg }
   2010  1.1  mrg 
   2011  1.1  mrg 
   2012  1.1  mrg machine_mode
   2013  1.1  mrg h8300_select_cc_mode (enum rtx_code cond, rtx op0, rtx op1)
   2014  1.1  mrg {
   2015  1.1  mrg   if (op1 == const0_rtx
   2016  1.1  mrg       && (cond == EQ || cond == NE || cond == LT || cond == GE)
   2017  1.1  mrg       && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
   2018  1.1  mrg 	  || GET_CODE (op0) == NEG || GET_CODE (op0) == AND
   2019  1.1  mrg 	  || GET_CODE (op0) == IOR || GET_CODE (op0) == XOR
   2020  1.1  mrg 	  || GET_CODE (op0) == NOT || GET_CODE (op0) == ASHIFT
   2021  1.1  mrg 	  || GET_CODE (op0) == ASHIFTRT || GET_CODE (op0) == LSHIFTRT
   2022  1.1  mrg 	  || GET_CODE (op0) == MULT || GET_CODE (op0) == SYMBOL_REF
   2023  1.1  mrg 	  || GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND
   2024  1.1  mrg 	  || REG_P (op0) || MEM_P (op0)))
   2025  1.1  mrg     return CCZNmode;
   2026  1.1  mrg 
   2027  1.1  mrg   return CCmode;
   2028  1.1  mrg }
   2029  1.1  mrg 
   2030  1.1  mrg 
   2031  1.1  mrg /* Given that X occurs in an address of the form (plus X constant),
   2033  1.1  mrg    return the part of X that is expected to be a register.  There are
   2034  1.1  mrg    four kinds of addressing mode to recognize:
   2035  1.1  mrg 
   2036  1.1  mrg 	@(dd,Rn)
   2037  1.1  mrg 	@(dd,RnL.b)
   2038  1.1  mrg 	@(dd,Rn.w)
   2039  1.1  mrg 	@(dd,ERn.l)
   2040  1.1  mrg 
   2041  1.1  mrg    If SIZE is nonnull, and the address is one of the last three forms,
   2042  1.1  mrg    set *SIZE to the index multiplication factor.  Set it to 0 for
   2043  1.1  mrg    plain @(dd,Rn) addresses.
   2044  1.1  mrg 
   2045  1.1  mrg    MODE is the mode of the value being accessed.  It can be VOIDmode
   2046  1.1  mrg    if the address is known to be valid, but its mode is unknown.  */
   2047  1.1  mrg 
   2048  1.1  mrg static rtx
   2049  1.1  mrg h8300_get_index (rtx x, machine_mode mode, int *size)
   2050  1.1  mrg {
   2051  1.1  mrg   int dummy, factor;
   2052  1.1  mrg 
   2053  1.1  mrg   if (size == 0)
   2054  1.1  mrg     size = &dummy;
   2055  1.1  mrg 
   2056  1.1  mrg   factor = (mode == VOIDmode ? 0 : GET_MODE_SIZE (mode));
   2057  1.1  mrg   if (TARGET_H8300SX
   2058  1.1  mrg       && factor <= 4
   2059  1.1  mrg       && (mode == VOIDmode
   2060  1.1  mrg 	  || GET_MODE_CLASS (mode) == MODE_INT
   2061  1.1  mrg 	  || GET_MODE_CLASS (mode) == MODE_FLOAT))
   2062  1.1  mrg     {
   2063  1.1  mrg       if (factor <= 1 && GET_CODE (x) == ZERO_EXTEND)
   2064  1.1  mrg 	{
   2065  1.1  mrg 	  /* When accessing byte-sized values, the index can be
   2066  1.1  mrg 	     a zero-extended QImode or HImode register.  */
   2067  1.1  mrg 	  *size = GET_MODE_SIZE (GET_MODE (XEXP (x, 0)));
   2068  1.1  mrg 	  return XEXP (x, 0);
   2069  1.1  mrg 	}
   2070  1.1  mrg       else
   2071  1.1  mrg 	{
   2072  1.1  mrg 	  /* We're looking for addresses of the form:
   2073  1.1  mrg 
   2074  1.1  mrg 		 (mult X I)
   2075  1.1  mrg 	      or (mult (zero_extend X) I)
   2076  1.1  mrg 
   2077  1.1  mrg 	     where I is the size of the operand being accessed.
   2078  1.1  mrg 	     The canonical form of the second expression is:
   2079  1.1  mrg 
   2080  1.1  mrg 		 (and (mult (subreg X) I) J)
   2081  1.1  mrg 
   2082  1.1  mrg 	     where J == GET_MODE_MASK (GET_MODE (X)) * I.  */
   2083  1.1  mrg 	  rtx index;
   2084  1.1  mrg 
   2085  1.1  mrg 	  if (GET_CODE (x) == AND
   2086  1.1  mrg 	      && GET_CODE (XEXP (x, 1)) == CONST_INT
   2087  1.1  mrg 	      && (factor == 0
   2088  1.1  mrg 		  || INTVAL (XEXP (x, 1)) == 0xff * factor
   2089  1.1  mrg 		  || INTVAL (XEXP (x, 1)) == 0xffff * factor))
   2090  1.1  mrg 	    {
   2091  1.1  mrg 	      index = XEXP (x, 0);
   2092  1.1  mrg 	      *size = (INTVAL (XEXP (x, 1)) >= 0xffff ? 2 : 1);
   2093  1.1  mrg 	    }
   2094  1.1  mrg 	  else
   2095  1.1  mrg 	    {
   2096  1.1  mrg 	      index = x;
   2097  1.1  mrg 	      *size = 4;
   2098  1.1  mrg 	    }
   2099  1.1  mrg 
   2100  1.1  mrg 	  if (GET_CODE (index) == MULT
   2101  1.1  mrg 	      && GET_CODE (XEXP (index, 1)) == CONST_INT
   2102  1.1  mrg 	      && (factor == 0 || factor == INTVAL (XEXP (index, 1))))
   2103  1.1  mrg 	    return XEXP (index, 0);
   2104  1.1  mrg 	}
   2105  1.1  mrg     }
   2106  1.1  mrg   *size = 0;
   2107  1.1  mrg   return x;
   2108  1.1  mrg }
   2109  1.1  mrg 
   2110  1.1  mrg /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.
   2112  1.1  mrg 
   2113  1.1  mrg    On the H8/300, the predecrement and postincrement address depend thus
   2114  1.1  mrg    (the amount of decrement or increment being the length of the operand).  */
   2115  1.1  mrg 
   2116  1.1  mrg static bool
   2117  1.1  mrg h8300_mode_dependent_address_p (const_rtx addr,
   2118  1.1  mrg 				addr_space_t as ATTRIBUTE_UNUSED)
   2119  1.1  mrg {
   2120  1.1  mrg   if (GET_CODE (addr) == PLUS
   2121  1.1  mrg       && h8300_get_index (XEXP (addr, 0), VOIDmode, 0) != XEXP (addr, 0))
   2122  1.1  mrg     return true;
   2123  1.1  mrg 
   2124  1.1  mrg   return false;
   2125  1.1  mrg }
   2126  1.1  mrg 
   2127  1.1  mrg static const h8300_length_table addb_length_table =
   2129  1.1  mrg {
   2130  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2131  1.1  mrg   {  2,   2,   4,   4,   4  }, /* add.b xx,Rd  */
   2132  1.1  mrg   {  4,   4,   4,   4,   6  }, /* add.b xx,@aa */
   2133  1.1  mrg   {  4,   4,   4,   4,   6  }, /* add.b xx,@Rd */
   2134  1.1  mrg   {  6,   4,   4,   4,   6  }  /* add.b xx,@xx */
   2135  1.1  mrg };
   2136  1.1  mrg 
   2137  1.1  mrg static const h8300_length_table addw_length_table =
   2138  1.1  mrg {
   2139  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2140  1.1  mrg   {  2,   2,   4,   4,   4  }, /* add.w xx,Rd  */
   2141  1.1  mrg   {  4,   4,   4,   4,   6  }, /* add.w xx,@aa */
   2142  1.1  mrg   {  4,   4,   4,   4,   6  }, /* add.w xx,@Rd */
   2143  1.1  mrg   {  4,   4,   4,   4,   6  }  /* add.w xx,@xx */
   2144  1.1  mrg };
   2145  1.1  mrg 
   2146  1.1  mrg static const h8300_length_table addl_length_table =
   2147  1.1  mrg {
   2148  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2149  1.1  mrg   {  2,   2,   4,   4,   4  }, /* add.l xx,Rd  */
   2150  1.1  mrg   {  4,   4,   6,   6,   6  }, /* add.l xx,@aa */
   2151  1.1  mrg   {  4,   4,   6,   6,   6  }, /* add.l xx,@Rd */
   2152  1.1  mrg   {  4,   4,   6,   6,   6  }  /* add.l xx,@xx */
   2153  1.1  mrg };
   2154  1.1  mrg 
   2155  1.1  mrg #define logicb_length_table addb_length_table
   2156  1.1  mrg #define logicw_length_table addw_length_table
   2157  1.1  mrg 
   2158  1.1  mrg static const h8300_length_table logicl_length_table =
   2159  1.1  mrg {
   2160  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2161  1.1  mrg   {  2,   4,   4,   4,   4  }, /* and.l xx,Rd  */
   2162  1.1  mrg   {  4,   4,   6,   6,   6  }, /* and.l xx,@aa */
   2163  1.1  mrg   {  4,   4,   6,   6,   6  }, /* and.l xx,@Rd */
   2164  1.1  mrg   {  4,   4,   6,   6,   6  }  /* and.l xx,@xx */
   2165  1.1  mrg };
   2166  1.1  mrg 
   2167  1.1  mrg static const h8300_length_table movb_length_table =
   2168  1.1  mrg {
   2169  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2170  1.1  mrg   {  2,   2,   2,   2,   4  }, /* mov.b xx,Rd  */
   2171  1.1  mrg   {  4,   2,   4,   4,   4  }, /* mov.b xx,@aa */
   2172  1.1  mrg   {  4,   2,   4,   4,   4  }, /* mov.b xx,@Rd */
   2173  1.1  mrg   {  4,   4,   4,   4,   4  }  /* mov.b xx,@xx */
   2174  1.1  mrg };
   2175  1.1  mrg 
   2176  1.1  mrg #define movw_length_table movb_length_table
   2177  1.1  mrg 
   2178  1.1  mrg static const h8300_length_table movl_length_table =
   2179  1.1  mrg {
   2180  1.1  mrg   /* #xx  Rs   @aa  @Rs  @xx  */
   2181  1.1  mrg   {  2,   2,   4,   4,   4  }, /* mov.l xx,Rd  */
   2182  1.1  mrg   {  4,   4,   4,   4,   4  }, /* mov.l xx,@aa */
   2183  1.1  mrg   {  4,   4,   4,   4,   4  }, /* mov.l xx,@Rd */
   2184  1.1  mrg   {  4,   4,   4,   4,   4  }  /* mov.l xx,@xx */
   2185  1.1  mrg };
   2186  1.1  mrg 
   2187  1.1  mrg /* Return the size of the given address or displacement constant.  */
   2188  1.1  mrg 
   2189  1.1  mrg static unsigned int
   2190  1.1  mrg h8300_constant_length (rtx constant)
   2191  1.1  mrg {
   2192  1.1  mrg   /* Check for (@d:16,Reg).  */
   2193  1.1  mrg   if (GET_CODE (constant) == CONST_INT
   2194  1.1  mrg       && IN_RANGE (INTVAL (constant), -0x8000, 0x7fff))
   2195  1.1  mrg     return 2;
   2196  1.1  mrg 
   2197  1.1  mrg   /* Check for (@d:16,Reg) in cases where the displacement is
   2198  1.1  mrg      an absolute address.  */
   2199  1.1  mrg   if (Pmode == HImode || h8300_tiny_constant_address_p (constant))
   2200  1.1  mrg     return 2;
   2201  1.1  mrg 
   2202  1.1  mrg   return 4;
   2203  1.1  mrg }
   2204  1.1  mrg 
   2205  1.1  mrg /* Return the size of a displacement field in address ADDR, which should
   2206  1.1  mrg    have the form (plus X constant).  SIZE is the number of bytes being
   2207  1.1  mrg    accessed.  */
   2208  1.1  mrg 
   2209  1.1  mrg static unsigned int
   2210  1.1  mrg h8300_displacement_length (rtx addr, int size)
   2211  1.1  mrg {
   2212  1.1  mrg   rtx offset;
   2213  1.1  mrg 
   2214  1.1  mrg   offset = XEXP (addr, 1);
   2215  1.1  mrg 
   2216  1.1  mrg   /* Check for @(d:2,Reg).  */
   2217  1.1  mrg   if (register_operand (XEXP (addr, 0), VOIDmode)
   2218  1.1  mrg       && GET_CODE (offset) == CONST_INT
   2219  1.1  mrg       && (INTVAL (offset) == size
   2220  1.1  mrg 	  || INTVAL (offset) == size * 2
   2221  1.1  mrg 	  || INTVAL (offset) == size * 3))
   2222  1.1  mrg     return 0;
   2223  1.1  mrg 
   2224  1.1  mrg   return h8300_constant_length (offset);
   2225  1.1  mrg }
   2226  1.1  mrg 
   2227  1.1  mrg /* Store the class of operand OP in *OPCLASS and return the length of any
   2228  1.1  mrg    extra operand fields.  SIZE is the number of bytes in OP.  OPCLASS
   2229  1.1  mrg    can be null if only the length is needed.  */
   2230  1.1  mrg 
   2231  1.1  mrg static unsigned int
   2232  1.1  mrg h8300_classify_operand (rtx op, int size, enum h8300_operand_class *opclass)
   2233  1.1  mrg {
   2234  1.1  mrg   enum h8300_operand_class dummy;
   2235  1.1  mrg 
   2236  1.1  mrg   if (opclass == 0)
   2237  1.1  mrg     opclass = &dummy;
   2238  1.1  mrg 
   2239  1.1  mrg   if (CONSTANT_P (op))
   2240  1.1  mrg     {
   2241  1.1  mrg       *opclass = H8OP_IMMEDIATE;
   2242  1.1  mrg 
   2243  1.1  mrg       /* Byte-sized immediates are stored in the opcode fields.  */
   2244  1.1  mrg       if (size == 1)
   2245  1.1  mrg 	return 0;
   2246  1.1  mrg 
   2247  1.1  mrg       /* If this is a 32-bit instruction, see whether the constant
   2248  1.1  mrg 	 will fit into a 16-bit immediate field.  */
   2249  1.1  mrg       if (TARGET_H8300SX
   2250  1.1  mrg 	  && size == 4
   2251  1.1  mrg 	  && GET_CODE (op) == CONST_INT
   2252  1.1  mrg 	  && IN_RANGE (INTVAL (op), 0, 0xffff))
   2253  1.1  mrg 	return 2;
   2254  1.1  mrg 
   2255  1.1  mrg       return size;
   2256  1.1  mrg     }
   2257  1.1  mrg   else if (GET_CODE (op) == MEM)
   2258  1.1  mrg     {
   2259  1.1  mrg       op = XEXP (op, 0);
   2260  1.1  mrg       if (CONSTANT_P (op))
   2261  1.1  mrg 	{
   2262  1.1  mrg 	  *opclass = H8OP_MEM_ABSOLUTE;
   2263  1.1  mrg 	  return h8300_constant_length (op);
   2264  1.1  mrg 	}
   2265  1.1  mrg       else if (GET_CODE (op) == PLUS && CONSTANT_P (XEXP (op, 1)))
   2266  1.1  mrg 	{
   2267  1.1  mrg 	  *opclass = H8OP_MEM_COMPLEX;
   2268  1.1  mrg 	  return h8300_displacement_length (op, size);
   2269  1.1  mrg 	}
   2270  1.1  mrg       else if (GET_RTX_CLASS (GET_CODE (op)) == RTX_AUTOINC)
   2271  1.1  mrg 	{
   2272  1.1  mrg 	  *opclass = H8OP_MEM_COMPLEX;
   2273  1.1  mrg 	  return 0;
   2274  1.1  mrg 	}
   2275  1.1  mrg       else if (register_operand (op, VOIDmode))
   2276  1.1  mrg 	{
   2277  1.1  mrg 	  *opclass = H8OP_MEM_BASE;
   2278  1.1  mrg 	  return 0;
   2279  1.1  mrg 	}
   2280  1.1  mrg     }
   2281  1.1  mrg   gcc_assert (register_operand (op, VOIDmode));
   2282  1.1  mrg   *opclass = H8OP_REGISTER;
   2283  1.1  mrg   return 0;
   2284  1.1  mrg }
   2285  1.1  mrg 
   2286  1.1  mrg /* Return the length of the instruction described by TABLE given that
   2287  1.1  mrg    its operands are OP1 and OP2.  OP1 must be an h8300_dst_operand
   2288  1.1  mrg    and OP2 must be an h8300_src_operand.  */
   2289  1.1  mrg 
   2290  1.1  mrg static unsigned int
   2291  1.1  mrg h8300_length_from_table (rtx op1, rtx op2, const h8300_length_table *table)
   2292  1.1  mrg {
   2293  1.1  mrg   enum h8300_operand_class op1_class, op2_class;
   2294  1.1  mrg   unsigned int size, immediate_length;
   2295  1.1  mrg 
   2296  1.1  mrg   size = GET_MODE_SIZE (GET_MODE (op1));
   2297  1.1  mrg   immediate_length = (h8300_classify_operand (op1, size, &op1_class)
   2298  1.1  mrg 		      + h8300_classify_operand (op2, size, &op2_class));
   2299  1.1  mrg   return immediate_length + (*table)[op1_class - 1][op2_class];
   2300  1.1  mrg }
   2301  1.1  mrg 
   2302  1.1  mrg /* Return the length of a unary instruction such as neg or not given that
   2303  1.1  mrg    its operand is OP.  */
   2304  1.1  mrg 
   2305  1.1  mrg unsigned int
   2306  1.1  mrg h8300_unary_length (rtx op)
   2307  1.1  mrg {
   2308  1.1  mrg   enum h8300_operand_class opclass;
   2309  1.1  mrg   unsigned int size, operand_length;
   2310  1.1  mrg 
   2311  1.1  mrg   size = GET_MODE_SIZE (GET_MODE (op));
   2312  1.1  mrg   operand_length = h8300_classify_operand (op, size, &opclass);
   2313  1.1  mrg   switch (opclass)
   2314  1.1  mrg     {
   2315  1.1  mrg     case H8OP_REGISTER:
   2316  1.1  mrg       return 2;
   2317  1.1  mrg 
   2318  1.1  mrg     case H8OP_MEM_BASE:
   2319  1.1  mrg       return (size == 4 ? 6 : 4);
   2320  1.1  mrg 
   2321  1.1  mrg     case H8OP_MEM_ABSOLUTE:
   2322  1.1  mrg       return operand_length + (size == 4 ? 6 : 4);
   2323  1.1  mrg 
   2324  1.1  mrg     case H8OP_MEM_COMPLEX:
   2325  1.1  mrg       return operand_length + 6;
   2326  1.1  mrg 
   2327  1.1  mrg     default:
   2328  1.1  mrg       gcc_unreachable ();
   2329  1.1  mrg     }
   2330  1.1  mrg }
   2331  1.1  mrg 
   2332  1.1  mrg /* Likewise short immediate instructions such as add.w #xx:3,OP.  */
   2333  1.1  mrg 
   2334  1.1  mrg static unsigned int
   2335  1.1  mrg h8300_short_immediate_length (rtx op)
   2336  1.1  mrg {
   2337  1.1  mrg   enum h8300_operand_class opclass;
   2338  1.1  mrg   unsigned int size, operand_length;
   2339  1.1  mrg 
   2340  1.1  mrg   size = GET_MODE_SIZE (GET_MODE (op));
   2341  1.1  mrg   operand_length = h8300_classify_operand (op, size, &opclass);
   2342  1.1  mrg 
   2343  1.1  mrg   switch (opclass)
   2344  1.1  mrg     {
   2345  1.1  mrg     case H8OP_REGISTER:
   2346  1.1  mrg       return 2;
   2347  1.1  mrg 
   2348  1.1  mrg     case H8OP_MEM_BASE:
   2349  1.1  mrg     case H8OP_MEM_ABSOLUTE:
   2350  1.1  mrg     case H8OP_MEM_COMPLEX:
   2351  1.1  mrg       return 4 + operand_length;
   2352  1.1  mrg 
   2353  1.1  mrg     default:
   2354  1.1  mrg       gcc_unreachable ();
   2355  1.1  mrg     }
   2356  1.1  mrg }
   2357  1.1  mrg 
   2358  1.1  mrg /* Likewise bitfield load and store instructions.  */
   2359  1.1  mrg 
   2360  1.1  mrg static unsigned int
   2361  1.1  mrg h8300_bitfield_length (rtx op, rtx op2)
   2362  1.1  mrg {
   2363  1.1  mrg   enum h8300_operand_class opclass;
   2364  1.1  mrg   unsigned int size, operand_length;
   2365  1.1  mrg 
   2366  1.1  mrg   if (GET_CODE (op) == REG)
   2367  1.1  mrg     op = op2;
   2368  1.1  mrg   gcc_assert (GET_CODE (op) != REG);
   2369  1.1  mrg 
   2370  1.1  mrg   size = GET_MODE_SIZE (GET_MODE (op));
   2371  1.1  mrg   operand_length = h8300_classify_operand (op, size, &opclass);
   2372  1.1  mrg 
   2373  1.1  mrg   switch (opclass)
   2374  1.1  mrg     {
   2375  1.1  mrg     case H8OP_MEM_BASE:
   2376  1.1  mrg     case H8OP_MEM_ABSOLUTE:
   2377  1.1  mrg     case H8OP_MEM_COMPLEX:
   2378  1.1  mrg       return 4 + operand_length;
   2379  1.1  mrg 
   2380  1.1  mrg     default:
   2381  1.1  mrg       gcc_unreachable ();
   2382  1.1  mrg     }
   2383  1.1  mrg }
   2384  1.1  mrg 
   2385  1.1  mrg /* Calculate the length of general binary instruction INSN using TABLE.  */
   2386  1.1  mrg 
   2387  1.1  mrg static unsigned int
   2388  1.1  mrg h8300_binary_length (rtx_insn *insn, const h8300_length_table *table)
   2389  1.1  mrg {
   2390  1.1  mrg   rtx set;
   2391  1.1  mrg   rtx pattern;
   2392  1.1  mrg 
   2393  1.1  mrg   if (GET_CODE (insn) != INSN)
   2394  1.1  mrg     gcc_unreachable ();
   2395  1.1  mrg 
   2396  1.1  mrg   pattern = PATTERN (insn);
   2397  1.1  mrg   if (GET_CODE (pattern) == PARALLEL
   2398  1.1  mrg       && GET_CODE (XVECEXP (pattern, 0, 0)) == SET
   2399  1.1  mrg       && GET_CODE (SET_SRC (XVECEXP (pattern, 0, 0))) == COMPARE)
   2400  1.1  mrg     set = XVECEXP (pattern, 0, 1);
   2401  1.1  mrg   else
   2402  1.1  mrg     set = single_set (insn);
   2403  1.1  mrg   gcc_assert (set);
   2404  1.1  mrg 
   2405  1.1  mrg   if (BINARY_P (SET_SRC (set)))
   2406  1.1  mrg     return h8300_length_from_table (XEXP (SET_SRC (set), 0),
   2407  1.1  mrg 				    XEXP (SET_SRC (set), 1), table);
   2408  1.1  mrg   else
   2409  1.1  mrg     {
   2410  1.1  mrg       gcc_assert (GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == RTX_TERNARY);
   2411  1.1  mrg       return h8300_length_from_table (XEXP (XEXP (SET_SRC (set), 1), 0),
   2412  1.1  mrg 				      XEXP (XEXP (SET_SRC (set), 1), 1),
   2413  1.1  mrg 				      table);
   2414  1.1  mrg     }
   2415  1.1  mrg }
   2416  1.1  mrg 
   2417  1.1  mrg /* Subroutine of h8300_move_length.  Return true if OP is 1- or 2-byte
   2418  1.1  mrg    memory reference and either (1) it has the form @(d:16,Rn) or
   2419  1.1  mrg    (2) its address has the code given by INC_CODE.  */
   2420  1.1  mrg 
   2421  1.1  mrg static bool
   2422  1.1  mrg h8300_short_move_mem_p (rtx op, enum rtx_code inc_code)
   2423  1.1  mrg {
   2424  1.1  mrg   rtx addr;
   2425  1.1  mrg   unsigned int size;
   2426  1.1  mrg 
   2427  1.1  mrg   if (GET_CODE (op) != MEM)
   2428  1.1  mrg     return false;
   2429  1.1  mrg 
   2430  1.1  mrg   addr = XEXP (op, 0);
   2431  1.1  mrg   size = GET_MODE_SIZE (GET_MODE (op));
   2432  1.1  mrg   if (size != 1 && size != 2)
   2433  1.1  mrg     return false;
   2434  1.1  mrg 
   2435  1.1  mrg   return (GET_CODE (addr) == inc_code
   2436  1.1  mrg 	  || (GET_CODE (addr) == PLUS
   2437  1.1  mrg 	      && GET_CODE (XEXP (addr, 0)) == REG
   2438  1.1  mrg 	      && h8300_displacement_length (addr, size) == 2));
   2439  1.1  mrg }
   2440  1.1  mrg 
   2441  1.1  mrg /* Calculate the length of move instruction INSN using the given length
   2442  1.1  mrg    table.  Although the tables are correct for most cases, there is some
   2443  1.1  mrg    irregularity in the length of mov.b and mov.w.  The following forms:
   2444  1.1  mrg 
   2445  1.1  mrg 	mov @ERs+, Rd
   2446  1.1  mrg 	mov @(d:16,ERs), Rd
   2447  1.1  mrg 	mov Rs, @-ERd
   2448  1.1  mrg 	mov Rs, @(d:16,ERd)
   2449  1.1  mrg 
   2450  1.1  mrg    are two bytes shorter than most other "mov Rs, @complex" or
   2451  1.1  mrg    "mov @complex,Rd" combinations.  */
   2452  1.1  mrg 
   2453  1.1  mrg static unsigned int
   2454  1.1  mrg h8300_move_length (rtx *operands, const h8300_length_table *table)
   2455  1.1  mrg {
   2456  1.1  mrg   unsigned int size;
   2457  1.1  mrg 
   2458  1.1  mrg   size = h8300_length_from_table (operands[0], operands[1], table);
   2459  1.1  mrg   if (REG_P (operands[0]) && h8300_short_move_mem_p (operands[1], POST_INC))
   2460  1.1  mrg     size -= 2;
   2461  1.1  mrg   if (REG_P (operands[1]) && h8300_short_move_mem_p (operands[0], PRE_DEC))
   2462  1.1  mrg     size -= 2;
   2463  1.1  mrg   return size;
   2464  1.1  mrg }
   2465  1.1  mrg 
   2466  1.1  mrg /* Return the length of a mova instruction with the given operands.
   2467  1.1  mrg    DEST is the register destination, SRC is the source address and
   2468  1.1  mrg    OFFSET is the 16-bit or 32-bit displacement.  */
   2469  1.1  mrg 
   2470  1.1  mrg static unsigned int
   2471  1.1  mrg h8300_mova_length (rtx dest, rtx src, rtx offset)
   2472  1.1  mrg {
   2473  1.1  mrg   unsigned int size;
   2474  1.1  mrg 
   2475  1.1  mrg   size = (2
   2476  1.1  mrg 	  + h8300_constant_length (offset)
   2477  1.1  mrg 	  + h8300_classify_operand (src, GET_MODE_SIZE (GET_MODE (src)), 0));
   2478  1.1  mrg   if (!REG_P (dest) || !REG_P (src) || REGNO (src) != REGNO (dest))
   2479  1.1  mrg     size += 2;
   2480  1.1  mrg   return size;
   2481  1.1  mrg }
   2482  1.1  mrg 
   2483  1.1  mrg /* Compute the length of INSN based on its length_table attribute.
   2484  1.1  mrg    OPERANDS is the array of its operands.  */
   2485  1.1  mrg 
   2486  1.1  mrg unsigned int
   2487  1.1  mrg h8300_insn_length_from_table (rtx_insn *insn, rtx * operands)
   2488  1.1  mrg {
   2489  1.1  mrg   switch (get_attr_length_table (insn))
   2490  1.1  mrg     {
   2491  1.1  mrg     case LENGTH_TABLE_NONE:
   2492  1.1  mrg       gcc_unreachable ();
   2493  1.1  mrg 
   2494  1.1  mrg     case LENGTH_TABLE_ADD:
   2495  1.1  mrg       if (GET_MODE (operands[0]) == QImode)
   2496  1.1  mrg         return h8300_binary_length (insn, &addb_length_table);
   2497  1.1  mrg       else if (GET_MODE (operands[0]) == HImode)
   2498  1.1  mrg         return h8300_binary_length (insn, &addw_length_table);
   2499  1.1  mrg       else if (GET_MODE (operands[0]) == SImode)
   2500  1.1  mrg         return h8300_binary_length (insn, &addl_length_table);
   2501  1.1  mrg       gcc_unreachable ();
   2502  1.1  mrg 
   2503  1.1  mrg     case LENGTH_TABLE_LOGICB:
   2504  1.1  mrg       return h8300_binary_length (insn, &logicb_length_table);
   2505  1.1  mrg 
   2506  1.1  mrg     case LENGTH_TABLE_MOVB:
   2507  1.1  mrg       return h8300_move_length (operands, &movb_length_table);
   2508  1.1  mrg 
   2509  1.1  mrg     case LENGTH_TABLE_MOVW:
   2510  1.1  mrg       return h8300_move_length (operands, &movw_length_table);
   2511  1.1  mrg 
   2512  1.1  mrg     case LENGTH_TABLE_MOVL:
   2513  1.1  mrg       return h8300_move_length (operands, &movl_length_table);
   2514  1.1  mrg 
   2515  1.1  mrg     case LENGTH_TABLE_MOVA:
   2516  1.1  mrg       return h8300_mova_length (operands[0], operands[1], operands[2]);
   2517  1.1  mrg 
   2518  1.1  mrg     case LENGTH_TABLE_MOVA_ZERO:
   2519  1.1  mrg       return h8300_mova_length (operands[0], operands[1], const0_rtx);
   2520  1.1  mrg 
   2521  1.1  mrg     case LENGTH_TABLE_UNARY:
   2522  1.1  mrg       return h8300_unary_length (operands[0]);
   2523  1.1  mrg 
   2524  1.1  mrg     case LENGTH_TABLE_MOV_IMM4:
   2525  1.1  mrg       return 2 + h8300_classify_operand (operands[0], 0, 0);
   2526  1.1  mrg 
   2527  1.1  mrg     case LENGTH_TABLE_SHORT_IMMEDIATE:
   2528  1.1  mrg       return h8300_short_immediate_length (operands[0]);
   2529  1.1  mrg 
   2530  1.1  mrg     case LENGTH_TABLE_BITFIELD:
   2531  1.1  mrg       return h8300_bitfield_length (operands[0], operands[1]);
   2532  1.1  mrg 
   2533  1.1  mrg     case LENGTH_TABLE_BITBRANCH:
   2534  1.1  mrg       return h8300_bitfield_length (operands[1], operands[2]) - 2;
   2535  1.1  mrg 
   2536  1.1  mrg     default:
   2537  1.1  mrg       gcc_unreachable ();
   2538  1.1  mrg     }
   2539  1.1  mrg }
   2540  1.1  mrg 
   2541  1.1  mrg /* Return true if LHS and RHS are memory references that can be mapped
   2542  1.1  mrg    to the same h8sx assembly operand.  LHS appears as the destination of
   2543  1.1  mrg    an instruction and RHS appears as a source.
   2544  1.1  mrg 
   2545  1.1  mrg    Three cases are allowed:
   2546  1.1  mrg 
   2547  1.1  mrg 	- RHS is @+Rn or @-Rn, LHS is @Rn
   2548  1.1  mrg 	- RHS is @Rn, LHS is @Rn+ or @Rn-
   2549  1.1  mrg 	- RHS and LHS have the same address and neither has side effects.  */
   2550  1.1  mrg 
   2551  1.1  mrg bool
   2552  1.1  mrg h8sx_mergeable_memrefs_p (rtx lhs, rtx rhs)
   2553  1.1  mrg {
   2554  1.1  mrg   if (GET_CODE (rhs) == MEM && GET_CODE (lhs) == MEM)
   2555  1.1  mrg     {
   2556  1.1  mrg       rhs = XEXP (rhs, 0);
   2557  1.1  mrg       lhs = XEXP (lhs, 0);
   2558  1.1  mrg 
   2559  1.1  mrg       if (GET_CODE (rhs) == PRE_INC || GET_CODE (rhs) == PRE_DEC)
   2560  1.1  mrg 	return rtx_equal_p (XEXP (rhs, 0), lhs);
   2561  1.1  mrg 
   2562  1.1  mrg       if (GET_CODE (lhs) == POST_INC || GET_CODE (lhs) == POST_DEC)
   2563  1.1  mrg 	return rtx_equal_p (rhs, XEXP (lhs, 0));
   2564  1.1  mrg 
   2565  1.1  mrg       if (rtx_equal_p (rhs, lhs))
   2566  1.1  mrg 	return true;
   2567  1.1  mrg     }
   2568  1.1  mrg   return false;
   2569  1.1  mrg }
   2570  1.1  mrg 
   2571  1.1  mrg /* Return true if OPERANDS[1] can be mapped to the same assembly
   2572  1.1  mrg    operand as OPERANDS[0].  */
   2573  1.1  mrg 
   2574  1.1  mrg bool
   2575  1.1  mrg h8300_operands_match_p (rtx *operands)
   2576  1.1  mrg {
   2577  1.1  mrg   if (register_operand (operands[0], VOIDmode)
   2578  1.1  mrg       && register_operand (operands[1], VOIDmode))
   2579  1.1  mrg     return true;
   2580  1.1  mrg 
   2581  1.1  mrg   if (h8sx_mergeable_memrefs_p (operands[0], operands[1]))
   2582  1.1  mrg     return true;
   2583  1.1  mrg 
   2584  1.1  mrg   return false;
   2585  1.1  mrg }
   2586  1.1  mrg 
   2587  1.1  mrg /* Return the length of mov instruction.  */
   2589  1.1  mrg 
   2590  1.1  mrg unsigned int
   2591  1.1  mrg compute_mov_length (rtx *operands)
   2592  1.1  mrg {
   2593  1.1  mrg   /* If the mov instruction involves a memory operand, we compute the
   2594  1.1  mrg      length, assuming the largest addressing mode is used, and then
   2595  1.1  mrg      adjust later in the function.  Otherwise, we compute and return
   2596  1.1  mrg      the exact length in one step.  */
   2597  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   2598  1.1  mrg   rtx dest = operands[0];
   2599  1.1  mrg   rtx src = operands[1];
   2600  1.1  mrg   rtx addr;
   2601  1.1  mrg 
   2602  1.1  mrg   if (GET_CODE (src) == MEM)
   2603  1.1  mrg     addr = XEXP (src, 0);
   2604  1.1  mrg   else if (GET_CODE (dest) == MEM)
   2605  1.1  mrg     addr = XEXP (dest, 0);
   2606  1.1  mrg   else
   2607  1.1  mrg     addr = NULL_RTX;
   2608  1.1  mrg 
   2609  1.1  mrg   unsigned int base_length;
   2610  1.1  mrg 
   2611  1.1  mrg   switch (mode)
   2612  1.1  mrg     {
   2613  1.1  mrg     case E_QImode:
   2614  1.1  mrg       if (addr == NULL_RTX)
   2615  1.1  mrg 	return 2;
   2616  1.1  mrg 
   2617  1.1  mrg       /* The eightbit addressing is available only in QImode, so
   2618  1.1  mrg 	 go ahead and take care of it.  */
   2619  1.1  mrg       if (h8300_eightbit_constant_address_p (addr))
   2620  1.1  mrg 	return 2;
   2621  1.1  mrg 
   2622  1.1  mrg 	  base_length = 8;
   2623  1.1  mrg 	  break;
   2624  1.1  mrg 
   2625  1.1  mrg     case E_HImode:
   2626  1.1  mrg       if (addr == NULL_RTX)
   2627  1.1  mrg 	{
   2628  1.1  mrg 	  if (REG_P (src))
   2629  1.1  mrg 	    return 2;
   2630  1.1  mrg 
   2631  1.1  mrg 	  if (src == const0_rtx)
   2632  1.1  mrg 	    return 2;
   2633  1.1  mrg 
   2634  1.1  mrg 	  return 4;
   2635  1.1  mrg 	}
   2636  1.1  mrg 
   2637  1.1  mrg       base_length = 8;
   2638  1.1  mrg 	break;
   2639  1.1  mrg 
   2640  1.1  mrg     case E_SImode:
   2641  1.1  mrg       if (addr == NULL_RTX)
   2642  1.1  mrg 	{
   2643  1.1  mrg 	  if (REG_P (src))
   2644  1.1  mrg 	    {
   2645  1.1  mrg 	      if (REGNO (src) == MAC_REG || REGNO (dest) == MAC_REG)
   2646  1.1  mrg 		return 4;
   2647  1.1  mrg 	      else
   2648  1.1  mrg 		return 2;
   2649  1.1  mrg 	    }
   2650  1.1  mrg 
   2651  1.1  mrg 	  if (GET_CODE (src) == CONST_INT)
   2652  1.1  mrg 	    {
   2653  1.1  mrg 	      int val = INTVAL (src);
   2654  1.1  mrg 
   2655  1.1  mrg 	      if (val == 0)
   2656  1.1  mrg 		return 2;
   2657  1.1  mrg 
   2658  1.1  mrg 	      if (val == (val & 0x00ff) || val == (val & 0xff00))
   2659  1.1  mrg 		return 4;
   2660  1.1  mrg 
   2661  1.1  mrg 	      switch (val & 0xffffffff)
   2662  1.1  mrg 		{
   2663  1.1  mrg 		case 0xffffffff:
   2664  1.1  mrg 		case 0xfffffffe:
   2665  1.1  mrg 		case 0xfffffffc:
   2666  1.1  mrg 		case 0x0000ffff:
   2667  1.1  mrg 		case 0x0000fffe:
   2668  1.1  mrg 		case 0xffff0000:
   2669  1.1  mrg 		case 0xfffe0000:
   2670  1.1  mrg 		case 0x00010000:
   2671  1.1  mrg 		case 0x00020000:
   2672  1.1  mrg 		  return 4;
   2673  1.1  mrg 		}
   2674  1.1  mrg 	    }
   2675  1.1  mrg 	  return 6;
   2676  1.1  mrg 	}
   2677  1.1  mrg 
   2678  1.1  mrg       base_length = 10;
   2679  1.1  mrg       break;
   2680  1.1  mrg 
   2681  1.1  mrg     case E_SFmode:
   2682  1.1  mrg       if (addr == NULL_RTX)
   2683  1.1  mrg 	{
   2684  1.1  mrg 	  if (REG_P (src))
   2685  1.1  mrg    	    return 2;
   2686  1.1  mrg 
   2687  1.1  mrg 	  if (satisfies_constraint_G (src))
   2688  1.1  mrg 	    return 2;
   2689  1.1  mrg 
   2690  1.1  mrg 	  return 6;
   2691  1.1  mrg 	}
   2692  1.1  mrg 
   2693  1.1  mrg       base_length = 10;
   2694  1.1  mrg 	break;
   2695  1.1  mrg 
   2696  1.1  mrg     default:
   2697  1.1  mrg       gcc_unreachable ();
   2698  1.1  mrg     }
   2699  1.1  mrg 
   2700  1.1  mrg   /* Adjust the length based on the addressing mode used.
   2701  1.1  mrg      Specifically, we subtract the difference between the actual
   2702  1.1  mrg      length and the longest one, which is @(d:24,ERs).  */
   2703  1.1  mrg 
   2704  1.1  mrg   /* @ERs+ and @-ERd are 6 bytes shorter than the longest.  */
   2705  1.1  mrg   if (GET_CODE (addr) == PRE_DEC
   2706  1.1  mrg       || GET_CODE (addr) == POST_INC)
   2707  1.1  mrg     return base_length - 6;
   2708  1.1  mrg 
   2709  1.1  mrg   /* @ERs and @ERd are 6 bytes shorter than the longest.  */
   2710  1.1  mrg   if (GET_CODE (addr) == REG)
   2711  1.1  mrg     return base_length - 6;
   2712  1.1  mrg 
   2713  1.1  mrg   /* @(d:16,ERs) and @(d:16,ERd) are 4 bytes shorter than the
   2714  1.1  mrg      longest.  */
   2715  1.1  mrg   if (GET_CODE (addr) == PLUS
   2716  1.1  mrg       && GET_CODE (XEXP (addr, 0)) == REG
   2717  1.1  mrg       && GET_CODE (XEXP (addr, 1)) == CONST_INT
   2718  1.1  mrg       && INTVAL (XEXP (addr, 1)) > -32768
   2719  1.1  mrg       && INTVAL (XEXP (addr, 1)) < 32767)
   2720  1.1  mrg     return base_length - 4;
   2721  1.1  mrg 
   2722  1.1  mrg   /* @aa:16 is 4 bytes shorter than the longest.  */
   2723  1.1  mrg   if (h8300_tiny_constant_address_p (addr))
   2724  1.1  mrg     return base_length - 4;
   2725  1.1  mrg 
   2726  1.1  mrg   /* @aa:24 is 2 bytes shorter than the longest.  */
   2727  1.1  mrg   if (CONSTANT_P (addr))
   2728  1.1  mrg     return base_length - 2;
   2729  1.1  mrg 
   2730  1.1  mrg   return base_length;
   2731  1.1  mrg }
   2732  1.1  mrg 
   2733  1.1  mrg /* Output an addition insn.  */
   2735  1.1  mrg 
   2736  1.1  mrg const char *
   2737  1.1  mrg output_plussi (rtx *operands, bool need_flags)
   2738  1.1  mrg {
   2739  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   2740  1.1  mrg 
   2741  1.1  mrg   gcc_assert (mode == SImode);
   2742  1.1  mrg 
   2743  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT
   2744  1.1  mrg       && register_operand (operands[1], VOIDmode))
   2745  1.1  mrg     {
   2746  1.1  mrg       HOST_WIDE_INT intval = INTVAL (operands[2]);
   2747  1.1  mrg 
   2748  1.1  mrg       if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
   2749  1.1  mrg 	return "add.l\t%S2,%S0";
   2750  1.1  mrg       if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
   2751  1.1  mrg 	return "sub.l\t%G2,%S0";
   2752  1.1  mrg 
   2753  1.1  mrg       /* See if we can finish with 2 bytes.  */
   2754  1.1  mrg 
   2755  1.1  mrg       switch ((unsigned int) intval & 0xffffffff)
   2756  1.1  mrg 	{
   2757  1.1  mrg 	/* INC/DEC set the flags, but adds/subs do not.  So if we
   2758  1.1  mrg 	   need flags, use the former and not the latter.  */
   2759  1.1  mrg 	case 0x00000001:
   2760  1.1  mrg 	  if (need_flags)
   2761  1.1  mrg 	    return "inc.l\t#1,%S0";
   2762  1.1  mrg 	  else
   2763  1.1  mrg 	    return "adds\t%2,%S0";
   2764  1.1  mrg 	case 0x00000002:
   2765  1.1  mrg 	  if (need_flags)
   2766  1.1  mrg 	    return "inc.l\t#2,%S0";
   2767  1.1  mrg 	  else
   2768  1.1  mrg 	    return "adds\t%2,%S0";
   2769  1.1  mrg 	case 0xffffffff:
   2770  1.1  mrg 	  if (need_flags)
   2771  1.1  mrg 	    return "dec.l\t#1,%S0";
   2772  1.1  mrg 	  else
   2773  1.1  mrg 	    return "subs\t%G2,%S0";
   2774  1.1  mrg 	case 0xfffffffe:
   2775  1.1  mrg 	  if (need_flags)
   2776  1.1  mrg 	    return "dec.l\t#2,%S0";
   2777  1.1  mrg 	  else
   2778  1.1  mrg 	    return "subs\t%G2,%S0";
   2779  1.1  mrg 
   2780  1.1  mrg 	/* These six cases have optimized paths when we do not
   2781  1.1  mrg 	   need flags.  Otherwise we let them fallthru.  */
   2782  1.1  mrg 	case 0x00000004:
   2783  1.1  mrg 	  if (!need_flags)
   2784  1.1  mrg 	    return "adds\t%2,%S0";
   2785  1.1  mrg 
   2786  1.1  mrg 	  /* FALLTHRU */
   2787  1.1  mrg 
   2788  1.1  mrg 	case 0xfffffffc:
   2789  1.1  mrg 	  if (!need_flags)
   2790  1.1  mrg 	    return "subs\t%G2,%S0";
   2791  1.1  mrg 
   2792  1.1  mrg 	  /* FALLTHRU */
   2793  1.1  mrg 
   2794  1.1  mrg 	case 0x00010000:
   2795  1.1  mrg 	case 0x00020000:
   2796  1.1  mrg 	  if (!need_flags)
   2797  1.1  mrg 	    {
   2798  1.1  mrg 	      operands[2] = GEN_INT (intval >> 16);
   2799  1.1  mrg 	      return "inc.w\t%2,%e0";
   2800  1.1  mrg 	    }
   2801  1.1  mrg 
   2802  1.1  mrg 	  /* FALLTHRU */
   2803  1.1  mrg 
   2804  1.1  mrg 	case 0xffff0000:
   2805  1.1  mrg 	case 0xfffe0000:
   2806  1.1  mrg 	  if (!need_flags)
   2807  1.1  mrg 	    {
   2808  1.1  mrg 	      operands[2] = GEN_INT (intval >> 16);
   2809  1.1  mrg 	      return "dec.w\t%G2,%e0";
   2810  1.1  mrg 	    }
   2811  1.1  mrg 
   2812  1.1  mrg 	  /* FALLTHRU */
   2813  1.1  mrg 
   2814  1.1  mrg 	}
   2815  1.1  mrg 
   2816  1.1  mrg       /* See if we can finish with 4 bytes.  */
   2817  1.1  mrg       if ((intval & 0xffff) == 0)
   2818  1.1  mrg 	{
   2819  1.1  mrg 	  operands[2] = GEN_INT (intval >> 16);
   2820  1.1  mrg 	  return "add.w\t%2,%e0";
   2821  1.1  mrg 	}
   2822  1.1  mrg     }
   2823  1.1  mrg 
   2824  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
   2825  1.1  mrg     {
   2826  1.1  mrg       operands[2] = GEN_INT (-INTVAL (operands[2]));
   2827  1.1  mrg       return "sub.l\t%S2,%S0";
   2828  1.1  mrg     }
   2829  1.1  mrg   return "add.l\t%S2,%S0";
   2830  1.1  mrg }
   2831  1.1  mrg 
   2832  1.1  mrg /* ??? It would be much easier to add the h8sx stuff if a single function
   2833  1.1  mrg    classified the addition as either inc/dec, adds/subs, add.w or add.l.  */
   2834  1.1  mrg /* Compute the length of an addition insn.  */
   2835  1.1  mrg 
   2836  1.1  mrg unsigned int
   2837  1.1  mrg compute_plussi_length (rtx *operands, bool need_flags)
   2838  1.1  mrg {
   2839  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   2840  1.1  mrg 
   2841  1.1  mrg   gcc_assert (mode == SImode);
   2842  1.1  mrg 
   2843  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT
   2844  1.1  mrg       && register_operand (operands[1], VOIDmode))
   2845  1.1  mrg     {
   2846  1.1  mrg       HOST_WIDE_INT intval = INTVAL (operands[2]);
   2847  1.1  mrg 
   2848  1.1  mrg       if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
   2849  1.1  mrg 	return 2;
   2850  1.1  mrg       if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
   2851  1.1  mrg 	return 2;
   2852  1.1  mrg 
   2853  1.1  mrg       /* See if we can finish with 2 bytes.  */
   2854  1.1  mrg 
   2855  1.1  mrg       switch ((unsigned int) intval & 0xffffffff)
   2856  1.1  mrg 	{
   2857  1.1  mrg 	case 0x00000001:
   2858  1.1  mrg 	case 0x00000002:
   2859  1.1  mrg 	  return 2;
   2860  1.1  mrg 	case 0x00000004:
   2861  1.1  mrg 	  if (need_flags)
   2862  1.1  mrg 	    return 6;
   2863  1.1  mrg 	  else
   2864  1.1  mrg 	    return 2;
   2865  1.1  mrg 
   2866  1.1  mrg 	case 0xffffffff:
   2867  1.1  mrg 	case 0xfffffffe:
   2868  1.1  mrg 	  return 2;
   2869  1.1  mrg 	case 0xfffffffc:
   2870  1.1  mrg 	  if (need_flags)
   2871  1.1  mrg 	    return 6;
   2872  1.1  mrg 	  else
   2873  1.1  mrg 	    return 2;
   2874  1.1  mrg 
   2875  1.1  mrg 	case 0x00010000:
   2876  1.1  mrg 	case 0x00020000:
   2877  1.1  mrg 	  if (!need_flags)
   2878  1.1  mrg 	    return 2;
   2879  1.1  mrg 
   2880  1.1  mrg 	  /* FALLTHRU */
   2881  1.1  mrg 
   2882  1.1  mrg 	case 0xffff0000:
   2883  1.1  mrg 	case 0xfffe0000:
   2884  1.1  mrg 	  if (!need_flags)
   2885  1.1  mrg 	    return 2;
   2886  1.1  mrg 
   2887  1.1  mrg 	  /* FALLTHRU */
   2888  1.1  mrg 
   2889  1.1  mrg 	}
   2890  1.1  mrg 
   2891  1.1  mrg       /* See if we can finish with 4 bytes.  */
   2892  1.1  mrg       if ((intval & 0xffff) == 0)
   2893  1.1  mrg 	return 4;
   2894  1.1  mrg     }
   2895  1.1  mrg 
   2896  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
   2897  1.1  mrg     return h8300_length_from_table (operands[0],
   2898  1.1  mrg 				    GEN_INT (-INTVAL (operands[2])),
   2899  1.1  mrg 				    &addl_length_table);
   2900  1.1  mrg   else
   2901  1.1  mrg     return h8300_length_from_table (operands[0], operands[2],
   2902  1.1  mrg 				    &addl_length_table);
   2903  1.1  mrg }
   2904  1.1  mrg 
   2905  1.1  mrg /* Compute which flag bits are valid after an addition insn.  */
   2906  1.1  mrg 
   2907  1.1  mrg enum attr_old_cc
   2908  1.1  mrg compute_plussi_cc (rtx *operands)
   2909  1.1  mrg {
   2910  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   2911  1.1  mrg 
   2912  1.1  mrg   gcc_assert (mode == SImode);
   2913  1.1  mrg 
   2914  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT
   2915  1.1  mrg       && register_operand (operands[1], VOIDmode))
   2916  1.1  mrg     {
   2917  1.1  mrg       HOST_WIDE_INT intval = INTVAL (operands[2]);
   2918  1.1  mrg 
   2919  1.1  mrg       if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
   2920  1.1  mrg 	return OLD_CC_SET_ZN;
   2921  1.1  mrg       if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
   2922  1.1  mrg 	return OLD_CC_SET_ZN;
   2923  1.1  mrg 
   2924  1.1  mrg       /* See if we can finish with 2 bytes.  */
   2925  1.1  mrg 
   2926  1.1  mrg       switch ((unsigned int) intval & 0xffffffff)
   2927  1.1  mrg 	{
   2928  1.1  mrg 	case 0x00000001:
   2929  1.1  mrg 	case 0x00000002:
   2930  1.1  mrg 	case 0x00000004:
   2931  1.1  mrg 	  return OLD_CC_NONE_0HIT;
   2932  1.1  mrg 
   2933  1.1  mrg 	case 0xffffffff:
   2934  1.1  mrg 	case 0xfffffffe:
   2935  1.1  mrg 	case 0xfffffffc:
   2936  1.1  mrg 	  return OLD_CC_NONE_0HIT;
   2937  1.1  mrg 
   2938  1.1  mrg 	case 0x00010000:
   2939  1.1  mrg 	case 0x00020000:
   2940  1.1  mrg 	  return OLD_CC_CLOBBER;
   2941  1.1  mrg 
   2942  1.1  mrg 	case 0xffff0000:
   2943  1.1  mrg 	case 0xfffe0000:
   2944  1.1  mrg 	  return OLD_CC_CLOBBER;
   2945  1.1  mrg 	}
   2946  1.1  mrg 
   2947  1.1  mrg       /* See if we can finish with 4 bytes.  */
   2948  1.1  mrg       if ((intval & 0xffff) == 0)
   2949  1.1  mrg 	return OLD_CC_CLOBBER;
   2950  1.1  mrg     }
   2951  1.1  mrg 
   2952  1.1  mrg   return OLD_CC_SET_ZN;
   2953  1.1  mrg }
   2954  1.1  mrg 
   2955  1.1  mrg /* Output a logical insn.  */
   2957  1.1  mrg 
   2958  1.1  mrg const char *
   2959  1.1  mrg output_logical_op (machine_mode mode, rtx_code code, rtx *operands, rtx_insn *insn)
   2960  1.1  mrg {
   2961  1.1  mrg   /* Pretend that every byte is affected if both operands are registers.  */
   2962  1.1  mrg   const unsigned HOST_WIDE_INT intval =
   2963  1.1  mrg     (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
   2964  1.1  mrg 			      /* Always use the full instruction if the
   2965  1.1  mrg 				 first operand is in memory.  It is better
   2966  1.1  mrg 				 to use define_splits to generate the shorter
   2967  1.1  mrg 				 sequence where valid.  */
   2968  1.1  mrg 			      && register_operand (operands[1], VOIDmode)
   2969  1.1  mrg 			      ? INTVAL (operands[2]) : 0x55555555);
   2970  1.1  mrg   /* The determinant of the algorithm.  If we perform an AND, 0
   2971  1.1  mrg      affects a bit.  Otherwise, 1 affects a bit.  */
   2972  1.1  mrg   const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
   2973  1.1  mrg   /* Break up DET into pieces.  */
   2974  1.1  mrg   const unsigned HOST_WIDE_INT b0 = (det >>  0) & 0xff;
   2975  1.1  mrg   const unsigned HOST_WIDE_INT b1 = (det >>  8) & 0xff;
   2976  1.1  mrg   const unsigned HOST_WIDE_INT w0 = (det >>  0) & 0xffff;
   2977  1.1  mrg   const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
   2978  1.1  mrg   int lower_half_easy_p = 0;
   2979  1.1  mrg   int upper_half_easy_p = 0;
   2980  1.1  mrg   /* The name of an insn.  */
   2981  1.1  mrg   const char *opname;
   2982  1.1  mrg   char insn_buf[100];
   2983  1.1  mrg 
   2984  1.1  mrg   /* INSN is the current insn, we examine its overall form to see if we're
   2985  1.1  mrg      supposed to set or clobber the condition codes.
   2986  1.1  mrg 
   2987  1.1  mrg      This is important to know.  If we are setting condition codes, then we
   2988  1.1  mrg      must do the operation in MODE and not in some smaller size.
   2989  1.1  mrg 
   2990  1.1  mrg      The key is to look at the second object in the PARALLEL. If it is not
   2991  1.1  mrg      a CLOBBER, then we care about the condition codes.  */
   2992  1.1  mrg   rtx pattern = PATTERN (insn);
   2993  1.1  mrg   gcc_assert (GET_CODE (pattern) == PARALLEL);
   2994  1.1  mrg   rtx second_op = XVECEXP (pattern, 0, 1);
   2995  1.1  mrg   bool cc_meaningful = (GET_CODE (second_op) != CLOBBER);
   2996  1.1  mrg 
   2997  1.1  mrg   switch (code)
   2998  1.1  mrg     {
   2999  1.1  mrg     case AND:
   3000  1.1  mrg       opname = "and";
   3001  1.1  mrg       break;
   3002  1.1  mrg     case IOR:
   3003  1.1  mrg       opname = "or";
   3004  1.1  mrg       break;
   3005  1.1  mrg     case XOR:
   3006  1.1  mrg       opname = "xor";
   3007  1.1  mrg       break;
   3008  1.1  mrg     default:
   3009  1.1  mrg       gcc_unreachable ();
   3010  1.1  mrg     }
   3011  1.1  mrg 
   3012  1.1  mrg   switch (mode)
   3013  1.1  mrg     {
   3014  1.1  mrg     case E_QImode:
   3015  1.1  mrg       sprintf (insn_buf, "%s.b\t%%X2,%%X0", opname);
   3016  1.1  mrg       output_asm_insn (insn_buf, operands);
   3017  1.1  mrg       break;
   3018  1.1  mrg     case E_HImode:
   3019  1.1  mrg       /* First, see if we can (or must) finish with one insn.  */
   3020  1.1  mrg       if (cc_meaningful
   3021  1.1  mrg 	  || (b0 != 0 && b1 != 0))
   3022  1.1  mrg 	{
   3023  1.1  mrg 	  sprintf (insn_buf, "%s.w\t%%T2,%%T0", opname);
   3024  1.1  mrg 	  output_asm_insn (insn_buf, operands);
   3025  1.1  mrg 	}
   3026  1.1  mrg       else
   3027  1.1  mrg 	{
   3028  1.1  mrg 	  /* Take care of the lower byte.  */
   3029  1.1  mrg 	  if (b0 != 0)
   3030  1.1  mrg 	    {
   3031  1.1  mrg 	      sprintf (insn_buf, "%s\t%%s2,%%s0", opname);
   3032  1.1  mrg 	      output_asm_insn (insn_buf, operands);
   3033  1.1  mrg 	    }
   3034  1.1  mrg 	  /* Take care of the upper byte.  */
   3035  1.1  mrg 	  if (b1 != 0)
   3036  1.1  mrg 	    {
   3037  1.1  mrg 	      sprintf (insn_buf, "%s\t%%t2,%%t0", opname);
   3038  1.1  mrg 	      output_asm_insn (insn_buf, operands);
   3039  1.1  mrg 	    }
   3040  1.1  mrg 	}
   3041  1.1  mrg       break;
   3042  1.1  mrg     case E_SImode:
   3043  1.1  mrg       /* Determine if the lower half can be taken care of in no more
   3044  1.1  mrg 	 than two bytes.  */
   3045  1.1  mrg       lower_half_easy_p = (b0 == 0
   3046  1.1  mrg 			   || b1 == 0
   3047  1.1  mrg 			   || (code != IOR && w0 == 0xffff));
   3048  1.1  mrg 
   3049  1.1  mrg        /* Determine if the upper half can be taken care of in no more
   3050  1.1  mrg 	  than two bytes.  */
   3051  1.1  mrg       upper_half_easy_p = ((code != IOR && w1 == 0xffff)
   3052  1.1  mrg 			   || (code == AND && w1 == 0xff00));
   3053  1.1  mrg 
   3054  1.1  mrg       /* Check if doing everything with one insn is no worse than
   3055  1.1  mrg 	 using multiple insns.  */
   3056  1.1  mrg       if (cc_meaningful
   3057  1.1  mrg 	  || (w0 != 0 && w1 != 0
   3058  1.1  mrg 	      && !(lower_half_easy_p && upper_half_easy_p)
   3059  1.1  mrg 	      && !(code == IOR && w1 == 0xffff
   3060  1.1  mrg 		   && (w0 & 0x8000) != 0 && lower_half_easy_p)))
   3061  1.1  mrg 	{
   3062  1.1  mrg 	  sprintf (insn_buf, "%s.l\t%%S2,%%S0", opname);
   3063  1.1  mrg 	  output_asm_insn (insn_buf, operands);
   3064  1.1  mrg 	}
   3065  1.1  mrg       else
   3066  1.1  mrg 	{
   3067  1.1  mrg 	  /* Take care of the lower and upper words individually.  For
   3068  1.1  mrg 	     each word, we try different methods in the order of
   3069  1.1  mrg 
   3070  1.1  mrg 	     1) the special insn (in case of AND or XOR),
   3071  1.1  mrg 	     2) the word-wise insn, and
   3072  1.1  mrg 	     3) The byte-wise insn.  */
   3073  1.1  mrg 	  if (w0 == 0xffff && (code != IOR))
   3074  1.1  mrg 	    output_asm_insn ((code == AND)
   3075  1.1  mrg 			     ? "sub.w\t%f0,%f0" : "not.w\t%f0",
   3076  1.1  mrg 			     operands);
   3077  1.1  mrg 	  else if ((b0 != 0) && (b1 != 0))
   3078  1.1  mrg 	    {
   3079  1.1  mrg 	      sprintf (insn_buf, "%s.w\t%%f2,%%f0", opname);
   3080  1.1  mrg 	      output_asm_insn (insn_buf, operands);
   3081  1.1  mrg 	    }
   3082  1.1  mrg 	  else
   3083  1.1  mrg 	    {
   3084  1.1  mrg 	      if (b0 != 0)
   3085  1.1  mrg 		{
   3086  1.1  mrg 		  sprintf (insn_buf, "%s\t%%w2,%%w0", opname);
   3087  1.1  mrg 		  output_asm_insn (insn_buf, operands);
   3088  1.1  mrg 		}
   3089  1.1  mrg 	      if (b1 != 0)
   3090  1.1  mrg 		{
   3091  1.1  mrg 		  sprintf (insn_buf, "%s\t%%x2,%%x0", opname);
   3092  1.1  mrg 		  output_asm_insn (insn_buf, operands);
   3093  1.1  mrg 		}
   3094  1.1  mrg 	    }
   3095  1.1  mrg 
   3096  1.1  mrg 	  if ((w1 == 0xffff) && (code != IOR))
   3097  1.1  mrg 	    output_asm_insn ((code == AND)
   3098  1.1  mrg 			     ? "sub.w\t%e0,%e0" : "not.w\t%e0",
   3099  1.1  mrg 			     operands);
   3100  1.1  mrg 	  else if (code == IOR
   3101  1.1  mrg 		   && w1 == 0xffff
   3102  1.1  mrg 		   && (w0 & 0x8000) != 0)
   3103  1.1  mrg 	    {
   3104  1.1  mrg 	      output_asm_insn ("exts.l\t%S0", operands);
   3105  1.1  mrg 	    }
   3106  1.1  mrg 	  else if (code == AND
   3107  1.1  mrg 		   && w1 == 0xff00)
   3108  1.1  mrg 	    {
   3109  1.1  mrg 	      output_asm_insn ("extu.w\t%e0", operands);
   3110  1.1  mrg 	    }
   3111  1.1  mrg 	  else
   3112  1.1  mrg 	    {
   3113  1.1  mrg 	      if (w1 != 0)
   3114  1.1  mrg 		{
   3115  1.1  mrg 		  sprintf (insn_buf, "%s.w\t%%e2,%%e0", opname);
   3116  1.1  mrg 		  output_asm_insn (insn_buf, operands);
   3117  1.1  mrg 		}
   3118  1.1  mrg 	    }
   3119  1.1  mrg 	}
   3120  1.1  mrg       break;
   3121  1.1  mrg     default:
   3122  1.1  mrg       gcc_unreachable ();
   3123  1.1  mrg     }
   3124  1.1  mrg   return "";
   3125  1.1  mrg }
   3126  1.1  mrg 
   3127  1.1  mrg /* Compute the length of a logical insn.  */
   3128  1.1  mrg 
   3129  1.1  mrg unsigned int
   3130  1.1  mrg compute_logical_op_length (machine_mode mode, rtx_code code, rtx *operands, rtx_insn *insn)
   3131  1.1  mrg {
   3132  1.1  mrg   /* Pretend that every byte is affected if both operands are registers.  */
   3133  1.1  mrg   const unsigned HOST_WIDE_INT intval =
   3134  1.1  mrg     (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
   3135  1.1  mrg 			      /* Always use the full instruction if the
   3136  1.1  mrg 				 first operand is in memory.  It is better
   3137  1.1  mrg 				 to use define_splits to generate the shorter
   3138  1.1  mrg 				 sequence where valid.  */
   3139  1.1  mrg 			      && register_operand (operands[1], VOIDmode)
   3140  1.1  mrg 			      ? INTVAL (operands[2]) : 0x55555555);
   3141  1.1  mrg   /* The determinant of the algorithm.  If we perform an AND, 0
   3142  1.1  mrg      affects a bit.  Otherwise, 1 affects a bit.  */
   3143  1.1  mrg   const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
   3144  1.1  mrg   /* Break up DET into pieces.  */
   3145  1.1  mrg   const unsigned HOST_WIDE_INT b0 = (det >>  0) & 0xff;
   3146  1.1  mrg   const unsigned HOST_WIDE_INT b1 = (det >>  8) & 0xff;
   3147  1.1  mrg   const unsigned HOST_WIDE_INT w0 = (det >>  0) & 0xffff;
   3148  1.1  mrg   const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
   3149  1.1  mrg   int lower_half_easy_p = 0;
   3150  1.1  mrg   int upper_half_easy_p = 0;
   3151  1.1  mrg   /* Insn length.  */
   3152  1.1  mrg   unsigned int length = 0;
   3153  1.1  mrg 
   3154  1.1  mrg   /* INSN is the current insn, we examine its overall form to see if we're
   3155  1.1  mrg      supposed to set or clobber the condition codes.
   3156  1.1  mrg 
   3157  1.1  mrg      This is important to know.  If we are setting condition codes, then we
   3158  1.1  mrg      must do the operation in MODE and not in some smaller size.
   3159  1.1  mrg 
   3160  1.1  mrg      The key is to look at the second object in the PARALLEL. If it is not
   3161  1.1  mrg      a CLOBBER, then we care about the condition codes.  */
   3162  1.1  mrg   bool cc_meaningful = false;
   3163  1.1  mrg   if (insn)
   3164  1.1  mrg     {
   3165  1.1  mrg       rtx pattern = PATTERN (insn);
   3166  1.1  mrg       gcc_assert (GET_CODE (pattern) == PARALLEL);
   3167  1.1  mrg       rtx second_op = XVECEXP (pattern, 0, 1);
   3168  1.1  mrg       cc_meaningful = (GET_CODE (second_op) != CLOBBER);
   3169  1.1  mrg     }
   3170  1.1  mrg 
   3171  1.1  mrg   switch (mode)
   3172  1.1  mrg     {
   3173  1.1  mrg     case E_QImode:
   3174  1.1  mrg       return 2;
   3175  1.1  mrg 
   3176  1.1  mrg     case E_HImode:
   3177  1.1  mrg       /* First, see if we can finish with one insn.  */
   3178  1.1  mrg       if (cc_meaningful
   3179  1.1  mrg 	  || (b0 != 0 && b1 != 0))
   3180  1.1  mrg 	{
   3181  1.1  mrg 	  length = h8300_length_from_table (operands[1], operands[2],
   3182  1.1  mrg 					    &logicw_length_table);
   3183  1.1  mrg 	}
   3184  1.1  mrg       else
   3185  1.1  mrg 	{
   3186  1.1  mrg 	  /* Take care of the lower byte.  */
   3187  1.1  mrg 	  if (b0 != 0)
   3188  1.1  mrg 	    length += 2;
   3189  1.1  mrg 
   3190  1.1  mrg 	  /* Take care of the upper byte.  */
   3191  1.1  mrg 	  if (b1 != 0)
   3192  1.1  mrg 	    length += 2;
   3193  1.1  mrg 	}
   3194  1.1  mrg       break;
   3195  1.1  mrg     case E_SImode:
   3196  1.1  mrg       /* Determine if the lower half can be taken care of in no more
   3197  1.1  mrg 	 than two bytes.  */
   3198  1.1  mrg       lower_half_easy_p = (b0 == 0
   3199  1.1  mrg 			   || b1 == 0
   3200  1.1  mrg 			   || (code != IOR && w0 == 0xffff));
   3201  1.1  mrg 
   3202  1.1  mrg       /* Determine if the upper half can be taken care of in no more
   3203  1.1  mrg 	 than two bytes.  */
   3204  1.1  mrg       upper_half_easy_p = ((code != IOR && w1 == 0xffff)
   3205  1.1  mrg 			   || (code == AND && w1 == 0xff00));
   3206  1.1  mrg 
   3207  1.1  mrg       /* Check if doing everything with one insn is no worse than
   3208  1.1  mrg 	 using multiple insns.  */
   3209  1.1  mrg       if (cc_meaningful
   3210  1.1  mrg 	  || (w0 != 0 && w1 != 0
   3211  1.1  mrg 	      && !(lower_half_easy_p && upper_half_easy_p)
   3212  1.1  mrg 	      && !(code == IOR && w1 == 0xffff
   3213  1.1  mrg 		   && (w0 & 0x8000) != 0 && lower_half_easy_p)))
   3214  1.1  mrg 	{
   3215  1.1  mrg 	  length = h8300_length_from_table (operands[1], operands[2],
   3216  1.1  mrg 					    &logicl_length_table);
   3217  1.1  mrg 	}
   3218  1.1  mrg       else
   3219  1.1  mrg 	{
   3220  1.1  mrg 	  /* Take care of the lower and upper words individually.  For
   3221  1.1  mrg 	     each word, we try different methods in the order of
   3222  1.1  mrg 
   3223  1.1  mrg 	     1) the special insn (in case of AND or XOR),
   3224  1.1  mrg 	     2) the word-wise insn, and
   3225  1.1  mrg 	     3) The byte-wise insn.  */
   3226  1.1  mrg 	  if (w0 == 0xffff && (code != IOR))
   3227  1.1  mrg 	    {
   3228  1.1  mrg 	      length += 2;
   3229  1.1  mrg 	    }
   3230  1.1  mrg 	  else if ((b0 != 0) && (b1 != 0))
   3231  1.1  mrg 	    {
   3232  1.1  mrg 	      length += 4;
   3233  1.1  mrg 	    }
   3234  1.1  mrg 	  else
   3235  1.1  mrg 	    {
   3236  1.1  mrg 	      if (b0 != 0)
   3237  1.1  mrg 		length += 2;
   3238  1.1  mrg 
   3239  1.1  mrg 	      if (b1 != 0)
   3240  1.1  mrg 		length += 2;
   3241  1.1  mrg 	    }
   3242  1.1  mrg 
   3243  1.1  mrg 	  if (w1 == 0xffff && (code != IOR))
   3244  1.1  mrg 	    {
   3245  1.1  mrg 	      length += 2;
   3246  1.1  mrg 	    }
   3247  1.1  mrg 	  else if (code == IOR
   3248  1.1  mrg 		   && w1 == 0xffff
   3249  1.1  mrg 		   && (w0 & 0x8000) != 0)
   3250  1.1  mrg 	    {
   3251  1.1  mrg 	      length += 2;
   3252  1.1  mrg 	    }
   3253  1.1  mrg 	  else if (code == AND && w1 == 0xff00)
   3254  1.1  mrg 	    {
   3255  1.1  mrg 	      length += 2;
   3256  1.1  mrg 	    }
   3257  1.1  mrg 	  else
   3258  1.1  mrg 	    {
   3259  1.1  mrg 	      if (w1 != 0)
   3260  1.1  mrg 		length += 4;
   3261  1.1  mrg 	    }
   3262  1.1  mrg 	}
   3263  1.1  mrg       break;
   3264  1.1  mrg     default:
   3265  1.1  mrg       gcc_unreachable ();
   3266  1.1  mrg     }
   3267  1.1  mrg   return length;
   3268  1.1  mrg }
   3269  1.1  mrg 
   3270  1.1  mrg #if 0
   3271  1.1  mrg 
   3272  1.1  mrg /* Expand a conditional store.  */
   3274  1.1  mrg 
   3275  1.1  mrg void
   3276  1.1  mrg h8300_expand_store (rtx operands[])
   3277  1.1  mrg {
   3278  1.1  mrg   rtx dest = operands[0];
   3279  1.1  mrg   enum rtx_code code = GET_CODE (operands[1]);
   3280  1.1  mrg   rtx op0 = operands[2];
   3281  1.1  mrg   rtx op1 = operands[3];
   3282  1.1  mrg   rtx tmp;
   3283  1.1  mrg 
   3284  1.1  mrg   tmp = gen_rtx_COMPARE (VOIDmode, op0, op1);
   3285  1.1  mrg   emit_insn (gen_rtx_SET (cc0_rtx, tmp));
   3286  1.1  mrg 
   3287  1.1  mrg   tmp = gen_rtx_fmt_ee (code, GET_MODE (dest), cc0_rtx, const0_rtx);
   3288  1.1  mrg   emit_insn (gen_rtx_SET (dest, tmp));
   3289  1.1  mrg }
   3290  1.1  mrg #endif
   3291  1.1  mrg 
   3292  1.1  mrg /* Shifts.
   3294  1.1  mrg 
   3295  1.1  mrg    We devote a fair bit of code to getting efficient shifts since we
   3296  1.1  mrg    can only shift one bit at a time on the H8/300 and H8/300H and only
   3297  1.1  mrg    one or two bits at a time on the H8S.
   3298  1.1  mrg 
   3299  1.1  mrg    All shift code falls into one of the following ways of
   3300  1.1  mrg    implementation:
   3301  1.1  mrg 
   3302  1.1  mrg    o SHIFT_INLINE: Emit straight line code for the shift; this is used
   3303  1.1  mrg      when a straight line shift is about the same size or smaller than
   3304  1.1  mrg      a loop.
   3305  1.1  mrg 
   3306  1.1  mrg    o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
   3307  1.1  mrg      off the bits we don't need.  This is used when only a few of the
   3308  1.1  mrg      bits in the original value will survive in the shifted value.
   3309  1.1  mrg 
   3310  1.1  mrg    o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
   3311  1.1  mrg      simulate a shift by 8, 16, or 24 bits.  Once moved, a few inline
   3312  1.1  mrg      shifts can be added if the shift count is slightly more than 8 or
   3313  1.1  mrg      16.  This case also includes other oddballs that are not worth
   3314  1.1  mrg      explaining here.
   3315  1.1  mrg 
   3316  1.1  mrg    o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
   3317  1.1  mrg 
   3318  1.1  mrg    For each shift count, we try to use code that has no trade-off
   3319  1.1  mrg    between code size and speed whenever possible.
   3320  1.1  mrg 
   3321  1.1  mrg    If the trade-off is unavoidable, we try to be reasonable.
   3322  1.1  mrg    Specifically, the fastest version is one instruction longer than
   3323  1.1  mrg    the shortest version, we take the fastest version.  We also provide
   3324  1.1  mrg    the use a way to switch back to the shortest version with -Os.
   3325  1.1  mrg 
   3326  1.1  mrg    For the details of the shift algorithms for various shift counts,
   3327  1.1  mrg    refer to shift_alg_[qhs]i.  */
   3328  1.1  mrg 
   3329  1.1  mrg /* Classify a shift with the given mode and code.  OP is the shift amount.  */
   3330  1.1  mrg 
   3331  1.1  mrg enum h8sx_shift_type
   3332  1.1  mrg h8sx_classify_shift (machine_mode mode, enum rtx_code code, rtx op)
   3333  1.1  mrg {
   3334  1.1  mrg   if (!TARGET_H8300SX)
   3335  1.1  mrg     return H8SX_SHIFT_NONE;
   3336  1.1  mrg 
   3337  1.1  mrg   switch (code)
   3338  1.1  mrg     {
   3339  1.1  mrg     case ASHIFT:
   3340  1.1  mrg     case LSHIFTRT:
   3341  1.1  mrg       /* Check for variable shifts (shll Rs,Rd and shlr Rs,Rd).  */
   3342  1.1  mrg       if (GET_CODE (op) != CONST_INT)
   3343  1.1  mrg 	return H8SX_SHIFT_BINARY;
   3344  1.1  mrg 
   3345  1.1  mrg       /* Reject out-of-range shift amounts.  */
   3346  1.1  mrg       if (INTVAL (op) <= 0 || INTVAL (op) >= GET_MODE_BITSIZE (mode))
   3347  1.1  mrg 	return H8SX_SHIFT_NONE;
   3348  1.1  mrg 
   3349  1.1  mrg       /* Power-of-2 shifts are effectively unary operations.  */
   3350  1.1  mrg       if (exact_log2 (INTVAL (op)) >= 0)
   3351  1.1  mrg 	return H8SX_SHIFT_UNARY;
   3352  1.1  mrg 
   3353  1.1  mrg       return H8SX_SHIFT_BINARY;
   3354  1.1  mrg 
   3355  1.1  mrg     case ASHIFTRT:
   3356  1.1  mrg       if (op == const1_rtx || op == const2_rtx)
   3357  1.1  mrg 	return H8SX_SHIFT_UNARY;
   3358  1.1  mrg       return H8SX_SHIFT_NONE;
   3359  1.1  mrg 
   3360  1.1  mrg     case ROTATE:
   3361  1.1  mrg       if (GET_CODE (op) == CONST_INT
   3362  1.1  mrg 	  && (INTVAL (op) == 1
   3363  1.1  mrg 	      || INTVAL (op) == 2
   3364  1.1  mrg 	      || INTVAL (op) == GET_MODE_BITSIZE (mode) - 2
   3365  1.1  mrg 	      || INTVAL (op) == GET_MODE_BITSIZE (mode) - 1))
   3366  1.1  mrg 	return H8SX_SHIFT_UNARY;
   3367  1.1  mrg       return H8SX_SHIFT_NONE;
   3368  1.1  mrg 
   3369  1.1  mrg     default:
   3370  1.1  mrg       return H8SX_SHIFT_NONE;
   3371  1.1  mrg     }
   3372  1.1  mrg }
   3373  1.1  mrg 
   3374  1.1  mrg /* Return the asm template for a single h8sx shift instruction.
   3375  1.1  mrg    OPERANDS[0] and OPERANDS[1] are the destination, OPERANDS[2]
   3376  1.1  mrg    is the source and OPERANDS[3] is the shift.  SUFFIX is the
   3377  1.1  mrg    size suffix ('b', 'w' or 'l') and OPTYPE is the h8300_print_operand
   3378  1.1  mrg    prefix for the destination operand.  */
   3379  1.1  mrg 
   3380  1.1  mrg const char *
   3381  1.1  mrg output_h8sx_shift (rtx *operands, int suffix, int optype)
   3382  1.1  mrg {
   3383  1.1  mrg   static char buffer[16];
   3384  1.1  mrg   const char *stem;
   3385  1.1  mrg 
   3386  1.1  mrg   switch (GET_CODE (operands[3]))
   3387  1.1  mrg     {
   3388  1.1  mrg     case ASHIFT:
   3389  1.1  mrg       stem = "shll";
   3390  1.1  mrg       break;
   3391  1.1  mrg 
   3392  1.1  mrg     case ASHIFTRT:
   3393  1.1  mrg       stem = "shar";
   3394  1.1  mrg       break;
   3395  1.1  mrg 
   3396  1.1  mrg     case LSHIFTRT:
   3397  1.1  mrg       stem = "shlr";
   3398  1.1  mrg       break;
   3399  1.1  mrg 
   3400  1.1  mrg     case ROTATE:
   3401  1.1  mrg       stem = "rotl";
   3402  1.1  mrg       if (INTVAL (operands[2]) > 2)
   3403  1.1  mrg 	{
   3404  1.1  mrg 	  /* This is really a right rotate.  */
   3405  1.1  mrg 	  operands[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands[0]))
   3406  1.1  mrg 				 - INTVAL (operands[2]));
   3407  1.1  mrg 	  stem = "rotr";
   3408  1.1  mrg 	}
   3409  1.1  mrg       break;
   3410  1.1  mrg 
   3411  1.1  mrg     default:
   3412  1.1  mrg       gcc_unreachable ();
   3413  1.1  mrg     }
   3414  1.1  mrg   if (operands[2] == const1_rtx)
   3415  1.1  mrg     sprintf (buffer, "%s.%c\t%%%c0", stem, suffix, optype);
   3416  1.1  mrg   else
   3417  1.1  mrg     sprintf (buffer, "%s.%c\t%%X2,%%%c0", stem, suffix, optype);
   3418  1.1  mrg   return buffer;
   3419  1.1  mrg }
   3420  1.1  mrg 
   3421  1.1  mrg /* Emit code to do shifts.  */
   3422  1.1  mrg 
   3423  1.1  mrg bool
   3424  1.1  mrg expand_a_shift (machine_mode mode, enum rtx_code code, rtx operands[])
   3425  1.1  mrg {
   3426  1.1  mrg   switch (h8sx_classify_shift (mode, code, operands[2]))
   3427  1.1  mrg     {
   3428  1.1  mrg     case H8SX_SHIFT_BINARY:
   3429  1.1  mrg       operands[1] = force_reg (mode, operands[1]);
   3430  1.1  mrg       return false;
   3431  1.1  mrg 
   3432  1.1  mrg     case H8SX_SHIFT_UNARY:
   3433  1.1  mrg       return false;
   3434  1.1  mrg 
   3435  1.1  mrg     case H8SX_SHIFT_NONE:
   3436  1.1  mrg       break;
   3437  1.1  mrg     }
   3438  1.1  mrg 
   3439  1.1  mrg   /* Need a loop to get all the bits we want  - we generate the
   3440  1.1  mrg      code at emit time, but need to allocate a scratch reg now.  */
   3441  1.1  mrg   emit_move_insn (copy_rtx (operands[0]), operands[1]);
   3442  1.1  mrg   if (operands[2] == CONST0_RTX (QImode))
   3443  1.1  mrg     ;
   3444  1.1  mrg   else if (GET_CODE (operands[2]) == CONST_INT
   3445  1.1  mrg       && !h8300_shift_needs_scratch_p (INTVAL (operands[2]), mode, code))
   3446  1.1  mrg     emit_insn (gen_rtx_SET (copy_rtx (operands[0]),
   3447  1.1  mrg 			      gen_rtx_fmt_ee (code, mode,
   3448  1.1  mrg 					      copy_rtx (operands[1]), operands[2])));
   3449  1.1  mrg   else
   3450  1.1  mrg     emit_insn (gen_rtx_PARALLEL
   3451  1.1  mrg 	       (VOIDmode,
   3452  1.1  mrg 		gen_rtvec (2,
   3453  1.1  mrg 			   gen_rtx_SET (copy_rtx (operands[0]),
   3454  1.1  mrg 					gen_rtx_fmt_ee (code, mode,
   3455  1.1  mrg 							copy_rtx (operands[0]), operands[2])),
   3456  1.1  mrg 			   gen_rtx_CLOBBER (VOIDmode,
   3457  1.1  mrg 					    gen_rtx_SCRATCH (QImode)))));
   3458  1.1  mrg   return true;
   3459  1.1  mrg }
   3460  1.1  mrg 
   3461  1.1  mrg /* Symbols of the various modes which can be used as indices.  */
   3462  1.1  mrg 
   3463  1.1  mrg enum shift_mode
   3464  1.1  mrg {
   3465  1.1  mrg   QIshift, HIshift, SIshift
   3466  1.1  mrg };
   3467  1.1  mrg 
   3468  1.1  mrg /* For single bit shift insns, record assembler and what bits of the
   3469  1.1  mrg    condition code are valid afterwards (represented as various OLD_CC_FOO
   3470  1.1  mrg    bits, 0 means CC isn't left in a usable state).  */
   3471  1.1  mrg 
   3472  1.1  mrg struct shift_insn
   3473  1.1  mrg {
   3474  1.1  mrg   const char *const assembler;
   3475  1.1  mrg   const enum attr_old_cc cc_valid;
   3476  1.1  mrg };
   3477  1.1  mrg 
   3478  1.1  mrg /* Assembler instruction shift table.
   3479  1.1  mrg 
   3480  1.1  mrg    These tables are used to look up the basic shifts.
   3481  1.1  mrg    They are indexed by cpu, shift_type, and mode.  */
   3482  1.1  mrg 
   3483  1.1  mrg static const struct shift_insn shift_one[2][3][3] =
   3484  1.1  mrg {
   3485  1.1  mrg /* H8/300 */
   3486  1.1  mrg   {
   3487  1.1  mrg /* SHIFT_ASHIFT */
   3488  1.1  mrg     {
   3489  1.1  mrg       { "shll\t%X0", OLD_CC_SET_ZNV },
   3490  1.1  mrg       { "add.w\t%T0,%T0", OLD_CC_SET_ZN },
   3491  1.1  mrg       { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", OLD_CC_CLOBBER }
   3492  1.1  mrg     },
   3493  1.1  mrg /* SHIFT_LSHIFTRT */
   3494  1.1  mrg     {
   3495  1.1  mrg       { "shlr\t%X0", OLD_CC_SET_ZNV },
   3496  1.1  mrg       { "shlr\t%t0\n\trotxr\t%s0", OLD_CC_CLOBBER },
   3497  1.1  mrg       { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", OLD_CC_CLOBBER }
   3498  1.1  mrg     },
   3499  1.1  mrg /* SHIFT_ASHIFTRT */
   3500  1.1  mrg     {
   3501  1.1  mrg       { "shar\t%X0", OLD_CC_SET_ZNV },
   3502  1.1  mrg       { "shar\t%t0\n\trotxr\t%s0", OLD_CC_CLOBBER },
   3503  1.1  mrg       { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", OLD_CC_CLOBBER }
   3504  1.1  mrg     }
   3505  1.1  mrg   },
   3506  1.1  mrg /* H8/300H */
   3507  1.1  mrg   {
   3508  1.1  mrg /* SHIFT_ASHIFT */
   3509  1.1  mrg     {
   3510  1.1  mrg       { "shll.b\t%X0", OLD_CC_SET_ZNV },
   3511  1.1  mrg       { "shll.w\t%T0", OLD_CC_SET_ZNV },
   3512  1.1  mrg       { "shll.l\t%S0", OLD_CC_SET_ZNV }
   3513  1.1  mrg     },
   3514  1.1  mrg /* SHIFT_LSHIFTRT */
   3515  1.1  mrg     {
   3516  1.1  mrg       { "shlr.b\t%X0", OLD_CC_SET_ZNV },
   3517  1.1  mrg       { "shlr.w\t%T0", OLD_CC_SET_ZNV },
   3518  1.1  mrg       { "shlr.l\t%S0", OLD_CC_SET_ZNV }
   3519  1.1  mrg     },
   3520  1.1  mrg /* SHIFT_ASHIFTRT */
   3521  1.1  mrg     {
   3522  1.1  mrg       { "shar.b\t%X0", OLD_CC_SET_ZNV },
   3523  1.1  mrg       { "shar.w\t%T0", OLD_CC_SET_ZNV },
   3524  1.1  mrg       { "shar.l\t%S0", OLD_CC_SET_ZNV }
   3525  1.1  mrg     }
   3526  1.1  mrg   }
   3527  1.1  mrg };
   3528  1.1  mrg 
   3529  1.1  mrg static const struct shift_insn shift_two[3][3] =
   3530  1.1  mrg {
   3531  1.1  mrg /* SHIFT_ASHIFT */
   3532  1.1  mrg     {
   3533  1.1  mrg       { "shll.b\t#2,%X0", OLD_CC_SET_ZNV },
   3534  1.1  mrg       { "shll.w\t#2,%T0", OLD_CC_SET_ZNV },
   3535  1.1  mrg       { "shll.l\t#2,%S0", OLD_CC_SET_ZNV }
   3536  1.1  mrg     },
   3537  1.1  mrg /* SHIFT_LSHIFTRT */
   3538  1.1  mrg     {
   3539  1.1  mrg       { "shlr.b\t#2,%X0", OLD_CC_SET_ZNV },
   3540  1.1  mrg       { "shlr.w\t#2,%T0", OLD_CC_SET_ZNV },
   3541  1.1  mrg       { "shlr.l\t#2,%S0", OLD_CC_SET_ZNV }
   3542  1.1  mrg     },
   3543  1.1  mrg /* SHIFT_ASHIFTRT */
   3544  1.1  mrg     {
   3545  1.1  mrg       { "shar.b\t#2,%X0", OLD_CC_SET_ZNV },
   3546  1.1  mrg       { "shar.w\t#2,%T0", OLD_CC_SET_ZNV },
   3547  1.1  mrg       { "shar.l\t#2,%S0", OLD_CC_SET_ZNV }
   3548  1.1  mrg     }
   3549  1.1  mrg };
   3550  1.1  mrg 
   3551  1.1  mrg /* Rotates are organized by which shift they'll be used in implementing.
   3552  1.1  mrg    There's no need to record whether the cc is valid afterwards because
   3553  1.1  mrg    it is the AND insn that will decide this.  */
   3554  1.1  mrg 
   3555  1.1  mrg static const char *const rotate_one[2][3][3] =
   3556  1.1  mrg {
   3557  1.1  mrg /* H8/300 */
   3558  1.1  mrg   {
   3559  1.1  mrg /* SHIFT_ASHIFT */
   3560  1.1  mrg     {
   3561  1.1  mrg       "rotr\t%X0",
   3562  1.1  mrg       "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
   3563  1.1  mrg       0
   3564  1.1  mrg     },
   3565  1.1  mrg /* SHIFT_LSHIFTRT */
   3566  1.1  mrg     {
   3567  1.1  mrg       "rotl\t%X0",
   3568  1.1  mrg       "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
   3569  1.1  mrg       0
   3570  1.1  mrg     },
   3571  1.1  mrg /* SHIFT_ASHIFTRT */
   3572  1.1  mrg     {
   3573  1.1  mrg       "rotl\t%X0",
   3574  1.1  mrg       "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
   3575  1.1  mrg       0
   3576  1.1  mrg     }
   3577  1.1  mrg   },
   3578  1.1  mrg /* H8/300H */
   3579  1.1  mrg   {
   3580  1.1  mrg /* SHIFT_ASHIFT */
   3581  1.1  mrg     {
   3582  1.1  mrg       "rotr.b\t%X0",
   3583  1.1  mrg       "rotr.w\t%T0",
   3584  1.1  mrg       "rotr.l\t%S0"
   3585  1.1  mrg     },
   3586  1.1  mrg /* SHIFT_LSHIFTRT */
   3587  1.1  mrg     {
   3588  1.1  mrg       "rotl.b\t%X0",
   3589  1.1  mrg       "rotl.w\t%T0",
   3590  1.1  mrg       "rotl.l\t%S0"
   3591  1.1  mrg     },
   3592  1.1  mrg /* SHIFT_ASHIFTRT */
   3593  1.1  mrg     {
   3594  1.1  mrg       "rotl.b\t%X0",
   3595  1.1  mrg       "rotl.w\t%T0",
   3596  1.1  mrg       "rotl.l\t%S0"
   3597  1.1  mrg     }
   3598  1.1  mrg   }
   3599  1.1  mrg };
   3600  1.1  mrg 
   3601  1.1  mrg static const char *const rotate_two[3][3] =
   3602  1.1  mrg {
   3603  1.1  mrg /* SHIFT_ASHIFT */
   3604  1.1  mrg     {
   3605  1.1  mrg       "rotr.b\t#2,%X0",
   3606  1.1  mrg       "rotr.w\t#2,%T0",
   3607  1.1  mrg       "rotr.l\t#2,%S0"
   3608  1.1  mrg     },
   3609  1.1  mrg /* SHIFT_LSHIFTRT */
   3610  1.1  mrg     {
   3611  1.1  mrg       "rotl.b\t#2,%X0",
   3612  1.1  mrg       "rotl.w\t#2,%T0",
   3613  1.1  mrg       "rotl.l\t#2,%S0"
   3614  1.1  mrg     },
   3615  1.1  mrg /* SHIFT_ASHIFTRT */
   3616  1.1  mrg     {
   3617  1.1  mrg       "rotl.b\t#2,%X0",
   3618  1.1  mrg       "rotl.w\t#2,%T0",
   3619  1.1  mrg       "rotl.l\t#2,%S0"
   3620  1.1  mrg     }
   3621  1.1  mrg };
   3622  1.1  mrg 
   3623  1.1  mrg struct shift_info {
   3624  1.1  mrg   /* Shift algorithm.  */
   3625  1.1  mrg   enum shift_alg alg;
   3626  1.1  mrg 
   3627  1.1  mrg   /* The number of bits to be shifted by shift1 and shift2.  Valid
   3628  1.1  mrg      when ALG is SHIFT_SPECIAL.  */
   3629  1.1  mrg   unsigned int remainder;
   3630  1.1  mrg 
   3631  1.1  mrg   /* Special insn for a shift.  Valid when ALG is SHIFT_SPECIAL.  */
   3632  1.1  mrg   const char *special;
   3633  1.1  mrg 
   3634  1.1  mrg   /* Insn for a one-bit shift.  Valid when ALG is either SHIFT_INLINE
   3635  1.1  mrg      or SHIFT_SPECIAL, and REMAINDER is nonzero.  */
   3636  1.1  mrg   const char *shift1;
   3637  1.1  mrg 
   3638  1.1  mrg   /* Insn for a two-bit shift.  Valid when ALG is either SHIFT_INLINE
   3639  1.1  mrg      or SHIFT_SPECIAL, and REMAINDER is nonzero.  */
   3640  1.1  mrg   const char *shift2;
   3641  1.1  mrg 
   3642  1.1  mrg   /* CC status for SHIFT_INLINE.  */
   3643  1.1  mrg   enum attr_old_cc cc_inline;
   3644  1.1  mrg 
   3645  1.1  mrg   /* CC status  for SHIFT_SPECIAL.  */
   3646  1.1  mrg   enum attr_old_cc cc_special;
   3647  1.1  mrg };
   3648  1.1  mrg 
   3649  1.1  mrg static void get_shift_alg (enum shift_type,
   3650  1.1  mrg 			   enum shift_mode, unsigned int,
   3651  1.1  mrg 			   struct shift_info *);
   3652  1.1  mrg 
   3653  1.1  mrg /* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
   3654  1.1  mrg    best algorithm for doing the shift.  The assembler code is stored
   3655  1.1  mrg    in the pointers in INFO.  We achieve the maximum efficiency in most
   3656  1.1  mrg    cases.
   3657  1.1  mrg 
   3658  1.1  mrg    We first determine the strategy of the shift algorithm by a table
   3659  1.1  mrg    lookup.  If that tells us to use a hand crafted assembly code, we
   3660  1.1  mrg    go into the big switch statement to find what that is.  Otherwise,
   3661  1.1  mrg    we resort to a generic way, such as inlining.  In either case, the
   3662  1.1  mrg    result is returned through INFO.  */
   3663  1.1  mrg 
   3664  1.1  mrg static void
   3665  1.1  mrg get_shift_alg (enum shift_type shift_type, enum shift_mode shift_mode,
   3666  1.1  mrg 	       unsigned int count, struct shift_info *info)
   3667  1.1  mrg {
   3668  1.1  mrg   enum h8_cpu cpu;
   3669  1.1  mrg 
   3670  1.1  mrg   if (TARGET_H8300S)
   3671  1.1  mrg     cpu = H8_S;
   3672  1.1  mrg   else
   3673  1.1  mrg     cpu = H8_300H;
   3674  1.1  mrg 
   3675  1.1  mrg   /* Find the shift algorithm.  */
   3676  1.1  mrg   info->alg = SHIFT_LOOP;
   3677  1.1  mrg   switch (shift_mode)
   3678  1.1  mrg     {
   3679  1.1  mrg     case QIshift:
   3680  1.1  mrg       if (count < GET_MODE_BITSIZE (QImode))
   3681  1.1  mrg 	info->alg = shift_alg_qi[cpu][shift_type][count];
   3682  1.1  mrg       break;
   3683  1.1  mrg 
   3684  1.1  mrg     case HIshift:
   3685  1.1  mrg       if (count < GET_MODE_BITSIZE (HImode))
   3686  1.1  mrg 	info->alg = shift_alg_hi[cpu][shift_type][count];
   3687  1.1  mrg       break;
   3688  1.1  mrg 
   3689  1.1  mrg     case SIshift:
   3690  1.1  mrg       if (count < GET_MODE_BITSIZE (SImode))
   3691  1.1  mrg 	info->alg = shift_alg_si[cpu][shift_type][count];
   3692  1.1  mrg       break;
   3693  1.1  mrg 
   3694  1.1  mrg     default:
   3695  1.1  mrg       gcc_unreachable ();
   3696  1.1  mrg     }
   3697  1.1  mrg 
   3698  1.1  mrg   /* Fill in INFO.  Return unless we have SHIFT_SPECIAL.  */
   3699  1.1  mrg   switch (info->alg)
   3700  1.1  mrg     {
   3701  1.1  mrg     case SHIFT_INLINE:
   3702  1.1  mrg       info->remainder = count;
   3703  1.1  mrg       /* Fall through.  */
   3704  1.1  mrg 
   3705  1.1  mrg     case SHIFT_LOOP:
   3706  1.1  mrg       /* It is up to the caller to know that looping clobbers cc.  */
   3707  1.1  mrg       info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
   3708  1.1  mrg       info->shift2 = shift_two[shift_type][shift_mode].assembler;
   3709  1.1  mrg       info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
   3710  1.1  mrg       goto end;
   3711  1.1  mrg 
   3712  1.1  mrg     case SHIFT_ROT_AND:
   3713  1.1  mrg       info->shift1 = rotate_one[cpu_type][shift_type][shift_mode];
   3714  1.1  mrg       info->shift2 = rotate_two[shift_type][shift_mode];
   3715  1.1  mrg       info->cc_inline = OLD_CC_CLOBBER;
   3716  1.1  mrg       goto end;
   3717  1.1  mrg 
   3718  1.1  mrg     case SHIFT_SPECIAL:
   3719  1.1  mrg       /* REMAINDER is 0 for most cases, so initialize it to 0.  */
   3720  1.1  mrg       info->remainder = 0;
   3721  1.1  mrg       info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
   3722  1.1  mrg       info->shift2 = shift_two[shift_type][shift_mode].assembler;
   3723  1.1  mrg       info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
   3724  1.1  mrg       info->cc_special = OLD_CC_CLOBBER;
   3725  1.1  mrg       break;
   3726  1.1  mrg     }
   3727  1.1  mrg 
   3728  1.1  mrg   /* Here we only deal with SHIFT_SPECIAL.  */
   3729  1.1  mrg   switch (shift_mode)
   3730  1.1  mrg     {
   3731  1.1  mrg     case QIshift:
   3732  1.1  mrg       /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
   3733  1.1  mrg 	 through the entire value.  */
   3734  1.1  mrg       gcc_assert (shift_type == SHIFT_ASHIFTRT && count == 7);
   3735  1.1  mrg       info->special = "shll\t%X0\n\tsubx\t%X0,%X0";
   3736  1.1  mrg       goto end;
   3737  1.1  mrg 
   3738  1.1  mrg     case HIshift:
   3739  1.1  mrg       if (count == 7)
   3740  1.1  mrg 	{
   3741  1.1  mrg 	  switch (shift_type)
   3742  1.1  mrg 	    {
   3743  1.1  mrg 	    case SHIFT_ASHIFT:
   3744  1.1  mrg 	      info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
   3745  1.1  mrg 	      goto end;
   3746  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3747  1.1  mrg 	      info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
   3748  1.1  mrg 	      goto end;
   3749  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3750  1.1  mrg 	      info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
   3751  1.1  mrg 	      goto end;
   3752  1.1  mrg 	    }
   3753  1.1  mrg 	}
   3754  1.1  mrg       else if ((count >= 8 && count <= 13)
   3755  1.1  mrg 	       || (TARGET_H8300S && count == 14))
   3756  1.1  mrg 	{
   3757  1.1  mrg 	  info->remainder = count - 8;
   3758  1.1  mrg 
   3759  1.1  mrg 	  switch (shift_type)
   3760  1.1  mrg 	    {
   3761  1.1  mrg 	    case SHIFT_ASHIFT:
   3762  1.1  mrg 	      info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
   3763  1.1  mrg 	      goto end;
   3764  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3765  1.1  mrg 	      info->special = "mov.b\t%t0,%s0\n\textu.w\t%T0";
   3766  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3767  1.1  mrg 	      goto end;
   3768  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3769  1.1  mrg 	      info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0";
   3770  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3771  1.1  mrg 	      goto end;
   3772  1.1  mrg 	    }
   3773  1.1  mrg 	}
   3774  1.1  mrg       else if (count == 14)
   3775  1.1  mrg 	{
   3776  1.1  mrg 	  switch (shift_type)
   3777  1.1  mrg 	    {
   3778  1.1  mrg 	    case SHIFT_ASHIFT:
   3779  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3780  1.1  mrg 	      goto end;
   3781  1.1  mrg 	      goto end;
   3782  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3783  1.1  mrg 	      if (TARGET_H8300H)
   3784  1.1  mrg 		{
   3785  1.1  mrg 		  info->special = "shll.b\t%t0\n\tsubx.b\t%s0,%s0\n\tshll.b\t%t0\n\trotxl.b\t%s0\n\texts.w\t%T0";
   3786  1.1  mrg 		  info->cc_special = OLD_CC_SET_ZNV;
   3787  1.1  mrg 		}
   3788  1.1  mrg 	      else /* TARGET_H8300S */
   3789  1.1  mrg 		gcc_unreachable ();
   3790  1.1  mrg 	      goto end;
   3791  1.1  mrg 	    }
   3792  1.1  mrg 	}
   3793  1.1  mrg       else if (count == 15)
   3794  1.1  mrg 	{
   3795  1.1  mrg 	  switch (shift_type)
   3796  1.1  mrg 	    {
   3797  1.1  mrg 	    case SHIFT_ASHIFT:
   3798  1.1  mrg 	      info->special = "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
   3799  1.1  mrg 	      goto end;
   3800  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3801  1.1  mrg 	      info->special = "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
   3802  1.1  mrg 	      goto end;
   3803  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3804  1.1  mrg 	      info->special = "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
   3805  1.1  mrg 	      goto end;
   3806  1.1  mrg 	    }
   3807  1.1  mrg 	}
   3808  1.1  mrg       gcc_unreachable ();
   3809  1.1  mrg 
   3810  1.1  mrg     case SIshift:
   3811  1.1  mrg       if (count == 8)
   3812  1.1  mrg 	{
   3813  1.1  mrg 	  switch (shift_type)
   3814  1.1  mrg 	    {
   3815  1.1  mrg 	    case SHIFT_ASHIFT:
   3816  1.1  mrg 	      info->special = "mov.w\t%e0,%f3\n\tmov.b\t%s3,%t3\n\tmov.b\t%t0,%s3\n\tmov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f3,%e0";
   3817  1.1  mrg 	      goto end;
   3818  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3819  1.1  mrg 	      info->special = "mov.w\t%e0,%f3\n\tmov.b\t%t0,%s0\n\tmov.b\t%s3,%t0\n\tmov.b\t%t3,%s3\n\textu.w\t%f3\n\tmov.w\t%f3,%e0";
   3820  1.1  mrg 	      goto end;
   3821  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3822  1.1  mrg 	      info->special = "mov.w\t%e0,%f3\n\tmov.b\t%t0,%s0\n\tmov.b\t%s3,%t0\n\tmov.b\t%t3,%s3\n\texts.w\t%f3\n\tmov.w\t%f3,%e0";
   3823  1.1  mrg 	      goto end;
   3824  1.1  mrg 	    }
   3825  1.1  mrg 	}
   3826  1.1  mrg       else if (count == 15)
   3827  1.1  mrg 	{
   3828  1.1  mrg 	  /* The basic idea here is to use the shift-by-16 idiom to make things
   3829  1.1  mrg 	     small and efficient.  Of course, that loses one bit that we need,
   3830  1.1  mrg 	     so we stuff the bit into C, shift by 16, then rotate the bit
   3831  1.1  mrg 	     back in.  */
   3832  1.1  mrg 	  switch (shift_type)
   3833  1.1  mrg 	    {
   3834  1.1  mrg 	    case SHIFT_ASHIFT:
   3835  1.1  mrg 	      info->special = "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
   3836  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3837  1.1  mrg 	      goto end;
   3838  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3839  1.1  mrg 	      info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
   3840  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3841  1.1  mrg 	      goto end;
   3842  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3843  1.1  mrg 	      info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\texts.l\t%S0\n\trotxl.l\t%S0";
   3844  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3845  1.1  mrg 	      goto end;
   3846  1.1  mrg 	    }
   3847  1.1  mrg 	}
   3848  1.1  mrg       else if (count >= 16 && count <= 23)
   3849  1.1  mrg 	{
   3850  1.1  mrg 	  info->remainder = count - 16;
   3851  1.1  mrg 
   3852  1.1  mrg 	  switch (shift_type)
   3853  1.1  mrg 	    {
   3854  1.1  mrg 	    case SHIFT_ASHIFT:
   3855  1.1  mrg 	      info->special = "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
   3856  1.1  mrg 	      goto end;
   3857  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3858  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\textu.l\t%S0";
   3859  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3860  1.1  mrg 	      goto end;
   3861  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3862  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\texts.l\t%S0";
   3863  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3864  1.1  mrg 	      goto end;
   3865  1.1  mrg 	    }
   3866  1.1  mrg 	}
   3867  1.1  mrg       else if (TARGET_H8300S && count == 27)
   3868  1.1  mrg 	{
   3869  1.1  mrg 	  switch (shift_type)
   3870  1.1  mrg 	    {
   3871  1.1  mrg 	    case SHIFT_ASHIFT:
   3872  1.1  mrg 	      info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
   3873  1.1  mrg 	      goto end;
   3874  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3875  1.1  mrg 	      info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
   3876  1.1  mrg 	      goto end;
   3877  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3878  1.1  mrg 	      info->remainder = count - 24;
   3879  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
   3880  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3881  1.1  mrg 	      goto end;
   3882  1.1  mrg 	    }
   3883  1.1  mrg 	}
   3884  1.1  mrg       else if (count >= 24 && count <= 27)
   3885  1.1  mrg 	{
   3886  1.1  mrg 	  info->remainder = count - 24;
   3887  1.1  mrg 
   3888  1.1  mrg 	  switch (shift_type)
   3889  1.1  mrg 	    {
   3890  1.1  mrg 	    case SHIFT_ASHIFT:
   3891  1.1  mrg 	      info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
   3892  1.1  mrg 	      goto end;
   3893  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3894  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
   3895  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3896  1.1  mrg 	      goto end;
   3897  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3898  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
   3899  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3900  1.1  mrg 	      goto end;
   3901  1.1  mrg 	    }
   3902  1.1  mrg 	}
   3903  1.1  mrg       else if (count == 28)
   3904  1.1  mrg 	{
   3905  1.1  mrg 	  switch (shift_type)
   3906  1.1  mrg 	    {
   3907  1.1  mrg 	    case SHIFT_ASHIFT:
   3908  1.1  mrg 	      if (TARGET_H8300H)
   3909  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
   3910  1.1  mrg 	      else
   3911  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
   3912  1.1  mrg 	      goto end;
   3913  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3914  1.1  mrg 	      if (TARGET_H8300H)
   3915  1.1  mrg 		{
   3916  1.1  mrg 		  info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
   3917  1.1  mrg 		  info->cc_special = OLD_CC_SET_ZNV;
   3918  1.1  mrg 		}
   3919  1.1  mrg 	      else
   3920  1.1  mrg 		info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
   3921  1.1  mrg 	      goto end;
   3922  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3923  1.1  mrg 	      info->remainder = count - 24;
   3924  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
   3925  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3926  1.1  mrg 	      goto end;
   3927  1.1  mrg 	    }
   3928  1.1  mrg 	}
   3929  1.1  mrg       else if (count == 29)
   3930  1.1  mrg 	{
   3931  1.1  mrg 	  switch (shift_type)
   3932  1.1  mrg 	    {
   3933  1.1  mrg 	    case SHIFT_ASHIFT:
   3934  1.1  mrg 	      if (TARGET_H8300H)
   3935  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
   3936  1.1  mrg 	      else
   3937  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
   3938  1.1  mrg 	      goto end;
   3939  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3940  1.1  mrg 	      if (TARGET_H8300H)
   3941  1.1  mrg 		{
   3942  1.1  mrg 		  info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
   3943  1.1  mrg 		  info->cc_special = OLD_CC_SET_ZNV;
   3944  1.1  mrg 		}
   3945  1.1  mrg 	      else
   3946  1.1  mrg 		{
   3947  1.1  mrg 		  info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
   3948  1.1  mrg 		  info->cc_special = OLD_CC_SET_ZNV;
   3949  1.1  mrg 		}
   3950  1.1  mrg 	      goto end;
   3951  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3952  1.1  mrg 	      info->remainder = count - 24;
   3953  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
   3954  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3955  1.1  mrg 	      goto end;
   3956  1.1  mrg 	    }
   3957  1.1  mrg 	}
   3958  1.1  mrg       else if (count == 30)
   3959  1.1  mrg 	{
   3960  1.1  mrg 	  switch (shift_type)
   3961  1.1  mrg 	    {
   3962  1.1  mrg 	    case SHIFT_ASHIFT:
   3963  1.1  mrg 	      if (TARGET_H8300H)
   3964  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
   3965  1.1  mrg 	      else
   3966  1.1  mrg 		info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
   3967  1.1  mrg 	      goto end;
   3968  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3969  1.1  mrg 	      if (TARGET_H8300H)
   3970  1.1  mrg 		info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
   3971  1.1  mrg 	      else
   3972  1.1  mrg 		info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
   3973  1.1  mrg 	      goto end;
   3974  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3975  1.1  mrg 	      info->remainder = count - 24;
   3976  1.1  mrg 	      info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
   3977  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3978  1.1  mrg 	      goto end;
   3979  1.1  mrg 	    }
   3980  1.1  mrg 	}
   3981  1.1  mrg       else if (count == 31)
   3982  1.1  mrg 	{
   3983  1.1  mrg 	  switch (shift_type)
   3984  1.1  mrg 	    {
   3985  1.1  mrg 	    case SHIFT_ASHIFT:
   3986  1.1  mrg 	      info->special = "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
   3987  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3988  1.1  mrg 	      goto end;
   3989  1.1  mrg 	    case SHIFT_LSHIFTRT:
   3990  1.1  mrg 	      info->special = "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
   3991  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3992  1.1  mrg 	      goto end;
   3993  1.1  mrg 	    case SHIFT_ASHIFTRT:
   3994  1.1  mrg 	      info->special = "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
   3995  1.1  mrg 	      info->cc_special = OLD_CC_SET_ZNV;
   3996  1.1  mrg 	      goto end;
   3997  1.1  mrg 	    }
   3998  1.1  mrg 	}
   3999  1.1  mrg       gcc_unreachable ();
   4000  1.1  mrg 
   4001  1.1  mrg     default:
   4002  1.1  mrg       gcc_unreachable ();
   4003  1.1  mrg     }
   4004  1.1  mrg 
   4005  1.1  mrg  end:
   4006  1.1  mrg   if (!TARGET_H8300S)
   4007  1.1  mrg     info->shift2 = NULL;
   4008  1.1  mrg }
   4009  1.1  mrg 
   4010  1.1  mrg /* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
   4011  1.1  mrg    needed for some shift with COUNT and MODE.  Return 0 otherwise.  */
   4012  1.1  mrg 
   4013  1.1  mrg int
   4014  1.1  mrg h8300_shift_needs_scratch_p (int count, machine_mode mode, enum rtx_code type)
   4015  1.1  mrg {
   4016  1.1  mrg   enum h8_cpu cpu;
   4017  1.1  mrg   int a, lr, ar;
   4018  1.1  mrg 
   4019  1.1  mrg   if (GET_MODE_BITSIZE (mode) <= count)
   4020  1.1  mrg     return 1;
   4021  1.1  mrg 
   4022  1.1  mrg   /* Find out the target CPU.  */
   4023  1.1  mrg   if (TARGET_H8300S)
   4024  1.1  mrg     cpu = H8_S;
   4025  1.1  mrg   else
   4026  1.1  mrg     cpu = H8_300H;
   4027  1.1  mrg 
   4028  1.1  mrg   /* Find the shift algorithm.  */
   4029  1.1  mrg   switch (mode)
   4030  1.1  mrg     {
   4031  1.1  mrg     case E_QImode:
   4032  1.1  mrg       a  = shift_alg_qi[cpu][SHIFT_ASHIFT][count];
   4033  1.1  mrg       lr = shift_alg_qi[cpu][SHIFT_LSHIFTRT][count];
   4034  1.1  mrg       ar = shift_alg_qi[cpu][SHIFT_ASHIFTRT][count];
   4035  1.1  mrg       break;
   4036  1.1  mrg 
   4037  1.1  mrg     case E_HImode:
   4038  1.1  mrg       a  = shift_alg_hi[cpu][SHIFT_ASHIFT][count];
   4039  1.1  mrg       lr = shift_alg_hi[cpu][SHIFT_LSHIFTRT][count];
   4040  1.1  mrg       ar = shift_alg_hi[cpu][SHIFT_ASHIFTRT][count];
   4041  1.1  mrg       break;
   4042  1.1  mrg 
   4043  1.1  mrg     case E_SImode:
   4044  1.1  mrg       a  = shift_alg_si[cpu][SHIFT_ASHIFT][count];
   4045  1.1  mrg       lr = shift_alg_si[cpu][SHIFT_LSHIFTRT][count];
   4046  1.1  mrg       ar = shift_alg_si[cpu][SHIFT_ASHIFTRT][count];
   4047  1.1  mrg       break;
   4048  1.1  mrg 
   4049  1.1  mrg     default:
   4050  1.1  mrg       gcc_unreachable ();
   4051  1.1  mrg     }
   4052  1.1  mrg 
   4053  1.1  mrg   /* On H8/300H, count == 8 uses a scratch register.  */
   4054  1.1  mrg   if (type == CLOBBER)
   4055  1.1  mrg     return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
   4056  1.1  mrg 	    || (TARGET_H8300H && mode == SImode && count == 8));
   4057  1.1  mrg   else if (type == ASHIFT)
   4058  1.1  mrg     return (a == SHIFT_LOOP
   4059  1.1  mrg 	    || (TARGET_H8300H && mode == SImode && count == 8));
   4060  1.1  mrg   else if (type == LSHIFTRT)
   4061  1.1  mrg     return (lr == SHIFT_LOOP
   4062  1.1  mrg 	    || (TARGET_H8300H && mode == SImode && count == 8));
   4063  1.1  mrg   else if (type == ASHIFTRT)
   4064  1.1  mrg     return (ar == SHIFT_LOOP
   4065  1.1  mrg 	    || (TARGET_H8300H && mode == SImode && count == 8));
   4066  1.1  mrg   gcc_unreachable ();
   4067  1.1  mrg }
   4068  1.1  mrg 
   4069  1.1  mrg /* Output the assembler code for doing shifts.  */
   4070  1.1  mrg 
   4071  1.1  mrg const char *
   4072  1.1  mrg output_a_shift (rtx operands[4], rtx_code code)
   4073  1.1  mrg {
   4074  1.1  mrg   static int loopend_lab;
   4075  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   4076  1.1  mrg   enum shift_type shift_type;
   4077  1.1  mrg   enum shift_mode shift_mode;
   4078  1.1  mrg   struct shift_info info;
   4079  1.1  mrg   int n;
   4080  1.1  mrg 
   4081  1.1  mrg   loopend_lab++;
   4082  1.1  mrg 
   4083  1.1  mrg   switch (mode)
   4084  1.1  mrg     {
   4085  1.1  mrg     case E_QImode:
   4086  1.1  mrg       shift_mode = QIshift;
   4087  1.1  mrg       break;
   4088  1.1  mrg     case E_HImode:
   4089  1.1  mrg       shift_mode = HIshift;
   4090  1.1  mrg       break;
   4091  1.1  mrg     case E_SImode:
   4092  1.1  mrg       shift_mode = SIshift;
   4093  1.1  mrg       break;
   4094  1.1  mrg     default:
   4095  1.1  mrg       gcc_unreachable ();
   4096  1.1  mrg     }
   4097  1.1  mrg 
   4098  1.1  mrg   switch (code)
   4099  1.1  mrg     {
   4100  1.1  mrg     case ASHIFTRT:
   4101  1.1  mrg       shift_type = SHIFT_ASHIFTRT;
   4102  1.1  mrg       break;
   4103  1.1  mrg     case LSHIFTRT:
   4104  1.1  mrg       shift_type = SHIFT_LSHIFTRT;
   4105  1.1  mrg       break;
   4106  1.1  mrg     case ASHIFT:
   4107  1.1  mrg       shift_type = SHIFT_ASHIFT;
   4108  1.1  mrg       break;
   4109  1.1  mrg     default:
   4110  1.1  mrg       gcc_unreachable ();
   4111  1.1  mrg     }
   4112  1.1  mrg 
   4113  1.1  mrg   /* This case must be taken care of by one of the two splitters
   4114  1.1  mrg      that convert a variable shift into a loop.  */
   4115  1.1  mrg   gcc_assert (GET_CODE (operands[2]) == CONST_INT);
   4116  1.1  mrg 
   4117  1.1  mrg   n = INTVAL (operands[2]);
   4118  1.1  mrg 
   4119  1.1  mrg   /* If the count is negative, make it 0.  */
   4120  1.1  mrg   if (n < 0)
   4121  1.1  mrg     n = 0;
   4122  1.1  mrg   /* If the count is too big, truncate it.
   4123  1.1  mrg      ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
   4124  1.1  mrg      do the intuitive thing.  */
   4125  1.1  mrg   else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
   4126  1.1  mrg     n = GET_MODE_BITSIZE (mode);
   4127  1.1  mrg 
   4128  1.1  mrg   get_shift_alg (shift_type, shift_mode, n, &info);
   4129  1.1  mrg 
   4130  1.1  mrg   switch (info.alg)
   4131  1.1  mrg     {
   4132  1.1  mrg     case SHIFT_SPECIAL:
   4133  1.1  mrg       output_asm_insn (info.special, operands);
   4134  1.1  mrg       /* Fall through.  */
   4135  1.1  mrg 
   4136  1.1  mrg     case SHIFT_INLINE:
   4137  1.1  mrg       n = info.remainder;
   4138  1.1  mrg 
   4139  1.1  mrg       /* Emit two bit shifts first.  */
   4140  1.1  mrg       if (info.shift2 != NULL)
   4141  1.1  mrg 	{
   4142  1.1  mrg 	  for (; n > 1; n -= 2)
   4143  1.1  mrg 	    output_asm_insn (info.shift2, operands);
   4144  1.1  mrg 	}
   4145  1.1  mrg 
   4146  1.1  mrg       /* Now emit one bit shifts for any residual.  */
   4147  1.1  mrg       for (; n > 0; n--)
   4148  1.1  mrg 	output_asm_insn (info.shift1, operands);
   4149  1.1  mrg       return "";
   4150  1.1  mrg 
   4151  1.1  mrg     case SHIFT_ROT_AND:
   4152  1.1  mrg       {
   4153  1.1  mrg 	int m = GET_MODE_BITSIZE (mode) - n;
   4154  1.1  mrg 	const int mask = (shift_type == SHIFT_ASHIFT
   4155  1.1  mrg 			  ? ((1 << m) - 1) << n
   4156  1.1  mrg 			  : (1 << m) - 1);
   4157  1.1  mrg 	char insn_buf[200];
   4158  1.1  mrg 
   4159  1.1  mrg 	/* Not all possibilities of rotate are supported.  They shouldn't
   4160  1.1  mrg 	   be generated, but let's watch for 'em.  */
   4161  1.1  mrg 	gcc_assert (info.shift1);
   4162  1.1  mrg 
   4163  1.1  mrg 	/* Emit two bit rotates first.  */
   4164  1.1  mrg 	if (info.shift2 != NULL)
   4165  1.1  mrg 	  {
   4166  1.1  mrg 	    for (; m > 1; m -= 2)
   4167  1.1  mrg 	      output_asm_insn (info.shift2, operands);
   4168  1.1  mrg 	  }
   4169  1.1  mrg 
   4170  1.1  mrg 	/* Now single bit rotates for any residual.  */
   4171  1.1  mrg 	for (; m > 0; m--)
   4172  1.1  mrg 	  output_asm_insn (info.shift1, operands);
   4173  1.1  mrg 
   4174  1.1  mrg 	/* Now mask off the high bits.  */
   4175  1.1  mrg 	switch (mode)
   4176  1.1  mrg 	  {
   4177  1.1  mrg 	  case E_QImode:
   4178  1.1  mrg 	    sprintf (insn_buf, "and\t#%d,%%X0", mask);
   4179  1.1  mrg 	    break;
   4180  1.1  mrg 
   4181  1.1  mrg 	  case E_HImode:
   4182  1.1  mrg 	    sprintf (insn_buf, "and.w\t#%d,%%T0", mask);
   4183  1.1  mrg 	    break;
   4184  1.1  mrg 
   4185  1.1  mrg 	  default:
   4186  1.1  mrg 	    gcc_unreachable ();
   4187  1.1  mrg 	  }
   4188  1.1  mrg 
   4189  1.1  mrg 	output_asm_insn (insn_buf, operands);
   4190  1.1  mrg 	return "";
   4191  1.1  mrg       }
   4192  1.1  mrg 
   4193  1.1  mrg     case SHIFT_LOOP:
   4194  1.1  mrg       /* A loop to shift by a "large" constant value.
   4195  1.1  mrg 	 If we have shift-by-2 insns, use them.  */
   4196  1.1  mrg       if (info.shift2 != NULL)
   4197  1.1  mrg 	{
   4198  1.1  mrg 	  fprintf (asm_out_file, "\tmov.b	#%d,%sl\n", n / 2,
   4199  1.1  mrg 		   names_big[REGNO (operands[3])]);
   4200  1.1  mrg 	  fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
   4201  1.1  mrg 	  output_asm_insn (info.shift2, operands);
   4202  1.1  mrg 	  output_asm_insn ("add	#0xff,%X3", operands);
   4203  1.1  mrg 	  fprintf (asm_out_file, "\tbne	.Llt%d\n", loopend_lab);
   4204  1.1  mrg 	  if (n % 2)
   4205  1.1  mrg 	    output_asm_insn (info.shift1, operands);
   4206  1.1  mrg 	}
   4207  1.1  mrg       else
   4208  1.1  mrg 	{
   4209  1.1  mrg 	  fprintf (asm_out_file, "\tmov.b	#%d,%sl\n", n,
   4210  1.1  mrg 		   names_big[REGNO (operands[3])]);
   4211  1.1  mrg 	  fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
   4212  1.1  mrg 	  output_asm_insn (info.shift1, operands);
   4213  1.1  mrg 	  output_asm_insn ("add	#0xff,%X3", operands);
   4214  1.1  mrg 	  fprintf (asm_out_file, "\tbne	.Llt%d\n", loopend_lab);
   4215  1.1  mrg 	}
   4216  1.1  mrg       return "";
   4217  1.1  mrg 
   4218  1.1  mrg     default:
   4219  1.1  mrg       gcc_unreachable ();
   4220  1.1  mrg     }
   4221  1.1  mrg }
   4222  1.1  mrg 
   4223  1.1  mrg /* Count the number of assembly instructions in a string TEMPL.  */
   4224  1.1  mrg 
   4225  1.1  mrg static unsigned int
   4226  1.1  mrg h8300_asm_insn_count (const char *templ)
   4227  1.1  mrg {
   4228  1.1  mrg   unsigned int count = 1;
   4229  1.1  mrg 
   4230  1.1  mrg   for (; *templ; templ++)
   4231  1.1  mrg     if (*templ == '\n')
   4232  1.1  mrg       count++;
   4233  1.1  mrg 
   4234  1.1  mrg   return count;
   4235  1.1  mrg }
   4236  1.1  mrg 
   4237  1.1  mrg /* Compute the length of a shift insn.  */
   4238  1.1  mrg 
   4239  1.1  mrg unsigned int
   4240  1.1  mrg compute_a_shift_length (rtx operands[3], rtx_code code)
   4241  1.1  mrg {
   4242  1.1  mrg   enum machine_mode mode = GET_MODE (operands[0]);
   4243  1.1  mrg   enum shift_type shift_type;
   4244  1.1  mrg   enum shift_mode shift_mode;
   4245  1.1  mrg   struct shift_info info;
   4246  1.1  mrg   unsigned int wlength = 0;
   4247  1.1  mrg 
   4248  1.1  mrg   switch (mode)
   4249  1.1  mrg     {
   4250  1.1  mrg     case E_QImode:
   4251  1.1  mrg       shift_mode = QIshift;
   4252  1.1  mrg       break;
   4253  1.1  mrg     case E_HImode:
   4254  1.1  mrg       shift_mode = HIshift;
   4255  1.1  mrg       break;
   4256  1.1  mrg     case E_SImode:
   4257  1.1  mrg       shift_mode = SIshift;
   4258  1.1  mrg       break;
   4259  1.1  mrg     default:
   4260  1.1  mrg       gcc_unreachable ();
   4261  1.1  mrg     }
   4262  1.1  mrg 
   4263  1.1  mrg   switch (code)
   4264  1.1  mrg     {
   4265  1.1  mrg     case ASHIFTRT:
   4266  1.1  mrg       shift_type = SHIFT_ASHIFTRT;
   4267  1.1  mrg       break;
   4268  1.1  mrg     case LSHIFTRT:
   4269  1.1  mrg       shift_type = SHIFT_LSHIFTRT;
   4270  1.1  mrg       break;
   4271  1.1  mrg     case ASHIFT:
   4272  1.1  mrg       shift_type = SHIFT_ASHIFT;
   4273  1.1  mrg       break;
   4274  1.1  mrg     default:
   4275  1.1  mrg       gcc_unreachable ();
   4276  1.1  mrg     }
   4277  1.1  mrg 
   4278  1.1  mrg   if (GET_CODE (operands[2]) != CONST_INT)
   4279  1.1  mrg     {
   4280  1.1  mrg       /* Get the assembler code to do one shift.  */
   4281  1.1  mrg       get_shift_alg (shift_type, shift_mode, 1, &info);
   4282  1.1  mrg 
   4283  1.1  mrg       return (4 + h8300_asm_insn_count (info.shift1)) * 2;
   4284  1.1  mrg     }
   4285  1.1  mrg   else
   4286  1.1  mrg     {
   4287  1.1  mrg       int n = INTVAL (operands[2]);
   4288  1.1  mrg 
   4289  1.1  mrg       /* If the count is negative, make it 0.  */
   4290  1.1  mrg       if (n < 0)
   4291  1.1  mrg 	n = 0;
   4292  1.1  mrg       /* If the count is too big, truncate it.
   4293  1.1  mrg          ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
   4294  1.1  mrg 	 do the intuitive thing.  */
   4295  1.1  mrg       else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
   4296  1.1  mrg 	n = GET_MODE_BITSIZE (mode);
   4297  1.1  mrg 
   4298  1.1  mrg       get_shift_alg (shift_type, shift_mode, n, &info);
   4299  1.1  mrg 
   4300  1.1  mrg       switch (info.alg)
   4301  1.1  mrg 	{
   4302  1.1  mrg 	case SHIFT_SPECIAL:
   4303  1.1  mrg 	  wlength += h8300_asm_insn_count (info.special);
   4304  1.1  mrg 
   4305  1.1  mrg 	  /* Every assembly instruction used in SHIFT_SPECIAL case
   4306  1.1  mrg 	     takes 2 bytes except xor.l, which takes 4 bytes, so if we
   4307  1.1  mrg 	     see xor.l, we just pretend that xor.l counts as two insns
   4308  1.1  mrg 	     so that the insn length will be computed correctly.  */
   4309  1.1  mrg 	  if (strstr (info.special, "xor.l") != NULL)
   4310  1.1  mrg 	    wlength++;
   4311  1.1  mrg 
   4312  1.1  mrg 	  /* Fall through.  */
   4313  1.1  mrg 
   4314  1.1  mrg 	case SHIFT_INLINE:
   4315  1.1  mrg 	  n = info.remainder;
   4316  1.1  mrg 
   4317  1.1  mrg 	  if (info.shift2 != NULL)
   4318  1.1  mrg 	    {
   4319  1.1  mrg 	      wlength += h8300_asm_insn_count (info.shift2) * (n / 2);
   4320  1.1  mrg 	      n = n % 2;
   4321  1.1  mrg 	    }
   4322  1.1  mrg 
   4323  1.1  mrg 	  wlength += h8300_asm_insn_count (info.shift1) * n;
   4324  1.1  mrg 
   4325  1.1  mrg 	  return 2 * wlength;
   4326  1.1  mrg 
   4327  1.1  mrg 	case SHIFT_ROT_AND:
   4328  1.1  mrg 	  {
   4329  1.1  mrg 	    int m = GET_MODE_BITSIZE (mode) - n;
   4330  1.1  mrg 
   4331  1.1  mrg 	    /* Not all possibilities of rotate are supported.  They shouldn't
   4332  1.1  mrg 	       be generated, but let's watch for 'em.  */
   4333  1.1  mrg 	    gcc_assert (info.shift1);
   4334  1.1  mrg 
   4335  1.1  mrg 	    if (info.shift2 != NULL)
   4336  1.1  mrg 	      {
   4337  1.1  mrg 		wlength += h8300_asm_insn_count (info.shift2) * (m / 2);
   4338  1.1  mrg 		m = m % 2;
   4339  1.1  mrg 	      }
   4340  1.1  mrg 
   4341  1.1  mrg 	    wlength += h8300_asm_insn_count (info.shift1) * m;
   4342  1.1  mrg 
   4343  1.1  mrg 	    /* Now mask off the high bits.  */
   4344  1.1  mrg 	    switch (mode)
   4345  1.1  mrg 	      {
   4346  1.1  mrg 	      case E_QImode:
   4347  1.1  mrg 		wlength += 1;
   4348  1.1  mrg 		break;
   4349  1.1  mrg 	      case E_HImode:
   4350  1.1  mrg 		wlength += 2;
   4351  1.1  mrg 		break;
   4352  1.1  mrg 	      case E_SImode:
   4353  1.1  mrg 		wlength += 3;
   4354  1.1  mrg 		break;
   4355  1.1  mrg 	      default:
   4356  1.1  mrg 		gcc_unreachable ();
   4357  1.1  mrg 	      }
   4358  1.1  mrg 	    return 2 * wlength;
   4359  1.1  mrg 	  }
   4360  1.1  mrg 
   4361  1.1  mrg 	case SHIFT_LOOP:
   4362  1.1  mrg 	  /* A loop to shift by a "large" constant value.
   4363  1.1  mrg 	     If we have shift-by-2 insns, use them.  */
   4364  1.1  mrg 	  if (info.shift2 != NULL)
   4365  1.1  mrg 	    {
   4366  1.1  mrg 	      wlength += 3 + h8300_asm_insn_count (info.shift2);
   4367  1.1  mrg 	      if (n % 2)
   4368  1.1  mrg 		wlength += h8300_asm_insn_count (info.shift1);
   4369  1.1  mrg 	    }
   4370  1.1  mrg 	  else
   4371  1.1  mrg 	    {
   4372  1.1  mrg 	      wlength += 3 + h8300_asm_insn_count (info.shift1);
   4373  1.1  mrg 	    }
   4374  1.1  mrg 	  return 2 * wlength;
   4375  1.1  mrg 
   4376  1.1  mrg 	default:
   4377  1.1  mrg 	  gcc_unreachable ();
   4378  1.1  mrg 	}
   4379  1.1  mrg     }
   4380  1.1  mrg }
   4381  1.1  mrg 
   4382  1.1  mrg /* Compute which flag bits are valid after a shift insn.  */
   4383  1.1  mrg 
   4384  1.1  mrg int
   4385  1.1  mrg compute_a_shift_cc (rtx operands[3], rtx_code code)
   4386  1.1  mrg {
   4387  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   4388  1.1  mrg   enum shift_type shift_type;
   4389  1.1  mrg   enum shift_mode shift_mode;
   4390  1.1  mrg   struct shift_info info;
   4391  1.1  mrg   int n;
   4392  1.1  mrg 
   4393  1.1  mrg   switch (mode)
   4394  1.1  mrg     {
   4395  1.1  mrg     case E_QImode:
   4396  1.1  mrg       shift_mode = QIshift;
   4397  1.1  mrg       break;
   4398  1.1  mrg     case E_HImode:
   4399  1.1  mrg       shift_mode = HIshift;
   4400  1.1  mrg       break;
   4401  1.1  mrg     case E_SImode:
   4402  1.1  mrg       shift_mode = SIshift;
   4403  1.1  mrg       break;
   4404  1.1  mrg     default:
   4405  1.1  mrg       gcc_unreachable ();
   4406  1.1  mrg     }
   4407  1.1  mrg 
   4408  1.1  mrg   switch (code)
   4409  1.1  mrg     {
   4410  1.1  mrg     case ASHIFTRT:
   4411  1.1  mrg       shift_type = SHIFT_ASHIFTRT;
   4412  1.1  mrg       break;
   4413  1.1  mrg     case LSHIFTRT:
   4414  1.1  mrg       shift_type = SHIFT_LSHIFTRT;
   4415  1.1  mrg       break;
   4416  1.1  mrg     case ASHIFT:
   4417  1.1  mrg       shift_type = SHIFT_ASHIFT;
   4418  1.1  mrg       break;
   4419  1.1  mrg     default:
   4420  1.1  mrg       gcc_unreachable ();
   4421  1.1  mrg     }
   4422  1.1  mrg 
   4423  1.1  mrg   /* This case must be taken care of by one of the two splitters
   4424  1.1  mrg      that convert a variable shift into a loop.  */
   4425  1.1  mrg   gcc_assert (GET_CODE (operands[2]) == CONST_INT);
   4426  1.1  mrg 
   4427  1.1  mrg   n = INTVAL (operands[2]);
   4428  1.1  mrg 
   4429  1.1  mrg   /* If the count is negative, make it 0.  */
   4430  1.1  mrg   if (n < 0)
   4431  1.1  mrg     n = 0;
   4432  1.1  mrg   /* If the count is too big, truncate it.
   4433  1.1  mrg      ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
   4434  1.1  mrg      do the intuitive thing.  */
   4435  1.1  mrg   else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
   4436  1.1  mrg     n = GET_MODE_BITSIZE (mode);
   4437  1.1  mrg 
   4438  1.1  mrg   get_shift_alg (shift_type, shift_mode, n, &info);
   4439  1.1  mrg 
   4440  1.1  mrg   switch (info.alg)
   4441  1.1  mrg     {
   4442  1.1  mrg     case SHIFT_SPECIAL:
   4443  1.1  mrg       if (info.remainder == 0)
   4444  1.1  mrg 	return (info.cc_special == OLD_CC_SET_ZN
   4445  1.1  mrg 		|| info.cc_special == OLD_CC_SET_ZNV);
   4446  1.1  mrg 
   4447  1.1  mrg       /* Fall through.  */
   4448  1.1  mrg 
   4449  1.1  mrg     case SHIFT_INLINE:
   4450  1.1  mrg       return (info.cc_inline == OLD_CC_SET_ZN
   4451  1.1  mrg 	      || info.cc_inline == OLD_CC_SET_ZNV);
   4452  1.1  mrg 
   4453  1.1  mrg     case SHIFT_ROT_AND:
   4454  1.1  mrg       /* This case always ends with an and instruction.  */
   4455  1.1  mrg       return true;
   4456  1.1  mrg 
   4457  1.1  mrg     case SHIFT_LOOP:
   4458  1.1  mrg       /* A loop to shift by a "large" constant value.
   4459  1.1  mrg 	 If we have shift-by-2 insns, use them.  */
   4460  1.1  mrg       if (info.shift2 != NULL)
   4461  1.1  mrg 	{
   4462  1.1  mrg 	  if (n % 2)
   4463  1.1  mrg 	    return (info.cc_inline == OLD_CC_SET_ZN
   4464  1.1  mrg 		    || info.cc_inline == OLD_CC_SET_ZNV);
   4465  1.1  mrg 
   4466  1.1  mrg 	}
   4467  1.1  mrg       return false;
   4468  1.1  mrg 
   4469  1.1  mrg     default:
   4470  1.1  mrg       gcc_unreachable ();
   4471  1.1  mrg     }
   4472  1.1  mrg }
   4473  1.1  mrg 
   4474  1.1  mrg /* A rotation by a non-constant will cause a loop to be generated, in
   4476  1.1  mrg    which a rotation by one bit is used.  A rotation by a constant,
   4477  1.1  mrg    including the one in the loop, will be taken care of by
   4478  1.1  mrg    output_a_rotate () at the insn emit time.  */
   4479  1.1  mrg 
   4480  1.1  mrg int
   4481  1.1  mrg expand_a_rotate (rtx operands[])
   4482  1.1  mrg {
   4483  1.1  mrg   rtx dst = operands[0];
   4484  1.1  mrg   rtx src = operands[1];
   4485  1.1  mrg   rtx rotate_amount = operands[2];
   4486  1.1  mrg   machine_mode mode = GET_MODE (dst);
   4487  1.1  mrg 
   4488  1.1  mrg   if (h8sx_classify_shift (mode, ROTATE, rotate_amount) == H8SX_SHIFT_UNARY)
   4489  1.1  mrg     return false;
   4490  1.1  mrg 
   4491  1.1  mrg   /* We rotate in place.  */
   4492  1.1  mrg   emit_move_insn (dst, src);
   4493  1.1  mrg 
   4494  1.1  mrg   if (GET_CODE (rotate_amount) != CONST_INT)
   4495  1.1  mrg     {
   4496  1.1  mrg       rtx counter = gen_reg_rtx (QImode);
   4497  1.1  mrg       rtx_code_label *start_label = gen_label_rtx ();
   4498  1.1  mrg       rtx_code_label *end_label = gen_label_rtx ();
   4499  1.1  mrg 
   4500  1.1  mrg       /* If the rotate amount is less than or equal to 0,
   4501  1.1  mrg 	 we go out of the loop.  */
   4502  1.1  mrg       emit_cmp_and_jump_insns (rotate_amount, const0_rtx, LE, NULL_RTX,
   4503  1.1  mrg 			       QImode, 0, end_label);
   4504  1.1  mrg 
   4505  1.1  mrg       /* Initialize the loop counter.  */
   4506  1.1  mrg       emit_move_insn (counter, rotate_amount);
   4507  1.1  mrg 
   4508  1.1  mrg       emit_label (start_label);
   4509  1.1  mrg 
   4510  1.1  mrg       /* Rotate by one bit.  */
   4511  1.1  mrg       switch (mode)
   4512  1.1  mrg 	{
   4513  1.1  mrg 	case E_QImode:
   4514  1.1  mrg 	  emit_insn (gen_rotlqi3_1 (dst, dst, const1_rtx));
   4515  1.1  mrg 	  break;
   4516  1.1  mrg 	case E_HImode:
   4517  1.1  mrg 	  emit_insn (gen_rotlhi3_1 (dst, dst, const1_rtx));
   4518  1.1  mrg 	  break;
   4519  1.1  mrg 	case E_SImode:
   4520  1.1  mrg 	  emit_insn (gen_rotlsi3_1 (dst, dst, const1_rtx));
   4521  1.1  mrg 	  break;
   4522  1.1  mrg 	default:
   4523  1.1  mrg 	  gcc_unreachable ();
   4524  1.1  mrg 	}
   4525  1.1  mrg 
   4526  1.1  mrg       /* Decrement the counter by 1.  */
   4527  1.1  mrg       emit_insn (gen_addqi3 (counter, counter, constm1_rtx));
   4528  1.1  mrg 
   4529  1.1  mrg       /* If the loop counter is nonzero, we go back to the beginning
   4530  1.1  mrg 	 of the loop.  */
   4531  1.1  mrg       emit_cmp_and_jump_insns (counter, const0_rtx, NE, NULL_RTX, QImode, 1,
   4532  1.1  mrg 			       start_label);
   4533  1.1  mrg 
   4534  1.1  mrg       emit_label (end_label);
   4535  1.1  mrg     }
   4536  1.1  mrg   else
   4537  1.1  mrg     {
   4538  1.1  mrg       /* Rotate by AMOUNT bits.  */
   4539  1.1  mrg       switch (mode)
   4540  1.1  mrg 	{
   4541  1.1  mrg 	case E_QImode:
   4542  1.1  mrg 	  emit_insn (gen_rotlqi3_1 (dst, dst, rotate_amount));
   4543  1.1  mrg 	  break;
   4544  1.1  mrg 	case E_HImode:
   4545  1.1  mrg 	  emit_insn (gen_rotlhi3_1 (dst, dst, rotate_amount));
   4546  1.1  mrg 	  break;
   4547  1.1  mrg 	case E_SImode:
   4548  1.1  mrg 	  emit_insn (gen_rotlsi3_1 (dst, dst, rotate_amount));
   4549  1.1  mrg 	  break;
   4550  1.1  mrg 	default:
   4551  1.1  mrg 	  gcc_unreachable ();
   4552  1.1  mrg 	}
   4553  1.1  mrg     }
   4554  1.1  mrg 
   4555  1.1  mrg   return 1;
   4556  1.1  mrg }
   4557  1.1  mrg 
   4558  1.1  mrg /* Output a rotate insn.  */
   4559  1.1  mrg 
   4560  1.1  mrg const char *
   4561  1.1  mrg output_a_rotate (enum rtx_code code, rtx *operands)
   4562  1.1  mrg {
   4563  1.1  mrg   rtx dst = operands[0];
   4564  1.1  mrg   rtx rotate_amount = operands[2];
   4565  1.1  mrg   enum shift_mode rotate_mode;
   4566  1.1  mrg   enum shift_type rotate_type;
   4567  1.1  mrg   const char *insn_buf;
   4568  1.1  mrg   int bits;
   4569  1.1  mrg   int amount;
   4570  1.1  mrg   machine_mode mode = GET_MODE (dst);
   4571  1.1  mrg 
   4572  1.1  mrg   gcc_assert (GET_CODE (rotate_amount) == CONST_INT);
   4573  1.1  mrg 
   4574  1.1  mrg   switch (mode)
   4575  1.1  mrg     {
   4576  1.1  mrg     case E_QImode:
   4577  1.1  mrg       rotate_mode = QIshift;
   4578  1.1  mrg       break;
   4579  1.1  mrg     case E_HImode:
   4580  1.1  mrg       rotate_mode = HIshift;
   4581  1.1  mrg       break;
   4582  1.1  mrg     case E_SImode:
   4583  1.1  mrg       rotate_mode = SIshift;
   4584  1.1  mrg       break;
   4585  1.1  mrg     default:
   4586  1.1  mrg       gcc_unreachable ();
   4587  1.1  mrg     }
   4588  1.1  mrg 
   4589  1.1  mrg   switch (code)
   4590  1.1  mrg     {
   4591  1.1  mrg     case ROTATERT:
   4592  1.1  mrg       rotate_type = SHIFT_ASHIFT;
   4593  1.1  mrg       break;
   4594  1.1  mrg     case ROTATE:
   4595  1.1  mrg       rotate_type = SHIFT_LSHIFTRT;
   4596  1.1  mrg       break;
   4597  1.1  mrg     default:
   4598  1.1  mrg       gcc_unreachable ();
   4599  1.1  mrg     }
   4600  1.1  mrg 
   4601  1.1  mrg   amount = INTVAL (rotate_amount);
   4602  1.1  mrg 
   4603  1.1  mrg   /* Clean up AMOUNT.  */
   4604  1.1  mrg   if (amount < 0)
   4605  1.1  mrg     amount = 0;
   4606  1.1  mrg   if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
   4607  1.1  mrg     amount = GET_MODE_BITSIZE (mode);
   4608  1.1  mrg 
   4609  1.1  mrg   /* Determine the faster direction.  After this phase, amount will be
   4610  1.1  mrg      at most a half of GET_MODE_BITSIZE (mode).  */
   4611  1.1  mrg   if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
   4612  1.1  mrg     {
   4613  1.1  mrg       /* Flip the direction.  */
   4614  1.1  mrg       amount = GET_MODE_BITSIZE (mode) - amount;
   4615  1.1  mrg       rotate_type =
   4616  1.1  mrg 	(rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
   4617  1.1  mrg     }
   4618  1.1  mrg 
   4619  1.1  mrg   /* See if a byte swap (in HImode) or a word swap (in SImode) can
   4620  1.1  mrg      boost up the rotation.  */
   4621  1.1  mrg   if ((mode == HImode && TARGET_H8300H && amount >= 6)
   4622  1.1  mrg       || (mode == HImode && TARGET_H8300S && amount == 8)
   4623  1.1  mrg       || (mode == SImode && TARGET_H8300H && amount >= 10)
   4624  1.1  mrg       || (mode == SImode && TARGET_H8300S && amount >= 13))
   4625  1.1  mrg     {
   4626  1.1  mrg       switch (mode)
   4627  1.1  mrg 	{
   4628  1.1  mrg 	case E_HImode:
   4629  1.1  mrg 	  /* This code works on any family.  */
   4630  1.1  mrg 	  insn_buf = "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
   4631  1.1  mrg 	  output_asm_insn (insn_buf, operands);
   4632  1.1  mrg 	  break;
   4633  1.1  mrg 
   4634  1.1  mrg 	case E_SImode:
   4635  1.1  mrg 	  /* This code works on the H8/300H and H8S.  */
   4636  1.1  mrg 	  insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
   4637  1.1  mrg 	  output_asm_insn (insn_buf, operands);
   4638  1.1  mrg 	  break;
   4639  1.1  mrg 
   4640  1.1  mrg 	default:
   4641  1.1  mrg 	  gcc_unreachable ();
   4642  1.1  mrg 	}
   4643  1.1  mrg 
   4644  1.1  mrg       /* Adjust AMOUNT and flip the direction.  */
   4645  1.1  mrg       amount = GET_MODE_BITSIZE (mode) / 2 - amount;
   4646  1.1  mrg       rotate_type =
   4647  1.1  mrg 	(rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
   4648  1.1  mrg     }
   4649  1.1  mrg 
   4650  1.1  mrg   /* Output rotate insns.  */
   4651  1.1  mrg   for (bits = TARGET_H8300S ? 2 : 1; bits > 0; bits /= 2)
   4652  1.1  mrg     {
   4653  1.1  mrg       if (bits == 2)
   4654  1.1  mrg 	insn_buf = rotate_two[rotate_type][rotate_mode];
   4655  1.1  mrg       else
   4656  1.1  mrg 	insn_buf = rotate_one[cpu_type][rotate_type][rotate_mode];
   4657  1.1  mrg 
   4658  1.1  mrg       for (; amount >= bits; amount -= bits)
   4659  1.1  mrg 	output_asm_insn (insn_buf, operands);
   4660  1.1  mrg     }
   4661  1.1  mrg 
   4662  1.1  mrg   return "";
   4663  1.1  mrg }
   4664  1.1  mrg 
   4665  1.1  mrg /* Compute the length of a rotate insn.  */
   4666  1.1  mrg 
   4667  1.1  mrg unsigned int
   4668  1.1  mrg compute_a_rotate_length (rtx *operands)
   4669  1.1  mrg {
   4670  1.1  mrg   rtx src = operands[1];
   4671  1.1  mrg   rtx amount_rtx = operands[2];
   4672  1.1  mrg   machine_mode mode = GET_MODE (src);
   4673  1.1  mrg   int amount;
   4674  1.1  mrg   unsigned int length = 0;
   4675  1.1  mrg 
   4676  1.1  mrg   gcc_assert (GET_CODE (amount_rtx) == CONST_INT);
   4677  1.1  mrg 
   4678  1.1  mrg   amount = INTVAL (amount_rtx);
   4679  1.1  mrg 
   4680  1.1  mrg   /* Clean up AMOUNT.  */
   4681  1.1  mrg   if (amount < 0)
   4682  1.1  mrg     amount = 0;
   4683  1.1  mrg   if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
   4684  1.1  mrg     amount = GET_MODE_BITSIZE (mode);
   4685  1.1  mrg 
   4686  1.1  mrg   /* Determine the faster direction.  After this phase, amount
   4687  1.1  mrg      will be at most a half of GET_MODE_BITSIZE (mode).  */
   4688  1.1  mrg   if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
   4689  1.1  mrg     /* Flip the direction.  */
   4690  1.1  mrg     amount = GET_MODE_BITSIZE (mode) - amount;
   4691  1.1  mrg 
   4692  1.1  mrg   /* See if a byte swap (in HImode) or a word swap (in SImode) can
   4693  1.1  mrg      boost up the rotation.  */
   4694  1.1  mrg   if ((mode == HImode && TARGET_H8300H && amount >= 6)
   4695  1.1  mrg       || (mode == HImode && TARGET_H8300S && amount == 8)
   4696  1.1  mrg       || (mode == SImode && TARGET_H8300H && amount >= 10)
   4697  1.1  mrg       || (mode == SImode && TARGET_H8300S && amount >= 13))
   4698  1.1  mrg     {
   4699  1.1  mrg       /* Adjust AMOUNT and flip the direction.  */
   4700  1.1  mrg       amount = GET_MODE_BITSIZE (mode) / 2 - amount;
   4701  1.1  mrg       length += 6;
   4702  1.1  mrg     }
   4703  1.1  mrg 
   4704  1.1  mrg   /* We use 2-bit rotations on the H8S.  */
   4705  1.1  mrg   if (TARGET_H8300S)
   4706  1.1  mrg     amount = amount / 2 + amount % 2;
   4707  1.1  mrg 
   4708  1.1  mrg   /* The H8/300 uses three insns to rotate one bit, taking 6
   4709  1.1  mrg      length.  */
   4710  1.1  mrg   length += amount * 2;
   4711  1.1  mrg 
   4712  1.1  mrg   return length;
   4713  1.1  mrg }
   4714  1.1  mrg 
   4715  1.1  mrg /* Fix the operands of a gen_xxx so that it could become a bit
   4717  1.1  mrg    operating insn.  */
   4718  1.1  mrg 
   4719  1.1  mrg int
   4720  1.1  mrg fix_bit_operand (rtx *operands, enum rtx_code code)
   4721  1.1  mrg {
   4722  1.1  mrg   /* The bit_operand predicate accepts any memory during RTL generation, but
   4723  1.1  mrg      only 'U' memory afterwards, so if this is a MEM operand, we must force
   4724  1.1  mrg      it to be valid for 'U' by reloading the address.  */
   4725  1.1  mrg 
   4726  1.1  mrg   if (code == AND
   4727  1.1  mrg       ? single_zero_operand (operands[2], QImode)
   4728  1.1  mrg       : single_one_operand (operands[2], QImode))
   4729  1.1  mrg     {
   4730  1.1  mrg       /* OK to have a memory dest.  */
   4731  1.1  mrg       if (GET_CODE (operands[0]) == MEM
   4732  1.1  mrg 	  && !satisfies_constraint_U (operands[0]))
   4733  1.1  mrg 	{
   4734  1.1  mrg 	  rtx mem = gen_rtx_MEM (GET_MODE (operands[0]),
   4735  1.1  mrg 				 copy_to_mode_reg (Pmode,
   4736  1.1  mrg 						   XEXP (operands[0], 0)));
   4737  1.1  mrg 	  MEM_COPY_ATTRIBUTES (mem, operands[0]);
   4738  1.1  mrg 	  operands[0] = mem;
   4739  1.1  mrg 	}
   4740  1.1  mrg 
   4741  1.1  mrg       if (GET_CODE (operands[1]) == MEM
   4742  1.1  mrg 	  && !satisfies_constraint_U (operands[1]))
   4743  1.1  mrg 	{
   4744  1.1  mrg 	  rtx mem = gen_rtx_MEM (GET_MODE (operands[1]),
   4745  1.1  mrg 				 copy_to_mode_reg (Pmode,
   4746  1.1  mrg 						   XEXP (operands[1], 0)));
   4747  1.1  mrg 	  MEM_COPY_ATTRIBUTES (mem, operands[0]);
   4748  1.1  mrg 	  operands[1] = mem;
   4749  1.1  mrg 	}
   4750  1.1  mrg       return 0;
   4751  1.1  mrg     }
   4752  1.1  mrg 
   4753  1.1  mrg   /* Dest and src op must be register.  */
   4754  1.1  mrg 
   4755  1.1  mrg   operands[1] = force_reg (QImode, operands[1]);
   4756  1.1  mrg   {
   4757  1.1  mrg     rtx res = gen_reg_rtx (QImode);
   4758  1.1  mrg     switch (code)
   4759  1.1  mrg       {
   4760  1.1  mrg       case AND:
   4761  1.1  mrg 	emit_insn (gen_andqi3_1 (res, operands[1], operands[2]));
   4762  1.1  mrg 	break;
   4763  1.1  mrg       case IOR:
   4764  1.1  mrg 	emit_insn (gen_iorqi3_1 (res, operands[1], operands[2]));
   4765  1.1  mrg 	break;
   4766  1.1  mrg       case XOR:
   4767  1.1  mrg 	emit_insn (gen_xorqi3_1 (res, operands[1], operands[2]));
   4768  1.1  mrg 	break;
   4769  1.1  mrg       default:
   4770  1.1  mrg 	gcc_unreachable ();
   4771  1.1  mrg       }
   4772  1.1  mrg     emit_insn (gen_movqi (operands[0], res));
   4773  1.1  mrg   }
   4774  1.1  mrg   return 1;
   4775  1.1  mrg }
   4776  1.1  mrg 
   4777  1.1  mrg /* Return nonzero if FUNC is an interrupt function as specified
   4778  1.1  mrg    by the "interrupt" attribute.  */
   4779  1.1  mrg 
   4780  1.1  mrg static int
   4781  1.1  mrg h8300_interrupt_function_p (tree func)
   4782  1.1  mrg {
   4783  1.1  mrg   tree a;
   4784  1.1  mrg 
   4785  1.1  mrg   if (TREE_CODE (func) != FUNCTION_DECL)
   4786  1.1  mrg     return 0;
   4787  1.1  mrg 
   4788  1.1  mrg   a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
   4789  1.1  mrg   return a != NULL_TREE;
   4790  1.1  mrg }
   4791  1.1  mrg 
   4792  1.1  mrg /* Return nonzero if FUNC is a saveall function as specified by the
   4793  1.1  mrg    "saveall" attribute.  */
   4794  1.1  mrg 
   4795  1.1  mrg static int
   4796  1.1  mrg h8300_saveall_function_p (tree func)
   4797  1.1  mrg {
   4798  1.1  mrg   tree a;
   4799  1.1  mrg 
   4800  1.1  mrg   if (TREE_CODE (func) != FUNCTION_DECL)
   4801  1.1  mrg     return 0;
   4802  1.1  mrg 
   4803  1.1  mrg   a = lookup_attribute ("saveall", DECL_ATTRIBUTES (func));
   4804  1.1  mrg   return a != NULL_TREE;
   4805  1.1  mrg }
   4806  1.1  mrg 
   4807  1.1  mrg /* Return nonzero if FUNC is an OS_Task function as specified
   4808  1.1  mrg    by the "OS_Task" attribute.  */
   4809  1.1  mrg 
   4810  1.1  mrg static int
   4811  1.1  mrg h8300_os_task_function_p (tree func)
   4812  1.1  mrg {
   4813  1.1  mrg   tree a;
   4814  1.1  mrg 
   4815  1.1  mrg   if (TREE_CODE (func) != FUNCTION_DECL)
   4816  1.1  mrg     return 0;
   4817  1.1  mrg 
   4818  1.1  mrg   a = lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func));
   4819  1.1  mrg   return a != NULL_TREE;
   4820  1.1  mrg }
   4821  1.1  mrg 
   4822  1.1  mrg /* Return nonzero if FUNC is a monitor function as specified
   4823  1.1  mrg    by the "monitor" attribute.  */
   4824  1.1  mrg 
   4825  1.1  mrg static int
   4826  1.1  mrg h8300_monitor_function_p (tree func)
   4827  1.1  mrg {
   4828  1.1  mrg   tree a;
   4829  1.1  mrg 
   4830  1.1  mrg   if (TREE_CODE (func) != FUNCTION_DECL)
   4831  1.1  mrg     return 0;
   4832  1.1  mrg 
   4833  1.1  mrg   a = lookup_attribute ("monitor", DECL_ATTRIBUTES (func));
   4834  1.1  mrg   return a != NULL_TREE;
   4835  1.1  mrg }
   4836  1.1  mrg 
   4837  1.1  mrg /* Return nonzero if FUNC is a function that should be called
   4838  1.1  mrg    through the function vector.  */
   4839  1.1  mrg 
   4840  1.1  mrg int
   4841  1.1  mrg h8300_funcvec_function_p (tree func)
   4842  1.1  mrg {
   4843  1.1  mrg   tree a;
   4844  1.1  mrg 
   4845  1.1  mrg   if (TREE_CODE (func) != FUNCTION_DECL)
   4846  1.1  mrg     return 0;
   4847  1.1  mrg 
   4848  1.1  mrg   a = lookup_attribute ("function_vector", DECL_ATTRIBUTES (func));
   4849  1.1  mrg   return a != NULL_TREE;
   4850  1.1  mrg }
   4851  1.1  mrg 
   4852  1.1  mrg /* Return nonzero if DECL is a variable that's in the eight bit
   4853  1.1  mrg    data area.  */
   4854  1.1  mrg 
   4855  1.1  mrg int
   4856  1.1  mrg h8300_eightbit_data_p (tree decl)
   4857  1.1  mrg {
   4858  1.1  mrg   tree a;
   4859  1.1  mrg 
   4860  1.1  mrg   if (TREE_CODE (decl) != VAR_DECL)
   4861  1.1  mrg     return 0;
   4862  1.1  mrg 
   4863  1.1  mrg   a = lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl));
   4864  1.1  mrg   return a != NULL_TREE;
   4865  1.1  mrg }
   4866  1.1  mrg 
   4867  1.1  mrg /* Return nonzero if DECL is a variable that's in the tiny
   4868  1.1  mrg    data area.  */
   4869  1.1  mrg 
   4870  1.1  mrg int
   4871  1.1  mrg h8300_tiny_data_p (tree decl)
   4872  1.1  mrg {
   4873  1.1  mrg   tree a;
   4874  1.1  mrg 
   4875  1.1  mrg   if (TREE_CODE (decl) != VAR_DECL)
   4876  1.1  mrg     return 0;
   4877  1.1  mrg 
   4878  1.1  mrg   a = lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl));
   4879  1.1  mrg   return a != NULL_TREE;
   4880  1.1  mrg }
   4881  1.1  mrg 
   4882  1.1  mrg /* Generate an 'interrupt_handler' attribute for decls.  We convert
   4883  1.1  mrg    all the pragmas to corresponding attributes.  */
   4884  1.1  mrg 
   4885  1.1  mrg static void
   4886  1.1  mrg h8300_insert_attributes (tree node, tree *attributes)
   4887  1.1  mrg {
   4888  1.1  mrg   if (TREE_CODE (node) == FUNCTION_DECL)
   4889  1.1  mrg     {
   4890  1.1  mrg       if (pragma_interrupt)
   4891  1.1  mrg 	{
   4892  1.1  mrg 	  pragma_interrupt = 0;
   4893  1.1  mrg 
   4894  1.1  mrg 	  /* Add an 'interrupt_handler' attribute.  */
   4895  1.1  mrg 	  *attributes = tree_cons (get_identifier ("interrupt_handler"),
   4896  1.1  mrg 				   NULL, *attributes);
   4897  1.1  mrg 	}
   4898  1.1  mrg 
   4899  1.1  mrg       if (pragma_saveall)
   4900  1.1  mrg 	{
   4901  1.1  mrg 	  pragma_saveall = 0;
   4902  1.1  mrg 
   4903  1.1  mrg 	  /* Add an 'saveall' attribute.  */
   4904  1.1  mrg 	  *attributes = tree_cons (get_identifier ("saveall"),
   4905  1.1  mrg 				   NULL, *attributes);
   4906  1.1  mrg 	}
   4907  1.1  mrg     }
   4908  1.1  mrg }
   4909  1.1  mrg 
   4910  1.1  mrg /* Supported attributes:
   4911  1.1  mrg 
   4912  1.1  mrg    interrupt_handler: output a prologue and epilogue suitable for an
   4913  1.1  mrg    interrupt handler.
   4914  1.1  mrg 
   4915  1.1  mrg    saveall: output a prologue and epilogue that saves and restores
   4916  1.1  mrg    all registers except the stack pointer.
   4917  1.1  mrg 
   4918  1.1  mrg    function_vector: This function should be called through the
   4919  1.1  mrg    function vector.
   4920  1.1  mrg 
   4921  1.1  mrg    eightbit_data: This variable lives in the 8-bit data area and can
   4922  1.1  mrg    be referenced with 8-bit absolute memory addresses.
   4923  1.1  mrg 
   4924  1.1  mrg    tiny_data: This variable lives in the tiny data area and can be
   4925  1.1  mrg    referenced with 16-bit absolute memory references.  */
   4926  1.1  mrg 
   4927  1.1  mrg static const struct attribute_spec h8300_attribute_table[] =
   4928  1.1  mrg {
   4929  1.1  mrg   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
   4930  1.1  mrg        affects_type_identity, handler, exclude } */
   4931  1.1  mrg   { "interrupt_handler", 0, 0, true,  false, false, false,
   4932  1.1  mrg     h8300_handle_fndecl_attribute, NULL },
   4933  1.1  mrg   { "saveall",           0, 0, true,  false, false, false,
   4934  1.1  mrg     h8300_handle_fndecl_attribute, NULL },
   4935  1.1  mrg   { "OS_Task",           0, 0, true,  false, false, false,
   4936  1.1  mrg     h8300_handle_fndecl_attribute, NULL },
   4937  1.1  mrg   { "monitor",           0, 0, true,  false, false, false,
   4938  1.1  mrg     h8300_handle_fndecl_attribute, NULL },
   4939  1.1  mrg   { "function_vector",   0, 0, true,  false, false, false,
   4940  1.1  mrg     h8300_handle_fndecl_attribute, NULL },
   4941  1.1  mrg   { "eightbit_data",     0, 0, true,  false, false, false,
   4942  1.1  mrg     h8300_handle_eightbit_data_attribute, NULL },
   4943  1.1  mrg   { "tiny_data",         0, 0, true,  false, false, false,
   4944  1.1  mrg     h8300_handle_tiny_data_attribute, NULL },
   4945  1.1  mrg   { NULL,                0, 0, false, false, false, false, NULL, NULL }
   4946  1.1  mrg };
   4947  1.1  mrg 
   4948  1.1  mrg 
   4949  1.1  mrg /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
   4950  1.1  mrg    struct attribute_spec.handler.  */
   4951  1.1  mrg static tree
   4952  1.1  mrg h8300_handle_fndecl_attribute (tree *node, tree name,
   4953  1.1  mrg 			       tree args ATTRIBUTE_UNUSED,
   4954  1.1  mrg 			       int flags ATTRIBUTE_UNUSED,
   4955  1.1  mrg 			       bool *no_add_attrs)
   4956  1.1  mrg {
   4957  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_DECL)
   4958  1.1  mrg     {
   4959  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   4960  1.1  mrg 	       name);
   4961  1.1  mrg       *no_add_attrs = true;
   4962  1.1  mrg     }
   4963  1.1  mrg 
   4964  1.1  mrg   return NULL_TREE;
   4965  1.1  mrg }
   4966  1.1  mrg 
   4967  1.1  mrg /* Handle an "eightbit_data" attribute; arguments as in
   4968  1.1  mrg    struct attribute_spec.handler.  */
   4969  1.1  mrg static tree
   4970  1.1  mrg h8300_handle_eightbit_data_attribute (tree *node, tree name,
   4971  1.1  mrg 				      tree args ATTRIBUTE_UNUSED,
   4972  1.1  mrg 				      int flags ATTRIBUTE_UNUSED,
   4973  1.1  mrg 				      bool *no_add_attrs)
   4974  1.1  mrg {
   4975  1.1  mrg   tree decl = *node;
   4976  1.1  mrg 
   4977  1.1  mrg   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
   4978  1.1  mrg     {
   4979  1.1  mrg       set_decl_section_name (decl, ".eight");
   4980  1.1  mrg     }
   4981  1.1  mrg   else
   4982  1.1  mrg     {
   4983  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored",
   4984  1.1  mrg 	       name);
   4985  1.1  mrg       *no_add_attrs = true;
   4986  1.1  mrg     }
   4987  1.1  mrg 
   4988  1.1  mrg   return NULL_TREE;
   4989  1.1  mrg }
   4990  1.1  mrg 
   4991  1.1  mrg /* Handle an "tiny_data" attribute; arguments as in
   4992  1.1  mrg    struct attribute_spec.handler.  */
   4993  1.1  mrg static tree
   4994  1.1  mrg h8300_handle_tiny_data_attribute (tree *node, tree name,
   4995  1.1  mrg 				  tree args ATTRIBUTE_UNUSED,
   4996  1.1  mrg 				  int flags ATTRIBUTE_UNUSED,
   4997  1.1  mrg 				  bool *no_add_attrs)
   4998  1.1  mrg {
   4999  1.1  mrg   tree decl = *node;
   5000  1.1  mrg 
   5001  1.1  mrg   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
   5002  1.1  mrg     {
   5003  1.1  mrg       set_decl_section_name (decl, ".tiny");
   5004  1.1  mrg     }
   5005  1.1  mrg   else
   5006  1.1  mrg     {
   5007  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored",
   5008  1.1  mrg 	       name);
   5009  1.1  mrg       *no_add_attrs = true;
   5010  1.1  mrg     }
   5011  1.1  mrg 
   5012  1.1  mrg   return NULL_TREE;
   5013  1.1  mrg }
   5014  1.1  mrg 
   5015  1.1  mrg /* Mark function vectors, and various small data objects.  */
   5016  1.1  mrg 
   5017  1.1  mrg static void
   5018  1.1  mrg h8300_encode_section_info (tree decl, rtx rtl, int first)
   5019  1.1  mrg {
   5020  1.1  mrg   int extra_flags = 0;
   5021  1.1  mrg 
   5022  1.1  mrg   default_encode_section_info (decl, rtl, first);
   5023  1.1  mrg 
   5024  1.1  mrg   if (TREE_CODE (decl) == FUNCTION_DECL
   5025  1.1  mrg       && h8300_funcvec_function_p (decl))
   5026  1.1  mrg     extra_flags = SYMBOL_FLAG_FUNCVEC_FUNCTION;
   5027  1.1  mrg   else if (TREE_CODE (decl) == VAR_DECL
   5028  1.1  mrg 	   && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
   5029  1.1  mrg     {
   5030  1.1  mrg       if (h8300_eightbit_data_p (decl))
   5031  1.1  mrg 	extra_flags = SYMBOL_FLAG_EIGHTBIT_DATA;
   5032  1.1  mrg       else if (first && h8300_tiny_data_p (decl))
   5033  1.1  mrg 	extra_flags = SYMBOL_FLAG_TINY_DATA;
   5034  1.1  mrg     }
   5035  1.1  mrg 
   5036  1.1  mrg   if (extra_flags)
   5037  1.1  mrg     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
   5038  1.1  mrg }
   5039  1.1  mrg 
   5040  1.1  mrg /* Output a single-bit extraction.  */
   5041  1.1  mrg 
   5042  1.1  mrg const char *
   5043  1.1  mrg output_simode_bld (int bild, rtx operands[])
   5044  1.1  mrg {
   5045  1.1  mrg   /* Determine if we can clear the destination first.  */
   5046  1.1  mrg   int clear_first = (REG_P (operands[0]) && REG_P (operands[1])
   5047  1.1  mrg 		     && REGNO (operands[0]) != REGNO (operands[1]));
   5048  1.1  mrg 
   5049  1.1  mrg   if (clear_first)
   5050  1.1  mrg     output_asm_insn ("sub.l\t%S0,%S0", operands);
   5051  1.1  mrg 
   5052  1.1  mrg   /* Output the bit load or bit inverse load.  */
   5053  1.1  mrg   if (bild)
   5054  1.1  mrg     output_asm_insn ("bild\t%Z2,%Y1", operands);
   5055  1.1  mrg   else
   5056  1.1  mrg     output_asm_insn ("bld\t%Z2,%Y1", operands);
   5057  1.1  mrg 
   5058  1.1  mrg   if (!clear_first)
   5059  1.1  mrg     output_asm_insn ("xor.l\t%S0,%S0", operands);
   5060  1.1  mrg 
   5061  1.1  mrg   /* Perform the bit store.  */
   5062  1.1  mrg   output_asm_insn ("rotxl.l\t%S0", operands);
   5063  1.1  mrg 
   5064  1.1  mrg   /* All done.  */
   5065  1.1  mrg   return "";
   5066  1.1  mrg }
   5067  1.1  mrg 
   5068  1.1  mrg /* Delayed-branch scheduling is more effective if we have some idea
   5069  1.1  mrg    how long each instruction will be.  Use a shorten_branches pass
   5070  1.1  mrg    to get an initial estimate.  */
   5071  1.1  mrg 
   5072  1.1  mrg static void
   5073  1.1  mrg h8300_reorg (void)
   5074  1.1  mrg {
   5075  1.1  mrg   if (flag_delayed_branch)
   5076  1.1  mrg     shorten_branches (get_insns ());
   5077  1.1  mrg }
   5078  1.1  mrg 
   5079  1.1  mrg /* Nonzero if X is a constant address suitable as an 8-bit absolute,
   5080  1.1  mrg    which is a special case of the 'R' operand.  */
   5081  1.1  mrg 
   5082  1.1  mrg int
   5083  1.1  mrg h8300_eightbit_constant_address_p (rtx x)
   5084  1.1  mrg {
   5085  1.1  mrg   /* The ranges of the 8-bit area.  */
   5086  1.1  mrg   const unsigned HOST_WIDE_INT n1 = trunc_int_for_mode (0xff00, HImode);
   5087  1.1  mrg   const unsigned HOST_WIDE_INT n2 = trunc_int_for_mode (0xffff, HImode);
   5088  1.1  mrg   const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00ffff00, SImode);
   5089  1.1  mrg   const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00ffffff, SImode);
   5090  1.1  mrg   const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0xffffff00, SImode);
   5091  1.1  mrg   const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0xffffffff, SImode);
   5092  1.1  mrg 
   5093  1.1  mrg   unsigned HOST_WIDE_INT addr;
   5094  1.1  mrg 
   5095  1.1  mrg   /* We accept symbols declared with eightbit_data.  */
   5096  1.1  mrg   if (GET_CODE (x) == SYMBOL_REF)
   5097  1.1  mrg     return (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0;
   5098  1.1  mrg 
   5099  1.1  mrg   if (GET_CODE (x) == CONST
   5100  1.1  mrg       && GET_CODE (XEXP (x, 0)) == PLUS
   5101  1.1  mrg       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
   5102  1.1  mrg       && (SYMBOL_REF_FLAGS (XEXP (XEXP (x, 0), 0)) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0)
   5103  1.1  mrg     return 1;
   5104  1.1  mrg 
   5105  1.1  mrg   if (GET_CODE (x) != CONST_INT)
   5106  1.1  mrg     return 0;
   5107  1.1  mrg 
   5108  1.1  mrg   addr = INTVAL (x);
   5109  1.1  mrg 
   5110  1.1  mrg   return (0
   5111  1.1  mrg 	  || (TARGET_NORMAL_MODE && IN_RANGE (addr, n1, n2))
   5112  1.1  mrg 	  || (TARGET_H8300H && IN_RANGE (addr, h1, h2))
   5113  1.1  mrg 	  || (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
   5114  1.1  mrg }
   5115  1.1  mrg 
   5116  1.1  mrg /* Nonzero if X is a constant address suitable as an 16-bit absolute
   5117  1.1  mrg    on H8/300H and H8S.  */
   5118  1.1  mrg 
   5119  1.1  mrg int
   5120  1.1  mrg h8300_tiny_constant_address_p (rtx x)
   5121  1.1  mrg {
   5122  1.1  mrg   /* The ranges of the 16-bit area.  */
   5123  1.1  mrg   const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00000000, SImode);
   5124  1.1  mrg   const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00007fff, SImode);
   5125  1.1  mrg   const unsigned HOST_WIDE_INT h3 = trunc_int_for_mode (0x00ff8000, SImode);
   5126  1.1  mrg   const unsigned HOST_WIDE_INT h4 = trunc_int_for_mode (0x00ffffff, SImode);
   5127  1.1  mrg   const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0x00000000, SImode);
   5128  1.1  mrg   const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0x00007fff, SImode);
   5129  1.1  mrg   const unsigned HOST_WIDE_INT s3 = trunc_int_for_mode (0xffff8000, SImode);
   5130  1.1  mrg   const unsigned HOST_WIDE_INT s4 = trunc_int_for_mode (0xffffffff, SImode);
   5131  1.1  mrg 
   5132  1.1  mrg   unsigned HOST_WIDE_INT addr;
   5133  1.1  mrg 
   5134  1.1  mrg   switch (GET_CODE (x))
   5135  1.1  mrg     {
   5136  1.1  mrg     case SYMBOL_REF:
   5137  1.1  mrg       /* In the normal mode, any symbol fits in the 16-bit absolute
   5138  1.1  mrg 	 address range.  We also accept symbols declared with
   5139  1.1  mrg 	 tiny_data.  */
   5140  1.1  mrg       return (TARGET_NORMAL_MODE
   5141  1.1  mrg 	      || (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_TINY_DATA) != 0);
   5142  1.1  mrg 
   5143  1.1  mrg     case CONST_INT:
   5144  1.1  mrg       addr = INTVAL (x);
   5145  1.1  mrg       return (TARGET_NORMAL_MODE
   5146  1.1  mrg 	      || (TARGET_H8300H
   5147  1.1  mrg 		  && (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
   5148  1.1  mrg 	      || (TARGET_H8300S
   5149  1.1  mrg 		  && (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));
   5150  1.1  mrg 
   5151  1.1  mrg     case CONST:
   5152  1.1  mrg       return TARGET_NORMAL_MODE;
   5153  1.1  mrg 
   5154  1.1  mrg     default:
   5155  1.1  mrg       return 0;
   5156  1.1  mrg     }
   5157  1.1  mrg 
   5158  1.1  mrg }
   5159  1.1  mrg 
   5160  1.1  mrg /* Return nonzero if ADDR1 and ADDR2 point to consecutive memory
   5161  1.1  mrg    locations that can be accessed as a 16-bit word.  */
   5162  1.1  mrg 
   5163  1.1  mrg int
   5164  1.1  mrg byte_accesses_mergeable_p (rtx addr1, rtx addr2)
   5165  1.1  mrg {
   5166  1.1  mrg   HOST_WIDE_INT offset1, offset2;
   5167  1.1  mrg   rtx reg1, reg2;
   5168  1.1  mrg 
   5169  1.1  mrg   if (REG_P (addr1))
   5170  1.1  mrg     {
   5171  1.1  mrg       reg1 = addr1;
   5172  1.1  mrg       offset1 = 0;
   5173  1.1  mrg     }
   5174  1.1  mrg   else if (GET_CODE (addr1) == PLUS
   5175  1.1  mrg 	   && REG_P (XEXP (addr1, 0))
   5176  1.1  mrg 	   && GET_CODE (XEXP (addr1, 1)) == CONST_INT)
   5177  1.1  mrg     {
   5178  1.1  mrg       reg1 = XEXP (addr1, 0);
   5179  1.1  mrg       offset1 = INTVAL (XEXP (addr1, 1));
   5180  1.1  mrg     }
   5181  1.1  mrg   else
   5182  1.1  mrg     return 0;
   5183  1.1  mrg 
   5184  1.1  mrg   if (REG_P (addr2))
   5185  1.1  mrg     {
   5186  1.1  mrg       reg2 = addr2;
   5187  1.1  mrg       offset2 = 0;
   5188  1.1  mrg     }
   5189  1.1  mrg   else if (GET_CODE (addr2) == PLUS
   5190  1.1  mrg 	   && REG_P (XEXP (addr2, 0))
   5191  1.1  mrg 	   && GET_CODE (XEXP (addr2, 1)) == CONST_INT)
   5192  1.1  mrg     {
   5193  1.1  mrg       reg2 = XEXP (addr2, 0);
   5194  1.1  mrg       offset2 = INTVAL (XEXP (addr2, 1));
   5195  1.1  mrg     }
   5196  1.1  mrg   else
   5197  1.1  mrg     return 0;
   5198  1.1  mrg 
   5199  1.1  mrg   if (((reg1 == stack_pointer_rtx && reg2 == stack_pointer_rtx)
   5200  1.1  mrg        || (reg1 == frame_pointer_rtx && reg2 == frame_pointer_rtx))
   5201  1.1  mrg       && offset1 % 2 == 0
   5202  1.1  mrg       && offset1 + 1 == offset2)
   5203  1.1  mrg     return 1;
   5204  1.1  mrg 
   5205  1.1  mrg   return 0;
   5206  1.1  mrg }
   5207  1.1  mrg 
   5208  1.1  mrg /* Return nonzero if we have the same comparison insn as I3 two insns
   5209  1.1  mrg    before I3.  I3 is assumed to be a comparison insn.  */
   5210  1.1  mrg 
   5211  1.1  mrg int
   5212  1.1  mrg same_cmp_preceding_p (rtx_insn *i3)
   5213  1.1  mrg {
   5214  1.1  mrg   rtx_insn *i1, *i2;
   5215  1.1  mrg 
   5216  1.1  mrg   /* Make sure we have a sequence of three insns.  */
   5217  1.1  mrg   i2 = prev_nonnote_insn (i3);
   5218  1.1  mrg   if (i2 == NULL)
   5219  1.1  mrg     return 0;
   5220  1.1  mrg   i1 = prev_nonnote_insn (i2);
   5221  1.1  mrg   if (i1 == NULL)
   5222  1.1  mrg     return 0;
   5223  1.1  mrg 
   5224  1.1  mrg   return (INSN_P (i1) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
   5225  1.1  mrg 	  && any_condjump_p (i2) && onlyjump_p (i2));
   5226  1.1  mrg }
   5227  1.1  mrg 
   5228  1.1  mrg /* Return nonzero if we have the same comparison insn as I1 two insns
   5229  1.1  mrg    after I1.  I1 is assumed to be a comparison insn.  */
   5230  1.1  mrg 
   5231  1.1  mrg int
   5232  1.1  mrg same_cmp_following_p (rtx_insn *i1)
   5233  1.1  mrg {
   5234  1.1  mrg   rtx_insn *i2, *i3;
   5235  1.1  mrg 
   5236  1.1  mrg   /* Make sure we have a sequence of three insns.  */
   5237  1.1  mrg   i2 = next_nonnote_insn (i1);
   5238  1.1  mrg   if (i2 == NULL)
   5239  1.1  mrg     return 0;
   5240  1.1  mrg   i3 = next_nonnote_insn (i2);
   5241  1.1  mrg   if (i3 == NULL)
   5242  1.1  mrg     return 0;
   5243  1.1  mrg 
   5244  1.1  mrg   return (INSN_P (i3) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
   5245  1.1  mrg 	  && any_condjump_p (i2) && onlyjump_p (i2));
   5246  1.1  mrg }
   5247  1.1  mrg 
   5248  1.1  mrg /* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
   5249  1.1  mrg    (or pops) N registers.  OPERANDS are assumed to be an array of
   5250  1.1  mrg    registers.  */
   5251  1.1  mrg 
   5252  1.1  mrg int
   5253  1.1  mrg h8300_regs_ok_for_stm (int n, rtx operands[])
   5254  1.1  mrg {
   5255  1.1  mrg   switch (n)
   5256  1.1  mrg     {
   5257  1.1  mrg     case 2:
   5258  1.1  mrg       return ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
   5259  1.1  mrg 	      || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
   5260  1.1  mrg 	      || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5));
   5261  1.1  mrg     case 3:
   5262  1.1  mrg       return ((REGNO (operands[0]) == 0
   5263  1.1  mrg 	       && REGNO (operands[1]) == 1
   5264  1.1  mrg 	       && REGNO (operands[2]) == 2)
   5265  1.1  mrg 	      || (REGNO (operands[0]) == 4
   5266  1.1  mrg 		  && REGNO (operands[1]) == 5
   5267  1.1  mrg 		  && REGNO (operands[2]) == 6));
   5268  1.1  mrg 
   5269  1.1  mrg     case 4:
   5270  1.1  mrg       return (REGNO (operands[0]) == 0
   5271  1.1  mrg 	      && REGNO (operands[1]) == 1
   5272  1.1  mrg 	      && REGNO (operands[2]) == 2
   5273  1.1  mrg 	      && REGNO (operands[3]) == 3);
   5274  1.1  mrg     default:
   5275  1.1  mrg       gcc_unreachable ();
   5276  1.1  mrg     }
   5277  1.1  mrg }
   5278  1.1  mrg 
   5279  1.1  mrg /* Return nonzero if register OLD_REG can be renamed to register NEW_REG.  */
   5280  1.1  mrg 
   5281  1.1  mrg int
   5282  1.1  mrg h8300_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
   5283  1.1  mrg 			    unsigned int new_reg)
   5284  1.1  mrg {
   5285  1.1  mrg   /* Interrupt functions can only use registers that have already been
   5286  1.1  mrg      saved by the prologue, even if they would normally be
   5287  1.1  mrg      call-clobbered.  */
   5288  1.1  mrg 
   5289  1.1  mrg   if (h8300_current_function_interrupt_function_p ()
   5290  1.1  mrg       && !df_regs_ever_live_p (new_reg))
   5291  1.1  mrg     return 0;
   5292  1.1  mrg 
   5293  1.1  mrg   return 1;
   5294  1.1  mrg }
   5295  1.1  mrg 
   5296  1.1  mrg /* Returns true if register REGNO is safe to be allocated as a scratch
   5297  1.1  mrg    register in the current function.  */
   5298  1.1  mrg 
   5299  1.1  mrg static bool
   5300  1.1  mrg h8300_hard_regno_scratch_ok (unsigned int regno)
   5301  1.1  mrg {
   5302  1.1  mrg   if (h8300_current_function_interrupt_function_p ()
   5303  1.1  mrg       && ! WORD_REG_USED (regno))
   5304  1.1  mrg     return false;
   5305  1.1  mrg 
   5306  1.1  mrg   return true;
   5307  1.1  mrg }
   5308  1.1  mrg 
   5309  1.1  mrg 
   5310  1.1  mrg /* Return nonzero if X is a REG or SUBREG suitable as a base register.  */
   5311  1.1  mrg 
   5312  1.1  mrg static int
   5313  1.1  mrg h8300_rtx_ok_for_base_p (rtx x, int strict)
   5314  1.1  mrg {
   5315  1.1  mrg   /* Strip off SUBREG if any.  */
   5316  1.1  mrg   if (GET_CODE (x) == SUBREG)
   5317  1.1  mrg     x = SUBREG_REG (x);
   5318  1.1  mrg 
   5319  1.1  mrg   return (REG_P (x)
   5320  1.1  mrg 	  && (strict
   5321  1.1  mrg 	      ? REG_OK_FOR_BASE_STRICT_P (x)
   5322  1.1  mrg 	      : REG_OK_FOR_BASE_NONSTRICT_P (x)));
   5323  1.1  mrg }
   5324  1.1  mrg 
   5325  1.1  mrg /* Return nozero if X is a legitimate address.  On the H8/300, a
   5326  1.1  mrg    legitimate address has the form REG, REG+CONSTANT_ADDRESS or
   5327  1.1  mrg    CONSTANT_ADDRESS.  */
   5328  1.1  mrg 
   5329  1.1  mrg static bool
   5330  1.1  mrg h8300_legitimate_address_p (machine_mode mode, rtx x, bool strict)
   5331  1.1  mrg {
   5332  1.1  mrg   /* The register indirect addresses like @er0 is always valid.  */
   5333  1.1  mrg   if (h8300_rtx_ok_for_base_p (x, strict))
   5334  1.1  mrg     return 1;
   5335  1.1  mrg 
   5336  1.1  mrg   if (CONSTANT_ADDRESS_P (x))
   5337  1.1  mrg     return 1;
   5338  1.1  mrg 
   5339  1.1  mrg   if (TARGET_H8300SX
   5340  1.1  mrg       && (   GET_CODE (x) == PRE_INC
   5341  1.1  mrg 	  || GET_CODE (x) == PRE_DEC
   5342  1.1  mrg 	  || GET_CODE (x) == POST_INC
   5343  1.1  mrg 	  || GET_CODE (x) == POST_DEC)
   5344  1.1  mrg       && h8300_rtx_ok_for_base_p (XEXP (x, 0), strict))
   5345  1.1  mrg     return 1;
   5346  1.1  mrg 
   5347  1.1  mrg   if (GET_CODE (x) == PLUS
   5348  1.1  mrg       && CONSTANT_ADDRESS_P (XEXP (x, 1))
   5349  1.1  mrg       && h8300_rtx_ok_for_base_p (h8300_get_index (XEXP (x, 0),
   5350  1.1  mrg 						   mode, 0), strict))
   5351  1.1  mrg     return 1;
   5352  1.1  mrg 
   5353  1.1  mrg   return 0;
   5354  1.1  mrg }
   5355  1.1  mrg 
   5356  1.1  mrg /* Implement TARGET_HARD_REGNO_MODE_OK.  */
   5357  1.1  mrg 
   5358  1.1  mrg static bool
   5359  1.1  mrg h8300_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
   5360  1.1  mrg {
   5361  1.1  mrg   /* MAC register can only be of SImode.  Otherwise, anything
   5362  1.1  mrg      goes.  */
   5363  1.1  mrg   return regno == MAC_REG ? mode == SImode : 1;
   5364  1.1  mrg }
   5365  1.1  mrg 
   5366  1.1  mrg /* Implement TARGET_MODES_TIEABLE_P.  */
   5367  1.1  mrg 
   5368  1.1  mrg static bool
   5369  1.1  mrg h8300_modes_tieable_p (machine_mode mode1, machine_mode mode2)
   5370  1.1  mrg {
   5371  1.1  mrg   return (mode1 == mode2
   5372  1.1  mrg 	  || ((mode1 == QImode
   5373  1.1  mrg 	       || mode1 == HImode
   5374  1.1  mrg 	       || mode1 == SImode)
   5375  1.1  mrg 	      && (mode2 == QImode
   5376  1.1  mrg 		  || mode2 == HImode
   5377  1.1  mrg 		  || mode2 == SImode)));
   5378  1.1  mrg }
   5379  1.1  mrg 
   5380  1.1  mrg /* Helper function for the move patterns.  Make sure a move is legitimate.  */
   5381  1.1  mrg 
   5382  1.1  mrg bool
   5383  1.1  mrg h8300_move_ok (rtx dest, rtx src)
   5384  1.1  mrg {
   5385  1.1  mrg   rtx addr, other;
   5386  1.1  mrg 
   5387  1.1  mrg   /* Validate that at least one operand is a register.  */
   5388  1.1  mrg   if (MEM_P (dest))
   5389  1.1  mrg     {
   5390  1.1  mrg       if (MEM_P (src) || CONSTANT_P (src))
   5391  1.1  mrg 	return false;
   5392  1.1  mrg       addr = XEXP (dest, 0);
   5393  1.1  mrg       other = src;
   5394  1.1  mrg     }
   5395  1.1  mrg   else if (MEM_P (src))
   5396  1.1  mrg     {
   5397  1.1  mrg       addr = XEXP (src, 0);
   5398  1.1  mrg       other = dest;
   5399  1.1  mrg     }
   5400  1.1  mrg   else
   5401  1.1  mrg     return true;
   5402  1.1  mrg 
   5403  1.1  mrg   /* Validate that auto-inc doesn't affect OTHER.  */
   5404  1.1  mrg   if (GET_RTX_CLASS (GET_CODE (addr)) != RTX_AUTOINC)
   5405  1.1  mrg     return true;
   5406  1.1  mrg   addr = XEXP (addr, 0);
   5407  1.1  mrg 
   5408  1.1  mrg   if (addr == stack_pointer_rtx)
   5409  1.1  mrg     return register_no_sp_elim_operand (other, VOIDmode);
   5410  1.1  mrg   else
   5411  1.1  mrg     return !reg_overlap_mentioned_p(other, addr);
   5412  1.1  mrg }
   5413  1.1  mrg 
   5414  1.1  mrg /* Perform target dependent optabs initialization.  */
   5416  1.1  mrg static void
   5417  1.1  mrg h8300_init_libfuncs (void)
   5418  1.1  mrg {
   5419  1.1  mrg   set_optab_libfunc (smul_optab, HImode, "__mulhi3");
   5420  1.1  mrg   set_optab_libfunc (sdiv_optab, HImode, "__divhi3");
   5421  1.1  mrg   set_optab_libfunc (udiv_optab, HImode, "__udivhi3");
   5422  1.1  mrg   set_optab_libfunc (smod_optab, HImode, "__modhi3");
   5423  1.1  mrg   set_optab_libfunc (umod_optab, HImode, "__umodhi3");
   5424  1.1  mrg }
   5425  1.1  mrg 
   5426  1.1  mrg /* Worker function for TARGET_FUNCTION_VALUE.
   5428  1.1  mrg 
   5429  1.1  mrg    On the H8 the return value is in R0/R1.  */
   5430  1.1  mrg 
   5431  1.1  mrg static rtx
   5432  1.1  mrg h8300_function_value (const_tree ret_type,
   5433  1.1  mrg 		      const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
   5434  1.1  mrg 		      bool outgoing ATTRIBUTE_UNUSED)
   5435  1.1  mrg {
   5436  1.1  mrg   return gen_rtx_REG (TYPE_MODE (ret_type), R0_REG);
   5437  1.1  mrg }
   5438  1.1  mrg 
   5439  1.1  mrg /* Worker function for TARGET_LIBCALL_VALUE.
   5440  1.1  mrg 
   5441  1.1  mrg    On the H8 the return value is in R0/R1.  */
   5442  1.1  mrg 
   5443  1.1  mrg static rtx
   5444  1.1  mrg h8300_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
   5445  1.1  mrg {
   5446  1.1  mrg   return gen_rtx_REG (mode, R0_REG);
   5447  1.1  mrg }
   5448  1.1  mrg 
   5449  1.1  mrg /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
   5450  1.1  mrg 
   5451  1.1  mrg    On the H8, R0 is the only register thus used.  */
   5452  1.1  mrg 
   5453  1.1  mrg static bool
   5454  1.1  mrg h8300_function_value_regno_p (const unsigned int regno)
   5455  1.1  mrg {
   5456  1.1  mrg   return (regno == R0_REG);
   5457  1.1  mrg }
   5458  1.1  mrg 
   5459  1.1  mrg /* Worker function for TARGET_RETURN_IN_MEMORY.  */
   5460  1.1  mrg 
   5461  1.1  mrg static bool
   5462  1.1  mrg h8300_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
   5463  1.1  mrg {
   5464  1.1  mrg   return (TYPE_MODE (type) == BLKmode
   5465  1.1  mrg 	  || GET_MODE_SIZE (TYPE_MODE (type)) > 8);
   5466  1.1  mrg }
   5467  1.1  mrg 
   5468  1.1  mrg /* We emit the entire trampoline here.  Depending on the pointer size,
   5470  1.1  mrg    we use a different trampoline.
   5471  1.1  mrg 
   5472  1.1  mrg    Pmode == HImode
   5473  1.1  mrg 	      vvvv context
   5474  1.1  mrg    1 0000 7903xxxx		mov.w	#0x1234,r3
   5475  1.1  mrg    2 0004 5A00xxxx		jmp	@0x1234
   5476  1.1  mrg 	      ^^^^ function
   5477  1.1  mrg 
   5478  1.1  mrg    Pmode == SImode
   5479  1.1  mrg 	      vvvvvvvv context
   5480  1.1  mrg    2 0000 7A03xxxxxxxx		mov.l	#0x12345678,er3
   5481  1.1  mrg    3 0006 5Axxxxxx		jmp	@0x123456
   5482  1.1  mrg 	    ^^^^^^ function
   5483  1.1  mrg */
   5484  1.1  mrg 
   5485  1.1  mrg static void
   5486  1.1  mrg h8300_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
   5487  1.1  mrg {
   5488  1.1  mrg   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
   5489  1.1  mrg   rtx mem;
   5490  1.1  mrg 
   5491  1.1  mrg   if (Pmode == HImode)
   5492  1.1  mrg     {
   5493  1.1  mrg       mem = adjust_address (m_tramp, HImode, 0);
   5494  1.1  mrg       emit_move_insn (mem, GEN_INT (0x7903));
   5495  1.1  mrg       mem = adjust_address (m_tramp, Pmode, 2);
   5496  1.1  mrg       emit_move_insn (mem, cxt);
   5497  1.1  mrg       mem = adjust_address (m_tramp, HImode, 4);
   5498  1.1  mrg       emit_move_insn (mem, GEN_INT (0x5a00));
   5499  1.1  mrg       mem = adjust_address (m_tramp, Pmode, 6);
   5500  1.1  mrg       emit_move_insn (mem, fnaddr);
   5501  1.1  mrg     }
   5502  1.1  mrg   else
   5503  1.1  mrg     {
   5504  1.1  mrg       rtx tem;
   5505  1.1  mrg 
   5506  1.1  mrg       mem = adjust_address (m_tramp, HImode, 0);
   5507  1.1  mrg       emit_move_insn (mem, GEN_INT (0x7a03));
   5508  1.1  mrg       mem = adjust_address (m_tramp, Pmode, 2);
   5509  1.1  mrg       emit_move_insn (mem, cxt);
   5510  1.1  mrg 
   5511  1.1  mrg       tem = copy_to_reg (fnaddr);
   5512  1.1  mrg       emit_insn (gen_andsi3 (tem, tem, GEN_INT (0x00ffffff)));
   5513  1.1  mrg       emit_insn (gen_iorsi3 (tem, tem, GEN_INT (0x5a000000)));
   5514  1.1  mrg       mem = adjust_address (m_tramp, SImode, 6);
   5515  1.1  mrg       emit_move_insn (mem, tem);
   5516  1.1  mrg     }
   5517  1.1  mrg }
   5518  1.1  mrg 
   5519  1.1  mrg /* Implement PUSH_ROUNDING.
   5520  1.1  mrg 
   5521  1.1  mrg    On the H8/300, @-sp really pushes a byte if you ask it to - but that's
   5522  1.1  mrg    dangerous, so we claim that it always pushes a word, then we catch
   5523  1.1  mrg    the mov.b rx,@-sp and turn it into a mov.w rx,@-sp on output.
   5524  1.1  mrg 
   5525  1.1  mrg    On the H8/300H, we simplify TARGET_QUICKCALL by setting this to 4
   5526  1.1  mrg    and doing a similar thing.  */
   5527  1.1  mrg 
   5528  1.1  mrg poly_int64
   5529  1.1  mrg h8300_push_rounding (poly_int64 bytes)
   5530  1.1  mrg {
   5531  1.1  mrg   return ((bytes + PARM_BOUNDARY / 8 - 1) & (-PARM_BOUNDARY / 8));
   5532  1.1  mrg }
   5533  1.1  mrg 
   5534  1.1  mrg static bool
   5535  1.1  mrg h8300_ok_for_sibcall_p (tree fndecl, tree)
   5536  1.1  mrg {
   5537  1.1  mrg   /* If either the caller or target are special, then assume sibling
   5538  1.1  mrg      calls are not OK.  */
   5539  1.1  mrg   if (!fndecl
   5540  1.1  mrg       || h8300_os_task_function_p (fndecl)
   5541  1.1  mrg       || h8300_monitor_function_p (fndecl)
   5542  1.1  mrg       || h8300_interrupt_function_p (fndecl)
   5543  1.1  mrg       || h8300_saveall_function_p (fndecl)
   5544  1.1  mrg       || h8300_os_task_function_p (current_function_decl)
   5545  1.1  mrg       || h8300_monitor_function_p (current_function_decl)
   5546  1.1  mrg       || h8300_interrupt_function_p (current_function_decl)
   5547  1.1  mrg       || h8300_saveall_function_p (current_function_decl))
   5548  1.1  mrg     return false;
   5549  1.1  mrg 
   5550  1.1  mrg   return 1;
   5551  1.1  mrg }
   5552  1.1  mrg 
   5553  1.1  mrg /* Initialize the GCC target structure.  */
   5555  1.1  mrg #undef TARGET_ATTRIBUTE_TABLE
   5556  1.1  mrg #define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
   5557  1.1  mrg 
   5558  1.1  mrg #undef TARGET_ASM_ALIGNED_HI_OP
   5559  1.1  mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
   5560  1.1  mrg 
   5561  1.1  mrg #undef TARGET_ASM_FILE_START
   5562  1.1  mrg #define TARGET_ASM_FILE_START h8300_file_start
   5563  1.1  mrg #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
   5564  1.1  mrg #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
   5565  1.1  mrg 
   5566  1.1  mrg #undef TARGET_ASM_FILE_END
   5567  1.1  mrg #define TARGET_ASM_FILE_END h8300_file_end
   5568  1.1  mrg 
   5569  1.1  mrg #undef TARGET_PRINT_OPERAND
   5570  1.1  mrg #define TARGET_PRINT_OPERAND h8300_print_operand
   5571  1.1  mrg #undef TARGET_PRINT_OPERAND_ADDRESS
   5572  1.1  mrg #define TARGET_PRINT_OPERAND_ADDRESS h8300_print_operand_address
   5573  1.1  mrg #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
   5574  1.1  mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P h8300_print_operand_punct_valid_p
   5575  1.1  mrg 
   5576  1.1  mrg #undef TARGET_ENCODE_SECTION_INFO
   5577  1.1  mrg #define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
   5578  1.1  mrg 
   5579  1.1  mrg #undef TARGET_INSERT_ATTRIBUTES
   5580  1.1  mrg #define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
   5581  1.1  mrg 
   5582  1.1  mrg #undef TARGET_REGISTER_MOVE_COST
   5583  1.1  mrg #define TARGET_REGISTER_MOVE_COST h8300_register_move_cost
   5584  1.1  mrg 
   5585  1.1  mrg #undef TARGET_RTX_COSTS
   5586  1.1  mrg #define TARGET_RTX_COSTS h8300_rtx_costs
   5587  1.1  mrg 
   5588  1.1  mrg #undef TARGET_INIT_LIBFUNCS
   5589  1.1  mrg #define TARGET_INIT_LIBFUNCS h8300_init_libfuncs
   5590  1.1  mrg 
   5591  1.1  mrg #undef TARGET_FUNCTION_VALUE
   5592  1.1  mrg #define TARGET_FUNCTION_VALUE h8300_function_value
   5593  1.1  mrg 
   5594  1.1  mrg #undef TARGET_LIBCALL_VALUE
   5595  1.1  mrg #define TARGET_LIBCALL_VALUE h8300_libcall_value
   5596  1.1  mrg 
   5597  1.1  mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
   5598  1.1  mrg #define TARGET_FUNCTION_VALUE_REGNO_P h8300_function_value_regno_p
   5599  1.1  mrg 
   5600  1.1  mrg #undef TARGET_RETURN_IN_MEMORY
   5601  1.1  mrg #define TARGET_RETURN_IN_MEMORY h8300_return_in_memory
   5602  1.1  mrg 
   5603  1.1  mrg #undef TARGET_FUNCTION_ARG
   5604  1.1  mrg #define TARGET_FUNCTION_ARG h8300_function_arg
   5605  1.1  mrg 
   5606  1.1  mrg #undef TARGET_FUNCTION_ARG_ADVANCE
   5607  1.1  mrg #define TARGET_FUNCTION_ARG_ADVANCE h8300_function_arg_advance
   5608  1.1  mrg 
   5609  1.1  mrg #undef  TARGET_MACHINE_DEPENDENT_REORG
   5610  1.1  mrg #define TARGET_MACHINE_DEPENDENT_REORG h8300_reorg
   5611  1.1  mrg 
   5612  1.1  mrg #undef TARGET_HARD_REGNO_SCRATCH_OK
   5613  1.1  mrg #define TARGET_HARD_REGNO_SCRATCH_OK h8300_hard_regno_scratch_ok
   5614  1.1  mrg 
   5615  1.1  mrg #undef TARGET_HARD_REGNO_MODE_OK
   5616  1.1  mrg #define TARGET_HARD_REGNO_MODE_OK h8300_hard_regno_mode_ok
   5617  1.1  mrg 
   5618  1.1  mrg #undef TARGET_MODES_TIEABLE_P
   5619  1.1  mrg #define TARGET_MODES_TIEABLE_P h8300_modes_tieable_p
   5620  1.1  mrg 
   5621  1.1  mrg #undef TARGET_LRA_P
   5622  1.1  mrg #define TARGET_LRA_P hook_bool_void_false
   5623  1.1  mrg 
   5624  1.1  mrg #undef TARGET_LEGITIMATE_ADDRESS_P
   5625  1.1  mrg #define TARGET_LEGITIMATE_ADDRESS_P	h8300_legitimate_address_p
   5626  1.1  mrg 
   5627  1.1  mrg #undef TARGET_CAN_ELIMINATE
   5628  1.1  mrg #define TARGET_CAN_ELIMINATE h8300_can_eliminate
   5629  1.1  mrg 
   5630  1.1  mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
   5631  1.1  mrg #define TARGET_CONDITIONAL_REGISTER_USAGE h8300_conditional_register_usage
   5632  1.1  mrg 
   5633           #undef TARGET_TRAMPOLINE_INIT
   5634           #define TARGET_TRAMPOLINE_INIT h8300_trampoline_init
   5635           
   5636           #undef TARGET_OPTION_OVERRIDE
   5637           #define TARGET_OPTION_OVERRIDE h8300_option_override
   5638           
   5639           #undef TARGET_MODE_DEPENDENT_ADDRESS_P
   5640           #define TARGET_MODE_DEPENDENT_ADDRESS_P h8300_mode_dependent_address_p
   5641           
   5642           #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
   5643           #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
   5644           
   5645           #undef TARGET_FLAGS_REGNUM
   5646           #define TARGET_FLAGS_REGNUM 12
   5647           
   5648           #undef TARGET_FUNCTION_OK_FOR_SIBCALL
   5649           #define TARGET_FUNCTION_OK_FOR_SIBCALL h8300_ok_for_sibcall_p
   5650           
   5651           struct gcc_target targetm = TARGET_INITIALIZER;
   5652