1;; Multiplication patterns for TI C6X. 2;; This file is processed by genmult.sh to produce two variants of each 3;; pattern, a normal one and a real_mult variant for modulo scheduling. 4;; Copyright (C) 2010-2020 Free Software Foundation, Inc. 5;; Contributed by Bernd Schmidt <bernds@codesourcery.com> 6;; Contributed by CodeSourcery. 7;; 8;; This file is part of GCC. 9;; 10;; GCC is free software; you can redistribute it and/or modify 11;; it under the terms of the GNU General Public License as published by 12;; the Free Software Foundation; either version 3, or (at your option) 13;; any later version. 14;; 15;; GCC is distributed in the hope that it will be useful, 16;; but WITHOUT ANY WARRANTY; without even the implied warranty of 17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18;; GNU General Public License for more details. 19;; 20;; You should have received a copy of the GNU General Public License 21;; along with GCC; see the file COPYING3. If not see 22;; <http://www.gnu.org/licenses/>. 23 24;; ------------------------------------------------------------------------- 25;; Miscellaneous insns that execute on the M units 26;; ------------------------------------------------------------------------- 27 28(define_insn "rotlsi3_VARIANT_" 29 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 30 (rotate:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a") 31 (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5"))_CBRK_)] 32 "TARGET_INSNS_64" 33 "%|%.\\trotl\\t%$\\t%1, %2, %_MODk_0" 34 [(set_attr "units" "m") 35 (set_attr "type" "mpy2") 36 (set_attr "cross" "n,n,y,y")]) 37 38(define_insn "bitrevsi2_VARIANT_" 39 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_A_,_B_,_B_") 40 (unspec:SI [(match_operand:SI 1 "register_operand" "a,?b,b,?a")] 41 UNSPEC_BITREV)_CBRK_)] 42 "TARGET_INSNS_64" 43 "%|%.\\tbitr\\t%$\\t%1, %_MODk_0" 44 [(set_attr "units" "m") 45 (set_attr "type" "mpy2") 46 (set_attr "cross" "n,y,n,y")]) 47 48;; Vector average. 49 50(define_insn "avgv2hi3_VARIANT_" 51 [(_SET_ _OBRK_(match_operand:_MV2HI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 52 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "a,b,?b,?a") 53 (match_operand:V2HI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)_CBRK_)] 54 "TARGET_INSNS_64" 55 "%|%.\\tavg2\\t%$\\t%1, %2, %_MODk_0" 56 [(set_attr "units" "m") 57 (set_attr "type" "mpy2") 58 (set_attr "cross" "n,n,y,y")]) 59 60(define_insn "uavgv4qi3_VARIANT_" 61 [(_SET_ _OBRK_(match_operand:_MV4QI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 62 (unspec:V4QI [(match_operand:V4QI 1 "register_operand" "a,b,?b,?a") 63 (match_operand:V4QI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)_CBRK_)] 64 "TARGET_INSNS_64" 65 "%|%.\\tavgu4\\t%$\\t%1, %2, %_MODk_0" 66 [(set_attr "units" "m") 67 (set_attr "type" "mpy2") 68 (set_attr "cross" "n,n,y,y")]) 69 70;; ------------------------------------------------------------------------- 71;; Multiplication 72;; ------------------------------------------------------------------------- 73 74(define_insn "mulhi3_VARIANT_" 75 [(_SET_ _OBRK_(match_operand:HI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 76 (mult:HI (match_operand:HI 1 "register_operand" "a,b,?b,?a") 77 (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5"))_CBRK_)] 78 "" 79 "%|%.\\tmpy\\t%$\\t%2, %1, %_MODk_0" 80 [(set_attr "type" "mpy2") 81 (set_attr "units" "m") 82 (set_attr "op_pattern" "sxs") 83 (set_attr "cross" "n,n,y,y")]) 84 85(define_insn "mulhisi3_const_VARIANT_" 86 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A__B_") 87 (mult:SI (sign_extend:SI 88 (match_operand:HI 1 "register_operand" "a,b,?ab")) 89 (match_operand:HI 2 "scst5_operand" "Is5,Is5,Is5"))_CBRK_)] 90 "" 91 "%|%.\\tmpy\\t%$\\t%2, %1, %_MODk_0" 92 [(set_attr "type" "mpy2") 93 (set_attr "units" "m") 94 (set_attr "cross" "n,n,y")]) 95 96(define_insn "*mulhisi3_insn_VARIANT_" 97 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 98 (mult:SI (sign_extend:SI 99 (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) 100 (sign_extend:SI 101 (match_operand:HI 2 "reg_or_scst5_operand" "a,b,b,a")))_CBRK_)] 102 "" 103 "%|%.\\tmpy\\t%$\\t%1, %2, %_MODk_0" 104 [(set_attr "type" "mpy2") 105 (set_attr "units" "m") 106 (set_attr "op_pattern" "ssx") 107 (set_attr "cross" "n,n,y,y")]) 108 109(define_insn "mulhisi3_lh_VARIANT_" 110 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 111 (mult:SI (sign_extend:SI 112 (match_operand:HI 1 "register_operand" "a,b,?a,?b")) 113 (ashiftrt:SI 114 (match_operand:SI 2 "register_operand" "a,b,b,a") 115 (const_int 16)))_CBRK_)] 116 "" 117 "%|%.\\tmpylh\\t%$\\t%1, %2, %_MODk_0" 118 [(set_attr "type" "mpy2") 119 (set_attr "units" "m") 120 (set_attr "cross" "n,n,y,y")]) 121 122(define_insn "mulhisi3_hl_VARIANT_" 123 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 124 (mult:SI (ashiftrt:SI 125 (match_operand:SI 1 "register_operand" "a,b,?a,?b") 126 (const_int 16)) 127 (sign_extend:SI 128 (match_operand:HI 2 "register_operand" "a,b,b,a")))_CBRK_)] 129 "" 130 "%|%.\\tmpyhl\\t%$\\t%1, %2, %_MODk_0" 131 [(set_attr "type" "mpy2") 132 (set_attr "units" "m") 133 (set_attr "cross" "n,n,y,y")]) 134 135(define_insn "mulhisi3_hh_VARIANT_" 136 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 137 (mult:SI (ashiftrt:SI 138 (match_operand:SI 1 "register_operand" "%a,b,?a,?b") 139 (const_int 16)) 140 (ashiftrt:SI 141 (match_operand:SI 2 "register_operand" "a,b,b,a") 142 (const_int 16)))_CBRK_)] 143 "" 144 "%|%.\\tmpyh\\t%$\\t%1, %2, %_MODk_0" 145 [(set_attr "type" "mpy2") 146 (set_attr "units" "m") 147 (set_attr "cross" "n,n,y,y")]) 148 149(define_insn "umulhisi3_VARIANT_" 150 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 151 (mult:SI (zero_extend:SI 152 (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) 153 (zero_extend:SI 154 (match_operand:HI 2 "register_operand" "a,b,b,a")))_CBRK_)] 155 "" 156 "%|%.\\tmpyu\\t%$\\t%1, %2, %_MODk_0" 157 [(set_attr "type" "mpy2") 158 (set_attr "units" "m") 159 (set_attr "cross" "n,n,y,y")]) 160 161(define_insn "umulhisi3_lh_VARIANT_" 162 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 163 (mult:SI (zero_extend:SI 164 (match_operand:HI 1 "register_operand" "a,b,?a,?b")) 165 (lshiftrt:SI 166 (match_operand:SI 2 "register_operand" "a,b,b,a") 167 (const_int 16)))_CBRK_)] 168 "" 169 "%|%.\\tmpylhu\\t%$\\t%1, %2, %_MODk_0" 170 [(set_attr "type" "mpy2") 171 (set_attr "units" "m") 172 (set_attr "cross" "n,n,y,y")]) 173 174(define_insn "umulhisi3_hl_VARIANT_" 175 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 176 (mult:SI (lshiftrt:SI 177 (match_operand:SI 1 "register_operand" "a,b,?a,?b") 178 (const_int 16)) 179 (zero_extend:SI 180 (match_operand:HI 2 "register_operand" "a,b,b,a")))_CBRK_)] 181 "" 182 "%|%.\\tmpyhlu\\t%$\\t%1, %2, %_MODk_0" 183 [(set_attr "type" "mpy2") 184 (set_attr "units" "m") 185 (set_attr "cross" "n,n,y,y")]) 186 187(define_insn "umulhisi3_hh_VARIANT_" 188 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 189 (mult:SI (lshiftrt:SI 190 (match_operand:SI 1 "register_operand" "%a,b,?a,?b") 191 (const_int 16)) 192 (lshiftrt:SI 193 (match_operand:SI 2 "register_operand" "a,b,b,a") 194 (const_int 16)))_CBRK_)] 195 "" 196 "%|%.\\tmpyhu\\t%$\\t%1, %2, %_MODk_0" 197 [(set_attr "type" "mpy2") 198 (set_attr "units" "m") 199 (set_attr "cross" "n,n,y,y")]) 200 201(define_insn "usmulhisi3_const_VARIANT_" 202 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A__B_") 203 (mult:SI (zero_extend:SI 204 (match_operand:HI 1 "register_operand" "a,b,?ab")) 205 (match_operand:SI 2 "scst5_operand" "Is5,Is5,Is5"))_CBRK_)] 206 "" 207 "%|%.\\tmpysu\\t%$\\t%2, %1, %_MODk_0" 208 [(set_attr "type" "mpy2") 209 (set_attr "units" "m") 210 (set_attr "cross" "n,n,y")]) 211 212(define_insn "*usmulhisi3_insn_VARIANT_" 213 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 214 (mult:SI (zero_extend:SI 215 (match_operand:HI 1 "register_operand" "a,b,?a,?b")) 216 (sign_extend:SI 217 (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,bIs5,aIs5")))_CBRK_)] 218 "" 219 "%|%.\\tmpyus\\t%$\\t%1, %2, %_MODk_0" 220 [(set_attr "type" "mpy2") 221 (set_attr "units" "m") 222 (set_attr "cross" "n,n,y,y")]) 223 224(define_insn "usmulhisi3_lh_VARIANT_" 225 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 226 (mult:SI (zero_extend:SI 227 (match_operand:HI 1 "register_operand" "a,b,?a,?b")) 228 (ashiftrt:SI 229 (match_operand:SI 2 "register_operand" "a,b,b,a") 230 (const_int 16)))_CBRK_)] 231 "" 232 "%|%.\\tmpyluhs\\t%$\\t%1, %2, %_MODk_0" 233 [(set_attr "type" "mpy2") 234 (set_attr "units" "m") 235 (set_attr "cross" "n,n,y,y")]) 236 237(define_insn "usmulhisi3_hl_VARIANT_" 238 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 239 (mult:SI (lshiftrt:SI 240 (match_operand:SI 1 "register_operand" "a,b,?a,?b") 241 (const_int 16)) 242 (sign_extend:SI 243 (match_operand:HI 2 "register_operand" "a,b,b,a")))_CBRK_)] 244 "" 245 "%|%.\\tmpyhuls\\t%$\\t%1, %2, %_MODk_0" 246 [(set_attr "type" "mpy2") 247 (set_attr "units" "m") 248 (set_attr "cross" "n,n,y,y")]) 249 250(define_insn "usmulhisi3_hh_VARIANT_" 251 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 252 (mult:SI (lshiftrt:SI 253 (match_operand:SI 1 "register_operand" "a,b,?a,?b") 254 (const_int 16)) 255 (ashiftrt:SI 256 (match_operand:SI 2 "register_operand" "a,b,b,a") 257 (const_int 16)))_CBRK_)] 258 "" 259 "%|%.\\tmpyhus\\t%$\\t%1, %2, %_MODk_0" 260 [(set_attr "type" "mpy2") 261 (set_attr "units" "m") 262 (set_attr "cross" "n,n,y,y")]) 263 264(define_insn "mulsi3_insn_VARIANT_" 265 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 266 (mult:SI (match_operand:SI 1 "register_operand" "%a,b,?a,?b") 267 (match_operand:SI 2 "register_operand" "a,b,b,a"))_CBRK_)] 268 "TARGET_MPY32" 269 "%|%.\\tmpy32\\t%$\\t%1, %2, %_MODk_0" 270 [(set_attr "type" "mpy4") 271 (set_attr "units" "m") 272 (set_attr "cross" "n,n,y,y")]) 273 274(define_insn "<u>mulsidi3_VARIANT_" 275 [(_SET_ _OBRK_(match_operand:DI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 276 (mult:DI (any_ext:DI 277 (match_operand:SI 1 "register_operand" "%a,b,?a,?b")) 278 (any_ext:DI 279 (match_operand:SI 2 "register_operand" "a,b,b,a")))_CBRK_)] 280 "TARGET_MPY32" 281 "%|%.\\tmpy32<u>\\t%$\\t%1, %2, %_MODK_0" 282 [(set_attr "type" "mpy4") 283 (set_attr "units" "m") 284 (set_attr "cross" "n,n,y,y")]) 285 286(define_insn "usmulsidi3_VARIANT_" 287 [(_SET_ _OBRK_(match_operand:DI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 288 (mult:DI (zero_extend:DI 289 (match_operand:SI 1 "register_operand" "a,b,?a,?b")) 290 (sign_extend:DI 291 (match_operand:SI 2 "register_operand" "a,b,b,a")))_CBRK_)] 292 "TARGET_MPY32" 293 "%|%.\\tmpy32us\\t%$\\t%1, %2, %_MODK_0" 294 [(set_attr "type" "mpy4") 295 (set_attr "units" "m") 296 (set_attr "cross" "n,n,y,y")]) 297 298;; Widening vector multiply and dot product 299 300(define_insn "mulv2hiv2si3_VARIANT_" 301 [(_SET_ _OBRK_(match_operand:V2SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 302 (mult:V2SI 303 (sign_extend:V2SI (match_operand:V2HI 1 "register_operand" "a,b,a,b")) 304 (sign_extend:V2SI (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))_CBRK_)] 305 "TARGET_INSNS_64" 306 "%|%.\\tmpy2\\t%$\\t%1, %2, %_MODk_0" 307 [(set_attr "type" "mpy4") 308 (set_attr "units" "m") 309 (set_attr "cross" "n,n,y,y")]) 310 311(define_insn "umulv4qiv4hi3_VARIANT_" 312 [(_SET_ _OBRK_(match_operand:V4HI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 313 (mult:V4HI 314 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,a,b")) 315 (zero_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))_CBRK_)] 316 "TARGET_INSNS_64" 317 "%|%.\\tmpyu4\\t%$\\t%1, %2, %_MODk_0" 318 [(set_attr "type" "mpy4") 319 (set_attr "units" "m") 320 (set_attr "cross" "n,n,y,y")]) 321 322(define_insn "usmulv4qiv4hi3_VARIANT_" 323 [(_SET_ _OBRK_(match_operand:V4HI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 324 (mult:V4HI 325 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,?b,?a")) 326 (sign_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,a,b")))_CBRK_)] 327 "TARGET_INSNS_64" 328 "%|%.\\tmpyus4\\t%$\\t%1, %2, %_MODk_0" 329 [(set_attr "type" "mpy4") 330 (set_attr "units" "m") 331 (set_attr "cross" "n,n,y,y")]) 332 333(define_insn "dotv2hi_VARIANT_" 334 [(_SET_ _OBRK_(match_operand:SI 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 335 (plus:SI 336 (mult:SI 337 (sign_extend:SI 338 (vec_select:HI 339 (match_operand:V2HI 1 "register_operand" "a,b,a,b") 340 (parallel [(const_int 0)]))) 341 (sign_extend:SI 342 (vec_select:HI 343 (match_operand:V2HI 2 "register_operand" "a,b,?b,?a") 344 (parallel [(const_int 0)])))) 345 (mult:SI 346 (sign_extend:SI 347 (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))) 348 (sign_extend:SI 349 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))))_CBRK_)] 350 "TARGET_INSNS_64" 351 "%|%.\\tdotp2\\t%$\\t%1, %2, %_MODk_0" 352 [(set_attr "type" "mpy4") 353 (set_attr "units" "m") 354 (set_attr "cross" "n,n,y,y")]) 355 356;; Fractional multiply 357 358(define_insn "mulv2hqv2sq3_VARIANT_" 359 [(_SET_ _OBRK_(match_operand:_MV2SQ 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 360 (ss_mult:V2SQ 361 (fract_convert:V2SQ 362 (match_operand:V2HQ 1 "register_operand" "%a,b,?a,?b")) 363 (fract_convert:V2SQ 364 (match_operand:V2HQ 2 "register_operand" "a,b,b,a")))_CBRK_)] 365 "" 366 "%|%.\\tsmpy2\\t%$\\t%1, %2, %_MODk_0" 367 [(set_attr "type" "mpy4") 368 (set_attr "units" "m") 369 (set_attr "cross" "n,n,y,y")]) 370 371(define_insn "mulhqsq3_VARIANT_" 372 [(_SET_ _OBRK_(match_operand:_MSQ 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 373 (ss_mult:SQ 374 (fract_convert:SQ 375 (match_operand:HQ 1 "register_operand" "%a,b,?a,?b")) 376 (fract_convert:SQ 377 (match_operand:HQ 2 "register_operand" "a,b,b,a")))_CBRK_)] 378 "" 379 "%|%.\\tsmpy\\t%$\\t%1, %2, %_MODk_0" 380 [(set_attr "type" "mpy2") 381 (set_attr "units" "m") 382 (set_attr "cross" "n,n,y,y")]) 383 384(define_insn "mulhqsq3_lh_VARIANT_" 385 [(_SET_ _OBRK_(match_operand:_MSQ 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 386 (ss_mult:SQ 387 (fract_convert:SQ 388 (match_operand:HQ 1 "register_operand" "a,b,?a,?b")) 389 (fract_convert:SQ 390 (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))_CBRK_)] 391 "" 392 "%|%.\\tsmpylh\\t%$\\t%1, %2, %_MODk_0" 393 [(set_attr "type" "mpy2") 394 (set_attr "units" "m") 395 (set_attr "cross" "n,n,y,y")]) 396 397(define_insn "mulhqsq3_hl_VARIANT_" 398 [(_SET_ _OBRK_(match_operand:_MSQ 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 399 (ss_mult:SQ 400 (fract_convert:SQ 401 (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) 402 (fract_convert:SQ 403 (match_operand:HQ 2 "register_operand" "a,b,b,a")))_CBRK_)] 404 "" 405 "%|%.\\tsmpyhl\\t%$\\t%1, %2, %_MODk_0" 406 [(set_attr "type" "mpy2") 407 (set_attr "units" "m") 408 (set_attr "cross" "n,n,y,y")]) 409 410(define_insn "mulhqsq3_hh_VARIANT_" 411 [(_SET_ _OBRK_(match_operand:_MSQ 0 "_DESTOPERAND_" "=_A_,_B_,_A_,_B_") 412 (ss_mult:SQ 413 (fract_convert:SQ 414 (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) 415 (fract_convert:SQ 416 (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))_CBRK_)] 417 "" 418 "%|%.\\tsmpyh\\t%$\\t%1, %2, %_MODk_0" 419 [(set_attr "type" "mpy2") 420 (set_attr "units" "m") 421 (set_attr "cross" "n,n,y,y")]) 422