Home | History | Annotate | Line # | Download | only in c6x
      1 ;; -*- buffer-read-only: t -*-
      2 ;; Generated automatically from c6x-mult.md.in by genmult.sh
      3 ;; Multiplication patterns for TI C6X.
      4 ;; This file is processed by genmult.sh to produce two variants of each
      5 ;; pattern, a normal one and a real_mult variant for modulo scheduling.
      6 ;; Copyright (C) 2010-2022 Free Software Foundation, Inc.
      7 ;; Contributed by Bernd Schmidt <bernds (a] codesourcery.com>
      8 ;; Contributed by CodeSourcery.
      9 ;;
     10 ;; This file is part of GCC.
     11 ;;
     12 ;; GCC is free software; you can redistribute it and/or modify
     13 ;; it under the terms of the GNU General Public License as published by
     14 ;; the Free Software Foundation; either version 3, or (at your option)
     15 ;; any later version.
     16 ;;
     17 ;; GCC is distributed in the hope that it will be useful,
     18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     20 ;; GNU General Public License for more details.
     21 ;;
     22 ;; You should have received a copy of the GNU General Public License
     23 ;; along with GCC; see the file COPYING3.  If not see
     24 ;; <http://www.gnu.org/licenses/>.
     25 
     26 ;; -------------------------------------------------------------------------
     27 ;; Miscellaneous insns that execute on the M units
     28 ;; -------------------------------------------------------------------------
     29 
     30 (define_insn "rotlsi3"
     31   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
     32         (rotate:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
     33 		   (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))]
     34   "TARGET_INSNS_64"
     35   "%|%.\\trotl\\t%$\\t%1, %2, %0"
     36   [(set_attr "units" "m")
     37    (set_attr "type" "mpy2")
     38    (set_attr "cross" "n,n,y,y")])
     39 
     40 (define_insn "bitrevsi2"
     41   [(set (match_operand:SI 0 "register_operand" "=a,a,b,b")
     42 	(unspec:SI [(match_operand:SI 1 "register_operand" "a,?b,b,?a")]
     43 		   UNSPEC_BITREV))]
     44   "TARGET_INSNS_64"
     45   "%|%.\\tbitr\\t%$\\t%1, %0"
     46   [(set_attr "units" "m")
     47    (set_attr "type" "mpy2")
     48    (set_attr "cross" "n,y,n,y")])
     49 
     50 ;; Vector average.
     51 
     52 (define_insn "avgv2hi3"
     53   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
     54         (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "a,b,?b,?a")
     55 		      (match_operand:V2HI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG))]
     56   "TARGET_INSNS_64"
     57   "%|%.\\tavg2\\t%$\\t%1, %2, %0"
     58   [(set_attr "units" "m")
     59    (set_attr "type" "mpy2")
     60    (set_attr "cross" "n,n,y,y")])
     61 
     62 (define_insn "uavgv4qi3"
     63   [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b")
     64         (unspec:V4QI [(match_operand:V4QI 1 "register_operand" "a,b,?b,?a")
     65 		      (match_operand:V4QI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG))]
     66   "TARGET_INSNS_64"
     67   "%|%.\\tavgu4\\t%$\\t%1, %2, %0"
     68   [(set_attr "units" "m")
     69    (set_attr "type" "mpy2")
     70    (set_attr "cross" "n,n,y,y")])
     71 
     72 ;; -------------------------------------------------------------------------
     73 ;; Multiplication
     74 ;; -------------------------------------------------------------------------
     75 
     76 (define_insn "mulhi3"
     77   [(set (match_operand:HI 0 "register_operand" "=a,b,a,b")
     78         (mult:HI (match_operand:HI 1 "register_operand" "a,b,?b,?a")
     79                  (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5")))]
     80   ""
     81   "%|%.\\tmpy\\t%$\\t%2, %1, %0"
     82   [(set_attr "type" "mpy2")
     83    (set_attr "units" "m")
     84    (set_attr "op_pattern" "sxs")
     85    (set_attr "cross" "n,n,y,y")])
     86 
     87 (define_insn "mulhisi3_const"
     88   [(set (match_operand:SI 0 "register_operand" "=a,b,ab")
     89         (mult:SI (sign_extend:SI
     90 		  (match_operand:HI 1 "register_operand" "a,b,?ab"))
     91                  (match_operand:HI 2 "scst5_operand" "Is5,Is5,Is5")))]
     92   ""
     93   "%|%.\\tmpy\\t%$\\t%2, %1, %0"
     94   [(set_attr "type" "mpy2")
     95    (set_attr "units" "m")
     96    (set_attr "cross" "n,n,y")])
     97 
     98 (define_insn "*mulhisi3_insn"
     99   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    100         (mult:SI (sign_extend:SI
    101 		  (match_operand:HI 1 "register_operand" "%a,b,?a,?b"))
    102                  (sign_extend:SI
    103 		  (match_operand:HI 2 "reg_or_scst5_operand" "a,b,b,a"))))]
    104   ""
    105   "%|%.\\tmpy\\t%$\\t%1, %2, %0"
    106   [(set_attr "type" "mpy2")
    107    (set_attr "units" "m")
    108    (set_attr "op_pattern" "ssx")
    109    (set_attr "cross" "n,n,y,y")])
    110 
    111 (define_insn "mulhisi3_lh"
    112   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    113         (mult:SI (sign_extend:SI
    114 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    115                  (ashiftrt:SI
    116 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    117 		  (const_int 16))))]
    118   ""
    119   "%|%.\\tmpylh\\t%$\\t%1, %2, %0"
    120   [(set_attr "type" "mpy2")
    121    (set_attr "units" "m")
    122    (set_attr "cross" "n,n,y,y")])
    123 
    124 (define_insn "mulhisi3_hl"
    125   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    126         (mult:SI (ashiftrt:SI
    127 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    128 		  (const_int 16))
    129                  (sign_extend:SI
    130 		  (match_operand:HI 2 "register_operand" "a,b,b,a"))))]
    131   ""
    132   "%|%.\\tmpyhl\\t%$\\t%1, %2, %0"
    133   [(set_attr "type" "mpy2")
    134    (set_attr "units" "m")
    135    (set_attr "cross" "n,n,y,y")])
    136 
    137 (define_insn "mulhisi3_hh"
    138   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    139         (mult:SI (ashiftrt:SI
    140 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    141 		  (const_int 16))
    142                  (ashiftrt:SI
    143 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    144 		  (const_int 16))))]
    145   ""
    146   "%|%.\\tmpyh\\t%$\\t%1, %2, %0"
    147   [(set_attr "type" "mpy2")
    148    (set_attr "units" "m")
    149    (set_attr "cross" "n,n,y,y")])
    150 
    151 (define_insn "umulhisi3"
    152   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    153         (mult:SI (zero_extend:SI
    154 		  (match_operand:HI 1 "register_operand" "%a,b,?a,?b"))
    155                  (zero_extend:SI
    156 		  (match_operand:HI 2 "register_operand" "a,b,b,a"))))]
    157   ""
    158   "%|%.\\tmpyu\\t%$\\t%1, %2, %0"
    159   [(set_attr "type" "mpy2")
    160    (set_attr "units" "m")
    161    (set_attr "cross" "n,n,y,y")])
    162 
    163 (define_insn "umulhisi3_lh"
    164   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    165         (mult:SI (zero_extend:SI
    166 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    167                  (lshiftrt:SI
    168 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    169 		  (const_int 16))))]
    170   ""
    171   "%|%.\\tmpylhu\\t%$\\t%1, %2, %0"
    172   [(set_attr "type" "mpy2")
    173    (set_attr "units" "m")
    174    (set_attr "cross" "n,n,y,y")])
    175 
    176 (define_insn "umulhisi3_hl"
    177   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    178         (mult:SI (lshiftrt:SI
    179 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    180 		  (const_int 16))
    181                  (zero_extend:SI
    182 		  (match_operand:HI 2 "register_operand" "a,b,b,a"))))]
    183   ""
    184   "%|%.\\tmpyhlu\\t%$\\t%1, %2, %0"
    185   [(set_attr "type" "mpy2")
    186    (set_attr "units" "m")
    187    (set_attr "cross" "n,n,y,y")])
    188 
    189 (define_insn "umulhisi3_hh"
    190   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    191         (mult:SI (lshiftrt:SI
    192 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    193 		  (const_int 16))
    194                  (lshiftrt:SI
    195 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    196 		  (const_int 16))))]
    197   ""
    198   "%|%.\\tmpyhu\\t%$\\t%1, %2, %0"
    199   [(set_attr "type" "mpy2")
    200    (set_attr "units" "m")
    201    (set_attr "cross" "n,n,y,y")])
    202 
    203 (define_insn "usmulhisi3_const"
    204   [(set (match_operand:SI 0 "register_operand" "=a,b,ab")
    205         (mult:SI (zero_extend:SI
    206 		  (match_operand:HI 1 "register_operand" "a,b,?ab"))
    207                  (match_operand:SI 2 "scst5_operand" "Is5,Is5,Is5")))]
    208   ""
    209   "%|%.\\tmpysu\\t%$\\t%2, %1, %0"
    210   [(set_attr "type" "mpy2")
    211    (set_attr "units" "m")
    212    (set_attr "cross" "n,n,y")])
    213 
    214 (define_insn "*usmulhisi3_insn"
    215   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    216         (mult:SI (zero_extend:SI
    217 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    218                  (sign_extend:SI
    219 		  (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,bIs5,aIs5"))))]
    220   ""
    221   "%|%.\\tmpyus\\t%$\\t%1, %2, %0"
    222   [(set_attr "type" "mpy2")
    223    (set_attr "units" "m")
    224    (set_attr "cross" "n,n,y,y")])
    225 
    226 (define_insn "usmulhisi3_lh"
    227   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    228 	(mult:SI (zero_extend:SI
    229 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    230                  (ashiftrt:SI
    231 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    232 		  (const_int 16))))]
    233   ""
    234   "%|%.\\tmpyluhs\\t%$\\t%1, %2, %0"
    235   [(set_attr "type" "mpy2")
    236    (set_attr "units" "m")
    237    (set_attr "cross" "n,n,y,y")])
    238 
    239 (define_insn "usmulhisi3_hl"
    240   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    241         (mult:SI (lshiftrt:SI
    242 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    243 		  (const_int 16))
    244                  (sign_extend:SI
    245 		  (match_operand:HI 2 "register_operand" "a,b,b,a"))))]
    246   ""
    247   "%|%.\\tmpyhuls\\t%$\\t%1, %2, %0"
    248   [(set_attr "type" "mpy2")
    249    (set_attr "units" "m")
    250    (set_attr "cross" "n,n,y,y")])
    251 
    252 (define_insn "usmulhisi3_hh"
    253   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    254         (mult:SI (lshiftrt:SI
    255 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    256 		  (const_int 16))
    257                  (ashiftrt:SI
    258 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    259 		  (const_int 16))))]
    260   ""
    261   "%|%.\\tmpyhus\\t%$\\t%1, %2, %0"
    262   [(set_attr "type" "mpy2")
    263    (set_attr "units" "m")
    264    (set_attr "cross" "n,n,y,y")])
    265 
    266 (define_insn "mulsi3_insn"
    267   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    268 	(mult:SI (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    269 		 (match_operand:SI 2 "register_operand" "a,b,b,a")))]
    270   "TARGET_MPY32"
    271   "%|%.\\tmpy32\\t%$\\t%1, %2, %0"
    272  [(set_attr "type" "mpy4")
    273   (set_attr "units" "m")
    274   (set_attr "cross" "n,n,y,y")])
    275 
    276 (define_insn "<u>mulsidi3"
    277   [(set (match_operand:DI 0 "register_operand" "=a,b,a,b")
    278         (mult:DI (any_ext:DI
    279 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b"))
    280                  (any_ext:DI
    281 		  (match_operand:SI 2 "register_operand" "a,b,b,a"))))]
    282   "TARGET_MPY32"
    283   "%|%.\\tmpy32<u>\\t%$\\t%1, %2, %0"
    284   [(set_attr "type" "mpy4")
    285    (set_attr "units" "m")
    286    (set_attr "cross" "n,n,y,y")])
    287 
    288 (define_insn "usmulsidi3"
    289   [(set (match_operand:DI 0 "register_operand" "=a,b,a,b")
    290         (mult:DI (zero_extend:DI
    291 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b"))
    292                  (sign_extend:DI
    293 		  (match_operand:SI 2 "register_operand" "a,b,b,a"))))]
    294   "TARGET_MPY32"
    295   "%|%.\\tmpy32us\\t%$\\t%1, %2, %0"
    296   [(set_attr "type" "mpy4")
    297    (set_attr "units" "m")
    298    (set_attr "cross" "n,n,y,y")])
    299 
    300 ;; Widening vector multiply and dot product
    301 
    302 (define_insn "mulv2hiv2si3"
    303   [(set (match_operand:V2SI 0 "register_operand" "=a,b,a,b")
    304 	(mult:V2SI
    305 	 (sign_extend:V2SI (match_operand:V2HI 1 "register_operand" "a,b,a,b"))
    306 	 (sign_extend:V2SI (match_operand:V2HI 2 "register_operand" "a,b,?b,?a"))))]
    307   "TARGET_INSNS_64"
    308   "%|%.\\tmpy2\\t%$\\t%1, %2, %0"
    309  [(set_attr "type" "mpy4")
    310   (set_attr "units" "m")
    311   (set_attr "cross" "n,n,y,y")])
    312 
    313 (define_insn "umulv4qiv4hi3"
    314   [(set (match_operand:V4HI 0 "register_operand" "=a,b,a,b")
    315 	(mult:V4HI
    316 	 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,a,b"))
    317 	 (zero_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,?b,?a"))))]
    318   "TARGET_INSNS_64"
    319   "%|%.\\tmpyu4\\t%$\\t%1, %2, %0"
    320   [(set_attr "type" "mpy4")
    321    (set_attr "units" "m")
    322    (set_attr "cross" "n,n,y,y")])
    323 
    324 (define_insn "usmulv4qiv4hi3"
    325   [(set (match_operand:V4HI 0 "register_operand" "=a,b,a,b")
    326 	(mult:V4HI
    327 	 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,?b,?a"))
    328 	 (sign_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,a,b"))))]
    329   "TARGET_INSNS_64"
    330   "%|%.\\tmpyus4\\t%$\\t%1, %2, %0"
    331   [(set_attr "type" "mpy4")
    332    (set_attr "units" "m")
    333    (set_attr "cross" "n,n,y,y")])
    334 
    335 (define_insn "dotv2hi"
    336   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    337 	(plus:SI
    338 	  (mult:SI
    339 	    (sign_extend:SI
    340 	      (vec_select:HI
    341 		(match_operand:V2HI 1 "register_operand" "a,b,a,b")
    342 		(parallel [(const_int 0)])))
    343 	    (sign_extend:SI
    344 	      (vec_select:HI
    345 		(match_operand:V2HI 2 "register_operand" "a,b,?b,?a")
    346 		(parallel [(const_int 0)]))))
    347 	  (mult:SI
    348 	    (sign_extend:SI
    349 	      (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
    350 	    (sign_extend:SI
    351 	      (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))))]
    352   "TARGET_INSNS_64"
    353   "%|%.\\tdotp2\\t%$\\t%1, %2, %0"
    354   [(set_attr "type" "mpy4")
    355    (set_attr "units" "m")
    356    (set_attr "cross" "n,n,y,y")])
    357 
    358 ;; Fractional multiply
    359 
    360 (define_insn "mulv2hqv2sq3"
    361   [(set (match_operand:V2SQ 0 "register_operand" "=a,b,a,b")
    362         (ss_mult:V2SQ
    363 	 (fract_convert:V2SQ
    364 	  (match_operand:V2HQ 1 "register_operand" "%a,b,?a,?b"))
    365 	 (fract_convert:V2SQ
    366 	  (match_operand:V2HQ 2 "register_operand" "a,b,b,a"))))]
    367   ""
    368   "%|%.\\tsmpy2\\t%$\\t%1, %2, %0"
    369   [(set_attr "type" "mpy4")
    370    (set_attr "units" "m")
    371    (set_attr "cross" "n,n,y,y")])
    372 
    373 (define_insn "mulhqsq3"
    374   [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b")
    375         (ss_mult:SQ
    376 	 (fract_convert:SQ
    377 	  (match_operand:HQ 1 "register_operand" "%a,b,?a,?b"))
    378 	 (fract_convert:SQ
    379 	  (match_operand:HQ 2 "register_operand" "a,b,b,a"))))]
    380   ""
    381   "%|%.\\tsmpy\\t%$\\t%1, %2, %0"
    382   [(set_attr "type" "mpy2")
    383    (set_attr "units" "m")
    384    (set_attr "cross" "n,n,y,y")])
    385 
    386 (define_insn "mulhqsq3_lh"
    387   [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b")
    388         (ss_mult:SQ
    389 	 (fract_convert:SQ
    390 	  (match_operand:HQ 1 "register_operand" "a,b,?a,?b"))
    391 	 (fract_convert:SQ
    392 	  (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a")))))]
    393   ""
    394   "%|%.\\tsmpylh\\t%$\\t%1, %2, %0"
    395   [(set_attr "type" "mpy2")
    396    (set_attr "units" "m")
    397    (set_attr "cross" "n,n,y,y")])
    398 
    399 (define_insn "mulhqsq3_hl"
    400   [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b")
    401         (ss_mult:SQ
    402 	 (fract_convert:SQ
    403 	  (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a")))
    404 	 (fract_convert:SQ
    405 	  (match_operand:HQ 2 "register_operand" "a,b,b,a"))))]
    406   ""
    407   "%|%.\\tsmpyhl\\t%$\\t%1, %2, %0"
    408   [(set_attr "type" "mpy2")
    409    (set_attr "units" "m")
    410    (set_attr "cross" "n,n,y,y")])
    411 
    412 (define_insn "mulhqsq3_hh"
    413   [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b")
    414         (ss_mult:SQ
    415 	 (fract_convert:SQ
    416 	  (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a")))
    417 	 (fract_convert:SQ
    418 	  (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a")))))]
    419   ""
    420   "%|%.\\tsmpyh\\t%$\\t%1, %2, %0"
    421   [(set_attr "type" "mpy2")
    422    (set_attr "units" "m")
    423    (set_attr "cross" "n,n,y,y")])
    424 ;; Multiplication patterns for TI C6X.
    425 ;; This file is processed by genmult.sh to produce two variants of each
    426 ;; pattern, a normal one and a real_mult variant for modulo scheduling.
    427 ;; Copyright (C) 2010-2022 Free Software Foundation, Inc.
    428 ;; Contributed by Bernd Schmidt <bernds (a] codesourcery.com>
    429 ;; Contributed by CodeSourcery.
    430 ;;
    431 ;; This file is part of GCC.
    432 ;;
    433 ;; GCC is free software; you can redistribute it and/or modify
    434 ;; it under the terms of the GNU General Public License as published by
    435 ;; the Free Software Foundation; either version 3, or (at your option)
    436 ;; any later version.
    437 ;;
    438 ;; GCC is distributed in the hope that it will be useful,
    439 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
    440 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    441 ;; GNU General Public License for more details.
    442 ;;
    443 ;; You should have received a copy of the GNU General Public License
    444 ;; along with GCC; see the file COPYING3.  If not see
    445 ;; <http://www.gnu.org/licenses/>.
    446 
    447 ;; -------------------------------------------------------------------------
    448 ;; Miscellaneous insns that execute on the M units
    449 ;; -------------------------------------------------------------------------
    450 
    451 (define_insn "rotlsi3_real"
    452   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    453         (rotate:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
    454 		   (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5"))] UNSPEC_REAL_MULT)]
    455   "TARGET_INSNS_64"
    456   "%|%.\\trotl\\t%$\\t%1, %2, %k0"
    457   [(set_attr "units" "m")
    458    (set_attr "type" "mpy2")
    459    (set_attr "cross" "n,n,y,y")])
    460 
    461 (define_insn "bitrevsi2_real"
    462   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JA,JB,JB")
    463 	(unspec:SI [(match_operand:SI 1 "register_operand" "a,?b,b,?a")]
    464 		   UNSPEC_BITREV)] UNSPEC_REAL_MULT)]
    465   "TARGET_INSNS_64"
    466   "%|%.\\tbitr\\t%$\\t%1, %k0"
    467   [(set_attr "units" "m")
    468    (set_attr "type" "mpy2")
    469    (set_attr "cross" "n,y,n,y")])
    470 
    471 ;; Vector average.
    472 
    473 (define_insn "avgv2hi3_real"
    474   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    475         (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "a,b,?b,?a")
    476 		      (match_operand:V2HI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)] UNSPEC_REAL_MULT)]
    477   "TARGET_INSNS_64"
    478   "%|%.\\tavg2\\t%$\\t%1, %2, %k0"
    479   [(set_attr "units" "m")
    480    (set_attr "type" "mpy2")
    481    (set_attr "cross" "n,n,y,y")])
    482 
    483 (define_insn "uavgv4qi3_real"
    484   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    485         (unspec:V4QI [(match_operand:V4QI 1 "register_operand" "a,b,?b,?a")
    486 		      (match_operand:V4QI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)] UNSPEC_REAL_MULT)]
    487   "TARGET_INSNS_64"
    488   "%|%.\\tavgu4\\t%$\\t%1, %2, %k0"
    489   [(set_attr "units" "m")
    490    (set_attr "type" "mpy2")
    491    (set_attr "cross" "n,n,y,y")])
    492 
    493 ;; -------------------------------------------------------------------------
    494 ;; Multiplication
    495 ;; -------------------------------------------------------------------------
    496 
    497 (define_insn "mulhi3_real"
    498   [(unspec [(match_operand:HI 0 "const_int_operand" "=JA,JB,JA,JB")
    499         (mult:HI (match_operand:HI 1 "register_operand" "a,b,?b,?a")
    500                  (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5"))] UNSPEC_REAL_MULT)]
    501   ""
    502   "%|%.\\tmpy\\t%$\\t%2, %1, %k0"
    503   [(set_attr "type" "mpy2")
    504    (set_attr "units" "m")
    505    (set_attr "op_pattern" "sxs")
    506    (set_attr "cross" "n,n,y,y")])
    507 
    508 (define_insn "mulhisi3_const_real"
    509   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JAJB")
    510         (mult:SI (sign_extend:SI
    511 		  (match_operand:HI 1 "register_operand" "a,b,?ab"))
    512                  (match_operand:HI 2 "scst5_operand" "Is5,Is5,Is5"))] UNSPEC_REAL_MULT)]
    513   ""
    514   "%|%.\\tmpy\\t%$\\t%2, %1, %k0"
    515   [(set_attr "type" "mpy2")
    516    (set_attr "units" "m")
    517    (set_attr "cross" "n,n,y")])
    518 
    519 (define_insn "*mulhisi3_insn_real"
    520   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    521         (mult:SI (sign_extend:SI
    522 		  (match_operand:HI 1 "register_operand" "%a,b,?a,?b"))
    523                  (sign_extend:SI
    524 		  (match_operand:HI 2 "reg_or_scst5_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    525   ""
    526   "%|%.\\tmpy\\t%$\\t%1, %2, %k0"
    527   [(set_attr "type" "mpy2")
    528    (set_attr "units" "m")
    529    (set_attr "op_pattern" "ssx")
    530    (set_attr "cross" "n,n,y,y")])
    531 
    532 (define_insn "mulhisi3_lh_real"
    533   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    534         (mult:SI (sign_extend:SI
    535 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    536                  (ashiftrt:SI
    537 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    538 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    539   ""
    540   "%|%.\\tmpylh\\t%$\\t%1, %2, %k0"
    541   [(set_attr "type" "mpy2")
    542    (set_attr "units" "m")
    543    (set_attr "cross" "n,n,y,y")])
    544 
    545 (define_insn "mulhisi3_hl_real"
    546   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    547         (mult:SI (ashiftrt:SI
    548 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    549 		  (const_int 16))
    550                  (sign_extend:SI
    551 		  (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    552   ""
    553   "%|%.\\tmpyhl\\t%$\\t%1, %2, %k0"
    554   [(set_attr "type" "mpy2")
    555    (set_attr "units" "m")
    556    (set_attr "cross" "n,n,y,y")])
    557 
    558 (define_insn "mulhisi3_hh_real"
    559   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    560         (mult:SI (ashiftrt:SI
    561 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    562 		  (const_int 16))
    563                  (ashiftrt:SI
    564 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    565 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    566   ""
    567   "%|%.\\tmpyh\\t%$\\t%1, %2, %k0"
    568   [(set_attr "type" "mpy2")
    569    (set_attr "units" "m")
    570    (set_attr "cross" "n,n,y,y")])
    571 
    572 (define_insn "umulhisi3_real"
    573   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    574         (mult:SI (zero_extend:SI
    575 		  (match_operand:HI 1 "register_operand" "%a,b,?a,?b"))
    576                  (zero_extend:SI
    577 		  (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    578   ""
    579   "%|%.\\tmpyu\\t%$\\t%1, %2, %k0"
    580   [(set_attr "type" "mpy2")
    581    (set_attr "units" "m")
    582    (set_attr "cross" "n,n,y,y")])
    583 
    584 (define_insn "umulhisi3_lh_real"
    585   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    586         (mult:SI (zero_extend:SI
    587 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    588                  (lshiftrt:SI
    589 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    590 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    591   ""
    592   "%|%.\\tmpylhu\\t%$\\t%1, %2, %k0"
    593   [(set_attr "type" "mpy2")
    594    (set_attr "units" "m")
    595    (set_attr "cross" "n,n,y,y")])
    596 
    597 (define_insn "umulhisi3_hl_real"
    598   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    599         (mult:SI (lshiftrt:SI
    600 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    601 		  (const_int 16))
    602                  (zero_extend:SI
    603 		  (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    604   ""
    605   "%|%.\\tmpyhlu\\t%$\\t%1, %2, %k0"
    606   [(set_attr "type" "mpy2")
    607    (set_attr "units" "m")
    608    (set_attr "cross" "n,n,y,y")])
    609 
    610 (define_insn "umulhisi3_hh_real"
    611   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    612         (mult:SI (lshiftrt:SI
    613 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    614 		  (const_int 16))
    615                  (lshiftrt:SI
    616 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    617 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    618   ""
    619   "%|%.\\tmpyhu\\t%$\\t%1, %2, %k0"
    620   [(set_attr "type" "mpy2")
    621    (set_attr "units" "m")
    622    (set_attr "cross" "n,n,y,y")])
    623 
    624 (define_insn "usmulhisi3_const_real"
    625   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JAJB")
    626         (mult:SI (zero_extend:SI
    627 		  (match_operand:HI 1 "register_operand" "a,b,?ab"))
    628                  (match_operand:SI 2 "scst5_operand" "Is5,Is5,Is5"))] UNSPEC_REAL_MULT)]
    629   ""
    630   "%|%.\\tmpysu\\t%$\\t%2, %1, %k0"
    631   [(set_attr "type" "mpy2")
    632    (set_attr "units" "m")
    633    (set_attr "cross" "n,n,y")])
    634 
    635 (define_insn "*usmulhisi3_insn_real"
    636   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    637         (mult:SI (zero_extend:SI
    638 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    639                  (sign_extend:SI
    640 		  (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,bIs5,aIs5")))] UNSPEC_REAL_MULT)]
    641   ""
    642   "%|%.\\tmpyus\\t%$\\t%1, %2, %k0"
    643   [(set_attr "type" "mpy2")
    644    (set_attr "units" "m")
    645    (set_attr "cross" "n,n,y,y")])
    646 
    647 (define_insn "usmulhisi3_lh_real"
    648   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    649 	(mult:SI (zero_extend:SI
    650 		  (match_operand:HI 1 "register_operand" "a,b,?a,?b"))
    651                  (ashiftrt:SI
    652 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    653 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    654   ""
    655   "%|%.\\tmpyluhs\\t%$\\t%1, %2, %k0"
    656   [(set_attr "type" "mpy2")
    657    (set_attr "units" "m")
    658    (set_attr "cross" "n,n,y,y")])
    659 
    660 (define_insn "usmulhisi3_hl_real"
    661   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    662         (mult:SI (lshiftrt:SI
    663 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    664 		  (const_int 16))
    665                  (sign_extend:SI
    666 		  (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    667   ""
    668   "%|%.\\tmpyhuls\\t%$\\t%1, %2, %k0"
    669   [(set_attr "type" "mpy2")
    670    (set_attr "units" "m")
    671    (set_attr "cross" "n,n,y,y")])
    672 
    673 (define_insn "usmulhisi3_hh_real"
    674   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    675         (mult:SI (lshiftrt:SI
    676 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b")
    677 		  (const_int 16))
    678                  (ashiftrt:SI
    679 		  (match_operand:SI 2 "register_operand" "a,b,b,a")
    680 		  (const_int 16)))] UNSPEC_REAL_MULT)]
    681   ""
    682   "%|%.\\tmpyhus\\t%$\\t%1, %2, %k0"
    683   [(set_attr "type" "mpy2")
    684    (set_attr "units" "m")
    685    (set_attr "cross" "n,n,y,y")])
    686 
    687 (define_insn "mulsi3_insn_real"
    688   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    689 	(mult:SI (match_operand:SI 1 "register_operand" "%a,b,?a,?b")
    690 		 (match_operand:SI 2 "register_operand" "a,b,b,a"))] UNSPEC_REAL_MULT)]
    691   "TARGET_MPY32"
    692   "%|%.\\tmpy32\\t%$\\t%1, %2, %k0"
    693  [(set_attr "type" "mpy4")
    694   (set_attr "units" "m")
    695   (set_attr "cross" "n,n,y,y")])
    696 
    697 (define_insn "<u>mulsidi3_real"
    698   [(unspec [(match_operand:DI 0 "const_int_operand" "=JA,JB,JA,JB")
    699         (mult:DI (any_ext:DI
    700 		  (match_operand:SI 1 "register_operand" "%a,b,?a,?b"))
    701                  (any_ext:DI
    702 		  (match_operand:SI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    703   "TARGET_MPY32"
    704   "%|%.\\tmpy32<u>\\t%$\\t%1, %2, %K0"
    705   [(set_attr "type" "mpy4")
    706    (set_attr "units" "m")
    707    (set_attr "cross" "n,n,y,y")])
    708 
    709 (define_insn "usmulsidi3_real"
    710   [(unspec [(match_operand:DI 0 "const_int_operand" "=JA,JB,JA,JB")
    711         (mult:DI (zero_extend:DI
    712 		  (match_operand:SI 1 "register_operand" "a,b,?a,?b"))
    713                  (sign_extend:DI
    714 		  (match_operand:SI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    715   "TARGET_MPY32"
    716   "%|%.\\tmpy32us\\t%$\\t%1, %2, %K0"
    717   [(set_attr "type" "mpy4")
    718    (set_attr "units" "m")
    719    (set_attr "cross" "n,n,y,y")])
    720 
    721 ;; Widening vector multiply and dot product
    722 
    723 (define_insn "mulv2hiv2si3_real"
    724   [(unspec [(match_operand:V2SI 0 "const_int_operand" "=JA,JB,JA,JB")
    725 	(mult:V2SI
    726 	 (sign_extend:V2SI (match_operand:V2HI 1 "register_operand" "a,b,a,b"))
    727 	 (sign_extend:V2SI (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))] UNSPEC_REAL_MULT)]
    728   "TARGET_INSNS_64"
    729   "%|%.\\tmpy2\\t%$\\t%1, %2, %k0"
    730  [(set_attr "type" "mpy4")
    731   (set_attr "units" "m")
    732   (set_attr "cross" "n,n,y,y")])
    733 
    734 (define_insn "umulv4qiv4hi3_real"
    735   [(unspec [(match_operand:V4HI 0 "const_int_operand" "=JA,JB,JA,JB")
    736 	(mult:V4HI
    737 	 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,a,b"))
    738 	 (zero_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))] UNSPEC_REAL_MULT)]
    739   "TARGET_INSNS_64"
    740   "%|%.\\tmpyu4\\t%$\\t%1, %2, %k0"
    741   [(set_attr "type" "mpy4")
    742    (set_attr "units" "m")
    743    (set_attr "cross" "n,n,y,y")])
    744 
    745 (define_insn "usmulv4qiv4hi3_real"
    746   [(unspec [(match_operand:V4HI 0 "const_int_operand" "=JA,JB,JA,JB")
    747 	(mult:V4HI
    748 	 (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,?b,?a"))
    749 	 (sign_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,a,b")))] UNSPEC_REAL_MULT)]
    750   "TARGET_INSNS_64"
    751   "%|%.\\tmpyus4\\t%$\\t%1, %2, %k0"
    752   [(set_attr "type" "mpy4")
    753    (set_attr "units" "m")
    754    (set_attr "cross" "n,n,y,y")])
    755 
    756 (define_insn "dotv2hi_real"
    757   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    758 	(plus:SI
    759 	  (mult:SI
    760 	    (sign_extend:SI
    761 	      (vec_select:HI
    762 		(match_operand:V2HI 1 "register_operand" "a,b,a,b")
    763 		(parallel [(const_int 0)])))
    764 	    (sign_extend:SI
    765 	      (vec_select:HI
    766 		(match_operand:V2HI 2 "register_operand" "a,b,?b,?a")
    767 		(parallel [(const_int 0)]))))
    768 	  (mult:SI
    769 	    (sign_extend:SI
    770 	      (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
    771 	    (sign_extend:SI
    772 	      (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))))] UNSPEC_REAL_MULT)]
    773   "TARGET_INSNS_64"
    774   "%|%.\\tdotp2\\t%$\\t%1, %2, %k0"
    775   [(set_attr "type" "mpy4")
    776    (set_attr "units" "m")
    777    (set_attr "cross" "n,n,y,y")])
    778 
    779 ;; Fractional multiply
    780 
    781 (define_insn "mulv2hqv2sq3_real"
    782   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    783         (ss_mult:V2SQ
    784 	 (fract_convert:V2SQ
    785 	  (match_operand:V2HQ 1 "register_operand" "%a,b,?a,?b"))
    786 	 (fract_convert:V2SQ
    787 	  (match_operand:V2HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    788   ""
    789   "%|%.\\tsmpy2\\t%$\\t%1, %2, %k0"
    790   [(set_attr "type" "mpy4")
    791    (set_attr "units" "m")
    792    (set_attr "cross" "n,n,y,y")])
    793 
    794 (define_insn "mulhqsq3_real"
    795   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    796         (ss_mult:SQ
    797 	 (fract_convert:SQ
    798 	  (match_operand:HQ 1 "register_operand" "%a,b,?a,?b"))
    799 	 (fract_convert:SQ
    800 	  (match_operand:HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    801   ""
    802   "%|%.\\tsmpy\\t%$\\t%1, %2, %k0"
    803   [(set_attr "type" "mpy2")
    804    (set_attr "units" "m")
    805    (set_attr "cross" "n,n,y,y")])
    806 
    807 (define_insn "mulhqsq3_lh_real"
    808   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    809         (ss_mult:SQ
    810 	 (fract_convert:SQ
    811 	  (match_operand:HQ 1 "register_operand" "a,b,?a,?b"))
    812 	 (fract_convert:SQ
    813 	  (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))] UNSPEC_REAL_MULT)]
    814   ""
    815   "%|%.\\tsmpylh\\t%$\\t%1, %2, %k0"
    816   [(set_attr "type" "mpy2")
    817    (set_attr "units" "m")
    818    (set_attr "cross" "n,n,y,y")])
    819 
    820 (define_insn "mulhqsq3_hl_real"
    821   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    822         (ss_mult:SQ
    823 	 (fract_convert:SQ
    824 	  (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a")))
    825 	 (fract_convert:SQ
    826 	  (match_operand:HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)]
    827   ""
    828   "%|%.\\tsmpyhl\\t%$\\t%1, %2, %k0"
    829   [(set_attr "type" "mpy2")
    830    (set_attr "units" "m")
    831    (set_attr "cross" "n,n,y,y")])
    832 
    833 (define_insn "mulhqsq3_hh_real"
    834   [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB")
    835         (ss_mult:SQ
    836 	 (fract_convert:SQ
    837 	  (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a")))
    838 	 (fract_convert:SQ
    839 	  (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))] UNSPEC_REAL_MULT)]
    840   ""
    841   "%|%.\\tsmpyh\\t%$\\t%1, %2, %k0"
    842   [(set_attr "type" "mpy2")
    843    (set_attr "units" "m")
    844    (set_attr "cross" "n,n,y,y")])
    845