xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/c6x/c6x-mult.md (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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-2020 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-2020 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")])
845