Home | History | Annotate | Line # | Download | only in nds32
      1  1.1  mrg /* Auxiliary functions for pipeline descriptions pattern of Andes
      2  1.1  mrg    NDS32 cpu for GNU compiler
      3  1.1  mrg    Copyright (C) 2012-2022 Free Software Foundation, Inc.
      4  1.1  mrg    Contributed by Andes Technology Corporation.
      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 it
      9  1.1  mrg    under the terms of the GNU General Public License as published
     10  1.1  mrg    by the Free Software Foundation; either version 3, or (at your
     11  1.1  mrg    option) any later version.
     12  1.1  mrg 
     13  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     14  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     16  1.1  mrg    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 /* ------------------------------------------------------------------------ */
     23  1.1  mrg 
     24  1.1  mrg #define IN_TARGET_CODE 1
     25  1.1  mrg 
     26  1.1  mrg #include "config.h"
     27  1.1  mrg #include "system.h"
     28  1.1  mrg #include "coretypes.h"
     29  1.1  mrg #include "backend.h"
     30  1.1  mrg #include "rtl.h"
     31  1.1  mrg #include "insn-attr.h"
     32  1.1  mrg #include "insn-codes.h"
     33  1.1  mrg #include "target.h"
     34  1.1  mrg 
     35  1.1  mrg #include "nds32-protos.h"
     36  1.1  mrg 
     37  1.1  mrg /* ------------------------------------------------------------------------ */
     38  1.1  mrg 
     39  1.1  mrg namespace nds32 {
     40  1.1  mrg namespace scheduling {
     41  1.1  mrg 
     42  1.1  mrg /* Classify the memory access direction.  It's unknown if the offset register
     43  1.1  mrg    is not a constant value.  */
     44  1.1  mrg enum memory_access_direction
     45  1.1  mrg {
     46  1.1  mrg   MEM_ACCESS_DIR_POS,
     47  1.1  mrg   MEM_ACCESS_DIR_NEG,
     48  1.1  mrg   MEM_ACCESS_DIR_UNKNOWN
     49  1.1  mrg };
     50  1.1  mrg 
     51  1.1  mrg /* A safe wrapper to the function reg_overlap_mentioned_p ().  */
     52  1.1  mrg bool
     53  1.1  mrg reg_overlap_p (rtx x, rtx in)
     54  1.1  mrg {
     55  1.1  mrg   if (x == NULL_RTX || in == NULL_RTX)
     56  1.1  mrg     return false;
     57  1.1  mrg 
     58  1.1  mrg   return static_cast <bool> (reg_overlap_mentioned_p (x, in));
     59  1.1  mrg }
     60  1.1  mrg 
     61  1.1  mrg 
     62  1.1  mrg /* Determine the memory access direction of a load/store insn.  */
     63  1.1  mrg memory_access_direction
     64  1.1  mrg determine_access_direction (rtx_insn *insn)
     65  1.1  mrg {
     66  1.1  mrg   int post_update_rtx_index;
     67  1.1  mrg   rtx plus_rtx;
     68  1.1  mrg   rtx mem_rtx;
     69  1.1  mrg   rtx offset_rtx;
     70  1.1  mrg 
     71  1.1  mrg   switch (get_attr_type (insn))
     72  1.1  mrg   {
     73  1.1  mrg   case TYPE_LOAD_MULTIPLE:
     74  1.1  mrg     gcc_assert (parallel_elements (insn) >= 2);
     75  1.1  mrg 
     76  1.1  mrg     post_update_rtx_index = find_post_update_rtx (insn);
     77  1.1  mrg     if (post_update_rtx_index != -1)
     78  1.1  mrg       plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index));
     79  1.1  mrg     else
     80  1.1  mrg       {
     81  1.1  mrg 	/* (parallel
     82  1.1  mrg 	     [(set (reg) (mem (reg)))              : index 0
     83  1.1  mrg 	      (set (reg) (mem (plus (reg) (...)))) : index 1
     84  1.1  mrg 	      ...])  */
     85  1.1  mrg 	mem_rtx = SET_SRC (parallel_element (insn, 1));
     86  1.1  mrg 	if (GET_CODE (mem_rtx) == UNSPEC)
     87  1.1  mrg 	  mem_rtx = XVECEXP (mem_rtx, 0, 0);
     88  1.1  mrg 	gcc_assert (MEM_P (mem_rtx));
     89  1.1  mrg 	plus_rtx = XEXP (mem_rtx, 0);
     90  1.1  mrg       }
     91  1.1  mrg     break;
     92  1.1  mrg 
     93  1.1  mrg   case TYPE_STORE_MULTIPLE:
     94  1.1  mrg     gcc_assert (parallel_elements (insn) >= 2);
     95  1.1  mrg 
     96  1.1  mrg     post_update_rtx_index = find_post_update_rtx (insn);
     97  1.1  mrg     if (post_update_rtx_index != -1)
     98  1.1  mrg       plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index));
     99  1.1  mrg     else
    100  1.1  mrg       {
    101  1.1  mrg 	/* (parallel
    102  1.1  mrg 	     [(set (mem (reg))              (reg)) : index 0
    103  1.1  mrg 	      (set (mem (plus (reg) (...))) (reg)) : index 1
    104  1.1  mrg 	      ...])  */
    105  1.1  mrg 	mem_rtx = SET_DEST (parallel_element (insn, 1));
    106  1.1  mrg 	if (GET_CODE (mem_rtx) == UNSPEC)
    107  1.1  mrg 	  mem_rtx = XVECEXP (mem_rtx, 0, 0);
    108  1.1  mrg 	gcc_assert (MEM_P (mem_rtx));
    109  1.1  mrg 	plus_rtx = XEXP (mem_rtx, 0);
    110  1.1  mrg       }
    111  1.1  mrg     break;
    112  1.1  mrg 
    113  1.1  mrg   case TYPE_LOAD:
    114  1.1  mrg   case TYPE_STORE:
    115  1.1  mrg     mem_rtx = extract_mem_rtx (insn);
    116  1.1  mrg 
    117  1.1  mrg     switch (GET_CODE (XEXP (mem_rtx, 0)))
    118  1.1  mrg       {
    119  1.1  mrg       case POST_INC:
    120  1.1  mrg 	/* (mem (post_inc (...)))  */
    121  1.1  mrg 	return MEM_ACCESS_DIR_POS;
    122  1.1  mrg 
    123  1.1  mrg       case POST_DEC:
    124  1.1  mrg 	/* (mem (post_dec (...)))  */
    125  1.1  mrg 	return MEM_ACCESS_DIR_NEG;
    126  1.1  mrg 
    127  1.1  mrg       case PLUS:
    128  1.1  mrg 	/* (mem (plus (reg) (...)))  */
    129  1.1  mrg 	plus_rtx = XEXP (mem_rtx, 0);
    130  1.1  mrg 	break;
    131  1.1  mrg 
    132  1.1  mrg       case POST_MODIFY:
    133  1.1  mrg 	/* (mem (post_modify (reg) (plus (reg) (...))))  */
    134  1.1  mrg 	plus_rtx = XEXP (XEXP (mem_rtx, 0), 1);
    135  1.1  mrg 	break;
    136  1.1  mrg 
    137  1.1  mrg       default:
    138  1.1  mrg 	gcc_unreachable ();
    139  1.1  mrg       }
    140  1.1  mrg     break;
    141  1.1  mrg 
    142  1.1  mrg   default:
    143  1.1  mrg     gcc_unreachable ();
    144  1.1  mrg   }
    145  1.1  mrg 
    146  1.1  mrg   gcc_assert (GET_CODE (plus_rtx) == PLUS);
    147  1.1  mrg 
    148  1.1  mrg   offset_rtx = XEXP (plus_rtx, 1);
    149  1.1  mrg   if (GET_CODE (offset_rtx) == CONST_INT)
    150  1.1  mrg     {
    151  1.1  mrg       if (INTVAL (offset_rtx) < 0)
    152  1.1  mrg 	return MEM_ACCESS_DIR_NEG;
    153  1.1  mrg       else
    154  1.1  mrg 	return MEM_ACCESS_DIR_POS;
    155  1.1  mrg     }
    156  1.1  mrg 
    157  1.1  mrg   return MEM_ACCESS_DIR_UNKNOWN;
    158  1.1  mrg }
    159  1.1  mrg 
    160  1.1  mrg /* Return the nth load/store operation in the real micro-operation
    161  1.1  mrg    accessing order.  */
    162  1.1  mrg rtx
    163  1.1  mrg extract_nth_access_rtx (rtx_insn *insn, int n)
    164  1.1  mrg {
    165  1.1  mrg   int n_elems = parallel_elements (insn);
    166  1.1  mrg   int post_update_rtx_index = find_post_update_rtx (insn);
    167  1.1  mrg   memory_access_direction direction = determine_access_direction (insn);
    168  1.1  mrg 
    169  1.1  mrg   gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN);
    170  1.1  mrg 
    171  1.1  mrg   /* Reverse the order if the direction negative.  */
    172  1.1  mrg   if (direction == MEM_ACCESS_DIR_NEG)
    173  1.1  mrg     n = -1 * n - 1;
    174  1.1  mrg 
    175  1.1  mrg   if (post_update_rtx_index != -1)
    176  1.1  mrg     {
    177  1.1  mrg       if (n >= 0 && post_update_rtx_index <= n)
    178  1.1  mrg 	++n;
    179  1.1  mrg       else if (n < 0 && post_update_rtx_index >= n + n_elems)
    180  1.1  mrg 	--n;
    181  1.1  mrg     }
    182  1.1  mrg 
    183  1.1  mrg   return parallel_element (insn, n);
    184  1.1  mrg }
    185  1.1  mrg 
    186  1.1  mrg /* Returns the register operated by the nth load/store operation in the real
    187  1.1  mrg    micro-operation accessing order.  This function assumes INSN must be a
    188  1.1  mrg    multiple-word load/store insn.  */
    189  1.1  mrg rtx
    190  1.1  mrg extract_nth_lmsw_access_reg (rtx_insn *insn, int n)
    191  1.1  mrg {
    192  1.1  mrg   rtx nth_rtx = extract_nth_access_rtx (insn, n);
    193  1.1  mrg 
    194  1.1  mrg   if (nth_rtx == NULL_RTX)
    195  1.1  mrg     return NULL_RTX;
    196  1.1  mrg 
    197  1.1  mrg   switch (get_attr_type (insn))
    198  1.1  mrg     {
    199  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    200  1.1  mrg       return SET_DEST (nth_rtx);
    201  1.1  mrg 
    202  1.1  mrg     case TYPE_STORE_MULTIPLE:
    203  1.1  mrg       return SET_SRC (nth_rtx);
    204  1.1  mrg 
    205  1.1  mrg     default:
    206  1.1  mrg       gcc_unreachable ();
    207  1.1  mrg     }
    208  1.1  mrg }
    209  1.1  mrg 
    210  1.1  mrg /* Returns the register operated by the nth load/store operation in the real
    211  1.1  mrg    micro-operation accessing order.  This function assumes INSN must be a
    212  1.1  mrg    double-word load/store insn.  */
    213  1.1  mrg rtx
    214  1.1  mrg extract_nth_ls2_access_reg (rtx_insn *insn, int n)
    215  1.1  mrg {
    216  1.1  mrg   rtx reg;
    217  1.1  mrg   machine_mode mode;
    218  1.1  mrg 
    219  1.1  mrg   if (post_update_insn_p (insn))
    220  1.1  mrg     {
    221  1.1  mrg       memory_access_direction direction = determine_access_direction (insn);
    222  1.1  mrg       gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN);
    223  1.1  mrg 
    224  1.1  mrg       /* Reverse the order if the direction negative.  */
    225  1.1  mrg       if (direction == MEM_ACCESS_DIR_NEG)
    226  1.1  mrg 	n = -1 * n - 1;
    227  1.1  mrg     }
    228  1.1  mrg 
    229  1.1  mrg   /* Handle the out-of-range case.  */
    230  1.1  mrg   if (n < -2 || n > 1)
    231  1.1  mrg     return NULL_RTX;
    232  1.1  mrg 
    233  1.1  mrg   /* Convert the index to a positive one.  */
    234  1.1  mrg   if (n < 0)
    235  1.1  mrg     n = 2 + n;
    236  1.1  mrg 
    237  1.1  mrg   switch (get_attr_type (insn))
    238  1.1  mrg     {
    239  1.1  mrg     case TYPE_LOAD:
    240  1.1  mrg       reg = SET_DEST (PATTERN (insn));
    241  1.1  mrg       break;
    242  1.1  mrg 
    243  1.1  mrg     case TYPE_STORE:
    244  1.1  mrg       reg = SET_SRC (PATTERN (insn));
    245  1.1  mrg       break;
    246  1.1  mrg 
    247  1.1  mrg     default:
    248  1.1  mrg       gcc_unreachable ();
    249  1.1  mrg     }
    250  1.1  mrg 
    251  1.1  mrg   gcc_assert (REG_P (reg) || GET_CODE (reg) == SUBREG);
    252  1.1  mrg 
    253  1.1  mrg   switch (GET_MODE (reg))
    254  1.1  mrg     {
    255  1.1  mrg     case E_DImode:
    256  1.1  mrg       mode = SImode;
    257  1.1  mrg       break;
    258  1.1  mrg 
    259  1.1  mrg     case E_DFmode:
    260  1.1  mrg       mode = SFmode;
    261  1.1  mrg       break;
    262  1.1  mrg 
    263  1.1  mrg     default:
    264  1.1  mrg       gcc_unreachable ();
    265  1.1  mrg     }
    266  1.1  mrg 
    267  1.1  mrg   if (n == 0)
    268  1.1  mrg     return gen_lowpart (mode, reg);
    269  1.1  mrg   else
    270  1.1  mrg     return gen_highpart (mode, reg);
    271  1.1  mrg }
    272  1.1  mrg 
    273  1.1  mrg /* Returns the register operated by the nth load/store operation in the real
    274  1.1  mrg    micro-operation accessing order.  */
    275  1.1  mrg rtx
    276  1.1  mrg extract_nth_access_reg (rtx_insn *insn, int index)
    277  1.1  mrg {
    278  1.1  mrg   switch (GET_CODE (PATTERN (insn)))
    279  1.1  mrg     {
    280  1.1  mrg     case PARALLEL:
    281  1.1  mrg       return extract_nth_lmsw_access_reg (insn, index);
    282  1.1  mrg 
    283  1.1  mrg     case SET:
    284  1.1  mrg       return extract_nth_ls2_access_reg (insn, index);
    285  1.1  mrg 
    286  1.1  mrg     default:
    287  1.1  mrg       gcc_unreachable ();
    288  1.1  mrg     }
    289  1.1  mrg }
    290  1.1  mrg 
    291  1.1  mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the
    292  1.1  mrg    value of DEF_REG in its Ra or Rb fields.  */
    293  1.1  mrg bool
    294  1.1  mrg pbsada_insn_ra_rb_dep_reg_p (rtx pbsada_insn, rtx def_reg)
    295  1.1  mrg {
    296  1.1  mrg   rtx unspec_rtx = SET_SRC (PATTERN (pbsada_insn));
    297  1.1  mrg   gcc_assert (GET_CODE (unspec_rtx) == UNSPEC);
    298  1.1  mrg 
    299  1.1  mrg   rtx pbsada_ra = XVECEXP (unspec_rtx, 0, 0);
    300  1.1  mrg   rtx pbsada_rb = XVECEXP (unspec_rtx, 0, 1);
    301  1.1  mrg 
    302  1.1  mrg   if (rtx_equal_p (def_reg, pbsada_ra)
    303  1.1  mrg       || rtx_equal_p (def_reg, pbsada_rb))
    304  1.1  mrg     return true;
    305  1.1  mrg 
    306  1.1  mrg   return false;
    307  1.1  mrg }
    308  1.1  mrg 
    309  1.1  mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the
    310  1.1  mrg    value of DEF_REG in its Rt field.  */
    311  1.1  mrg bool
    312  1.1  mrg pbsada_insn_rt_dep_reg_p (rtx pbsada_insn, rtx def_reg)
    313  1.1  mrg {
    314  1.1  mrg   rtx pbsada_rt = SET_DEST (PATTERN (pbsada_insn));
    315  1.1  mrg 
    316  1.1  mrg   if (rtx_equal_p (def_reg, pbsada_rt))
    317  1.1  mrg     return true;
    318  1.1  mrg 
    319  1.1  mrg   return false;
    320  1.1  mrg }
    321  1.1  mrg 
    322  1.1  mrg /* Check if INSN is a movd44 insn consuming DEF_REG.  */
    323  1.1  mrg bool
    324  1.1  mrg movd44_even_dep_p (rtx_insn *insn, rtx def_reg)
    325  1.1  mrg {
    326  1.1  mrg   if (!movd44_insn_p (insn))
    327  1.1  mrg     return false;
    328  1.1  mrg 
    329  1.1  mrg   rtx use_rtx = SET_SRC (PATTERN (insn));
    330  1.1  mrg 
    331  1.1  mrg   if (REG_P (def_reg))
    332  1.1  mrg     {
    333  1.1  mrg       return rtx_equal_p (def_reg, use_rtx);
    334  1.1  mrg     }
    335  1.1  mrg   else if (GET_CODE (def_reg) == SUBREG
    336  1.1  mrg 	   && GET_MODE (def_reg) == SImode
    337  1.1  mrg 	   && rtx_equal_p (SUBREG_REG (def_reg), use_rtx))
    338  1.1  mrg     {
    339  1.1  mrg       if (TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 4)
    340  1.1  mrg 	return true;
    341  1.1  mrg 
    342  1.1  mrg       if (!TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 0)
    343  1.1  mrg 	return true;
    344  1.1  mrg 
    345  1.1  mrg       return false;
    346  1.1  mrg     }
    347  1.1  mrg 
    348  1.1  mrg   return false;
    349  1.1  mrg }
    350  1.1  mrg 
    351  1.1  mrg /* Check if INSN is a wext insn consuming DEF_REG.  */
    352  1.1  mrg bool
    353  1.1  mrg wext_odd_dep_p (rtx insn, rtx def_reg)
    354  1.1  mrg {
    355  1.1  mrg   rtx shift_rtx = XEXP (SET_SRC (PATTERN (insn)), 0);
    356  1.1  mrg   rtx use_reg = XEXP (shift_rtx, 0);
    357  1.1  mrg   rtx pos_rtx = XEXP (shift_rtx, 1);
    358  1.1  mrg 
    359  1.1  mrg   if (REG_P (pos_rtx) && reg_overlap_p (def_reg, pos_rtx))
    360  1.1  mrg     return true;
    361  1.1  mrg 
    362  1.1  mrg   if (GET_MODE (def_reg) == DImode)
    363  1.1  mrg     return reg_overlap_p (def_reg, use_reg);
    364  1.1  mrg 
    365  1.1  mrg   gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
    366  1.1  mrg   gcc_assert (REG_P (use_reg) || GET_CODE (use_reg) == SUBREG);
    367  1.1  mrg 
    368  1.1  mrg   if (REG_P (def_reg))
    369  1.1  mrg     {
    370  1.1  mrg       if REG_P (use_reg)
    371  1.1  mrg 	{
    372  1.1  mrg 	  if (!TARGET_BIG_ENDIAN)
    373  1.1  mrg 	    return REGNO (def_reg) == REGNO (use_reg) + 1;
    374  1.1  mrg 	  else
    375  1.1  mrg 	    return REGNO (def_reg) == REGNO (use_reg);
    376  1.1  mrg 	}
    377  1.1  mrg       else
    378  1.1  mrg 	return true;
    379  1.1  mrg     }
    380  1.1  mrg 
    381  1.1  mrg   if (GET_CODE (def_reg) == SUBREG)
    382  1.1  mrg     {
    383  1.1  mrg       if (!reg_overlap_p (def_reg, use_reg))
    384  1.1  mrg 	return false;
    385  1.1  mrg 
    386  1.1  mrg       if (GET_CODE (use_reg) == SUBREG)
    387  1.1  mrg 	return true;
    388  1.1  mrg 
    389  1.1  mrg       if (!TARGET_BIG_ENDIAN)
    390  1.1  mrg 	return SUBREG_BYTE (def_reg) == 4;
    391  1.1  mrg       else
    392  1.1  mrg 	return SUBREG_BYTE (def_reg) == 0;
    393  1.1  mrg     }
    394  1.1  mrg 
    395  1.1  mrg   return false;
    396  1.1  mrg }
    397  1.1  mrg 
    398  1.1  mrg /* Check if INSN is a bpick insn consuming DEF_REG.  */
    399  1.1  mrg bool
    400  1.1  mrg bpick_ra_rb_dep_p (rtx insn, rtx def_reg)
    401  1.1  mrg {
    402  1.1  mrg   rtx ior_rtx = SET_SRC (PATTERN (insn));
    403  1.1  mrg   rtx and1_rtx = XEXP (ior_rtx, 0);
    404  1.1  mrg   rtx and2_rtx = XEXP (ior_rtx, 1);
    405  1.1  mrg   rtx reg1_0 = XEXP (and1_rtx, 0);
    406  1.1  mrg   rtx reg1_1 = XEXP (and1_rtx, 1);
    407  1.1  mrg   rtx reg2_0 = XEXP (and2_rtx, 0);
    408  1.1  mrg   rtx reg2_1 = XEXP (and2_rtx, 1);
    409  1.1  mrg 
    410  1.1  mrg   if (GET_CODE (reg1_0) == NOT)
    411  1.1  mrg     {
    412  1.1  mrg       if (rtx_equal_p (reg1_0, reg2_0))
    413  1.1  mrg 	return reg_overlap_p (def_reg, reg1_1)
    414  1.1  mrg 	       || reg_overlap_p (def_reg, reg2_1);
    415  1.1  mrg 
    416  1.1  mrg       if (rtx_equal_p (reg1_0, reg2_1))
    417  1.1  mrg 	return reg_overlap_p (def_reg, reg1_1)
    418  1.1  mrg 	       || reg_overlap_p (def_reg, reg2_0);
    419  1.1  mrg     }
    420  1.1  mrg 
    421  1.1  mrg   if (GET_CODE (reg1_1) == NOT)
    422  1.1  mrg     {
    423  1.1  mrg       if (rtx_equal_p (reg1_1, reg2_0))
    424  1.1  mrg 	return reg_overlap_p (def_reg, reg1_0)
    425  1.1  mrg 	       || reg_overlap_p (def_reg, reg2_1);
    426  1.1  mrg 
    427  1.1  mrg       if (rtx_equal_p (reg1_1, reg2_1))
    428  1.1  mrg 	return reg_overlap_p (def_reg, reg1_0)
    429  1.1  mrg 	       || reg_overlap_p (def_reg, reg2_0);
    430  1.1  mrg     }
    431  1.1  mrg 
    432  1.1  mrg   if (GET_CODE (reg2_0) == NOT)
    433  1.1  mrg     {
    434  1.1  mrg       if (rtx_equal_p (reg2_0, reg1_0))
    435  1.1  mrg 	return reg_overlap_p (def_reg, reg2_1)
    436  1.1  mrg 	       || reg_overlap_p (def_reg, reg1_1);
    437  1.1  mrg 
    438  1.1  mrg       if (rtx_equal_p (reg2_0, reg1_1))
    439  1.1  mrg 	return reg_overlap_p (def_reg, reg2_1)
    440  1.1  mrg 	       || reg_overlap_p (def_reg, reg1_0);
    441  1.1  mrg     }
    442  1.1  mrg 
    443  1.1  mrg   if (GET_CODE (reg2_1) == NOT)
    444  1.1  mrg     {
    445  1.1  mrg       if (rtx_equal_p (reg2_1, reg1_0))
    446  1.1  mrg 	return reg_overlap_p (def_reg, reg2_0)
    447  1.1  mrg 	       || reg_overlap_p (def_reg, reg1_1);
    448  1.1  mrg 
    449  1.1  mrg       if (rtx_equal_p (reg2_1, reg1_1))
    450  1.1  mrg 	return reg_overlap_p (def_reg, reg2_0)
    451  1.1  mrg 	       || reg_overlap_p (def_reg, reg1_0);
    452  1.1  mrg     }
    453  1.1  mrg 
    454  1.1  mrg   gcc_unreachable ();
    455  1.1  mrg }
    456  1.1  mrg } // namespace scheduling
    457  1.1  mrg } // namespace nds32
    458  1.1  mrg 
    459  1.1  mrg /* ------------------------------------------------------------------------ */
    460  1.1  mrg 
    461  1.1  mrg using namespace nds32;
    462  1.1  mrg using namespace nds32::scheduling;
    463  1.1  mrg 
    464  1.1  mrg namespace { // anonymous namespace
    465  1.1  mrg 
    466  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    467  1.1  mrg    requiring input operand at II.  */
    468  1.1  mrg bool
    469  1.1  mrg n7_consumed_by_ii_dep_p (rtx_insn *consumer, rtx def_reg)
    470  1.1  mrg {
    471  1.1  mrg   rtx use_rtx;
    472  1.1  mrg 
    473  1.1  mrg   switch (get_attr_type (consumer))
    474  1.1  mrg     {
    475  1.1  mrg     /* MOVD44_E */
    476  1.1  mrg     case TYPE_ALU:
    477  1.1  mrg       if (movd44_even_dep_p (consumer, def_reg))
    478  1.1  mrg 	return true;
    479  1.1  mrg 
    480  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    481  1.1  mrg       break;
    482  1.1  mrg 
    483  1.1  mrg     case TYPE_MUL:
    484  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    485  1.1  mrg       break;
    486  1.1  mrg 
    487  1.1  mrg     case TYPE_MAC:
    488  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
    489  1.1  mrg       break;
    490  1.1  mrg 
    491  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
    492  1.1  mrg       results, the quotient and the remainder.  It requires two micro-
    493  1.1  mrg       operations in order to write two registers. We have to check the
    494  1.1  mrg       dependency from the producer to the first micro-operation.  */
    495  1.1  mrg     case TYPE_DIV:
    496  1.1  mrg       if (divmod_p (consumer))
    497  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    498  1.1  mrg       else
    499  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    500  1.1  mrg       break;
    501  1.1  mrg 
    502  1.1  mrg     case TYPE_LOAD:
    503  1.1  mrg       /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
    504  1.1  mrg       if (post_update_insn_p (consumer))
    505  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    506  1.1  mrg       else
    507  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    508  1.1  mrg       break;
    509  1.1  mrg 
    510  1.1  mrg     case TYPE_STORE:
    511  1.1  mrg       /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
    512  1.1  mrg       if (post_update_insn_p (consumer))
    513  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    514  1.1  mrg       else
    515  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    516  1.1  mrg 
    517  1.1  mrg       if (reg_overlap_p (def_reg, use_rtx))
    518  1.1  mrg 	return true;
    519  1.1  mrg 
    520  1.1  mrg       /* ST_bi, ST_!bi_RI */
    521  1.1  mrg       if (!post_update_insn_p (consumer)
    522  1.1  mrg 	  && !immed_offset_p (extract_mem_rtx (consumer)))
    523  1.1  mrg 	return false;
    524  1.1  mrg 
    525  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    526  1.1  mrg       break;
    527  1.1  mrg 
    528  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    529  1.1  mrg       use_rtx = extract_base_reg (consumer);
    530  1.1  mrg       break;
    531  1.1  mrg 
    532  1.1  mrg     case TYPE_STORE_MULTIPLE:
    533  1.1  mrg       /* ADDR_IN */
    534  1.1  mrg       use_rtx = extract_base_reg (consumer);
    535  1.1  mrg       if (reg_overlap_p (def_reg, use_rtx))
    536  1.1  mrg 	return true;
    537  1.1  mrg 
    538  1.1  mrg       /* SMW (N, 1) */
    539  1.1  mrg       use_rtx = extract_nth_access_rtx (consumer, 0);
    540  1.1  mrg       break;
    541  1.1  mrg 
    542  1.1  mrg     case TYPE_BRANCH:
    543  1.1  mrg       use_rtx = PATTERN (consumer);
    544  1.1  mrg       break;
    545  1.1  mrg 
    546  1.1  mrg     default:
    547  1.1  mrg       gcc_unreachable ();
    548  1.1  mrg     }
    549  1.1  mrg 
    550  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
    551  1.1  mrg     return true;
    552  1.1  mrg 
    553  1.1  mrg   return false;
    554  1.1  mrg }
    555  1.1  mrg 
    556  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    557  1.1  mrg    requiring input operand at AG (II).  */
    558  1.1  mrg bool
    559  1.1  mrg n8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg)
    560  1.1  mrg {
    561  1.1  mrg   rtx use_rtx;
    562  1.1  mrg 
    563  1.1  mrg   switch (get_attr_type (consumer))
    564  1.1  mrg     {
    565  1.1  mrg     case TYPE_BRANCH:
    566  1.1  mrg       use_rtx = extract_branch_target_rtx (consumer);
    567  1.1  mrg       break;
    568  1.1  mrg 
    569  1.1  mrg     case TYPE_LOAD:
    570  1.1  mrg       if (load_single_p (consumer))
    571  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    572  1.1  mrg       else
    573  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    574  1.1  mrg       break;
    575  1.1  mrg 
    576  1.1  mrg     case TYPE_STORE:
    577  1.1  mrg       if (store_single_p (consumer)
    578  1.1  mrg 	  && (!post_update_insn_p (consumer)
    579  1.1  mrg 	      || immed_offset_p (extract_mem_rtx (consumer))))
    580  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    581  1.1  mrg       else
    582  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    583  1.1  mrg       break;
    584  1.1  mrg 
    585  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    586  1.1  mrg     case TYPE_STORE_MULTIPLE:
    587  1.1  mrg       use_rtx = extract_base_reg (consumer);
    588  1.1  mrg       break;
    589  1.1  mrg 
    590  1.1  mrg     default:
    591  1.1  mrg       gcc_unreachable ();
    592  1.1  mrg     }
    593  1.1  mrg 
    594  1.1  mrg   return reg_overlap_p (def_reg, use_rtx);
    595  1.1  mrg }
    596  1.1  mrg 
    597  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    598  1.1  mrg    requiring input operand at EX.  */
    599  1.1  mrg bool
    600  1.1  mrg n8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg)
    601  1.1  mrg {
    602  1.1  mrg   rtx use_rtx;
    603  1.1  mrg 
    604  1.1  mrg   switch (get_attr_type (consumer))
    605  1.1  mrg     {
    606  1.1  mrg     case TYPE_ALU:
    607  1.1  mrg       if (movd44_even_dep_p (consumer, def_reg))
    608  1.1  mrg 	return true;
    609  1.1  mrg 
    610  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    611  1.1  mrg       break;
    612  1.1  mrg 
    613  1.1  mrg     case TYPE_MUL:
    614  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    615  1.1  mrg       break;
    616  1.1  mrg 
    617  1.1  mrg     case TYPE_MAC:
    618  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
    619  1.1  mrg       break;
    620  1.1  mrg 
    621  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
    622  1.1  mrg       results, the quotient and the remainder.  It requires two micro-
    623  1.1  mrg       operations in order to write two registers. We have to check the
    624  1.1  mrg       dependency from the producer to the first micro-operation.  */
    625  1.1  mrg     case TYPE_DIV:
    626  1.1  mrg       if (divmod_p (consumer))
    627  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    628  1.1  mrg       else
    629  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    630  1.1  mrg       break;
    631  1.1  mrg 
    632  1.1  mrg     case TYPE_BRANCH:
    633  1.1  mrg       use_rtx = extract_branch_condition_rtx (consumer);
    634  1.1  mrg       break;
    635  1.1  mrg 
    636  1.1  mrg     case TYPE_STORE:
    637  1.1  mrg       /* exclude ST_!bi_RR */
    638  1.1  mrg       if (!post_update_insn_p (consumer)
    639  1.1  mrg 	  && !immed_offset_p (extract_mem_rtx (consumer)))
    640  1.1  mrg 	return false;
    641  1.1  mrg 
    642  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    643  1.1  mrg       break;
    644  1.1  mrg 
    645  1.1  mrg     case TYPE_STORE_MULTIPLE:
    646  1.1  mrg       use_rtx = extract_nth_access_rtx (consumer, 0);
    647  1.1  mrg       break;
    648  1.1  mrg 
    649  1.1  mrg     default:
    650  1.1  mrg       gcc_unreachable ();
    651  1.1  mrg     }
    652  1.1  mrg 
    653  1.1  mrg   return reg_overlap_p (def_reg, use_rtx);
    654  1.1  mrg }
    655  1.1  mrg 
    656  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    657  1.1  mrg    requiring input operand at AG (II).  */
    658  1.1  mrg bool
    659  1.1  mrg e8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg)
    660  1.1  mrg {
    661  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, def_reg);
    662  1.1  mrg }
    663  1.1  mrg 
    664  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    665  1.1  mrg    requiring input operand at EX.  */
    666  1.1  mrg bool
    667  1.1  mrg e8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg)
    668  1.1  mrg {
    669  1.1  mrg   rtx use_rtx;
    670  1.1  mrg 
    671  1.1  mrg   switch (get_attr_type (consumer))
    672  1.1  mrg     {
    673  1.1  mrg     case TYPE_ALU:
    674  1.1  mrg     case TYPE_STORE:
    675  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    676  1.1  mrg       break;
    677  1.1  mrg 
    678  1.1  mrg     case TYPE_MUL:
    679  1.1  mrg     case TYPE_MAC:
    680  1.1  mrg     case TYPE_DIV:
    681  1.1  mrg     case TYPE_BRANCH:
    682  1.1  mrg     case TYPE_STORE_MULTIPLE:
    683  1.1  mrg       return n8_consumed_by_ex_p (consumer, def_reg);
    684  1.1  mrg 
    685  1.1  mrg     default:
    686  1.1  mrg       gcc_unreachable ();
    687  1.1  mrg     }
    688  1.1  mrg 
    689  1.1  mrg   return reg_overlap_p (def_reg, use_rtx);
    690  1.1  mrg }
    691  1.1  mrg 
    692  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    693  1.1  mrg    requiring input operand at EX.  */
    694  1.1  mrg bool
    695  1.1  mrg n9_2r1w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
    696  1.1  mrg {
    697  1.1  mrg   rtx use_rtx;
    698  1.1  mrg 
    699  1.1  mrg   switch (get_attr_type (consumer))
    700  1.1  mrg     {
    701  1.1  mrg     case TYPE_ALU:
    702  1.1  mrg       if (movd44_even_dep_p (consumer, def_reg))
    703  1.1  mrg 	return true;
    704  1.1  mrg 
    705  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    706  1.1  mrg       break;
    707  1.1  mrg 
    708  1.1  mrg     case TYPE_PBSAD:
    709  1.1  mrg     case TYPE_MUL:
    710  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    711  1.1  mrg       break;
    712  1.1  mrg 
    713  1.1  mrg     case TYPE_ALU_SHIFT:
    714  1.1  mrg       use_rtx = extract_shift_reg (consumer);
    715  1.1  mrg       break;
    716  1.1  mrg 
    717  1.1  mrg     case TYPE_PBSADA:
    718  1.1  mrg       return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
    719  1.1  mrg 
    720  1.1  mrg     case TYPE_MAC:
    721  1.1  mrg       use_rtx = PATTERN (consumer);
    722  1.1  mrg       break;
    723  1.1  mrg 
    724  1.1  mrg     case TYPE_DIV:
    725  1.1  mrg       if (divmod_p (consumer))
    726  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    727  1.1  mrg       else
    728  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    729  1.1  mrg       break;
    730  1.1  mrg 
    731  1.1  mrg     case TYPE_MMU:
    732  1.1  mrg       if (GET_CODE (PATTERN (consumer)) == SET)
    733  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    734  1.1  mrg       else
    735  1.1  mrg 	return true;
    736  1.1  mrg       break;
    737  1.1  mrg 
    738  1.1  mrg     case TYPE_LOAD:
    739  1.1  mrg       /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
    740  1.1  mrg       if (post_update_insn_p (consumer))
    741  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    742  1.1  mrg       else
    743  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    744  1.1  mrg       break;
    745  1.1  mrg 
    746  1.1  mrg     case TYPE_STORE:
    747  1.1  mrg       /* ADDR_IN_bi_Ra, ADDR_IN_!bi */
    748  1.1  mrg       if (post_update_insn_p (consumer))
    749  1.1  mrg 	use_rtx = extract_base_reg (consumer);
    750  1.1  mrg       else
    751  1.1  mrg 	use_rtx = extract_mem_rtx (consumer);
    752  1.1  mrg 
    753  1.1  mrg       if (reg_overlap_p (def_reg, use_rtx))
    754  1.1  mrg 	return true;
    755  1.1  mrg 
    756  1.1  mrg       /* exclude ST_!bi_RR */
    757  1.1  mrg       if (!post_update_insn_p (consumer)
    758  1.1  mrg 	  && !immed_offset_p (extract_mem_rtx (consumer)))
    759  1.1  mrg 	return false;
    760  1.1  mrg 
    761  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    762  1.1  mrg       break;
    763  1.1  mrg 
    764  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    765  1.1  mrg       use_rtx = extract_base_reg (consumer);
    766  1.1  mrg       break;
    767  1.1  mrg 
    768  1.1  mrg     case TYPE_STORE_MULTIPLE:
    769  1.1  mrg       /* ADDR_IN */
    770  1.1  mrg       use_rtx = extract_base_reg (consumer);
    771  1.1  mrg       if (reg_overlap_p (def_reg, use_rtx))
    772  1.1  mrg 	return true;
    773  1.1  mrg 
    774  1.1  mrg       /* SMW (N, 1) */
    775  1.1  mrg       use_rtx = extract_nth_access_rtx (consumer, 0);
    776  1.1  mrg       break;
    777  1.1  mrg 
    778  1.1  mrg     case TYPE_BRANCH:
    779  1.1  mrg       use_rtx = PATTERN (consumer);
    780  1.1  mrg       break;
    781  1.1  mrg 
    782  1.1  mrg     default:
    783  1.1  mrg       gcc_unreachable ();
    784  1.1  mrg     }
    785  1.1  mrg 
    786  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
    787  1.1  mrg     return true;
    788  1.1  mrg 
    789  1.1  mrg   return false;
    790  1.1  mrg }
    791  1.1  mrg 
    792  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    793  1.1  mrg    requiring input operand at EX.  */
    794  1.1  mrg bool
    795  1.1  mrg n9_3r2w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
    796  1.1  mrg {
    797  1.1  mrg   rtx use_rtx;
    798  1.1  mrg 
    799  1.1  mrg   switch (get_attr_type (consumer))
    800  1.1  mrg     {
    801  1.1  mrg     case TYPE_ALU:
    802  1.1  mrg     case TYPE_PBSAD:
    803  1.1  mrg     case TYPE_MUL:
    804  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    805  1.1  mrg       break;
    806  1.1  mrg 
    807  1.1  mrg     case TYPE_ALU_SHIFT:
    808  1.1  mrg       use_rtx = extract_shift_reg (consumer);
    809  1.1  mrg       break;
    810  1.1  mrg 
    811  1.1  mrg     case TYPE_PBSADA:
    812  1.1  mrg       return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
    813  1.1  mrg 
    814  1.1  mrg     case TYPE_MAC:
    815  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
    816  1.1  mrg       break;
    817  1.1  mrg 
    818  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
    819  1.1  mrg       results, the quotient and the remainder.  In 2R1W configuration,
    820  1.1  mrg       it requires two micro-operations in order to write two registers.
    821  1.1  mrg       We have to check the dependency from the producer to the first
    822  1.1  mrg       micro-operation.  */
    823  1.1  mrg     case TYPE_DIV:
    824  1.1  mrg       if (divmod_p (consumer))
    825  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    826  1.1  mrg       else
    827  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    828  1.1  mrg       break;
    829  1.1  mrg 
    830  1.1  mrg     case TYPE_MMU:
    831  1.1  mrg       if (GET_CODE (PATTERN (consumer)) == SET)
    832  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    833  1.1  mrg       else
    834  1.1  mrg 	return true;
    835  1.1  mrg       break;
    836  1.1  mrg 
    837  1.1  mrg     case TYPE_LOAD:
    838  1.1  mrg     case TYPE_STORE:
    839  1.1  mrg       use_rtx = extract_mem_rtx (consumer);
    840  1.1  mrg       break;
    841  1.1  mrg 
    842  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    843  1.1  mrg     case TYPE_STORE_MULTIPLE:
    844  1.1  mrg       use_rtx = extract_base_reg (consumer);
    845  1.1  mrg       break;
    846  1.1  mrg 
    847  1.1  mrg     case TYPE_BRANCH:
    848  1.1  mrg       use_rtx = PATTERN (consumer);
    849  1.1  mrg       break;
    850  1.1  mrg 
    851  1.1  mrg     default:
    852  1.1  mrg       gcc_unreachable ();
    853  1.1  mrg     }
    854  1.1  mrg 
    855  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
    856  1.1  mrg     return true;
    857  1.1  mrg 
    858  1.1  mrg   return false;
    859  1.1  mrg }
    860  1.1  mrg 
    861  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    862  1.1  mrg    requiring input operand at EX.  */
    863  1.1  mrg bool
    864  1.1  mrg n10_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
    865  1.1  mrg {
    866  1.1  mrg   rtx use_rtx;
    867  1.1  mrg 
    868  1.1  mrg   switch (get_attr_type (consumer))
    869  1.1  mrg     {
    870  1.1  mrg     case TYPE_ALU:
    871  1.1  mrg     case TYPE_PBSAD:
    872  1.1  mrg     case TYPE_MUL:
    873  1.1  mrg     case TYPE_DALU:
    874  1.1  mrg     case TYPE_DALU64:
    875  1.1  mrg     case TYPE_DMUL:
    876  1.1  mrg     case TYPE_DPACK:
    877  1.1  mrg     case TYPE_DINSB:
    878  1.1  mrg     case TYPE_DCMP:
    879  1.1  mrg     case TYPE_DCLIP:
    880  1.1  mrg     case TYPE_DALUROUND:
    881  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    882  1.1  mrg       break;
    883  1.1  mrg 
    884  1.1  mrg     case TYPE_ALU_SHIFT:
    885  1.1  mrg       use_rtx = extract_shift_reg (consumer);
    886  1.1  mrg       break;
    887  1.1  mrg 
    888  1.1  mrg     case TYPE_PBSADA:
    889  1.1  mrg       return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
    890  1.1  mrg 
    891  1.1  mrg     case TYPE_MAC:
    892  1.1  mrg     case TYPE_DMAC:
    893  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
    894  1.1  mrg       break;
    895  1.1  mrg 
    896  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
    897  1.1  mrg       results, the quotient and the remainder.  */
    898  1.1  mrg     case TYPE_DIV:
    899  1.1  mrg       if (divmod_p (consumer))
    900  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    901  1.1  mrg       else
    902  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    903  1.1  mrg       break;
    904  1.1  mrg 
    905  1.1  mrg     case TYPE_DWEXT:
    906  1.1  mrg       return wext_odd_dep_p (consumer, def_reg);
    907  1.1  mrg 
    908  1.1  mrg     case TYPE_DBPICK:
    909  1.1  mrg       return bpick_ra_rb_dep_p (consumer, def_reg);
    910  1.1  mrg 
    911  1.1  mrg     case TYPE_MMU:
    912  1.1  mrg       if (GET_CODE (PATTERN (consumer)) == SET)
    913  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    914  1.1  mrg       else
    915  1.1  mrg 	return true;
    916  1.1  mrg       break;
    917  1.1  mrg 
    918  1.1  mrg     case TYPE_LOAD:
    919  1.1  mrg     case TYPE_STORE:
    920  1.1  mrg       use_rtx = extract_mem_rtx (consumer);
    921  1.1  mrg       break;
    922  1.1  mrg 
    923  1.1  mrg     case TYPE_LOAD_MULTIPLE:
    924  1.1  mrg     case TYPE_STORE_MULTIPLE:
    925  1.1  mrg       use_rtx = extract_base_reg (consumer);
    926  1.1  mrg       break;
    927  1.1  mrg 
    928  1.1  mrg     case TYPE_BRANCH:
    929  1.1  mrg       use_rtx = PATTERN (consumer);
    930  1.1  mrg       break;
    931  1.1  mrg 
    932  1.1  mrg     default:
    933  1.1  mrg       gcc_unreachable ();
    934  1.1  mrg     }
    935  1.1  mrg 
    936  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
    937  1.1  mrg     return true;
    938  1.1  mrg 
    939  1.1  mrg   return false;
    940  1.1  mrg }
    941  1.1  mrg 
    942  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
    943  1.1  mrg    requiring input operand at EX.  */
    944  1.1  mrg bool
    945  1.1  mrg gw_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg)
    946  1.1  mrg {
    947  1.1  mrg   rtx use_rtx;
    948  1.1  mrg 
    949  1.1  mrg   switch (get_attr_type (consumer))
    950  1.1  mrg     {
    951  1.1  mrg     case TYPE_ALU:
    952  1.1  mrg     case TYPE_PBSAD:
    953  1.1  mrg     case TYPE_MUL:
    954  1.1  mrg     case TYPE_DALU:
    955  1.1  mrg     case TYPE_DALU64:
    956  1.1  mrg     case TYPE_DMUL:
    957  1.1  mrg     case TYPE_DPACK:
    958  1.1  mrg     case TYPE_DINSB:
    959  1.1  mrg     case TYPE_DCMP:
    960  1.1  mrg     case TYPE_DCLIP:
    961  1.1  mrg     case TYPE_DALUROUND:
    962  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
    963  1.1  mrg       break;
    964  1.1  mrg 
    965  1.1  mrg     case TYPE_ALU_SHIFT:
    966  1.1  mrg       use_rtx = extract_shift_reg (consumer);
    967  1.1  mrg       break;
    968  1.1  mrg 
    969  1.1  mrg     case TYPE_PBSADA:
    970  1.1  mrg       return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
    971  1.1  mrg 
    972  1.1  mrg     case TYPE_MAC:
    973  1.1  mrg     case TYPE_DMAC:
    974  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
    975  1.1  mrg       break;
    976  1.1  mrg 
    977  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
    978  1.1  mrg       results, the quotient and the remainder.  We have to check the
    979  1.1  mrg       dependency from the producer to the first micro-operation.  */
    980  1.1  mrg     case TYPE_DIV:
    981  1.1  mrg       if (divmod_p (consumer))
    982  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
    983  1.1  mrg       else
    984  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    985  1.1  mrg       break;
    986  1.1  mrg 
    987  1.1  mrg     case TYPE_DWEXT:
    988  1.1  mrg       return wext_odd_dep_p (consumer, def_reg);
    989  1.1  mrg 
    990  1.1  mrg     case TYPE_DBPICK:
    991  1.1  mrg       return bpick_ra_rb_dep_p (consumer, def_reg);
    992  1.1  mrg 
    993  1.1  mrg     case TYPE_MMU:
    994  1.1  mrg       if (GET_CODE (PATTERN (consumer)) == SET)
    995  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
    996  1.1  mrg       else
    997  1.1  mrg 	return true;
    998  1.1  mrg       break;
    999  1.1  mrg 
   1000  1.1  mrg     case TYPE_LOAD:
   1001  1.1  mrg     case TYPE_STORE:
   1002  1.1  mrg       use_rtx = extract_mem_rtx (consumer);
   1003  1.1  mrg       break;
   1004  1.1  mrg 
   1005  1.1  mrg     case TYPE_LOAD_MULTIPLE:
   1006  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1007  1.1  mrg       use_rtx = extract_base_reg (consumer);
   1008  1.1  mrg       break;
   1009  1.1  mrg 
   1010  1.1  mrg     case TYPE_BRANCH:
   1011  1.1  mrg       use_rtx = PATTERN (consumer);
   1012  1.1  mrg       break;
   1013  1.1  mrg 
   1014  1.1  mrg     default:
   1015  1.1  mrg       gcc_unreachable ();
   1016  1.1  mrg     }
   1017  1.1  mrg 
   1018  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
   1019  1.1  mrg     return true;
   1020  1.1  mrg 
   1021  1.1  mrg   return false;
   1022  1.1  mrg }
   1023  1.1  mrg 
   1024  1.1  mrg /* Check dependencies from any stages to ALU_E1 (E1).  This is a helper
   1025  1.1  mrg    function of n13_consumed_by_e1_dep_p ().  */
   1026  1.1  mrg bool
   1027  1.1  mrg n13_alu_e1_insn_dep_reg_p (rtx_insn *alu_e1_insn, rtx def_reg)
   1028  1.1  mrg {
   1029  1.1  mrg   rtx unspec_rtx, operand_ra, operand_rb;
   1030  1.1  mrg   rtx src_rtx, dst_rtx;
   1031  1.1  mrg 
   1032  1.1  mrg   switch (INSN_CODE (alu_e1_insn))
   1033  1.1  mrg     {
   1034  1.1  mrg     /* BSP and BSE are supported by built-in functions, the corresponding
   1035  1.1  mrg        patterns are formed by UNSPEC RTXs.  We have to handle them
   1036  1.1  mrg        individually.  */
   1037  1.1  mrg     case CODE_FOR_unspec_bsp:
   1038  1.1  mrg     case CODE_FOR_unspec_bse:
   1039  1.1  mrg       unspec_rtx = SET_SRC (parallel_element (alu_e1_insn, 0));
   1040  1.1  mrg       gcc_assert (GET_CODE (unspec_rtx) == UNSPEC);
   1041  1.1  mrg 
   1042  1.1  mrg       operand_ra = XVECEXP (unspec_rtx, 0, 0);
   1043  1.1  mrg       operand_rb = XVECEXP (unspec_rtx, 0, 1);
   1044  1.1  mrg 
   1045  1.1  mrg       if (rtx_equal_p (def_reg, operand_ra)
   1046  1.1  mrg 	  || rtx_equal_p (def_reg, operand_rb))
   1047  1.1  mrg 	return true;
   1048  1.1  mrg 
   1049  1.1  mrg       return false;
   1050  1.1  mrg 
   1051  1.1  mrg     /* Unlink general ALU instructions, MOVD44 requires operands at E1.  */
   1052  1.1  mrg     case CODE_FOR_move_di:
   1053  1.1  mrg     case CODE_FOR_move_df:
   1054  1.1  mrg       src_rtx = SET_SRC (PATTERN (alu_e1_insn));
   1055  1.1  mrg       dst_rtx = SET_DEST (PATTERN (alu_e1_insn));
   1056  1.1  mrg 
   1057  1.1  mrg       if (REG_P (dst_rtx) && REG_P (src_rtx)
   1058  1.1  mrg 	  && rtx_equal_p (src_rtx, def_reg))
   1059  1.1  mrg 	return true;
   1060  1.1  mrg 
   1061  1.1  mrg       return false;
   1062  1.1  mrg 
   1063  1.1  mrg     default:
   1064  1.1  mrg       return false;
   1065  1.1  mrg     }
   1066  1.1  mrg }
   1067  1.1  mrg 
   1068  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
   1069  1.1  mrg    requiring input operand at E1.  Because the address generation unti is
   1070  1.1  mrg    at E1, the address input should be ready at E1.  Note that the branch
   1071  1.1  mrg    target is also a kind of addresses, so we have to check it.  */
   1072  1.1  mrg bool
   1073  1.1  mrg n13_consumed_by_e1_dep_p (rtx_insn *consumer, rtx def_reg)
   1074  1.1  mrg {
   1075  1.1  mrg   rtx use_rtx;
   1076  1.1  mrg 
   1077  1.1  mrg   switch (get_attr_type (consumer))
   1078  1.1  mrg     {
   1079  1.1  mrg     /* ALU_E1 */
   1080  1.1  mrg     case TYPE_ALU:
   1081  1.1  mrg       return n13_alu_e1_insn_dep_reg_p (consumer, def_reg);
   1082  1.1  mrg 
   1083  1.1  mrg     case TYPE_PBSADA:
   1084  1.1  mrg       return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg);
   1085  1.1  mrg 
   1086  1.1  mrg     case TYPE_PBSAD:
   1087  1.1  mrg     case TYPE_MUL:
   1088  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
   1089  1.1  mrg       break;
   1090  1.1  mrg 
   1091  1.1  mrg     case TYPE_MAC:
   1092  1.1  mrg       use_rtx = extract_mac_non_acc_rtx (consumer);
   1093  1.1  mrg       break;
   1094  1.1  mrg 
   1095  1.1  mrg     case TYPE_DIV:
   1096  1.1  mrg       if (divmod_p (consumer))
   1097  1.1  mrg 	use_rtx = SET_SRC (parallel_element (consumer, 0));
   1098  1.1  mrg       else
   1099  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
   1100  1.1  mrg       break;
   1101  1.1  mrg 
   1102  1.1  mrg     case TYPE_MMU:
   1103  1.1  mrg       if (GET_CODE (PATTERN (consumer)) == SET)
   1104  1.1  mrg 	use_rtx = SET_SRC (PATTERN (consumer));
   1105  1.1  mrg       else
   1106  1.1  mrg 	return true;
   1107  1.1  mrg       break;
   1108  1.1  mrg 
   1109  1.1  mrg     case TYPE_BRANCH:
   1110  1.1  mrg       use_rtx = extract_branch_target_rtx (consumer);
   1111  1.1  mrg       break;
   1112  1.1  mrg 
   1113  1.1  mrg     case TYPE_LOAD:
   1114  1.1  mrg     case TYPE_STORE:
   1115  1.1  mrg       use_rtx = extract_mem_rtx (consumer);
   1116  1.1  mrg       break;
   1117  1.1  mrg 
   1118  1.1  mrg     case TYPE_LOAD_MULTIPLE:
   1119  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1120  1.1  mrg       use_rtx = extract_base_reg (consumer);
   1121  1.1  mrg       break;
   1122  1.1  mrg 
   1123  1.1  mrg     default:
   1124  1.1  mrg       return false;
   1125  1.1  mrg     }
   1126  1.1  mrg 
   1127  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
   1128  1.1  mrg     return true;
   1129  1.1  mrg 
   1130  1.1  mrg   return false;
   1131  1.1  mrg }
   1132  1.1  mrg 
   1133  1.1  mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER
   1134  1.1  mrg    requiring input operand at E2.  */
   1135  1.1  mrg bool
   1136  1.1  mrg n13_consumed_by_e2_dep_p (rtx_insn *consumer, rtx def_reg)
   1137  1.1  mrg {
   1138  1.1  mrg   rtx use_rtx;
   1139  1.1  mrg 
   1140  1.1  mrg   switch (get_attr_type (consumer))
   1141  1.1  mrg     {
   1142  1.1  mrg     case TYPE_ALU:
   1143  1.1  mrg     case TYPE_STORE:
   1144  1.1  mrg       use_rtx = SET_SRC (PATTERN (consumer));
   1145  1.1  mrg       break;
   1146  1.1  mrg 
   1147  1.1  mrg     case TYPE_ALU_SHIFT:
   1148  1.1  mrg       use_rtx = extract_shift_reg (consumer);
   1149  1.1  mrg       break;
   1150  1.1  mrg 
   1151  1.1  mrg     case TYPE_PBSADA:
   1152  1.1  mrg       return pbsada_insn_rt_dep_reg_p (consumer, def_reg);
   1153  1.1  mrg 
   1154  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1155  1.1  mrg       use_rtx = extract_nth_access_rtx (consumer, 0);
   1156  1.1  mrg       break;
   1157  1.1  mrg 
   1158  1.1  mrg     case TYPE_BRANCH:
   1159  1.1  mrg       use_rtx = extract_branch_condition_rtx (consumer);
   1160  1.1  mrg       break;
   1161  1.1  mrg 
   1162  1.1  mrg     default:
   1163  1.1  mrg       gcc_unreachable();
   1164  1.1  mrg     }
   1165  1.1  mrg 
   1166  1.1  mrg   if (reg_overlap_p (def_reg, use_rtx))
   1167  1.1  mrg     return true;
   1168  1.1  mrg 
   1169  1.1  mrg   return false;
   1170  1.1  mrg }
   1171  1.1  mrg } // anonymous namespace
   1172  1.1  mrg 
   1173  1.1  mrg /* ------------------------------------------------------------------------ */
   1174  1.1  mrg 
   1175  1.1  mrg /* Guard functions for N7 core.  */
   1176  1.1  mrg 
   1177  1.1  mrg bool
   1178  1.1  mrg nds32_n7_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1179  1.1  mrg {
   1180  1.1  mrg   if (post_update_insn_p (producer))
   1181  1.1  mrg     return false;
   1182  1.1  mrg 
   1183  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1184  1.1  mrg 
   1185  1.1  mrg   return n7_consumed_by_ii_dep_p (consumer, def_reg);
   1186  1.1  mrg }
   1187  1.1  mrg 
   1188  1.1  mrg bool
   1189  1.1  mrg nds32_n7_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1190  1.1  mrg {
   1191  1.1  mrg   /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
   1192  1.1  mrg      the base register and the result is ready in II stage, so we don't need
   1193  1.1  mrg      to handle that case in this guard function and the corresponding bypass
   1194  1.1  mrg      rule.  */
   1195  1.1  mrg   if (post_update_insn_p (producer))
   1196  1.1  mrg     return false;
   1197  1.1  mrg 
   1198  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1199  1.1  mrg 
   1200  1.1  mrg   if (last_def_reg == NULL_RTX)
   1201  1.1  mrg     return false;
   1202  1.1  mrg 
   1203  1.1  mrg   gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
   1204  1.1  mrg 
   1205  1.1  mrg   return n7_consumed_by_ii_dep_p (consumer, last_def_reg);
   1206  1.1  mrg }
   1207  1.1  mrg 
   1208  1.1  mrg /* Guard functions for N8 core.  */
   1209  1.1  mrg 
   1210  1.1  mrg bool
   1211  1.1  mrg nds32_n8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1212  1.1  mrg {
   1213  1.1  mrg   if (post_update_insn_p (producer))
   1214  1.1  mrg     return false;
   1215  1.1  mrg 
   1216  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1217  1.1  mrg 
   1218  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, def_reg);
   1219  1.1  mrg }
   1220  1.1  mrg 
   1221  1.1  mrg bool
   1222  1.1  mrg nds32_n8_load_bi_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1223  1.1  mrg {
   1224  1.1  mrg   if (!post_update_insn_p (producer))
   1225  1.1  mrg     return false;
   1226  1.1  mrg 
   1227  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1228  1.1  mrg 
   1229  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, def_reg);
   1230  1.1  mrg }
   1231  1.1  mrg 
   1232  1.1  mrg bool
   1233  1.1  mrg nds32_n8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1234  1.1  mrg {
   1235  1.1  mrg   if (post_update_insn_p (producer))
   1236  1.1  mrg     return false;
   1237  1.1  mrg 
   1238  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1239  1.1  mrg 
   1240  1.1  mrg   return n8_consumed_by_ex_p (consumer, def_reg);
   1241  1.1  mrg }
   1242  1.1  mrg 
   1243  1.1  mrg bool
   1244  1.1  mrg nds32_n8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1245  1.1  mrg {
   1246  1.1  mrg   rtx def_reg;
   1247  1.1  mrg 
   1248  1.1  mrg   switch (get_attr_type (producer))
   1249  1.1  mrg     {
   1250  1.1  mrg     case TYPE_ALU:
   1251  1.1  mrg       if (movd44_insn_p (producer))
   1252  1.1  mrg 	def_reg = extract_movd44_odd_reg (producer);
   1253  1.1  mrg       else
   1254  1.1  mrg 	def_reg = SET_DEST (PATTERN (producer));
   1255  1.1  mrg       break;
   1256  1.1  mrg 
   1257  1.1  mrg     case TYPE_MUL:
   1258  1.1  mrg     case TYPE_MAC:
   1259  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1260  1.1  mrg       break;
   1261  1.1  mrg 
   1262  1.1  mrg     case TYPE_DIV:
   1263  1.1  mrg       if (divmod_p (producer))
   1264  1.1  mrg 	def_reg = SET_DEST (parallel_element (producer, 1));
   1265  1.1  mrg       else
   1266  1.1  mrg 	def_reg = SET_DEST (PATTERN (producer));
   1267  1.1  mrg       break;
   1268  1.1  mrg 
   1269  1.1  mrg     case TYPE_LOAD:
   1270  1.1  mrg     case TYPE_STORE:
   1271  1.1  mrg     case TYPE_LOAD_MULTIPLE:
   1272  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1273  1.1  mrg       if (!post_update_insn_p (producer))
   1274  1.1  mrg 	return false;
   1275  1.1  mrg 
   1276  1.1  mrg       def_reg = extract_base_reg (producer);
   1277  1.1  mrg       break;
   1278  1.1  mrg 
   1279  1.1  mrg     default:
   1280  1.1  mrg       gcc_unreachable ();
   1281  1.1  mrg     }
   1282  1.1  mrg 
   1283  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, def_reg);
   1284  1.1  mrg }
   1285  1.1  mrg 
   1286  1.1  mrg bool
   1287  1.1  mrg nds32_n8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1288  1.1  mrg {
   1289  1.1  mrg   /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
   1290  1.1  mrg      the base register and the result is ready in EX stage, so we don't need
   1291  1.1  mrg      to handle that case in this guard function and the corresponding bypass
   1292  1.1  mrg      rule.  */
   1293  1.1  mrg   if (post_update_insn_p (producer))
   1294  1.1  mrg     return false;
   1295  1.1  mrg 
   1296  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1297  1.1  mrg 
   1298  1.1  mrg   if (last_def_reg == NULL_RTX)
   1299  1.1  mrg     return false;
   1300  1.1  mrg 
   1301  1.1  mrg   gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
   1302  1.1  mrg 
   1303  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, last_def_reg);
   1304  1.1  mrg }
   1305  1.1  mrg 
   1306  1.1  mrg bool
   1307  1.1  mrg nds32_n8_last_load_two_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1308  1.1  mrg {
   1309  1.1  mrg   int index = -2;
   1310  1.1  mrg 
   1311  1.1  mrg   /* If PRODUCER is a post-update insn, there is an additional one micro-
   1312  1.1  mrg      operation inserted in the end, so the last memory access operation should
   1313  1.1  mrg      be handled by this guard function and the corresponding bypass rule.  */
   1314  1.1  mrg   if (post_update_insn_p (producer))
   1315  1.1  mrg     index = -1;
   1316  1.1  mrg 
   1317  1.1  mrg   rtx last_two_def_reg = extract_nth_access_reg (producer, index);
   1318  1.1  mrg 
   1319  1.1  mrg   if (last_two_def_reg == NULL_RTX)
   1320  1.1  mrg     return false;
   1321  1.1  mrg 
   1322  1.1  mrg   gcc_assert (REG_P (last_two_def_reg)
   1323  1.1  mrg 	      || GET_CODE (last_two_def_reg) == SUBREG);
   1324  1.1  mrg 
   1325  1.1  mrg   return n8_consumed_by_addr_in_p (consumer, last_two_def_reg);
   1326  1.1  mrg }
   1327  1.1  mrg 
   1328  1.1  mrg bool
   1329  1.1  mrg nds32_n8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1330  1.1  mrg {
   1331  1.1  mrg   /* If PRODUCER is a post-update LMW insn, the last micro-operation updates
   1332  1.1  mrg      the base register and the result is ready in EX stage, so we don't need
   1333  1.1  mrg      to handle that case in this guard function and the corresponding bypass
   1334  1.1  mrg      rule.  */
   1335  1.1  mrg   if (post_update_insn_p (producer))
   1336  1.1  mrg     return false;
   1337  1.1  mrg 
   1338  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1339  1.1  mrg 
   1340  1.1  mrg   if (last_def_reg == NULL_RTX)
   1341  1.1  mrg     return false;
   1342  1.1  mrg 
   1343  1.1  mrg   gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
   1344  1.1  mrg 
   1345  1.1  mrg   return n8_consumed_by_ex_p (consumer, last_def_reg);
   1346  1.1  mrg }
   1347  1.1  mrg 
   1348  1.1  mrg /* Guard functions for E8 cores.  */
   1349  1.1  mrg 
   1350  1.1  mrg bool
   1351  1.1  mrg nds32_e8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1352  1.1  mrg {
   1353  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1354  1.1  mrg 
   1355  1.1  mrg   return e8_consumed_by_addr_in_p (consumer, def_reg);
   1356  1.1  mrg }
   1357  1.1  mrg 
   1358  1.1  mrg bool
   1359  1.1  mrg nds32_e8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1360  1.1  mrg {
   1361  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1362  1.1  mrg 
   1363  1.1  mrg   return e8_consumed_by_ex_p (consumer, def_reg);
   1364  1.1  mrg }
   1365  1.1  mrg 
   1366  1.1  mrg bool
   1367  1.1  mrg nds32_e8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1368  1.1  mrg {
   1369  1.1  mrg   rtx def_reg;
   1370  1.1  mrg 
   1371  1.1  mrg   switch (get_attr_type (producer))
   1372  1.1  mrg     {
   1373  1.1  mrg     case TYPE_ALU:
   1374  1.1  mrg       /* No data hazards if AGEN's input is produced by MOVI or SETHI.  */
   1375  1.1  mrg       if (GET_CODE (PATTERN (producer)) == SET)
   1376  1.1  mrg 	{
   1377  1.1  mrg 	  rtx dest = SET_DEST (PATTERN (producer));
   1378  1.1  mrg 	  rtx src = SET_SRC (PATTERN (producer));
   1379  1.1  mrg 
   1380  1.1  mrg 	  if ((REG_P (dest) || GET_CODE (dest) == SUBREG)
   1381  1.1  mrg 	      && (GET_CODE (src) == CONST_INT || GET_CODE (src) == HIGH))
   1382  1.1  mrg 	    return false;
   1383  1.1  mrg 	}
   1384  1.1  mrg 
   1385  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1386  1.1  mrg       break;
   1387  1.1  mrg 
   1388  1.1  mrg     case TYPE_MUL:
   1389  1.1  mrg     case TYPE_MAC:
   1390  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1391  1.1  mrg       break;
   1392  1.1  mrg 
   1393  1.1  mrg     case TYPE_DIV:
   1394  1.1  mrg       if (divmod_p (producer))
   1395  1.1  mrg 	{
   1396  1.1  mrg 	  rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
   1397  1.1  mrg 	  rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
   1398  1.1  mrg 
   1399  1.1  mrg 	  return (e8_consumed_by_addr_in_p (consumer, def_reg1)
   1400  1.1  mrg 		  || e8_consumed_by_addr_in_p (consumer, def_reg2));
   1401  1.1  mrg 	}
   1402  1.1  mrg 
   1403  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1404  1.1  mrg       break;
   1405  1.1  mrg 
   1406  1.1  mrg     case TYPE_LOAD:
   1407  1.1  mrg     case TYPE_STORE:
   1408  1.1  mrg     case TYPE_LOAD_MULTIPLE:
   1409  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1410  1.1  mrg       if (!post_update_insn_p (producer))
   1411  1.1  mrg 	return false;
   1412  1.1  mrg 
   1413  1.1  mrg       def_reg = extract_base_reg (producer);
   1414  1.1  mrg       break;
   1415  1.1  mrg 
   1416  1.1  mrg     default:
   1417  1.1  mrg       gcc_unreachable ();
   1418  1.1  mrg     }
   1419  1.1  mrg 
   1420  1.1  mrg   return e8_consumed_by_addr_in_p (consumer, def_reg);
   1421  1.1  mrg }
   1422  1.1  mrg 
   1423  1.1  mrg bool
   1424  1.1  mrg nds32_e8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer)
   1425  1.1  mrg {
   1426  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1427  1.1  mrg 
   1428  1.1  mrg   if (last_def_reg == NULL_RTX)
   1429  1.1  mrg     return false;
   1430  1.1  mrg 
   1431  1.1  mrg   gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
   1432  1.1  mrg 
   1433  1.1  mrg   return e8_consumed_by_addr_in_p (consumer, last_def_reg);
   1434  1.1  mrg }
   1435  1.1  mrg 
   1436  1.1  mrg bool
   1437  1.1  mrg nds32_e8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1438  1.1  mrg {
   1439  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1440  1.1  mrg 
   1441  1.1  mrg   if (last_def_reg == NULL_RTX)
   1442  1.1  mrg     return false;
   1443  1.1  mrg 
   1444  1.1  mrg   gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG);
   1445  1.1  mrg 
   1446  1.1  mrg   return e8_consumed_by_ex_p (consumer, last_def_reg);
   1447  1.1  mrg }
   1448  1.1  mrg 
   1449  1.1  mrg /* Guard functions for N9 cores.  */
   1450  1.1  mrg 
   1451  1.1  mrg /* Check dependencies from MM to EX.  */
   1452  1.1  mrg bool
   1453  1.1  mrg nds32_n9_2r1w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1454  1.1  mrg {
   1455  1.1  mrg   rtx def_reg;
   1456  1.1  mrg 
   1457  1.1  mrg   switch (get_attr_type (producer))
   1458  1.1  mrg     {
   1459  1.1  mrg     /* LD_!bi */
   1460  1.1  mrg     case TYPE_LOAD:
   1461  1.1  mrg       if (post_update_insn_p (producer))
   1462  1.1  mrg 	return false;
   1463  1.1  mrg 
   1464  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1465  1.1  mrg       break;
   1466  1.1  mrg 
   1467  1.1  mrg     case TYPE_MUL:
   1468  1.1  mrg     case TYPE_MAC:
   1469  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1470  1.1  mrg       break;
   1471  1.1  mrg 
   1472  1.1  mrg     default:
   1473  1.1  mrg       gcc_unreachable ();
   1474  1.1  mrg     }
   1475  1.1  mrg 
   1476  1.1  mrg     return n9_2r1w_consumed_by_ex_dep_p (consumer, def_reg);
   1477  1.1  mrg }
   1478  1.1  mrg 
   1479  1.1  mrg /* Check dependencies from MM to EX.  */
   1480  1.1  mrg bool
   1481  1.1  mrg nds32_n9_3r2w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1482  1.1  mrg {
   1483  1.1  mrg   rtx def_reg;
   1484  1.1  mrg 
   1485  1.1  mrg   switch (get_attr_type (producer))
   1486  1.1  mrg     {
   1487  1.1  mrg     case TYPE_LOAD:
   1488  1.1  mrg     case TYPE_MUL:
   1489  1.1  mrg     case TYPE_MAC:
   1490  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1491  1.1  mrg       break;
   1492  1.1  mrg 
   1493  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
   1494  1.1  mrg       results, the quotient and the remainder.  We have to handle them
   1495  1.1  mrg       individually.  */
   1496  1.1  mrg     case TYPE_DIV:
   1497  1.1  mrg       if (divmod_p (producer))
   1498  1.1  mrg 	{
   1499  1.1  mrg 	  rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
   1500  1.1  mrg 	  rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
   1501  1.1  mrg 
   1502  1.1  mrg 	  return (n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg1)
   1503  1.1  mrg 		  || n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg2));
   1504  1.1  mrg 	}
   1505  1.1  mrg 
   1506  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1507  1.1  mrg       break;
   1508  1.1  mrg 
   1509  1.1  mrg     default:
   1510  1.1  mrg       gcc_unreachable ();
   1511  1.1  mrg     }
   1512  1.1  mrg 
   1513  1.1  mrg     return n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg);
   1514  1.1  mrg }
   1515  1.1  mrg 
   1516  1.1  mrg /* Check dependencies from LMW(N, N) to EX.  */
   1517  1.1  mrg bool
   1518  1.1  mrg nds32_n9_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1519  1.1  mrg {
   1520  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1521  1.1  mrg 
   1522  1.1  mrg   if (nds32_register_ports_config == REG_PORT_2R1W)
   1523  1.1  mrg     {
   1524  1.1  mrg       /* The base-update micro operation occupies the last cycle.  */
   1525  1.1  mrg       if (post_update_insn_p (producer))
   1526  1.1  mrg 	return false;
   1527  1.1  mrg 
   1528  1.1  mrg       /* When the base register is in the list of a load multiple insn and the
   1529  1.1  mrg 	 access order of the base register is not the last one, we need an
   1530  1.1  mrg 	 additional micro operation to commit the load result to the base
   1531  1.1  mrg 	 register -- we can treat the base register as the last defined
   1532  1.1  mrg 	 register.  */
   1533  1.1  mrg       size_t i;
   1534  1.1  mrg       size_t n_elems = parallel_elements (producer);
   1535  1.1  mrg       rtx base_reg = extract_base_reg (producer);
   1536  1.1  mrg 
   1537  1.1  mrg       for (i = 0; i < n_elems; ++i)
   1538  1.1  mrg 	{
   1539  1.1  mrg 	  rtx load_rtx = extract_nth_access_rtx (producer, i);
   1540  1.1  mrg 	  rtx list_element = SET_DEST (load_rtx);
   1541  1.1  mrg 
   1542  1.1  mrg 	  if (rtx_equal_p (base_reg, list_element) && i != n_elems - 1)
   1543  1.1  mrg 	    {
   1544  1.1  mrg 	      last_def_reg = base_reg;
   1545  1.1  mrg 	      break;
   1546  1.1  mrg 	    }
   1547  1.1  mrg 	}
   1548  1.1  mrg 
   1549  1.1  mrg       return n9_2r1w_consumed_by_ex_dep_p (consumer, last_def_reg);
   1550  1.1  mrg     }
   1551  1.1  mrg   else
   1552  1.1  mrg     return n9_3r2w_consumed_by_ex_dep_p (consumer, last_def_reg);
   1553  1.1  mrg }
   1554  1.1  mrg 
   1555  1.1  mrg /* Guard functions for N10 cores.  */
   1556  1.1  mrg 
   1557  1.1  mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN).  */
   1558  1.1  mrg bool
   1559  1.1  mrg nds32_n10_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1560  1.1  mrg {
   1561  1.1  mrg   gcc_assert (get_attr_type (producer) == TYPE_FLOAD
   1562  1.1  mrg 	      || get_attr_type (producer) == TYPE_FSTORE);
   1563  1.1  mrg   gcc_assert (get_attr_type (consumer) == TYPE_FLOAD
   1564  1.1  mrg 	      || get_attr_type (consumer) == TYPE_FSTORE);
   1565  1.1  mrg 
   1566  1.1  mrg   if (!post_update_insn_p (producer))
   1567  1.1  mrg     return false;
   1568  1.1  mrg 
   1569  1.1  mrg   return reg_overlap_p (extract_base_reg (producer),
   1570  1.1  mrg 			extract_mem_rtx (consumer));
   1571  1.1  mrg }
   1572  1.1  mrg 
   1573  1.1  mrg /* Check dependencies from MM to EX.  */
   1574  1.1  mrg bool
   1575  1.1  mrg nds32_n10_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1576  1.1  mrg {
   1577  1.1  mrg   rtx def_reg;
   1578  1.1  mrg 
   1579  1.1  mrg   switch (get_attr_type (producer))
   1580  1.1  mrg     {
   1581  1.1  mrg     case TYPE_LOAD:
   1582  1.1  mrg     case TYPE_MUL:
   1583  1.1  mrg     case TYPE_MAC:
   1584  1.1  mrg     case TYPE_DALU64:
   1585  1.1  mrg     case TYPE_DMUL:
   1586  1.1  mrg     case TYPE_DMAC:
   1587  1.1  mrg     case TYPE_DALUROUND:
   1588  1.1  mrg     case TYPE_DBPICK:
   1589  1.1  mrg     case TYPE_DWEXT:
   1590  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1591  1.1  mrg       break;
   1592  1.1  mrg 
   1593  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
   1594  1.1  mrg       results, the quotient and the remainder.  We have to handle them
   1595  1.1  mrg       individually.  */
   1596  1.1  mrg     case TYPE_DIV:
   1597  1.1  mrg       if (divmod_p (producer))
   1598  1.1  mrg 	{
   1599  1.1  mrg 	  rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
   1600  1.1  mrg 	  rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
   1601  1.1  mrg 
   1602  1.1  mrg 	  return (n10_consumed_by_ex_dep_p (consumer, def_reg1)
   1603  1.1  mrg 		  || n10_consumed_by_ex_dep_p (consumer, def_reg2));
   1604  1.1  mrg 	}
   1605  1.1  mrg 
   1606  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1607  1.1  mrg       break;
   1608  1.1  mrg 
   1609  1.1  mrg     default:
   1610  1.1  mrg       gcc_unreachable ();
   1611  1.1  mrg     }
   1612  1.1  mrg 
   1613  1.1  mrg     return n10_consumed_by_ex_dep_p (consumer, def_reg);
   1614  1.1  mrg }
   1615  1.1  mrg 
   1616  1.1  mrg /* Check dependencies from LMW(N, N) to EX.  */
   1617  1.1  mrg bool
   1618  1.1  mrg nds32_n10_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1619  1.1  mrg {
   1620  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1621  1.1  mrg 
   1622  1.1  mrg   return n10_consumed_by_ex_dep_p (consumer, last_def_reg);
   1623  1.1  mrg }
   1624  1.1  mrg 
   1625  1.1  mrg /* Guard functions for Graywolf cores.  */
   1626  1.1  mrg 
   1627  1.1  mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN).  */
   1628  1.1  mrg bool
   1629  1.1  mrg nds32_gw_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1630  1.1  mrg {
   1631  1.1  mrg   return nds32_n10_ex_to_ex_p (producer, consumer);
   1632  1.1  mrg }
   1633  1.1  mrg 
   1634  1.1  mrg /* Check dependencies from MM to EX.  */
   1635  1.1  mrg bool
   1636  1.1  mrg nds32_gw_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1637  1.1  mrg {
   1638  1.1  mrg   rtx def_reg;
   1639  1.1  mrg 
   1640  1.1  mrg   switch (get_attr_type (producer))
   1641  1.1  mrg     {
   1642  1.1  mrg     case TYPE_LOAD:
   1643  1.1  mrg     case TYPE_MUL:
   1644  1.1  mrg     case TYPE_MAC:
   1645  1.1  mrg     case TYPE_DALU64:
   1646  1.1  mrg     case TYPE_DMUL:
   1647  1.1  mrg     case TYPE_DMAC:
   1648  1.1  mrg     case TYPE_DALUROUND:
   1649  1.1  mrg     case TYPE_DBPICK:
   1650  1.1  mrg     case TYPE_DWEXT:
   1651  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1652  1.1  mrg       break;
   1653  1.1  mrg 
   1654  1.1  mrg    /* Some special instructions, divmodsi4 and udivmodsi4, produce two
   1655  1.1  mrg       results, the quotient and the remainder.  We have to handle them
   1656  1.1  mrg       individually.  */
   1657  1.1  mrg     case TYPE_DIV:
   1658  1.1  mrg       if (divmod_p (producer))
   1659  1.1  mrg 	{
   1660  1.1  mrg 	  rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
   1661  1.1  mrg 	  rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
   1662  1.1  mrg 
   1663  1.1  mrg 	  return (gw_consumed_by_ex_dep_p (consumer, def_reg1)
   1664  1.1  mrg 		  || gw_consumed_by_ex_dep_p (consumer, def_reg2));
   1665  1.1  mrg 	}
   1666  1.1  mrg 
   1667  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1668  1.1  mrg       break;
   1669  1.1  mrg 
   1670  1.1  mrg     default:
   1671  1.1  mrg       gcc_unreachable ();
   1672  1.1  mrg     }
   1673  1.1  mrg 
   1674  1.1  mrg     return gw_consumed_by_ex_dep_p (consumer, def_reg);
   1675  1.1  mrg }
   1676  1.1  mrg 
   1677  1.1  mrg /* Check dependencies from LMW(N, N) to EX.  */
   1678  1.1  mrg bool
   1679  1.1  mrg nds32_gw_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer)
   1680  1.1  mrg {
   1681  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1682  1.1  mrg 
   1683  1.1  mrg   return gw_consumed_by_ex_dep_p (consumer, last_def_reg);
   1684  1.1  mrg }
   1685  1.1  mrg 
   1686  1.1  mrg /* Guard functions for N12/N13 cores.  */
   1687  1.1  mrg 
   1688  1.1  mrg /* Check dependencies from E2 to E1.  */
   1689  1.1  mrg bool
   1690  1.1  mrg nds32_n13_e2_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
   1691  1.1  mrg {
   1692  1.1  mrg   rtx def_reg;
   1693  1.1  mrg 
   1694  1.1  mrg   switch (get_attr_type (producer))
   1695  1.1  mrg     {
   1696  1.1  mrg     /* Only post-update load/store instructions are considered.  These
   1697  1.1  mrg        instructions produces address output at E2.  */
   1698  1.1  mrg     case TYPE_LOAD:
   1699  1.1  mrg     case TYPE_STORE:
   1700  1.1  mrg     case TYPE_LOAD_MULTIPLE:
   1701  1.1  mrg     case TYPE_STORE_MULTIPLE:
   1702  1.1  mrg       if (!post_update_insn_p (producer))
   1703  1.1  mrg 	return false;
   1704  1.1  mrg 
   1705  1.1  mrg       def_reg = extract_base_reg (producer);
   1706  1.1  mrg       break;
   1707  1.1  mrg 
   1708  1.1  mrg     case TYPE_ALU:
   1709  1.1  mrg     case TYPE_ALU_SHIFT:
   1710  1.1  mrg     case TYPE_PBSAD:
   1711  1.1  mrg     case TYPE_PBSADA:
   1712  1.1  mrg     case TYPE_MUL:
   1713  1.1  mrg     case TYPE_MAC:
   1714  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1715  1.1  mrg       break;
   1716  1.1  mrg 
   1717  1.1  mrg     case TYPE_BRANCH:
   1718  1.1  mrg       return true;
   1719  1.1  mrg 
   1720  1.1  mrg     case TYPE_DIV:
   1721  1.1  mrg       /* Some special instructions, divmodsi4 and udivmodsi4, produce two
   1722  1.1  mrg 	 results, the quotient and the remainder.  We have to handle them
   1723  1.1  mrg 	 individually.  */
   1724  1.1  mrg       if (divmod_p (producer))
   1725  1.1  mrg 	{
   1726  1.1  mrg 	  rtx def_reg1 = SET_DEST (parallel_element (producer, 0));
   1727  1.1  mrg 	  rtx def_reg2 = SET_DEST (parallel_element (producer, 1));
   1728  1.1  mrg 
   1729  1.1  mrg 	  return (n13_consumed_by_e1_dep_p (consumer, def_reg1)
   1730  1.1  mrg 		  || n13_consumed_by_e1_dep_p (consumer, def_reg2));
   1731  1.1  mrg 	}
   1732  1.1  mrg 
   1733  1.1  mrg       def_reg = SET_DEST (PATTERN (producer));
   1734  1.1  mrg       break;
   1735  1.1  mrg 
   1736  1.1  mrg     default:
   1737  1.1  mrg       gcc_unreachable ();
   1738  1.1  mrg     }
   1739  1.1  mrg 
   1740  1.1  mrg   return n13_consumed_by_e1_dep_p (consumer, def_reg);
   1741  1.1  mrg }
   1742  1.1  mrg 
   1743  1.1  mrg /* Check dependencies from Load-Store Unit (E3) to E1.  */
   1744  1.1  mrg bool
   1745  1.1  mrg nds32_n13_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
   1746  1.1  mrg {
   1747  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1748  1.1  mrg 
   1749  1.1  mrg   gcc_assert (get_attr_type (producer) == TYPE_LOAD);
   1750  1.1  mrg   gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
   1751  1.1  mrg 
   1752  1.1  mrg   return n13_consumed_by_e1_dep_p (consumer, def_reg);
   1753  1.1  mrg }
   1754  1.1  mrg 
   1755  1.1  mrg /* Check dependencies from Load-Store Unit (E3) to E2.  */
   1756  1.1  mrg bool
   1757  1.1  mrg nds32_n13_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer)
   1758  1.1  mrg {
   1759  1.1  mrg   rtx def_reg = SET_DEST (PATTERN (producer));
   1760  1.1  mrg 
   1761  1.1  mrg   gcc_assert (get_attr_type (producer) == TYPE_LOAD);
   1762  1.1  mrg   gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
   1763  1.1  mrg 
   1764  1.1  mrg   return n13_consumed_by_e2_dep_p (consumer, def_reg);
   1765  1.1  mrg }
   1766  1.1  mrg 
   1767  1.1  mrg /* Check dependencies from LMW(N, N) to E1.  */
   1768  1.1  mrg bool
   1769  1.1  mrg nds32_n13_last_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
   1770  1.1  mrg {
   1771  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1772  1.1  mrg 
   1773  1.1  mrg   return n13_consumed_by_e1_dep_p (consumer, last_def_reg);
   1774  1.1  mrg }
   1775  1.1  mrg 
   1776  1.1  mrg /* Check dependencies from LMW(N, N) to E2.  */
   1777  1.1  mrg bool
   1778  1.1  mrg nds32_n13_last_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer)
   1779  1.1  mrg {
   1780  1.1  mrg   rtx last_def_reg = extract_nth_access_reg (producer, -1);
   1781  1.1  mrg 
   1782  1.1  mrg   return n13_consumed_by_e2_dep_p (consumer, last_def_reg);
   1783  1.1  mrg }
   1784  1.1  mrg 
   1785  1.1  mrg /* Check dependencies from LMW(N, N-1) to E2.  */
   1786  1.1  mrg bool
   1787  1.1  mrg nds32_n13_last_two_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer)
   1788  1.1  mrg {
   1789  1.1  mrg   rtx last_two_def_reg = extract_nth_access_reg (producer, -2);
   1790  1.1  mrg 
   1791  1.1  mrg   if (last_two_def_reg == NULL_RTX)
   1792  1.1  mrg     return false;
   1793  1.1  mrg 
   1794  1.1  mrg   return n13_consumed_by_e1_dep_p (consumer, last_two_def_reg);
   1795  1.1  mrg }
   1796  1.1  mrg /* ------------------------------------------------------------------------ */
   1797