OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [config/] [c6x/] [c6x-mult.md] - Blame information for rev 867

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 709 jeremybenn
;; -*- 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 
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
;; .
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 "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\\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 
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
;; .
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 "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\\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")])

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.