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