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