xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/arm/iwmmxt.md (revision 230b95665bbd3a9d1a53658a36b1053f8382a519)
1;; ??? This file needs auditing for thumb2
2;; Patterns for the Intel Wireless MMX technology architecture.
3;; Copyright (C) 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
4;; Contributed by Red Hat.
5
6;; This file is part of GCC.
7
8;; GCC is free software; you can redistribute it and/or modify it under
9;; the terms of the GNU General Public License as published by the Free
10;; Software Foundation; either version 3, or (at your option) any later
11;; version.
12
13;; GCC is distributed in the hope that it will be useful, but WITHOUT
14;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16;; License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with GCC; see the file COPYING3.  If not see
20;; <http://www.gnu.org/licenses/>.
21
22;; Integer element sizes implemented by IWMMXT.
23(define_mode_iterator VMMX [V2SI V4HI V8QI])
24
25;; Integer element sizes for shifts.
26(define_mode_iterator VSHFT [V4HI V2SI DI])
27
28;; Determine element size suffix from vector mode.
29(define_mode_attr MMX_char [(V8QI "b") (V4HI "h") (V2SI "w") (DI "d")])
30
31(define_insn "iwmmxt_iordi3"
32  [(set (match_operand:DI         0 "register_operand" "=y,?&r,?&r")
33        (ior:DI (match_operand:DI 1 "register_operand" "%y,0,r")
34		(match_operand:DI 2 "register_operand"  "y,r,r")))]
35  "TARGET_REALLY_IWMMXT"
36  "@
37   wor%?\\t%0, %1, %2
38   #
39   #"
40  [(set_attr "predicable" "yes")
41   (set_attr "length" "4,8,8")])
42
43(define_insn "iwmmxt_xordi3"
44  [(set (match_operand:DI         0 "register_operand" "=y,?&r,?&r")
45        (xor:DI (match_operand:DI 1 "register_operand" "%y,0,r")
46		(match_operand:DI 2 "register_operand"  "y,r,r")))]
47  "TARGET_REALLY_IWMMXT"
48  "@
49   wxor%?\\t%0, %1, %2
50   #
51   #"
52  [(set_attr "predicable" "yes")
53   (set_attr "length" "4,8,8")])
54
55(define_insn "iwmmxt_anddi3"
56  [(set (match_operand:DI         0 "register_operand" "=y,?&r,?&r")
57        (and:DI (match_operand:DI 1 "register_operand" "%y,0,r")
58		(match_operand:DI 2 "register_operand"  "y,r,r")))]
59  "TARGET_REALLY_IWMMXT"
60  "@
61   wand%?\\t%0, %1, %2
62   #
63   #"
64  [(set_attr "predicable" "yes")
65   (set_attr "length" "4,8,8")])
66
67(define_insn "iwmmxt_nanddi3"
68  [(set (match_operand:DI                 0 "register_operand" "=y")
69        (and:DI (match_operand:DI         1 "register_operand"  "y")
70		(not:DI (match_operand:DI 2 "register_operand"  "y"))))]
71  "TARGET_REALLY_IWMMXT"
72  "wandn%?\\t%0, %1, %2"
73  [(set_attr "predicable" "yes")])
74
75(define_insn "*iwmmxt_arm_movdi"
76  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, m,y,y,yr,y,yrUy")
77	(match_operand:DI 1 "di_operand"              "rIK,mi,r,y,yr,y,yrUy,y"))]
78  "TARGET_REALLY_IWMMXT
79   && (   register_operand (operands[0], DImode)
80       || register_operand (operands[1], DImode))"
81  "*
82{
83  switch (which_alternative)
84    {
85    default:
86      return output_move_double (operands);
87    case 0:
88      return \"#\";
89    case 3:
90      return \"wmov%?\\t%0,%1\";
91    case 4:
92      return \"tmcrr%?\\t%0,%Q1,%R1\";
93    case 5:
94      return \"tmrrc%?\\t%Q0,%R0,%1\";
95    case 6:
96      return \"wldrd%?\\t%0,%1\";
97    case 7:
98      return \"wstrd%?\\t%1,%0\";
99    }
100}"
101  [(set_attr "length"         "8,8,8,4,4,4,4,4")
102   (set_attr "type"           "*,load1,store2,*,*,*,*,*")
103   (set_attr "pool_range"     "*,1020,*,*,*,*,*,*")
104   (set_attr "neg_pool_range" "*,1012,*,*,*,*,*,*")]
105)
106
107(define_insn "*iwmmxt_movsi_insn"
108  [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,rk, m,z,r,?z,Uy,z")
109	(match_operand:SI 1 "general_operand"      "rk, I,K,mi,rk,r,z,Uy,z, z"))]
110  "TARGET_REALLY_IWMMXT
111   && (   register_operand (operands[0], SImode)
112       || register_operand (operands[1], SImode))"
113  "*
114   switch (which_alternative)
115   {
116   case 0: return \"mov\\t%0, %1\";
117   case 1: return \"mov\\t%0, %1\";
118   case 2: return \"mvn\\t%0, #%B1\";
119   case 3: return \"ldr\\t%0, %1\";
120   case 4: return \"str\\t%1, %0\";
121   case 5: return \"tmcr\\t%0, %1\";
122   case 6: return \"tmrc\\t%0, %1\";
123   case 7: return arm_output_load_gr (operands);
124   case 8: return \"wstrw\\t%1, %0\";
125   default:return \"wstrw\\t%1, [sp, #-4]!\;wldrw\\t%0, [sp], #4\\t@move CG reg\";
126  }"
127  [(set_attr "type"           "*,*,*,load1,store1,*,*,load1,store1,*")
128   (set_attr "length"         "*,*,*,*,        *,*,*,  16,     *,8")
129   (set_attr "pool_range"     "*,*,*,4096,     *,*,*,1024,     *,*")
130   (set_attr "neg_pool_range" "*,*,*,4084,     *,*,*,   *,  1012,*")
131   ;; Note - the "predicable" attribute is not allowed to have alternatives.
132   ;; Since the wSTRw wCx instruction is not predicable, we cannot support
133   ;; predicating any of the alternatives in this template.  Instead,
134   ;; we do the predication ourselves, in cond_iwmmxt_movsi_insn.
135   (set_attr "predicable"     "no")
136   ;; Also - we have to pretend that these insns clobber the condition code
137   ;; bits as otherwise arm_final_prescan_insn() will try to conditionalize
138   ;; them.
139   (set_attr "conds" "clob")]
140)
141
142;; Because iwmmxt_movsi_insn is not predicable, we provide the
143;; cond_exec version explicitly, with appropriate constraints.
144
145(define_insn "*cond_iwmmxt_movsi_insn"
146  [(cond_exec
147     (match_operator 2 "arm_comparison_operator"
148      [(match_operand 3 "cc_register" "")
149      (const_int 0)])
150     (set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r, m,z,r")
151	  (match_operand:SI 1 "general_operand"      "rI,K,mi,r,r,z")))]
152  "TARGET_REALLY_IWMMXT
153   && (   register_operand (operands[0], SImode)
154       || register_operand (operands[1], SImode))"
155  "*
156   switch (which_alternative)
157   {
158   case 0: return \"mov%?\\t%0, %1\";
159   case 1: return \"mvn%?\\t%0, #%B1\";
160   case 2: return \"ldr%?\\t%0, %1\";
161   case 3: return \"str%?\\t%1, %0\";
162   case 4: return \"tmcr%?\\t%0, %1\";
163   default: return \"tmrc%?\\t%0, %1\";
164  }"
165  [(set_attr "type"           "*,*,load1,store1,*,*")
166   (set_attr "pool_range"     "*,*,4096,     *,*,*")
167   (set_attr "neg_pool_range" "*,*,4084,     *,*,*")]
168)
169
170(define_insn "mov<mode>_internal"
171  [(set (match_operand:VMMX 0 "nonimmediate_operand" "=y,m,y,?r,?y,?r,?r,?m")
172	(match_operand:VMMX 1 "general_operand"       "y,y,mi,y,r,r,mi,r"))]
173  "TARGET_REALLY_IWMMXT"
174  "*
175   switch (which_alternative)
176   {
177   case 0: return \"wmov%?\\t%0, %1\";
178   case 1: return \"wstrd%?\\t%1, %0\";
179   case 2: return \"wldrd%?\\t%0, %1\";
180   case 3: return \"tmrrc%?\\t%Q0, %R0, %1\";
181   case 4: return \"tmcrr%?\\t%0, %Q1, %R1\";
182   case 5: return \"#\";
183   default: return output_move_double (operands);
184   }"
185  [(set_attr "predicable" "yes")
186   (set_attr "length"         "4,     4,   4,4,4,8,   8,8")
187   (set_attr "type"           "*,store1,load1,*,*,*,load1,store1")
188   (set_attr "pool_range"     "*,     *, 256,*,*,*, 256,*")
189   (set_attr "neg_pool_range" "*,     *, 244,*,*,*, 244,*")])
190
191;; Vector add/subtract
192
193(define_insn "*add<mode>3_iwmmxt"
194  [(set (match_operand:VMMX            0 "register_operand" "=y")
195        (plus:VMMX (match_operand:VMMX 1 "register_operand"  "y")
196	           (match_operand:VMMX 2 "register_operand"  "y")))]
197  "TARGET_REALLY_IWMMXT"
198  "wadd<MMX_char>%?\\t%0, %1, %2"
199  [(set_attr "predicable" "yes")])
200
201(define_insn "ssaddv8qi3"
202  [(set (match_operand:V8QI               0 "register_operand" "=y")
203        (ss_plus:V8QI (match_operand:V8QI 1 "register_operand"  "y")
204		      (match_operand:V8QI 2 "register_operand"  "y")))]
205  "TARGET_REALLY_IWMMXT"
206  "waddbss%?\\t%0, %1, %2"
207  [(set_attr "predicable" "yes")])
208
209(define_insn "ssaddv4hi3"
210  [(set (match_operand:V4HI               0 "register_operand" "=y")
211        (ss_plus:V4HI (match_operand:V4HI 1 "register_operand"  "y")
212		      (match_operand:V4HI 2 "register_operand"  "y")))]
213  "TARGET_REALLY_IWMMXT"
214  "waddhss%?\\t%0, %1, %2"
215  [(set_attr "predicable" "yes")])
216
217(define_insn "ssaddv2si3"
218  [(set (match_operand:V2SI               0 "register_operand" "=y")
219        (ss_plus:V2SI (match_operand:V2SI 1 "register_operand"  "y")
220		      (match_operand:V2SI 2 "register_operand"  "y")))]
221  "TARGET_REALLY_IWMMXT"
222  "waddwss%?\\t%0, %1, %2"
223  [(set_attr "predicable" "yes")])
224
225(define_insn "usaddv8qi3"
226  [(set (match_operand:V8QI               0 "register_operand" "=y")
227        (us_plus:V8QI (match_operand:V8QI 1 "register_operand"  "y")
228		      (match_operand:V8QI 2 "register_operand"  "y")))]
229  "TARGET_REALLY_IWMMXT"
230  "waddbus%?\\t%0, %1, %2"
231  [(set_attr "predicable" "yes")])
232
233(define_insn "usaddv4hi3"
234  [(set (match_operand:V4HI               0 "register_operand" "=y")
235        (us_plus:V4HI (match_operand:V4HI 1 "register_operand"  "y")
236		      (match_operand:V4HI 2 "register_operand"  "y")))]
237  "TARGET_REALLY_IWMMXT"
238  "waddhus%?\\t%0, %1, %2"
239  [(set_attr "predicable" "yes")])
240
241(define_insn "usaddv2si3"
242  [(set (match_operand:V2SI               0 "register_operand" "=y")
243        (us_plus:V2SI (match_operand:V2SI 1 "register_operand"  "y")
244		      (match_operand:V2SI 2 "register_operand"  "y")))]
245  "TARGET_REALLY_IWMMXT"
246  "waddwus%?\\t%0, %1, %2"
247  [(set_attr "predicable" "yes")])
248
249(define_insn "*sub<mode>3_iwmmxt"
250  [(set (match_operand:VMMX             0 "register_operand" "=y")
251        (minus:VMMX (match_operand:VMMX 1 "register_operand"  "y")
252		    (match_operand:VMMX 2 "register_operand"  "y")))]
253  "TARGET_REALLY_IWMMXT"
254  "wsub<MMX_char>%?\\t%0, %1, %2"
255  [(set_attr "predicable" "yes")])
256
257(define_insn "sssubv8qi3"
258  [(set (match_operand:V8QI                0 "register_operand" "=y")
259        (ss_minus:V8QI (match_operand:V8QI 1 "register_operand"  "y")
260		       (match_operand:V8QI 2 "register_operand"  "y")))]
261  "TARGET_REALLY_IWMMXT"
262  "wsubbss%?\\t%0, %1, %2"
263  [(set_attr "predicable" "yes")])
264
265(define_insn "sssubv4hi3"
266  [(set (match_operand:V4HI                0 "register_operand" "=y")
267        (ss_minus:V4HI (match_operand:V4HI 1 "register_operand" "y")
268		       (match_operand:V4HI 2 "register_operand" "y")))]
269  "TARGET_REALLY_IWMMXT"
270  "wsubhss%?\\t%0, %1, %2"
271  [(set_attr "predicable" "yes")])
272
273(define_insn "sssubv2si3"
274  [(set (match_operand:V2SI                0 "register_operand" "=y")
275        (ss_minus:V2SI (match_operand:V2SI 1 "register_operand" "y")
276		       (match_operand:V2SI 2 "register_operand" "y")))]
277  "TARGET_REALLY_IWMMXT"
278  "wsubwss%?\\t%0, %1, %2"
279  [(set_attr "predicable" "yes")])
280
281(define_insn "ussubv8qi3"
282  [(set (match_operand:V8QI                0 "register_operand" "=y")
283        (us_minus:V8QI (match_operand:V8QI 1 "register_operand" "y")
284		       (match_operand:V8QI 2 "register_operand" "y")))]
285  "TARGET_REALLY_IWMMXT"
286  "wsubbus%?\\t%0, %1, %2"
287  [(set_attr "predicable" "yes")])
288
289(define_insn "ussubv4hi3"
290  [(set (match_operand:V4HI                0 "register_operand" "=y")
291        (us_minus:V4HI (match_operand:V4HI 1 "register_operand" "y")
292		       (match_operand:V4HI 2 "register_operand" "y")))]
293  "TARGET_REALLY_IWMMXT"
294  "wsubhus%?\\t%0, %1, %2"
295  [(set_attr "predicable" "yes")])
296
297(define_insn "ussubv2si3"
298  [(set (match_operand:V2SI                0 "register_operand" "=y")
299        (us_minus:V2SI (match_operand:V2SI 1 "register_operand" "y")
300		       (match_operand:V2SI 2 "register_operand" "y")))]
301  "TARGET_REALLY_IWMMXT"
302  "wsubwus%?\\t%0, %1, %2"
303  [(set_attr "predicable" "yes")])
304
305(define_insn "*mulv4hi3_iwmmxt"
306  [(set (match_operand:V4HI            0 "register_operand" "=y")
307        (mult:V4HI (match_operand:V4HI 1 "register_operand" "y")
308		   (match_operand:V4HI 2 "register_operand" "y")))]
309  "TARGET_REALLY_IWMMXT"
310  "wmulul%?\\t%0, %1, %2"
311  [(set_attr "predicable" "yes")])
312
313(define_insn "smulv4hi3_highpart"
314  [(set (match_operand:V4HI                                0 "register_operand" "=y")
315	(truncate:V4HI
316	 (lshiftrt:V4SI
317	  (mult:V4SI (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
318		     (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
319	  (const_int 16))))]
320  "TARGET_REALLY_IWMMXT"
321  "wmulsm%?\\t%0, %1, %2"
322  [(set_attr "predicable" "yes")])
323
324(define_insn "umulv4hi3_highpart"
325  [(set (match_operand:V4HI                                0 "register_operand" "=y")
326	(truncate:V4HI
327	 (lshiftrt:V4SI
328	  (mult:V4SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
329		     (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
330	  (const_int 16))))]
331  "TARGET_REALLY_IWMMXT"
332  "wmulum%?\\t%0, %1, %2"
333  [(set_attr "predicable" "yes")])
334
335(define_insn "iwmmxt_wmacs"
336  [(set (match_operand:DI               0 "register_operand" "=y")
337	(unspec:DI [(match_operand:DI   1 "register_operand" "0")
338		    (match_operand:V4HI 2 "register_operand" "y")
339		    (match_operand:V4HI 3 "register_operand" "y")] UNSPEC_WMACS))]
340  "TARGET_REALLY_IWMMXT"
341  "wmacs%?\\t%0, %2, %3"
342  [(set_attr "predicable" "yes")])
343
344(define_insn "iwmmxt_wmacsz"
345  [(set (match_operand:DI               0 "register_operand" "=y")
346	(unspec:DI [(match_operand:V4HI 1 "register_operand" "y")
347		    (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMACSZ))]
348  "TARGET_REALLY_IWMMXT"
349  "wmacsz%?\\t%0, %1, %2"
350  [(set_attr "predicable" "yes")])
351
352(define_insn "iwmmxt_wmacu"
353  [(set (match_operand:DI               0 "register_operand" "=y")
354	(unspec:DI [(match_operand:DI   1 "register_operand" "0")
355		    (match_operand:V4HI 2 "register_operand" "y")
356		    (match_operand:V4HI 3 "register_operand" "y")] UNSPEC_WMACU))]
357  "TARGET_REALLY_IWMMXT"
358  "wmacu%?\\t%0, %2, %3"
359  [(set_attr "predicable" "yes")])
360
361(define_insn "iwmmxt_wmacuz"
362  [(set (match_operand:DI               0 "register_operand" "=y")
363	(unspec:DI [(match_operand:V4HI 1 "register_operand" "y")
364		    (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMACUZ))]
365  "TARGET_REALLY_IWMMXT"
366  "wmacuz%?\\t%0, %1, %2"
367  [(set_attr "predicable" "yes")])
368
369;; Same as xordi3, but don't show input operands so that we don't think
370;; they are live.
371(define_insn "iwmmxt_clrdi"
372  [(set (match_operand:DI 0 "register_operand" "=y")
373        (unspec:DI [(const_int 0)] UNSPEC_CLRDI))]
374  "TARGET_REALLY_IWMMXT"
375  "wxor%?\\t%0, %0, %0"
376  [(set_attr "predicable" "yes")])
377
378;; Seems like cse likes to generate these, so we have to support them.
379
380(define_insn "*iwmmxt_clrv8qi"
381  [(set (match_operand:V8QI 0 "register_operand" "=y")
382        (const_vector:V8QI [(const_int 0) (const_int 0)
383			    (const_int 0) (const_int 0)
384			    (const_int 0) (const_int 0)
385			    (const_int 0) (const_int 0)]))]
386  "TARGET_REALLY_IWMMXT"
387  "wxor%?\\t%0, %0, %0"
388  [(set_attr "predicable" "yes")])
389
390(define_insn "*iwmmxt_clrv4hi"
391  [(set (match_operand:V4HI 0 "register_operand" "=y")
392        (const_vector:V4HI [(const_int 0) (const_int 0)
393			    (const_int 0) (const_int 0)]))]
394  "TARGET_REALLY_IWMMXT"
395  "wxor%?\\t%0, %0, %0"
396  [(set_attr "predicable" "yes")])
397
398(define_insn "*iwmmxt_clrv2si"
399  [(set (match_operand:V2SI 0 "register_operand" "=y")
400        (const_vector:V2SI [(const_int 0) (const_int 0)]))]
401  "TARGET_REALLY_IWMMXT"
402  "wxor%?\\t%0, %0, %0"
403  [(set_attr "predicable" "yes")])
404
405;; Unsigned averages/sum of absolute differences
406
407(define_insn "iwmmxt_uavgrndv8qi3"
408  [(set (match_operand:V8QI              0 "register_operand" "=y")
409        (ashiftrt:V8QI
410	 (plus:V8QI (plus:V8QI
411		     (match_operand:V8QI 1 "register_operand" "y")
412		     (match_operand:V8QI 2 "register_operand" "y"))
413		    (const_vector:V8QI [(const_int 1)
414					(const_int 1)
415					(const_int 1)
416					(const_int 1)
417					(const_int 1)
418					(const_int 1)
419					(const_int 1)
420					(const_int 1)]))
421	 (const_int 1)))]
422  "TARGET_REALLY_IWMMXT"
423  "wavg2br%?\\t%0, %1, %2"
424  [(set_attr "predicable" "yes")])
425
426(define_insn "iwmmxt_uavgrndv4hi3"
427  [(set (match_operand:V4HI              0 "register_operand" "=y")
428        (ashiftrt:V4HI
429	 (plus:V4HI (plus:V4HI
430		     (match_operand:V4HI 1 "register_operand" "y")
431		     (match_operand:V4HI 2 "register_operand" "y"))
432		    (const_vector:V4HI [(const_int 1)
433					(const_int 1)
434					(const_int 1)
435					(const_int 1)]))
436	 (const_int 1)))]
437  "TARGET_REALLY_IWMMXT"
438  "wavg2hr%?\\t%0, %1, %2"
439  [(set_attr "predicable" "yes")])
440
441
442(define_insn "iwmmxt_uavgv8qi3"
443  [(set (match_operand:V8QI                 0 "register_operand" "=y")
444        (ashiftrt:V8QI (plus:V8QI
445			(match_operand:V8QI 1 "register_operand" "y")
446			(match_operand:V8QI 2 "register_operand" "y"))
447		       (const_int 1)))]
448  "TARGET_REALLY_IWMMXT"
449  "wavg2b%?\\t%0, %1, %2"
450  [(set_attr "predicable" "yes")])
451
452(define_insn "iwmmxt_uavgv4hi3"
453  [(set (match_operand:V4HI                 0 "register_operand" "=y")
454        (ashiftrt:V4HI (plus:V4HI
455			(match_operand:V4HI 1 "register_operand" "y")
456			(match_operand:V4HI 2 "register_operand" "y"))
457		       (const_int 1)))]
458  "TARGET_REALLY_IWMMXT"
459  "wavg2h%?\\t%0, %1, %2"
460  [(set_attr "predicable" "yes")])
461
462(define_insn "iwmmxt_psadbw"
463  [(set (match_operand:V8QI                       0 "register_operand" "=y")
464        (abs:V8QI (minus:V8QI (match_operand:V8QI 1 "register_operand" "y")
465			      (match_operand:V8QI 2 "register_operand" "y"))))]
466  "TARGET_REALLY_IWMMXT"
467  "psadbw%?\\t%0, %1, %2"
468  [(set_attr "predicable" "yes")])
469
470
471;; Insert/extract/shuffle
472
473(define_insn "iwmmxt_tinsrb"
474  [(set (match_operand:V8QI                             0 "register_operand"    "=y")
475        (vec_merge:V8QI (match_operand:V8QI             1 "register_operand"     "0")
476			(vec_duplicate:V8QI
477			 (truncate:QI (match_operand:SI 2 "nonimmediate_operand" "r")))
478			(match_operand:SI               3 "immediate_operand"    "i")))]
479  "TARGET_REALLY_IWMMXT"
480  "tinsrb%?\\t%0, %2, %3"
481  [(set_attr "predicable" "yes")])
482
483(define_insn "iwmmxt_tinsrh"
484  [(set (match_operand:V4HI                             0 "register_operand"    "=y")
485        (vec_merge:V4HI (match_operand:V4HI             1 "register_operand"     "0")
486			(vec_duplicate:V4HI
487			 (truncate:HI (match_operand:SI 2 "nonimmediate_operand" "r")))
488			(match_operand:SI               3 "immediate_operand"    "i")))]
489  "TARGET_REALLY_IWMMXT"
490  "tinsrh%?\\t%0, %2, %3"
491  [(set_attr "predicable" "yes")])
492
493(define_insn "iwmmxt_tinsrw"
494  [(set (match_operand:V2SI                 0 "register_operand"    "=y")
495        (vec_merge:V2SI (match_operand:V2SI 1 "register_operand"     "0")
496			(vec_duplicate:V2SI
497			 (match_operand:SI  2 "nonimmediate_operand" "r"))
498			(match_operand:SI   3 "immediate_operand"    "i")))]
499  "TARGET_REALLY_IWMMXT"
500  "tinsrw%?\\t%0, %2, %3"
501  [(set_attr "predicable" "yes")])
502
503(define_insn "iwmmxt_textrmub"
504  [(set (match_operand:SI                                  0 "register_operand" "=r")
505        (zero_extend:SI (vec_select:QI (match_operand:V8QI 1 "register_operand" "y")
506				       (parallel
507					[(match_operand:SI 2 "immediate_operand" "i")]))))]
508  "TARGET_REALLY_IWMMXT"
509  "textrmub%?\\t%0, %1, %2"
510  [(set_attr "predicable" "yes")])
511
512(define_insn "iwmmxt_textrmsb"
513  [(set (match_operand:SI                                  0 "register_operand" "=r")
514        (sign_extend:SI (vec_select:QI (match_operand:V8QI 1 "register_operand" "y")
515				       (parallel
516					[(match_operand:SI 2 "immediate_operand" "i")]))))]
517  "TARGET_REALLY_IWMMXT"
518  "textrmsb%?\\t%0, %1, %2"
519  [(set_attr "predicable" "yes")])
520
521(define_insn "iwmmxt_textrmuh"
522  [(set (match_operand:SI                                  0 "register_operand" "=r")
523        (zero_extend:SI (vec_select:HI (match_operand:V4HI 1 "register_operand" "y")
524				       (parallel
525					[(match_operand:SI 2 "immediate_operand" "i")]))))]
526  "TARGET_REALLY_IWMMXT"
527  "textrmuh%?\\t%0, %1, %2"
528  [(set_attr "predicable" "yes")])
529
530(define_insn "iwmmxt_textrmsh"
531  [(set (match_operand:SI                                  0 "register_operand" "=r")
532        (sign_extend:SI (vec_select:HI (match_operand:V4HI 1 "register_operand" "y")
533				       (parallel
534					[(match_operand:SI 2 "immediate_operand" "i")]))))]
535  "TARGET_REALLY_IWMMXT"
536  "textrmsh%?\\t%0, %1, %2"
537  [(set_attr "predicable" "yes")])
538
539;; There are signed/unsigned variants of this instruction, but they are
540;; pointless.
541(define_insn "iwmmxt_textrmw"
542  [(set (match_operand:SI                           0 "register_operand" "=r")
543        (vec_select:SI (match_operand:V2SI          1 "register_operand" "y")
544		       (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
545  "TARGET_REALLY_IWMMXT"
546  "textrmsw%?\\t%0, %1, %2"
547  [(set_attr "predicable" "yes")])
548
549(define_insn "iwmmxt_wshufh"
550  [(set (match_operand:V4HI               0 "register_operand" "=y")
551        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
552		      (match_operand:SI   2 "immediate_operand" "i")] UNSPEC_WSHUFH))]
553  "TARGET_REALLY_IWMMXT"
554  "wshufh%?\\t%0, %1, %2"
555  [(set_attr "predicable" "yes")])
556
557;; Mask-generating comparisons
558;;
559;; Note - you cannot use patterns like these here:
560;;
561;;   (set:<vector> (match:<vector>) (<comparator>:<vector> (match:<vector>) (match:<vector>)))
562;;
563;; Because GCC will assume that the truth value (1 or 0) is installed
564;; into the entire destination vector, (with the '1' going into the least
565;; significant element of the vector).  This is not how these instructions
566;; behave.
567;;
568;; Unfortunately the current patterns are illegal.  They are SET insns
569;; without a SET in them.  They work in most cases for ordinary code
570;; generation, but there are circumstances where they can cause gcc to fail.
571;; XXX - FIXME.
572
573(define_insn "eqv8qi3"
574  [(unspec_volatile [(match_operand:V8QI 0 "register_operand" "=y")
575		     (match_operand:V8QI 1 "register_operand"  "y")
576		     (match_operand:V8QI 2 "register_operand"  "y")]
577		    VUNSPEC_WCMP_EQ)]
578  "TARGET_REALLY_IWMMXT"
579  "wcmpeqb%?\\t%0, %1, %2"
580  [(set_attr "predicable" "yes")])
581
582(define_insn "eqv4hi3"
583  [(unspec_volatile [(match_operand:V4HI 0 "register_operand" "=y")
584		     (match_operand:V4HI 1 "register_operand"  "y")
585		     (match_operand:V4HI 2 "register_operand"  "y")]
586		    VUNSPEC_WCMP_EQ)]
587  "TARGET_REALLY_IWMMXT"
588  "wcmpeqh%?\\t%0, %1, %2"
589  [(set_attr "predicable" "yes")])
590
591(define_insn "eqv2si3"
592  [(unspec_volatile:V2SI [(match_operand:V2SI 0 "register_operand" "=y")
593			  (match_operand:V2SI 1 "register_operand"  "y")
594			  (match_operand:V2SI 2 "register_operand"  "y")]
595			 VUNSPEC_WCMP_EQ)]
596  "TARGET_REALLY_IWMMXT"
597  "wcmpeqw%?\\t%0, %1, %2"
598  [(set_attr "predicable" "yes")])
599
600(define_insn "gtuv8qi3"
601  [(unspec_volatile [(match_operand:V8QI 0 "register_operand" "=y")
602		     (match_operand:V8QI 1 "register_operand"  "y")
603		     (match_operand:V8QI 2 "register_operand"  "y")]
604		    VUNSPEC_WCMP_GTU)]
605  "TARGET_REALLY_IWMMXT"
606  "wcmpgtub%?\\t%0, %1, %2"
607  [(set_attr "predicable" "yes")])
608
609(define_insn "gtuv4hi3"
610  [(unspec_volatile [(match_operand:V4HI 0 "register_operand" "=y")
611		     (match_operand:V4HI 1 "register_operand"  "y")
612		     (match_operand:V4HI 2 "register_operand"  "y")]
613		    VUNSPEC_WCMP_GTU)]
614  "TARGET_REALLY_IWMMXT"
615  "wcmpgtuh%?\\t%0, %1, %2"
616  [(set_attr "predicable" "yes")])
617
618(define_insn "gtuv2si3"
619  [(unspec_volatile [(match_operand:V2SI 0 "register_operand" "=y")
620		     (match_operand:V2SI 1 "register_operand"  "y")
621		     (match_operand:V2SI 2 "register_operand"  "y")]
622		    VUNSPEC_WCMP_GTU)]
623  "TARGET_REALLY_IWMMXT"
624  "wcmpgtuw%?\\t%0, %1, %2"
625  [(set_attr "predicable" "yes")])
626
627(define_insn "gtv8qi3"
628  [(unspec_volatile [(match_operand:V8QI 0 "register_operand" "=y")
629		     (match_operand:V8QI 1 "register_operand"  "y")
630		     (match_operand:V8QI 2 "register_operand"  "y")]
631		    VUNSPEC_WCMP_GT)]
632  "TARGET_REALLY_IWMMXT"
633  "wcmpgtsb%?\\t%0, %1, %2"
634  [(set_attr "predicable" "yes")])
635
636(define_insn "gtv4hi3"
637  [(unspec_volatile [(match_operand:V4HI 0 "register_operand" "=y")
638		     (match_operand:V4HI 1 "register_operand"  "y")
639		     (match_operand:V4HI 2 "register_operand"  "y")]
640		    VUNSPEC_WCMP_GT)]
641  "TARGET_REALLY_IWMMXT"
642  "wcmpgtsh%?\\t%0, %1, %2"
643  [(set_attr "predicable" "yes")])
644
645(define_insn "gtv2si3"
646  [(unspec_volatile [(match_operand:V2SI 0 "register_operand" "=y")
647		     (match_operand:V2SI 1 "register_operand"  "y")
648		     (match_operand:V2SI 2 "register_operand"  "y")]
649		    VUNSPEC_WCMP_GT)]
650  "TARGET_REALLY_IWMMXT"
651  "wcmpgtsw%?\\t%0, %1, %2"
652  [(set_attr "predicable" "yes")])
653
654;; Max/min insns
655
656(define_insn "*smax<mode>3_iwmmxt"
657  [(set (match_operand:VMMX            0 "register_operand" "=y")
658        (smax:VMMX (match_operand:VMMX 1 "register_operand" "y")
659		   (match_operand:VMMX 2 "register_operand" "y")))]
660  "TARGET_REALLY_IWMMXT"
661  "wmaxs<MMX_char>%?\\t%0, %1, %2"
662  [(set_attr "predicable" "yes")])
663
664(define_insn "*umax<mode>3_iwmmxt"
665  [(set (match_operand:VMMX            0 "register_operand" "=y")
666        (umax:VMMX (match_operand:VMMX 1 "register_operand" "y")
667		   (match_operand:VMMX 2 "register_operand" "y")))]
668  "TARGET_REALLY_IWMMXT"
669  "wmaxu<MMX_char>%?\\t%0, %1, %2"
670  [(set_attr "predicable" "yes")])
671
672(define_insn "*smin<mode>3_iwmmxt"
673  [(set (match_operand:VMMX            0 "register_operand" "=y")
674        (smin:VMMX (match_operand:VMMX 1 "register_operand" "y")
675		   (match_operand:VMMX 2 "register_operand" "y")))]
676  "TARGET_REALLY_IWMMXT"
677  "wmins<MMX_char>%?\\t%0, %1, %2"
678  [(set_attr "predicable" "yes")])
679
680(define_insn "*umin<mode>3_iwmmxt"
681  [(set (match_operand:VMMX            0 "register_operand" "=y")
682        (umin:VMMX (match_operand:VMMX 1 "register_operand" "y")
683		   (match_operand:VMMX 2 "register_operand" "y")))]
684  "TARGET_REALLY_IWMMXT"
685  "wminu<MMX_char>%?\\t%0, %1, %2"
686  [(set_attr "predicable" "yes")])
687
688;; Pack/unpack insns.
689
690(define_insn "iwmmxt_wpackhss"
691  [(set (match_operand:V8QI                    0 "register_operand" "=y")
692	(vec_concat:V8QI
693	 (ss_truncate:V4QI (match_operand:V4HI 1 "register_operand" "y"))
694	 (ss_truncate:V4QI (match_operand:V4HI 2 "register_operand" "y"))))]
695  "TARGET_REALLY_IWMMXT"
696  "wpackhss%?\\t%0, %1, %2"
697  [(set_attr "predicable" "yes")])
698
699(define_insn "iwmmxt_wpackwss"
700  [(set (match_operand:V4HI                    0 "register_operand" "=y")
701	(vec_concat:V4HI
702	 (ss_truncate:V2HI (match_operand:V2SI 1 "register_operand" "y"))
703	 (ss_truncate:V2HI (match_operand:V2SI 2 "register_operand" "y"))))]
704  "TARGET_REALLY_IWMMXT"
705  "wpackwss%?\\t%0, %1, %2"
706  [(set_attr "predicable" "yes")])
707
708(define_insn "iwmmxt_wpackdss"
709  [(set (match_operand:V2SI                0 "register_operand" "=y")
710	(vec_concat:V2SI
711	 (ss_truncate:SI (match_operand:DI 1 "register_operand" "y"))
712	 (ss_truncate:SI (match_operand:DI 2 "register_operand" "y"))))]
713  "TARGET_REALLY_IWMMXT"
714  "wpackdss%?\\t%0, %1, %2"
715  [(set_attr "predicable" "yes")])
716
717(define_insn "iwmmxt_wpackhus"
718  [(set (match_operand:V8QI                    0 "register_operand" "=y")
719	(vec_concat:V8QI
720	 (us_truncate:V4QI (match_operand:V4HI 1 "register_operand" "y"))
721	 (us_truncate:V4QI (match_operand:V4HI 2 "register_operand" "y"))))]
722  "TARGET_REALLY_IWMMXT"
723  "wpackhus%?\\t%0, %1, %2"
724  [(set_attr "predicable" "yes")])
725
726(define_insn "iwmmxt_wpackwus"
727  [(set (match_operand:V4HI                    0 "register_operand" "=y")
728	(vec_concat:V4HI
729	 (us_truncate:V2HI (match_operand:V2SI 1 "register_operand" "y"))
730	 (us_truncate:V2HI (match_operand:V2SI 2 "register_operand" "y"))))]
731  "TARGET_REALLY_IWMMXT"
732  "wpackwus%?\\t%0, %1, %2"
733  [(set_attr "predicable" "yes")])
734
735(define_insn "iwmmxt_wpackdus"
736  [(set (match_operand:V2SI                0 "register_operand" "=y")
737	(vec_concat:V2SI
738	 (us_truncate:SI (match_operand:DI 1 "register_operand" "y"))
739	 (us_truncate:SI (match_operand:DI 2 "register_operand" "y"))))]
740  "TARGET_REALLY_IWMMXT"
741  "wpackdus%?\\t%0, %1, %2"
742  [(set_attr "predicable" "yes")])
743
744
745(define_insn "iwmmxt_wunpckihb"
746  [(set (match_operand:V8QI                   0 "register_operand" "=y")
747	(vec_merge:V8QI
748	 (vec_select:V8QI (match_operand:V8QI 1 "register_operand" "y")
749			  (parallel [(const_int 4)
750				     (const_int 0)
751				     (const_int 5)
752				     (const_int 1)
753				     (const_int 6)
754				     (const_int 2)
755				     (const_int 7)
756				     (const_int 3)]))
757	 (vec_select:V8QI (match_operand:V8QI 2 "register_operand" "y")
758			  (parallel [(const_int 0)
759				     (const_int 4)
760				     (const_int 1)
761				     (const_int 5)
762				     (const_int 2)
763				     (const_int 6)
764				     (const_int 3)
765				     (const_int 7)]))
766	 (const_int 85)))]
767  "TARGET_REALLY_IWMMXT"
768  "wunpckihb%?\\t%0, %1, %2"
769  [(set_attr "predicable" "yes")])
770
771(define_insn "iwmmxt_wunpckihh"
772  [(set (match_operand:V4HI                   0 "register_operand" "=y")
773	(vec_merge:V4HI
774	 (vec_select:V4HI (match_operand:V4HI 1 "register_operand" "y")
775			  (parallel [(const_int 0)
776				     (const_int 2)
777				     (const_int 1)
778				     (const_int 3)]))
779	 (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
780			  (parallel [(const_int 2)
781				     (const_int 0)
782				     (const_int 3)
783				     (const_int 1)]))
784	 (const_int 5)))]
785  "TARGET_REALLY_IWMMXT"
786  "wunpckihh%?\\t%0, %1, %2"
787  [(set_attr "predicable" "yes")])
788
789(define_insn "iwmmxt_wunpckihw"
790  [(set (match_operand:V2SI                   0 "register_operand" "=y")
791	(vec_merge:V2SI
792	 (vec_select:V2SI (match_operand:V2SI 1 "register_operand" "y")
793			  (parallel [(const_int 0)
794				     (const_int 1)]))
795	 (vec_select:V2SI (match_operand:V2SI 2 "register_operand" "y")
796			  (parallel [(const_int 1)
797				     (const_int 0)]))
798	 (const_int 1)))]
799  "TARGET_REALLY_IWMMXT"
800  "wunpckihw%?\\t%0, %1, %2"
801  [(set_attr "predicable" "yes")])
802
803(define_insn "iwmmxt_wunpckilb"
804  [(set (match_operand:V8QI                   0 "register_operand" "=y")
805	(vec_merge:V8QI
806	 (vec_select:V8QI (match_operand:V8QI 1 "register_operand" "y")
807			  (parallel [(const_int 0)
808				     (const_int 4)
809				     (const_int 1)
810				     (const_int 5)
811				     (const_int 2)
812				     (const_int 6)
813				     (const_int 3)
814				     (const_int 7)]))
815	 (vec_select:V8QI (match_operand:V8QI 2 "register_operand" "y")
816			  (parallel [(const_int 4)
817				     (const_int 0)
818				     (const_int 5)
819				     (const_int 1)
820				     (const_int 6)
821				     (const_int 2)
822				     (const_int 7)
823				     (const_int 3)]))
824	 (const_int 85)))]
825  "TARGET_REALLY_IWMMXT"
826  "wunpckilb%?\\t%0, %1, %2"
827  [(set_attr "predicable" "yes")])
828
829(define_insn "iwmmxt_wunpckilh"
830  [(set (match_operand:V4HI                   0 "register_operand" "=y")
831	(vec_merge:V4HI
832	 (vec_select:V4HI (match_operand:V4HI 1 "register_operand" "y")
833			  (parallel [(const_int 2)
834				     (const_int 0)
835				     (const_int 3)
836				     (const_int 1)]))
837	 (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
838			  (parallel [(const_int 0)
839				     (const_int 2)
840				     (const_int 1)
841				     (const_int 3)]))
842	 (const_int 5)))]
843  "TARGET_REALLY_IWMMXT"
844  "wunpckilh%?\\t%0, %1, %2"
845  [(set_attr "predicable" "yes")])
846
847(define_insn "iwmmxt_wunpckilw"
848  [(set (match_operand:V2SI                   0 "register_operand" "=y")
849	(vec_merge:V2SI
850	 (vec_select:V2SI (match_operand:V2SI 1 "register_operand" "y")
851			   (parallel [(const_int 1)
852				      (const_int 0)]))
853	 (vec_select:V2SI (match_operand:V2SI 2 "register_operand" "y")
854			  (parallel [(const_int 0)
855				     (const_int 1)]))
856	 (const_int 1)))]
857  "TARGET_REALLY_IWMMXT"
858  "wunpckilw%?\\t%0, %1, %2"
859  [(set_attr "predicable" "yes")])
860
861(define_insn "iwmmxt_wunpckehub"
862  [(set (match_operand:V4HI                   0 "register_operand" "=y")
863	(zero_extend:V4HI
864	 (vec_select:V4QI (match_operand:V8QI 1 "register_operand" "y")
865			  (parallel [(const_int 4) (const_int 5)
866				     (const_int 6) (const_int 7)]))))]
867  "TARGET_REALLY_IWMMXT"
868  "wunpckehub%?\\t%0, %1"
869  [(set_attr "predicable" "yes")])
870
871(define_insn "iwmmxt_wunpckehuh"
872  [(set (match_operand:V2SI                   0 "register_operand" "=y")
873	(zero_extend:V2SI
874	 (vec_select:V2HI (match_operand:V4HI 1 "register_operand" "y")
875			  (parallel [(const_int 2) (const_int 3)]))))]
876  "TARGET_REALLY_IWMMXT"
877  "wunpckehuh%?\\t%0, %1"
878  [(set_attr "predicable" "yes")])
879
880(define_insn "iwmmxt_wunpckehuw"
881  [(set (match_operand:DI                   0 "register_operand" "=y")
882	(zero_extend:DI
883	 (vec_select:SI (match_operand:V2SI 1 "register_operand" "y")
884			(parallel [(const_int 1)]))))]
885  "TARGET_REALLY_IWMMXT"
886  "wunpckehuw%?\\t%0, %1"
887  [(set_attr "predicable" "yes")])
888
889(define_insn "iwmmxt_wunpckehsb"
890  [(set (match_operand:V4HI                   0 "register_operand" "=y")
891	(sign_extend:V4HI
892	 (vec_select:V4QI (match_operand:V8QI 1 "register_operand" "y")
893			  (parallel [(const_int 4) (const_int 5)
894				     (const_int 6) (const_int 7)]))))]
895  "TARGET_REALLY_IWMMXT"
896  "wunpckehsb%?\\t%0, %1"
897  [(set_attr "predicable" "yes")])
898
899(define_insn "iwmmxt_wunpckehsh"
900  [(set (match_operand:V2SI                   0 "register_operand" "=y")
901	(sign_extend:V2SI
902	 (vec_select:V2HI (match_operand:V4HI 1 "register_operand" "y")
903			  (parallel [(const_int 2) (const_int 3)]))))]
904  "TARGET_REALLY_IWMMXT"
905  "wunpckehsh%?\\t%0, %1"
906  [(set_attr "predicable" "yes")])
907
908(define_insn "iwmmxt_wunpckehsw"
909  [(set (match_operand:DI                   0 "register_operand" "=y")
910	(sign_extend:DI
911	 (vec_select:SI (match_operand:V2SI 1 "register_operand" "y")
912			(parallel [(const_int 1)]))))]
913  "TARGET_REALLY_IWMMXT"
914  "wunpckehsw%?\\t%0, %1"
915  [(set_attr "predicable" "yes")])
916
917(define_insn "iwmmxt_wunpckelub"
918  [(set (match_operand:V4HI                   0 "register_operand" "=y")
919	(zero_extend:V4HI
920	 (vec_select:V4QI (match_operand:V8QI 1 "register_operand" "y")
921			  (parallel [(const_int 0) (const_int 1)
922				     (const_int 2) (const_int 3)]))))]
923  "TARGET_REALLY_IWMMXT"
924  "wunpckelub%?\\t%0, %1"
925  [(set_attr "predicable" "yes")])
926
927(define_insn "iwmmxt_wunpckeluh"
928  [(set (match_operand:V2SI                   0 "register_operand" "=y")
929	(zero_extend:V2SI
930	 (vec_select:V2HI (match_operand:V4HI 1 "register_operand" "y")
931			  (parallel [(const_int 0) (const_int 1)]))))]
932  "TARGET_REALLY_IWMMXT"
933  "wunpckeluh%?\\t%0, %1"
934  [(set_attr "predicable" "yes")])
935
936(define_insn "iwmmxt_wunpckeluw"
937  [(set (match_operand:DI                   0 "register_operand" "=y")
938	(zero_extend:DI
939	 (vec_select:SI (match_operand:V2SI 1 "register_operand" "y")
940			(parallel [(const_int 0)]))))]
941  "TARGET_REALLY_IWMMXT"
942  "wunpckeluw%?\\t%0, %1"
943  [(set_attr "predicable" "yes")])
944
945(define_insn "iwmmxt_wunpckelsb"
946  [(set (match_operand:V4HI                   0 "register_operand" "=y")
947	(sign_extend:V4HI
948	 (vec_select:V4QI (match_operand:V8QI 1 "register_operand" "y")
949			  (parallel [(const_int 0) (const_int 1)
950				     (const_int 2) (const_int 3)]))))]
951  "TARGET_REALLY_IWMMXT"
952  "wunpckelsb%?\\t%0, %1"
953  [(set_attr "predicable" "yes")])
954
955(define_insn "iwmmxt_wunpckelsh"
956  [(set (match_operand:V2SI                   0 "register_operand" "=y")
957	(sign_extend:V2SI
958	 (vec_select:V2HI (match_operand:V4HI 1 "register_operand" "y")
959			  (parallel [(const_int 0) (const_int 1)]))))]
960  "TARGET_REALLY_IWMMXT"
961  "wunpckelsh%?\\t%0, %1"
962  [(set_attr "predicable" "yes")])
963
964(define_insn "iwmmxt_wunpckelsw"
965  [(set (match_operand:DI                   0 "register_operand" "=y")
966	(sign_extend:DI
967	 (vec_select:SI (match_operand:V2SI 1 "register_operand" "y")
968			(parallel [(const_int 0)]))))]
969  "TARGET_REALLY_IWMMXT"
970  "wunpckelsw%?\\t%0, %1"
971  [(set_attr "predicable" "yes")])
972
973;; Shifts
974
975(define_insn "rorv4hi3"
976  [(set (match_operand:V4HI                0 "register_operand" "=y")
977        (rotatert:V4HI (match_operand:V4HI 1 "register_operand" "y")
978		       (match_operand:SI   2 "register_operand" "z")))]
979  "TARGET_REALLY_IWMMXT"
980  "wrorhg%?\\t%0, %1, %2"
981  [(set_attr "predicable" "yes")])
982
983(define_insn "rorv2si3"
984  [(set (match_operand:V2SI                0 "register_operand" "=y")
985        (rotatert:V2SI (match_operand:V2SI 1 "register_operand" "y")
986		       (match_operand:SI   2 "register_operand" "z")))]
987  "TARGET_REALLY_IWMMXT"
988  "wrorwg%?\\t%0, %1, %2"
989  [(set_attr "predicable" "yes")])
990
991(define_insn "rordi3"
992  [(set (match_operand:DI              0 "register_operand" "=y")
993	(rotatert:DI (match_operand:DI 1 "register_operand" "y")
994		   (match_operand:SI   2 "register_operand" "z")))]
995  "TARGET_REALLY_IWMMXT"
996  "wrordg%?\\t%0, %1, %2"
997  [(set_attr "predicable" "yes")])
998
999(define_insn "ashr<mode>3_iwmmxt"
1000  [(set (match_operand:VSHFT                 0 "register_operand" "=y")
1001        (ashiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y")
1002			(match_operand:SI    2 "register_operand" "z")))]
1003  "TARGET_REALLY_IWMMXT"
1004  "wsra<MMX_char>g%?\\t%0, %1, %2"
1005  [(set_attr "predicable" "yes")])
1006
1007(define_insn "lshr<mode>3_iwmmxt"
1008  [(set (match_operand:VSHFT                 0 "register_operand" "=y")
1009        (lshiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y")
1010			(match_operand:SI    2 "register_operand" "z")))]
1011  "TARGET_REALLY_IWMMXT"
1012  "wsrl<MMX_char>g%?\\t%0, %1, %2"
1013  [(set_attr "predicable" "yes")])
1014
1015(define_insn "ashl<mode>3_iwmmxt"
1016  [(set (match_operand:VSHFT               0 "register_operand" "=y")
1017        (ashift:VSHFT (match_operand:VSHFT 1 "register_operand" "y")
1018		      (match_operand:SI    2 "register_operand" "z")))]
1019  "TARGET_REALLY_IWMMXT"
1020  "wsll<MMX_char>g%?\\t%0, %1, %2"
1021  [(set_attr "predicable" "yes")])
1022
1023(define_insn "rorv4hi3_di"
1024  [(set (match_operand:V4HI                0 "register_operand" "=y")
1025        (rotatert:V4HI (match_operand:V4HI 1 "register_operand" "y")
1026		       (match_operand:DI   2 "register_operand" "y")))]
1027  "TARGET_REALLY_IWMMXT"
1028  "wrorh%?\\t%0, %1, %2"
1029  [(set_attr "predicable" "yes")])
1030
1031(define_insn "rorv2si3_di"
1032  [(set (match_operand:V2SI                0 "register_operand" "=y")
1033        (rotatert:V2SI (match_operand:V2SI 1 "register_operand" "y")
1034		       (match_operand:DI   2 "register_operand" "y")))]
1035  "TARGET_REALLY_IWMMXT"
1036  "wrorw%?\\t%0, %1, %2"
1037  [(set_attr "predicable" "yes")])
1038
1039(define_insn "rordi3_di"
1040  [(set (match_operand:DI              0 "register_operand" "=y")
1041	(rotatert:DI (match_operand:DI 1 "register_operand" "y")
1042		   (match_operand:DI   2 "register_operand" "y")))]
1043  "TARGET_REALLY_IWMMXT"
1044  "wrord%?\\t%0, %1, %2"
1045  [(set_attr "predicable" "yes")])
1046
1047(define_insn "ashrv4hi3_di"
1048  [(set (match_operand:V4HI                0 "register_operand" "=y")
1049        (ashiftrt:V4HI (match_operand:V4HI 1 "register_operand" "y")
1050		       (match_operand:DI   2 "register_operand" "y")))]
1051  "TARGET_REALLY_IWMMXT"
1052  "wsrah%?\\t%0, %1, %2"
1053  [(set_attr "predicable" "yes")])
1054
1055(define_insn "ashrv2si3_di"
1056  [(set (match_operand:V2SI                0 "register_operand" "=y")
1057        (ashiftrt:V2SI (match_operand:V2SI 1 "register_operand" "y")
1058		       (match_operand:DI   2 "register_operand" "y")))]
1059  "TARGET_REALLY_IWMMXT"
1060  "wsraw%?\\t%0, %1, %2"
1061  [(set_attr "predicable" "yes")])
1062
1063(define_insn "ashrdi3_di"
1064  [(set (match_operand:DI              0 "register_operand" "=y")
1065	(ashiftrt:DI (match_operand:DI 1 "register_operand" "y")
1066		   (match_operand:DI   2 "register_operand" "y")))]
1067  "TARGET_REALLY_IWMMXT"
1068  "wsrad%?\\t%0, %1, %2"
1069  [(set_attr "predicable" "yes")])
1070
1071(define_insn "lshrv4hi3_di"
1072  [(set (match_operand:V4HI                0 "register_operand" "=y")
1073        (lshiftrt:V4HI (match_operand:V4HI 1 "register_operand" "y")
1074		       (match_operand:DI   2 "register_operand" "y")))]
1075  "TARGET_REALLY_IWMMXT"
1076  "wsrlh%?\\t%0, %1, %2"
1077  [(set_attr "predicable" "yes")])
1078
1079(define_insn "lshrv2si3_di"
1080  [(set (match_operand:V2SI                0 "register_operand" "=y")
1081        (lshiftrt:V2SI (match_operand:V2SI 1 "register_operand" "y")
1082		       (match_operand:DI   2 "register_operand" "y")))]
1083  "TARGET_REALLY_IWMMXT"
1084  "wsrlw%?\\t%0, %1, %2"
1085  [(set_attr "predicable" "yes")])
1086
1087(define_insn "lshrdi3_di"
1088  [(set (match_operand:DI              0 "register_operand" "=y")
1089	(lshiftrt:DI (match_operand:DI 1 "register_operand" "y")
1090		     (match_operand:DI 2 "register_operand" "y")))]
1091  "TARGET_REALLY_IWMMXT"
1092  "wsrld%?\\t%0, %1, %2"
1093  [(set_attr "predicable" "yes")])
1094
1095(define_insn "ashlv4hi3_di"
1096  [(set (match_operand:V4HI              0 "register_operand" "=y")
1097        (ashift:V4HI (match_operand:V4HI 1 "register_operand" "y")
1098		     (match_operand:DI   2 "register_operand" "y")))]
1099  "TARGET_REALLY_IWMMXT"
1100  "wsllh%?\\t%0, %1, %2"
1101  [(set_attr "predicable" "yes")])
1102
1103(define_insn "ashlv2si3_di"
1104  [(set (match_operand:V2SI              0 "register_operand" "=y")
1105        (ashift:V2SI (match_operand:V2SI 1 "register_operand" "y")
1106		       (match_operand:DI 2 "register_operand" "y")))]
1107  "TARGET_REALLY_IWMMXT"
1108  "wsllw%?\\t%0, %1, %2"
1109  [(set_attr "predicable" "yes")])
1110
1111(define_insn "ashldi3_di"
1112  [(set (match_operand:DI            0 "register_operand" "=y")
1113	(ashift:DI (match_operand:DI 1 "register_operand" "y")
1114		   (match_operand:DI 2 "register_operand" "y")))]
1115  "TARGET_REALLY_IWMMXT"
1116  "wslld%?\\t%0, %1, %2"
1117  [(set_attr "predicable" "yes")])
1118
1119(define_insn "iwmmxt_wmadds"
1120  [(set (match_operand:V4HI               0 "register_operand" "=y")
1121        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
1122		      (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMADDS))]
1123  "TARGET_REALLY_IWMMXT"
1124  "wmadds%?\\t%0, %1, %2"
1125  [(set_attr "predicable" "yes")])
1126
1127(define_insn "iwmmxt_wmaddu"
1128  [(set (match_operand:V4HI               0 "register_operand" "=y")
1129        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
1130		      (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMADDU))]
1131  "TARGET_REALLY_IWMMXT"
1132  "wmaddu%?\\t%0, %1, %2"
1133  [(set_attr "predicable" "yes")])
1134
1135(define_insn "iwmmxt_tmia"
1136  [(set (match_operand:DI                    0 "register_operand" "=y")
1137	(plus:DI (match_operand:DI           1 "register_operand" "0")
1138		 (mult:DI (sign_extend:DI
1139			   (match_operand:SI 2 "register_operand" "r"))
1140			  (sign_extend:DI
1141			   (match_operand:SI 3 "register_operand" "r")))))]
1142  "TARGET_REALLY_IWMMXT"
1143  "tmia%?\\t%0, %2, %3"
1144  [(set_attr "predicable" "yes")])
1145
1146(define_insn "iwmmxt_tmiaph"
1147  [(set (match_operand:DI          0 "register_operand" "=y")
1148	(plus:DI (match_operand:DI 1 "register_operand" "0")
1149		 (plus:DI
1150		  (mult:DI (sign_extend:DI
1151			    (truncate:HI (match_operand:SI 2 "register_operand" "r")))
1152			   (sign_extend:DI
1153			    (truncate:HI (match_operand:SI 3 "register_operand" "r"))))
1154		  (mult:DI (sign_extend:DI
1155			    (truncate:HI (ashiftrt:SI (match_dup 2) (const_int 16))))
1156			   (sign_extend:DI
1157			    (truncate:HI (ashiftrt:SI (match_dup 3) (const_int 16))))))))]
1158  "TARGET_REALLY_IWMMXT"
1159  "tmiaph%?\\t%0, %2, %3"
1160  [(set_attr "predicable" "yes")])
1161
1162(define_insn "iwmmxt_tmiabb"
1163  [(set (match_operand:DI          0 "register_operand" "=y")
1164	(plus:DI (match_operand:DI 1 "register_operand" "0")
1165		 (mult:DI (sign_extend:DI
1166			   (truncate:HI (match_operand:SI 2 "register_operand" "r")))
1167			  (sign_extend:DI
1168			   (truncate:HI (match_operand:SI 3 "register_operand" "r"))))))]
1169  "TARGET_REALLY_IWMMXT"
1170  "tmiabb%?\\t%0, %2, %3"
1171  [(set_attr "predicable" "yes")])
1172
1173(define_insn "iwmmxt_tmiatb"
1174  [(set (match_operand:DI          0 "register_operand" "=y")
1175	(plus:DI (match_operand:DI 1 "register_operand" "0")
1176		 (mult:DI (sign_extend:DI
1177			   (truncate:HI (ashiftrt:SI
1178					 (match_operand:SI 2 "register_operand" "r")
1179					 (const_int 16))))
1180			  (sign_extend:DI
1181			   (truncate:HI (match_operand:SI 3 "register_operand" "r"))))))]
1182  "TARGET_REALLY_IWMMXT"
1183  "tmiatb%?\\t%0, %2, %3"
1184  [(set_attr "predicable" "yes")])
1185
1186(define_insn "iwmmxt_tmiabt"
1187  [(set (match_operand:DI          0 "register_operand" "=y")
1188	(plus:DI (match_operand:DI 1 "register_operand" "0")
1189		 (mult:DI (sign_extend:DI
1190			   (truncate:HI (match_operand:SI 2 "register_operand" "r")))
1191			  (sign_extend:DI
1192			   (truncate:HI (ashiftrt:SI
1193					 (match_operand:SI 3 "register_operand" "r")
1194					 (const_int 16)))))))]
1195  "TARGET_REALLY_IWMMXT"
1196  "tmiabt%?\\t%0, %2, %3"
1197  [(set_attr "predicable" "yes")])
1198
1199(define_insn "iwmmxt_tmiatt"
1200  [(set (match_operand:DI          0 "register_operand" "=y")
1201	(plus:DI (match_operand:DI 1 "register_operand" "0")
1202		 (mult:DI (sign_extend:DI
1203			   (truncate:HI (ashiftrt:SI
1204					 (match_operand:SI 2 "register_operand" "r")
1205					 (const_int 16))))
1206			  (sign_extend:DI
1207			   (truncate:HI (ashiftrt:SI
1208					 (match_operand:SI 3 "register_operand" "r")
1209					 (const_int 16)))))))]
1210  "TARGET_REALLY_IWMMXT"
1211  "tmiatt%?\\t%0, %2, %3"
1212  [(set_attr "predicable" "yes")])
1213
1214(define_insn "iwmmxt_tbcstqi"
1215  [(set (match_operand:V8QI                   0 "register_operand" "=y")
1216	(vec_duplicate:V8QI (match_operand:QI 1 "register_operand" "r")))]
1217  "TARGET_REALLY_IWMMXT"
1218  "tbcstb%?\\t%0, %1"
1219  [(set_attr "predicable" "yes")])
1220
1221(define_insn "iwmmxt_tbcsthi"
1222  [(set (match_operand:V4HI                   0 "register_operand" "=y")
1223	(vec_duplicate:V4HI (match_operand:HI 1 "register_operand" "r")))]
1224  "TARGET_REALLY_IWMMXT"
1225  "tbcsth%?\\t%0, %1"
1226  [(set_attr "predicable" "yes")])
1227
1228(define_insn "iwmmxt_tbcstsi"
1229  [(set (match_operand:V2SI                   0 "register_operand" "=y")
1230	(vec_duplicate:V2SI (match_operand:SI 1 "register_operand" "r")))]
1231  "TARGET_REALLY_IWMMXT"
1232  "tbcstw%?\\t%0, %1"
1233  [(set_attr "predicable" "yes")])
1234
1235(define_insn "iwmmxt_tmovmskb"
1236  [(set (match_operand:SI               0 "register_operand" "=r")
1237	(unspec:SI [(match_operand:V8QI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
1238  "TARGET_REALLY_IWMMXT"
1239  "tmovmskb%?\\t%0, %1"
1240  [(set_attr "predicable" "yes")])
1241
1242(define_insn "iwmmxt_tmovmskh"
1243  [(set (match_operand:SI               0 "register_operand" "=r")
1244	(unspec:SI [(match_operand:V4HI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
1245  "TARGET_REALLY_IWMMXT"
1246  "tmovmskh%?\\t%0, %1"
1247  [(set_attr "predicable" "yes")])
1248
1249(define_insn "iwmmxt_tmovmskw"
1250  [(set (match_operand:SI               0 "register_operand" "=r")
1251	(unspec:SI [(match_operand:V2SI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
1252  "TARGET_REALLY_IWMMXT"
1253  "tmovmskw%?\\t%0, %1"
1254  [(set_attr "predicable" "yes")])
1255
1256(define_insn "iwmmxt_waccb"
1257  [(set (match_operand:DI               0 "register_operand" "=y")
1258	(unspec:DI [(match_operand:V8QI 1 "register_operand" "y")] UNSPEC_WACC))]
1259  "TARGET_REALLY_IWMMXT"
1260  "waccb%?\\t%0, %1"
1261  [(set_attr "predicable" "yes")])
1262
1263(define_insn "iwmmxt_wacch"
1264  [(set (match_operand:DI               0 "register_operand" "=y")
1265	(unspec:DI [(match_operand:V4HI 1 "register_operand" "y")] UNSPEC_WACC))]
1266  "TARGET_REALLY_IWMMXT"
1267  "wacch%?\\t%0, %1"
1268  [(set_attr "predicable" "yes")])
1269
1270(define_insn "iwmmxt_waccw"
1271  [(set (match_operand:DI               0 "register_operand" "=y")
1272	(unspec:DI [(match_operand:V2SI 1 "register_operand" "y")] UNSPEC_WACC))]
1273  "TARGET_REALLY_IWMMXT"
1274  "waccw%?\\t%0, %1"
1275  [(set_attr "predicable" "yes")])
1276
1277(define_insn "iwmmxt_walign"
1278  [(set (match_operand:V8QI                           0 "register_operand" "=y,y")
1279	(subreg:V8QI (ashiftrt:TI
1280		      (subreg:TI (vec_concat:V16QI
1281				  (match_operand:V8QI 1 "register_operand" "y,y")
1282				  (match_operand:V8QI 2 "register_operand" "y,y")) 0)
1283		      (mult:SI
1284		       (match_operand:SI              3 "nonmemory_operand" "i,z")
1285		       (const_int 8))) 0))]
1286  "TARGET_REALLY_IWMMXT"
1287  "@
1288   waligni%?\\t%0, %1, %2, %3
1289   walignr%U3%?\\t%0, %1, %2"
1290  [(set_attr "predicable" "yes")])
1291
1292(define_insn "iwmmxt_tmrc"
1293  [(set (match_operand:SI                      0 "register_operand" "=r")
1294	(unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "i")]
1295			    VUNSPEC_TMRC))]
1296  "TARGET_REALLY_IWMMXT"
1297  "tmrc%?\\t%0, %w1"
1298  [(set_attr "predicable" "yes")])
1299
1300(define_insn "iwmmxt_tmcr"
1301  [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
1302			(match_operand:SI 1 "register_operand"  "r")]
1303		       VUNSPEC_TMCR)]
1304  "TARGET_REALLY_IWMMXT"
1305  "tmcr%?\\t%w0, %1"
1306  [(set_attr "predicable" "yes")])
1307
1308(define_insn "iwmmxt_wsadb"
1309  [(set (match_operand:V8QI               0 "register_operand" "=y")
1310        (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y")
1311		      (match_operand:V8QI 2 "register_operand" "y")] UNSPEC_WSAD))]
1312  "TARGET_REALLY_IWMMXT"
1313  "wsadb%?\\t%0, %1, %2"
1314  [(set_attr "predicable" "yes")])
1315
1316(define_insn "iwmmxt_wsadh"
1317  [(set (match_operand:V4HI               0 "register_operand" "=y")
1318        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
1319		      (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WSAD))]
1320  "TARGET_REALLY_IWMMXT"
1321  "wsadh%?\\t%0, %1, %2"
1322  [(set_attr "predicable" "yes")])
1323
1324(define_insn "iwmmxt_wsadbz"
1325  [(set (match_operand:V8QI               0 "register_operand" "=y")
1326        (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y")
1327		      (match_operand:V8QI 2 "register_operand" "y")] UNSPEC_WSADZ))]
1328  "TARGET_REALLY_IWMMXT"
1329  "wsadbz%?\\t%0, %1, %2"
1330  [(set_attr "predicable" "yes")])
1331
1332(define_insn "iwmmxt_wsadhz"
1333  [(set (match_operand:V4HI               0 "register_operand" "=y")
1334        (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
1335		      (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WSADZ))]
1336  "TARGET_REALLY_IWMMXT"
1337  "wsadhz%?\\t%0, %1, %2"
1338  [(set_attr "predicable" "yes")])
1339
1340