111
|
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.
|
131
|
6 ;; Copyright (C) 2010-2018 Free Software Foundation, Inc.
|
111
|
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.
|
131
|
427 ;; Copyright (C) 2010-2018 Free Software Foundation, Inc.
|
111
|
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")])
|