Home | History | Annotate | Line # | Download | only in nds32
      1  1.1  mrg /* Intrinsic functions of Andes NDS32 cpu for GNU compiler
      2  1.1  mrg    Copyright (C) 2012-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andes Technology Corporation.
      4  1.1  mrg 
      5  1.1  mrg    This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      8  1.1  mrg    under the terms of the GNU General Public License as published
      9  1.1  mrg    by the Free Software Foundation; either version 3, or (at your
     10  1.1  mrg    option) any later version.
     11  1.1  mrg 
     12  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     13  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15  1.1  mrg    License for more details.
     16  1.1  mrg 
     17  1.1  mrg    You should have received a copy of the GNU General Public License
     18  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg /* ------------------------------------------------------------------------ */
     22  1.1  mrg 
     23  1.1  mrg #define IN_TARGET_CODE 1
     24  1.1  mrg 
     25  1.1  mrg #include "config.h"
     26  1.1  mrg #include "system.h"
     27  1.1  mrg #include "coretypes.h"
     28  1.1  mrg #include "backend.h"
     29  1.1  mrg #include "target.h"
     30  1.1  mrg #include "rtl.h"
     31  1.1  mrg #include "memmodel.h"
     32  1.1  mrg #include "emit-rtl.h"
     33  1.1  mrg #include "tree.h"
     34  1.1  mrg #include "memmodel.h"
     35  1.1  mrg #include "optabs.h"		/* For GEN_FCN.  */
     36  1.1  mrg #include "diagnostic-core.h"
     37  1.1  mrg #include "stor-layout.h"
     38  1.1  mrg #include "expr.h"
     39  1.1  mrg #include "langhooks.h"		/* For add_builtin_function().  */
     40  1.1  mrg #include "recog.h"
     41  1.1  mrg #include "explow.h"
     42  1.1  mrg 
     43  1.1  mrg /* ------------------------------------------------------------------------ */
     44  1.1  mrg 
     45  1.1  mrg /* Read the requested argument from the EXP given by INDEX.
     46  1.1  mrg    Return the value as an rtx.  */
     47  1.1  mrg static rtx
     48  1.1  mrg nds32_read_argument (tree exp, unsigned int index)
     49  1.1  mrg {
     50  1.1  mrg   return expand_normal (CALL_EXPR_ARG (exp, index));
     51  1.1  mrg }
     52  1.1  mrg 
     53  1.1  mrg /* Return a legitimate rtx for instruction ICODE's return value.  Use TARGET
     54  1.1  mrg    if it's not null, has the right mode, and satisfies operand 0's
     55  1.1  mrg    predicate.  */
     56  1.1  mrg static rtx
     57  1.1  mrg nds32_legitimize_target (enum insn_code icode, rtx target)
     58  1.1  mrg {
     59  1.1  mrg   enum machine_mode mode = insn_data[icode].operand[0].mode;
     60  1.1  mrg 
     61  1.1  mrg   if (! target
     62  1.1  mrg       || GET_MODE (target) != mode
     63  1.1  mrg       || ! (*insn_data[icode].operand[0].predicate) (target, mode))
     64  1.1  mrg     return gen_reg_rtx (mode);
     65  1.1  mrg   else
     66  1.1  mrg     return target;
     67  1.1  mrg }
     68  1.1  mrg 
     69  1.1  mrg /* Given that ARG is being passed as operand OPNUM to instruction ICODE,
     70  1.1  mrg    check whether ARG satisfies the operand's constraints.  If it doesn't,
     71  1.1  mrg    copy ARG to a temporary register and return that.  Otherwise return ARG
     72  1.1  mrg    itself.  */
     73  1.1  mrg static rtx
     74  1.1  mrg nds32_legitimize_argument (enum insn_code icode, int opnum, rtx arg)
     75  1.1  mrg {
     76  1.1  mrg   enum machine_mode mode = insn_data[icode].operand[opnum].mode;
     77  1.1  mrg 
     78  1.1  mrg   if ((*insn_data[icode].operand[opnum].predicate) (arg, mode))
     79  1.1  mrg     return arg;
     80  1.1  mrg   else if (VECTOR_MODE_P (mode) && CONST_INT_P (arg))
     81  1.1  mrg     {
     82  1.1  mrg       /* Handle CONST_INT covert to CONST_VECTOR.  */
     83  1.1  mrg       int nunits = GET_MODE_NUNITS (mode);
     84  1.1  mrg       int i, shift = 0;
     85  1.1  mrg       rtvec v = rtvec_alloc (nunits);
     86  1.1  mrg       int val = INTVAL (arg);
     87  1.1  mrg       enum machine_mode val_mode = (mode == V4QImode) ? QImode : HImode;
     88  1.1  mrg       int shift_acc = (val_mode == QImode) ? 8 : 16;
     89  1.1  mrg       int mask = (val_mode == QImode) ? 0xff : 0xffff;
     90  1.1  mrg       int tmp_val = val;
     91  1.1  mrg 
     92  1.1  mrg       if (TARGET_BIG_ENDIAN)
     93  1.1  mrg 	for (i = 0; i < nunits; i++)
     94  1.1  mrg 	  {
     95  1.1  mrg 	    tmp_val = (val >> shift) & mask;
     96  1.1  mrg 	    RTVEC_ELT (v, nunits - i - 1) = gen_int_mode (tmp_val, val_mode);
     97  1.1  mrg 	    shift += shift_acc;
     98  1.1  mrg 	  }
     99  1.1  mrg       else
    100  1.1  mrg 	for (i = 0; i < nunits; i++)
    101  1.1  mrg 	  {
    102  1.1  mrg 	    tmp_val = (val >> shift) & mask;
    103  1.1  mrg 	    RTVEC_ELT (v, i) = gen_int_mode (tmp_val, val_mode);
    104  1.1  mrg 	    shift += shift_acc;
    105  1.1  mrg 	  }
    106  1.1  mrg 
    107  1.1  mrg       return copy_to_mode_reg (mode, gen_rtx_CONST_VECTOR (mode, v));
    108  1.1  mrg     }
    109  1.1  mrg   else
    110  1.1  mrg     {
    111  1.1  mrg       rtx tmp_rtx = gen_reg_rtx (mode);
    112  1.1  mrg       convert_move (tmp_rtx, arg, false);
    113  1.1  mrg       return tmp_rtx;
    114  1.1  mrg     }
    115  1.1  mrg }
    116  1.1  mrg 
    117  1.1  mrg /* Return true if OPVAL can be used for operand OPNUM of instruction ICODE.
    118  1.1  mrg    The instruction should require a constant operand of some sort.  The
    119  1.1  mrg    function prints an error if OPVAL is not valid.  */
    120  1.1  mrg static int
    121  1.1  mrg nds32_check_constant_argument (enum insn_code icode, int opnum, rtx opval,
    122  1.1  mrg 			       const char *name)
    123  1.1  mrg {
    124  1.1  mrg   if (GET_CODE (opval) != CONST_INT)
    125  1.1  mrg     {
    126  1.1  mrg       error ("invalid argument to built-in function %s", name);
    127  1.1  mrg       return false;
    128  1.1  mrg     }
    129  1.1  mrg   if (! (*insn_data[icode].operand[opnum].predicate) (opval, VOIDmode))
    130  1.1  mrg     {
    131  1.1  mrg       error ("constant argument out of range for %s", name);
    132  1.1  mrg 
    133  1.1  mrg       return false;
    134  1.1  mrg     }
    135  1.1  mrg   return true;
    136  1.1  mrg }
    137  1.1  mrg 
    138  1.1  mrg /* Expand builtins that return target.  */
    139  1.1  mrg static rtx
    140  1.1  mrg nds32_expand_noarg_builtin (enum insn_code icode, rtx target)
    141  1.1  mrg {
    142  1.1  mrg   rtx pat;
    143  1.1  mrg 
    144  1.1  mrg   target = nds32_legitimize_target (icode, target);
    145  1.1  mrg 
    146  1.1  mrg   /* Emit and return the new instruction. */
    147  1.1  mrg   pat = GEN_FCN (icode) (target);
    148  1.1  mrg   if (! pat)
    149  1.1  mrg     return NULL_RTX;
    150  1.1  mrg 
    151  1.1  mrg   emit_insn (pat);
    152  1.1  mrg   return target;
    153  1.1  mrg }
    154  1.1  mrg 
    155  1.1  mrg /* Expand builtins that take one operand.  */
    156  1.1  mrg static rtx
    157  1.1  mrg nds32_expand_unop_builtin (enum insn_code icode, tree exp, rtx target,
    158  1.1  mrg 			   bool return_p)
    159  1.1  mrg {
    160  1.1  mrg   rtx pat;
    161  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    162  1.1  mrg   int op0_num = return_p ? 1 : 0;
    163  1.1  mrg 
    164  1.1  mrg   if (return_p)
    165  1.1  mrg     target = nds32_legitimize_target (icode, target);
    166  1.1  mrg 
    167  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    168  1.1  mrg 
    169  1.1  mrg   /* Emit and return the new instruction. */
    170  1.1  mrg   if (return_p)
    171  1.1  mrg     pat = GEN_FCN (icode) (target, op0);
    172  1.1  mrg   else
    173  1.1  mrg     pat = GEN_FCN (icode) (op0);
    174  1.1  mrg 
    175  1.1  mrg   if (! pat)
    176  1.1  mrg     return NULL_RTX;
    177  1.1  mrg 
    178  1.1  mrg   emit_insn (pat);
    179  1.1  mrg   return target;
    180  1.1  mrg }
    181  1.1  mrg 
    182  1.1  mrg /* Expand builtins that take one operands and the first is immediate.  */
    183  1.1  mrg static rtx
    184  1.1  mrg nds32_expand_unopimm_builtin (enum insn_code icode, tree exp, rtx target,
    185  1.1  mrg 			      bool return_p, const char *name)
    186  1.1  mrg {
    187  1.1  mrg   rtx pat;
    188  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    189  1.1  mrg   int op0_num = return_p ? 1 : 0;
    190  1.1  mrg 
    191  1.1  mrg   if (return_p)
    192  1.1  mrg     target = nds32_legitimize_target (icode, target);
    193  1.1  mrg 
    194  1.1  mrg   if (!nds32_check_constant_argument (icode, op0_num, op0, name))
    195  1.1  mrg     return NULL_RTX;
    196  1.1  mrg 
    197  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    198  1.1  mrg 
    199  1.1  mrg   /* Emit and return the new instruction. */
    200  1.1  mrg   if (return_p)
    201  1.1  mrg     pat = GEN_FCN (icode) (target, op0);
    202  1.1  mrg   else
    203  1.1  mrg     pat = GEN_FCN (icode) (op0);
    204  1.1  mrg 
    205  1.1  mrg   if (! pat)
    206  1.1  mrg     return NULL_RTX;
    207  1.1  mrg 
    208  1.1  mrg   emit_insn (pat);
    209  1.1  mrg   return target;
    210  1.1  mrg }
    211  1.1  mrg 
    212  1.1  mrg /* Expand builtins that take two operands.  */
    213  1.1  mrg static rtx
    214  1.1  mrg nds32_expand_binop_builtin (enum insn_code icode, tree exp, rtx target,
    215  1.1  mrg 			    bool return_p)
    216  1.1  mrg {
    217  1.1  mrg   rtx pat;
    218  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    219  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    220  1.1  mrg   int op0_num = return_p ? 1 : 0;
    221  1.1  mrg   int op1_num = return_p ? 2 : 1;
    222  1.1  mrg 
    223  1.1  mrg   if (return_p)
    224  1.1  mrg     target = nds32_legitimize_target (icode, target);
    225  1.1  mrg 
    226  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    227  1.1  mrg   op1 = nds32_legitimize_argument (icode, op1_num, op1);
    228  1.1  mrg 
    229  1.1  mrg   /* Emit and return the new instruction. */
    230  1.1  mrg   if (return_p)
    231  1.1  mrg     pat = GEN_FCN (icode) (target, op0, op1);
    232  1.1  mrg   else
    233  1.1  mrg     pat = GEN_FCN (icode) (op0, op1);
    234  1.1  mrg 
    235  1.1  mrg   if (! pat)
    236  1.1  mrg     return NULL_RTX;
    237  1.1  mrg 
    238  1.1  mrg   emit_insn (pat);
    239  1.1  mrg   return target;
    240  1.1  mrg }
    241  1.1  mrg 
    242  1.1  mrg /* Expand builtins that take two operands and the second is immediate.  */
    243  1.1  mrg static rtx
    244  1.1  mrg nds32_expand_binopimm_builtin (enum insn_code icode, tree exp, rtx target,
    245  1.1  mrg 			       bool return_p, const char *name)
    246  1.1  mrg {
    247  1.1  mrg   rtx pat;
    248  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    249  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    250  1.1  mrg   int op0_num = return_p ? 1 : 0;
    251  1.1  mrg   int op1_num = return_p ? 2 : 1;
    252  1.1  mrg 
    253  1.1  mrg   if (return_p)
    254  1.1  mrg     target = nds32_legitimize_target (icode, target);
    255  1.1  mrg 
    256  1.1  mrg   if (!nds32_check_constant_argument (icode, op1_num, op1, name))
    257  1.1  mrg     return NULL_RTX;
    258  1.1  mrg 
    259  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    260  1.1  mrg   op1 = nds32_legitimize_argument (icode, op1_num, op1);
    261  1.1  mrg 
    262  1.1  mrg   /* Emit and return the new instruction. */
    263  1.1  mrg   if (return_p)
    264  1.1  mrg     pat = GEN_FCN (icode) (target, op0, op1);
    265  1.1  mrg   else
    266  1.1  mrg     pat = GEN_FCN (icode) (op0, op1);
    267  1.1  mrg 
    268  1.1  mrg   if (! pat)
    269  1.1  mrg     return NULL_RTX;
    270  1.1  mrg 
    271  1.1  mrg   emit_insn (pat);
    272  1.1  mrg   return target;
    273  1.1  mrg }
    274  1.1  mrg 
    275  1.1  mrg /* Expand builtins that take three operands.  */
    276  1.1  mrg static rtx
    277  1.1  mrg nds32_expand_triop_builtin (enum insn_code icode, tree exp, rtx target,
    278  1.1  mrg 			    bool return_p)
    279  1.1  mrg {
    280  1.1  mrg   rtx pat;
    281  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    282  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    283  1.1  mrg   rtx op2 = nds32_read_argument (exp, 2);
    284  1.1  mrg   int op0_num = return_p ? 1 : 0;
    285  1.1  mrg   int op1_num = return_p ? 2 : 1;
    286  1.1  mrg   int op2_num = return_p ? 3 : 2;
    287  1.1  mrg 
    288  1.1  mrg   if (return_p)
    289  1.1  mrg     target = nds32_legitimize_target (icode, target);
    290  1.1  mrg 
    291  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    292  1.1  mrg   op1 = nds32_legitimize_argument (icode, op1_num, op1);
    293  1.1  mrg   op2 = nds32_legitimize_argument (icode, op2_num, op2);
    294  1.1  mrg 
    295  1.1  mrg   /* Emit and return the new instruction. */
    296  1.1  mrg   if (return_p)
    297  1.1  mrg     pat = GEN_FCN (icode) (target, op0, op1, op2);
    298  1.1  mrg   else
    299  1.1  mrg     pat = GEN_FCN (icode) (op0, op1, op2);
    300  1.1  mrg 
    301  1.1  mrg   if (! pat)
    302  1.1  mrg     return NULL_RTX;
    303  1.1  mrg 
    304  1.1  mrg   emit_insn (pat);
    305  1.1  mrg   return target;
    306  1.1  mrg }
    307  1.1  mrg 
    308  1.1  mrg /* Expand builtins that take three operands and the third is immediate.  */
    309  1.1  mrg static rtx
    310  1.1  mrg nds32_expand_triopimm_builtin (enum insn_code icode, tree exp, rtx target,
    311  1.1  mrg 			       bool return_p, const char *name)
    312  1.1  mrg {
    313  1.1  mrg   rtx pat;
    314  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    315  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    316  1.1  mrg   rtx op2 = nds32_read_argument (exp, 2);
    317  1.1  mrg   int op0_num = return_p ? 1 : 0;
    318  1.1  mrg   int op1_num = return_p ? 2 : 1;
    319  1.1  mrg   int op2_num = return_p ? 3 : 2;
    320  1.1  mrg 
    321  1.1  mrg   if (return_p)
    322  1.1  mrg     target = nds32_legitimize_target (icode, target);
    323  1.1  mrg 
    324  1.1  mrg   if (!nds32_check_constant_argument (icode, op2_num, op2, name))
    325  1.1  mrg     return NULL_RTX;
    326  1.1  mrg 
    327  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    328  1.1  mrg   op1 = nds32_legitimize_argument (icode, op1_num, op1);
    329  1.1  mrg   op2 = nds32_legitimize_argument (icode, op2_num, op2);
    330  1.1  mrg 
    331  1.1  mrg   /* Emit and return the new instruction. */
    332  1.1  mrg   if (return_p)
    333  1.1  mrg     pat = GEN_FCN (icode) (target, op0, op1, op2);
    334  1.1  mrg   else
    335  1.1  mrg     pat = GEN_FCN (icode) (op0, op1, op2);
    336  1.1  mrg 
    337  1.1  mrg   if (! pat)
    338  1.1  mrg     return NULL_RTX;
    339  1.1  mrg 
    340  1.1  mrg   emit_insn (pat);
    341  1.1  mrg   return target;
    342  1.1  mrg }
    343  1.1  mrg 
    344  1.1  mrg /* Expand builtins for load.  */
    345  1.1  mrg static rtx
    346  1.1  mrg nds32_expand_builtin_load (enum insn_code icode, tree exp, rtx target)
    347  1.1  mrg {
    348  1.1  mrg   /* Load address format is [$ra + $rb],
    349  1.1  mrg      but input arguments not enough,
    350  1.1  mrg      so we need another temp register as $rb.
    351  1.1  mrg      Generating assembly code:
    352  1.1  mrg        movi $temp, 0
    353  1.1  mrg        llw  $rt, [$ra + $temp] */
    354  1.1  mrg   rtx pat;
    355  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    356  1.1  mrg   rtx addr_helper = gen_reg_rtx (insn_data[icode].operand[1].mode);
    357  1.1  mrg 
    358  1.1  mrg   target = nds32_legitimize_target (icode, target);
    359  1.1  mrg   op0 = nds32_legitimize_argument (icode, 1, op0);
    360  1.1  mrg 
    361  1.1  mrg   /* Emit and return the new instruction. */
    362  1.1  mrg   pat = GEN_FCN (icode) (target, op0, addr_helper);
    363  1.1  mrg   if (!pat)
    364  1.1  mrg     return NULL_RTX;
    365  1.1  mrg 
    366  1.1  mrg   emit_move_insn (addr_helper, GEN_INT (0));
    367  1.1  mrg   emit_insn (pat);
    368  1.1  mrg   return target;
    369  1.1  mrg }
    370  1.1  mrg 
    371  1.1  mrg /* Expand builtins for store.  */
    372  1.1  mrg static rtx
    373  1.1  mrg nds32_expand_builtin_store (enum insn_code icode, tree exp, rtx target)
    374  1.1  mrg {
    375  1.1  mrg   /* Store address format is [$ra + $rb],
    376  1.1  mrg      but input arguments not enough,
    377  1.1  mrg      so we need another temp register as $rb.
    378  1.1  mrg      Generating assembly code:
    379  1.1  mrg        movi $temp, 0
    380  1.1  mrg        store  $rt, [$ra + $temp] */
    381  1.1  mrg   rtx pat;
    382  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    383  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    384  1.1  mrg   rtx addr_helper = gen_reg_rtx (insn_data[icode].operand[1].mode);
    385  1.1  mrg 
    386  1.1  mrg   op0 = nds32_legitimize_argument (icode, 0, op0);
    387  1.1  mrg   op1 = nds32_legitimize_argument (icode, 2, op1);
    388  1.1  mrg 
    389  1.1  mrg   /* Emit and return the new instruction. */
    390  1.1  mrg   pat = GEN_FCN (icode) (op0, addr_helper, op1);
    391  1.1  mrg   if (! pat)
    392  1.1  mrg     return NULL_RTX;
    393  1.1  mrg 
    394  1.1  mrg   emit_move_insn (addr_helper, GEN_INT (0));
    395  1.1  mrg   emit_insn (pat);
    396  1.1  mrg   return target;
    397  1.1  mrg }
    398  1.1  mrg 
    399  1.1  mrg /* Expand cctl builtins.  */
    400  1.1  mrg static rtx
    401  1.1  mrg nds32_expand_cctl_builtin (enum insn_code icode, tree exp, rtx target,
    402  1.1  mrg 			   bool return_p, const char *name)
    403  1.1  mrg {
    404  1.1  mrg   rtx pat;
    405  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    406  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    407  1.1  mrg   int op0_num = return_p ? 1 : 0;
    408  1.1  mrg   int op1_num = return_p ? 2 : 1;
    409  1.1  mrg 
    410  1.1  mrg   if (return_p)
    411  1.1  mrg     target = nds32_legitimize_target (icode, target);
    412  1.1  mrg 
    413  1.1  mrg   if (!nds32_check_constant_argument (icode, op0_num, op0, name))
    414  1.1  mrg     return NULL_RTX;
    415  1.1  mrg 
    416  1.1  mrg   op0 = nds32_legitimize_argument (icode, op0_num, op0);
    417  1.1  mrg   op1 = nds32_legitimize_argument (icode, op1_num, op1);
    418  1.1  mrg 
    419  1.1  mrg   /* Emit and return the new instruction. */
    420  1.1  mrg   if (icode == CODE_FOR_cctl_idx_write)
    421  1.1  mrg     {
    422  1.1  mrg       /* cctl_idx_write is three argument,
    423  1.1  mrg 	 so create operand2 for cctl_idx_write pattern.  */
    424  1.1  mrg       rtx op2 = nds32_read_argument (exp, 2);
    425  1.1  mrg       op2 = nds32_legitimize_argument (icode, 2, op2);
    426  1.1  mrg       pat = GEN_FCN (icode) (op0, op1, op2);
    427  1.1  mrg     }
    428  1.1  mrg   else if (return_p)
    429  1.1  mrg     pat = GEN_FCN (icode) (target, op0, op1);
    430  1.1  mrg   else
    431  1.1  mrg     pat = GEN_FCN (icode) (op0, op1);
    432  1.1  mrg 
    433  1.1  mrg   if (! pat)
    434  1.1  mrg     return NULL_RTX;
    435  1.1  mrg 
    436  1.1  mrg   emit_insn (pat);
    437  1.1  mrg   return target;
    438  1.1  mrg }
    439  1.1  mrg 
    440  1.1  mrg /* Expand scw builtins.  */
    441  1.1  mrg static rtx
    442  1.1  mrg nds32_expand_scw_builtin (enum insn_code icode, tree exp, rtx target)
    443  1.1  mrg {
    444  1.1  mrg   /* SCW address format is [$ra + $rb], but input arguments not enough,
    445  1.1  mrg      so we need another temp register as $rb.
    446  1.1  mrg      Generating assembly code:
    447  1.1  mrg 	movi $temp, 0
    448  1.1  mrg 	scw  $rt, [$ra + $temp] */
    449  1.1  mrg   rtx pat;
    450  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    451  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    452  1.1  mrg   rtx addr_helper = gen_reg_rtx (insn_data[icode].operand[1].mode);
    453  1.1  mrg 
    454  1.1  mrg   target = nds32_legitimize_target (icode, target);
    455  1.1  mrg   op0 = nds32_legitimize_argument (icode, 1, op0);
    456  1.1  mrg   op1 = nds32_legitimize_argument (icode, 2, op1);
    457  1.1  mrg 
    458  1.1  mrg   /* Emit and return the new instruction. */
    459  1.1  mrg   pat = GEN_FCN (icode) (target, op0, addr_helper, target);
    460  1.1  mrg 
    461  1.1  mrg   if (!pat)
    462  1.1  mrg     return NULL_RTX;
    463  1.1  mrg 
    464  1.1  mrg   emit_move_insn (addr_helper, GEN_INT (0));
    465  1.1  mrg   emit_move_insn (target, op1);
    466  1.1  mrg   emit_insn (pat);
    467  1.1  mrg   return target;
    468  1.1  mrg }
    469  1.1  mrg 
    470  1.1  mrg /* Expand set int priority builtins. */
    471  1.1  mrg static rtx
    472  1.1  mrg nds32_expand_priority_builtin (enum insn_code icode, tree exp, rtx target,
    473  1.1  mrg 			       const char *name)
    474  1.1  mrg {
    475  1.1  mrg   rtx pat;
    476  1.1  mrg   rtx op0 = nds32_read_argument (exp, 0);
    477  1.1  mrg   rtx op1 = nds32_read_argument (exp, 1);
    478  1.1  mrg 
    479  1.1  mrg   /* set_int_priority intrinsic function that two arguments are immediate,
    480  1.1  mrg      so check whether auguments are immedite.  */
    481  1.1  mrg 
    482  1.1  mrg   if (!nds32_check_constant_argument (icode, 0, op0, name))
    483  1.1  mrg     return NULL_RTX;
    484  1.1  mrg 
    485  1.1  mrg   if (!nds32_check_constant_argument (icode, 1, op1, name))
    486  1.1  mrg     return NULL_RTX;
    487  1.1  mrg 
    488  1.1  mrg   op0 = nds32_legitimize_argument (icode, 0, op0);
    489  1.1  mrg   op1 = nds32_legitimize_argument (icode, 1, op1);
    490  1.1  mrg 
    491  1.1  mrg   /* Emit and return the new instruction. */
    492  1.1  mrg   pat = GEN_FCN (icode) (op0, op1);
    493  1.1  mrg 
    494  1.1  mrg   if (! pat)
    495  1.1  mrg     return NULL_RTX;
    496  1.1  mrg 
    497  1.1  mrg   emit_insn (pat);
    498  1.1  mrg   return target;
    499  1.1  mrg }
    500  1.1  mrg 
    501  1.1  mrg struct builtin_description
    502  1.1  mrg {
    503  1.1  mrg   const enum insn_code icode;
    504  1.1  mrg   const char *name;
    505  1.1  mrg   enum nds32_builtins code;
    506  1.1  mrg   bool return_p;
    507  1.1  mrg };
    508  1.1  mrg 
    509  1.1  mrg #define NDS32_BUILTIN(code, string, builtin) \
    510  1.1  mrg   { CODE_FOR_##code, "__nds32__" string, \
    511  1.1  mrg     NDS32_BUILTIN_##builtin, true },
    512  1.1  mrg 
    513  1.1  mrg #define NDS32_NO_TARGET_BUILTIN(code, string, builtin) \
    514  1.1  mrg   { CODE_FOR_##code, "__nds32__" string, \
    515  1.1  mrg     NDS32_BUILTIN_##builtin, false },
    516  1.1  mrg 
    517  1.1  mrg /* Intrinsics that no argument, and that return value.  */
    518  1.1  mrg static struct builtin_description bdesc_noarg[] =
    519  1.1  mrg {
    520  1.1  mrg   NDS32_BUILTIN(unspec_fmfcfg, "fmfcfg", FMFCFG)
    521  1.1  mrg   NDS32_BUILTIN(unspec_fmfcsr, "fmfcsr", FMFCSR)
    522  1.1  mrg   NDS32_BUILTIN(unspec_volatile_rdov, "rdov", RDOV)
    523  1.1  mrg   NDS32_BUILTIN(unspec_get_current_sp, "get_current_sp", GET_CURRENT_SP)
    524  1.1  mrg   NDS32_BUILTIN(unspec_return_address, "return_address", RETURN_ADDRESS)
    525  1.1  mrg   NDS32_BUILTIN(unspec_get_all_pending_int, "get_all_pending_int",
    526  1.1  mrg 		GET_ALL_PENDING_INT)
    527  1.1  mrg   NDS32_BUILTIN(unspec_unaligned_feature, "unaligned_feature",
    528  1.1  mrg 		UNALIGNED_FEATURE)
    529  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_enable_unaligned, "enable_unaligned",
    530  1.1  mrg 			  ENABLE_UNALIGNED)
    531  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_disable_unaligned, "disable_unaligned",
    532  1.1  mrg 			  DISABLE_UNALIGNED)
    533  1.1  mrg };
    534  1.1  mrg 
    535  1.1  mrg /* Intrinsics that take just one argument.  */
    536  1.1  mrg static struct builtin_description bdesc_1arg[] =
    537  1.1  mrg {
    538  1.1  mrg   NDS32_BUILTIN(unspec_ssabssi2, "abs", ABS)
    539  1.1  mrg   NDS32_BUILTIN(clzsi2, "clz", CLZ)
    540  1.1  mrg   NDS32_BUILTIN(unspec_clo, "clo", CLO)
    541  1.1  mrg   NDS32_BUILTIN(unspec_wsbh, "wsbh", WSBH)
    542  1.1  mrg   NDS32_BUILTIN(unspec_tlbop_pb, "tlbop_pb",TLBOP_PB)
    543  1.1  mrg   NDS32_BUILTIN(unaligned_load_hw, "unaligned_load_hw", UALOAD_HW)
    544  1.1  mrg   NDS32_BUILTIN(unaligned_loadsi, "unaligned_load_w", UALOAD_W)
    545  1.1  mrg   NDS32_BUILTIN(unaligned_loaddi, "unaligned_load_dw", UALOAD_DW)
    546  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_volatile_isync, "isync", ISYNC)
    547  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_fmtcsr, "fmtcsr", FMTCSR)
    548  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_jr_itoff, "jr_itoff", JR_ITOFF)
    549  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_jr_toff, "jr_toff", JR_TOFF)
    550  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_jral_ton, "jral_ton", JRAL_TON)
    551  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_ret_toff, "ret_toff", RET_TOFF)
    552  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_jral_iton, "jral_iton",JRAL_ITON)
    553  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_trd, "tlbop_trd", TLBOP_TRD)
    554  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_twr, "tlbop_twr", TLBOP_TWR)
    555  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_rwr, "tlbop_rwr", TLBOP_RWR)
    556  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_rwlk, "tlbop_rwlk", TLBOP_RWLK)
    557  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_unlk, "tlbop_unlk", TLBOP_UNLK)
    558  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tlbop_inv, "tlbop_inv", TLBOP_INV)
    559  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_ret_itoff, "ret_itoff", RET_ITOFF)
    560  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_set_current_sp,
    561  1.1  mrg 			  "set_current_sp", SET_CURRENT_SP)
    562  1.1  mrg   NDS32_BUILTIN(kabsv2hi2, "kabs16", KABS16)
    563  1.1  mrg   NDS32_BUILTIN(kabsv2hi2, "v_kabs16", V_KABS16)
    564  1.1  mrg   NDS32_BUILTIN(kabsv4qi2, "kabs8", KABS8)
    565  1.1  mrg   NDS32_BUILTIN(kabsv4qi2, "v_kabs8", V_KABS8)
    566  1.1  mrg   NDS32_BUILTIN(sunpkd810, "sunpkd810", SUNPKD810)
    567  1.1  mrg   NDS32_BUILTIN(sunpkd810, "v_sunpkd810", V_SUNPKD810)
    568  1.1  mrg   NDS32_BUILTIN(sunpkd820, "sunpkd820", SUNPKD820)
    569  1.1  mrg   NDS32_BUILTIN(sunpkd820, "v_sunpkd820", V_SUNPKD820)
    570  1.1  mrg   NDS32_BUILTIN(sunpkd830, "sunpkd830", SUNPKD830)
    571  1.1  mrg   NDS32_BUILTIN(sunpkd830, "v_sunpkd830", V_SUNPKD830)
    572  1.1  mrg   NDS32_BUILTIN(sunpkd831, "sunpkd831", SUNPKD831)
    573  1.1  mrg   NDS32_BUILTIN(sunpkd831, "v_sunpkd831", V_SUNPKD831)
    574  1.1  mrg   NDS32_BUILTIN(zunpkd810, "zunpkd810", ZUNPKD810)
    575  1.1  mrg   NDS32_BUILTIN(zunpkd810, "v_zunpkd810", V_ZUNPKD810)
    576  1.1  mrg   NDS32_BUILTIN(zunpkd820, "zunpkd820", ZUNPKD820)
    577  1.1  mrg   NDS32_BUILTIN(zunpkd820, "v_zunpkd820", V_ZUNPKD820)
    578  1.1  mrg   NDS32_BUILTIN(zunpkd830, "zunpkd830", ZUNPKD830)
    579  1.1  mrg   NDS32_BUILTIN(zunpkd830, "v_zunpkd830", V_ZUNPKD830)
    580  1.1  mrg   NDS32_BUILTIN(zunpkd831, "zunpkd831", ZUNPKD831)
    581  1.1  mrg   NDS32_BUILTIN(zunpkd831, "v_zunpkd831", V_ZUNPKD831)
    582  1.1  mrg   NDS32_BUILTIN(unspec_kabs, "kabs", KABS)
    583  1.1  mrg   NDS32_BUILTIN(unaligned_loadv2hi, "get_unaligned_u16x2", UALOAD_U16)
    584  1.1  mrg   NDS32_BUILTIN(unaligned_loadv2hi, "get_unaligned_s16x2", UALOAD_S16)
    585  1.1  mrg   NDS32_BUILTIN(unaligned_loadv4qi, "get_unaligned_u8x4", UALOAD_U8)
    586  1.1  mrg   NDS32_BUILTIN(unaligned_loadv4qi, "get_unaligned_s8x4", UALOAD_S8)
    587  1.1  mrg };
    588  1.1  mrg 
    589  1.1  mrg /* Intrinsics that take just one argument. and the argument is immediate.  */
    590  1.1  mrg static struct builtin_description bdesc_1argimm[] =
    591  1.1  mrg {
    592  1.1  mrg   NDS32_BUILTIN(unspec_volatile_mfsr, "mfsr", MFSR)
    593  1.1  mrg   NDS32_BUILTIN(unspec_volatile_mfusr, "mfsr", MFUSR)
    594  1.1  mrg   NDS32_BUILTIN(unspec_get_pending_int, "get_pending_int", GET_PENDING_INT)
    595  1.1  mrg   NDS32_BUILTIN(unspec_get_int_priority, "get_int_priority", GET_INT_PRIORITY)
    596  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_trap, "trap", TRAP)
    597  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_break, "break", BREAK)
    598  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_syscall, "syscall", SYSCALL)
    599  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_enable_int, "enable_int", ENABLE_INT)
    600  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_disable_int, "disable_int", DISABLE_INT)
    601  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_clr_pending_hwint, "clr_pending_hwint",
    602  1.1  mrg 			  CLR_PENDING_HWINT)
    603  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_set_trig_level, "set_trig_level",
    604  1.1  mrg 			  SET_TRIG_LEVEL)
    605  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_set_trig_edge, "set_trig_edge",
    606  1.1  mrg 			  SET_TRIG_EDGE)
    607  1.1  mrg   NDS32_BUILTIN(unspec_get_trig_type, "get_trig_type", GET_TRIG_TYPE)
    608  1.1  mrg };
    609  1.1  mrg 
    610  1.1  mrg /* Intrinsics that take two arguments.  */
    611  1.1  mrg static struct builtin_description bdesc_2arg[] =
    612  1.1  mrg {
    613  1.1  mrg   NDS32_BUILTIN(unspec_fcpynss, "fcpynss", FCPYNSS)
    614  1.1  mrg   NDS32_BUILTIN(unspec_fcpyss, "fcpyss", FCPYSS)
    615  1.1  mrg   NDS32_BUILTIN(unspec_fcpynsd, "fcpynsd", FCPYNSD)
    616  1.1  mrg   NDS32_BUILTIN(unspec_fcpysd, "fcpysd", FCPYSD)
    617  1.1  mrg   NDS32_BUILTIN(unspec_ave, "ave", AVE)
    618  1.1  mrg   NDS32_BUILTIN(unspec_pbsad, "pbsad", PBSAD)
    619  1.1  mrg   NDS32_BUILTIN(unspec_ffb, "ffb", FFB)
    620  1.1  mrg   NDS32_BUILTIN(unspec_ffmism, "ffmsim", FFMISM)
    621  1.1  mrg   NDS32_BUILTIN(unspec_flmism, "flmism", FLMISM)
    622  1.1  mrg   NDS32_BUILTIN(unspec_kaddw, "kaddw", KADDW)
    623  1.1  mrg   NDS32_BUILTIN(unspec_kaddh, "kaddh", KADDH)
    624  1.1  mrg   NDS32_BUILTIN(unspec_ksubw, "ksubw", KSUBW)
    625  1.1  mrg   NDS32_BUILTIN(unspec_ksubh, "ksubh", KSUBH)
    626  1.1  mrg   NDS32_BUILTIN(unspec_kdmbb, "kdmbb", KDMBB)
    627  1.1  mrg   NDS32_BUILTIN(unspec_kdmbb, "v_kdmbb", V_KDMBB)
    628  1.1  mrg   NDS32_BUILTIN(unspec_kdmbt, "kdmbt", KDMBT)
    629  1.1  mrg   NDS32_BUILTIN(unspec_kdmbt, "v_kdmbt", V_KDMBT)
    630  1.1  mrg   NDS32_BUILTIN(unspec_kdmtb, "kdmtb", KDMTB)
    631  1.1  mrg   NDS32_BUILTIN(unspec_kdmtb, "v_kdmtb", V_KDMTB)
    632  1.1  mrg   NDS32_BUILTIN(unspec_kdmtt, "kdmtt", KDMTT)
    633  1.1  mrg   NDS32_BUILTIN(unspec_kdmtt, "v_kdmtt", V_KDMTT)
    634  1.1  mrg   NDS32_BUILTIN(unspec_khmbb, "khmbb", KHMBB)
    635  1.1  mrg   NDS32_BUILTIN(unspec_khmbb, "v_khmbb", V_KHMBB)
    636  1.1  mrg   NDS32_BUILTIN(unspec_khmbt, "khmbt", KHMBT)
    637  1.1  mrg   NDS32_BUILTIN(unspec_khmbt, "v_khmbt", V_KHMBT)
    638  1.1  mrg   NDS32_BUILTIN(unspec_khmtb, "khmtb", KHMTB)
    639  1.1  mrg   NDS32_BUILTIN(unspec_khmtb, "v_khmtb", V_KHMTB)
    640  1.1  mrg   NDS32_BUILTIN(unspec_khmtt, "khmtt", KHMTT)
    641  1.1  mrg   NDS32_BUILTIN(unspec_khmtt, "v_khmtt", V_KHMTT)
    642  1.1  mrg   NDS32_BUILTIN(unspec_kslraw, "kslraw", KSLRAW)
    643  1.1  mrg   NDS32_BUILTIN(unspec_kslrawu, "kslraw_u", KSLRAW_U)
    644  1.1  mrg   NDS32_BUILTIN(rotrsi3, "rotr", ROTR)
    645  1.1  mrg   NDS32_BUILTIN(unspec_sva, "sva", SVA)
    646  1.1  mrg   NDS32_BUILTIN(unspec_svs, "svs", SVS)
    647  1.1  mrg   NDS32_NO_TARGET_BUILTIN(mtsr_isb, "mtsr_isb", MTSR_ISB)
    648  1.1  mrg   NDS32_NO_TARGET_BUILTIN(mtsr_dsb, "mtsr_dsb", MTSR_DSB)
    649  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_volatile_mtsr, "mtsr", MTSR)
    650  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_volatile_mtusr, "mtusr", MTUSR)
    651  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_store_hw, "unaligned_store_hw", UASTORE_HW)
    652  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storesi, "unaligned_store_hw", UASTORE_W)
    653  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storedi, "unaligned_store_hw", UASTORE_DW)
    654  1.1  mrg   NDS32_BUILTIN(addv2hi3, "add16", ADD16)
    655  1.1  mrg   NDS32_BUILTIN(addv2hi3, "v_uadd16", V_UADD16)
    656  1.1  mrg   NDS32_BUILTIN(addv2hi3, "v_sadd16", V_SADD16)
    657  1.1  mrg   NDS32_BUILTIN(raddv2hi3, "radd16", RADD16)
    658  1.1  mrg   NDS32_BUILTIN(raddv2hi3, "v_radd16", V_RADD16)
    659  1.1  mrg   NDS32_BUILTIN(uraddv2hi3, "uradd16", URADD16)
    660  1.1  mrg   NDS32_BUILTIN(uraddv2hi3, "v_uradd16", V_URADD16)
    661  1.1  mrg   NDS32_BUILTIN(kaddv2hi3, "kadd16", KADD16)
    662  1.1  mrg   NDS32_BUILTIN(kaddv2hi3, "v_kadd16", V_KADD16)
    663  1.1  mrg   NDS32_BUILTIN(ukaddv2hi3, "ukadd16", UKADD16)
    664  1.1  mrg   NDS32_BUILTIN(ukaddv2hi3, "v_ukadd16", V_UKADD16)
    665  1.1  mrg   NDS32_BUILTIN(subv2hi3, "sub16", SUB16)
    666  1.1  mrg   NDS32_BUILTIN(subv2hi3, "v_usub16", V_USUB16)
    667  1.1  mrg   NDS32_BUILTIN(subv2hi3, "v_ssub16", V_SSUB16)
    668  1.1  mrg   NDS32_BUILTIN(rsubv2hi3, "rsub16", RSUB16)
    669  1.1  mrg   NDS32_BUILTIN(rsubv2hi3, "v_rsub16", V_RSUB16)
    670  1.1  mrg   NDS32_BUILTIN(ursubv2hi3, "ursub16", URSUB16)
    671  1.1  mrg   NDS32_BUILTIN(ursubv2hi3, "v_ursub16", V_URSUB16)
    672  1.1  mrg   NDS32_BUILTIN(ksubv2hi3, "ksub16", KSUB16)
    673  1.1  mrg   NDS32_BUILTIN(ksubv2hi3, "v_ksub16", V_KSUB16)
    674  1.1  mrg   NDS32_BUILTIN(uksubv2hi3, "uksub16", UKSUB16)
    675  1.1  mrg   NDS32_BUILTIN(uksubv2hi3, "v_uksub16", V_UKSUB16)
    676  1.1  mrg   NDS32_BUILTIN(cras16_1, "cras16", CRAS16)
    677  1.1  mrg   NDS32_BUILTIN(cras16_1, "v_ucras16", V_UCRAS16)
    678  1.1  mrg   NDS32_BUILTIN(cras16_1, "v_scras16", V_SCRAS16)
    679  1.1  mrg   NDS32_BUILTIN(rcras16_1, "rcras16", RCRAS16)
    680  1.1  mrg   NDS32_BUILTIN(rcras16_1, "v_rcras16", V_RCRAS16)
    681  1.1  mrg   NDS32_BUILTIN(urcras16_1, "urcras16", URCRAS16)
    682  1.1  mrg   NDS32_BUILTIN(urcras16_1, "v_urcras16", V_URCRAS16)
    683  1.1  mrg   NDS32_BUILTIN(kcras16_1, "kcras16", KCRAS16)
    684  1.1  mrg   NDS32_BUILTIN(kcras16_1, "v_kcras16", V_KCRAS16)
    685  1.1  mrg   NDS32_BUILTIN(ukcras16_1, "ukcras16", UKCRAS16)
    686  1.1  mrg   NDS32_BUILTIN(ukcras16_1, "v_ukcras16", V_UKCRAS16)
    687  1.1  mrg   NDS32_BUILTIN(crsa16_1, "crsa16", CRSA16)
    688  1.1  mrg   NDS32_BUILTIN(crsa16_1, "v_ucrsa16", V_UCRSA16)
    689  1.1  mrg   NDS32_BUILTIN(crsa16_1, "v_scrsa16", V_SCRSA16)
    690  1.1  mrg   NDS32_BUILTIN(rcrsa16_1, "rcrsa16", RCRSA16)
    691  1.1  mrg   NDS32_BUILTIN(rcrsa16_1, "v_rcrsa16", V_RCRSA16)
    692  1.1  mrg   NDS32_BUILTIN(urcrsa16_1, "urcrsa16", URCRSA16)
    693  1.1  mrg   NDS32_BUILTIN(urcrsa16_1, "v_urcrsa16", V_URCRSA16)
    694  1.1  mrg   NDS32_BUILTIN(kcrsa16_1, "kcrsa16", KCRSA16)
    695  1.1  mrg   NDS32_BUILTIN(kcrsa16_1, "v_kcrsa16", V_KCRSA16)
    696  1.1  mrg   NDS32_BUILTIN(ukcrsa16_1, "ukcrsa16", UKCRSA16)
    697  1.1  mrg   NDS32_BUILTIN(ukcrsa16_1, "v_ukcrsa16", V_UKCRSA16)
    698  1.1  mrg   NDS32_BUILTIN(addv4qi3, "add8", ADD8)
    699  1.1  mrg   NDS32_BUILTIN(addv4qi3, "v_uadd8", V_UADD8)
    700  1.1  mrg   NDS32_BUILTIN(addv4qi3, "v_sadd8", V_SADD8)
    701  1.1  mrg   NDS32_BUILTIN(raddv4qi3, "radd8", RADD8)
    702  1.1  mrg   NDS32_BUILTIN(raddv4qi3, "v_radd8", V_RADD8)
    703  1.1  mrg   NDS32_BUILTIN(uraddv4qi3, "uradd8", URADD8)
    704  1.1  mrg   NDS32_BUILTIN(uraddv4qi3, "v_uradd8", V_URADD8)
    705  1.1  mrg   NDS32_BUILTIN(kaddv4qi3, "kadd8", KADD8)
    706  1.1  mrg   NDS32_BUILTIN(kaddv4qi3, "v_kadd8", V_KADD8)
    707  1.1  mrg   NDS32_BUILTIN(ukaddv4qi3, "ukadd8", UKADD8)
    708  1.1  mrg   NDS32_BUILTIN(ukaddv4qi3, "v_ukadd8", V_UKADD8)
    709  1.1  mrg   NDS32_BUILTIN(subv4qi3, "sub8", SUB8)
    710  1.1  mrg   NDS32_BUILTIN(subv4qi3, "v_usub8", V_USUB8)
    711  1.1  mrg   NDS32_BUILTIN(subv4qi3, "v_ssub8", V_SSUB8)
    712  1.1  mrg   NDS32_BUILTIN(rsubv4qi3, "rsub8", RSUB8)
    713  1.1  mrg   NDS32_BUILTIN(rsubv4qi3, "v_rsub8", V_RSUB8)
    714  1.1  mrg   NDS32_BUILTIN(ursubv4qi3, "ursub8", URSUB8)
    715  1.1  mrg   NDS32_BUILTIN(ursubv4qi3, "v_ursub8", V_URSUB8)
    716  1.1  mrg   NDS32_BUILTIN(ksubv4qi3, "ksub8", KSUB8)
    717  1.1  mrg   NDS32_BUILTIN(ksubv4qi3, "v_ksub8", V_KSUB8)
    718  1.1  mrg   NDS32_BUILTIN(uksubv4qi3, "uksub8", UKSUB8)
    719  1.1  mrg   NDS32_BUILTIN(uksubv4qi3, "v_uksub8", V_UKSUB8)
    720  1.1  mrg   NDS32_BUILTIN(ashrv2hi3, "sra16", SRA16)
    721  1.1  mrg   NDS32_BUILTIN(ashrv2hi3, "v_sra16", V_SRA16)
    722  1.1  mrg   NDS32_BUILTIN(sra16_round, "sra16_u", SRA16_U)
    723  1.1  mrg   NDS32_BUILTIN(sra16_round, "v_sra16_u", V_SRA16_U)
    724  1.1  mrg   NDS32_BUILTIN(lshrv2hi3, "srl16", SRL16)
    725  1.1  mrg   NDS32_BUILTIN(lshrv2hi3, "v_srl16", V_SRL16)
    726  1.1  mrg   NDS32_BUILTIN(srl16_round, "srl16_u", SRL16_U)
    727  1.1  mrg   NDS32_BUILTIN(srl16_round, "v_srl16_u", V_SRL16_U)
    728  1.1  mrg   NDS32_BUILTIN(ashlv2hi3, "sll16", SLL16)
    729  1.1  mrg   NDS32_BUILTIN(ashlv2hi3, "v_sll16", V_SLL16)
    730  1.1  mrg   NDS32_BUILTIN(kslli16, "ksll16", KSLL16)
    731  1.1  mrg   NDS32_BUILTIN(kslli16, "v_ksll16", V_KSLL16)
    732  1.1  mrg   NDS32_BUILTIN(kslra16, "kslra16", KSLRA16)
    733  1.1  mrg   NDS32_BUILTIN(kslra16, "v_kslra16", V_KSLRA16)
    734  1.1  mrg   NDS32_BUILTIN(kslra16_round, "kslra16_u", KSLRA16_U)
    735  1.1  mrg   NDS32_BUILTIN(kslra16_round, "v_kslra16_u", V_KSLRA16_U)
    736  1.1  mrg   NDS32_BUILTIN(cmpeq16, "cmpeq16", CMPEQ16)
    737  1.1  mrg   NDS32_BUILTIN(cmpeq16, "v_scmpeq16", V_SCMPEQ16)
    738  1.1  mrg   NDS32_BUILTIN(cmpeq16, "v_ucmpeq16", V_UCMPEQ16)
    739  1.1  mrg   NDS32_BUILTIN(scmplt16, "scmplt16", SCMPLT16)
    740  1.1  mrg   NDS32_BUILTIN(scmplt16, "v_scmplt16", V_SCMPLT16)
    741  1.1  mrg   NDS32_BUILTIN(scmple16, "scmple16", SCMPLE16)
    742  1.1  mrg   NDS32_BUILTIN(scmple16, "v_scmple16", V_SCMPLE16)
    743  1.1  mrg   NDS32_BUILTIN(ucmplt16, "ucmplt16", UCMPLT16)
    744  1.1  mrg   NDS32_BUILTIN(ucmplt16, "v_ucmplt16", V_UCMPLT16)
    745  1.1  mrg   NDS32_BUILTIN(ucmplt16, "ucmple16", UCMPLE16)
    746  1.1  mrg   NDS32_BUILTIN(ucmplt16, "v_ucmple16", V_UCMPLE16)
    747  1.1  mrg   NDS32_BUILTIN(cmpeq8, "cmpeq8", CMPEQ8)
    748  1.1  mrg   NDS32_BUILTIN(cmpeq8, "v_scmpeq8", V_SCMPEQ8)
    749  1.1  mrg   NDS32_BUILTIN(cmpeq8, "v_ucmpeq8", V_UCMPEQ8)
    750  1.1  mrg   NDS32_BUILTIN(scmplt8, "scmplt8", SCMPLT8)
    751  1.1  mrg   NDS32_BUILTIN(scmplt8, "v_scmplt8", V_SCMPLT8)
    752  1.1  mrg   NDS32_BUILTIN(scmple8, "scmple8", SCMPLE8)
    753  1.1  mrg   NDS32_BUILTIN(scmple8, "v_scmple8", V_SCMPLE8)
    754  1.1  mrg   NDS32_BUILTIN(ucmplt8, "ucmplt8", UCMPLT8)
    755  1.1  mrg   NDS32_BUILTIN(ucmplt8, "v_ucmplt8", V_UCMPLT8)
    756  1.1  mrg   NDS32_BUILTIN(ucmplt8, "ucmple8", UCMPLE8)
    757  1.1  mrg   NDS32_BUILTIN(ucmplt8, "v_ucmple8", V_UCMPLE8)
    758  1.1  mrg   NDS32_BUILTIN(sminv2hi3, "smin16", SMIN16)
    759  1.1  mrg   NDS32_BUILTIN(sminv2hi3, "v_smin16", V_SMIN16)
    760  1.1  mrg   NDS32_BUILTIN(uminv2hi3, "umin16", UMIN16)
    761  1.1  mrg   NDS32_BUILTIN(uminv2hi3, "v_umin16", V_UMIN16)
    762  1.1  mrg   NDS32_BUILTIN(smaxv2hi3, "smax16", SMAX16)
    763  1.1  mrg   NDS32_BUILTIN(smaxv2hi3, "v_smax16", V_SMAX16)
    764  1.1  mrg   NDS32_BUILTIN(umaxv2hi3, "umax16", UMAX16)
    765  1.1  mrg   NDS32_BUILTIN(umaxv2hi3, "v_umax16", V_UMAX16)
    766  1.1  mrg   NDS32_BUILTIN(khm16, "khm16", KHM16)
    767  1.1  mrg   NDS32_BUILTIN(khm16, "v_khm16", V_KHM16)
    768  1.1  mrg   NDS32_BUILTIN(khmx16, "khmx16", KHMX16)
    769  1.1  mrg   NDS32_BUILTIN(khmx16, "v_khmx16", V_KHMX16)
    770  1.1  mrg   NDS32_BUILTIN(sminv4qi3, "smin8", SMIN8)
    771  1.1  mrg   NDS32_BUILTIN(sminv4qi3, "v_smin8", V_SMIN8)
    772  1.1  mrg   NDS32_BUILTIN(uminv4qi3, "umin8", UMIN8)
    773  1.1  mrg   NDS32_BUILTIN(uminv4qi3, "v_umin8", V_UMIN8)
    774  1.1  mrg   NDS32_BUILTIN(smaxv4qi3, "smax8", SMAX8)
    775  1.1  mrg   NDS32_BUILTIN(smaxv4qi3, "v_smax8", V_SMAX8)
    776  1.1  mrg   NDS32_BUILTIN(umaxv4qi3, "umax8", UMAX8)
    777  1.1  mrg   NDS32_BUILTIN(umaxv4qi3, "v_umax8", V_UMAX8)
    778  1.1  mrg   NDS32_BUILTIN(raddsi3, "raddw", RADDW)
    779  1.1  mrg   NDS32_BUILTIN(uraddsi3, "uraddw", URADDW)
    780  1.1  mrg   NDS32_BUILTIN(rsubsi3, "rsubw", RSUBW)
    781  1.1  mrg   NDS32_BUILTIN(ursubsi3, "ursubw", URSUBW)
    782  1.1  mrg   NDS32_BUILTIN(sraiu, "sra_u", SRA_U)
    783  1.1  mrg   NDS32_BUILTIN(kssl, "ksll", KSLL)
    784  1.1  mrg   NDS32_BUILTIN(pkbb, "pkbb16", PKBB16)
    785  1.1  mrg   NDS32_BUILTIN(pkbb, "v_pkbb16", V_PKBB16)
    786  1.1  mrg   NDS32_BUILTIN(pkbt, "pkbt16", PKBT16)
    787  1.1  mrg   NDS32_BUILTIN(pkbt, "v_pkbt16", V_PKBT16)
    788  1.1  mrg   NDS32_BUILTIN(pktb, "pktb16", PKTB16)
    789  1.1  mrg   NDS32_BUILTIN(pktb, "v_pktb16", V_PKTB16)
    790  1.1  mrg   NDS32_BUILTIN(pktt, "pktt16", PKTT16)
    791  1.1  mrg   NDS32_BUILTIN(pktt, "v_pktt16", V_PKTT16)
    792  1.1  mrg   NDS32_BUILTIN(smulsi3_highpart, "smmul", SMMUL)
    793  1.1  mrg   NDS32_BUILTIN(smmul_round, "smmul_u", SMMUL_U)
    794  1.1  mrg   NDS32_BUILTIN(smmwb, "smmwb", SMMWB)
    795  1.1  mrg   NDS32_BUILTIN(smmwb, "v_smmwb", V_SMMWB)
    796  1.1  mrg   NDS32_BUILTIN(smmwb_round, "smmwb_u", SMMWB_U)
    797  1.1  mrg   NDS32_BUILTIN(smmwb_round, "v_smmwb_u", V_SMMWB_U)
    798  1.1  mrg   NDS32_BUILTIN(smmwt, "smmwt", SMMWT)
    799  1.1  mrg   NDS32_BUILTIN(smmwt, "v_smmwt", V_SMMWT)
    800  1.1  mrg   NDS32_BUILTIN(smmwt_round, "smmwt_u", SMMWT_U)
    801  1.1  mrg   NDS32_BUILTIN(smmwt_round, "v_smmwt_u", V_SMMWT_U)
    802  1.1  mrg   NDS32_BUILTIN(smbb, "smbb", SMBB)
    803  1.1  mrg   NDS32_BUILTIN(smbb, "v_smbb", V_SMBB)
    804  1.1  mrg   NDS32_BUILTIN(smbt, "smbt", SMBT)
    805  1.1  mrg   NDS32_BUILTIN(smbt, "v_smbt", V_SMBT)
    806  1.1  mrg   NDS32_BUILTIN(smtt, "smtt", SMTT)
    807  1.1  mrg   NDS32_BUILTIN(smtt, "v_smtt", V_SMTT)
    808  1.1  mrg   NDS32_BUILTIN(kmda, "kmda", KMDA)
    809  1.1  mrg   NDS32_BUILTIN(kmda, "v_kmda", V_KMDA)
    810  1.1  mrg   NDS32_BUILTIN(kmxda, "kmxda", KMXDA)
    811  1.1  mrg   NDS32_BUILTIN(kmxda, "v_kmxda", V_KMXDA)
    812  1.1  mrg   NDS32_BUILTIN(smds, "smds", SMDS)
    813  1.1  mrg   NDS32_BUILTIN(smds, "v_smds", V_SMDS)
    814  1.1  mrg   NDS32_BUILTIN(smdrs, "smdrs", SMDRS)
    815  1.1  mrg   NDS32_BUILTIN(smdrs, "v_smdrs", V_SMDRS)
    816  1.1  mrg   NDS32_BUILTIN(smxdsv, "smxds", SMXDS)
    817  1.1  mrg   NDS32_BUILTIN(smxdsv, "v_smxds", V_SMXDS)
    818  1.1  mrg   NDS32_BUILTIN(smal1, "smal", SMAL)
    819  1.1  mrg   NDS32_BUILTIN(smal1, "v_smal", V_SMAL)
    820  1.1  mrg   NDS32_BUILTIN(bitrev, "bitrev", BITREV)
    821  1.1  mrg   NDS32_BUILTIN(wext, "wext", WEXT)
    822  1.1  mrg   NDS32_BUILTIN(adddi3, "sadd64", SADD64)
    823  1.1  mrg   NDS32_BUILTIN(adddi3, "uadd64", UADD64)
    824  1.1  mrg   NDS32_BUILTIN(radddi3, "radd64", RADD64)
    825  1.1  mrg   NDS32_BUILTIN(uradddi3, "uradd64", URADD64)
    826  1.1  mrg   NDS32_BUILTIN(kadddi3, "kadd64", KADD64)
    827  1.1  mrg   NDS32_BUILTIN(ukadddi3, "ukadd64", UKADD64)
    828  1.1  mrg   NDS32_BUILTIN(subdi3, "ssub64", SSUB64)
    829  1.1  mrg   NDS32_BUILTIN(subdi3, "usub64", USUB64)
    830  1.1  mrg   NDS32_BUILTIN(rsubdi3, "rsub64", RSUB64)
    831  1.1  mrg   NDS32_BUILTIN(ursubdi3, "ursub64", URSUB64)
    832  1.1  mrg   NDS32_BUILTIN(ksubdi3, "ksub64", KSUB64)
    833  1.1  mrg   NDS32_BUILTIN(uksubdi3, "uksub64", UKSUB64)
    834  1.1  mrg   NDS32_BUILTIN(smul16, "smul16", SMUL16)
    835  1.1  mrg   NDS32_BUILTIN(smul16, "v_smul16", V_SMUL16)
    836  1.1  mrg   NDS32_BUILTIN(smulx16, "smulx16", SMULX16)
    837  1.1  mrg   NDS32_BUILTIN(smulx16, "v_smulx16", V_SMULX16)
    838  1.1  mrg   NDS32_BUILTIN(umul16, "umul16", UMUL16)
    839  1.1  mrg   NDS32_BUILTIN(umul16, "v_umul16", V_UMUL16)
    840  1.1  mrg   NDS32_BUILTIN(umulx16, "umulx16", UMULX16)
    841  1.1  mrg   NDS32_BUILTIN(umulx16, "v_umulx16", V_UMULX16)
    842  1.1  mrg   NDS32_BUILTIN(kwmmul, "kwmmul", KWMMUL)
    843  1.1  mrg   NDS32_BUILTIN(kwmmul_round, "kwmmul_u", KWMMUL_U)
    844  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storev2hi,
    845  1.1  mrg 			  "put_unaligned_u16x2", UASTORE_U16)
    846  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storev2hi,
    847  1.1  mrg 			  "put_unaligned_s16x2", UASTORE_S16)
    848  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storev4qi, "put_unaligned_u8x4", UASTORE_U8)
    849  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unaligned_storev4qi, "put_unaligned_s8x4", UASTORE_S8)
    850  1.1  mrg };
    851  1.1  mrg 
    852  1.1  mrg /* Two-argument intrinsics with an immediate second argument.  */
    853  1.1  mrg static struct builtin_description bdesc_2argimm[] =
    854  1.1  mrg {
    855  1.1  mrg   NDS32_BUILTIN(unspec_bclr, "bclr", BCLR)
    856  1.1  mrg   NDS32_BUILTIN(unspec_bset, "bset", BSET)
    857  1.1  mrg   NDS32_BUILTIN(unspec_btgl, "btgl", BTGL)
    858  1.1  mrg   NDS32_BUILTIN(unspec_btst, "btst", BTST)
    859  1.1  mrg   NDS32_BUILTIN(unspec_clip, "clip", CLIP)
    860  1.1  mrg   NDS32_BUILTIN(unspec_clips, "clips", CLIPS)
    861  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_teqz, "teqz", TEQZ)
    862  1.1  mrg   NDS32_NO_TARGET_BUILTIN(unspec_tnez, "tnez", TNEZ)
    863  1.1  mrg   NDS32_BUILTIN(ashrv2hi3, "srl16", SRL16)
    864  1.1  mrg   NDS32_BUILTIN(ashrv2hi3, "v_srl16", V_SRL16)
    865  1.1  mrg   NDS32_BUILTIN(srl16_round, "srl16_u", SRL16_U)
    866  1.1  mrg   NDS32_BUILTIN(srl16_round, "v_srl16_u", V_SRL16_U)
    867  1.1  mrg   NDS32_BUILTIN(kslli16, "ksll16", KSLL16)
    868  1.1  mrg   NDS32_BUILTIN(kslli16, "v_ksll16", V_KSLL16)
    869  1.1  mrg   NDS32_BUILTIN(sclip16, "sclip16", SCLIP16)
    870  1.1  mrg   NDS32_BUILTIN(sclip16, "v_sclip16", V_SCLIP16)
    871  1.1  mrg   NDS32_BUILTIN(uclip16, "uclip16", UCLIP16)
    872  1.1  mrg   NDS32_BUILTIN(uclip16, "v_uclip16", V_UCLIP16)
    873  1.1  mrg   NDS32_BUILTIN(sraiu, "sra_u", SRA_U)
    874  1.1  mrg   NDS32_BUILTIN(kssl, "ksll", KSLL)
    875  1.1  mrg   NDS32_BUILTIN(bitrev, "bitrev", BITREV)
    876  1.1  mrg   NDS32_BUILTIN(wext, "wext", WEXT)
    877  1.1  mrg   NDS32_BUILTIN(uclip32, "uclip32", UCLIP32)
    878  1.1  mrg   NDS32_BUILTIN(sclip32, "sclip32", SCLIP32)
    879  1.1  mrg };
    880  1.1  mrg 
    881  1.1  mrg /* Intrinsics that take three arguments.  */
    882  1.1  mrg static struct builtin_description bdesc_3arg[] =
    883  1.1  mrg {
    884  1.1  mrg   NDS32_BUILTIN(unspec_pbsada, "pbsada", PBSADA)
    885  1.1  mrg   NDS32_NO_TARGET_BUILTIN(bse, "bse", BSE)
    886  1.1  mrg   NDS32_NO_TARGET_BUILTIN(bsp, "bsp", BSP)
    887  1.1  mrg   NDS32_BUILTIN(kmabb, "kmabb", KMABB)
    888  1.1  mrg   NDS32_BUILTIN(kmabb, "v_kmabb", V_KMABB)
    889  1.1  mrg   NDS32_BUILTIN(kmabt, "kmabt", KMABT)
    890  1.1  mrg   NDS32_BUILTIN(kmabt, "v_kmabt", V_KMABT)
    891  1.1  mrg   NDS32_BUILTIN(kmatt, "kmatt", KMATT)
    892  1.1  mrg   NDS32_BUILTIN(kmatt, "v_kmatt", V_KMATT)
    893  1.1  mrg   NDS32_BUILTIN(kmada, "kmada", KMADA)
    894  1.1  mrg   NDS32_BUILTIN(kmada, "v_kmada", V_KMADA)
    895  1.1  mrg   NDS32_BUILTIN(kmaxda, "kmaxda", KMAXDA)
    896  1.1  mrg   NDS32_BUILTIN(kmaxda, "v_kmaxda", V_KMAXDA)
    897  1.1  mrg   NDS32_BUILTIN(kmads, "kmads", KMADS)
    898  1.1  mrg   NDS32_BUILTIN(kmads, "v_kmads", V_KMADS)
    899  1.1  mrg   NDS32_BUILTIN(kmadrs, "kmadrs", KMADRS)
    900  1.1  mrg   NDS32_BUILTIN(kmadrs, "v_kmadrs", V_KMADRS)
    901  1.1  mrg   NDS32_BUILTIN(kmaxds, "kmaxds", KMAXDS)
    902  1.1  mrg   NDS32_BUILTIN(kmaxds, "v_kmaxds", V_KMAXDS)
    903  1.1  mrg   NDS32_BUILTIN(kmsda, "kmsda", KMSDA)
    904  1.1  mrg   NDS32_BUILTIN(kmsda, "v_kmsda", V_KMSDA)
    905  1.1  mrg   NDS32_BUILTIN(kmsxda, "kmsxda", KMSXDA)
    906  1.1  mrg   NDS32_BUILTIN(kmsxda, "v_kmsxda", V_KMSXDA)
    907  1.1  mrg   NDS32_BUILTIN(bpick1, "bpick", BPICK)
    908  1.1  mrg   NDS32_BUILTIN(smar64_1, "smar64", SMAR64)
    909  1.1  mrg   NDS32_BUILTIN(smsr64, "smsr64", SMSR64)
    910  1.1  mrg   NDS32_BUILTIN(umar64_1, "umar64", UMAR64)
    911  1.1  mrg   NDS32_BUILTIN(umsr64, "umsr64", UMSR64)
    912  1.1  mrg   NDS32_BUILTIN(kmar64_1, "kmar64", KMAR64)
    913  1.1  mrg   NDS32_BUILTIN(kmsr64, "kmsr64", KMSR64)
    914  1.1  mrg   NDS32_BUILTIN(ukmar64_1, "ukmar64", UKMAR64)
    915  1.1  mrg   NDS32_BUILTIN(ukmsr64, "ukmsr64", UKMSR64)
    916  1.1  mrg   NDS32_BUILTIN(smalbb, "smalbb", SMALBB)
    917  1.1  mrg   NDS32_BUILTIN(smalbb, "v_smalbb", V_SMALBB)
    918  1.1  mrg   NDS32_BUILTIN(smalbt, "smalbt", SMALBT)
    919  1.1  mrg   NDS32_BUILTIN(smalbt, "v_smalbt", V_SMALBT)
    920  1.1  mrg   NDS32_BUILTIN(smaltt, "smaltt", SMALTT)
    921  1.1  mrg   NDS32_BUILTIN(smaltt, "v_smaltt", V_SMALTT)
    922  1.1  mrg   NDS32_BUILTIN(smalda1, "smalda", SMALDA)
    923  1.1  mrg   NDS32_BUILTIN(smalda1, "v_smalda", V_SMALDA)
    924  1.1  mrg   NDS32_BUILTIN(smalxda1, "smalxda", SMALXDA)
    925  1.1  mrg   NDS32_BUILTIN(smalxda1, "v_smalxda", V_SMALXDA)
    926  1.1  mrg   NDS32_BUILTIN(smalds1, "smalds", SMALDS)
    927  1.1  mrg   NDS32_BUILTIN(smalds1, "v_smalds", V_SMALDS)
    928  1.1  mrg   NDS32_BUILTIN(smaldrs3, "smaldrs", SMALDRS)
    929  1.1  mrg   NDS32_BUILTIN(smaldrs3, "v_smaldrs", V_SMALDRS)
    930  1.1  mrg   NDS32_BUILTIN(smalxds1, "smalxds", SMALXDS)
    931  1.1  mrg   NDS32_BUILTIN(smalxds1, "v_smalxds", V_SMALXDS)
    932  1.1  mrg   NDS32_BUILTIN(smslda1, "smslda", SMSLDA)
    933  1.1  mrg   NDS32_BUILTIN(smslda1, "v_smslda", V_SMSLDA)
    934  1.1  mrg   NDS32_BUILTIN(smslxda1, "smslxda", SMSLXDA)
    935  1.1  mrg   NDS32_BUILTIN(smslxda1, "v_smslxda", V_SMSLXDA)
    936  1.1  mrg   NDS32_BUILTIN(kmmawb, "kmmawb", KMMAWB)
    937  1.1  mrg   NDS32_BUILTIN(kmmawb, "v_kmmawb", V_KMMAWB)
    938  1.1  mrg   NDS32_BUILTIN(kmmawb_round, "kmmawb_u", KMMAWB_U)
    939  1.1  mrg   NDS32_BUILTIN(kmmawb_round, "v_kmmawb_u", V_KMMAWB_U)
    940  1.1  mrg   NDS32_BUILTIN(kmmawt, "kmmawt", KMMAWT)
    941  1.1  mrg   NDS32_BUILTIN(kmmawt, "v_kmmawt", V_KMMAWT)
    942  1.1  mrg   NDS32_BUILTIN(kmmawt_round, "kmmawt_u", KMMAWT_U)
    943  1.1  mrg   NDS32_BUILTIN(kmmawt_round, "v_kmmawt_u", V_KMMAWT_U)
    944  1.1  mrg   NDS32_BUILTIN(kmmac, "kmmac", KMMAC)
    945  1.1  mrg   NDS32_BUILTIN(kmmac_round, "kmmac_u", KMMAC_U)
    946  1.1  mrg   NDS32_BUILTIN(kmmsb, "kmmsb", KMMSB)
    947  1.1  mrg   NDS32_BUILTIN(kmmsb_round, "kmmsb_u", KMMSB_U)
    948  1.1  mrg };
    949  1.1  mrg 
    950  1.1  mrg /* Three-argument intrinsics with an immediate third argument.  */
    951  1.1  mrg static struct builtin_description bdesc_3argimm[] =
    952  1.1  mrg {
    953  1.1  mrg   NDS32_NO_TARGET_BUILTIN(prefetch_qw, "prefetch_qw", DPREF_QW)
    954  1.1  mrg   NDS32_NO_TARGET_BUILTIN(prefetch_hw, "prefetch_hw", DPREF_HW)
    955  1.1  mrg   NDS32_NO_TARGET_BUILTIN(prefetch_w, "prefetch_w", DPREF_W)
    956  1.1  mrg   NDS32_NO_TARGET_BUILTIN(prefetch_dw, "prefetch_dw", DPREF_DW)
    957  1.1  mrg   NDS32_BUILTIN(insb, "insb", INSB)
    958  1.1  mrg };
    959  1.1  mrg 
    960  1.1  mrg /* Intrinsics that load a value.  */
    961  1.1  mrg static struct builtin_description bdesc_load[] =
    962  1.1  mrg {
    963  1.1  mrg   NDS32_BUILTIN(unspec_volatile_llw, "llw", LLW)
    964  1.1  mrg   NDS32_BUILTIN(unspec_lwup, "lwup", LWUP)
    965  1.1  mrg   NDS32_BUILTIN(unspec_lbup, "lbup", LBUP)
    966  1.1  mrg };
    967  1.1  mrg 
    968  1.1  mrg /* Intrinsics that store a value.  */
    969  1.1  mrg static struct builtin_description bdesc_store[] =
    970  1.1  mrg {
    971  1.1  mrg   NDS32_BUILTIN(unspec_swup, "swup", SWUP)
    972  1.1  mrg   NDS32_BUILTIN(unspec_sbup, "sbup", SBUP)
    973  1.1  mrg };
    974  1.1  mrg 
    975  1.1  mrg static struct builtin_description bdesc_cctl[] =
    976  1.1  mrg {
    977  1.1  mrg   NDS32_BUILTIN(cctl_idx_read, "cctl_idx_read", CCTL_IDX_READ)
    978  1.1  mrg   NDS32_NO_TARGET_BUILTIN(cctl_idx_write, "cctl_idx_write", CCTL_IDX_WRITE)
    979  1.1  mrg   NDS32_NO_TARGET_BUILTIN(cctl_va_lck, "cctl_va_lck", CCTL_VA_LCK)
    980  1.1  mrg   NDS32_NO_TARGET_BUILTIN(cctl_idx_wbinval,
    981  1.1  mrg 			  "cctl_idx_wbinval", CCTL_IDX_WBINVAL)
    982  1.1  mrg   NDS32_NO_TARGET_BUILTIN(cctl_va_wbinval_l1,
    983  1.1  mrg 			  "cctl_va_wbinval_l1", CCTL_VA_WBINVAL_L1)
    984  1.1  mrg   NDS32_NO_TARGET_BUILTIN(cctl_va_wbinval_la,
    985  1.1  mrg 			  "cctl_va_wbinval_la", CCTL_VA_WBINVAL_LA)
    986  1.1  mrg };
    987  1.1  mrg 
    988  1.1  mrg rtx
    989  1.1  mrg nds32_expand_builtin_impl (tree exp,
    990  1.1  mrg 			   rtx target,
    991  1.1  mrg 			   rtx subtarget ATTRIBUTE_UNUSED,
    992  1.1  mrg 			   enum machine_mode mode ATTRIBUTE_UNUSED,
    993  1.1  mrg 			   int ignore ATTRIBUTE_UNUSED)
    994  1.1  mrg {
    995  1.1  mrg   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
    996  1.1  mrg   unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
    997  1.1  mrg   unsigned i;
    998  1.1  mrg   struct builtin_description *d;
    999  1.1  mrg 
   1000  1.1  mrg   if (!NDS32_EXT_DSP_P ()
   1001  1.1  mrg       && fcode > NDS32_BUILTIN_DSP_BEGIN
   1002  1.1  mrg       && fcode < NDS32_BUILTIN_DSP_END)
   1003  1.1  mrg     error ("don%'t support DSP extension instructions");
   1004  1.1  mrg 
   1005  1.1  mrg   switch (fcode)
   1006  1.1  mrg     {
   1007  1.1  mrg     /* FPU Register Transfer.  */
   1008  1.1  mrg     case NDS32_BUILTIN_FMFCFG:
   1009  1.1  mrg     case NDS32_BUILTIN_FMFCSR:
   1010  1.1  mrg     case NDS32_BUILTIN_FMTCSR:
   1011  1.1  mrg     case NDS32_BUILTIN_FCPYNSS:
   1012  1.1  mrg     case NDS32_BUILTIN_FCPYSS:
   1013  1.1  mrg       /* Both v3s and v3f toolchains define TARGET_FPU_SINGLE.  */
   1014  1.1  mrg       if (!TARGET_FPU_SINGLE)
   1015  1.1  mrg 	{
   1016  1.1  mrg 	  error ("this built-in function is only available "
   1017  1.1  mrg 		 "on the v3s or v3f toolchain");
   1018  1.1  mrg 	  return NULL_RTX;
   1019  1.1  mrg 	}
   1020  1.1  mrg       break;
   1021  1.1  mrg 
   1022  1.1  mrg     /* FPU Register Transfer.  */
   1023  1.1  mrg     case NDS32_BUILTIN_FCPYNSD:
   1024  1.1  mrg     case NDS32_BUILTIN_FCPYSD:
   1025  1.1  mrg       /* Only v3f toolchain defines TARGET_FPU_DOUBLE.  */
   1026  1.1  mrg       if (!TARGET_FPU_DOUBLE)
   1027  1.1  mrg 	{
   1028  1.1  mrg 	  error ("this built-in function is only available "
   1029  1.1  mrg 		 "on the v3f toolchain");
   1030  1.1  mrg 	  return NULL_RTX;
   1031  1.1  mrg 	}
   1032  1.1  mrg       break;
   1033  1.1  mrg 
   1034  1.1  mrg     /* Load and Store  */
   1035  1.1  mrg     case NDS32_BUILTIN_LLW:
   1036  1.1  mrg     case NDS32_BUILTIN_LWUP:
   1037  1.1  mrg     case NDS32_BUILTIN_LBUP:
   1038  1.1  mrg     case NDS32_BUILTIN_SCW:
   1039  1.1  mrg     case NDS32_BUILTIN_SWUP:
   1040  1.1  mrg     case NDS32_BUILTIN_SBUP:
   1041  1.1  mrg       if (TARGET_ISA_V3M)
   1042  1.1  mrg 	{
   1043  1.1  mrg 	  error ("this built-in function not support "
   1044  1.1  mrg 		 "on the v3m toolchain");
   1045  1.1  mrg 	  return NULL_RTX;
   1046  1.1  mrg 	}
   1047  1.1  mrg       break;
   1048  1.1  mrg 
   1049  1.1  mrg     /* Performance Extension  */
   1050  1.1  mrg     case NDS32_BUILTIN_ABS:
   1051  1.1  mrg     case NDS32_BUILTIN_AVE:
   1052  1.1  mrg     case NDS32_BUILTIN_BCLR:
   1053  1.1  mrg     case NDS32_BUILTIN_BSET:
   1054  1.1  mrg     case NDS32_BUILTIN_BTGL:
   1055  1.1  mrg     case NDS32_BUILTIN_BTST:
   1056  1.1  mrg     case NDS32_BUILTIN_CLIP:
   1057  1.1  mrg     case NDS32_BUILTIN_CLIPS:
   1058  1.1  mrg     case NDS32_BUILTIN_CLZ:
   1059  1.1  mrg     case NDS32_BUILTIN_CLO:
   1060  1.1  mrg       if (!TARGET_EXT_PERF)
   1061  1.1  mrg 	{
   1062  1.1  mrg 	  error ("don%'t support performance extension instructions");
   1063  1.1  mrg 	  return NULL_RTX;
   1064  1.1  mrg 	}
   1065  1.1  mrg       break;
   1066  1.1  mrg 
   1067  1.1  mrg     /* Performance Extension 2  */
   1068  1.1  mrg     case NDS32_BUILTIN_PBSAD:
   1069  1.1  mrg     case NDS32_BUILTIN_PBSADA:
   1070  1.1  mrg     case NDS32_BUILTIN_BSE:
   1071  1.1  mrg     case NDS32_BUILTIN_BSP:
   1072  1.1  mrg       if (!TARGET_EXT_PERF2)
   1073  1.1  mrg 	{
   1074  1.1  mrg 	  error ("don%'t support performance extension "
   1075  1.1  mrg 		 "version 2 instructions");
   1076  1.1  mrg 	  return NULL_RTX;
   1077  1.1  mrg 	}
   1078  1.1  mrg       break;
   1079  1.1  mrg 
   1080  1.1  mrg     /* String Extension  */
   1081  1.1  mrg     case NDS32_BUILTIN_FFB:
   1082  1.1  mrg     case NDS32_BUILTIN_FFMISM:
   1083  1.1  mrg     case NDS32_BUILTIN_FLMISM:
   1084  1.1  mrg       if (!TARGET_EXT_STRING)
   1085  1.1  mrg 	{
   1086  1.1  mrg 	  error ("don%'t support string extension instructions");
   1087  1.1  mrg 	  return NULL_RTX;
   1088  1.1  mrg 	}
   1089  1.1  mrg       break;
   1090  1.1  mrg 
   1091  1.1  mrg     default:
   1092  1.1  mrg       break;
   1093  1.1  mrg     }
   1094  1.1  mrg 
   1095  1.1  mrg   /* Since there are no result and operands, we can simply emit this rtx.  */
   1096  1.1  mrg   switch (fcode)
   1097  1.1  mrg     {
   1098  1.1  mrg     case NDS32_BUILTIN_ISB:
   1099  1.1  mrg       emit_insn (gen_unspec_volatile_isb ());
   1100  1.1  mrg       return target;
   1101  1.1  mrg     case NDS32_BUILTIN_DSB:
   1102  1.1  mrg       emit_insn (gen_unspec_dsb ());
   1103  1.1  mrg       return target;
   1104  1.1  mrg     case NDS32_BUILTIN_MSYNC_ALL:
   1105  1.1  mrg       emit_insn (gen_unspec_msync_all ());
   1106  1.1  mrg       return target;
   1107  1.1  mrg     case NDS32_BUILTIN_MSYNC_STORE:
   1108  1.1  mrg       emit_insn (gen_unspec_msync_store ());
   1109  1.1  mrg       return target;
   1110  1.1  mrg     case NDS32_BUILTIN_SETGIE_EN:
   1111  1.1  mrg       emit_insn (gen_unspec_volatile_setgie_en ());
   1112  1.1  mrg       emit_insn (gen_unspec_dsb ());
   1113  1.1  mrg       return target;
   1114  1.1  mrg     case NDS32_BUILTIN_SETGIE_DIS:
   1115  1.1  mrg       emit_insn (gen_unspec_volatile_setgie_dis ());
   1116  1.1  mrg       emit_insn (gen_unspec_dsb ());
   1117  1.1  mrg       return target;
   1118  1.1  mrg     case NDS32_BUILTIN_GIE_DIS:
   1119  1.1  mrg       emit_insn (gen_unspec_volatile_setgie_dis ());
   1120  1.1  mrg       emit_insn (gen_unspec_dsb ());
   1121  1.1  mrg       return target;
   1122  1.1  mrg     case NDS32_BUILTIN_GIE_EN:
   1123  1.1  mrg       emit_insn (gen_unspec_volatile_setgie_en ());
   1124  1.1  mrg       emit_insn (gen_unspec_dsb ());
   1125  1.1  mrg       return target;
   1126  1.1  mrg     case NDS32_BUILTIN_SET_PENDING_SWINT:
   1127  1.1  mrg       emit_insn (gen_unspec_set_pending_swint ());
   1128  1.1  mrg       return target;
   1129  1.1  mrg     case NDS32_BUILTIN_CLR_PENDING_SWINT:
   1130  1.1  mrg       emit_insn (gen_unspec_clr_pending_swint ());
   1131  1.1  mrg       return target;
   1132  1.1  mrg     case NDS32_BUILTIN_CCTL_L1D_INVALALL:
   1133  1.1  mrg       emit_insn (gen_cctl_l1d_invalall());
   1134  1.1  mrg       return target;
   1135  1.1  mrg     case NDS32_BUILTIN_CCTL_L1D_WBALL_ALVL:
   1136  1.1  mrg       emit_insn (gen_cctl_l1d_wball_alvl());
   1137  1.1  mrg       return target;
   1138  1.1  mrg     case NDS32_BUILTIN_CCTL_L1D_WBALL_ONE_LVL:
   1139  1.1  mrg       emit_insn (gen_cctl_l1d_wball_one_lvl());
   1140  1.1  mrg       return target;
   1141  1.1  mrg     case NDS32_BUILTIN_CLROV:
   1142  1.1  mrg       emit_insn (gen_unspec_volatile_clrov ());
   1143  1.1  mrg       return target;
   1144  1.1  mrg     case NDS32_BUILTIN_STANDBY_NO_WAKE_GRANT:
   1145  1.1  mrg       emit_insn (gen_unspec_standby_no_wake_grant ());
   1146  1.1  mrg       return target;
   1147  1.1  mrg     case NDS32_BUILTIN_STANDBY_WAKE_GRANT:
   1148  1.1  mrg       emit_insn (gen_unspec_standby_wake_grant ());
   1149  1.1  mrg       return target;
   1150  1.1  mrg     case NDS32_BUILTIN_STANDBY_WAKE_DONE:
   1151  1.1  mrg       emit_insn (gen_unspec_standby_wait_done ());
   1152  1.1  mrg       return target;
   1153  1.1  mrg     case NDS32_BUILTIN_SETEND_BIG:
   1154  1.1  mrg       emit_insn (gen_unspec_setend_big ());
   1155  1.1  mrg       return target;
   1156  1.1  mrg     case NDS32_BUILTIN_SETEND_LITTLE:
   1157  1.1  mrg       emit_insn (gen_unspec_setend_little ());
   1158  1.1  mrg       return target;
   1159  1.1  mrg     case NDS32_BUILTIN_NOP:
   1160  1.1  mrg       emit_insn (gen_unspec_nop ());
   1161  1.1  mrg       return target;
   1162  1.1  mrg     case NDS32_BUILTIN_SCHE_BARRIER:
   1163  1.1  mrg       emit_insn (gen_blockage ());
   1164  1.1  mrg       return target;
   1165  1.1  mrg     case NDS32_BUILTIN_TLBOP_FLUA:
   1166  1.1  mrg       emit_insn (gen_unspec_tlbop_flua ());
   1167  1.1  mrg       return target;
   1168  1.1  mrg     case NDS32_BUILTIN_SCW:
   1169  1.1  mrg       return nds32_expand_scw_builtin (CODE_FOR_unspec_volatile_scw,
   1170  1.1  mrg 				       exp, target);
   1171  1.1  mrg     case NDS32_BUILTIN_SET_INT_PRIORITY:
   1172  1.1  mrg       return nds32_expand_priority_builtin (CODE_FOR_unspec_set_int_priority,
   1173  1.1  mrg 					    exp, target,
   1174  1.1  mrg 					    "__nds32__set_int_priority");
   1175  1.1  mrg       return target;
   1176  1.1  mrg     default:
   1177  1.1  mrg       break;
   1178  1.1  mrg     }
   1179  1.1  mrg 
   1180  1.1  mrg   /* Expand groups of builtins.  */
   1181  1.1  mrg   for (i = 0, d = bdesc_noarg; i < ARRAY_SIZE (bdesc_noarg); i++, d++)
   1182  1.1  mrg     if (d->code == fcode)
   1183  1.1  mrg       return nds32_expand_noarg_builtin (d->icode, target);
   1184  1.1  mrg 
   1185  1.1  mrg   for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
   1186  1.1  mrg     if (d->code == fcode)
   1187  1.1  mrg       return nds32_expand_unop_builtin (d->icode, exp, target, d->return_p);
   1188  1.1  mrg 
   1189  1.1  mrg   for (i = 0, d = bdesc_1argimm; i < ARRAY_SIZE (bdesc_1argimm); i++, d++)
   1190  1.1  mrg     if (d->code == fcode)
   1191  1.1  mrg       return nds32_expand_unopimm_builtin (d->icode, exp, target,
   1192  1.1  mrg 					   d->return_p, d->name);
   1193  1.1  mrg 
   1194  1.1  mrg   for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
   1195  1.1  mrg     if (d->code == fcode)
   1196  1.1  mrg       return nds32_expand_binop_builtin (d->icode, exp, target, d->return_p);
   1197  1.1  mrg 
   1198  1.1  mrg   for (i = 0, d = bdesc_2argimm; i < ARRAY_SIZE (bdesc_2argimm); i++, d++)
   1199  1.1  mrg     if (d->code == fcode)
   1200  1.1  mrg       return nds32_expand_binopimm_builtin (d->icode, exp, target,
   1201  1.1  mrg 					    d->return_p, d->name);
   1202  1.1  mrg 
   1203  1.1  mrg   for (i = 0, d = bdesc_3arg; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
   1204  1.1  mrg     if (d->code == fcode)
   1205  1.1  mrg       return nds32_expand_triop_builtin (d->icode, exp, target, d->return_p);
   1206  1.1  mrg 
   1207  1.1  mrg   for (i = 0, d = bdesc_3argimm; i < ARRAY_SIZE (bdesc_3argimm); i++, d++)
   1208  1.1  mrg     if (d->code == fcode)
   1209  1.1  mrg       return nds32_expand_triopimm_builtin (d->icode, exp, target,
   1210  1.1  mrg 					    d->return_p, d->name);
   1211  1.1  mrg 
   1212  1.1  mrg   for (i = 0, d = bdesc_load; i < ARRAY_SIZE (bdesc_load); i++, d++)
   1213  1.1  mrg     if (d->code == fcode)
   1214  1.1  mrg       return nds32_expand_builtin_load (d->icode, exp, target);
   1215  1.1  mrg 
   1216  1.1  mrg   for (i = 0, d = bdesc_store; i < ARRAY_SIZE (bdesc_store); i++, d++)
   1217  1.1  mrg     if (d->code == fcode)
   1218  1.1  mrg       return nds32_expand_builtin_store (d->icode, exp, target);
   1219  1.1  mrg 
   1220  1.1  mrg   for (i = 0, d = bdesc_cctl; i < ARRAY_SIZE (bdesc_cctl); i++, d++)
   1221  1.1  mrg     if (d->code == fcode)
   1222  1.1  mrg       return nds32_expand_cctl_builtin (d->icode, exp, target,
   1223  1.1  mrg 					d->return_p, d->name);
   1224  1.1  mrg 
   1225  1.1  mrg   return NULL_RTX;
   1226  1.1  mrg }
   1227  1.1  mrg 
   1228  1.1  mrg static GTY(()) tree nds32_builtin_decls[NDS32_BUILTIN_COUNT];
   1229  1.1  mrg 
   1230  1.1  mrg /* Return the NDS32 builtin for CODE.  */
   1231  1.1  mrg tree
   1232  1.1  mrg nds32_builtin_decl_impl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
   1233  1.1  mrg {
   1234  1.1  mrg   if (code >= NDS32_BUILTIN_COUNT)
   1235  1.1  mrg     return error_mark_node;
   1236  1.1  mrg 
   1237  1.1  mrg   return nds32_builtin_decls[code];
   1238  1.1  mrg }
   1239  1.1  mrg 
   1240  1.1  mrg void
   1241  1.1  mrg nds32_init_builtins_impl (void)
   1242  1.1  mrg {
   1243  1.1  mrg #define ADD_NDS32_BUILTIN0(NAME, RET_TYPE, CODE)		\
   1244  1.1  mrg   nds32_builtin_decls[NDS32_BUILTIN_ ## CODE] =			\
   1245  1.1  mrg   add_builtin_function ("__builtin_nds32_" NAME,		\
   1246  1.1  mrg 			build_function_type_list (RET_TYPE##_type_node, \
   1247  1.1  mrg 						  NULL_TREE),		\
   1248  1.1  mrg 			NDS32_BUILTIN_ ## CODE, BUILT_IN_MD, NULL, NULL_TREE)
   1249  1.1  mrg 
   1250  1.1  mrg #define ADD_NDS32_BUILTIN1(NAME, RET_TYPE, ARG_TYPE, CODE)	\
   1251  1.1  mrg   nds32_builtin_decls[NDS32_BUILTIN_ ## CODE] =			\
   1252  1.1  mrg   add_builtin_function ("__builtin_nds32_" NAME,		\
   1253  1.1  mrg 			build_function_type_list (RET_TYPE##_type_node, \
   1254  1.1  mrg 						  ARG_TYPE##_type_node, \
   1255  1.1  mrg 						  NULL_TREE),		\
   1256  1.1  mrg 			NDS32_BUILTIN_ ## CODE, BUILT_IN_MD, NULL, NULL_TREE)
   1257  1.1  mrg 
   1258  1.1  mrg #define ADD_NDS32_BUILTIN2(NAME, RET_TYPE, ARG_TYPE1, ARG_TYPE2, CODE)	\
   1259  1.1  mrg   nds32_builtin_decls[NDS32_BUILTIN_ ## CODE] =				\
   1260  1.1  mrg   add_builtin_function ("__builtin_nds32_" NAME,			\
   1261  1.1  mrg 			build_function_type_list (RET_TYPE##_type_node, \
   1262  1.1  mrg 						  ARG_TYPE1##_type_node,\
   1263  1.1  mrg 						  ARG_TYPE2##_type_node,\
   1264  1.1  mrg 						  NULL_TREE),		\
   1265  1.1  mrg 			NDS32_BUILTIN_ ## CODE, BUILT_IN_MD, NULL, NULL_TREE)
   1266  1.1  mrg 
   1267  1.1  mrg #define ADD_NDS32_BUILTIN3(NAME, RET_TYPE,				\
   1268  1.1  mrg 			   ARG_TYPE1, ARG_TYPE2, ARG_TYPE3, CODE)	\
   1269  1.1  mrg   nds32_builtin_decls[NDS32_BUILTIN_ ## CODE] =				\
   1270  1.1  mrg   add_builtin_function ("__builtin_nds32_" NAME,			\
   1271  1.1  mrg 			build_function_type_list (RET_TYPE##_type_node,	\
   1272  1.1  mrg 						  ARG_TYPE1##_type_node,\
   1273  1.1  mrg 						  ARG_TYPE2##_type_node,\
   1274  1.1  mrg 						  ARG_TYPE3##_type_node,\
   1275  1.1  mrg 						  NULL_TREE),		\
   1276  1.1  mrg 			NDS32_BUILTIN_ ## CODE, BUILT_IN_MD, NULL, NULL_TREE)
   1277  1.1  mrg 
   1278  1.1  mrg   /* Looking for return type and argument can be found in tree.h file.  */
   1279  1.1  mrg   tree ptr_char_type_node = build_pointer_type (char_type_node);
   1280  1.1  mrg   tree ptr_uchar_type_node = build_pointer_type (unsigned_char_type_node);
   1281  1.1  mrg   tree ptr_ushort_type_node = build_pointer_type (short_unsigned_type_node);
   1282  1.1  mrg   tree ptr_short_type_node = build_pointer_type (short_integer_type_node);
   1283  1.1  mrg   tree ptr_uint_type_node = build_pointer_type (unsigned_type_node);
   1284  1.1  mrg   tree ptr_ulong_type_node = build_pointer_type (long_long_unsigned_type_node);
   1285  1.1  mrg   tree v4qi_type_node = build_vector_type (intQI_type_node, 4);
   1286  1.1  mrg   tree u_v4qi_type_node = build_vector_type (unsigned_intQI_type_node, 4);
   1287  1.1  mrg   tree v2hi_type_node = build_vector_type (intHI_type_node, 2);
   1288  1.1  mrg   tree u_v2hi_type_node = build_vector_type (unsigned_intHI_type_node, 2);
   1289  1.1  mrg   tree v2si_type_node = build_vector_type (intSI_type_node, 2);
   1290  1.1  mrg   tree u_v2si_type_node = build_vector_type (unsigned_intSI_type_node, 2);
   1291  1.1  mrg 
   1292  1.1  mrg   /* Cache.  */
   1293  1.1  mrg   ADD_NDS32_BUILTIN1 ("isync", void, ptr_uint, ISYNC);
   1294  1.1  mrg   ADD_NDS32_BUILTIN0 ("isb", void, ISB);
   1295  1.1  mrg   ADD_NDS32_BUILTIN0 ("dsb", void, DSB);
   1296  1.1  mrg   ADD_NDS32_BUILTIN0 ("msync_all", void, MSYNC_ALL);
   1297  1.1  mrg   ADD_NDS32_BUILTIN0 ("msync_store", void, MSYNC_STORE);
   1298  1.1  mrg 
   1299  1.1  mrg   /* Register Transfer.  */
   1300  1.1  mrg   ADD_NDS32_BUILTIN1 ("mfsr", unsigned, integer, MFSR);
   1301  1.1  mrg   ADD_NDS32_BUILTIN1 ("mfusr", unsigned, integer, MFUSR);
   1302  1.1  mrg   ADD_NDS32_BUILTIN2 ("mtsr", void, unsigned, integer, MTSR);
   1303  1.1  mrg   ADD_NDS32_BUILTIN2 ("mtsr_isb", void, unsigned, integer, MTSR_ISB);
   1304  1.1  mrg   ADD_NDS32_BUILTIN2 ("mtsr_dsb", void, unsigned, integer, MTSR_DSB);
   1305  1.1  mrg   ADD_NDS32_BUILTIN2 ("mtusr", void, unsigned, integer, MTUSR);
   1306  1.1  mrg 
   1307  1.1  mrg   /* FPU Register Transfer.  */
   1308  1.1  mrg   ADD_NDS32_BUILTIN0 ("fmfcsr", unsigned, FMFCSR);
   1309  1.1  mrg   ADD_NDS32_BUILTIN1 ("fmtcsr", void, unsigned, FMTCSR);
   1310  1.1  mrg   ADD_NDS32_BUILTIN0 ("fmfcfg", unsigned, FMFCFG);
   1311  1.1  mrg   ADD_NDS32_BUILTIN2 ("fcpyss", float, float, float, FCPYSS);
   1312  1.1  mrg   ADD_NDS32_BUILTIN2 ("fcpynss", float, float, float, FCPYNSS);
   1313  1.1  mrg   ADD_NDS32_BUILTIN2 ("fcpysd", double, double, double, FCPYSD);
   1314  1.1  mrg   ADD_NDS32_BUILTIN2 ("fcpynsd", double, double, double, FCPYNSD);
   1315  1.1  mrg 
   1316  1.1  mrg   /* Interrupt.  */
   1317  1.1  mrg   ADD_NDS32_BUILTIN0 ("setgie_en", void, SETGIE_EN);
   1318  1.1  mrg   ADD_NDS32_BUILTIN0 ("setgie_dis", void, SETGIE_DIS);
   1319  1.1  mrg   ADD_NDS32_BUILTIN0 ("gie_en", void, GIE_EN);
   1320  1.1  mrg   ADD_NDS32_BUILTIN0 ("gie_dis", void, GIE_DIS);
   1321  1.1  mrg   ADD_NDS32_BUILTIN1 ("enable_int", void, integer, ENABLE_INT);
   1322  1.1  mrg   ADD_NDS32_BUILTIN1 ("disable_int", void, integer, DISABLE_INT);
   1323  1.1  mrg   ADD_NDS32_BUILTIN0 ("set_pending_swint", void, SET_PENDING_SWINT);
   1324  1.1  mrg   ADD_NDS32_BUILTIN0 ("clr_pending_swint", void, CLR_PENDING_SWINT);
   1325  1.1  mrg   ADD_NDS32_BUILTIN0 ("get_all_pending_int", unsigned, GET_ALL_PENDING_INT);
   1326  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_pending_int", unsigned, integer, GET_PENDING_INT);
   1327  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_int_priority", unsigned, integer, GET_INT_PRIORITY);
   1328  1.1  mrg   ADD_NDS32_BUILTIN2 ("set_int_priority", void, integer, integer,
   1329  1.1  mrg 		      SET_INT_PRIORITY);
   1330  1.1  mrg   ADD_NDS32_BUILTIN1 ("clr_pending_hwint", void, integer, CLR_PENDING_HWINT);
   1331  1.1  mrg   ADD_NDS32_BUILTIN1 ("set_trig_level", void, integer, SET_TRIG_LEVEL);
   1332  1.1  mrg   ADD_NDS32_BUILTIN1 ("set_trig_edge", void, integer, SET_TRIG_EDGE);
   1333  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_trig_type", unsigned, integer, GET_TRIG_TYPE);
   1334  1.1  mrg 
   1335  1.1  mrg   /* Load and Store  */
   1336  1.1  mrg   ADD_NDS32_BUILTIN1 ("llw", unsigned, ptr_uint, LLW);
   1337  1.1  mrg   ADD_NDS32_BUILTIN1 ("lwup", unsigned, ptr_uint, LWUP);
   1338  1.1  mrg   ADD_NDS32_BUILTIN1 ("lbup", char, ptr_uchar, LBUP);
   1339  1.1  mrg   ADD_NDS32_BUILTIN2 ("scw", unsigned, ptr_uint, unsigned, SCW);
   1340  1.1  mrg   ADD_NDS32_BUILTIN2 ("swup", void, ptr_uint, unsigned, SWUP);
   1341  1.1  mrg   ADD_NDS32_BUILTIN2 ("sbup", void, ptr_uchar, char, SBUP);
   1342  1.1  mrg 
   1343  1.1  mrg   /* CCTL  */
   1344  1.1  mrg   ADD_NDS32_BUILTIN0 ("cctl_l1d_invalall", void, CCTL_L1D_INVALALL);
   1345  1.1  mrg   ADD_NDS32_BUILTIN0 ("cctl_l1d_wball_alvl", void, CCTL_L1D_WBALL_ALVL);
   1346  1.1  mrg   ADD_NDS32_BUILTIN0 ("cctl_l1d_wball_one_lvl", void, CCTL_L1D_WBALL_ONE_LVL);
   1347  1.1  mrg   ADD_NDS32_BUILTIN2 ("cctl_va_lck", void, integer, ptr_uint, CCTL_VA_LCK);
   1348  1.1  mrg   ADD_NDS32_BUILTIN2 ("cctl_idx_wbinval", void, integer, unsigned,
   1349  1.1  mrg 		      CCTL_IDX_WBINVAL);
   1350  1.1  mrg   ADD_NDS32_BUILTIN2 ("cctl_va_wbinval_l1", void, integer, ptr_uint,
   1351  1.1  mrg 		      CCTL_VA_WBINVAL_L1);
   1352  1.1  mrg   ADD_NDS32_BUILTIN2 ("cctl_va_wbinval_la", void, integer, ptr_uint,
   1353  1.1  mrg 		      CCTL_VA_WBINVAL_LA);
   1354  1.1  mrg   ADD_NDS32_BUILTIN2 ("cctl_idx_read", unsigned, integer, unsigned,
   1355  1.1  mrg 		      CCTL_IDX_READ);
   1356  1.1  mrg   ADD_NDS32_BUILTIN3 ("cctl_idx_write", void, integer, unsigned, unsigned,
   1357  1.1  mrg 		      CCTL_IDX_WRITE);
   1358  1.1  mrg 
   1359  1.1  mrg   /* PREFETCH  */
   1360  1.1  mrg   ADD_NDS32_BUILTIN3 ("dpref_qw", void, ptr_uchar, unsigned, integer, DPREF_QW);
   1361  1.1  mrg   ADD_NDS32_BUILTIN3 ("dpref_hw", void, ptr_ushort, unsigned, integer,
   1362  1.1  mrg 		      DPREF_HW);
   1363  1.1  mrg   ADD_NDS32_BUILTIN3 ("dpref_w", void, ptr_uint, unsigned, integer, DPREF_W);
   1364  1.1  mrg   ADD_NDS32_BUILTIN3 ("dpref_dw", void, ptr_ulong, unsigned, integer, DPREF_DW);
   1365  1.1  mrg 
   1366  1.1  mrg   /* Performance Extension  */
   1367  1.1  mrg   ADD_NDS32_BUILTIN1 ("pe_abs", integer, integer, ABS);
   1368  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_ave", integer, integer, integer, AVE);
   1369  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_bclr", unsigned, unsigned, unsigned, BCLR);
   1370  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_bset", unsigned, unsigned, unsigned, BSET);
   1371  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_btgl", unsigned, unsigned, unsigned, BTGL);
   1372  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_btst", unsigned, unsigned, unsigned, BTST);
   1373  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_clip", unsigned, integer, unsigned, CLIP);
   1374  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe_clips", integer, integer, unsigned, CLIPS);
   1375  1.1  mrg   ADD_NDS32_BUILTIN1 ("pe_clz", unsigned, unsigned, CLZ);
   1376  1.1  mrg   ADD_NDS32_BUILTIN1 ("pe_clo", unsigned, unsigned, CLO);
   1377  1.1  mrg 
   1378  1.1  mrg   /* Performance Extension 2  */
   1379  1.1  mrg   ADD_NDS32_BUILTIN3 ("pe2_bse", void, ptr_uint, unsigned, ptr_uint, BSE);
   1380  1.1  mrg   ADD_NDS32_BUILTIN3 ("pe2_bsp", void, ptr_uint, unsigned, ptr_uint, BSP);
   1381  1.1  mrg   ADD_NDS32_BUILTIN2 ("pe2_pbsad", unsigned, unsigned, unsigned, PBSAD);
   1382  1.1  mrg   ADD_NDS32_BUILTIN3 ("pe2_pbsada", unsigned, unsigned, unsigned, unsigned,
   1383  1.1  mrg 		      PBSADA);
   1384  1.1  mrg 
   1385  1.1  mrg   /* String Extension  */
   1386  1.1  mrg   ADD_NDS32_BUILTIN2 ("se_ffb", integer, unsigned, unsigned, FFB);
   1387  1.1  mrg   ADD_NDS32_BUILTIN2 ("se_ffmism", integer, unsigned, unsigned, FFMISM);
   1388  1.1  mrg   ADD_NDS32_BUILTIN2 ("se_flmism", integer, unsigned, unsigned, FLMISM);
   1389  1.1  mrg 
   1390  1.1  mrg   /* SATURATION  */
   1391  1.1  mrg   ADD_NDS32_BUILTIN2 ("kaddw", integer, integer, integer, KADDW);
   1392  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksubw", integer, integer, integer, KSUBW);
   1393  1.1  mrg   ADD_NDS32_BUILTIN2 ("kaddh", integer, integer, integer, KADDH);
   1394  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksubh", integer, integer, integer, KSUBH);
   1395  1.1  mrg   ADD_NDS32_BUILTIN2 ("kdmbb", integer, unsigned, unsigned, KDMBB);
   1396  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kdmbb", integer, v2hi, v2hi, V_KDMBB);
   1397  1.1  mrg   ADD_NDS32_BUILTIN2 ("kdmbt", integer, unsigned, unsigned, KDMBT);
   1398  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kdmbt", integer, v2hi, v2hi, V_KDMBT);
   1399  1.1  mrg   ADD_NDS32_BUILTIN2 ("kdmtb", integer, unsigned, unsigned, KDMTB);
   1400  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kdmtb", integer, v2hi, v2hi, V_KDMTB);
   1401  1.1  mrg   ADD_NDS32_BUILTIN2 ("kdmtt", integer, unsigned, unsigned, KDMTT);
   1402  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kdmtt", integer, v2hi, v2hi, V_KDMTT);
   1403  1.1  mrg   ADD_NDS32_BUILTIN2 ("khmbb", integer, unsigned, unsigned, KHMBB);
   1404  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khmbb", integer, v2hi, v2hi, V_KHMBB);
   1405  1.1  mrg   ADD_NDS32_BUILTIN2 ("khmbt", integer, unsigned, unsigned, KHMBT);
   1406  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khmbt", integer, v2hi, v2hi, V_KHMBT);
   1407  1.1  mrg   ADD_NDS32_BUILTIN2 ("khmtb", integer, unsigned, unsigned, KHMTB);
   1408  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khmtb", integer, v2hi, v2hi, V_KHMTB);
   1409  1.1  mrg   ADD_NDS32_BUILTIN2 ("khmtt", integer, unsigned, unsigned, KHMTT);
   1410  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khmtt", integer, v2hi, v2hi, V_KHMTT);
   1411  1.1  mrg   ADD_NDS32_BUILTIN2 ("kslraw", integer, integer, integer, KSLRAW);
   1412  1.1  mrg   ADD_NDS32_BUILTIN2 ("kslraw_u", integer, integer, integer, KSLRAW_U);
   1413  1.1  mrg   ADD_NDS32_BUILTIN0 ("rdov", unsigned, RDOV);
   1414  1.1  mrg   ADD_NDS32_BUILTIN0 ("clrov", void, CLROV);
   1415  1.1  mrg 
   1416  1.1  mrg   /* ROTR  */
   1417  1.1  mrg   ADD_NDS32_BUILTIN2 ("rotr", unsigned, unsigned, unsigned, ROTR);
   1418  1.1  mrg 
   1419  1.1  mrg   /* Swap  */
   1420  1.1  mrg   ADD_NDS32_BUILTIN1 ("wsbh", unsigned, unsigned, WSBH);
   1421  1.1  mrg 
   1422  1.1  mrg   /* System  */
   1423  1.1  mrg   ADD_NDS32_BUILTIN2 ("svs", unsigned, integer, integer, SVS);
   1424  1.1  mrg   ADD_NDS32_BUILTIN2 ("sva", unsigned, integer, integer, SVA);
   1425  1.1  mrg   ADD_NDS32_BUILTIN1 ("jr_itoff", void, unsigned, JR_ITOFF);
   1426  1.1  mrg   ADD_NDS32_BUILTIN1 ("jr_toff", void, unsigned, JR_TOFF);
   1427  1.1  mrg   ADD_NDS32_BUILTIN1 ("jral_iton", void, unsigned, JRAL_ITON);
   1428  1.1  mrg   ADD_NDS32_BUILTIN1 ("jral_ton", void, unsigned, JRAL_TON);
   1429  1.1  mrg   ADD_NDS32_BUILTIN1 ("ret_itoff", void, unsigned, RET_ITOFF);
   1430  1.1  mrg   ADD_NDS32_BUILTIN1 ("ret_toff", void, unsigned, RET_TOFF);
   1431  1.1  mrg   ADD_NDS32_BUILTIN0 ("standby_no_wake_grant", void, STANDBY_NO_WAKE_GRANT);
   1432  1.1  mrg   ADD_NDS32_BUILTIN0 ("standby_wake_grant", void, STANDBY_WAKE_GRANT);
   1433  1.1  mrg   ADD_NDS32_BUILTIN0 ("standby_wait_done", void, STANDBY_WAKE_DONE);
   1434  1.1  mrg   ADD_NDS32_BUILTIN1 ("break", void, unsigned, BREAK);
   1435  1.1  mrg   ADD_NDS32_BUILTIN1 ("syscall", void, unsigned, SYSCALL);
   1436  1.1  mrg   ADD_NDS32_BUILTIN0 ("nop", void, NOP);
   1437  1.1  mrg   ADD_NDS32_BUILTIN0 ("get_current_sp", unsigned, GET_CURRENT_SP);
   1438  1.1  mrg   ADD_NDS32_BUILTIN1 ("set_current_sp", void, unsigned, SET_CURRENT_SP);
   1439  1.1  mrg   ADD_NDS32_BUILTIN2 ("teqz", void, unsigned, unsigned, TEQZ);
   1440  1.1  mrg   ADD_NDS32_BUILTIN2 ("tnez", void, unsigned, unsigned, TNEZ);
   1441  1.1  mrg   ADD_NDS32_BUILTIN1 ("trap", void, unsigned, TRAP);
   1442  1.1  mrg   ADD_NDS32_BUILTIN0 ("return_address", unsigned, RETURN_ADDRESS);
   1443  1.1  mrg   ADD_NDS32_BUILTIN0 ("setend_big", void, SETEND_BIG);
   1444  1.1  mrg   ADD_NDS32_BUILTIN0 ("setend_little", void, SETEND_LITTLE);
   1445  1.1  mrg 
   1446  1.1  mrg   /* Schedule Barrier */
   1447  1.1  mrg   ADD_NDS32_BUILTIN0 ("schedule_barrier", void, SCHE_BARRIER);
   1448  1.1  mrg 
   1449  1.1  mrg   /* TLBOP  */
   1450  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_trd", void, unsigned, TLBOP_TRD);
   1451  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_twr", void, unsigned, TLBOP_TWR);
   1452  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_rwr", void, unsigned, TLBOP_RWR);
   1453  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_rwlk", void, unsigned, TLBOP_RWLK);
   1454  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_unlk", void, unsigned, TLBOP_UNLK);
   1455  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_pb", unsigned, unsigned, TLBOP_PB);
   1456  1.1  mrg   ADD_NDS32_BUILTIN1 ("tlbop_inv", void, unsigned, TLBOP_INV);
   1457  1.1  mrg   ADD_NDS32_BUILTIN0 ("tlbop_flua", void, TLBOP_FLUA);
   1458  1.1  mrg 
   1459  1.1  mrg   /* Unaligned Load/Store  */
   1460  1.1  mrg   ADD_NDS32_BUILTIN1 ("unaligned_load_hw", short_unsigned, ptr_ushort,
   1461  1.1  mrg 		      UALOAD_HW);
   1462  1.1  mrg   ADD_NDS32_BUILTIN1 ("unaligned_load_w", unsigned, ptr_uint, UALOAD_W);
   1463  1.1  mrg   ADD_NDS32_BUILTIN1 ("unaligned_load_dw", long_long_unsigned, ptr_ulong,
   1464  1.1  mrg 		      UALOAD_DW);
   1465  1.1  mrg   ADD_NDS32_BUILTIN2 ("unaligned_store_hw", void, ptr_ushort, short_unsigned,
   1466  1.1  mrg 		      UASTORE_HW);
   1467  1.1  mrg   ADD_NDS32_BUILTIN2 ("unaligned_store_w", void, ptr_uint, unsigned, UASTORE_W);
   1468  1.1  mrg   ADD_NDS32_BUILTIN2 ("unaligned_store_dw", void, ptr_ulong, long_long_unsigned,
   1469  1.1  mrg 		      UASTORE_DW);
   1470  1.1  mrg   ADD_NDS32_BUILTIN0 ("unaligned_feature", unsigned, UNALIGNED_FEATURE);
   1471  1.1  mrg   ADD_NDS32_BUILTIN0 ("enable_unaligned", void, ENABLE_UNALIGNED);
   1472  1.1  mrg   ADD_NDS32_BUILTIN0 ("disable_unaligned", void, DISABLE_UNALIGNED);
   1473  1.1  mrg 
   1474  1.1  mrg   /* DSP Extension: SIMD 16bit Add and Subtract.  */
   1475  1.1  mrg   ADD_NDS32_BUILTIN2 ("add16", unsigned, unsigned, unsigned, ADD16);
   1476  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uadd16", u_v2hi, u_v2hi, u_v2hi, V_UADD16);
   1477  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sadd16", v2hi, v2hi, v2hi, V_SADD16);
   1478  1.1  mrg   ADD_NDS32_BUILTIN2 ("radd16", unsigned, unsigned, unsigned, RADD16);
   1479  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_radd16", v2hi, v2hi, v2hi, V_RADD16);
   1480  1.1  mrg   ADD_NDS32_BUILTIN2 ("uradd16", unsigned, unsigned, unsigned, URADD16);
   1481  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uradd16", u_v2hi, u_v2hi, u_v2hi, V_URADD16);
   1482  1.1  mrg   ADD_NDS32_BUILTIN2 ("kadd16", unsigned, unsigned, unsigned, KADD16);
   1483  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kadd16", v2hi, v2hi, v2hi, V_KADD16);
   1484  1.1  mrg   ADD_NDS32_BUILTIN2 ("ukadd16", unsigned, unsigned, unsigned, UKADD16);
   1485  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ukadd16", u_v2hi, u_v2hi, u_v2hi, V_UKADD16);
   1486  1.1  mrg   ADD_NDS32_BUILTIN2 ("sub16", unsigned, unsigned, unsigned, SUB16);
   1487  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_usub16", u_v2hi, u_v2hi, u_v2hi, V_USUB16);
   1488  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ssub16", v2hi, v2hi, v2hi, V_SSUB16);
   1489  1.1  mrg   ADD_NDS32_BUILTIN2 ("rsub16", unsigned, unsigned, unsigned, RSUB16);
   1490  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_rsub16", v2hi, v2hi, v2hi, V_RSUB16);
   1491  1.1  mrg   ADD_NDS32_BUILTIN2 ("ursub16", unsigned, unsigned, unsigned, URSUB16);
   1492  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ursub16", u_v2hi, u_v2hi, u_v2hi, V_URSUB16);
   1493  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksub16", unsigned, unsigned, unsigned, KSUB16);
   1494  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ksub16", v2hi, v2hi, v2hi, V_KSUB16);
   1495  1.1  mrg   ADD_NDS32_BUILTIN2 ("uksub16", unsigned, unsigned, unsigned, UKSUB16);
   1496  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uksub16", u_v2hi, u_v2hi, u_v2hi, V_UKSUB16);
   1497  1.1  mrg   ADD_NDS32_BUILTIN2 ("cras16", unsigned, unsigned, unsigned, CRAS16);
   1498  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucras16", u_v2hi, u_v2hi, u_v2hi, V_UCRAS16);
   1499  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scras16", v2hi, v2hi, v2hi, V_SCRAS16);
   1500  1.1  mrg   ADD_NDS32_BUILTIN2 ("rcras16", unsigned, unsigned, unsigned, RCRAS16);
   1501  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_rcras16", v2hi, v2hi, v2hi, V_RCRAS16);
   1502  1.1  mrg   ADD_NDS32_BUILTIN2 ("urcras16", unsigned, unsigned, unsigned, URCRAS16);
   1503  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_urcras16", u_v2hi, u_v2hi, u_v2hi, V_URCRAS16);
   1504  1.1  mrg   ADD_NDS32_BUILTIN2 ("kcras16", unsigned, unsigned, unsigned, KCRAS16);
   1505  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kcras16", v2hi, v2hi, v2hi, V_KCRAS16);
   1506  1.1  mrg   ADD_NDS32_BUILTIN2 ("ukcras16", unsigned, unsigned, unsigned, UKCRAS16);
   1507  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ukcras16", u_v2hi, u_v2hi, u_v2hi, V_UKCRAS16);
   1508  1.1  mrg   ADD_NDS32_BUILTIN2 ("crsa16", unsigned, unsigned, unsigned, CRSA16);
   1509  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucrsa16", u_v2hi, u_v2hi, u_v2hi, V_UCRSA16);
   1510  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scrsa16", v2hi, v2hi, v2hi, V_SCRSA16);
   1511  1.1  mrg   ADD_NDS32_BUILTIN2 ("rcrsa16", unsigned, unsigned, unsigned, RCRSA16);
   1512  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_rcrsa16", v2hi, v2hi, v2hi, V_RCRSA16);
   1513  1.1  mrg   ADD_NDS32_BUILTIN2 ("urcrsa16", unsigned, unsigned, unsigned, URCRSA16);
   1514  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_urcrsa16", u_v2hi, u_v2hi, u_v2hi, V_URCRSA16);
   1515  1.1  mrg   ADD_NDS32_BUILTIN2 ("kcrsa16", unsigned, unsigned, unsigned, KCRSA16);
   1516  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kcrsa16", v2hi, v2hi, v2hi, V_KCRSA16);
   1517  1.1  mrg   ADD_NDS32_BUILTIN2 ("ukcrsa16", unsigned, unsigned, unsigned, UKCRSA16);
   1518  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ukcrsa16", u_v2hi, u_v2hi, u_v2hi, V_UKCRSA16);
   1519  1.1  mrg 
   1520  1.1  mrg   /* DSP Extension: SIMD 8bit Add and Subtract.  */
   1521  1.1  mrg   ADD_NDS32_BUILTIN2 ("add8", integer, integer, integer, ADD8);
   1522  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uadd8", u_v4qi, u_v4qi, u_v4qi, V_UADD8);
   1523  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sadd8", v4qi, v4qi, v4qi, V_SADD8);
   1524  1.1  mrg   ADD_NDS32_BUILTIN2 ("radd8", unsigned, unsigned, unsigned, RADD8);
   1525  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_radd8", v4qi, v4qi, v4qi, V_RADD8);
   1526  1.1  mrg   ADD_NDS32_BUILTIN2 ("uradd8", unsigned, unsigned, unsigned, URADD8);
   1527  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uradd8", u_v4qi, u_v4qi, u_v4qi, V_URADD8);
   1528  1.1  mrg   ADD_NDS32_BUILTIN2 ("kadd8", unsigned, unsigned, unsigned, KADD8);
   1529  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kadd8", v4qi, v4qi, v4qi, V_KADD8);
   1530  1.1  mrg   ADD_NDS32_BUILTIN2 ("ukadd8", unsigned, unsigned, unsigned, UKADD8);
   1531  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ukadd8", u_v4qi, u_v4qi, u_v4qi, V_UKADD8);
   1532  1.1  mrg   ADD_NDS32_BUILTIN2 ("sub8", integer, integer, integer, SUB8);
   1533  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_usub8", u_v4qi, u_v4qi, u_v4qi, V_USUB8);
   1534  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ssub8", v4qi, v4qi, v4qi, V_SSUB8);
   1535  1.1  mrg   ADD_NDS32_BUILTIN2 ("rsub8", unsigned, unsigned, unsigned, RSUB8);
   1536  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_rsub8", v4qi, v4qi, v4qi, V_RSUB8);
   1537  1.1  mrg   ADD_NDS32_BUILTIN2 ("ursub8", unsigned, unsigned, unsigned, URSUB8);
   1538  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ursub8", u_v4qi, u_v4qi, u_v4qi, V_URSUB8);
   1539  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksub8", unsigned, unsigned, unsigned, KSUB8);
   1540  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ksub8", v4qi, v4qi, v4qi, V_KSUB8);
   1541  1.1  mrg   ADD_NDS32_BUILTIN2 ("uksub8", unsigned, unsigned, unsigned, UKSUB8);
   1542  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uksub8", u_v4qi, u_v4qi, u_v4qi, V_UKSUB8);
   1543  1.1  mrg 
   1544  1.1  mrg   /* DSP Extension: SIMD 16bit Shift.  */
   1545  1.1  mrg   ADD_NDS32_BUILTIN2 ("sra16", unsigned, unsigned, unsigned, SRA16);
   1546  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sra16", v2hi, v2hi, unsigned, V_SRA16);
   1547  1.1  mrg   ADD_NDS32_BUILTIN2 ("sra16_u", unsigned, unsigned, unsigned, SRA16_U);
   1548  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sra16_u", v2hi, v2hi, unsigned, V_SRA16_U);
   1549  1.1  mrg   ADD_NDS32_BUILTIN2 ("srl16", unsigned, unsigned, unsigned, SRL16);
   1550  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_srl16", u_v2hi, u_v2hi, unsigned, V_SRL16);
   1551  1.1  mrg   ADD_NDS32_BUILTIN2 ("srl16_u", unsigned, unsigned, unsigned, SRL16_U);
   1552  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_srl16_u", u_v2hi, u_v2hi, unsigned, V_SRL16_U);
   1553  1.1  mrg   ADD_NDS32_BUILTIN2 ("sll16", unsigned, unsigned, unsigned, SLL16);
   1554  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sll16", u_v2hi, u_v2hi, unsigned, V_SLL16);
   1555  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksll16", unsigned, unsigned, unsigned, KSLL16);
   1556  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ksll16", v2hi, v2hi, unsigned, V_KSLL16);
   1557  1.1  mrg   ADD_NDS32_BUILTIN2 ("kslra16", unsigned, unsigned, unsigned, KSLRA16);
   1558  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kslra16", v2hi, v2hi, unsigned, V_KSLRA16);
   1559  1.1  mrg   ADD_NDS32_BUILTIN2 ("kslra16_u", unsigned, unsigned, unsigned, KSLRA16_U);
   1560  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kslra16_u", v2hi, v2hi, unsigned, V_KSLRA16_U);
   1561  1.1  mrg 
   1562  1.1  mrg   /* DSP Extension: 16bit Compare.  */
   1563  1.1  mrg   ADD_NDS32_BUILTIN2 ("cmpeq16", unsigned, unsigned, unsigned, CMPEQ16);
   1564  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmpeq16", u_v2hi, v2hi, v2hi, V_SCMPEQ16);
   1565  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmpeq16", u_v2hi, u_v2hi, u_v2hi, V_UCMPEQ16);
   1566  1.1  mrg   ADD_NDS32_BUILTIN2 ("scmplt16", unsigned, unsigned, unsigned, SCMPLT16);
   1567  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmplt16", u_v2hi, v2hi, v2hi, V_SCMPLT16);
   1568  1.1  mrg   ADD_NDS32_BUILTIN2 ("scmple16", unsigned, unsigned, unsigned, SCMPLE16);
   1569  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmple16", u_v2hi, v2hi, v2hi, V_SCMPLE16);
   1570  1.1  mrg   ADD_NDS32_BUILTIN2 ("ucmplt16", unsigned, unsigned, unsigned, UCMPLT16);
   1571  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmplt16", u_v2hi, u_v2hi, u_v2hi, V_UCMPLT16);
   1572  1.1  mrg   ADD_NDS32_BUILTIN2 ("ucmple16", unsigned, unsigned, unsigned, UCMPLE16);
   1573  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmple16", u_v2hi, u_v2hi, u_v2hi, V_UCMPLE16);
   1574  1.1  mrg 
   1575  1.1  mrg   /* DSP Extension: 8bit Compare.  */
   1576  1.1  mrg   ADD_NDS32_BUILTIN2 ("cmpeq8", unsigned, unsigned, unsigned, CMPEQ8);
   1577  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmpeq8", u_v4qi, v4qi, v4qi, V_SCMPEQ8);
   1578  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmpeq8", u_v4qi, u_v4qi, u_v4qi, V_UCMPEQ8);
   1579  1.1  mrg   ADD_NDS32_BUILTIN2 ("scmplt8", unsigned, unsigned, unsigned, SCMPLT8);
   1580  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmplt8", u_v4qi, v4qi, v4qi, V_SCMPLT8);
   1581  1.1  mrg   ADD_NDS32_BUILTIN2 ("scmple8", unsigned, unsigned, unsigned, SCMPLE8);
   1582  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_scmple8", u_v4qi, v4qi, v4qi, V_SCMPLE8);
   1583  1.1  mrg   ADD_NDS32_BUILTIN2 ("ucmplt8", unsigned, unsigned, unsigned, UCMPLT8);
   1584  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmplt8", u_v4qi, u_v4qi, u_v4qi, V_UCMPLT8);
   1585  1.1  mrg   ADD_NDS32_BUILTIN2 ("ucmple8", unsigned, unsigned, unsigned, UCMPLE8);
   1586  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_ucmple8", u_v4qi, u_v4qi, u_v4qi, V_UCMPLE8);
   1587  1.1  mrg 
   1588  1.1  mrg   /* DSP Extension: SIMD 16bit MISC.  */
   1589  1.1  mrg   ADD_NDS32_BUILTIN2 ("smin16", unsigned, unsigned, unsigned, SMIN16);
   1590  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smin16", v2hi, v2hi, v2hi, V_SMIN16);
   1591  1.1  mrg   ADD_NDS32_BUILTIN2 ("umin16", unsigned, unsigned, unsigned, UMIN16);
   1592  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umin16", u_v2hi, u_v2hi, u_v2hi, V_UMIN16);
   1593  1.1  mrg   ADD_NDS32_BUILTIN2 ("smax16", unsigned, unsigned, unsigned, SMAX16);
   1594  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smax16", v2hi, v2hi, v2hi, V_SMAX16);
   1595  1.1  mrg   ADD_NDS32_BUILTIN2 ("umax16", unsigned, unsigned, unsigned, UMAX16);
   1596  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umax16", u_v2hi, u_v2hi, u_v2hi, V_UMAX16);
   1597  1.1  mrg   ADD_NDS32_BUILTIN2 ("sclip16", unsigned, unsigned, unsigned, SCLIP16);
   1598  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_sclip16", v2hi, v2hi, unsigned, V_SCLIP16);
   1599  1.1  mrg   ADD_NDS32_BUILTIN2 ("uclip16", unsigned, unsigned, unsigned, UCLIP16);
   1600  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_uclip16", v2hi, v2hi, unsigned, V_UCLIP16);
   1601  1.1  mrg   ADD_NDS32_BUILTIN2 ("khm16", unsigned, unsigned, unsigned, KHM16);
   1602  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khm16", v2hi, v2hi, v2hi, V_KHM16);
   1603  1.1  mrg   ADD_NDS32_BUILTIN2 ("khmx16", unsigned, unsigned, unsigned, KHMX16);
   1604  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_khmx16", v2hi, v2hi, v2hi, V_KHMX16);
   1605  1.1  mrg   ADD_NDS32_BUILTIN1 ("kabs16", unsigned, unsigned, KABS16);
   1606  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_kabs16", v2hi, v2hi, V_KABS16);
   1607  1.1  mrg   ADD_NDS32_BUILTIN2 ("smul16", long_long_unsigned, unsigned, unsigned, SMUL16);
   1608  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smul16", v2si, v2hi, v2hi, V_SMUL16);
   1609  1.1  mrg   ADD_NDS32_BUILTIN2 ("smulx16",
   1610  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, SMULX16);
   1611  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smulx16", v2si, v2hi, v2hi, V_SMULX16);
   1612  1.1  mrg   ADD_NDS32_BUILTIN2 ("umul16", long_long_unsigned, unsigned, unsigned, UMUL16);
   1613  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umul16", u_v2si, u_v2hi, u_v2hi, V_UMUL16);
   1614  1.1  mrg   ADD_NDS32_BUILTIN2 ("umulx16",
   1615  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, UMULX16);
   1616  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umulx16", u_v2si, u_v2hi, u_v2hi, V_UMULX16);
   1617  1.1  mrg 
   1618  1.1  mrg   /* DSP Extension: SIMD 8bit MISC.  */
   1619  1.1  mrg   ADD_NDS32_BUILTIN2 ("smin8", unsigned, unsigned, unsigned, SMIN8);
   1620  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smin8", v4qi, v4qi, v4qi, V_SMIN8);
   1621  1.1  mrg   ADD_NDS32_BUILTIN2 ("umin8", unsigned, unsigned, unsigned, UMIN8);
   1622  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umin8", u_v4qi, u_v4qi, u_v4qi, V_UMIN8);
   1623  1.1  mrg   ADD_NDS32_BUILTIN2 ("smax8", unsigned, unsigned, unsigned, SMAX8);
   1624  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smax8", v4qi, v4qi, v4qi, V_SMAX8);
   1625  1.1  mrg   ADD_NDS32_BUILTIN2 ("umax8", unsigned, unsigned, unsigned, UMAX8);
   1626  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_umax8", u_v4qi, u_v4qi, u_v4qi, V_UMAX8);
   1627  1.1  mrg   ADD_NDS32_BUILTIN1 ("kabs8", unsigned, unsigned, KABS8);
   1628  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_kabs8", v4qi, v4qi, V_KABS8);
   1629  1.1  mrg 
   1630  1.1  mrg   /* DSP Extension: 8bit Unpacking.  */
   1631  1.1  mrg   ADD_NDS32_BUILTIN1 ("sunpkd810", unsigned, unsigned, SUNPKD810);
   1632  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_sunpkd810", v2hi, v4qi, V_SUNPKD810);
   1633  1.1  mrg   ADD_NDS32_BUILTIN1 ("sunpkd820", unsigned, unsigned, SUNPKD820);
   1634  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_sunpkd820", v2hi, v4qi, V_SUNPKD820);
   1635  1.1  mrg   ADD_NDS32_BUILTIN1 ("sunpkd830", unsigned, unsigned, SUNPKD830);
   1636  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_sunpkd830", v2hi, v4qi, V_SUNPKD830);
   1637  1.1  mrg   ADD_NDS32_BUILTIN1 ("sunpkd831", unsigned, unsigned, SUNPKD831);
   1638  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_sunpkd831", v2hi, v4qi, V_SUNPKD831);
   1639  1.1  mrg   ADD_NDS32_BUILTIN1 ("zunpkd810", unsigned, unsigned, ZUNPKD810);
   1640  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_zunpkd810", u_v2hi, u_v4qi, V_ZUNPKD810);
   1641  1.1  mrg   ADD_NDS32_BUILTIN1 ("zunpkd820", unsigned, unsigned, ZUNPKD820);
   1642  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_zunpkd820", u_v2hi, u_v4qi, V_ZUNPKD820);
   1643  1.1  mrg   ADD_NDS32_BUILTIN1 ("zunpkd830", unsigned, unsigned, ZUNPKD830);
   1644  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_zunpkd830", u_v2hi, u_v4qi, V_ZUNPKD830);
   1645  1.1  mrg   ADD_NDS32_BUILTIN1 ("zunpkd831", unsigned, unsigned, ZUNPKD831);
   1646  1.1  mrg   ADD_NDS32_BUILTIN1 ("v_zunpkd831", u_v2hi, u_v4qi, V_ZUNPKD831);
   1647  1.1  mrg 
   1648  1.1  mrg   /* DSP Extension: 32bit Add and Subtract.  */
   1649  1.1  mrg   ADD_NDS32_BUILTIN2 ("raddw", integer, integer, integer, RADDW);
   1650  1.1  mrg   ADD_NDS32_BUILTIN2 ("uraddw", unsigned, unsigned, unsigned, URADDW);
   1651  1.1  mrg   ADD_NDS32_BUILTIN2 ("rsubw", integer, integer, integer, RSUBW);
   1652  1.1  mrg   ADD_NDS32_BUILTIN2 ("ursubw", unsigned, unsigned, unsigned, URSUBW);
   1653  1.1  mrg 
   1654  1.1  mrg   /* DSP Extension: 32bit Shift.  */
   1655  1.1  mrg   ADD_NDS32_BUILTIN2 ("sra_u", integer, integer, unsigned, SRA_U);
   1656  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksll", integer, integer, unsigned, KSLL);
   1657  1.1  mrg 
   1658  1.1  mrg   /* DSP Extension: 16bit Packing.  */
   1659  1.1  mrg   ADD_NDS32_BUILTIN2 ("pkbb16", unsigned, unsigned, unsigned, PKBB16);
   1660  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_pkbb16", u_v2hi, u_v2hi, u_v2hi, V_PKBB16);
   1661  1.1  mrg   ADD_NDS32_BUILTIN2 ("pkbt16", unsigned, unsigned, unsigned, PKBT16);
   1662  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_pkbt16", u_v2hi, u_v2hi, u_v2hi, V_PKBT16);
   1663  1.1  mrg   ADD_NDS32_BUILTIN2 ("pktb16", unsigned, unsigned, unsigned, PKTB16);
   1664  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_pktb16", u_v2hi, u_v2hi, u_v2hi, V_PKTB16);
   1665  1.1  mrg   ADD_NDS32_BUILTIN2 ("pktt16", unsigned, unsigned, unsigned, PKTT16);
   1666  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_pktt16", u_v2hi, u_v2hi, u_v2hi, V_PKTT16);
   1667  1.1  mrg 
   1668  1.1  mrg   /* DSP Extension: Signed MSW 32x32 Multiply and ADD.  */
   1669  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmul", integer, integer, integer, SMMUL);
   1670  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmul_u", integer, integer, integer, SMMUL_U);
   1671  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmac", integer, integer, integer, integer, KMMAC);
   1672  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmac_u", integer, integer, integer, integer, KMMAC_U);
   1673  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmsb", integer, integer, integer, integer, KMMSB);
   1674  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmsb_u", integer, integer, integer, integer, KMMSB_U);
   1675  1.1  mrg   ADD_NDS32_BUILTIN2 ("kwmmul", integer, integer, integer, KWMMUL);
   1676  1.1  mrg   ADD_NDS32_BUILTIN2 ("kwmmul_u", integer, integer, integer, KWMMUL_U);
   1677  1.1  mrg 
   1678  1.1  mrg   /* DSP Extension: Most Significant Word 32x16 Multiply and ADD.  */
   1679  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmwb", integer, integer, unsigned, SMMWB);
   1680  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smmwb", integer, integer, v2hi, V_SMMWB);
   1681  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmwb_u", integer, integer, unsigned, SMMWB_U);
   1682  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smmwb_u", integer, integer, v2hi, V_SMMWB_U);
   1683  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmwt", integer, integer, unsigned, SMMWT);
   1684  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smmwt", integer, integer, v2hi, V_SMMWT);
   1685  1.1  mrg   ADD_NDS32_BUILTIN2 ("smmwt_u", integer, integer, unsigned, SMMWT_U);
   1686  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smmwt_u", integer, integer, v2hi, V_SMMWT_U);
   1687  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmawb", integer, integer, integer, unsigned, KMMAWB);
   1688  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmmawb", integer, integer, integer, v2hi, V_KMMAWB);
   1689  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmawb_u",
   1690  1.1  mrg 		      integer, integer, integer, unsigned, KMMAWB_U);
   1691  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmmawb_u",
   1692  1.1  mrg 		      integer, integer, integer, v2hi, V_KMMAWB_U);
   1693  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmawt", integer, integer, integer, unsigned, KMMAWT);
   1694  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmmawt", integer, integer, integer, v2hi, V_KMMAWT);
   1695  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmmawt_u",
   1696  1.1  mrg 		      integer, integer, integer, unsigned, KMMAWT_U);
   1697  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmmawt_u",
   1698  1.1  mrg 		      integer, integer, integer, v2hi, V_KMMAWT_U);
   1699  1.1  mrg 
   1700  1.1  mrg   /* DSP Extension: Signed 16bit Multiply with ADD/Subtract.  */
   1701  1.1  mrg   ADD_NDS32_BUILTIN2 ("smbb", integer, unsigned, unsigned, SMBB);
   1702  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smbb", integer, v2hi, v2hi, V_SMBB);
   1703  1.1  mrg   ADD_NDS32_BUILTIN2 ("smbt", integer, unsigned, unsigned, SMBT);
   1704  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smbt", integer, v2hi, v2hi, V_SMBT);
   1705  1.1  mrg   ADD_NDS32_BUILTIN2 ("smtt", integer, unsigned, unsigned, SMTT);
   1706  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smtt", integer, v2hi, v2hi, V_SMTT);
   1707  1.1  mrg   ADD_NDS32_BUILTIN2 ("kmda", integer, unsigned, unsigned, KMDA);
   1708  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kmda", integer, v2hi, v2hi, V_KMDA);
   1709  1.1  mrg   ADD_NDS32_BUILTIN2 ("kmxda", integer, unsigned, unsigned, KMXDA);
   1710  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_kmxda", integer, v2hi, v2hi, V_KMXDA);
   1711  1.1  mrg   ADD_NDS32_BUILTIN2 ("smds", integer, unsigned, unsigned, SMDS);
   1712  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smds", integer, v2hi, v2hi, V_SMDS);
   1713  1.1  mrg   ADD_NDS32_BUILTIN2 ("smdrs", integer, unsigned, unsigned, SMDRS);
   1714  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smdrs", integer, v2hi, v2hi, V_SMDRS);
   1715  1.1  mrg   ADD_NDS32_BUILTIN2 ("smxds", integer, unsigned, unsigned, SMXDS);
   1716  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smxds", integer, v2hi, v2hi, V_SMXDS);
   1717  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmabb", integer, integer, unsigned, unsigned, KMABB);
   1718  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmabb", integer, integer, v2hi, v2hi, V_KMABB);
   1719  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmabt", integer, integer, unsigned, unsigned, KMABT);
   1720  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmabt", integer, integer, v2hi, v2hi, V_KMABT);
   1721  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmatt", integer, integer, unsigned, unsigned, KMATT);
   1722  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmatt", integer, integer, v2hi, v2hi, V_KMATT);
   1723  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmada", integer, integer, unsigned, unsigned, KMADA);
   1724  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmada", integer, integer, v2hi, v2hi, V_KMADA);
   1725  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmaxda", integer, integer, unsigned, unsigned, KMAXDA);
   1726  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmaxda", integer, integer, v2hi, v2hi, V_KMAXDA);
   1727  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmads", integer, integer, unsigned, unsigned, KMADS);
   1728  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmads", integer, integer, v2hi, v2hi, V_KMADS);
   1729  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmadrs", integer, integer, unsigned, unsigned, KMADRS);
   1730  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmadrs", integer, integer, v2hi, v2hi, V_KMADRS);
   1731  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmaxds", integer, integer, unsigned, unsigned, KMAXDS);
   1732  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmaxds", integer, integer, v2hi, v2hi, V_KMAXDS);
   1733  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmsda", integer, integer, unsigned, unsigned, KMSDA);
   1734  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmsda", integer, integer, v2hi, v2hi, V_KMSDA);
   1735  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmsxda", integer, integer, unsigned, unsigned, KMSXDA);
   1736  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_kmsxda", integer, integer, v2hi, v2hi, V_KMSXDA);
   1737  1.1  mrg 
   1738  1.1  mrg   /* DSP Extension: Signed 16bit Multiply with 64bit ADD/Subtract.  */
   1739  1.1  mrg   ADD_NDS32_BUILTIN2 ("smal", long_long_integer,
   1740  1.1  mrg 		      long_long_integer, unsigned, SMAL);
   1741  1.1  mrg   ADD_NDS32_BUILTIN2 ("v_smal", long_long_integer,
   1742  1.1  mrg 		      long_long_integer, v2hi, V_SMAL);
   1743  1.1  mrg 
   1744  1.1  mrg   /* DSP Extension: 32bit MISC.  */
   1745  1.1  mrg   ADD_NDS32_BUILTIN2 ("bitrev", unsigned, unsigned, unsigned, BITREV);
   1746  1.1  mrg   ADD_NDS32_BUILTIN2 ("wext", unsigned, long_long_integer, unsigned, WEXT);
   1747  1.1  mrg   ADD_NDS32_BUILTIN3 ("bpick", unsigned, unsigned, unsigned, unsigned, BPICK);
   1748  1.1  mrg   ADD_NDS32_BUILTIN3 ("insb", unsigned, unsigned, unsigned, unsigned, INSB);
   1749  1.1  mrg 
   1750  1.1  mrg   /* DSP Extension: 64bit Add and Subtract.  */
   1751  1.1  mrg   ADD_NDS32_BUILTIN2 ("sadd64", long_long_integer,
   1752  1.1  mrg 		      long_long_integer, long_long_integer, SADD64);
   1753  1.1  mrg   ADD_NDS32_BUILTIN2 ("uadd64", long_long_unsigned,
   1754  1.1  mrg 		      long_long_unsigned, long_long_unsigned, UADD64);
   1755  1.1  mrg   ADD_NDS32_BUILTIN2 ("radd64", long_long_integer,
   1756  1.1  mrg 		      long_long_integer, long_long_integer, RADD64);
   1757  1.1  mrg   ADD_NDS32_BUILTIN2 ("uradd64", long_long_unsigned,
   1758  1.1  mrg 		      long_long_unsigned, long_long_unsigned, URADD64);
   1759  1.1  mrg   ADD_NDS32_BUILTIN2 ("kadd64", long_long_integer,
   1760  1.1  mrg 		      long_long_integer, long_long_integer, KADD64);
   1761  1.1  mrg   ADD_NDS32_BUILTIN2 ("ukadd64", long_long_unsigned,
   1762  1.1  mrg 		      long_long_unsigned, long_long_unsigned, UKADD64);
   1763  1.1  mrg   ADD_NDS32_BUILTIN2 ("ssub64", long_long_integer,
   1764  1.1  mrg 		      long_long_integer, long_long_integer, SSUB64);
   1765  1.1  mrg   ADD_NDS32_BUILTIN2 ("usub64", long_long_unsigned,
   1766  1.1  mrg 		      long_long_unsigned, long_long_unsigned, USUB64);
   1767  1.1  mrg   ADD_NDS32_BUILTIN2 ("rsub64", long_long_integer,
   1768  1.1  mrg 		      long_long_integer, long_long_integer, RSUB64);
   1769  1.1  mrg   ADD_NDS32_BUILTIN2 ("ursub64", long_long_unsigned,
   1770  1.1  mrg 		      long_long_unsigned, long_long_unsigned, URSUB64);
   1771  1.1  mrg   ADD_NDS32_BUILTIN2 ("ksub64", long_long_integer,
   1772  1.1  mrg 		      long_long_integer, long_long_integer, KSUB64);
   1773  1.1  mrg   ADD_NDS32_BUILTIN2 ("uksub64", long_long_unsigned,
   1774  1.1  mrg 		      long_long_unsigned, long_long_unsigned, UKSUB64);
   1775  1.1  mrg 
   1776  1.1  mrg   /* DSP Extension: 32bit Multiply with 64bit Add/Subtract.  */
   1777  1.1  mrg   ADD_NDS32_BUILTIN3 ("smar64", long_long_integer,
   1778  1.1  mrg 		      long_long_integer, integer, integer, SMAR64);
   1779  1.1  mrg   ADD_NDS32_BUILTIN3 ("smsr64", long_long_integer,
   1780  1.1  mrg 		      long_long_integer, integer, integer, SMSR64);
   1781  1.1  mrg   ADD_NDS32_BUILTIN3 ("umar64", long_long_unsigned,
   1782  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, UMAR64);
   1783  1.1  mrg   ADD_NDS32_BUILTIN3 ("umsr64", long_long_unsigned,
   1784  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, UMSR64);
   1785  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmar64", long_long_integer,
   1786  1.1  mrg 		      long_long_integer, integer, integer, KMAR64);
   1787  1.1  mrg   ADD_NDS32_BUILTIN3 ("kmsr64", long_long_integer,
   1788  1.1  mrg 		      long_long_integer, integer, integer, KMSR64);
   1789  1.1  mrg   ADD_NDS32_BUILTIN3 ("ukmar64", long_long_unsigned,
   1790  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, UKMAR64);
   1791  1.1  mrg   ADD_NDS32_BUILTIN3 ("ukmsr64", long_long_unsigned,
   1792  1.1  mrg 		      long_long_unsigned, unsigned, unsigned, UKMSR64);
   1793  1.1  mrg 
   1794  1.1  mrg   /* DSP Extension: Signed 16bit Multiply with 64bit Add/Subtract.  */
   1795  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalbb", long_long_integer,
   1796  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALBB);
   1797  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalbb", long_long_integer,
   1798  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALBB);
   1799  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalbt", long_long_integer,
   1800  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALBT);
   1801  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalbt", long_long_integer,
   1802  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALBT);
   1803  1.1  mrg   ADD_NDS32_BUILTIN3 ("smaltt", long_long_integer,
   1804  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALTT);
   1805  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smaltt", long_long_integer,
   1806  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALTT);
   1807  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalda", long_long_integer,
   1808  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALDA);
   1809  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalda", long_long_integer,
   1810  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALDA);
   1811  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalxda", long_long_integer,
   1812  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALXDA);
   1813  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalxda", long_long_integer,
   1814  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALXDA);
   1815  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalds", long_long_integer,
   1816  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALDS);
   1817  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalds", long_long_integer,
   1818  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALDS);
   1819  1.1  mrg   ADD_NDS32_BUILTIN3 ("smaldrs", long_long_integer,
   1820  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALDRS);
   1821  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smaldrs", long_long_integer,
   1822  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALDRS);
   1823  1.1  mrg   ADD_NDS32_BUILTIN3 ("smalxds", long_long_integer,
   1824  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMALXDS);
   1825  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smalxds", long_long_integer,
   1826  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMALXDS);
   1827  1.1  mrg   ADD_NDS32_BUILTIN3 ("smslda", long_long_integer,
   1828  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMSLDA);
   1829  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smslda", long_long_integer,
   1830  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMSLDA);
   1831  1.1  mrg   ADD_NDS32_BUILTIN3 ("smslxda", long_long_integer,
   1832  1.1  mrg 		      long_long_integer, unsigned, unsigned, SMSLXDA);
   1833  1.1  mrg   ADD_NDS32_BUILTIN3 ("v_smslxda", long_long_integer,
   1834  1.1  mrg 		      long_long_integer, v2hi, v2hi, V_SMSLXDA);
   1835  1.1  mrg 
   1836  1.1  mrg   /* DSP Extension: augmented baseline.  */
   1837  1.1  mrg   ADD_NDS32_BUILTIN2 ("uclip32", unsigned, integer, unsigned, UCLIP32);
   1838  1.1  mrg   ADD_NDS32_BUILTIN2 ("sclip32", integer, integer, unsigned, SCLIP32);
   1839  1.1  mrg   ADD_NDS32_BUILTIN1 ("kabs", integer, integer, KABS);
   1840  1.1  mrg 
   1841  1.1  mrg   /* DSP Extension: vector type unaligned Load/Store  */
   1842  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_unaligned_u16x2", u_v2hi, ptr_ushort, UALOAD_U16);
   1843  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_unaligned_s16x2", v2hi, ptr_short, UALOAD_S16);
   1844  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_unaligned_u8x4", u_v4qi, ptr_uchar, UALOAD_U8);
   1845  1.1  mrg   ADD_NDS32_BUILTIN1 ("get_unaligned_s8x4", v4qi, ptr_char, UALOAD_S8);
   1846  1.1  mrg   ADD_NDS32_BUILTIN2 ("put_unaligned_u16x2", void, ptr_ushort,
   1847  1.1  mrg 		      u_v2hi, UASTORE_U16);
   1848  1.1  mrg   ADD_NDS32_BUILTIN2 ("put_unaligned_s16x2", void, ptr_short,
   1849  1.1  mrg 		      v2hi, UASTORE_S16);
   1850  1.1  mrg   ADD_NDS32_BUILTIN2 ("put_unaligned_u8x4", void, ptr_uchar,
   1851  1.1  mrg 		      u_v4qi, UASTORE_U8);
   1852  1.1  mrg   ADD_NDS32_BUILTIN2 ("put_unaligned_s8x4", void, ptr_char,
   1853  1.1  mrg 		      v4qi, UASTORE_S8);
   1854  1.1  mrg }
   1855