OSDN Git Service

PR target/53789
[pf3gnuchains/gcc-fork.git] / gcc / config / c6x / c6x-mult.md
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, 2011 Free Software Foundation, Inc.
7 ;; Contributed by Bernd Schmidt <bernds@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, 2011 Free Software Foundation, Inc.
428 ;; Contributed by Bernd Schmidt <bernds@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")])