1;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
2;; Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
4;; Free Software Foundation, Inc.
5;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7;; This file is part of GCC.
8
9;; GCC is free software; you can redistribute it and/or modify it
10;; under the terms of the GNU General Public License as published
11;; by the Free Software Foundation; either version 2, or (at your
12;; option) any later version.
13
14;; GCC is distributed in the hope that it will be useful, but WITHOUT
15;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17;; License for more details.
18
19;; You should have received a copy of the GNU General Public License
20;; along with GCC; see the file COPYING.  If not, write to the
21;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
22;; MA 02110-1301, USA.
23
24;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
25
26;;
27;; UNSPEC usage
28;;
29
30(define_constants
31  [(UNSPEC_FRSP			0)	; frsp for POWER machines
32   (UNSPEC_TIE			5)	; tie stack contents and stack pointer
33   (UNSPEC_TOCPTR		6)	; address of a word pointing to the TOC
34   (UNSPEC_TOC			7)	; address of the TOC (more-or-less)
35   (UNSPEC_MOVSI_GOT		8)
36   (UNSPEC_MV_CR_OV		9)	; move_from_CR_ov_bit
37   (UNSPEC_FCTIWZ		10)
38   (UNSPEC_FRIM			11)
39   (UNSPEC_FRIN			12)
40   (UNSPEC_FRIP			13)
41   (UNSPEC_FRIZ			14)
42   (UNSPEC_LD_MPIC		15)	; load_macho_picbase
43   (UNSPEC_MPIC_CORRECT		16)	; macho_correct_pic
44   (UNSPEC_TLSGD		17)
45   (UNSPEC_TLSLD		18)
46   (UNSPEC_MOVESI_FROM_CR	19)
47   (UNSPEC_MOVESI_TO_CR		20)
48   (UNSPEC_TLSDTPREL		21)
49   (UNSPEC_TLSDTPRELHA		22)
50   (UNSPEC_TLSDTPRELLO		23)
51   (UNSPEC_TLSGOTDTPREL		24)
52   (UNSPEC_TLSTPREL		25)
53   (UNSPEC_TLSTPRELHA		26)
54   (UNSPEC_TLSTPRELLO		27)
55   (UNSPEC_TLSGOTTPREL		28)
56   (UNSPEC_TLSTLS		29)
57   (UNSPEC_FIX_TRUNC_TF		30)	; fadd, rounding towards zero
58   (UNSPEC_MV_CR_GT		31)	; move_from_CR_gt_bit
59   (UNSPEC_STFIWX		32)
60   (UNSPEC_POPCNTB		33)
61   (UNSPEC_FRES			34)
62   (UNSPEC_SP_SET		35)
63   (UNSPEC_SP_TEST		36)
64   (UNSPEC_SYNC			37)
65   (UNSPEC_LWSYNC		38)
66   (UNSPEC_ISYNC		39)
67   (UNSPEC_SYNC_OP		40)
68   (UNSPEC_ATOMIC		41)
69   (UNSPEC_CMPXCHG		42)
70   (UNSPEC_XCHG			43)
71   (UNSPEC_AND			44)
72   (UNSPEC_DLMZB		45)
73   (UNSPEC_DLMZB_CR		46)
74   (UNSPEC_DLMZB_STRLEN		47)
75  ])
76
77;;
78;; UNSPEC_VOLATILE usage
79;;
80
81(define_constants
82  [(UNSPECV_BLOCK		0)
83   (UNSPECV_LL			1)	; load-locked
84   (UNSPECV_SC			2)	; store-conditional
85   (UNSPECV_EH_RR		9)	; eh_reg_restore
86  ])
87
88;; Define an insn type attribute.  This is used in function unit delay
89;; computations.
90(define_attr "type" "integer,two,three,load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u,store,store_ux,store_u,fpload,fpload_ux,fpload_u,fpstore,fpstore_ux,fpstore_u,vecload,vecstore,imul,imul2,imul3,lmul,idiv,ldiv,insert_word,branch,cmp,fast_compare,compare,delayed_compare,imul_compare,lmul_compare,fpcompare,cr_logical,delayed_cr,mfcr,mfcrf,mtcr,mfjmpr,mtjmpr,fp,fpsimple,dmul,sdiv,ddiv,ssqrt,dsqrt,jmpreg,brinc,vecsimple,veccomplex,vecdiv,veccmp,veccmpsimple,vecperm,vecfloat,vecfdiv,isync,sync,load_l,store_c"
91  (const_string "integer"))
92
93;; Length (in bytes).
94; '(pc)' in the following doesn't include the instruction itself; it is
95; calculated as if the instruction had zero size.
96(define_attr "length" ""
97  (if_then_else (eq_attr "type" "branch")
98		(if_then_else (and (ge (minus (match_dup 0) (pc))
99				       (const_int -32768))
100				   (lt (minus (match_dup 0) (pc))
101				       (const_int 32764)))
102			      (const_int 4)
103			      (const_int 8))
104		(const_int 4)))
105
106;; Processor type -- this attribute must exactly match the processor_type
107;; enumeration in rs6000.h.
108
109(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,power4,power5"
110  (const (symbol_ref "rs6000_cpu_attr")))
111
112(automata_option "ndfa")
113
114(include "rios1.md")
115(include "rios2.md")
116(include "rs64.md")
117(include "mpc.md")
118(include "40x.md")
119(include "440.md")
120(include "603.md")
121(include "6xx.md")
122(include "7xx.md")
123(include "7450.md")
124(include "8540.md")
125(include "power4.md")
126(include "power5.md")
127
128(include "predicates.md")
129(include "constraints.md")
130
131(include "darwin.md")
132
133
134;; Mode macros
135
136; This mode macro allows :GPR to be used to indicate the allowable size
137; of whole values in GPRs.
138(define_mode_macro GPR [SI (DI "TARGET_POWERPC64")])
139
140; Any supported integer mode.
141(define_mode_macro INT [QI HI SI DI TI])
142
143; Any supported integer mode that fits in one register.
144(define_mode_macro INT1 [QI HI SI (DI "TARGET_POWERPC64")])
145
146; extend modes for DImode
147(define_mode_macro QHSI [QI HI SI])
148
149; SImode or DImode, even if DImode doesn't fit in GPRs.
150(define_mode_macro SDI [SI DI])
151
152; The size of a pointer.  Also, the size of the value that a record-condition
153; (one with a '.') will compare.
154(define_mode_macro P [(SI "TARGET_32BIT") (DI "TARGET_64BIT")])
155
156; Any hardware-supported floating-point mode
157(define_mode_macro FP [(SF "TARGET_HARD_FLOAT")
158  (DF "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)")
159  (TF "!TARGET_IEEEQUAD
160   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128")])
161
162; Various instructions that come in SI and DI forms.
163; A generic w/d attribute, for things like cmpw/cmpd.
164(define_mode_attr wd [(QI "b") (HI "h") (SI "w") (DI "d")])
165
166; DImode bits
167(define_mode_attr dbits [(QI "56") (HI "48") (SI "32")])
168
169
170;; Start with fixed-point load and store insns.  Here we put only the more
171;; complex forms.  Basic data transfer is done later.
172
173(define_expand "zero_extend<mode>di2"
174  [(set (match_operand:DI 0 "gpc_reg_operand" "")
175	(zero_extend:DI (match_operand:QHSI 1 "gpc_reg_operand" "")))]
176  "TARGET_POWERPC64"
177  "")
178
179(define_insn "*zero_extend<mode>di2_internal1"
180  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
181	(zero_extend:DI (match_operand:QHSI 1 "reg_or_mem_operand" "m,r")))]
182  "TARGET_POWERPC64"
183  "@
184   l<wd>z%U1%X1 %0,%1
185   rldicl %0,%1,0,<dbits>"
186  [(set_attr "type" "load,*")])
187
188(define_insn "*zero_extend<mode>di2_internal2"
189  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
190	(compare:CC (zero_extend:DI (match_operand:QHSI 1 "gpc_reg_operand" "r,r"))
191		    (const_int 0)))
192   (clobber (match_scratch:DI 2 "=r,r"))]
193  "TARGET_64BIT"
194  "@
195   rldicl. %2,%1,0,<dbits>
196   #"
197  [(set_attr "type" "compare")
198   (set_attr "length" "4,8")])
199
200(define_split
201  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
202	(compare:CC (zero_extend:DI (match_operand:QHSI 1 "gpc_reg_operand" ""))
203		    (const_int 0)))
204   (clobber (match_scratch:DI 2 ""))]
205  "TARGET_POWERPC64 && reload_completed"
206  [(set (match_dup 2)
207	(zero_extend:DI (match_dup 1)))
208   (set (match_dup 0)
209	(compare:CC (match_dup 2)
210		    (const_int 0)))]
211  "")
212
213(define_insn "*zero_extend<mode>di2_internal3"
214  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
215	(compare:CC (zero_extend:DI (match_operand:QHSI 1 "gpc_reg_operand" "r,r"))
216		    (const_int 0)))
217   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
218	(zero_extend:DI (match_dup 1)))]
219  "TARGET_64BIT"
220  "@
221   rldicl. %0,%1,0,<dbits>
222   #"
223  [(set_attr "type" "compare")
224   (set_attr "length" "4,8")])
225
226(define_split
227  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
228	(compare:CC (zero_extend:DI (match_operand:QHSI 1 "gpc_reg_operand" ""))
229		    (const_int 0)))
230   (set (match_operand:DI 0 "gpc_reg_operand" "")
231	(zero_extend:DI (match_dup 1)))]
232  "TARGET_POWERPC64 && reload_completed"
233  [(set (match_dup 0)
234	(zero_extend:DI (match_dup 1)))
235   (set (match_dup 2)
236	(compare:CC (match_dup 0)
237		    (const_int 0)))]
238  "")
239
240(define_insn "extendqidi2"
241  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
242	(sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r")))]
243  "TARGET_POWERPC64"
244  "extsb %0,%1")
245
246(define_insn ""
247  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
248	(compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
249		    (const_int 0)))
250   (clobber (match_scratch:DI 2 "=r,r"))]
251  "TARGET_64BIT"
252  "@
253   extsb. %2,%1
254   #"
255  [(set_attr "type" "compare")
256   (set_attr "length" "4,8")])
257
258(define_split
259  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
260	(compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" ""))
261		    (const_int 0)))
262   (clobber (match_scratch:DI 2 ""))]
263  "TARGET_POWERPC64 && reload_completed"
264  [(set (match_dup 2)
265	(sign_extend:DI (match_dup 1)))
266   (set (match_dup 0)
267	(compare:CC (match_dup 2)
268		    (const_int 0)))]
269  "")
270
271(define_insn ""
272  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
273	(compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
274		    (const_int 0)))
275   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
276	(sign_extend:DI (match_dup 1)))]
277  "TARGET_64BIT"
278  "@
279   extsb. %0,%1
280   #"
281  [(set_attr "type" "compare")
282   (set_attr "length" "4,8")])
283
284(define_split
285  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
286	(compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" ""))
287		    (const_int 0)))
288   (set (match_operand:DI 0 "gpc_reg_operand" "")
289	(sign_extend:DI (match_dup 1)))]
290  "TARGET_POWERPC64 && reload_completed"
291  [(set (match_dup 0)
292	(sign_extend:DI (match_dup 1)))
293   (set (match_dup 2)
294	(compare:CC (match_dup 0)
295		    (const_int 0)))]
296  "")
297
298(define_expand "extendhidi2"
299  [(set (match_operand:DI 0 "gpc_reg_operand" "")
300	(sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "")))]
301  "TARGET_POWERPC64"
302  "")
303
304(define_insn ""
305  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
306	(sign_extend:DI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
307  "TARGET_POWERPC64"
308  "@
309   lha%U1%X1 %0,%1
310   extsh %0,%1"
311  [(set_attr "type" "load_ext,*")])
312
313(define_insn ""
314  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
315	(compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
316		    (const_int 0)))
317   (clobber (match_scratch:DI 2 "=r,r"))]
318  "TARGET_64BIT"
319  "@
320   extsh. %2,%1
321   #"
322  [(set_attr "type" "compare")
323   (set_attr "length" "4,8")])
324
325(define_split
326  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
327	(compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" ""))
328		    (const_int 0)))
329   (clobber (match_scratch:DI 2 ""))]
330  "TARGET_POWERPC64 && reload_completed"
331  [(set (match_dup 2)
332	(sign_extend:DI (match_dup 1)))
333   (set (match_dup 0)
334	(compare:CC (match_dup 2)
335		    (const_int 0)))]
336  "")
337
338(define_insn ""
339  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
340	(compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
341		    (const_int 0)))
342   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
343	(sign_extend:DI (match_dup 1)))]
344  "TARGET_64BIT"
345  "@
346   extsh. %0,%1
347   #"
348  [(set_attr "type" "compare")
349   (set_attr "length" "4,8")])
350
351(define_split
352  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
353	(compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" ""))
354		    (const_int 0)))
355   (set (match_operand:DI 0 "gpc_reg_operand" "")
356	(sign_extend:DI (match_dup 1)))]
357  "TARGET_POWERPC64 && reload_completed"
358  [(set (match_dup 0)
359	(sign_extend:DI (match_dup 1)))
360   (set (match_dup 2)
361	(compare:CC (match_dup 0)
362		    (const_int 0)))]
363  "")
364
365(define_expand "extendsidi2"
366  [(set (match_operand:DI 0 "gpc_reg_operand" "")
367	(sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "")))]
368  "TARGET_POWERPC64"
369  "")
370
371(define_insn ""
372  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
373	(sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))]
374  "TARGET_POWERPC64"
375  "@
376   lwa%U1%X1 %0,%1
377   extsw %0,%1"
378  [(set_attr "type" "load_ext,*")])
379
380(define_insn ""
381  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
382	(compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
383		    (const_int 0)))
384   (clobber (match_scratch:DI 2 "=r,r"))]
385  "TARGET_64BIT"
386  "@
387   extsw. %2,%1
388   #"
389  [(set_attr "type" "compare")
390   (set_attr "length" "4,8")])
391
392(define_split
393  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
394	(compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
395		    (const_int 0)))
396   (clobber (match_scratch:DI 2 ""))]
397  "TARGET_POWERPC64 && reload_completed"
398  [(set (match_dup 2)
399	(sign_extend:DI (match_dup 1)))
400   (set (match_dup 0)
401	(compare:CC (match_dup 2)
402		    (const_int 0)))]
403  "")
404
405(define_insn ""
406  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
407	(compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
408		    (const_int 0)))
409   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
410	(sign_extend:DI (match_dup 1)))]
411  "TARGET_64BIT"
412  "@
413   extsw. %0,%1
414   #"
415  [(set_attr "type" "compare")
416   (set_attr "length" "4,8")])
417
418(define_split
419  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
420	(compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
421		    (const_int 0)))
422   (set (match_operand:DI 0 "gpc_reg_operand" "")
423	(sign_extend:DI (match_dup 1)))]
424  "TARGET_POWERPC64 && reload_completed"
425  [(set (match_dup 0)
426	(sign_extend:DI (match_dup 1)))
427   (set (match_dup 2)
428	(compare:CC (match_dup 0)
429		    (const_int 0)))]
430  "")
431
432(define_expand "zero_extendqisi2"
433  [(set (match_operand:SI 0 "gpc_reg_operand" "")
434	(zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "")))]
435  ""
436  "")
437
438(define_insn ""
439  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
440	(zero_extend:SI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
441  ""
442  "@
443   lbz%U1%X1 %0,%1
444   {rlinm|rlwinm} %0,%1,0,0xff"
445  [(set_attr "type" "load,*")])
446
447(define_insn ""
448  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
449	(compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
450		    (const_int 0)))
451   (clobber (match_scratch:SI 2 "=r,r"))]
452  ""
453  "@
454   {andil.|andi.} %2,%1,0xff
455   #"
456  [(set_attr "type" "compare")
457   (set_attr "length" "4,8")])
458
459(define_split
460  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
461	(compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" ""))
462		    (const_int 0)))
463   (clobber (match_scratch:SI 2 ""))]
464  "reload_completed"
465  [(set (match_dup 2)
466	(zero_extend:SI (match_dup 1)))
467   (set (match_dup 0)
468	(compare:CC (match_dup 2)
469		    (const_int 0)))]
470  "")
471
472(define_insn ""
473  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
474	(compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
475		    (const_int 0)))
476   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
477	(zero_extend:SI (match_dup 1)))]
478  ""
479  "@
480   {andil.|andi.} %0,%1,0xff
481   #"
482  [(set_attr "type" "compare")
483   (set_attr "length" "4,8")])
484
485(define_split
486  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
487	(compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" ""))
488		    (const_int 0)))
489   (set (match_operand:SI 0 "gpc_reg_operand" "")
490	(zero_extend:SI (match_dup 1)))]
491  "reload_completed"
492  [(set (match_dup 0)
493	(zero_extend:SI (match_dup 1)))
494   (set (match_dup 2)
495	(compare:CC (match_dup 0)
496		    (const_int 0)))]
497  "")
498
499(define_expand "extendqisi2"
500  [(use (match_operand:SI 0 "gpc_reg_operand" ""))
501   (use (match_operand:QI 1 "gpc_reg_operand" ""))]
502  ""
503  "
504{
505  if (TARGET_POWERPC)
506    emit_insn (gen_extendqisi2_ppc (operands[0], operands[1]));
507  else if (TARGET_POWER)
508    emit_insn (gen_extendqisi2_power (operands[0], operands[1]));
509  else
510    emit_insn (gen_extendqisi2_no_power (operands[0], operands[1]));
511  DONE;
512}")
513
514(define_insn "extendqisi2_ppc"
515  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
516	(sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))]
517  "TARGET_POWERPC"
518  "extsb %0,%1")
519
520(define_insn ""
521  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
522	(compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
523		    (const_int 0)))
524   (clobber (match_scratch:SI 2 "=r,r"))]
525  "TARGET_POWERPC"
526  "@
527   extsb. %2,%1
528   #"
529  [(set_attr "type" "compare")
530   (set_attr "length" "4,8")])
531
532(define_split
533  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
534	(compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" ""))
535		    (const_int 0)))
536   (clobber (match_scratch:SI 2 ""))]
537  "TARGET_POWERPC && reload_completed"
538  [(set (match_dup 2)
539	(sign_extend:SI (match_dup 1)))
540   (set (match_dup 0)
541	(compare:CC (match_dup 2)
542		    (const_int 0)))]
543  "")
544
545(define_insn ""
546  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
547	(compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
548		    (const_int 0)))
549   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
550	(sign_extend:SI (match_dup 1)))]
551  "TARGET_POWERPC"
552  "@
553   extsb. %0,%1
554   #"
555  [(set_attr "type" "compare")
556   (set_attr "length" "4,8")])
557
558(define_split
559  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
560	(compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" ""))
561		    (const_int 0)))
562   (set (match_operand:SI 0 "gpc_reg_operand" "")
563	(sign_extend:SI (match_dup 1)))]
564  "TARGET_POWERPC && reload_completed"
565  [(set (match_dup 0)
566	(sign_extend:SI (match_dup 1)))
567   (set (match_dup 2)
568	(compare:CC (match_dup 0)
569		    (const_int 0)))]
570  "")
571
572(define_expand "extendqisi2_power"
573  [(parallel [(set (match_dup 2)
574		   (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
575			      (const_int 24)))
576	      (clobber (scratch:SI))])
577   (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
578		   (ashiftrt:SI (match_dup 2)
579				(const_int 24)))
580	      (clobber (scratch:SI))])]
581  "TARGET_POWER"
582  "
583{ operands[1] = gen_lowpart (SImode, operands[1]);
584  operands[2] = gen_reg_rtx (SImode); }")
585
586(define_expand "extendqisi2_no_power"
587  [(set (match_dup 2)
588	(ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
589		   (const_int 24)))
590   (set (match_operand:SI 0 "gpc_reg_operand" "")
591	(ashiftrt:SI (match_dup 2)
592		     (const_int 24)))]
593  "! TARGET_POWER && ! TARGET_POWERPC"
594  "
595{ operands[1] = gen_lowpart (SImode, operands[1]);
596  operands[2] = gen_reg_rtx (SImode); }")
597
598(define_expand "zero_extendqihi2"
599  [(set (match_operand:HI 0 "gpc_reg_operand" "")
600	(zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "")))]
601  ""
602  "")
603
604(define_insn ""
605  [(set (match_operand:HI 0 "gpc_reg_operand" "=r,r")
606	(zero_extend:HI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
607  ""
608  "@
609   lbz%U1%X1 %0,%1
610   {rlinm|rlwinm} %0,%1,0,0xff"
611  [(set_attr "type" "load,*")])
612
613(define_insn ""
614  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
615	(compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
616		    (const_int 0)))
617   (clobber (match_scratch:HI 2 "=r,r"))]
618  ""
619  "@
620   {andil.|andi.} %2,%1,0xff
621   #"
622  [(set_attr "type" "compare")
623   (set_attr "length" "4,8")])
624
625(define_split
626  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
627	(compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" ""))
628		    (const_int 0)))
629   (clobber (match_scratch:HI 2 ""))]
630  "reload_completed"
631  [(set (match_dup 2)
632	(zero_extend:HI (match_dup 1)))
633   (set (match_dup 0)
634	(compare:CC (match_dup 2)
635		    (const_int 0)))]
636  "")
637
638(define_insn ""
639  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
640	(compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
641		    (const_int 0)))
642   (set (match_operand:HI 0 "gpc_reg_operand" "=r,r")
643	(zero_extend:HI (match_dup 1)))]
644  ""
645  "@
646   {andil.|andi.} %0,%1,0xff
647   #"
648  [(set_attr "type" "compare")
649   (set_attr "length" "4,8")])
650
651(define_split
652  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
653	(compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" ""))
654		    (const_int 0)))
655   (set (match_operand:HI 0 "gpc_reg_operand" "")
656	(zero_extend:HI (match_dup 1)))]
657  "reload_completed"
658  [(set (match_dup 0)
659	(zero_extend:HI (match_dup 1)))
660   (set (match_dup 2)
661	(compare:CC (match_dup 0)
662		    (const_int 0)))]
663  "")
664
665(define_expand "extendqihi2"
666  [(use (match_operand:HI 0 "gpc_reg_operand" ""))
667   (use (match_operand:QI 1 "gpc_reg_operand" ""))]
668  ""
669  "
670{
671  if (TARGET_POWERPC)
672    emit_insn (gen_extendqihi2_ppc (operands[0], operands[1]));
673  else if (TARGET_POWER)
674    emit_insn (gen_extendqihi2_power (operands[0], operands[1]));
675  else
676    emit_insn (gen_extendqihi2_no_power (operands[0], operands[1]));
677  DONE;
678}")
679
680(define_insn "extendqihi2_ppc"
681  [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
682	(sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))]
683  "TARGET_POWERPC"
684  "extsb %0,%1")
685
686(define_insn ""
687  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
688	(compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
689		    (const_int 0)))
690   (clobber (match_scratch:HI 2 "=r,r"))]
691  "TARGET_POWERPC"
692  "@
693   extsb. %2,%1
694   #"
695  [(set_attr "type" "compare")
696   (set_attr "length" "4,8")])
697
698(define_split
699  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
700	(compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" ""))
701		    (const_int 0)))
702   (clobber (match_scratch:HI 2 ""))]
703  "TARGET_POWERPC && reload_completed"
704  [(set (match_dup 2)
705	(sign_extend:HI (match_dup 1)))
706   (set (match_dup 0)
707	(compare:CC (match_dup 2)
708		    (const_int 0)))]
709  "")
710
711(define_insn ""
712  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
713	(compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r,r"))
714		    (const_int 0)))
715   (set (match_operand:HI 0 "gpc_reg_operand" "=r,r")
716	(sign_extend:HI (match_dup 1)))]
717  "TARGET_POWERPC"
718  "@
719   extsb. %0,%1
720   #"
721  [(set_attr "type" "compare")
722   (set_attr "length" "4,8")])
723
724(define_split
725  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
726	(compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" ""))
727		    (const_int 0)))
728   (set (match_operand:HI 0 "gpc_reg_operand" "")
729	(sign_extend:HI (match_dup 1)))]
730  "TARGET_POWERPC && reload_completed"
731  [(set (match_dup 0)
732	(sign_extend:HI (match_dup 1)))
733   (set (match_dup 2)
734	(compare:CC (match_dup 0)
735		    (const_int 0)))]
736  "")
737
738(define_expand "extendqihi2_power"
739  [(parallel [(set (match_dup 2)
740		   (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
741			      (const_int 24)))
742	      (clobber (scratch:SI))])
743   (parallel [(set (match_operand:HI 0 "gpc_reg_operand" "")
744		   (ashiftrt:SI (match_dup 2)
745				(const_int 24)))
746	      (clobber (scratch:SI))])]
747  "TARGET_POWER"
748  "
749{ operands[0] = gen_lowpart (SImode, operands[0]);
750  operands[1] = gen_lowpart (SImode, operands[1]);
751  operands[2] = gen_reg_rtx (SImode); }")
752
753(define_expand "extendqihi2_no_power"
754  [(set (match_dup 2)
755	(ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
756		   (const_int 24)))
757   (set (match_operand:HI 0 "gpc_reg_operand" "")
758	(ashiftrt:SI (match_dup 2)
759		     (const_int 24)))]
760  "! TARGET_POWER && ! TARGET_POWERPC"
761  "
762{ operands[0] = gen_lowpart (SImode, operands[0]);
763  operands[1] = gen_lowpart (SImode, operands[1]);
764  operands[2] = gen_reg_rtx (SImode); }")
765
766(define_expand "zero_extendhisi2"
767  [(set (match_operand:SI 0 "gpc_reg_operand" "")
768	(zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))]
769  ""
770  "")
771
772(define_insn ""
773  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
774	(zero_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
775  ""
776  "@
777   lhz%U1%X1 %0,%1
778   {rlinm|rlwinm} %0,%1,0,0xffff"
779  [(set_attr "type" "load,*")])
780
781(define_insn ""
782  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
783	(compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
784		    (const_int 0)))
785   (clobber (match_scratch:SI 2 "=r,r"))]
786  ""
787  "@
788   {andil.|andi.} %2,%1,0xffff
789   #"
790  [(set_attr "type" "compare")
791   (set_attr "length" "4,8")])
792
793(define_split
794  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
795	(compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
796		    (const_int 0)))
797   (clobber (match_scratch:SI 2 ""))]
798  "reload_completed"
799  [(set (match_dup 2)
800	(zero_extend:SI (match_dup 1)))
801   (set (match_dup 0)
802	(compare:CC (match_dup 2)
803		    (const_int 0)))]
804  "")
805
806(define_insn ""
807  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
808	(compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
809		    (const_int 0)))
810   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
811	(zero_extend:SI (match_dup 1)))]
812  ""
813  "@
814   {andil.|andi.} %0,%1,0xffff
815   #"
816  [(set_attr "type" "compare")
817   (set_attr "length" "4,8")])
818
819(define_split
820  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
821	(compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
822		    (const_int 0)))
823   (set (match_operand:SI 0 "gpc_reg_operand" "")
824	(zero_extend:SI (match_dup 1)))]
825  "reload_completed"
826  [(set (match_dup 0)
827	(zero_extend:SI (match_dup 1)))
828   (set (match_dup 2)
829	(compare:CC (match_dup 0)
830		    (const_int 0)))]
831  "")
832
833(define_expand "extendhisi2"
834  [(set (match_operand:SI 0 "gpc_reg_operand" "")
835	(sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))]
836  ""
837  "")
838
839(define_insn ""
840  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
841	(sign_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
842  ""
843  "@
844   lha%U1%X1 %0,%1
845   {exts|extsh} %0,%1"
846  [(set_attr "type" "load_ext,*")])
847
848(define_insn ""
849  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
850	(compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
851		    (const_int 0)))
852   (clobber (match_scratch:SI 2 "=r,r"))]
853  ""
854  "@
855   {exts.|extsh.} %2,%1
856   #"
857  [(set_attr "type" "compare")
858   (set_attr "length" "4,8")])
859
860(define_split
861  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
862	(compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
863		    (const_int 0)))
864   (clobber (match_scratch:SI 2 ""))]
865  "reload_completed"
866  [(set (match_dup 2)
867	(sign_extend:SI (match_dup 1)))
868   (set (match_dup 0)
869	(compare:CC (match_dup 2)
870		    (const_int 0)))]
871  "")
872
873(define_insn ""
874  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
875	(compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r"))
876		    (const_int 0)))
877   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
878	(sign_extend:SI (match_dup 1)))]
879  ""
880  "@
881   {exts.|extsh.} %0,%1
882   #"
883  [(set_attr "type" "compare")
884   (set_attr "length" "4,8")])
885
886;; IBM 405 and 440 half-word multiplication operations.
887
888(define_insn "*macchwc"
889  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
890        (compare:CC (plus:SI (mult:SI (ashiftrt:SI
891                                       (match_operand:SI 2 "gpc_reg_operand" "r")
892                                       (const_int 16))
893                                      (sign_extend:SI
894                                       (match_operand:HI 1 "gpc_reg_operand" "r")))
895                             (match_operand:SI 4 "gpc_reg_operand" "0"))
896                    (const_int 0)))
897   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
898        (plus:SI (mult:SI (ashiftrt:SI
899                           (match_dup 2)
900                           (const_int 16))
901                          (sign_extend:SI
902                           (match_dup 1)))
903                 (match_dup 4)))]
904  "TARGET_MULHW"
905  "macchw. %0, %1, %2"
906  [(set_attr "type" "imul3")])
907
908(define_insn "*macchw"
909  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
910        (plus:SI (mult:SI (ashiftrt:SI
911                           (match_operand:SI 2 "gpc_reg_operand" "r")
912                           (const_int 16))
913                          (sign_extend:SI
914                           (match_operand:HI 1 "gpc_reg_operand" "r")))
915                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
916  "TARGET_MULHW"
917  "macchw %0, %1, %2"
918  [(set_attr "type" "imul3")])
919
920(define_insn "*macchwuc"
921  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
922        (compare:CC (plus:SI (mult:SI (lshiftrt:SI
923                                       (match_operand:SI 2 "gpc_reg_operand" "r")
924                                       (const_int 16))
925                                      (zero_extend:SI
926                                       (match_operand:HI 1 "gpc_reg_operand" "r")))
927                             (match_operand:SI 4 "gpc_reg_operand" "0"))
928                    (const_int 0)))
929   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
930        (plus:SI (mult:SI (lshiftrt:SI
931                           (match_dup 2)
932                           (const_int 16))
933                          (zero_extend:SI
934                           (match_dup 1)))
935                 (match_dup 4)))]
936  "TARGET_MULHW"
937  "macchwu. %0, %1, %2"
938  [(set_attr "type" "imul3")])
939
940(define_insn "*macchwu"
941  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
942        (plus:SI (mult:SI (lshiftrt:SI
943                           (match_operand:SI 2 "gpc_reg_operand" "r")
944                           (const_int 16))
945                          (zero_extend:SI
946                           (match_operand:HI 1 "gpc_reg_operand" "r")))
947                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
948  "TARGET_MULHW"
949  "macchwu %0, %1, %2"
950  [(set_attr "type" "imul3")])
951
952(define_insn "*machhwc"
953  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
954        (compare:CC (plus:SI (mult:SI (ashiftrt:SI
955                                       (match_operand:SI 1 "gpc_reg_operand" "%r")
956                                       (const_int 16))
957                                      (ashiftrt:SI
958                                       (match_operand:SI 2 "gpc_reg_operand" "r")
959                                       (const_int 16)))
960                             (match_operand:SI 4 "gpc_reg_operand" "0"))
961                    (const_int 0)))
962   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
963        (plus:SI (mult:SI (ashiftrt:SI
964                           (match_dup 1)
965                           (const_int 16))
966                          (ashiftrt:SI
967                           (match_dup 2)
968                           (const_int 16)))
969                 (match_dup 4)))]
970  "TARGET_MULHW"
971  "machhw. %0, %1, %2"
972  [(set_attr "type" "imul3")])
973
974(define_insn "*machhw"
975  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
976        (plus:SI (mult:SI (ashiftrt:SI
977                           (match_operand:SI 1 "gpc_reg_operand" "%r")
978                           (const_int 16))
979                          (ashiftrt:SI
980                           (match_operand:SI 2 "gpc_reg_operand" "r")
981                           (const_int 16)))
982                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
983  "TARGET_MULHW"
984  "machhw %0, %1, %2"
985  [(set_attr "type" "imul3")])
986
987(define_insn "*machhwuc"
988  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
989        (compare:CC (plus:SI (mult:SI (lshiftrt:SI
990                                       (match_operand:SI 1 "gpc_reg_operand" "%r")
991                                       (const_int 16))
992                                      (lshiftrt:SI
993                                       (match_operand:SI 2 "gpc_reg_operand" "r")
994                                       (const_int 16)))
995                             (match_operand:SI 4 "gpc_reg_operand" "0"))
996                    (const_int 0)))
997   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
998        (plus:SI (mult:SI (lshiftrt:SI
999                           (match_dup 1)
1000                           (const_int 16))
1001                          (lshiftrt:SI
1002                           (match_dup 2)
1003                           (const_int 16)))
1004                 (match_dup 4)))]
1005  "TARGET_MULHW"
1006  "machhwu. %0, %1, %2"
1007  [(set_attr "type" "imul3")])
1008
1009(define_insn "*machhwu"
1010  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1011        (plus:SI (mult:SI (lshiftrt:SI
1012                           (match_operand:SI 1 "gpc_reg_operand" "%r")
1013                           (const_int 16))
1014                          (lshiftrt:SI
1015                           (match_operand:SI 2 "gpc_reg_operand" "r")
1016                           (const_int 16)))
1017                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
1018  "TARGET_MULHW"
1019  "machhwu %0, %1, %2"
1020  [(set_attr "type" "imul3")])
1021
1022(define_insn "*maclhwc"
1023  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1024        (compare:CC (plus:SI (mult:SI (sign_extend:SI
1025                                       (match_operand:HI 1 "gpc_reg_operand" "%r"))
1026                                      (sign_extend:SI
1027                                       (match_operand:HI 2 "gpc_reg_operand" "r")))
1028                             (match_operand:SI 4 "gpc_reg_operand" "0"))
1029                    (const_int 0)))
1030   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1031        (plus:SI (mult:SI (sign_extend:SI
1032                           (match_dup 1))
1033                          (sign_extend:SI
1034                           (match_dup 2)))
1035                 (match_dup 4)))]
1036  "TARGET_MULHW"
1037  "maclhw. %0, %1, %2"
1038  [(set_attr "type" "imul3")])
1039
1040(define_insn "*maclhw"
1041  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1042        (plus:SI (mult:SI (sign_extend:SI
1043                           (match_operand:HI 1 "gpc_reg_operand" "%r"))
1044                          (sign_extend:SI
1045                           (match_operand:HI 2 "gpc_reg_operand" "r")))
1046                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
1047  "TARGET_MULHW"
1048  "maclhw %0, %1, %2"
1049  [(set_attr "type" "imul3")])
1050
1051(define_insn "*maclhwuc"
1052  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1053        (compare:CC (plus:SI (mult:SI (zero_extend:SI
1054                                       (match_operand:HI 1 "gpc_reg_operand" "%r"))
1055                                      (zero_extend:SI
1056                                       (match_operand:HI 2 "gpc_reg_operand" "r")))
1057                             (match_operand:SI 4 "gpc_reg_operand" "0"))
1058                    (const_int 0)))
1059   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1060        (plus:SI (mult:SI (zero_extend:SI
1061                           (match_dup 1))
1062                          (zero_extend:SI
1063                           (match_dup 2)))
1064                 (match_dup 4)))]
1065  "TARGET_MULHW"
1066  "maclhwu. %0, %1, %2"
1067  [(set_attr "type" "imul3")])
1068
1069(define_insn "*maclhwu"
1070  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1071        (plus:SI (mult:SI (zero_extend:SI
1072                           (match_operand:HI 1 "gpc_reg_operand" "%r"))
1073                          (zero_extend:SI
1074                           (match_operand:HI 2 "gpc_reg_operand" "r")))
1075                 (match_operand:SI 3 "gpc_reg_operand" "0")))]
1076  "TARGET_MULHW"
1077  "maclhwu %0, %1, %2"
1078  [(set_attr "type" "imul3")])
1079
1080(define_insn "*nmacchwc"
1081  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1082        (compare:CC (minus:SI (match_operand:SI 4 "gpc_reg_operand" "0")
1083                              (mult:SI (ashiftrt:SI
1084                                        (match_operand:SI 2 "gpc_reg_operand" "r")
1085                                        (const_int 16))
1086                                       (sign_extend:SI
1087                                        (match_operand:HI 1 "gpc_reg_operand" "r"))))
1088                    (const_int 0)))
1089   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1090        (minus:SI (match_dup 4)
1091                  (mult:SI (ashiftrt:SI
1092                            (match_dup 2)
1093                            (const_int 16))
1094                           (sign_extend:SI
1095                            (match_dup 1)))))]
1096  "TARGET_MULHW"
1097  "nmacchw. %0, %1, %2"
1098  [(set_attr "type" "imul3")])
1099
1100(define_insn "*nmacchw"
1101  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1102        (minus:SI (match_operand:SI 3 "gpc_reg_operand" "0")
1103                  (mult:SI (ashiftrt:SI
1104                            (match_operand:SI 2 "gpc_reg_operand" "r")
1105                            (const_int 16))
1106                           (sign_extend:SI
1107                            (match_operand:HI 1 "gpc_reg_operand" "r")))))]
1108  "TARGET_MULHW"
1109  "nmacchw %0, %1, %2"
1110  [(set_attr "type" "imul3")])
1111
1112(define_insn "*nmachhwc"
1113  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1114        (compare:CC (minus:SI (match_operand:SI 4 "gpc_reg_operand" "0")
1115                              (mult:SI (ashiftrt:SI
1116                                        (match_operand:SI 1 "gpc_reg_operand" "%r")
1117                                        (const_int 16))
1118                                       (ashiftrt:SI
1119                                        (match_operand:SI 2 "gpc_reg_operand" "r")
1120                                        (const_int 16))))
1121                    (const_int 0)))
1122   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1123        (minus:SI (match_dup 4)
1124                  (mult:SI (ashiftrt:SI
1125                            (match_dup 1)
1126                            (const_int 16))
1127                           (ashiftrt:SI
1128                            (match_dup 2)
1129                            (const_int 16)))))]
1130  "TARGET_MULHW"
1131  "nmachhw. %0, %1, %2"
1132  [(set_attr "type" "imul3")])
1133
1134(define_insn "*nmachhw"
1135  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1136        (minus:SI (match_operand:SI 3 "gpc_reg_operand" "0")
1137                  (mult:SI (ashiftrt:SI
1138                            (match_operand:SI 1 "gpc_reg_operand" "%r")
1139                            (const_int 16))
1140                           (ashiftrt:SI
1141                            (match_operand:SI 2 "gpc_reg_operand" "r")
1142                            (const_int 16)))))]
1143  "TARGET_MULHW"
1144  "nmachhw %0, %1, %2"
1145  [(set_attr "type" "imul3")])
1146
1147(define_insn "*nmaclhwc"
1148  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1149        (compare:CC (minus:SI (match_operand:SI 4 "gpc_reg_operand" "0")
1150                              (mult:SI (sign_extend:SI
1151                                        (match_operand:HI 1 "gpc_reg_operand" "%r"))
1152                                       (sign_extend:SI
1153                                        (match_operand:HI 2 "gpc_reg_operand" "r"))))
1154                    (const_int 0)))
1155   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1156        (minus:SI (match_dup 4)
1157                  (mult:SI (sign_extend:SI
1158                            (match_dup 1))
1159                           (sign_extend:SI
1160                            (match_dup 2)))))]
1161  "TARGET_MULHW"
1162  "nmaclhw. %0, %1, %2"
1163  [(set_attr "type" "imul3")])
1164
1165(define_insn "*nmaclhw"
1166  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1167        (minus:SI (match_operand:SI 3 "gpc_reg_operand" "0")
1168                  (mult:SI (sign_extend:SI
1169                            (match_operand:HI 1 "gpc_reg_operand" "%r"))
1170                           (sign_extend:SI
1171                            (match_operand:HI 2 "gpc_reg_operand" "r")))))]
1172  "TARGET_MULHW"
1173  "nmaclhw %0, %1, %2"
1174  [(set_attr "type" "imul3")])
1175
1176(define_insn "*mulchwc"
1177  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1178        (compare:CC (mult:SI (ashiftrt:SI
1179                              (match_operand:SI 2 "gpc_reg_operand" "r")
1180                              (const_int 16))
1181                             (sign_extend:SI
1182                              (match_operand:HI 1 "gpc_reg_operand" "r")))
1183                    (const_int 0)))
1184   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1185        (mult:SI (ashiftrt:SI
1186                  (match_dup 2)
1187                  (const_int 16))
1188                 (sign_extend:SI
1189                  (match_dup 1))))]
1190  "TARGET_MULHW"
1191  "mulchw. %0, %1, %2"
1192  [(set_attr "type" "imul3")])
1193
1194(define_insn "*mulchw"
1195  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1196        (mult:SI (ashiftrt:SI
1197                  (match_operand:SI 2 "gpc_reg_operand" "r")
1198                  (const_int 16))
1199                 (sign_extend:SI
1200                  (match_operand:HI 1 "gpc_reg_operand" "r"))))]
1201  "TARGET_MULHW"
1202  "mulchw %0, %1, %2"
1203  [(set_attr "type" "imul3")])
1204
1205(define_insn "*mulchwuc"
1206  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1207        (compare:CC (mult:SI (lshiftrt:SI
1208                              (match_operand:SI 2 "gpc_reg_operand" "r")
1209                              (const_int 16))
1210                             (zero_extend:SI
1211                              (match_operand:HI 1 "gpc_reg_operand" "r")))
1212                    (const_int 0)))
1213   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1214        (mult:SI (lshiftrt:SI
1215                  (match_dup 2)
1216                  (const_int 16))
1217                 (zero_extend:SI
1218                  (match_dup 1))))]
1219  "TARGET_MULHW"
1220  "mulchwu. %0, %1, %2"
1221  [(set_attr "type" "imul3")])
1222
1223(define_insn "*mulchwu"
1224  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1225        (mult:SI (lshiftrt:SI
1226                  (match_operand:SI 2 "gpc_reg_operand" "r")
1227                  (const_int 16))
1228                 (zero_extend:SI
1229                  (match_operand:HI 1 "gpc_reg_operand" "r"))))]
1230  "TARGET_MULHW"
1231  "mulchwu %0, %1, %2"
1232  [(set_attr "type" "imul3")])
1233
1234(define_insn "*mulhhwc"
1235  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1236        (compare:CC (mult:SI (ashiftrt:SI
1237                              (match_operand:SI 1 "gpc_reg_operand" "%r")
1238                              (const_int 16))
1239                             (ashiftrt:SI
1240                              (match_operand:SI 2 "gpc_reg_operand" "r")
1241                              (const_int 16)))
1242                    (const_int 0)))
1243   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1244        (mult:SI (ashiftrt:SI
1245                  (match_dup 1)
1246                  (const_int 16))
1247                 (ashiftrt:SI
1248                  (match_dup 2)
1249                  (const_int 16))))]
1250  "TARGET_MULHW"
1251  "mulhhw. %0, %1, %2"
1252  [(set_attr "type" "imul3")])
1253
1254(define_insn "*mulhhw"
1255  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1256        (mult:SI (ashiftrt:SI
1257                  (match_operand:SI 1 "gpc_reg_operand" "%r")
1258                  (const_int 16))
1259                 (ashiftrt:SI
1260                  (match_operand:SI 2 "gpc_reg_operand" "r")
1261                  (const_int 16))))]
1262  "TARGET_MULHW"
1263  "mulhhw %0, %1, %2"
1264  [(set_attr "type" "imul3")])
1265
1266(define_insn "*mulhhwuc"
1267  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1268        (compare:CC (mult:SI (lshiftrt:SI
1269                              (match_operand:SI 1 "gpc_reg_operand" "%r")
1270                              (const_int 16))
1271                             (lshiftrt:SI
1272                              (match_operand:SI 2 "gpc_reg_operand" "r")
1273                              (const_int 16)))
1274                    (const_int 0)))
1275   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1276        (mult:SI (lshiftrt:SI
1277                  (match_dup 1)
1278                  (const_int 16))
1279                 (lshiftrt:SI
1280                  (match_dup 2)
1281                  (const_int 16))))]
1282  "TARGET_MULHW"
1283  "mulhhwu. %0, %1, %2"
1284  [(set_attr "type" "imul3")])
1285
1286(define_insn "*mulhhwu"
1287  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1288        (mult:SI (lshiftrt:SI
1289                  (match_operand:SI 1 "gpc_reg_operand" "%r")
1290                  (const_int 16))
1291                 (lshiftrt:SI
1292                  (match_operand:SI 2 "gpc_reg_operand" "r")
1293                  (const_int 16))))]
1294  "TARGET_MULHW"
1295  "mulhhwu %0, %1, %2"
1296  [(set_attr "type" "imul3")])
1297
1298(define_insn "*mullhwc"
1299  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1300        (compare:CC (mult:SI (sign_extend:SI
1301                              (match_operand:HI 1 "gpc_reg_operand" "%r"))
1302                             (sign_extend:SI
1303                              (match_operand:HI 2 "gpc_reg_operand" "r")))
1304                    (const_int 0)))
1305   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1306        (mult:SI (sign_extend:SI
1307                  (match_dup 1))
1308                 (sign_extend:SI
1309                  (match_dup 2))))]
1310  "TARGET_MULHW"
1311  "mullhw. %0, %1, %2"
1312  [(set_attr "type" "imul3")])
1313
1314(define_insn "*mullhw"
1315  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1316        (mult:SI (sign_extend:SI
1317                  (match_operand:HI 1 "gpc_reg_operand" "%r"))
1318                 (sign_extend:SI
1319                  (match_operand:HI 2 "gpc_reg_operand" "r"))))]
1320  "TARGET_MULHW"
1321  "mullhw %0, %1, %2"
1322  [(set_attr "type" "imul3")])
1323
1324(define_insn "*mullhwuc"
1325  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1326        (compare:CC (mult:SI (zero_extend:SI
1327                              (match_operand:HI 1 "gpc_reg_operand" "%r"))
1328                             (zero_extend:SI
1329                              (match_operand:HI 2 "gpc_reg_operand" "r")))
1330                    (const_int 0)))
1331   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1332        (mult:SI (zero_extend:SI
1333                  (match_dup 1))
1334                 (zero_extend:SI
1335                  (match_dup 2))))]
1336  "TARGET_MULHW"
1337  "mullhwu. %0, %1, %2"
1338  [(set_attr "type" "imul3")])
1339
1340(define_insn "*mullhwu"
1341  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1342        (mult:SI (zero_extend:SI
1343                  (match_operand:HI 1 "gpc_reg_operand" "%r"))
1344                 (zero_extend:SI
1345                  (match_operand:HI 2 "gpc_reg_operand" "r"))))]
1346  "TARGET_MULHW"
1347  "mullhwu %0, %1, %2"
1348  [(set_attr "type" "imul3")])
1349
1350;; IBM 405 and 440 string-search dlmzb instruction support.
1351(define_insn "dlmzb"
1352  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1353        (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
1354                    (match_operand:SI 2 "gpc_reg_operand" "r")]
1355                   UNSPEC_DLMZB_CR))
1356   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1357        (unspec:SI [(match_dup 1)
1358                    (match_dup 2)]
1359                   UNSPEC_DLMZB))]
1360  "TARGET_DLMZB"
1361  "dlmzb. %0, %1, %2")
1362
1363(define_expand "strlensi"
1364  [(set (match_operand:SI 0 "gpc_reg_operand" "")
1365        (unspec:SI [(match_operand:BLK 1 "general_operand" "")
1366                    (match_operand:QI 2 "const_int_operand" "")
1367                    (match_operand 3 "const_int_operand" "")]
1368                   UNSPEC_DLMZB_STRLEN))
1369   (clobber (match_scratch:CC 4 "=x"))]
1370  "TARGET_DLMZB && WORDS_BIG_ENDIAN && !optimize_size"
1371{
1372  rtx result = operands[0];
1373  rtx src = operands[1];
1374  rtx search_char = operands[2];
1375  rtx align = operands[3];
1376  rtx addr, scratch_string, word1, word2, scratch_dlmzb;
1377  rtx loop_label, end_label, mem, cr0, cond;
1378  if (search_char != const0_rtx
1379      || GET_CODE (align) != CONST_INT
1380      || INTVAL (align) < 8)
1381        FAIL;
1382  word1 = gen_reg_rtx (SImode);
1383  word2 = gen_reg_rtx (SImode);
1384  scratch_dlmzb = gen_reg_rtx (SImode);
1385  scratch_string = gen_reg_rtx (Pmode);
1386  loop_label = gen_label_rtx ();
1387  end_label = gen_label_rtx ();
1388  addr = force_reg (Pmode, XEXP (src, 0));
1389  emit_move_insn (scratch_string, addr);
1390  emit_label (loop_label);
1391  mem = change_address (src, SImode, scratch_string);
1392  emit_move_insn (word1, mem);
1393  emit_move_insn (word2, adjust_address (mem, SImode, 4));
1394  cr0 = gen_rtx_REG (CCmode, CR0_REGNO);
1395  emit_insn (gen_dlmzb (scratch_dlmzb, word1, word2, cr0));
1396  cond = gen_rtx_NE (VOIDmode, cr0, const0_rtx);
1397  emit_jump_insn (gen_rtx_SET (VOIDmode,
1398                               pc_rtx,
1399                               gen_rtx_IF_THEN_ELSE (VOIDmode,
1400                                                     cond,
1401                                                     gen_rtx_LABEL_REF
1402                                                       (VOIDmode,
1403                                                        end_label),
1404                                                     pc_rtx)));
1405  emit_insn (gen_addsi3 (scratch_string, scratch_string, GEN_INT (8)));
1406  emit_jump_insn (gen_rtx_SET (VOIDmode,
1407                               pc_rtx,
1408                               gen_rtx_LABEL_REF (VOIDmode, loop_label)));
1409  emit_barrier ();
1410  emit_label (end_label);
1411  emit_insn (gen_addsi3 (scratch_string, scratch_string, scratch_dlmzb));
1412  emit_insn (gen_subsi3 (result, scratch_string, addr));
1413  emit_insn (gen_subsi3 (result, result, const1_rtx));
1414  DONE;
1415})
1416
1417(define_split
1418  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
1419	(compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
1420		    (const_int 0)))
1421   (set (match_operand:SI 0 "gpc_reg_operand" "")
1422	(sign_extend:SI (match_dup 1)))]
1423  "reload_completed"
1424  [(set (match_dup 0)
1425	(sign_extend:SI (match_dup 1)))
1426   (set (match_dup 2)
1427	(compare:CC (match_dup 0)
1428		    (const_int 0)))]
1429  "")
1430
1431;; Fixed-point arithmetic insns.
1432
1433(define_expand "add<mode>3"
1434  [(set (match_operand:SDI 0 "gpc_reg_operand" "")
1435	(plus:SDI (match_operand:SDI 1 "gpc_reg_operand" "")
1436		  (match_operand:SDI 2 "reg_or_add_cint_operand" "")))]
1437  ""
1438{
1439  if (<MODE>mode == DImode && ! TARGET_POWERPC64)
1440    {
1441      if (non_short_cint_operand (operands[2], DImode))
1442	FAIL;
1443    }
1444  else if (GET_CODE (operands[2]) == CONST_INT
1445	   && ! add_operand (operands[2], <MODE>mode))
1446    {
1447      rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1]))
1448		 ? operands[0] : gen_reg_rtx (<MODE>mode));
1449
1450      HOST_WIDE_INT val = INTVAL (operands[2]);
1451      HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
1452      HOST_WIDE_INT rest = trunc_int_for_mode (val - low, <MODE>mode);
1453
1454      if (<MODE>mode == DImode && !satisfies_constraint_L (GEN_INT (rest)))
1455	FAIL;
1456
1457      /* The ordering here is important for the prolog expander.
1458	 When space is allocated from the stack, adding 'low' first may
1459	 produce a temporary deallocation (which would be bad).  */
1460      emit_insn (gen_add<mode>3 (tmp, operands[1], GEN_INT (rest)));
1461      emit_insn (gen_add<mode>3 (operands[0], tmp, GEN_INT (low)));
1462      DONE;
1463    }
1464})
1465
1466;; Discourage ai/addic because of carry but provide it in an alternative
1467;; allowing register zero as source.
1468(define_insn "*add<mode>3_internal1"
1469  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r,r,?r,r")
1470	(plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,b,r,b")
1471		  (match_operand:GPR 2 "add_operand" "r,I,I,L")))]
1472  ""
1473  "@
1474   {cax|add} %0,%1,%2
1475   {cal %0,%2(%1)|addi %0,%1,%2}
1476   {ai|addic} %0,%1,%2
1477   {cau|addis} %0,%1,%v2"
1478  [(set_attr "length" "4,4,4,4")])
1479
1480(define_insn "addsi3_high"
1481  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
1482        (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
1483                 (high:SI (match_operand 2 "" ""))))]
1484  "TARGET_MACHO && !TARGET_64BIT"
1485  "{cau|addis} %0,%1,ha16(%2)"
1486  [(set_attr "length" "4")])
1487
1488(define_insn "*add<mode>3_internal2"
1489  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
1490	(compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "%r,r,r,r")
1491			    (match_operand:P 2 "reg_or_short_operand" "r,I,r,I"))
1492		    (const_int 0)))
1493   (clobber (match_scratch:P 3 "=r,r,r,r"))]
1494  ""
1495  "@
1496   {cax.|add.} %3,%1,%2
1497   {ai.|addic.} %3,%1,%2
1498   #
1499   #"
1500  [(set_attr "type" "fast_compare,compare,compare,compare")
1501   (set_attr "length" "4,4,8,8")])
1502
1503(define_split
1504  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
1505	(compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
1506			      (match_operand:GPR 2 "reg_or_short_operand" ""))
1507		    (const_int 0)))
1508   (clobber (match_scratch:GPR 3 ""))]
1509  "reload_completed"
1510  [(set (match_dup 3)
1511	(plus:GPR (match_dup 1)
1512		 (match_dup 2)))
1513   (set (match_dup 0)
1514	(compare:CC (match_dup 3)
1515		    (const_int 0)))]
1516  "")
1517
1518(define_insn "*add<mode>3_internal3"
1519  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
1520	(compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "%r,r,r,r")
1521			    (match_operand:P 2 "reg_or_short_operand" "r,I,r,I"))
1522		    (const_int 0)))
1523   (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r,r")
1524	(plus:P (match_dup 1)
1525		(match_dup 2)))]
1526  ""
1527  "@
1528   {cax.|add.} %0,%1,%2
1529   {ai.|addic.} %0,%1,%2
1530   #
1531   #"
1532  [(set_attr "type" "fast_compare,compare,compare,compare")
1533   (set_attr "length" "4,4,8,8")])
1534
1535(define_split
1536  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
1537	(compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "")
1538			    (match_operand:P 2 "reg_or_short_operand" ""))
1539		    (const_int 0)))
1540   (set (match_operand:P 0 "gpc_reg_operand" "")
1541	(plus:P (match_dup 1) (match_dup 2)))]
1542  "reload_completed"
1543  [(set (match_dup 0)
1544	(plus:P (match_dup 1)
1545		(match_dup 2)))
1546   (set (match_dup 3)
1547	(compare:CC (match_dup 0)
1548		    (const_int 0)))]
1549  "")
1550
1551;; Split an add that we can't do in one insn into two insns, each of which
1552;; does one 16-bit part.  This is used by combine.  Note that the low-order
1553;; add should be last in case the result gets used in an address.
1554
1555(define_split
1556  [(set (match_operand:GPR 0 "gpc_reg_operand" "")
1557	(plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
1558		  (match_operand:GPR 2 "non_add_cint_operand" "")))]
1559  ""
1560  [(set (match_dup 0) (plus:GPR (match_dup 1) (match_dup 3)))
1561   (set (match_dup 0) (plus:GPR (match_dup 0) (match_dup 4)))]
1562{
1563  HOST_WIDE_INT val = INTVAL (operands[2]);
1564  HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
1565  HOST_WIDE_INT rest = trunc_int_for_mode (val - low, <MODE>mode);
1566
1567  operands[4] = GEN_INT (low);
1568  if (<MODE>mode == SImode || satisfies_constraint_L (GEN_INT (rest)))
1569    operands[3] = GEN_INT (rest);
1570  else if (! no_new_pseudos)
1571    {
1572      operands[3] = gen_reg_rtx (DImode);
1573      emit_move_insn (operands[3], operands[2]);
1574      emit_insn (gen_adddi3 (operands[0], operands[1], operands[3]));
1575      DONE;
1576    }
1577  else
1578    FAIL;
1579})
1580
1581(define_insn "one_cmpl<mode>2"
1582  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
1583	(not:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))]
1584  ""
1585  "nor %0,%1,%1")
1586
1587(define_insn ""
1588  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
1589	(compare:CC (not:P (match_operand:P 1 "gpc_reg_operand" "r,r"))
1590		    (const_int 0)))
1591   (clobber (match_scratch:P 2 "=r,r"))]
1592  ""
1593  "@
1594   nor. %2,%1,%1
1595   #"
1596  [(set_attr "type" "compare")
1597   (set_attr "length" "4,8")])
1598
1599(define_split
1600  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
1601	(compare:CC (not:P (match_operand:P 1 "gpc_reg_operand" ""))
1602		    (const_int 0)))
1603   (clobber (match_scratch:P 2 ""))]
1604  "reload_completed"
1605  [(set (match_dup 2)
1606	(not:P (match_dup 1)))
1607   (set (match_dup 0)
1608	(compare:CC (match_dup 2)
1609		    (const_int 0)))]
1610  "")
1611
1612(define_insn ""
1613  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
1614	(compare:CC (not:P (match_operand:P 1 "gpc_reg_operand" "r,r"))
1615		    (const_int 0)))
1616   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
1617	(not:P (match_dup 1)))]
1618  ""
1619  "@
1620   nor. %0,%1,%1
1621   #"
1622  [(set_attr "type" "compare")
1623   (set_attr "length" "4,8")])
1624
1625(define_split
1626  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
1627	(compare:CC (not:P (match_operand:P 1 "gpc_reg_operand" ""))
1628		    (const_int 0)))
1629   (set (match_operand:P 0 "gpc_reg_operand" "")
1630	(not:P (match_dup 1)))]
1631  "reload_completed"
1632  [(set (match_dup 0)
1633	(not:P (match_dup 1)))
1634   (set (match_dup 2)
1635	(compare:CC (match_dup 0)
1636		    (const_int 0)))]
1637  "")
1638
1639(define_insn ""
1640  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1641	(minus:SI (match_operand:SI 1 "reg_or_short_operand" "rI")
1642		  (match_operand:SI 2 "gpc_reg_operand" "r")))]
1643  "! TARGET_POWERPC"
1644  "{sf%I1|subf%I1c} %0,%2,%1")
1645
1646(define_insn ""
1647  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r,r")
1648	(minus:GPR (match_operand:GPR 1 "reg_or_short_operand" "r,I")
1649		   (match_operand:GPR 2 "gpc_reg_operand" "r,r")))]
1650  "TARGET_POWERPC"
1651  "@
1652   subf %0,%2,%1
1653   subfic %0,%2,%1")
1654
1655(define_insn ""
1656  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
1657	(compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
1658			      (match_operand:SI 2 "gpc_reg_operand" "r,r"))
1659		    (const_int 0)))
1660   (clobber (match_scratch:SI 3 "=r,r"))]
1661  "! TARGET_POWERPC"
1662  "@
1663   {sf.|subfc.} %3,%2,%1
1664   #"
1665  [(set_attr "type" "compare")
1666   (set_attr "length" "4,8")])
1667
1668(define_insn ""
1669  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
1670	(compare:CC (minus:P (match_operand:P 1 "gpc_reg_operand" "r,r")
1671			     (match_operand:P 2 "gpc_reg_operand" "r,r"))
1672		    (const_int 0)))
1673   (clobber (match_scratch:P 3 "=r,r"))]
1674  "TARGET_POWERPC"
1675  "@
1676   subf. %3,%2,%1
1677   #"
1678  [(set_attr "type" "fast_compare")
1679   (set_attr "length" "4,8")])
1680
1681(define_split
1682  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
1683	(compare:CC (minus:P (match_operand:P 1 "gpc_reg_operand" "")
1684			     (match_operand:P 2 "gpc_reg_operand" ""))
1685		    (const_int 0)))
1686   (clobber (match_scratch:P 3 ""))]
1687  "reload_completed"
1688  [(set (match_dup 3)
1689	(minus:P (match_dup 1)
1690		  (match_dup 2)))
1691   (set (match_dup 0)
1692	(compare:CC (match_dup 3)
1693		    (const_int 0)))]
1694  "")
1695
1696(define_insn ""
1697  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
1698	(compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
1699			      (match_operand:SI 2 "gpc_reg_operand" "r,r"))
1700		    (const_int 0)))
1701   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1702	(minus:SI (match_dup 1) (match_dup 2)))]
1703  "! TARGET_POWERPC"
1704  "@
1705   {sf.|subfc.} %0,%2,%1
1706   #"
1707  [(set_attr "type" "compare")
1708   (set_attr "length" "4,8")])
1709
1710(define_insn ""
1711  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
1712	(compare:CC (minus:P (match_operand:P 1 "gpc_reg_operand" "r,r")
1713			     (match_operand:P 2 "gpc_reg_operand" "r,r"))
1714		    (const_int 0)))
1715   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
1716	(minus:P (match_dup 1)
1717		  (match_dup 2)))]
1718  "TARGET_POWERPC"
1719  "@
1720   subf. %0,%2,%1
1721   #"
1722  [(set_attr "type" "fast_compare")
1723   (set_attr "length" "4,8")])
1724
1725(define_split
1726  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
1727	(compare:CC (minus:P (match_operand:P 1 "gpc_reg_operand" "")
1728			     (match_operand:P 2 "gpc_reg_operand" ""))
1729		    (const_int 0)))
1730   (set (match_operand:P 0 "gpc_reg_operand" "")
1731	(minus:P (match_dup 1)
1732		  (match_dup 2)))]
1733  "reload_completed"
1734  [(set (match_dup 0)
1735	(minus:P (match_dup 1)
1736		  (match_dup 2)))
1737   (set (match_dup 3)
1738	(compare:CC (match_dup 0)
1739		    (const_int 0)))]
1740  "")
1741
1742(define_expand "sub<mode>3"
1743  [(set (match_operand:SDI 0 "gpc_reg_operand" "")
1744	(minus:SDI (match_operand:SDI 1 "reg_or_short_operand" "")
1745		   (match_operand:SDI 2 "reg_or_sub_cint_operand" "")))]
1746  ""
1747  "
1748{
1749  if (GET_CODE (operands[2]) == CONST_INT)
1750    {
1751      emit_insn (gen_add<mode>3 (operands[0], operands[1],
1752				 negate_rtx (<MODE>mode, operands[2])));
1753      DONE;
1754    }
1755}")
1756
1757;; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i]
1758;; instruction and some auxiliary computations.  Then we just have a single
1759;; DEFINE_INSN for doz[i] and the define_splits to make them if made by
1760;; combine.
1761
1762(define_expand "sminsi3"
1763  [(set (match_dup 3)
1764	(if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
1765				(match_operand:SI 2 "reg_or_short_operand" ""))
1766			 (const_int 0)
1767			 (minus:SI (match_dup 2) (match_dup 1))))
1768   (set (match_operand:SI 0 "gpc_reg_operand" "")
1769	(minus:SI (match_dup 2) (match_dup 3)))]
1770  "TARGET_POWER || TARGET_ISEL"
1771  "
1772{
1773  if (TARGET_ISEL)
1774    {
1775      operands[2] = force_reg (SImode, operands[2]);
1776      rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]);
1777      DONE;
1778    }
1779
1780  operands[3] = gen_reg_rtx (SImode);
1781}")
1782
1783(define_split
1784  [(set (match_operand:SI 0 "gpc_reg_operand" "")
1785	(smin:SI (match_operand:SI 1 "gpc_reg_operand" "")
1786		 (match_operand:SI 2 "reg_or_short_operand" "")))
1787   (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
1788  "TARGET_POWER"
1789  [(set (match_dup 3)
1790	(if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
1791			 (const_int 0)
1792			 (minus:SI (match_dup 2) (match_dup 1))))
1793   (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 3)))]
1794  "")
1795
1796(define_expand "smaxsi3"
1797  [(set (match_dup 3)
1798	(if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
1799				(match_operand:SI 2 "reg_or_short_operand" ""))
1800			 (const_int 0)
1801			 (minus:SI (match_dup 2) (match_dup 1))))
1802   (set (match_operand:SI 0 "gpc_reg_operand" "")
1803	(plus:SI (match_dup 3) (match_dup 1)))]
1804  "TARGET_POWER || TARGET_ISEL"
1805  "
1806{
1807  if (TARGET_ISEL)
1808    {
1809      operands[2] = force_reg (SImode, operands[2]);
1810      rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]);
1811      DONE;
1812    }
1813  operands[3] = gen_reg_rtx (SImode);
1814}")
1815
1816(define_split
1817  [(set (match_operand:SI 0 "gpc_reg_operand" "")
1818	(smax:SI (match_operand:SI 1 "gpc_reg_operand" "")
1819		 (match_operand:SI 2 "reg_or_short_operand" "")))
1820   (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
1821  "TARGET_POWER"
1822  [(set (match_dup 3)
1823	(if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
1824			 (const_int 0)
1825			 (minus:SI (match_dup 2) (match_dup 1))))
1826   (set (match_dup 0) (plus:SI (match_dup 3) (match_dup 1)))]
1827  "")
1828
1829(define_expand "uminsi3"
1830  [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
1831			      (match_dup 5)))
1832   (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
1833			      (match_dup 5)))
1834   (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
1835				       (const_int 0)
1836				       (minus:SI (match_dup 4) (match_dup 3))))
1837   (set (match_operand:SI 0 "gpc_reg_operand" "")
1838	(minus:SI (match_dup 2) (match_dup 3)))]
1839  "TARGET_POWER || TARGET_ISEL"
1840  "
1841{
1842  if (TARGET_ISEL)
1843    {
1844      rs6000_emit_minmax (operands[0], UMIN, operands[1], operands[2]);
1845      DONE;
1846    }
1847  operands[3] = gen_reg_rtx (SImode);
1848  operands[4] = gen_reg_rtx (SImode);
1849  operands[5] = GEN_INT (-2147483647 - 1);
1850}")
1851
1852(define_expand "umaxsi3"
1853  [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
1854			      (match_dup 5)))
1855   (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
1856			      (match_dup 5)))
1857   (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
1858				       (const_int 0)
1859				       (minus:SI (match_dup 4) (match_dup 3))))
1860   (set (match_operand:SI 0 "gpc_reg_operand" "")
1861	(plus:SI (match_dup 3) (match_dup 1)))]
1862  "TARGET_POWER || TARGET_ISEL"
1863  "
1864{
1865  if (TARGET_ISEL)
1866    {
1867      rs6000_emit_minmax (operands[0], UMAX, operands[1], operands[2]);
1868      DONE;
1869    }
1870  operands[3] = gen_reg_rtx (SImode);
1871  operands[4] = gen_reg_rtx (SImode);
1872  operands[5] = GEN_INT (-2147483647 - 1);
1873}")
1874
1875(define_insn ""
1876  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1877	(if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r")
1878			     (match_operand:SI 2 "reg_or_short_operand" "rI"))
1879			 (const_int 0)
1880			 (minus:SI (match_dup 2) (match_dup 1))))]
1881  "TARGET_POWER"
1882  "doz%I2 %0,%1,%2")
1883
1884(define_insn ""
1885  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
1886	(compare:CC
1887	 (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r,r")
1888			      (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
1889			  (const_int 0)
1890			  (minus:SI (match_dup 2) (match_dup 1)))
1891	 (const_int 0)))
1892   (clobber (match_scratch:SI 3 "=r,r"))]
1893  "TARGET_POWER"
1894  "@
1895   doz%I2. %3,%1,%2
1896   #"
1897  [(set_attr "type" "delayed_compare")
1898   (set_attr "length" "4,8")])
1899
1900(define_split
1901  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
1902	(compare:CC
1903	 (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "")
1904			      (match_operand:SI 2 "reg_or_short_operand" ""))
1905			  (const_int 0)
1906			  (minus:SI (match_dup 2) (match_dup 1)))
1907	 (const_int 0)))
1908   (clobber (match_scratch:SI 3 ""))]
1909  "TARGET_POWER && reload_completed"
1910  [(set (match_dup 3)
1911	(if_then_else:SI (gt (match_dup 1) (match_dup 2))
1912			  (const_int 0)
1913			  (minus:SI (match_dup 2) (match_dup 1))))
1914   (set (match_dup 0)
1915	(compare:CC (match_dup 3)
1916		    (const_int 0)))]
1917  "")
1918
1919(define_insn ""
1920  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
1921	(compare:CC
1922	 (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r,r")
1923			      (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
1924			  (const_int 0)
1925			  (minus:SI (match_dup 2) (match_dup 1)))
1926	 (const_int 0)))
1927   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1928	(if_then_else:SI (gt (match_dup 1) (match_dup 2))
1929			 (const_int 0)
1930			 (minus:SI (match_dup 2) (match_dup 1))))]
1931  "TARGET_POWER"
1932  "@
1933   doz%I2. %0,%1,%2
1934   #"
1935  [(set_attr "type" "delayed_compare")
1936   (set_attr "length" "4,8")])
1937
1938(define_split
1939  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
1940	(compare:CC
1941	 (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "")
1942			      (match_operand:SI 2 "reg_or_short_operand" ""))
1943			  (const_int 0)
1944			  (minus:SI (match_dup 2) (match_dup 1)))
1945	 (const_int 0)))
1946   (set (match_operand:SI 0 "gpc_reg_operand" "")
1947	(if_then_else:SI (gt (match_dup 1) (match_dup 2))
1948			 (const_int 0)
1949			 (minus:SI (match_dup 2) (match_dup 1))))]
1950  "TARGET_POWER && reload_completed"
1951  [(set (match_dup 0)
1952	(if_then_else:SI (gt (match_dup 1) (match_dup 2))
1953			 (const_int 0)
1954			 (minus:SI (match_dup 2) (match_dup 1))))
1955   (set (match_dup 3)
1956	(compare:CC (match_dup 0)
1957		    (const_int 0)))]
1958  "")
1959
1960;; We don't need abs with condition code because such comparisons should
1961;; never be done.
1962(define_expand "abssi2"
1963  [(set (match_operand:SI 0 "gpc_reg_operand" "")
1964	(abs:SI (match_operand:SI 1 "gpc_reg_operand" "")))]
1965  ""
1966  "
1967{
1968  if (TARGET_ISEL)
1969    {
1970      emit_insn (gen_abssi2_isel (operands[0], operands[1]));
1971      DONE;
1972    }
1973  else if (! TARGET_POWER)
1974    {
1975      emit_insn (gen_abssi2_nopower (operands[0], operands[1]));
1976      DONE;
1977    }
1978}")
1979
1980(define_insn "*abssi2_power"
1981  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1982	(abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1983  "TARGET_POWER"
1984  "abs %0,%1")
1985
1986(define_insn_and_split "abssi2_isel"
1987  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1988        (abs:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
1989   (clobber (match_scratch:SI 2 "=&b"))
1990   (clobber (match_scratch:CC 3 "=y"))]
1991  "TARGET_ISEL"
1992  "#"
1993  "&& reload_completed"
1994  [(set (match_dup 2) (neg:SI (match_dup 1)))
1995   (set (match_dup 3)
1996	(compare:CC (match_dup 1)
1997		    (const_int 0)))
1998   (set (match_dup 0)
1999	(if_then_else:SI (ge (match_dup 3)
2000			     (const_int 0))
2001			 (match_dup 1)
2002			 (match_dup 2)))]
2003  "")
2004
2005(define_insn_and_split "abssi2_nopower"
2006  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
2007        (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0")))
2008   (clobber (match_scratch:SI 2 "=&r,&r"))]
2009  "! TARGET_POWER && ! TARGET_ISEL"
2010  "#"
2011  "&& reload_completed"
2012  [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
2013   (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
2014   (set (match_dup 0) (minus:SI (match_dup 0) (match_dup 2)))]
2015  "")
2016
2017(define_insn "*nabs_power"
2018  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2019	(neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r"))))]
2020  "TARGET_POWER"
2021  "nabs %0,%1")
2022
2023(define_insn_and_split "*nabs_nopower"
2024  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
2025        (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0"))))
2026   (clobber (match_scratch:SI 2 "=&r,&r"))]
2027  "! TARGET_POWER"
2028  "#"
2029  "&& reload_completed"
2030  [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
2031   (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
2032   (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 0)))]
2033  "")
2034
2035(define_expand "neg<mode>2"
2036  [(set (match_operand:SDI 0 "gpc_reg_operand" "")
2037	(neg:SDI (match_operand:SDI 1 "gpc_reg_operand" "")))]
2038  ""
2039  "")
2040
2041(define_insn "*neg<mode>2_internal"
2042  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2043	(neg:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))]
2044  ""
2045  "neg %0,%1")
2046
2047(define_insn ""
2048  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
2049	(compare:CC (neg:P (match_operand:P 1 "gpc_reg_operand" "r,r"))
2050		    (const_int 0)))
2051   (clobber (match_scratch:P 2 "=r,r"))]
2052  ""
2053  "@
2054   neg. %2,%1
2055   #"
2056  [(set_attr "type" "fast_compare")
2057   (set_attr "length" "4,8")])
2058
2059(define_split
2060  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2061	(compare:CC (neg:P (match_operand:P 1 "gpc_reg_operand" ""))
2062		    (const_int 0)))
2063   (clobber (match_scratch:P 2 ""))]
2064  "reload_completed"
2065  [(set (match_dup 2)
2066	(neg:P (match_dup 1)))
2067   (set (match_dup 0)
2068	(compare:CC (match_dup 2)
2069		    (const_int 0)))]
2070  "")
2071
2072(define_insn ""
2073  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
2074	(compare:CC (neg:P (match_operand:P 1 "gpc_reg_operand" "r,r"))
2075		    (const_int 0)))
2076   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
2077	(neg:P (match_dup 1)))]
2078  ""
2079  "@
2080   neg. %0,%1
2081   #"
2082  [(set_attr "type" "fast_compare")
2083   (set_attr "length" "4,8")])
2084
2085(define_split
2086  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
2087	(compare:CC (neg:P (match_operand:P 1 "gpc_reg_operand" ""))
2088		    (const_int 0)))
2089   (set (match_operand:P 0 "gpc_reg_operand" "")
2090	(neg:P (match_dup 1)))]
2091  "reload_completed"
2092  [(set (match_dup 0)
2093	(neg:P (match_dup 1)))
2094   (set (match_dup 2)
2095	(compare:CC (match_dup 0)
2096		    (const_int 0)))]
2097  "")
2098
2099(define_insn "clz<mode>2"
2100  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2101	(clz:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))]
2102  ""
2103  "{cntlz|cntlz<wd>} %0,%1")
2104
2105(define_expand "ctz<mode>2"
2106  [(set (match_dup 2)
2107	(neg:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))
2108   (parallel [(set (match_dup 3) (and:GPR (match_dup 1)
2109					  (match_dup 2)))
2110	      (clobber (scratch:CC))])
2111   (set (match_dup 4) (clz:GPR (match_dup 3)))
2112   (set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2113	(minus:GPR (match_dup 5) (match_dup 4)))]
2114  ""
2115  {
2116     operands[2] = gen_reg_rtx (<MODE>mode);
2117     operands[3] = gen_reg_rtx (<MODE>mode);
2118     operands[4] = gen_reg_rtx (<MODE>mode);
2119     operands[5] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - 1);
2120  })
2121
2122(define_expand "ffs<mode>2"
2123  [(set (match_dup 2)
2124	(neg:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))
2125   (parallel [(set (match_dup 3) (and:GPR (match_dup 1)
2126					  (match_dup 2)))
2127	      (clobber (scratch:CC))])
2128   (set (match_dup 4) (clz:GPR (match_dup 3)))
2129   (set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2130	(minus:GPR (match_dup 5) (match_dup 4)))]
2131  ""
2132  {
2133     operands[2] = gen_reg_rtx (<MODE>mode);
2134     operands[3] = gen_reg_rtx (<MODE>mode);
2135     operands[4] = gen_reg_rtx (<MODE>mode);
2136     operands[5] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode));
2137  })
2138
2139(define_expand "popcount<mode>2"
2140  [(set (match_dup 2)
2141	(unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")]
2142		     UNSPEC_POPCNTB))
2143   (set (match_dup 3)
2144	(mult:GPR (match_dup 2) (match_dup 4)))
2145   (set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2146	(lshiftrt:GPR (match_dup 3) (match_dup 5)))]
2147  "TARGET_POPCNTB"
2148  {
2149    operands[2] = gen_reg_rtx (<MODE>mode);
2150    operands[3] = gen_reg_rtx (<MODE>mode);
2151    operands[4] = force_reg (<MODE>mode,
2152			     <MODE>mode == SImode
2153			     ? GEN_INT (0x01010101)
2154			     : GEN_INT ((HOST_WIDE_INT)
2155					0x01010101 << 32 | 0x01010101));
2156    operands[5] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - 8);
2157  })
2158
2159(define_insn "popcntb<mode>2"
2160  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2161        (unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")]
2162                     UNSPEC_POPCNTB))]
2163  "TARGET_POPCNTB"
2164  "popcntb %0,%1")
2165
2166(define_expand "mulsi3"
2167  [(use (match_operand:SI 0 "gpc_reg_operand" ""))
2168   (use (match_operand:SI 1 "gpc_reg_operand" ""))
2169   (use (match_operand:SI 2 "reg_or_short_operand" ""))]
2170  ""
2171  "
2172{
2173  if (TARGET_POWER)
2174    emit_insn (gen_mulsi3_mq (operands[0], operands[1], operands[2]));
2175  else
2176    emit_insn (gen_mulsi3_no_mq (operands[0], operands[1], operands[2]));
2177  DONE;
2178}")
2179
2180(define_insn "mulsi3_mq"
2181  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2182	(mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2183		 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2184   (clobber (match_scratch:SI 3 "=q,q"))]
2185  "TARGET_POWER"
2186  "@
2187   {muls|mullw} %0,%1,%2
2188   {muli|mulli} %0,%1,%2"
2189   [(set (attr "type")
2190      (cond [(match_operand:SI 2 "s8bit_cint_operand" "")
2191		(const_string "imul3")
2192             (match_operand:SI 2 "short_cint_operand" "")
2193		(const_string "imul2")]
2194	(const_string "imul")))])
2195
2196(define_insn "mulsi3_no_mq"
2197  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2198	(mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2199		 (match_operand:SI 2 "reg_or_short_operand" "r,I")))]
2200  "! TARGET_POWER"
2201  "@
2202   {muls|mullw} %0,%1,%2
2203   {muli|mulli} %0,%1,%2"
2204   [(set (attr "type")
2205      (cond [(match_operand:SI 2 "s8bit_cint_operand" "")
2206		(const_string "imul3")
2207             (match_operand:SI 2 "short_cint_operand" "")
2208		(const_string "imul2")]
2209	(const_string "imul")))])
2210
2211(define_insn "*mulsi3_mq_internal1"
2212  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
2213	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2214			     (match_operand:SI 2 "gpc_reg_operand" "r,r"))
2215		    (const_int 0)))
2216   (clobber (match_scratch:SI 3 "=r,r"))
2217   (clobber (match_scratch:SI 4 "=q,q"))]
2218  "TARGET_POWER"
2219  "@
2220   {muls.|mullw.} %3,%1,%2
2221   #"
2222  [(set_attr "type" "imul_compare")
2223   (set_attr "length" "4,8")])
2224
2225(define_split
2226  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2227	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "")
2228			     (match_operand:SI 2 "gpc_reg_operand" ""))
2229		    (const_int 0)))
2230   (clobber (match_scratch:SI 3 ""))
2231   (clobber (match_scratch:SI 4 ""))]
2232  "TARGET_POWER && reload_completed"
2233  [(parallel [(set (match_dup 3)
2234	(mult:SI (match_dup 1) (match_dup 2)))
2235   (clobber (match_dup 4))])
2236   (set (match_dup 0)
2237	(compare:CC (match_dup 3)
2238		    (const_int 0)))]
2239  "")
2240
2241(define_insn "*mulsi3_no_mq_internal1"
2242  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
2243	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2244			     (match_operand:SI 2 "gpc_reg_operand" "r,r"))
2245		    (const_int 0)))
2246   (clobber (match_scratch:SI 3 "=r,r"))]
2247  "! TARGET_POWER"
2248  "@
2249   {muls.|mullw.} %3,%1,%2
2250   #"
2251  [(set_attr "type" "imul_compare")
2252   (set_attr "length" "4,8")])
2253
2254(define_split
2255  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2256	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "")
2257			     (match_operand:SI 2 "gpc_reg_operand" ""))
2258		    (const_int 0)))
2259   (clobber (match_scratch:SI 3 ""))]
2260  "! TARGET_POWER && reload_completed"
2261  [(set (match_dup 3)
2262	(mult:SI (match_dup 1) (match_dup 2)))
2263   (set (match_dup 0)
2264	(compare:CC (match_dup 3)
2265		    (const_int 0)))]
2266  "")
2267
2268(define_insn "*mulsi3_mq_internal2"
2269  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
2270	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2271			     (match_operand:SI 2 "gpc_reg_operand" "r,r"))
2272		    (const_int 0)))
2273   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2274	(mult:SI (match_dup 1) (match_dup 2)))
2275   (clobber (match_scratch:SI 4 "=q,q"))]
2276  "TARGET_POWER"
2277  "@
2278   {muls.|mullw.} %0,%1,%2
2279   #"
2280  [(set_attr "type" "imul_compare")
2281   (set_attr "length" "4,8")])
2282
2283(define_split
2284  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
2285	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "")
2286			     (match_operand:SI 2 "gpc_reg_operand" ""))
2287		    (const_int 0)))
2288   (set (match_operand:SI 0 "gpc_reg_operand" "")
2289	(mult:SI (match_dup 1) (match_dup 2)))
2290   (clobber (match_scratch:SI 4 ""))]
2291  "TARGET_POWER && reload_completed"
2292  [(parallel [(set (match_dup 0)
2293	(mult:SI (match_dup 1) (match_dup 2)))
2294   (clobber (match_dup 4))])
2295   (set (match_dup 3)
2296	(compare:CC (match_dup 0)
2297		    (const_int 0)))]
2298  "")
2299
2300(define_insn "*mulsi3_no_mq_internal2"
2301  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
2302	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
2303			     (match_operand:SI 2 "gpc_reg_operand" "r,r"))
2304		    (const_int 0)))
2305   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2306	(mult:SI (match_dup 1) (match_dup 2)))]
2307  "! TARGET_POWER"
2308  "@
2309   {muls.|mullw.} %0,%1,%2
2310   #"
2311  [(set_attr "type" "imul_compare")
2312   (set_attr "length" "4,8")])
2313
2314(define_split
2315  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
2316	(compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "")
2317			     (match_operand:SI 2 "gpc_reg_operand" ""))
2318		    (const_int 0)))
2319   (set (match_operand:SI 0 "gpc_reg_operand" "")
2320	(mult:SI (match_dup 1) (match_dup 2)))]
2321  "! TARGET_POWER && reload_completed"
2322  [(set (match_dup 0)
2323	(mult:SI (match_dup 1) (match_dup 2)))
2324   (set (match_dup 3)
2325	(compare:CC (match_dup 0)
2326		    (const_int 0)))]
2327  "")
2328
2329;; Operand 1 is divided by operand 2; quotient goes to operand
2330;; 0 and remainder to operand 3.
2331;; ??? At some point, see what, if anything, we can do about if (x % y == 0).
2332
2333(define_expand "divmodsi4"
2334  [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
2335		   (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
2336			   (match_operand:SI 2 "gpc_reg_operand" "")))
2337	      (set (match_operand:SI 3 "register_operand" "")
2338		   (mod:SI (match_dup 1) (match_dup 2)))])]
2339  "TARGET_POWER || (! TARGET_POWER && ! TARGET_POWERPC)"
2340  "
2341{
2342  if (! TARGET_POWER && ! TARGET_POWERPC)
2343    {
2344      emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
2345      emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
2346      emit_insn (gen_divss_call ());
2347      emit_move_insn (operands[0], gen_rtx_REG (SImode, 3));
2348      emit_move_insn (operands[3], gen_rtx_REG (SImode, 4));
2349      DONE;
2350    }
2351}")
2352
2353(define_insn "*divmodsi4_internal"
2354  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2355	(div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2356		(match_operand:SI 2 "gpc_reg_operand" "r")))
2357   (set (match_operand:SI 3 "register_operand" "=q")
2358	(mod:SI (match_dup 1) (match_dup 2)))]
2359  "TARGET_POWER"
2360  "divs %0,%1,%2"
2361  [(set_attr "type" "idiv")])
2362
2363(define_expand "udiv<mode>3"
2364  [(set (match_operand:GPR 0 "gpc_reg_operand" "")
2365        (udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
2366		  (match_operand:GPR 2 "gpc_reg_operand" "")))]
2367  "TARGET_POWERPC || (! TARGET_POWER && ! TARGET_POWERPC)"
2368  "
2369{
2370  if (! TARGET_POWER && ! TARGET_POWERPC)
2371    {
2372      emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
2373      emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
2374      emit_insn (gen_quous_call ());
2375      emit_move_insn (operands[0], gen_rtx_REG (SImode, 3));
2376      DONE;
2377    }
2378  else if (TARGET_POWER)
2379    {
2380      emit_insn (gen_udivsi3_mq (operands[0], operands[1], operands[2]));
2381      DONE;
2382    }
2383}")
2384
2385(define_insn "udivsi3_mq"
2386  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2387        (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2388                 (match_operand:SI 2 "gpc_reg_operand" "r")))
2389   (clobber (match_scratch:SI 3 "=q"))]
2390  "TARGET_POWERPC && TARGET_POWER"
2391  "divwu %0,%1,%2"
2392  [(set_attr "type" "idiv")])
2393
2394(define_insn "*udivsi3_no_mq"
2395  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2396        (udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
2397		  (match_operand:GPR 2 "gpc_reg_operand" "r")))]
2398  "TARGET_POWERPC && ! TARGET_POWER"
2399  "div<wd>u %0,%1,%2"
2400  [(set_attr "type" "idiv")])
2401
2402;; For powers of two we can do srai/aze for divide and then adjust for
2403;; modulus.  If it isn't a power of two, FAIL on POWER so divmodsi4 will be
2404;; used; for PowerPC, force operands into register and do a normal divide;
2405;; for AIX common-mode, use quoss call on register operands.
2406(define_expand "div<mode>3"
2407  [(set (match_operand:GPR 0 "gpc_reg_operand" "")
2408	(div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
2409		 (match_operand:GPR 2 "reg_or_cint_operand" "")))]
2410  ""
2411  "
2412{
2413  if (GET_CODE (operands[2]) == CONST_INT
2414      && INTVAL (operands[2]) > 0
2415      && exact_log2 (INTVAL (operands[2])) >= 0)
2416    ;
2417  else if (TARGET_POWERPC)
2418    {
2419      operands[2] = force_reg (<MODE>mode, operands[2]);
2420      if (TARGET_POWER)
2421	{
2422	  emit_insn (gen_divsi3_mq (operands[0], operands[1], operands[2]));
2423	  DONE;
2424	}
2425    }
2426  else if (TARGET_POWER)
2427    FAIL;
2428  else
2429    {
2430      emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
2431      emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
2432      emit_insn (gen_quoss_call ());
2433      emit_move_insn (operands[0], gen_rtx_REG (SImode, 3));
2434      DONE;
2435    }
2436}")
2437
2438(define_insn "divsi3_mq"
2439  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2440        (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2441                (match_operand:SI 2 "gpc_reg_operand" "r")))
2442   (clobber (match_scratch:SI 3 "=q"))]
2443  "TARGET_POWERPC && TARGET_POWER"
2444  "divw %0,%1,%2"
2445  [(set_attr "type" "idiv")])
2446
2447(define_insn "*div<mode>3_no_mq"
2448  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2449        (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
2450		 (match_operand:GPR 2 "gpc_reg_operand" "r")))]
2451  "TARGET_POWERPC && ! TARGET_POWER"
2452  "div<wd> %0,%1,%2"
2453  [(set_attr "type" "idiv")])
2454
2455(define_expand "mod<mode>3"
2456  [(use (match_operand:GPR 0 "gpc_reg_operand" ""))
2457   (use (match_operand:GPR 1 "gpc_reg_operand" ""))
2458   (use (match_operand:GPR 2 "reg_or_cint_operand" ""))]
2459  ""
2460  "
2461{
2462  int i;
2463  rtx temp1;
2464  rtx temp2;
2465
2466  if (GET_CODE (operands[2]) != CONST_INT
2467      || INTVAL (operands[2]) <= 0
2468      || (i = exact_log2 (INTVAL (operands[2]))) < 0)
2469    FAIL;
2470
2471  temp1 = gen_reg_rtx (<MODE>mode);
2472  temp2 = gen_reg_rtx (<MODE>mode);
2473
2474  emit_insn (gen_div<mode>3 (temp1, operands[1], operands[2]));
2475  emit_insn (gen_ashl<mode>3 (temp2, temp1, GEN_INT (i)));
2476  emit_insn (gen_sub<mode>3 (operands[0], operands[1], temp2));
2477  DONE;
2478}")
2479
2480(define_insn ""
2481  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
2482	(div:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
2483		 (match_operand:GPR 2 "exact_log2_cint_operand" "N")))]
2484  ""
2485  "{srai|sra<wd>i} %0,%1,%p2\;{aze|addze} %0,%0"
2486  [(set_attr "type" "two")
2487   (set_attr "length" "8")])
2488
2489(define_insn ""
2490  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
2491	(compare:CC (div:P (match_operand:P 1 "gpc_reg_operand" "r,r")
2492			   (match_operand:P 2 "exact_log2_cint_operand" "N,N"))
2493		    (const_int 0)))
2494   (clobber (match_scratch:P 3 "=r,r"))]
2495  ""
2496  "@
2497   {srai|sra<wd>i} %3,%1,%p2\;{aze.|addze.} %3,%3
2498   #"
2499  [(set_attr "type" "compare")
2500   (set_attr "length" "8,12")])
2501
2502(define_split
2503  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2504	(compare:CC (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
2505			     (match_operand:GPR 2 "exact_log2_cint_operand"
2506			      ""))
2507		    (const_int 0)))
2508   (clobber (match_scratch:GPR 3 ""))]
2509  "reload_completed"
2510  [(set (match_dup 3)
2511	(div:<MODE> (match_dup 1) (match_dup 2)))
2512   (set (match_dup 0)
2513	(compare:CC (match_dup 3)
2514		    (const_int 0)))]
2515  "")
2516
2517(define_insn ""
2518  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
2519	(compare:CC (div:P (match_operand:P 1 "gpc_reg_operand" "r,r")
2520			   (match_operand:P 2 "exact_log2_cint_operand" "N,N"))
2521		    (const_int 0)))
2522   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
2523	(div:P (match_dup 1) (match_dup 2)))]
2524  ""
2525  "@
2526   {srai|sra<wd>i} %0,%1,%p2\;{aze.|addze.} %0,%0
2527   #"
2528  [(set_attr "type" "compare")
2529   (set_attr "length" "8,12")])
2530
2531(define_split
2532  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
2533	(compare:CC (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
2534			     (match_operand:GPR 2 "exact_log2_cint_operand"
2535			      ""))
2536		    (const_int 0)))
2537   (set (match_operand:GPR 0 "gpc_reg_operand" "")
2538	(div:GPR (match_dup 1) (match_dup 2)))]
2539  "reload_completed"
2540  [(set (match_dup 0)
2541	(div:<MODE> (match_dup 1) (match_dup 2)))
2542   (set (match_dup 3)
2543	(compare:CC (match_dup 0)
2544		    (const_int 0)))]
2545  "")
2546
2547(define_insn ""
2548  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2549	(udiv:SI
2550	 (plus:DI (ashift:DI
2551		   (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
2552		   (const_int 32))
2553		  (zero_extend:DI (match_operand:SI 4 "register_operand" "2")))
2554	 (match_operand:SI 3 "gpc_reg_operand" "r")))
2555   (set (match_operand:SI 2 "register_operand" "=*q")
2556	(umod:SI
2557	 (plus:DI (ashift:DI
2558		   (zero_extend:DI (match_dup 1)) (const_int 32))
2559		  (zero_extend:DI (match_dup 4)))
2560	 (match_dup 3)))]
2561  "TARGET_POWER"
2562  "div %0,%1,%3"
2563  [(set_attr "type" "idiv")])
2564
2565;; To do unsigned divide we handle the cases of the divisor looking like a
2566;; negative number.  If it is a constant that is less than 2**31, we don't
2567;; have to worry about the branches.  So make a few subroutines here.
2568;;
2569;; First comes the normal case.
2570(define_expand "udivmodsi4_normal"
2571  [(set (match_dup 4) (const_int 0))
2572   (parallel [(set (match_operand:SI 0 "" "")
2573		   (udiv:SI (plus:DI (ashift:DI (zero_extend:DI (match_dup 4))
2574						(const_int 32))
2575				     (zero_extend:DI (match_operand:SI 1 "" "")))
2576			    (match_operand:SI 2 "" "")))
2577	      (set (match_operand:SI 3 "" "")
2578		   (umod:SI (plus:DI (ashift:DI (zero_extend:DI (match_dup 4))
2579						(const_int 32))
2580				     (zero_extend:DI (match_dup 1)))
2581			    (match_dup 2)))])]
2582  "TARGET_POWER"
2583  "
2584{ operands[4] = gen_reg_rtx (SImode); }")
2585
2586;; This handles the branches.
2587(define_expand "udivmodsi4_tests"
2588  [(set (match_operand:SI 0 "" "") (const_int 0))
2589   (set (match_operand:SI 3 "" "") (match_operand:SI 1 "" ""))
2590   (set (match_dup 5) (compare:CCUNS (match_dup 1) (match_operand:SI 2 "" "")))
2591   (set (pc) (if_then_else (ltu (match_dup 5) (const_int 0))
2592			   (label_ref (match_operand:SI 4 "" "")) (pc)))
2593   (set (match_dup 0) (const_int 1))
2594   (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2)))
2595   (set (match_dup 6) (compare:CC (match_dup 2) (const_int 0)))
2596   (set (pc) (if_then_else (lt (match_dup 6) (const_int 0))
2597			   (label_ref (match_dup 4)) (pc)))]
2598  "TARGET_POWER"
2599  "
2600{ operands[5] = gen_reg_rtx (CCUNSmode);
2601  operands[6] = gen_reg_rtx (CCmode);
2602}")
2603
2604(define_expand "udivmodsi4"
2605  [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
2606		   (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
2607			    (match_operand:SI 2 "reg_or_cint_operand" "")))
2608	      (set (match_operand:SI 3 "gpc_reg_operand" "")
2609		   (umod:SI (match_dup 1) (match_dup 2)))])]
2610  ""
2611  "
2612{
2613  rtx label = 0;
2614
2615  if (! TARGET_POWER)
2616    {
2617      if (! TARGET_POWERPC)
2618        {
2619	  emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
2620	  emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
2621	  emit_insn (gen_divus_call ());
2622	  emit_move_insn (operands[0], gen_rtx_REG (SImode, 3));
2623	  emit_move_insn (operands[3], gen_rtx_REG (SImode, 4));
2624	  DONE;
2625        }
2626      else
2627        FAIL;
2628    }
2629
2630  if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 0)
2631    {
2632      operands[2] = force_reg (SImode, operands[2]);
2633      label = gen_label_rtx ();
2634      emit (gen_udivmodsi4_tests (operands[0], operands[1], operands[2],
2635				  operands[3], label));
2636    }
2637  else
2638    operands[2] = force_reg (SImode, operands[2]);
2639
2640  emit (gen_udivmodsi4_normal (operands[0], operands[1], operands[2],
2641			       operands[3]));
2642  if (label)
2643    emit_label (label);
2644
2645  DONE;
2646}")
2647
2648;; AIX architecture-independent common-mode multiply (DImode),
2649;; divide/modulus, and quotient subroutine calls.  Input operands in R3 and
2650;; R4; results in R3 and sometimes R4; link register always clobbered by bla
2651;; instruction; R0 sometimes clobbered; also, MQ sometimes clobbered but
2652;; assumed unused if generating common-mode, so ignore.
2653(define_insn "mulh_call"
2654  [(set (reg:SI 3)
2655	(truncate:SI
2656	 (lshiftrt:DI (mult:DI (sign_extend:DI (reg:SI 3))
2657			       (sign_extend:DI (reg:SI 4)))
2658		      (const_int 32))))
2659   (clobber (match_scratch:SI 0 "=l"))]
2660  "! TARGET_POWER && ! TARGET_POWERPC"
2661  "bla __mulh"
2662  [(set_attr "type" "imul")])
2663
2664(define_insn "mull_call"
2665  [(set (reg:DI 3)
2666	(mult:DI (sign_extend:DI (reg:SI 3))
2667		 (sign_extend:DI (reg:SI 4))))
2668   (clobber (match_scratch:SI 0 "=l"))
2669   (clobber (reg:SI 0))]
2670  "! TARGET_POWER && ! TARGET_POWERPC"
2671  "bla __mull"
2672  [(set_attr "type" "imul")])
2673
2674(define_insn "divss_call"
2675  [(set (reg:SI 3)
2676	(div:SI (reg:SI 3) (reg:SI 4)))
2677   (set (reg:SI 4)
2678	(mod:SI (reg:SI 3) (reg:SI 4)))
2679   (clobber (match_scratch:SI 0 "=l"))
2680   (clobber (reg:SI 0))]
2681  "! TARGET_POWER && ! TARGET_POWERPC"
2682  "bla __divss"
2683  [(set_attr "type" "idiv")])
2684
2685(define_insn "divus_call"
2686  [(set (reg:SI 3)
2687	(udiv:SI (reg:SI 3) (reg:SI 4)))
2688   (set (reg:SI 4)
2689	(umod:SI (reg:SI 3) (reg:SI 4)))
2690   (clobber (match_scratch:SI 0 "=l"))
2691   (clobber (reg:SI 0))
2692   (clobber (match_scratch:CC 1 "=x"))
2693   (clobber (reg:CC 69))]
2694  "! TARGET_POWER && ! TARGET_POWERPC"
2695  "bla __divus"
2696  [(set_attr "type" "idiv")])
2697
2698(define_insn "quoss_call"
2699  [(set (reg:SI 3)
2700	(div:SI (reg:SI 3) (reg:SI 4)))
2701   (clobber (match_scratch:SI 0 "=l"))]
2702  "! TARGET_POWER && ! TARGET_POWERPC"
2703  "bla __quoss"
2704  [(set_attr "type" "idiv")])
2705
2706(define_insn "quous_call"
2707  [(set (reg:SI 3)
2708	(udiv:SI (reg:SI 3) (reg:SI 4)))
2709   (clobber (match_scratch:SI 0 "=l"))
2710   (clobber (reg:SI 0))
2711   (clobber (match_scratch:CC 1 "=x"))
2712   (clobber (reg:CC 69))]
2713  "! TARGET_POWER && ! TARGET_POWERPC"
2714  "bla __quous"
2715  [(set_attr "type" "idiv")])
2716
2717;; Logical instructions
2718;; The logical instructions are mostly combined by using match_operator,
2719;; but the plain AND insns are somewhat different because there is no
2720;; plain 'andi' (only 'andi.'), no plain 'andis', and there are all
2721;; those rotate-and-mask operations.  Thus, the AND insns come first.
2722
2723(define_insn "andsi3"
2724  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
2725	(and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r")
2726		(match_operand:SI 2 "and_operand" "?r,T,K,L")))
2727   (clobber (match_scratch:CC 3 "=X,X,x,x"))]
2728  ""
2729  "@
2730   and %0,%1,%2
2731   {rlinm|rlwinm} %0,%1,0,%m2,%M2
2732   {andil.|andi.} %0,%1,%b2
2733   {andiu.|andis.} %0,%1,%u2"
2734  [(set_attr "type" "*,*,compare,compare")])
2735
2736;; Note to set cr's other than cr0 we do the and immediate and then
2737;; the test again -- this avoids a mfcr which on the higher end
2738;; machines causes an execution serialization
2739
2740(define_insn "*andsi3_internal2"
2741  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,?y,??y,??y,?y")
2742	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r")
2743			    (match_operand:SI 2 "and_operand" "r,K,L,T,r,K,L,T"))
2744		    (const_int 0)))
2745   (clobber (match_scratch:SI 3 "=r,r,r,r,r,r,r,r"))
2746   (clobber (match_scratch:CC 4 "=X,X,X,X,X,x,x,X"))]
2747  "TARGET_32BIT"
2748  "@
2749   and. %3,%1,%2
2750   {andil.|andi.} %3,%1,%b2
2751   {andiu.|andis.} %3,%1,%u2
2752   {rlinm.|rlwinm.} %3,%1,0,%m2,%M2
2753   #
2754   #
2755   #
2756   #"
2757  [(set_attr "type" "compare,compare,compare,delayed_compare,compare,compare,compare,compare")
2758   (set_attr "length" "4,4,4,4,8,8,8,8")])
2759
2760(define_insn "*andsi3_internal3"
2761  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,?y,??y,??y,?y")
2762	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r")
2763			    (match_operand:SI 2 "and_operand" "r,K,L,T,r,K,L,T"))
2764		    (const_int 0)))
2765   (clobber (match_scratch:SI 3 "=r,r,r,r,r,r,r,r"))
2766   (clobber (match_scratch:CC 4 "=X,X,X,X,X,x,x,X"))]
2767  "TARGET_64BIT"
2768  "@
2769   #
2770   {andil.|andi.} %3,%1,%b2
2771   {andiu.|andis.} %3,%1,%u2
2772   {rlinm.|rlwinm.} %3,%1,0,%m2,%M2
2773   #
2774   #
2775   #
2776   #"
2777  [(set_attr "type" "compare,compare,compare,delayed_compare,compare,compare,compare,compare")
2778   (set_attr "length" "8,4,4,4,8,8,8,8")])
2779
2780(define_split
2781  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2782	(compare:CC (and:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
2783			     (match_operand:GPR 2 "and_operand" ""))
2784		    (const_int 0)))
2785   (clobber (match_scratch:GPR 3 ""))
2786   (clobber (match_scratch:CC 4 ""))]
2787  "reload_completed"
2788  [(parallel [(set (match_dup 3)
2789		   (and:<MODE> (match_dup 1)
2790			       (match_dup 2)))
2791	      (clobber (match_dup 4))])
2792   (set (match_dup 0)
2793	(compare:CC (match_dup 3)
2794		    (const_int 0)))]
2795  "")
2796
2797;; We don't have a 32 bit "and. rt,ra,rb" for ppc64.  cr is set from the
2798;; whole 64 bit reg, and we don't know what is in the high 32 bits.
2799
2800(define_split
2801  [(set (match_operand:CC 0 "cc_reg_operand" "")
2802	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
2803			    (match_operand:SI 2 "gpc_reg_operand" ""))
2804		    (const_int 0)))
2805   (clobber (match_scratch:SI 3 ""))
2806   (clobber (match_scratch:CC 4 ""))]
2807  "TARGET_POWERPC64 && reload_completed"
2808  [(parallel [(set (match_dup 3)
2809		   (and:SI (match_dup 1)
2810			   (match_dup 2)))
2811	      (clobber (match_dup 4))])
2812   (set (match_dup 0)
2813	(compare:CC (match_dup 3)
2814		    (const_int 0)))]
2815  "")
2816
2817(define_insn "*andsi3_internal4"
2818  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x,?y,??y,??y,?y")
2819	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r")
2820			    (match_operand:SI 2 "and_operand" "r,K,L,T,r,K,L,T"))
2821		    (const_int 0)))
2822   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r")
2823	(and:SI (match_dup 1)
2824		(match_dup 2)))
2825   (clobber (match_scratch:CC 4 "=X,X,X,X,X,x,x,X"))]
2826  "TARGET_32BIT"
2827  "@
2828   and. %0,%1,%2
2829   {andil.|andi.} %0,%1,%b2
2830   {andiu.|andis.} %0,%1,%u2
2831   {rlinm.|rlwinm.} %0,%1,0,%m2,%M2
2832   #
2833   #
2834   #
2835   #"
2836  [(set_attr "type" "compare,compare,compare,delayed_compare,compare,compare,compare,compare")
2837   (set_attr "length" "4,4,4,4,8,8,8,8")])
2838
2839(define_insn "*andsi3_internal5"
2840  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x,?y,??y,??y,?y")
2841	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r")
2842			    (match_operand:SI 2 "and_operand" "r,K,L,T,r,K,L,T"))
2843		    (const_int 0)))
2844   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r")
2845	(and:SI (match_dup 1)
2846		(match_dup 2)))
2847   (clobber (match_scratch:CC 4 "=X,X,X,X,X,x,x,X"))]
2848  "TARGET_64BIT"
2849  "@
2850   #
2851   {andil.|andi.} %0,%1,%b2
2852   {andiu.|andis.} %0,%1,%u2
2853   {rlinm.|rlwinm.} %0,%1,0,%m2,%M2
2854   #
2855   #
2856   #
2857   #"
2858  [(set_attr "type" "compare,compare,compare,delayed_compare,compare,compare,compare,compare")
2859   (set_attr "length" "8,4,4,4,8,8,8,8")])
2860
2861(define_split
2862  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
2863	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
2864			    (match_operand:SI 2 "and_operand" ""))
2865		    (const_int 0)))
2866   (set (match_operand:SI 0 "gpc_reg_operand" "")
2867	(and:SI (match_dup 1)
2868		(match_dup 2)))
2869   (clobber (match_scratch:CC 4 ""))]
2870  "reload_completed"
2871  [(parallel [(set (match_dup 0)
2872		   (and:SI (match_dup 1)
2873			   (match_dup 2)))
2874	      (clobber (match_dup 4))])
2875   (set (match_dup 3)
2876	(compare:CC (match_dup 0)
2877		    (const_int 0)))]
2878  "")
2879
2880(define_split
2881  [(set (match_operand:CC 3 "cc_reg_operand" "")
2882	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
2883			    (match_operand:SI 2 "gpc_reg_operand" ""))
2884		    (const_int 0)))
2885   (set (match_operand:SI 0 "gpc_reg_operand" "")
2886	(and:SI (match_dup 1)
2887		(match_dup 2)))
2888   (clobber (match_scratch:CC 4 ""))]
2889  "TARGET_POWERPC64 && reload_completed"
2890  [(parallel [(set (match_dup 0)
2891		   (and:SI (match_dup 1)
2892			   (match_dup 2)))
2893	      (clobber (match_dup 4))])
2894   (set (match_dup 3)
2895	(compare:CC (match_dup 0)
2896		    (const_int 0)))]
2897  "")
2898
2899;; Handle the PowerPC64 rlwinm corner case
2900
2901(define_insn_and_split "*andsi3_internal6"
2902  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2903	(and:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2904		(match_operand:SI 2 "mask_operand_wrap" "i")))]
2905  "TARGET_POWERPC64"
2906  "#"
2907  "TARGET_POWERPC64"
2908  [(set (match_dup 0)
2909	(and:SI (rotate:SI (match_dup 1) (match_dup 3))
2910		(match_dup 4)))
2911   (set (match_dup 0)
2912	(rotate:SI (match_dup 0) (match_dup 5)))]
2913  "
2914{
2915  int mb = extract_MB (operands[2]);
2916  int me = extract_ME (operands[2]);
2917  operands[3] = GEN_INT (me + 1);
2918  operands[5] = GEN_INT (32 - (me + 1));
2919  operands[4] = GEN_INT (~((HOST_WIDE_INT) -1 << (33 + me - mb)));
2920}"
2921  [(set_attr "length" "8")])
2922
2923(define_expand "iorsi3"
2924  [(set (match_operand:SI 0 "gpc_reg_operand" "")
2925	(ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
2926		(match_operand:SI 2 "reg_or_logical_cint_operand" "")))]
2927  ""
2928  "
2929{
2930  if (GET_CODE (operands[2]) == CONST_INT
2931      && ! logical_operand (operands[2], SImode))
2932    {
2933      HOST_WIDE_INT value = INTVAL (operands[2]);
2934      rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1]))
2935		 ? operands[0] : gen_reg_rtx (SImode));
2936
2937      emit_insn (gen_iorsi3 (tmp, operands[1],
2938			     GEN_INT (value & (~ (HOST_WIDE_INT) 0xffff))));
2939      emit_insn (gen_iorsi3 (operands[0], tmp, GEN_INT (value & 0xffff)));
2940      DONE;
2941    }
2942}")
2943
2944(define_expand "xorsi3"
2945  [(set (match_operand:SI 0 "gpc_reg_operand" "")
2946	(xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
2947		(match_operand:SI 2 "reg_or_logical_cint_operand" "")))]
2948  ""
2949  "
2950{
2951  if (GET_CODE (operands[2]) == CONST_INT
2952      && ! logical_operand (operands[2], SImode))
2953    {
2954      HOST_WIDE_INT value = INTVAL (operands[2]);
2955      rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1]))
2956		 ? operands[0] : gen_reg_rtx (SImode));
2957
2958      emit_insn (gen_xorsi3 (tmp, operands[1],
2959			     GEN_INT (value & (~ (HOST_WIDE_INT) 0xffff))));
2960      emit_insn (gen_xorsi3 (operands[0], tmp, GEN_INT (value & 0xffff)));
2961      DONE;
2962    }
2963}")
2964
2965(define_insn "*boolsi3_internal1"
2966  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
2967	(match_operator:SI 3 "boolean_or_operator"
2968	 [(match_operand:SI 1 "gpc_reg_operand" "%r,r,r")
2969	  (match_operand:SI 2 "logical_operand" "r,K,L")]))]
2970  ""
2971  "@
2972   %q3 %0,%1,%2
2973   {%q3il|%q3i} %0,%1,%b2
2974   {%q3iu|%q3is} %0,%1,%u2")
2975
2976(define_insn "*boolsi3_internal2"
2977  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
2978	(compare:CC (match_operator:SI 4 "boolean_or_operator"
2979	 [(match_operand:SI 1 "gpc_reg_operand" "%r,r")
2980	  (match_operand:SI 2 "gpc_reg_operand" "r,r")])
2981	 (const_int 0)))
2982   (clobber (match_scratch:SI 3 "=r,r"))]
2983  "TARGET_32BIT"
2984  "@
2985   %q4. %3,%1,%2
2986   #"
2987  [(set_attr "type" "compare")
2988   (set_attr "length" "4,8")])
2989
2990(define_split
2991  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
2992	(compare:CC (match_operator:SI 4 "boolean_operator"
2993	 [(match_operand:SI 1 "gpc_reg_operand" "")
2994	  (match_operand:SI 2 "gpc_reg_operand" "")])
2995	 (const_int 0)))
2996   (clobber (match_scratch:SI 3 ""))]
2997  "TARGET_32BIT && reload_completed"
2998  [(set (match_dup 3) (match_dup 4))
2999   (set (match_dup 0)
3000	(compare:CC (match_dup 3)
3001		    (const_int 0)))]
3002  "")
3003
3004(define_insn "*boolsi3_internal3"
3005  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
3006	(compare:CC (match_operator:SI 4 "boolean_operator"
3007	 [(match_operand:SI 1 "gpc_reg_operand" "%r,r")
3008	  (match_operand:SI 2 "gpc_reg_operand" "r,r")])
3009	 (const_int 0)))
3010   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3011	(match_dup 4))]
3012  "TARGET_32BIT"
3013  "@
3014   %q4. %0,%1,%2
3015   #"
3016  [(set_attr "type" "compare")
3017   (set_attr "length" "4,8")])
3018
3019(define_split
3020  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
3021	(compare:CC (match_operator:SI 4 "boolean_operator"
3022	 [(match_operand:SI 1 "gpc_reg_operand" "")
3023	  (match_operand:SI 2 "gpc_reg_operand" "")])
3024	 (const_int 0)))
3025   (set (match_operand:SI 0 "gpc_reg_operand" "")
3026	(match_dup 4))]
3027  "TARGET_32BIT && reload_completed"
3028  [(set (match_dup 0) (match_dup 4))
3029   (set (match_dup 3)
3030	(compare:CC (match_dup 0)
3031		    (const_int 0)))]
3032  "")
3033
3034;; Split a logical operation that we can't do in one insn into two insns,
3035;; each of which does one 16-bit part.  This is used by combine.
3036
3037(define_split
3038  [(set (match_operand:SI 0 "gpc_reg_operand" "")
3039	(match_operator:SI 3 "boolean_or_operator"
3040	 [(match_operand:SI 1 "gpc_reg_operand" "")
3041	  (match_operand:SI 2 "non_logical_cint_operand" "")]))]
3042  ""
3043  [(set (match_dup 0) (match_dup 4))
3044   (set (match_dup 0) (match_dup 5))]
3045"
3046{
3047  rtx i;
3048  i = GEN_INT (INTVAL (operands[2]) & (~ (HOST_WIDE_INT) 0xffff));
3049  operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[3]), SImode,
3050				operands[1], i);
3051  i = GEN_INT (INTVAL (operands[2]) & 0xffff);
3052  operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[3]), SImode,
3053				operands[0], i);
3054}")
3055
3056(define_insn "*boolcsi3_internal1"
3057  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3058	(match_operator:SI 3 "boolean_operator"
3059	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
3060	  (match_operand:SI 2 "gpc_reg_operand" "r")]))]
3061  ""
3062  "%q3 %0,%2,%1")
3063
3064(define_insn "*boolcsi3_internal2"
3065  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3066	(compare:CC (match_operator:SI 4 "boolean_operator"
3067	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
3068	  (match_operand:SI 2 "gpc_reg_operand" "r,r")])
3069	 (const_int 0)))
3070   (clobber (match_scratch:SI 3 "=r,r"))]
3071  "TARGET_32BIT"
3072  "@
3073   %q4. %3,%2,%1
3074   #"
3075  [(set_attr "type" "compare")
3076   (set_attr "length" "4,8")])
3077
3078(define_split
3079  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3080	(compare:CC (match_operator:SI 4 "boolean_operator"
3081	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
3082	  (match_operand:SI 2 "gpc_reg_operand" "")])
3083	 (const_int 0)))
3084   (clobber (match_scratch:SI 3 ""))]
3085  "TARGET_32BIT && reload_completed"
3086  [(set (match_dup 3) (match_dup 4))
3087   (set (match_dup 0)
3088	(compare:CC (match_dup 3)
3089		    (const_int 0)))]
3090  "")
3091
3092(define_insn "*boolcsi3_internal3"
3093  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
3094	(compare:CC (match_operator:SI 4 "boolean_operator"
3095	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r"))
3096	  (match_operand:SI 2 "gpc_reg_operand" "r,r")])
3097	 (const_int 0)))
3098   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3099	(match_dup 4))]
3100  "TARGET_32BIT"
3101  "@
3102   %q4. %0,%2,%1
3103   #"
3104  [(set_attr "type" "compare")
3105   (set_attr "length" "4,8")])
3106
3107(define_split
3108  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
3109	(compare:CC (match_operator:SI 4 "boolean_operator"
3110	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
3111	  (match_operand:SI 2 "gpc_reg_operand" "")])
3112	 (const_int 0)))
3113   (set (match_operand:SI 0 "gpc_reg_operand" "")
3114	(match_dup 4))]
3115  "TARGET_32BIT && reload_completed"
3116  [(set (match_dup 0) (match_dup 4))
3117   (set (match_dup 3)
3118	(compare:CC (match_dup 0)
3119		    (const_int 0)))]
3120  "")
3121
3122(define_insn "*boolccsi3_internal1"
3123  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3124	(match_operator:SI 3 "boolean_operator"
3125	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
3126	  (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))]))]
3127  ""
3128  "%q3 %0,%1,%2")
3129
3130(define_insn "*boolccsi3_internal2"
3131  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3132	(compare:CC (match_operator:SI 4 "boolean_operator"
3133	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
3134	  (not:SI (match_operand:SI 2 "gpc_reg_operand" "r,r"))])
3135	 (const_int 0)))
3136   (clobber (match_scratch:SI 3 "=r,r"))]
3137  "TARGET_32BIT"
3138  "@
3139   %q4. %3,%1,%2
3140   #"
3141  [(set_attr "type" "compare")
3142   (set_attr "length" "4,8")])
3143
3144(define_split
3145  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3146	(compare:CC (match_operator:SI 4 "boolean_operator"
3147	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
3148	  (not:SI (match_operand:SI 2 "gpc_reg_operand" ""))])
3149	 (const_int 0)))
3150   (clobber (match_scratch:SI 3 ""))]
3151  "TARGET_32BIT && reload_completed"
3152  [(set (match_dup 3) (match_dup 4))
3153   (set (match_dup 0)
3154	(compare:CC (match_dup 3)
3155		    (const_int 0)))]
3156  "")
3157
3158(define_insn "*boolccsi3_internal3"
3159  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
3160	(compare:CC (match_operator:SI 4 "boolean_operator"
3161	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r"))
3162	  (not:SI (match_operand:SI 2 "gpc_reg_operand" "r,r"))])
3163	 (const_int 0)))
3164   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3165	(match_dup 4))]
3166  "TARGET_32BIT"
3167  "@
3168   %q4. %0,%1,%2
3169   #"
3170  [(set_attr "type" "compare")
3171   (set_attr "length" "4,8")])
3172
3173(define_split
3174  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
3175	(compare:CC (match_operator:SI 4 "boolean_operator"
3176	 [(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
3177	  (not:SI (match_operand:SI 2 "gpc_reg_operand" ""))])
3178	 (const_int 0)))
3179   (set (match_operand:SI 0 "gpc_reg_operand" "")
3180	(match_dup 4))]
3181  "TARGET_32BIT && reload_completed"
3182  [(set (match_dup 0) (match_dup 4))
3183   (set (match_dup 3)
3184	(compare:CC (match_dup 0)
3185		    (const_int 0)))]
3186  "")
3187
3188;; maskir insn.  We need four forms because things might be in arbitrary
3189;; orders.  Don't define forms that only set CR fields because these
3190;; would modify an input register.
3191
3192(define_insn "*maskir_internal1"
3193  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3194	(ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
3195			(match_operand:SI 1 "gpc_reg_operand" "0"))
3196		(and:SI (match_dup 2)
3197			(match_operand:SI 3 "gpc_reg_operand" "r"))))]
3198  "TARGET_POWER"
3199  "maskir %0,%3,%2")
3200
3201(define_insn "*maskir_internal2"
3202  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3203	(ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
3204			(match_operand:SI 1 "gpc_reg_operand" "0"))
3205		(and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3206			(match_dup 2))))]
3207  "TARGET_POWER"
3208  "maskir %0,%3,%2")
3209
3210(define_insn "*maskir_internal3"
3211  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3212	(ior:SI (and:SI (match_operand:SI 2 "gpc_reg_operand" "r")
3213			(match_operand:SI 3 "gpc_reg_operand" "r"))
3214		(and:SI (not:SI (match_dup 2))
3215			(match_operand:SI 1 "gpc_reg_operand" "0"))))]
3216  "TARGET_POWER"
3217  "maskir %0,%3,%2")
3218
3219(define_insn "*maskir_internal4"
3220  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3221	(ior:SI (and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3222			(match_operand:SI 2 "gpc_reg_operand" "r"))
3223		(and:SI (not:SI (match_dup 2))
3224			(match_operand:SI 1 "gpc_reg_operand" "0"))))]
3225  "TARGET_POWER"
3226  "maskir %0,%3,%2")
3227
3228(define_insn "*maskir_internal5"
3229  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3230	(compare:CC
3231	 (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r,r"))
3232			 (match_operand:SI 1 "gpc_reg_operand" "0,0"))
3233		 (and:SI (match_dup 2)
3234			 (match_operand:SI 3 "gpc_reg_operand" "r,r")))
3235	 (const_int 0)))
3236   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3237	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3238		(and:SI (match_dup 2) (match_dup 3))))]
3239  "TARGET_POWER"
3240  "@
3241   maskir. %0,%3,%2
3242   #"
3243  [(set_attr "type" "compare")
3244   (set_attr "length" "4,8")])
3245
3246(define_split
3247  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3248	(compare:CC
3249	 (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" ""))
3250			 (match_operand:SI 1 "gpc_reg_operand" ""))
3251		 (and:SI (match_dup 2)
3252			 (match_operand:SI 3 "gpc_reg_operand" "")))
3253	 (const_int 0)))
3254   (set (match_operand:SI 0 "gpc_reg_operand" "")
3255	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3256		(and:SI (match_dup 2) (match_dup 3))))]
3257  "TARGET_POWER && reload_completed"
3258  [(set (match_dup 0)
3259	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3260		(and:SI (match_dup 2) (match_dup 3))))
3261   (set (match_dup 4)
3262	(compare:CC (match_dup 0)
3263		    (const_int 0)))]
3264  "")
3265
3266(define_insn "*maskir_internal6"
3267  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3268	(compare:CC
3269	 (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r,r"))
3270			 (match_operand:SI 1 "gpc_reg_operand" "0,0"))
3271		 (and:SI (match_operand:SI 3 "gpc_reg_operand" "r,r")
3272			 (match_dup 2)))
3273	 (const_int 0)))
3274   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3275	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3276		(and:SI (match_dup 3) (match_dup 2))))]
3277  "TARGET_POWER"
3278  "@
3279   maskir. %0,%3,%2
3280   #"
3281  [(set_attr "type" "compare")
3282   (set_attr "length" "4,8")])
3283
3284(define_split
3285  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3286	(compare:CC
3287	 (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" ""))
3288			 (match_operand:SI 1 "gpc_reg_operand" ""))
3289		 (and:SI (match_operand:SI 3 "gpc_reg_operand" "")
3290			 (match_dup 2)))
3291	 (const_int 0)))
3292   (set (match_operand:SI 0 "gpc_reg_operand" "")
3293	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3294		(and:SI (match_dup 3) (match_dup 2))))]
3295  "TARGET_POWER && reload_completed"
3296  [(set (match_dup 0)
3297	(ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
3298		(and:SI (match_dup 3) (match_dup 2))))
3299   (set (match_dup 4)
3300	(compare:CC (match_dup 0)
3301		    (const_int 0)))]
3302  "")
3303
3304(define_insn "*maskir_internal7"
3305  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3306	(compare:CC
3307	 (ior:SI (and:SI (match_operand:SI 2 "gpc_reg_operand" "r,r")
3308			 (match_operand:SI 3 "gpc_reg_operand" "r,r"))
3309		 (and:SI (not:SI (match_dup 2))
3310			 (match_operand:SI 1 "gpc_reg_operand" "0,0")))
3311	 (const_int 0)))
3312   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3313	(ior:SI (and:SI (match_dup 2) (match_dup 3))
3314		(and:SI (not:SI (match_dup 2)) (match_dup 1))))]
3315  "TARGET_POWER"
3316  "@
3317   maskir. %0,%3,%2
3318   #"
3319  [(set_attr "type" "compare")
3320   (set_attr "length" "4,8")])
3321
3322(define_split
3323  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3324	(compare:CC
3325	 (ior:SI (and:SI (match_operand:SI 2 "gpc_reg_operand" "")
3326			 (match_operand:SI 3 "gpc_reg_operand" ""))
3327		 (and:SI (not:SI (match_dup 2))
3328			 (match_operand:SI 1 "gpc_reg_operand" "")))
3329	 (const_int 0)))
3330   (set (match_operand:SI 0 "gpc_reg_operand" "")
3331	(ior:SI (and:SI (match_dup 2) (match_dup 3))
3332		(and:SI (not:SI (match_dup 2)) (match_dup 1))))]
3333  "TARGET_POWER && reload_completed"
3334  [(set (match_dup 0)
3335	(ior:SI (and:SI (match_dup 2) (match_dup 3))
3336		(and:SI (not:SI (match_dup 2)) (match_dup 1))))
3337   (set (match_dup 4)
3338	(compare:CC (match_dup 0)
3339		    (const_int 0)))]
3340  "")
3341
3342(define_insn "*maskir_internal8"
3343  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3344	(compare:CC
3345	 (ior:SI (and:SI (match_operand:SI 3 "gpc_reg_operand" "r,r")
3346			 (match_operand:SI 2 "gpc_reg_operand" "r,r"))
3347		 (and:SI (not:SI (match_dup 2))
3348			 (match_operand:SI 1 "gpc_reg_operand" "0,0")))
3349	 (const_int 0)))
3350   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3351	(ior:SI (and:SI (match_dup 3) (match_dup 2))
3352		(and:SI (not:SI (match_dup 2)) (match_dup 1))))]
3353  "TARGET_POWER"
3354  "@
3355   maskir. %0,%3,%2
3356   #"
3357  [(set_attr "type" "compare")
3358   (set_attr "length" "4,8")])
3359
3360(define_split
3361  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3362	(compare:CC
3363	 (ior:SI (and:SI (match_operand:SI 3 "gpc_reg_operand" "")
3364			 (match_operand:SI 2 "gpc_reg_operand" ""))
3365		 (and:SI (not:SI (match_dup 2))
3366			 (match_operand:SI 1 "gpc_reg_operand" "")))
3367	 (const_int 0)))
3368   (set (match_operand:SI 0 "gpc_reg_operand" "")
3369	(ior:SI (and:SI (match_dup 3) (match_dup 2))
3370		(and:SI (not:SI (match_dup 2)) (match_dup 1))))]
3371  "TARGET_POWER && reload_completed"
3372  [(set (match_dup 0)
3373	(ior:SI (and:SI (match_dup 3) (match_dup 2))
3374		(and:SI (not:SI (match_dup 2)) (match_dup 1))))
3375   (set (match_dup 4)
3376	(compare:CC (match_dup 0)
3377		    (const_int 0)))]
3378  "")
3379
3380;; Rotate and shift insns, in all their variants.  These support shifts,
3381;; field inserts and extracts, and various combinations thereof.
3382(define_expand "insv"
3383  [(set (zero_extract (match_operand 0 "gpc_reg_operand" "")
3384		       (match_operand:SI 1 "const_int_operand" "")
3385		       (match_operand:SI 2 "const_int_operand" ""))
3386	(match_operand 3 "gpc_reg_operand" ""))]
3387  ""
3388  "
3389{
3390  /* Do not handle 16/8 bit structures that fit in HI/QI modes directly, since
3391     the (SUBREG:SI (REG:HI xxx)) that is otherwise generated can confuse the
3392     compiler if the address of the structure is taken later.  Likewise, do
3393     not handle invalid E500 subregs.  */
3394  if (GET_CODE (operands[0]) == SUBREG
3395      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[0]))) < UNITS_PER_WORD
3396	  || ((TARGET_E500_DOUBLE || TARGET_SPE)
3397	      && invalid_e500_subreg (operands[0], GET_MODE (operands[0])))))
3398    FAIL;
3399
3400  if (TARGET_POWERPC64 && GET_MODE (operands[0]) == DImode)
3401    emit_insn (gen_insvdi (operands[0], operands[1], operands[2], operands[3]));
3402  else
3403    emit_insn (gen_insvsi (operands[0], operands[1], operands[2], operands[3]));
3404  DONE;
3405}")
3406
3407(define_insn "insvsi"
3408  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
3409			 (match_operand:SI 1 "const_int_operand" "i")
3410			 (match_operand:SI 2 "const_int_operand" "i"))
3411	(match_operand:SI 3 "gpc_reg_operand" "r"))]
3412  ""
3413  "*
3414{
3415  int start = INTVAL (operands[2]) & 31;
3416  int size = INTVAL (operands[1]) & 31;
3417
3418  operands[4] = GEN_INT (32 - start - size);
3419  operands[1] = GEN_INT (start + size - 1);
3420  return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3421}"
3422  [(set_attr "type" "insert_word")])
3423
3424(define_insn "*insvsi_internal1"
3425  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
3426			 (match_operand:SI 1 "const_int_operand" "i")
3427			 (match_operand:SI 2 "const_int_operand" "i"))
3428	(rotate:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3429		   (match_operand:SI 4 "const_int_operand" "i")))]
3430  "(32 - (INTVAL (operands[4]) & 31)) >= INTVAL (operands[1])"
3431  "*
3432{
3433  int shift = INTVAL (operands[4]) & 31;
3434  int start = INTVAL (operands[2]) & 31;
3435  int size = INTVAL (operands[1]) & 31;
3436
3437  operands[4] = GEN_INT (shift - start - size);
3438  operands[1] = GEN_INT (start + size - 1);
3439  return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3440}"
3441  [(set_attr "type" "insert_word")])
3442
3443(define_insn "*insvsi_internal2"
3444  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
3445			 (match_operand:SI 1 "const_int_operand" "i")
3446			 (match_operand:SI 2 "const_int_operand" "i"))
3447	(ashiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3448		     (match_operand:SI 4 "const_int_operand" "i")))]
3449  "(32 - (INTVAL (operands[4]) & 31)) >= INTVAL (operands[1])"
3450  "*
3451{
3452  int shift = INTVAL (operands[4]) & 31;
3453  int start = INTVAL (operands[2]) & 31;
3454  int size = INTVAL (operands[1]) & 31;
3455
3456  operands[4] = GEN_INT (32 - shift - start - size);
3457  operands[1] = GEN_INT (start + size - 1);
3458  return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3459}"
3460  [(set_attr "type" "insert_word")])
3461
3462(define_insn "*insvsi_internal3"
3463  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
3464			 (match_operand:SI 1 "const_int_operand" "i")
3465			 (match_operand:SI 2 "const_int_operand" "i"))
3466	(lshiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3467		     (match_operand:SI 4 "const_int_operand" "i")))]
3468  "(32 - (INTVAL (operands[4]) & 31)) >= INTVAL (operands[1])"
3469  "*
3470{
3471  int shift = INTVAL (operands[4]) & 31;
3472  int start = INTVAL (operands[2]) & 31;
3473  int size = INTVAL (operands[1]) & 31;
3474
3475  operands[4] = GEN_INT (32 - shift - start - size);
3476  operands[1] = GEN_INT (start + size - 1);
3477  return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3478}"
3479  [(set_attr "type" "insert_word")])
3480
3481(define_insn "*insvsi_internal4"
3482  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
3483			 (match_operand:SI 1 "const_int_operand" "i")
3484			 (match_operand:SI 2 "const_int_operand" "i"))
3485	(zero_extract:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3486			 (match_operand:SI 4 "const_int_operand" "i")
3487			 (match_operand:SI 5 "const_int_operand" "i")))]
3488  "INTVAL (operands[4]) >= INTVAL (operands[1])"
3489  "*
3490{
3491  int extract_start = INTVAL (operands[5]) & 31;
3492  int extract_size = INTVAL (operands[4]) & 31;
3493  int insert_start = INTVAL (operands[2]) & 31;
3494  int insert_size = INTVAL (operands[1]) & 31;
3495
3496/* Align extract field with insert field */
3497  operands[5] = GEN_INT (extract_start + extract_size - insert_start - insert_size);
3498  operands[1] = GEN_INT (insert_start + insert_size - 1);
3499  return \"{rlimi|rlwimi} %0,%3,%h5,%h2,%h1\";
3500}"
3501  [(set_attr "type" "insert_word")])
3502
3503;; combine patterns for rlwimi
3504(define_insn "*insvsi_internal5"
3505  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3506        (ior:SI (and:SI (match_operand:SI 4 "gpc_reg_operand" "0")
3507                        (match_operand:SI 1 "mask_operand" "i"))
3508                (and:SI (lshiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3509                                     (match_operand:SI 2 "const_int_operand" "i"))
3510                        (match_operand:SI 5 "mask_operand" "i"))))]
3511  "TARGET_POWERPC && INTVAL(operands[1]) == ~INTVAL(operands[5])"
3512  "*
3513{
3514 int me = extract_ME(operands[5]);
3515 int mb = extract_MB(operands[5]);
3516 operands[4] = GEN_INT(32 - INTVAL(operands[2]));
3517 operands[2] = GEN_INT(mb);
3518 operands[1] = GEN_INT(me);
3519 return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3520}"
3521  [(set_attr "type" "insert_word")])
3522
3523(define_insn "*insvsi_internal6"
3524  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3525        (ior:SI (and:SI (lshiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
3526                                     (match_operand:SI 2 "const_int_operand" "i"))
3527                        (match_operand:SI 5 "mask_operand" "i"))
3528                (and:SI (match_operand:SI 4 "gpc_reg_operand" "0")
3529                        (match_operand:SI 1 "mask_operand" "i"))))]
3530  "TARGET_POWERPC && INTVAL(operands[1]) == ~INTVAL(operands[5])"
3531  "*
3532{
3533 int me = extract_ME(operands[5]);
3534 int mb = extract_MB(operands[5]);
3535 operands[4] = GEN_INT(32 - INTVAL(operands[2]));
3536 operands[2] = GEN_INT(mb);
3537 operands[1] = GEN_INT(me);
3538 return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
3539}"
3540  [(set_attr "type" "insert_word")])
3541
3542(define_insn "insvdi"
3543  [(set (zero_extract:DI (match_operand:DI 0 "gpc_reg_operand" "+r")
3544			 (match_operand:SI 1 "const_int_operand" "i")
3545			 (match_operand:SI 2 "const_int_operand" "i"))
3546	(match_operand:DI 3 "gpc_reg_operand" "r"))]
3547  "TARGET_POWERPC64"
3548  "*
3549{
3550  int start = INTVAL (operands[2]) & 63;
3551  int size = INTVAL (operands[1]) & 63;
3552
3553  operands[1] = GEN_INT (64 - start - size);
3554  return \"rldimi %0,%3,%H1,%H2\";
3555}")
3556
3557(define_insn "*insvdi_internal2"
3558  [(set (zero_extract:DI (match_operand:DI 0 "gpc_reg_operand" "+r")
3559			 (match_operand:SI 1 "const_int_operand" "i")
3560			 (match_operand:SI 2 "const_int_operand" "i"))
3561	(ashiftrt:DI (match_operand:DI 3 "gpc_reg_operand" "r")
3562		     (match_operand:SI 4 "const_int_operand" "i")))]
3563  "TARGET_POWERPC64
3564   && insvdi_rshift_rlwimi_p (operands[1], operands[2], operands[4])"
3565  "*
3566{
3567  int shift = INTVAL (operands[4]) & 63;
3568  int start = (INTVAL (operands[2]) & 63) - 32;
3569  int size = INTVAL (operands[1]) & 63;
3570
3571  operands[4] = GEN_INT (64 - shift - start - size);
3572  operands[2] = GEN_INT (start);
3573  operands[1] = GEN_INT (start + size - 1);
3574  return \"rlwimi %0,%3,%h4,%h2,%h1\";
3575}")
3576
3577(define_insn "*insvdi_internal3"
3578  [(set (zero_extract:DI (match_operand:DI 0 "gpc_reg_operand" "+r")
3579			 (match_operand:SI 1 "const_int_operand" "i")
3580			 (match_operand:SI 2 "const_int_operand" "i"))
3581	(lshiftrt:DI (match_operand:DI 3 "gpc_reg_operand" "r")
3582		     (match_operand:SI 4 "const_int_operand" "i")))]
3583  "TARGET_POWERPC64
3584   && insvdi_rshift_rlwimi_p (operands[1], operands[2], operands[4])"
3585  "*
3586{
3587  int shift = INTVAL (operands[4]) & 63;
3588  int start = (INTVAL (operands[2]) & 63) - 32;
3589  int size = INTVAL (operands[1]) & 63;
3590
3591  operands[4] = GEN_INT (64 - shift - start - size);
3592  operands[2] = GEN_INT (start);
3593  operands[1] = GEN_INT (start + size - 1);
3594  return \"rlwimi %0,%3,%h4,%h2,%h1\";
3595}")
3596
3597(define_expand "extzv"
3598  [(set (match_operand 0 "gpc_reg_operand" "")
3599	(zero_extract (match_operand 1 "gpc_reg_operand" "")
3600		       (match_operand:SI 2 "const_int_operand" "")
3601		       (match_operand:SI 3 "const_int_operand" "")))]
3602  ""
3603  "
3604{
3605  /* Do not handle 16/8 bit structures that fit in HI/QI modes directly, since
3606     the (SUBREG:SI (REG:HI xxx)) that is otherwise generated can confuse the
3607     compiler if the address of the structure is taken later.  */
3608  if (GET_CODE (operands[0]) == SUBREG
3609      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[0]))) < UNITS_PER_WORD))
3610    FAIL;
3611
3612  if (TARGET_POWERPC64 && GET_MODE (operands[1]) == DImode)
3613    emit_insn (gen_extzvdi (operands[0], operands[1], operands[2], operands[3]));
3614  else
3615    emit_insn (gen_extzvsi (operands[0], operands[1], operands[2], operands[3]));
3616  DONE;
3617}")
3618
3619(define_insn "extzvsi"
3620  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3621	(zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
3622			 (match_operand:SI 2 "const_int_operand" "i")
3623			 (match_operand:SI 3 "const_int_operand" "i")))]
3624  ""
3625  "*
3626{
3627  int start = INTVAL (operands[3]) & 31;
3628  int size = INTVAL (operands[2]) & 31;
3629
3630  if (start + size >= 32)
3631    operands[3] = const0_rtx;
3632  else
3633    operands[3] = GEN_INT (start + size);
3634  return \"{rlinm|rlwinm} %0,%1,%3,%s2,31\";
3635}")
3636
3637(define_insn "*extzvsi_internal1"
3638  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3639	(compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3640			 (match_operand:SI 2 "const_int_operand" "i,i")
3641			 (match_operand:SI 3 "const_int_operand" "i,i"))
3642		    (const_int 0)))
3643   (clobber (match_scratch:SI 4 "=r,r"))]
3644  ""
3645  "*
3646{
3647  int start = INTVAL (operands[3]) & 31;
3648  int size = INTVAL (operands[2]) & 31;
3649
3650  /* Force split for non-cc0 compare.  */
3651  if (which_alternative == 1)
3652     return \"#\";
3653
3654  /* If the bit-field being tested fits in the upper or lower half of a
3655     word, it is possible to use andiu. or andil. to test it.  This is
3656     useful because the condition register set-use delay is smaller for
3657     andi[ul]. than for rlinm.  This doesn't work when the starting bit
3658     position is 0 because the LT and GT bits may be set wrong.  */
3659
3660  if ((start > 0 && start + size <= 16) || start >= 16)
3661    {
3662      operands[3] = GEN_INT (((1 << (16 - (start & 15)))
3663			      - (1 << (16 - (start & 15) - size))));
3664      if (start < 16)
3665	return \"{andiu.|andis.} %4,%1,%3\";
3666      else
3667	return \"{andil.|andi.} %4,%1,%3\";
3668    }
3669
3670  if (start + size >= 32)
3671    operands[3] = const0_rtx;
3672  else
3673    operands[3] = GEN_INT (start + size);
3674  return \"{rlinm.|rlwinm.} %4,%1,%3,%s2,31\";
3675}"
3676  [(set_attr "type" "compare")
3677   (set_attr "length" "4,8")])
3678
3679(define_split
3680  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3681	(compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "")
3682			 (match_operand:SI 2 "const_int_operand" "")
3683			 (match_operand:SI 3 "const_int_operand" ""))
3684		    (const_int 0)))
3685   (clobber (match_scratch:SI 4 ""))]
3686  "reload_completed"
3687  [(set (match_dup 4)
3688	(zero_extract:SI (match_dup 1) (match_dup 2)
3689			 (match_dup 3)))
3690   (set (match_dup 0)
3691	(compare:CC (match_dup 4)
3692		    (const_int 0)))]
3693  "")
3694
3695(define_insn "*extzvsi_internal2"
3696  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3697	(compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3698			 (match_operand:SI 2 "const_int_operand" "i,i")
3699			 (match_operand:SI 3 "const_int_operand" "i,i"))
3700		    (const_int 0)))
3701   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3702	(zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))]
3703  ""
3704  "*
3705{
3706  int start = INTVAL (operands[3]) & 31;
3707  int size = INTVAL (operands[2]) & 31;
3708
3709  /* Force split for non-cc0 compare.  */
3710  if (which_alternative == 1)
3711     return \"#\";
3712
3713  /* Since we are using the output value, we can't ignore any need for
3714     a shift.  The bit-field must end at the LSB.  */
3715  if (start >= 16 && start + size == 32)
3716    {
3717      operands[3] = GEN_INT ((1 << size) - 1);
3718      return \"{andil.|andi.} %0,%1,%3\";
3719    }
3720
3721  if (start + size >= 32)
3722    operands[3] = const0_rtx;
3723  else
3724    operands[3] = GEN_INT (start + size);
3725  return \"{rlinm.|rlwinm.} %0,%1,%3,%s2,31\";
3726}"
3727  [(set_attr "type" "compare")
3728   (set_attr "length" "4,8")])
3729
3730(define_split
3731  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3732	(compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "")
3733			 (match_operand:SI 2 "const_int_operand" "")
3734			 (match_operand:SI 3 "const_int_operand" ""))
3735		    (const_int 0)))
3736   (set (match_operand:SI 0 "gpc_reg_operand" "")
3737	(zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))]
3738  "reload_completed"
3739  [(set (match_dup 0)
3740	(zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))
3741   (set (match_dup 4)
3742	(compare:CC (match_dup 0)
3743		    (const_int 0)))]
3744  "")
3745
3746(define_insn "extzvdi"
3747  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
3748	(zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
3749			 (match_operand:SI 2 "const_int_operand" "i")
3750			 (match_operand:SI 3 "const_int_operand" "i")))]
3751  "TARGET_POWERPC64"
3752  "*
3753{
3754  int start = INTVAL (operands[3]) & 63;
3755  int size = INTVAL (operands[2]) & 63;
3756
3757  if (start + size >= 64)
3758    operands[3] = const0_rtx;
3759  else
3760    operands[3] = GEN_INT (start + size);
3761  operands[2] = GEN_INT (64 - size);
3762  return \"rldicl %0,%1,%3,%2\";
3763}")
3764
3765(define_insn "*extzvdi_internal1"
3766  [(set (match_operand:CC 0 "gpc_reg_operand" "=x")
3767	(compare:CC (zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
3768			 (match_operand:SI 2 "const_int_operand" "i")
3769			 (match_operand:SI 3 "const_int_operand" "i"))
3770		    (const_int 0)))
3771   (clobber (match_scratch:DI 4 "=r"))]
3772  "TARGET_64BIT"
3773  "*
3774{
3775  int start = INTVAL (operands[3]) & 63;
3776  int size = INTVAL (operands[2]) & 63;
3777
3778  if (start + size >= 64)
3779    operands[3] = const0_rtx;
3780  else
3781    operands[3] = GEN_INT (start + size);
3782  operands[2] = GEN_INT (64 - size);
3783  return \"rldicl. %4,%1,%3,%2\";
3784}"
3785  [(set_attr "type" "compare")])
3786
3787(define_insn "*extzvdi_internal2"
3788  [(set (match_operand:CC 4 "gpc_reg_operand" "=x")
3789	(compare:CC (zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
3790			 (match_operand:SI 2 "const_int_operand" "i")
3791			 (match_operand:SI 3 "const_int_operand" "i"))
3792		    (const_int 0)))
3793   (set (match_operand:DI 0 "gpc_reg_operand" "=r")
3794	(zero_extract:DI (match_dup 1) (match_dup 2) (match_dup 3)))]
3795  "TARGET_64BIT"
3796  "*
3797{
3798  int start = INTVAL (operands[3]) & 63;
3799  int size = INTVAL (operands[2]) & 63;
3800
3801  if (start + size >= 64)
3802    operands[3] = const0_rtx;
3803  else
3804    operands[3] = GEN_INT (start + size);
3805  operands[2] = GEN_INT (64 - size);
3806  return \"rldicl. %0,%1,%3,%2\";
3807}"
3808  [(set_attr "type" "compare")])
3809
3810(define_insn "rotlsi3"
3811  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3812	(rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
3813		   (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
3814  ""
3815  "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xffffffff")
3816
3817(define_insn "*rotlsi3_internal2"
3818  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3819	(compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3820			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
3821		    (const_int 0)))
3822   (clobber (match_scratch:SI 3 "=r,r"))]
3823  ""
3824  "@
3825   {rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xffffffff
3826   #"
3827  [(set_attr "type" "delayed_compare")
3828   (set_attr "length" "4,8")])
3829
3830(define_split
3831  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3832	(compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
3833			       (match_operand:SI 2 "reg_or_cint_operand" ""))
3834		    (const_int 0)))
3835   (clobber (match_scratch:SI 3 ""))]
3836  "reload_completed"
3837  [(set (match_dup 3)
3838	(rotate:SI (match_dup 1) (match_dup 2)))
3839   (set (match_dup 0)
3840	(compare:CC (match_dup 3)
3841		    (const_int 0)))]
3842  "")
3843
3844(define_insn "*rotlsi3_internal3"
3845  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
3846	(compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3847			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
3848		    (const_int 0)))
3849   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3850	(rotate:SI (match_dup 1) (match_dup 2)))]
3851  ""
3852  "@
3853   {rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xffffffff
3854   #"
3855  [(set_attr "type" "delayed_compare")
3856   (set_attr "length" "4,8")])
3857
3858(define_split
3859  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
3860	(compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
3861			       (match_operand:SI 2 "reg_or_cint_operand" ""))
3862		    (const_int 0)))
3863   (set (match_operand:SI 0 "gpc_reg_operand" "")
3864	(rotate:SI (match_dup 1) (match_dup 2)))]
3865  "reload_completed"
3866  [(set (match_dup 0)
3867	(rotate:SI (match_dup 1) (match_dup 2)))
3868   (set (match_dup 3)
3869	(compare:CC (match_dup 0)
3870		    (const_int 0)))]
3871  "")
3872
3873(define_insn "*rotlsi3_internal4"
3874  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3875	(and:SI (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
3876			   (match_operand:SI 2 "reg_or_cint_operand" "ri"))
3877		(match_operand:SI 3 "mask_operand" "n")))]
3878  ""
3879  "{rl%I2nm|rlw%I2nm} %0,%1,%h2,%m3,%M3")
3880
3881(define_insn "*rotlsi3_internal5"
3882  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3883	(compare:CC (and:SI
3884		     (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3885				(match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
3886		     (match_operand:SI 3 "mask_operand" "n,n"))
3887		    (const_int 0)))
3888   (clobber (match_scratch:SI 4 "=r,r"))]
3889  ""
3890  "@
3891   {rl%I2nm.|rlw%I2nm.} %4,%1,%h2,%m3,%M3
3892   #"
3893  [(set_attr "type" "delayed_compare")
3894   (set_attr "length" "4,8")])
3895
3896(define_split
3897  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3898	(compare:CC (and:SI
3899		     (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
3900				(match_operand:SI 2 "reg_or_cint_operand" ""))
3901		     (match_operand:SI 3 "mask_operand" ""))
3902		    (const_int 0)))
3903   (clobber (match_scratch:SI 4 ""))]
3904  "reload_completed"
3905  [(set (match_dup 4)
3906	(and:SI (rotate:SI (match_dup 1)
3907				(match_dup 2))
3908		     (match_dup 3)))
3909   (set (match_dup 0)
3910	(compare:CC (match_dup 4)
3911		    (const_int 0)))]
3912  "")
3913
3914(define_insn "*rotlsi3_internal6"
3915  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
3916	(compare:CC (and:SI
3917		     (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3918				(match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
3919		     (match_operand:SI 3 "mask_operand" "n,n"))
3920		    (const_int 0)))
3921   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3922	(and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
3923  ""
3924  "@
3925   {rl%I2nm.|rlw%I2nm.} %0,%1,%h2,%m3,%M3
3926   #"
3927  [(set_attr "type" "delayed_compare")
3928   (set_attr "length" "4,8")])
3929
3930(define_split
3931  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
3932	(compare:CC (and:SI
3933		     (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
3934				(match_operand:SI 2 "reg_or_cint_operand" ""))
3935		     (match_operand:SI 3 "mask_operand" ""))
3936		    (const_int 0)))
3937   (set (match_operand:SI 0 "gpc_reg_operand" "")
3938	(and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
3939  "reload_completed"
3940  [(set (match_dup 0)
3941	(and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3942   (set (match_dup 4)
3943	(compare:CC (match_dup 0)
3944		    (const_int 0)))]
3945  "")
3946
3947(define_insn "*rotlsi3_internal7"
3948  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3949	(zero_extend:SI
3950	 (subreg:QI
3951	  (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
3952		     (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
3953  ""
3954  "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xff")
3955
3956(define_insn "*rotlsi3_internal8"
3957  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
3958	(compare:CC (zero_extend:SI
3959		     (subreg:QI
3960		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3961				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri")) 0))
3962		    (const_int 0)))
3963   (clobber (match_scratch:SI 3 "=r,r"))]
3964  ""
3965  "@
3966   {rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xff
3967   #"
3968  [(set_attr "type" "delayed_compare")
3969   (set_attr "length" "4,8")])
3970
3971(define_split
3972  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
3973	(compare:CC (zero_extend:SI
3974		     (subreg:QI
3975		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
3976				 (match_operand:SI 2 "reg_or_cint_operand" "")) 0))
3977		    (const_int 0)))
3978   (clobber (match_scratch:SI 3 ""))]
3979  "reload_completed"
3980  [(set (match_dup 3)
3981	(zero_extend:SI (subreg:QI
3982		      (rotate:SI (match_dup 1)
3983				 (match_dup 2)) 0)))
3984   (set (match_dup 0)
3985	(compare:CC (match_dup 3)
3986		    (const_int 0)))]
3987  "")
3988
3989(define_insn "*rotlsi3_internal9"
3990  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
3991	(compare:CC (zero_extend:SI
3992		     (subreg:QI
3993		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
3994				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri")) 0))
3995		    (const_int 0)))
3996   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
3997	(zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
3998  ""
3999  "@
4000   {rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xff
4001   #"
4002  [(set_attr "type" "delayed_compare")
4003   (set_attr "length" "4,8")])
4004
4005(define_split
4006  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4007	(compare:CC (zero_extend:SI
4008		     (subreg:QI
4009		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
4010				 (match_operand:SI 2 "reg_or_cint_operand" "")) 0))
4011		    (const_int 0)))
4012   (set (match_operand:SI 0 "gpc_reg_operand" "")
4013	(zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
4014  "reload_completed"
4015  [(set (match_dup 0)
4016	(zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))
4017   (set (match_dup 3)
4018	(compare:CC (match_dup 0)
4019		    (const_int 0)))]
4020  "")
4021
4022(define_insn "*rotlsi3_internal10"
4023  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4024	(zero_extend:SI
4025	 (subreg:HI
4026	  (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4027		     (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
4028  ""
4029  "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xffff")
4030
4031(define_insn "*rotlsi3_internal11"
4032  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4033	(compare:CC (zero_extend:SI
4034		     (subreg:HI
4035		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4036				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri")) 0))
4037		    (const_int 0)))
4038   (clobber (match_scratch:SI 3 "=r,r"))]
4039  ""
4040  "@
4041   {rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xffff
4042   #"
4043  [(set_attr "type" "delayed_compare")
4044   (set_attr "length" "4,8")])
4045
4046(define_split
4047  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4048	(compare:CC (zero_extend:SI
4049		     (subreg:HI
4050		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
4051				 (match_operand:SI 2 "reg_or_cint_operand" "")) 0))
4052		    (const_int 0)))
4053   (clobber (match_scratch:SI 3 ""))]
4054  "reload_completed"
4055  [(set (match_dup 3)
4056	(zero_extend:SI (subreg:HI
4057		      (rotate:SI (match_dup 1)
4058				 (match_dup 2)) 0)))
4059   (set (match_dup 0)
4060	(compare:CC (match_dup 3)
4061		    (const_int 0)))]
4062  "")
4063
4064(define_insn "*rotlsi3_internal12"
4065  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
4066	(compare:CC (zero_extend:SI
4067		     (subreg:HI
4068		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4069				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri")) 0))
4070		    (const_int 0)))
4071   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4072	(zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
4073  ""
4074  "@
4075   {rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xffff
4076   #"
4077  [(set_attr "type" "delayed_compare")
4078   (set_attr "length" "4,8")])
4079
4080(define_split
4081  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4082	(compare:CC (zero_extend:SI
4083		     (subreg:HI
4084		      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
4085				 (match_operand:SI 2 "reg_or_cint_operand" "")) 0))
4086		    (const_int 0)))
4087   (set (match_operand:SI 0 "gpc_reg_operand" "")
4088	(zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
4089  "reload_completed"
4090  [(set (match_dup 0)
4091	(zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))
4092   (set (match_dup 3)
4093	(compare:CC (match_dup 0)
4094		    (const_int 0)))]
4095  "")
4096
4097;; Note that we use "sle." instead of "sl." so that we can set
4098;; SHIFT_COUNT_TRUNCATED.
4099
4100(define_expand "ashlsi3"
4101  [(use (match_operand:SI 0 "gpc_reg_operand" ""))
4102   (use (match_operand:SI 1 "gpc_reg_operand" ""))
4103   (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
4104  ""
4105  "
4106{
4107  if (TARGET_POWER)
4108    emit_insn (gen_ashlsi3_power (operands[0], operands[1], operands[2]));
4109  else
4110    emit_insn (gen_ashlsi3_no_power (operands[0], operands[1], operands[2]));
4111  DONE;
4112}")
4113
4114(define_insn "ashlsi3_power"
4115  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4116	(ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4117		   (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
4118   (clobber (match_scratch:SI 3 "=q,X"))]
4119  "TARGET_POWER"
4120  "@
4121   sle %0,%1,%2
4122   {sli|slwi} %0,%1,%h2")
4123
4124(define_insn "ashlsi3_no_power"
4125  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4126	(ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4127		   (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
4128  "! TARGET_POWER"
4129  "{sl|slw}%I2 %0,%1,%h2")
4130
4131(define_insn ""
4132  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
4133	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4134			       (match_operand:SI 2 "reg_or_cint_operand" "r,i,r,i"))
4135		    (const_int 0)))
4136   (clobber (match_scratch:SI 3 "=r,r,r,r"))
4137   (clobber (match_scratch:SI 4 "=q,X,q,X"))]
4138  "TARGET_POWER"
4139  "@
4140   sle. %3,%1,%2
4141   {sli.|slwi.} %3,%1,%h2
4142   #
4143   #"
4144  [(set_attr "type" "delayed_compare")
4145   (set_attr "length" "4,4,8,8")])
4146
4147(define_split
4148  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4149	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4150			       (match_operand:SI 2 "reg_or_cint_operand" ""))
4151		    (const_int 0)))
4152   (clobber (match_scratch:SI 3 ""))
4153   (clobber (match_scratch:SI 4 ""))]
4154  "TARGET_POWER && reload_completed"
4155  [(parallel [(set (match_dup 3)
4156	(ashift:SI (match_dup 1) (match_dup 2)))
4157   (clobber (match_dup 4))])
4158   (set (match_dup 0)
4159	(compare:CC (match_dup 3)
4160		    (const_int 0)))]
4161  "")
4162
4163(define_insn ""
4164  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4165	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4166			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
4167		    (const_int 0)))
4168   (clobber (match_scratch:SI 3 "=r,r"))]
4169  "! TARGET_POWER && TARGET_32BIT"
4170  "@
4171   {sl|slw}%I2. %3,%1,%h2
4172   #"
4173  [(set_attr "type" "delayed_compare")
4174   (set_attr "length" "4,8")])
4175
4176(define_split
4177  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4178	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4179			       (match_operand:SI 2 "reg_or_cint_operand" ""))
4180		    (const_int 0)))
4181   (clobber (match_scratch:SI 3 ""))]
4182  "! TARGET_POWER && TARGET_32BIT && reload_completed"
4183  [(set (match_dup 3)
4184	(ashift:SI (match_dup 1) (match_dup 2)))
4185   (set (match_dup 0)
4186	(compare:CC (match_dup 3)
4187		    (const_int 0)))]
4188  "")
4189
4190(define_insn ""
4191  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
4192	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4193			       (match_operand:SI 2 "reg_or_cint_operand" "r,i,r,i"))
4194		    (const_int 0)))
4195   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
4196	(ashift:SI (match_dup 1) (match_dup 2)))
4197   (clobber (match_scratch:SI 4 "=q,X,q,X"))]
4198  "TARGET_POWER"
4199  "@
4200   sle. %0,%1,%2
4201   {sli.|slwi.} %0,%1,%h2
4202   #
4203   #"
4204  [(set_attr "type" "delayed_compare")
4205   (set_attr "length" "4,4,8,8")])
4206
4207(define_split
4208  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4209	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4210			       (match_operand:SI 2 "reg_or_cint_operand" ""))
4211		    (const_int 0)))
4212   (set (match_operand:SI 0 "gpc_reg_operand" "")
4213	(ashift:SI (match_dup 1) (match_dup 2)))
4214   (clobber (match_scratch:SI 4 ""))]
4215  "TARGET_POWER && reload_completed"
4216  [(parallel [(set (match_dup 0)
4217	(ashift:SI (match_dup 1) (match_dup 2)))
4218   (clobber (match_dup 4))])
4219   (set (match_dup 3)
4220	(compare:CC (match_dup 0)
4221		    (const_int 0)))]
4222  "")
4223
4224(define_insn ""
4225  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
4226	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4227			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
4228		    (const_int 0)))
4229   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4230	(ashift:SI (match_dup 1) (match_dup 2)))]
4231  "! TARGET_POWER && TARGET_32BIT"
4232  "@
4233   {sl|slw}%I2. %0,%1,%h2
4234   #"
4235  [(set_attr "type" "delayed_compare")
4236   (set_attr "length" "4,8")])
4237
4238(define_split
4239  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4240	(compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4241			       (match_operand:SI 2 "reg_or_cint_operand" ""))
4242		    (const_int 0)))
4243   (set (match_operand:SI 0 "gpc_reg_operand" "")
4244	(ashift:SI (match_dup 1) (match_dup 2)))]
4245  "! TARGET_POWER && TARGET_32BIT && reload_completed"
4246  [(set (match_dup 0)
4247	(ashift:SI (match_dup 1) (match_dup 2)))
4248   (set (match_dup 3)
4249	(compare:CC (match_dup 0)
4250		    (const_int 0)))]
4251  "")
4252
4253(define_insn "rlwinm"
4254  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4255	(and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4256			   (match_operand:SI 2 "const_int_operand" "i"))
4257		(match_operand:SI 3 "mask_operand" "n")))]
4258  "includes_lshift_p (operands[2], operands[3])"
4259  "{rlinm|rlwinm} %0,%1,%h2,%m3,%M3")
4260
4261(define_insn ""
4262  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4263	(compare:CC
4264	 (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4265			    (match_operand:SI 2 "const_int_operand" "i,i"))
4266		 (match_operand:SI 3 "mask_operand" "n,n"))
4267	 (const_int 0)))
4268   (clobber (match_scratch:SI 4 "=r,r"))]
4269  "includes_lshift_p (operands[2], operands[3])"
4270  "@
4271   {rlinm.|rlwinm.} %4,%1,%h2,%m3,%M3
4272   #"
4273  [(set_attr "type" "delayed_compare")
4274   (set_attr "length" "4,8")])
4275
4276(define_split
4277  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4278	(compare:CC
4279	 (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4280			    (match_operand:SI 2 "const_int_operand" ""))
4281		 (match_operand:SI 3 "mask_operand" ""))
4282	 (const_int 0)))
4283   (clobber (match_scratch:SI 4 ""))]
4284  "includes_lshift_p (operands[2], operands[3]) && reload_completed"
4285  [(set (match_dup 4)
4286	(and:SI (ashift:SI (match_dup 1) (match_dup 2))
4287		 (match_dup 3)))
4288   (set (match_dup 0)
4289	(compare:CC (match_dup 4)
4290		    (const_int 0)))]
4291  "")
4292
4293(define_insn ""
4294  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
4295	(compare:CC
4296	 (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4297			    (match_operand:SI 2 "const_int_operand" "i,i"))
4298		 (match_operand:SI 3 "mask_operand" "n,n"))
4299	 (const_int 0)))
4300   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4301	(and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
4302  "includes_lshift_p (operands[2], operands[3])"
4303  "@
4304   {rlinm.|rlwinm.} %0,%1,%h2,%m3,%M3
4305   #"
4306  [(set_attr "type" "delayed_compare")
4307   (set_attr "length" "4,8")])
4308
4309(define_split
4310  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
4311	(compare:CC
4312	 (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "")
4313			    (match_operand:SI 2 "const_int_operand" ""))
4314		 (match_operand:SI 3 "mask_operand" ""))
4315	 (const_int 0)))
4316   (set (match_operand:SI 0 "gpc_reg_operand" "")
4317	(and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
4318  "includes_lshift_p (operands[2], operands[3]) && reload_completed"
4319  [(set (match_dup 0)
4320	(and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
4321   (set (match_dup 4)
4322	(compare:CC (match_dup 0)
4323		    (const_int 0)))]
4324  "")
4325
4326;; The AIX assembler mis-handles "sri x,x,0", so write that case as
4327;; "sli x,x,0".
4328(define_expand "lshrsi3"
4329  [(use (match_operand:SI 0 "gpc_reg_operand" ""))
4330   (use (match_operand:SI 1 "gpc_reg_operand" ""))
4331   (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
4332  ""
4333  "
4334{
4335  if (TARGET_POWER)
4336    emit_insn (gen_lshrsi3_power (operands[0], operands[1], operands[2]));
4337  else
4338    emit_insn (gen_lshrsi3_no_power (operands[0], operands[1], operands[2]));
4339  DONE;
4340}")
4341
4342(define_insn "lshrsi3_power"
4343  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
4344	(lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r")
4345		     (match_operand:SI 2 "reg_or_cint_operand" "r,O,i")))
4346   (clobber (match_scratch:SI 3 "=q,X,X"))]
4347  "TARGET_POWER"
4348  "@
4349  sre %0,%1,%2
4350  mr %0,%1
4351  {s%A2i|s%A2wi} %0,%1,%h2")
4352
4353(define_insn "lshrsi3_no_power"
4354  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4355	(lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4356		     (match_operand:SI 2 "reg_or_cint_operand" "O,ri")))]
4357  "! TARGET_POWER"
4358  "@
4359  mr %0,%1
4360  {sr|srw}%I2 %0,%1,%h2")
4361
4362(define_insn ""
4363  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,?y,?y,?y")
4364	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r,r,r")
4365				 (match_operand:SI 2 "reg_or_cint_operand" "r,O,i,r,O,i"))
4366		    (const_int 0)))
4367   (clobber (match_scratch:SI 3 "=r,X,r,r,X,r"))
4368   (clobber (match_scratch:SI 4 "=q,X,X,q,X,X"))]
4369  "TARGET_POWER"
4370  "@
4371  sre. %3,%1,%2
4372  mr. %1,%1
4373  {s%A2i.|s%A2wi.} %3,%1,%h2
4374  #
4375  #
4376  #"
4377  [(set_attr "type" "delayed_compare")
4378   (set_attr "length" "4,4,4,8,8,8")])
4379
4380(define_split
4381  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4382	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4383				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4384		    (const_int 0)))
4385   (clobber (match_scratch:SI 3 ""))
4386   (clobber (match_scratch:SI 4 ""))]
4387  "TARGET_POWER && reload_completed"
4388  [(parallel [(set (match_dup 3)
4389	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4390   (clobber (match_dup 4))])
4391   (set (match_dup 0)
4392	(compare:CC (match_dup 3)
4393		    (const_int 0)))]
4394  "")
4395
4396(define_insn ""
4397  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
4398	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4399				 (match_operand:SI 2 "reg_or_cint_operand" "O,ri,O,ri"))
4400		    (const_int 0)))
4401   (clobber (match_scratch:SI 3 "=X,r,X,r"))]
4402  "! TARGET_POWER && TARGET_32BIT"
4403  "@
4404   mr. %1,%1
4405   {sr|srw}%I2. %3,%1,%h2
4406   #
4407   #"
4408  [(set_attr "type" "delayed_compare")
4409   (set_attr "length" "4,4,8,8")])
4410
4411(define_split
4412  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4413	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4414				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4415		    (const_int 0)))
4416   (clobber (match_scratch:SI 3 ""))]
4417  "! TARGET_POWER && TARGET_32BIT && reload_completed"
4418  [(set (match_dup 3)
4419	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4420   (set (match_dup 0)
4421	(compare:CC (match_dup 3)
4422		    (const_int 0)))]
4423  "")
4424
4425(define_insn ""
4426  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,?y,?y,?y")
4427	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r,r,r")
4428				 (match_operand:SI 2 "reg_or_cint_operand" "r,O,i,r,O,i"))
4429		    (const_int 0)))
4430   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r,r")
4431	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4432   (clobber (match_scratch:SI 4 "=q,X,X,q,X,X"))]
4433  "TARGET_POWER"
4434  "@
4435  sre. %0,%1,%2
4436  mr. %0,%1
4437  {s%A2i.|s%A2wi.} %0,%1,%h2
4438  #
4439  #
4440  #"
4441  [(set_attr "type" "delayed_compare")
4442   (set_attr "length" "4,4,4,8,8,8")])
4443
4444(define_split
4445  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4446	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4447				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4448		    (const_int 0)))
4449   (set (match_operand:SI 0 "gpc_reg_operand" "")
4450	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4451   (clobber (match_scratch:SI 4 ""))]
4452  "TARGET_POWER && reload_completed"
4453  [(parallel [(set (match_dup 0)
4454	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4455   (clobber (match_dup 4))])
4456   (set (match_dup 3)
4457	(compare:CC (match_dup 0)
4458		    (const_int 0)))]
4459  "")
4460
4461(define_insn ""
4462  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
4463	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4464				 (match_operand:SI 2 "reg_or_cint_operand" "O,ri,O,ri"))
4465		    (const_int 0)))
4466   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
4467	(lshiftrt:SI (match_dup 1) (match_dup 2)))]
4468  "! TARGET_POWER && TARGET_32BIT"
4469  "@
4470   mr. %0,%1
4471   {sr|srw}%I2. %0,%1,%h2
4472   #
4473   #"
4474  [(set_attr "type" "delayed_compare")
4475   (set_attr "length" "4,4,8,8")])
4476
4477(define_split
4478  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4479	(compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4480				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4481		    (const_int 0)))
4482   (set (match_operand:SI 0 "gpc_reg_operand" "")
4483	(lshiftrt:SI (match_dup 1) (match_dup 2)))]
4484  "! TARGET_POWER && TARGET_32BIT && reload_completed"
4485  [(set (match_dup 0)
4486	(lshiftrt:SI (match_dup 1) (match_dup 2)))
4487   (set (match_dup 3)
4488	(compare:CC (match_dup 0)
4489		    (const_int 0)))]
4490  "")
4491
4492(define_insn ""
4493  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4494	(and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4495			     (match_operand:SI 2 "const_int_operand" "i"))
4496		(match_operand:SI 3 "mask_operand" "n")))]
4497  "includes_rshift_p (operands[2], operands[3])"
4498  "{rlinm|rlwinm} %0,%1,%s2,%m3,%M3")
4499
4500(define_insn ""
4501  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4502	(compare:CC
4503	 (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4504			      (match_operand:SI 2 "const_int_operand" "i,i"))
4505		 (match_operand:SI 3 "mask_operand" "n,n"))
4506	 (const_int 0)))
4507   (clobber (match_scratch:SI 4 "=r,r"))]
4508  "includes_rshift_p (operands[2], operands[3])"
4509  "@
4510   {rlinm.|rlwinm.} %4,%1,%s2,%m3,%M3
4511   #"
4512  [(set_attr "type" "delayed_compare")
4513   (set_attr "length" "4,8")])
4514
4515(define_split
4516  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4517	(compare:CC
4518	 (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4519			      (match_operand:SI 2 "const_int_operand" ""))
4520		 (match_operand:SI 3 "mask_operand" ""))
4521	 (const_int 0)))
4522   (clobber (match_scratch:SI 4 ""))]
4523  "includes_rshift_p (operands[2], operands[3]) && reload_completed"
4524  [(set (match_dup 4)
4525	(and:SI (lshiftrt:SI (match_dup 1) (match_dup 2))
4526		 (match_dup 3)))
4527   (set (match_dup 0)
4528	(compare:CC (match_dup 4)
4529		    (const_int 0)))]
4530  "")
4531
4532(define_insn ""
4533  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
4534	(compare:CC
4535	 (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4536			      (match_operand:SI 2 "const_int_operand" "i,i"))
4537		 (match_operand:SI 3 "mask_operand" "n,n"))
4538	 (const_int 0)))
4539   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4540	(and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
4541  "includes_rshift_p (operands[2], operands[3])"
4542  "@
4543   {rlinm.|rlwinm.} %0,%1,%s2,%m3,%M3
4544   #"
4545  [(set_attr "type" "delayed_compare")
4546   (set_attr "length" "4,8")])
4547
4548(define_split
4549  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
4550	(compare:CC
4551	 (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4552			      (match_operand:SI 2 "const_int_operand" ""))
4553		 (match_operand:SI 3 "mask_operand" ""))
4554	 (const_int 0)))
4555   (set (match_operand:SI 0 "gpc_reg_operand" "")
4556	(and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
4557  "includes_rshift_p (operands[2], operands[3]) && reload_completed"
4558  [(set (match_dup 0)
4559	(and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
4560   (set (match_dup 4)
4561	(compare:CC (match_dup 0)
4562		    (const_int 0)))]
4563  "")
4564
4565(define_insn ""
4566  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4567	(zero_extend:SI
4568	 (subreg:QI
4569	  (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4570		       (match_operand:SI 2 "const_int_operand" "i")) 0)))]
4571  "includes_rshift_p (operands[2], GEN_INT (255))"
4572  "{rlinm|rlwinm} %0,%1,%s2,0xff")
4573
4574(define_insn ""
4575  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4576	(compare:CC
4577	 (zero_extend:SI
4578	  (subreg:QI
4579	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4580			(match_operand:SI 2 "const_int_operand" "i,i")) 0))
4581	 (const_int 0)))
4582   (clobber (match_scratch:SI 3 "=r,r"))]
4583  "includes_rshift_p (operands[2], GEN_INT (255))"
4584  "@
4585   {rlinm.|rlwinm.} %3,%1,%s2,0xff
4586   #"
4587  [(set_attr "type" "delayed_compare")
4588   (set_attr "length" "4,8")])
4589
4590(define_split
4591  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4592	(compare:CC
4593	 (zero_extend:SI
4594	  (subreg:QI
4595	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4596			(match_operand:SI 2 "const_int_operand" "")) 0))
4597	 (const_int 0)))
4598   (clobber (match_scratch:SI 3 ""))]
4599  "includes_rshift_p (operands[2], GEN_INT (255)) && reload_completed"
4600  [(set (match_dup 3)
4601	(zero_extend:SI (subreg:QI
4602	   (lshiftrt:SI (match_dup 1)
4603			(match_dup 2)) 0)))
4604   (set (match_dup 0)
4605	(compare:CC (match_dup 3)
4606		    (const_int 0)))]
4607  "")
4608
4609(define_insn ""
4610  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
4611	(compare:CC
4612	 (zero_extend:SI
4613	  (subreg:QI
4614	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4615			(match_operand:SI 2 "const_int_operand" "i,i")) 0))
4616	 (const_int 0)))
4617   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4618	(zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
4619  "includes_rshift_p (operands[2], GEN_INT (255))"
4620  "@
4621   {rlinm.|rlwinm.} %0,%1,%s2,0xff
4622   #"
4623  [(set_attr "type" "delayed_compare")
4624   (set_attr "length" "4,8")])
4625
4626(define_split
4627  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4628	(compare:CC
4629	 (zero_extend:SI
4630	  (subreg:QI
4631	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4632			(match_operand:SI 2 "const_int_operand" "")) 0))
4633	 (const_int 0)))
4634   (set (match_operand:SI 0 "gpc_reg_operand" "")
4635	(zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
4636  "includes_rshift_p (operands[2], GEN_INT (255)) && reload_completed"
4637  [(set (match_dup 0)
4638	(zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))
4639   (set (match_dup 3)
4640	(compare:CC (match_dup 0)
4641		    (const_int 0)))]
4642  "")
4643
4644(define_insn ""
4645  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4646	(zero_extend:SI
4647	 (subreg:HI
4648	  (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4649		       (match_operand:SI 2 "const_int_operand" "i")) 0)))]
4650  "includes_rshift_p (operands[2], GEN_INT (65535))"
4651  "{rlinm|rlwinm} %0,%1,%s2,0xffff")
4652
4653(define_insn ""
4654  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4655	(compare:CC
4656	 (zero_extend:SI
4657	  (subreg:HI
4658	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4659			(match_operand:SI 2 "const_int_operand" "i,i")) 0))
4660	 (const_int 0)))
4661   (clobber (match_scratch:SI 3 "=r,r"))]
4662  "includes_rshift_p (operands[2], GEN_INT (65535))"
4663  "@
4664   {rlinm.|rlwinm.} %3,%1,%s2,0xffff
4665   #"
4666  [(set_attr "type" "delayed_compare")
4667   (set_attr "length" "4,8")])
4668
4669(define_split
4670  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4671	(compare:CC
4672	 (zero_extend:SI
4673	  (subreg:HI
4674	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4675			(match_operand:SI 2 "const_int_operand" "")) 0))
4676	 (const_int 0)))
4677   (clobber (match_scratch:SI 3 ""))]
4678  "includes_rshift_p (operands[2], GEN_INT (65535)) && reload_completed"
4679  [(set (match_dup 3)
4680	(zero_extend:SI (subreg:HI
4681	   (lshiftrt:SI (match_dup 1)
4682			(match_dup 2)) 0)))
4683   (set (match_dup 0)
4684	(compare:CC (match_dup 3)
4685		    (const_int 0)))]
4686  "")
4687
4688(define_insn ""
4689  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
4690	(compare:CC
4691	 (zero_extend:SI
4692	  (subreg:HI
4693	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4694			(match_operand:SI 2 "const_int_operand" "i,i")) 0))
4695	 (const_int 0)))
4696   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4697	(zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
4698  "includes_rshift_p (operands[2], GEN_INT (65535))"
4699  "@
4700   {rlinm.|rlwinm.} %0,%1,%s2,0xffff
4701   #"
4702  [(set_attr "type" "delayed_compare")
4703   (set_attr "length" "4,8")])
4704
4705(define_split
4706  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4707	(compare:CC
4708	 (zero_extend:SI
4709	  (subreg:HI
4710	   (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4711			(match_operand:SI 2 "const_int_operand" "")) 0))
4712	 (const_int 0)))
4713   (set (match_operand:SI 0 "gpc_reg_operand" "")
4714	(zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
4715  "includes_rshift_p (operands[2], GEN_INT (65535)) && reload_completed"
4716  [(set (match_dup 0)
4717	(zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))
4718   (set (match_dup 3)
4719	(compare:CC (match_dup 0)
4720		    (const_int 0)))]
4721  "")
4722
4723(define_insn ""
4724  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
4725			 (const_int 1)
4726			 (match_operand:SI 1 "gpc_reg_operand" "r"))
4727	(ashiftrt:SI (match_operand:SI 2 "gpc_reg_operand" "r")
4728		     (const_int 31)))]
4729  "TARGET_POWER"
4730  "rrib %0,%1,%2")
4731
4732(define_insn ""
4733  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
4734			 (const_int 1)
4735			 (match_operand:SI 1 "gpc_reg_operand" "r"))
4736	(lshiftrt:SI (match_operand:SI 2 "gpc_reg_operand" "r")
4737		     (const_int 31)))]
4738  "TARGET_POWER"
4739  "rrib %0,%1,%2")
4740
4741(define_insn ""
4742  [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
4743			 (const_int 1)
4744			 (match_operand:SI 1 "gpc_reg_operand" "r"))
4745	(zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
4746			 (const_int 1)
4747			 (const_int 0)))]
4748  "TARGET_POWER"
4749  "rrib %0,%1,%2")
4750
4751(define_expand "ashrsi3"
4752  [(set (match_operand:SI 0 "gpc_reg_operand" "")
4753	(ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4754		     (match_operand:SI 2 "reg_or_cint_operand" "")))]
4755  ""
4756  "
4757{
4758  if (TARGET_POWER)
4759    emit_insn (gen_ashrsi3_power (operands[0], operands[1], operands[2]));
4760  else
4761    emit_insn (gen_ashrsi3_no_power (operands[0], operands[1], operands[2]));
4762  DONE;
4763}")
4764
4765(define_insn "ashrsi3_power"
4766  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4767	(ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4768		     (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
4769   (clobber (match_scratch:SI 3 "=q,X"))]
4770  "TARGET_POWER"
4771  "@
4772   srea %0,%1,%2
4773   {srai|srawi} %0,%1,%h2")
4774
4775(define_insn "ashrsi3_no_power"
4776  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4777	(ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
4778		     (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
4779  "! TARGET_POWER"
4780  "{sra|sraw}%I2 %0,%1,%h2")
4781
4782(define_insn ""
4783  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
4784	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4785				 (match_operand:SI 2 "reg_or_cint_operand" "r,i,r,i"))
4786		    (const_int 0)))
4787   (clobber (match_scratch:SI 3 "=r,r,r,r"))
4788   (clobber (match_scratch:SI 4 "=q,X,q,X"))]
4789  "TARGET_POWER"
4790  "@
4791   srea. %3,%1,%2
4792   {srai.|srawi.} %3,%1,%h2
4793   #
4794   #"
4795  [(set_attr "type" "delayed_compare")
4796   (set_attr "length" "4,4,8,8")])
4797
4798(define_split
4799  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4800	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4801				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4802		    (const_int 0)))
4803   (clobber (match_scratch:SI 3 ""))
4804   (clobber (match_scratch:SI 4 ""))]
4805  "TARGET_POWER && reload_completed"
4806  [(parallel [(set (match_dup 3)
4807	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4808   (clobber (match_dup 4))])
4809   (set (match_dup 0)
4810	(compare:CC (match_dup 3)
4811		    (const_int 0)))]
4812  "")
4813
4814(define_insn ""
4815  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
4816	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4817				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
4818		    (const_int 0)))
4819   (clobber (match_scratch:SI 3 "=r,r"))]
4820  "! TARGET_POWER"
4821  "@
4822   {sra|sraw}%I2. %3,%1,%h2
4823   #"
4824  [(set_attr "type" "delayed_compare")
4825   (set_attr "length" "4,8")])
4826
4827(define_split
4828  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
4829	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4830				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4831		    (const_int 0)))
4832   (clobber (match_scratch:SI 3 ""))]
4833  "! TARGET_POWER && reload_completed"
4834  [(set (match_dup 3)
4835	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4836   (set (match_dup 0)
4837	(compare:CC (match_dup 3)
4838		    (const_int 0)))]
4839  "")
4840
4841(define_insn ""
4842  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
4843	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
4844				 (match_operand:SI 2 "reg_or_cint_operand" "r,i,r,i"))
4845		    (const_int 0)))
4846   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
4847	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4848   (clobber (match_scratch:SI 4 "=q,X,q,X"))]
4849  "TARGET_POWER"
4850  "@
4851   srea. %0,%1,%2
4852   {srai.|srawi.} %0,%1,%h2
4853   #
4854   #"
4855  [(set_attr "type" "delayed_compare")
4856   (set_attr "length" "4,4,8,8")])
4857
4858(define_split
4859  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4860	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4861				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4862		    (const_int 0)))
4863   (set (match_operand:SI 0 "gpc_reg_operand" "")
4864	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4865   (clobber (match_scratch:SI 4 ""))]
4866  "TARGET_POWER && reload_completed"
4867  [(parallel [(set (match_dup 0)
4868	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4869   (clobber (match_dup 4))])
4870   (set (match_dup 3)
4871	(compare:CC (match_dup 0)
4872		    (const_int 0)))]
4873  "")
4874
4875(define_insn ""
4876  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
4877	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
4878				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
4879		    (const_int 0)))
4880   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
4881	(ashiftrt:SI (match_dup 1) (match_dup 2)))]
4882  "! TARGET_POWER"
4883  "@
4884   {sra|sraw}%I2. %0,%1,%h2
4885   #"
4886  [(set_attr "type" "delayed_compare")
4887   (set_attr "length" "4,8")])
4888
4889(define_split
4890  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
4891	(compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
4892				 (match_operand:SI 2 "reg_or_cint_operand" ""))
4893		    (const_int 0)))
4894   (set (match_operand:SI 0 "gpc_reg_operand" "")
4895	(ashiftrt:SI (match_dup 1) (match_dup 2)))]
4896  "! TARGET_POWER && reload_completed"
4897  [(set (match_dup 0)
4898	(ashiftrt:SI (match_dup 1) (match_dup 2)))
4899   (set (match_dup 3)
4900	(compare:CC (match_dup 0)
4901		    (const_int 0)))]
4902  "")
4903
4904;; Floating-point insns, excluding normal data motion.
4905;;
4906;; PowerPC has a full set of single-precision floating point instructions.
4907;;
4908;; For the POWER architecture, we pretend that we have both SFmode and
4909;; DFmode insns, while, in fact, all fp insns are actually done in double.
4910;; The only conversions we will do will be when storing to memory.  In that
4911;; case, we will use the "frsp" instruction before storing.
4912;;
4913;; Note that when we store into a single-precision memory location, we need to
4914;; use the frsp insn first.  If the register being stored isn't dead, we
4915;; need a scratch register for the frsp.  But this is difficult when the store
4916;; is done by reload.  It is not incorrect to do the frsp on the register in
4917;; this case, we just lose precision that we would have otherwise gotten but
4918;; is not guaranteed.  Perhaps this should be tightened up at some point.
4919
4920(define_expand "extendsfdf2"
4921  [(set (match_operand:DF 0 "gpc_reg_operand" "")
4922	(float_extend:DF (match_operand:SF 1 "reg_or_none500mem_operand" "")))]
4923  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
4924  "")
4925
4926(define_insn_and_split "*extendsfdf2_fpr"
4927  [(set (match_operand:DF 0 "gpc_reg_operand" "=f,?f,f")
4928	(float_extend:DF (match_operand:SF 1 "reg_or_mem_operand" "0,f,m")))]
4929  "TARGET_HARD_FLOAT && TARGET_FPRS"
4930  "@
4931   #
4932   fmr %0,%1
4933   lfs%U1%X1 %0,%1"
4934  "&& reload_completed && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1])"
4935  [(const_int 0)]
4936{
4937  emit_note (NOTE_INSN_DELETED);
4938  DONE;
4939}
4940  [(set_attr "type" "fp,fp,fpload")])
4941
4942(define_expand "truncdfsf2"
4943  [(set (match_operand:SF 0 "gpc_reg_operand" "")
4944	(float_truncate:SF (match_operand:DF 1 "gpc_reg_operand" "")))]
4945  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
4946  "")
4947
4948(define_insn "*truncdfsf2_fpr"
4949  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
4950	(float_truncate:SF (match_operand:DF 1 "gpc_reg_operand" "f")))]
4951  "TARGET_HARD_FLOAT && TARGET_FPRS"
4952  "frsp %0,%1"
4953  [(set_attr "type" "fp")])
4954
4955(define_insn "aux_truncdfsf2"
4956  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
4957	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRSP))]
4958  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
4959  "frsp %0,%1"
4960  [(set_attr "type" "fp")])
4961
4962(define_expand "negsf2"
4963  [(set (match_operand:SF 0 "gpc_reg_operand" "")
4964	(neg:SF (match_operand:SF 1 "gpc_reg_operand" "")))]
4965  "TARGET_HARD_FLOAT"
4966  "")
4967
4968(define_insn "*negsf2"
4969  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
4970	(neg:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
4971  "TARGET_HARD_FLOAT && TARGET_FPRS"
4972  "fneg %0,%1"
4973  [(set_attr "type" "fp")])
4974
4975(define_expand "abssf2"
4976  [(set (match_operand:SF 0 "gpc_reg_operand" "")
4977	(abs:SF (match_operand:SF 1 "gpc_reg_operand" "")))]
4978  "TARGET_HARD_FLOAT"
4979  "")
4980
4981(define_insn "*abssf2"
4982  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
4983	(abs:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
4984  "TARGET_HARD_FLOAT && TARGET_FPRS"
4985  "fabs %0,%1"
4986  [(set_attr "type" "fp")])
4987
4988(define_insn ""
4989  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
4990	(neg:SF (abs:SF (match_operand:SF 1 "gpc_reg_operand" "f"))))]
4991  "TARGET_HARD_FLOAT && TARGET_FPRS"
4992  "fnabs %0,%1"
4993  [(set_attr "type" "fp")])
4994
4995(define_expand "addsf3"
4996  [(set (match_operand:SF 0 "gpc_reg_operand" "")
4997	(plus:SF (match_operand:SF 1 "gpc_reg_operand" "")
4998		 (match_operand:SF 2 "gpc_reg_operand" "")))]
4999  "TARGET_HARD_FLOAT"
5000  "")
5001
5002(define_insn ""
5003  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5004	(plus:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5005		 (match_operand:SF 2 "gpc_reg_operand" "f")))]
5006  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5007  "fadds %0,%1,%2"
5008  [(set_attr "type" "fp")])
5009
5010(define_insn ""
5011  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5012	(plus:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5013		 (match_operand:SF 2 "gpc_reg_operand" "f")))]
5014  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5015  "{fa|fadd} %0,%1,%2"
5016  [(set_attr "type" "fp")])
5017
5018(define_expand "subsf3"
5019  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5020	(minus:SF (match_operand:SF 1 "gpc_reg_operand" "")
5021		  (match_operand:SF 2 "gpc_reg_operand" "")))]
5022  "TARGET_HARD_FLOAT"
5023  "")
5024
5025(define_insn ""
5026  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5027	(minus:SF (match_operand:SF 1 "gpc_reg_operand" "f")
5028		  (match_operand:SF 2 "gpc_reg_operand" "f")))]
5029  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5030  "fsubs %0,%1,%2"
5031  [(set_attr "type" "fp")])
5032
5033(define_insn ""
5034  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5035	(minus:SF (match_operand:SF 1 "gpc_reg_operand" "f")
5036		  (match_operand:SF 2 "gpc_reg_operand" "f")))]
5037  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5038  "{fs|fsub} %0,%1,%2"
5039  [(set_attr "type" "fp")])
5040
5041(define_expand "mulsf3"
5042  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5043	(mult:SF (match_operand:SF 1 "gpc_reg_operand" "")
5044		 (match_operand:SF 2 "gpc_reg_operand" "")))]
5045  "TARGET_HARD_FLOAT"
5046  "")
5047
5048(define_insn ""
5049  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5050	(mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5051		 (match_operand:SF 2 "gpc_reg_operand" "f")))]
5052  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5053  "fmuls %0,%1,%2"
5054  [(set_attr "type" "fp")])
5055
5056(define_insn ""
5057  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5058	(mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5059		 (match_operand:SF 2 "gpc_reg_operand" "f")))]
5060  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5061  "{fm|fmul} %0,%1,%2"
5062  [(set_attr "type" "dmul")])
5063
5064(define_insn "fres"
5065  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5066	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRES))]
5067  "TARGET_PPC_GFXOPT && flag_finite_math_only"
5068  "fres %0,%1"
5069  [(set_attr "type" "fp")])
5070
5071(define_expand "divsf3"
5072  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5073	(div:SF (match_operand:SF 1 "gpc_reg_operand" "")
5074		(match_operand:SF 2 "gpc_reg_operand" "")))]
5075  "TARGET_HARD_FLOAT"
5076{
5077  if (swdiv && !optimize_size && TARGET_PPC_GFXOPT
5078  && flag_finite_math_only && !flag_trapping_math)
5079    {
5080      rs6000_emit_swdivsf (operands[0], operands[1], operands[2]);
5081      DONE;
5082    }
5083})
5084
5085(define_insn ""
5086  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5087	(div:SF (match_operand:SF 1 "gpc_reg_operand" "f")
5088		(match_operand:SF 2 "gpc_reg_operand" "f")))]
5089  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5090  "fdivs %0,%1,%2"
5091  [(set_attr "type" "sdiv")])
5092
5093(define_insn ""
5094  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5095	(div:SF (match_operand:SF 1 "gpc_reg_operand" "f")
5096		(match_operand:SF 2 "gpc_reg_operand" "f")))]
5097  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS"
5098  "{fd|fdiv} %0,%1,%2"
5099  [(set_attr "type" "ddiv")])
5100
5101(define_insn ""
5102  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5103	(plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5104			  (match_operand:SF 2 "gpc_reg_operand" "f"))
5105		 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5106  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5107  "fmadds %0,%1,%2,%3"
5108  [(set_attr "type" "fp")])
5109
5110(define_insn ""
5111  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5112	(plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5113			  (match_operand:SF 2 "gpc_reg_operand" "f"))
5114		 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5115  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5116  "{fma|fmadd} %0,%1,%2,%3"
5117  [(set_attr "type" "dmul")])
5118
5119(define_insn ""
5120  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5121	(minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5122			   (match_operand:SF 2 "gpc_reg_operand" "f"))
5123		  (match_operand:SF 3 "gpc_reg_operand" "f")))]
5124  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5125  "fmsubs %0,%1,%2,%3"
5126  [(set_attr "type" "fp")])
5127
5128(define_insn ""
5129  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5130	(minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5131			   (match_operand:SF 2 "gpc_reg_operand" "f"))
5132		  (match_operand:SF 3 "gpc_reg_operand" "f")))]
5133  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5134  "{fms|fmsub} %0,%1,%2,%3"
5135  [(set_attr "type" "dmul")])
5136
5137(define_insn ""
5138  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5139	(neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5140				  (match_operand:SF 2 "gpc_reg_operand" "f"))
5141			 (match_operand:SF 3 "gpc_reg_operand" "f"))))]
5142  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5143   && HONOR_SIGNED_ZEROS (SFmode)"
5144  "fnmadds %0,%1,%2,%3"
5145  [(set_attr "type" "fp")])
5146
5147(define_insn ""
5148  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5149	(minus:SF (mult:SF (neg:SF (match_operand:SF 1 "gpc_reg_operand" "f"))
5150			   (match_operand:SF 2 "gpc_reg_operand" "f"))
5151			 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5152  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5153   && ! HONOR_SIGNED_ZEROS (SFmode)"
5154  "fnmadds %0,%1,%2,%3"
5155  [(set_attr "type" "fp")])
5156
5157(define_insn ""
5158  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5159	(neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5160				  (match_operand:SF 2 "gpc_reg_operand" "f"))
5161			 (match_operand:SF 3 "gpc_reg_operand" "f"))))]
5162  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5163  "{fnma|fnmadd} %0,%1,%2,%3"
5164  [(set_attr "type" "dmul")])
5165
5166(define_insn ""
5167  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5168	(minus:SF (mult:SF (neg:SF (match_operand:SF 1 "gpc_reg_operand" "f"))
5169			   (match_operand:SF 2 "gpc_reg_operand" "f"))
5170			 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5171  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5172   && ! HONOR_SIGNED_ZEROS (SFmode)"
5173  "{fnma|fnmadd} %0,%1,%2,%3"
5174  [(set_attr "type" "dmul")])
5175
5176(define_insn ""
5177  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5178	(neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5179				   (match_operand:SF 2 "gpc_reg_operand" "f"))
5180			  (match_operand:SF 3 "gpc_reg_operand" "f"))))]
5181  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5182   && HONOR_SIGNED_ZEROS (SFmode)"
5183  "fnmsubs %0,%1,%2,%3"
5184  [(set_attr "type" "fp")])
5185
5186(define_insn ""
5187  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5188	(minus:SF (match_operand:SF 3 "gpc_reg_operand" "f")
5189		  (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5190			   (match_operand:SF 2 "gpc_reg_operand" "f"))))]
5191  "TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5192   && ! HONOR_SIGNED_ZEROS (SFmode)"
5193  "fnmsubs %0,%1,%2,%3"
5194  [(set_attr "type" "fp")])
5195
5196(define_insn ""
5197  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5198	(neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5199				   (match_operand:SF 2 "gpc_reg_operand" "f"))
5200			  (match_operand:SF 3 "gpc_reg_operand" "f"))))]
5201  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5202  "{fnms|fnmsub} %0,%1,%2,%3"
5203  [(set_attr "type" "dmul")])
5204
5205(define_insn ""
5206  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5207	(minus:SF (match_operand:SF 3 "gpc_reg_operand" "f")
5208		  (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
5209			   (match_operand:SF 2 "gpc_reg_operand" "f"))))]
5210  "! TARGET_POWERPC && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5211   && ! HONOR_SIGNED_ZEROS (SFmode)"
5212  "{fnms|fnmsub} %0,%1,%2,%3"
5213  [(set_attr "type" "dmul")])
5214
5215(define_expand "sqrtsf2"
5216  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5217	(sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "")))]
5218  "(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT && TARGET_FPRS"
5219  "")
5220
5221(define_insn ""
5222  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5223	(sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
5224  "TARGET_PPC_GPOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5225  "fsqrts %0,%1"
5226  [(set_attr "type" "ssqrt")])
5227
5228(define_insn ""
5229  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5230	(sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
5231  "TARGET_POWER2 && TARGET_HARD_FLOAT && TARGET_FPRS"
5232  "fsqrt %0,%1"
5233  [(set_attr "type" "dsqrt")])
5234
5235(define_expand "copysignsf3"
5236  [(set (match_dup 3)
5237        (abs:SF (match_operand:SF 1 "gpc_reg_operand" "")))
5238   (set (match_dup 4)
5239	(neg:SF (abs:SF (match_dup 1))))
5240   (set (match_operand:SF 0 "gpc_reg_operand" "")
5241        (if_then_else:SF (ge (match_operand:SF 2 "gpc_reg_operand" "")
5242	                     (match_dup 5))
5243			 (match_dup 3)
5244			 (match_dup 4)))]
5245  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS
5246   && !HONOR_NANS (SFmode) && !HONOR_SIGNED_ZEROS (SFmode)"
5247  {
5248     operands[3] = gen_reg_rtx (SFmode);
5249     operands[4] = gen_reg_rtx (SFmode);
5250     operands[5] = CONST0_RTX (SFmode);
5251  })
5252
5253(define_expand "copysigndf3"
5254  [(set (match_dup 3)
5255        (abs:DF (match_operand:DF 1 "gpc_reg_operand" "")))
5256   (set (match_dup 4)
5257	(neg:DF (abs:DF (match_dup 1))))
5258   (set (match_operand:DF 0 "gpc_reg_operand" "")
5259        (if_then_else:DF (ge (match_operand:DF 2 "gpc_reg_operand" "")
5260	                     (match_dup 5))
5261			 (match_dup 3)
5262			 (match_dup 4)))]
5263  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS
5264   && !HONOR_NANS (DFmode) && !HONOR_SIGNED_ZEROS (DFmode)"
5265  {
5266     operands[3] = gen_reg_rtx (DFmode);
5267     operands[4] = gen_reg_rtx (DFmode);
5268     operands[5] = CONST0_RTX (DFmode);
5269  })
5270
5271;; For MIN, MAX, and conditional move, we use DEFINE_EXPAND's that involve a
5272;; fsel instruction and some auxiliary computations.  Then we just have a
5273;; single DEFINE_INSN for fsel and the define_splits to make them if made by
5274;; combine.
5275(define_expand "smaxsf3"
5276  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5277	(if_then_else:SF (ge (match_operand:SF 1 "gpc_reg_operand" "")
5278			     (match_operand:SF 2 "gpc_reg_operand" ""))
5279			 (match_dup 1)
5280			 (match_dup 2)))]
5281  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5282  "{ rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]); DONE;}")
5283
5284(define_expand "sminsf3"
5285  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5286	(if_then_else:SF (ge (match_operand:SF 1 "gpc_reg_operand" "")
5287			     (match_operand:SF 2 "gpc_reg_operand" ""))
5288			 (match_dup 2)
5289			 (match_dup 1)))]
5290  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5291  "{ rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]); DONE;}")
5292
5293(define_split
5294  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5295	(match_operator:SF 3 "min_max_operator"
5296	 [(match_operand:SF 1 "gpc_reg_operand" "")
5297	  (match_operand:SF 2 "gpc_reg_operand" "")]))]
5298  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5299  [(const_int 0)]
5300  "
5301{ rs6000_emit_minmax (operands[0], GET_CODE (operands[3]),
5302		      operands[1], operands[2]);
5303  DONE;
5304}")
5305
5306(define_expand "movsicc"
5307   [(set (match_operand:SI 0 "gpc_reg_operand" "")
5308	 (if_then_else:SI (match_operand 1 "comparison_operator" "")
5309			  (match_operand:SI 2 "gpc_reg_operand" "")
5310			  (match_operand:SI 3 "gpc_reg_operand" "")))]
5311  "TARGET_ISEL"
5312  "
5313{
5314  if (rs6000_emit_cmove (operands[0], operands[1], operands[2], operands[3]))
5315    DONE;
5316  else
5317    FAIL;
5318}")
5319
5320;; We use the BASE_REGS for the isel input operands because, if rA is
5321;; 0, the value of 0 is placed in rD upon truth.  Similarly for rB
5322;; because we may switch the operands and rB may end up being rA.
5323;;
5324;; We need 2 patterns: an unsigned and a signed pattern.  We could
5325;; leave out the mode in operand 4 and use one pattern, but reload can
5326;; change the mode underneath our feet and then gets confused trying
5327;; to reload the value.
5328(define_insn "isel_signed"
5329  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
5330	(if_then_else:SI
5331	 (match_operator 1 "comparison_operator"
5332			 [(match_operand:CC 4 "cc_reg_operand" "y")
5333			  (const_int 0)])
5334	 (match_operand:SI 2 "gpc_reg_operand" "b")
5335	 (match_operand:SI 3 "gpc_reg_operand" "b")))]
5336  "TARGET_ISEL"
5337  "*
5338{ return output_isel (operands); }"
5339  [(set_attr "length" "4")])
5340
5341(define_insn "isel_unsigned"
5342  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
5343	(if_then_else:SI
5344	 (match_operator 1 "comparison_operator"
5345			 [(match_operand:CCUNS 4 "cc_reg_operand" "y")
5346			  (const_int 0)])
5347	 (match_operand:SI 2 "gpc_reg_operand" "b")
5348	 (match_operand:SI 3 "gpc_reg_operand" "b")))]
5349  "TARGET_ISEL"
5350  "*
5351{ return output_isel (operands); }"
5352  [(set_attr "length" "4")])
5353
5354(define_expand "movsfcc"
5355   [(set (match_operand:SF 0 "gpc_reg_operand" "")
5356	 (if_then_else:SF (match_operand 1 "comparison_operator" "")
5357			  (match_operand:SF 2 "gpc_reg_operand" "")
5358			  (match_operand:SF 3 "gpc_reg_operand" "")))]
5359  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5360  "
5361{
5362  if (rs6000_emit_cmove (operands[0], operands[1], operands[2], operands[3]))
5363    DONE;
5364  else
5365    FAIL;
5366}")
5367
5368(define_insn "*fselsfsf4"
5369  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5370	(if_then_else:SF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
5371			     (match_operand:SF 4 "zero_fp_constant" "F"))
5372			 (match_operand:SF 2 "gpc_reg_operand" "f")
5373			 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5374  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5375  "fsel %0,%1,%2,%3"
5376  [(set_attr "type" "fp")])
5377
5378(define_insn "*fseldfsf4"
5379  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5380	(if_then_else:SF (ge (match_operand:DF 1 "gpc_reg_operand" "f")
5381			     (match_operand:DF 4 "zero_fp_constant" "F"))
5382			 (match_operand:SF 2 "gpc_reg_operand" "f")
5383			 (match_operand:SF 3 "gpc_reg_operand" "f")))]
5384  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5385  "fsel %0,%1,%2,%3"
5386  [(set_attr "type" "fp")])
5387
5388(define_expand "negdf2"
5389  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5390	(neg:DF (match_operand:DF 1 "gpc_reg_operand" "")))]
5391  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5392  "")
5393
5394(define_insn "*negdf2_fpr"
5395  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5396	(neg:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
5397  "TARGET_HARD_FLOAT && TARGET_FPRS"
5398  "fneg %0,%1"
5399  [(set_attr "type" "fp")])
5400
5401(define_expand "absdf2"
5402  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5403	(abs:DF (match_operand:DF 1 "gpc_reg_operand" "")))]
5404  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5405  "")
5406
5407(define_insn "*absdf2_fpr"
5408  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5409	(abs:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
5410  "TARGET_HARD_FLOAT && TARGET_FPRS"
5411  "fabs %0,%1"
5412  [(set_attr "type" "fp")])
5413
5414(define_insn "*nabsdf2_fpr"
5415  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5416	(neg:DF (abs:DF (match_operand:DF 1 "gpc_reg_operand" "f"))))]
5417  "TARGET_HARD_FLOAT && TARGET_FPRS"
5418  "fnabs %0,%1"
5419  [(set_attr "type" "fp")])
5420
5421(define_expand "adddf3"
5422  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5423	(plus:DF (match_operand:DF 1 "gpc_reg_operand" "")
5424		 (match_operand:DF 2 "gpc_reg_operand" "")))]
5425  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5426  "")
5427
5428(define_insn "*adddf3_fpr"
5429  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5430	(plus:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5431		 (match_operand:DF 2 "gpc_reg_operand" "f")))]
5432  "TARGET_HARD_FLOAT && TARGET_FPRS"
5433  "{fa|fadd} %0,%1,%2"
5434  [(set_attr "type" "fp")])
5435
5436(define_expand "subdf3"
5437  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5438	(minus:DF (match_operand:DF 1 "gpc_reg_operand" "")
5439		  (match_operand:DF 2 "gpc_reg_operand" "")))]
5440  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5441  "")
5442
5443(define_insn "*subdf3_fpr"
5444  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5445	(minus:DF (match_operand:DF 1 "gpc_reg_operand" "f")
5446		  (match_operand:DF 2 "gpc_reg_operand" "f")))]
5447  "TARGET_HARD_FLOAT && TARGET_FPRS"
5448  "{fs|fsub} %0,%1,%2"
5449  [(set_attr "type" "fp")])
5450
5451(define_expand "muldf3"
5452  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5453	(mult:DF (match_operand:DF 1 "gpc_reg_operand" "")
5454		 (match_operand:DF 2 "gpc_reg_operand" "")))]
5455  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5456  "")
5457
5458(define_insn "*muldf3_fpr"
5459  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5460	(mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5461		 (match_operand:DF 2 "gpc_reg_operand" "f")))]
5462  "TARGET_HARD_FLOAT && TARGET_FPRS"
5463  "{fm|fmul} %0,%1,%2"
5464  [(set_attr "type" "dmul")])
5465
5466(define_insn "fred"
5467  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5468	(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRES))]
5469  "TARGET_POPCNTB && flag_finite_math_only"
5470  "fre %0,%1"
5471  [(set_attr "type" "fp")])
5472
5473(define_expand "divdf3"
5474  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5475	(div:DF (match_operand:DF 1 "gpc_reg_operand" "")
5476		(match_operand:DF 2 "gpc_reg_operand" "")))]
5477  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5478{
5479  if (swdiv && !optimize_size && TARGET_POPCNTB
5480  && flag_finite_math_only && !flag_trapping_math)
5481    {
5482      rs6000_emit_swdivdf (operands[0], operands[1], operands[2]);
5483      DONE;
5484    }
5485})
5486
5487(define_insn "*divdf3_fpr"
5488  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5489	(div:DF (match_operand:DF 1 "gpc_reg_operand" "f")
5490		(match_operand:DF 2 "gpc_reg_operand" "f")))]
5491  "TARGET_HARD_FLOAT && TARGET_FPRS"
5492  "{fd|fdiv} %0,%1,%2"
5493  [(set_attr "type" "ddiv")])
5494
5495(define_insn ""
5496  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5497	(plus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5498			  (match_operand:DF 2 "gpc_reg_operand" "f"))
5499		 (match_operand:DF 3 "gpc_reg_operand" "f")))]
5500  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5501  "{fma|fmadd} %0,%1,%2,%3"
5502  [(set_attr "type" "dmul")])
5503
5504(define_insn ""
5505  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5506	(minus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5507			   (match_operand:DF 2 "gpc_reg_operand" "f"))
5508		  (match_operand:DF 3 "gpc_reg_operand" "f")))]
5509  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD"
5510  "{fms|fmsub} %0,%1,%2,%3"
5511  [(set_attr "type" "dmul")])
5512
5513(define_insn ""
5514  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5515	(neg:DF (plus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5516				  (match_operand:DF 2 "gpc_reg_operand" "f"))
5517			 (match_operand:DF 3 "gpc_reg_operand" "f"))))]
5518  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5519   && HONOR_SIGNED_ZEROS (DFmode)"
5520  "{fnma|fnmadd} %0,%1,%2,%3"
5521  [(set_attr "type" "dmul")])
5522
5523(define_insn ""
5524  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5525	(minus:DF (mult:DF (neg:DF (match_operand:DF 1 "gpc_reg_operand" "f"))
5526			   (match_operand:DF 2 "gpc_reg_operand" "f"))
5527		  (match_operand:DF 3 "gpc_reg_operand" "f")))]
5528  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5529   && ! HONOR_SIGNED_ZEROS (DFmode)"
5530  "{fnma|fnmadd} %0,%1,%2,%3"
5531  [(set_attr "type" "dmul")])
5532
5533(define_insn ""
5534  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5535	(neg:DF (minus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5536				   (match_operand:DF 2 "gpc_reg_operand" "f"))
5537			  (match_operand:DF 3 "gpc_reg_operand" "f"))))]
5538  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5539   && HONOR_SIGNED_ZEROS (DFmode)"
5540  "{fnms|fnmsub} %0,%1,%2,%3"
5541  [(set_attr "type" "dmul")])
5542
5543(define_insn ""
5544  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5545	(minus:DF (match_operand:DF 3 "gpc_reg_operand" "f")
5546	          (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
5547			   (match_operand:DF 2 "gpc_reg_operand" "f"))))]
5548  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_FUSED_MADD
5549   && ! HONOR_SIGNED_ZEROS (DFmode)"
5550  "{fnms|fnmsub} %0,%1,%2,%3"
5551  [(set_attr "type" "dmul")])
5552
5553(define_insn "sqrtdf2"
5554  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5555	(sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
5556  "(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT && TARGET_FPRS"
5557  "fsqrt %0,%1"
5558  [(set_attr "type" "dsqrt")])
5559
5560;; The conditional move instructions allow us to perform max and min
5561;; operations even when
5562
5563(define_expand "smaxdf3"
5564  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5565	(if_then_else:DF (ge (match_operand:DF 1 "gpc_reg_operand" "")
5566			     (match_operand:DF 2 "gpc_reg_operand" ""))
5567			 (match_dup 1)
5568			 (match_dup 2)))]
5569  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5570  "{ rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]); DONE;}")
5571
5572(define_expand "smindf3"
5573  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5574	(if_then_else:DF (ge (match_operand:DF 1 "gpc_reg_operand" "")
5575			     (match_operand:DF 2 "gpc_reg_operand" ""))
5576			 (match_dup 2)
5577			 (match_dup 1)))]
5578  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5579  "{ rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]); DONE;}")
5580
5581(define_split
5582  [(set (match_operand:DF 0 "gpc_reg_operand" "")
5583	(match_operator:DF 3 "min_max_operator"
5584	 [(match_operand:DF 1 "gpc_reg_operand" "")
5585	  (match_operand:DF 2 "gpc_reg_operand" "")]))]
5586  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && !flag_trapping_math"
5587  [(const_int 0)]
5588  "
5589{ rs6000_emit_minmax (operands[0], GET_CODE (operands[3]),
5590		      operands[1], operands[2]);
5591  DONE;
5592}")
5593
5594(define_expand "movdfcc"
5595   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5596	 (if_then_else:DF (match_operand 1 "comparison_operator" "")
5597			  (match_operand:DF 2 "gpc_reg_operand" "")
5598			  (match_operand:DF 3 "gpc_reg_operand" "")))]
5599  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5600  "
5601{
5602  if (rs6000_emit_cmove (operands[0], operands[1], operands[2], operands[3]))
5603    DONE;
5604  else
5605    FAIL;
5606}")
5607
5608(define_insn "*fseldfdf4"
5609  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5610	(if_then_else:DF (ge (match_operand:DF 1 "gpc_reg_operand" "f")
5611			     (match_operand:DF 4 "zero_fp_constant" "F"))
5612			 (match_operand:DF 2 "gpc_reg_operand" "f")
5613			 (match_operand:DF 3 "gpc_reg_operand" "f")))]
5614  "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS"
5615  "fsel %0,%1,%2,%3"
5616  [(set_attr "type" "fp")])
5617
5618(define_insn "*fselsfdf4"
5619  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5620	(if_then_else:DF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
5621			     (match_operand:SF 4 "zero_fp_constant" "F"))
5622			 (match_operand:DF 2 "gpc_reg_operand" "f")
5623			 (match_operand:DF 3 "gpc_reg_operand" "f")))]
5624  "TARGET_PPC_GFXOPT"
5625  "fsel %0,%1,%2,%3"
5626  [(set_attr "type" "fp")])
5627
5628;; Conversions to and from floating-point.
5629
5630(define_expand "fixuns_truncsfsi2"
5631  [(set (match_operand:SI 0 "gpc_reg_operand" "")
5632	(unsigned_fix:SI (match_operand:SF 1 "gpc_reg_operand" "")))]
5633  "TARGET_HARD_FLOAT && !TARGET_FPRS"
5634  "")
5635
5636(define_expand "fix_truncsfsi2"
5637  [(set (match_operand:SI 0 "gpc_reg_operand" "")
5638	(fix:SI (match_operand:SF 1 "gpc_reg_operand" "")))]
5639  "TARGET_HARD_FLOAT && !TARGET_FPRS"
5640  "")
5641
5642; For each of these conversions, there is a define_expand, a define_insn
5643; with a '#' template, and a define_split (with C code).  The idea is
5644; to allow constant folding with the template of the define_insn,
5645; then to have the insns split later (between sched1 and final).
5646
5647(define_expand "floatsidf2"
5648  [(parallel [(set (match_operand:DF 0 "gpc_reg_operand" "")
5649		   (float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
5650	      (use (match_dup 2))
5651	      (use (match_dup 3))
5652	      (clobber (match_dup 4))
5653	      (clobber (match_dup 5))
5654	      (clobber (match_dup 6))])]
5655  "TARGET_HARD_FLOAT && TARGET_FPRS"
5656  "
5657{
5658  if (TARGET_E500_DOUBLE)
5659    {
5660      emit_insn (gen_spe_floatsidf2 (operands[0], operands[1]));
5661      DONE;
5662    }
5663  if (TARGET_POWERPC64)
5664    {
5665      rtx mem = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);
5666      rtx t1 = gen_reg_rtx (DImode);
5667      rtx t2 = gen_reg_rtx (DImode);
5668      emit_insn (gen_floatsidf_ppc64 (operands[0], operands[1], mem, t1, t2));
5669      DONE;
5670    }
5671
5672  operands[2] = force_reg (SImode, GEN_INT (0x43300000));
5673  operands[3] = force_reg (DFmode, CONST_DOUBLE_ATOF (\"4503601774854144\", DFmode));
5674  operands[4] = assign_stack_temp (DFmode, GET_MODE_SIZE (DFmode), 0);
5675  operands[5] = gen_reg_rtx (DFmode);
5676  operands[6] = gen_reg_rtx (SImode);
5677}")
5678
5679(define_insn_and_split "*floatsidf2_internal"
5680  [(set (match_operand:DF 0 "gpc_reg_operand" "=&f")
5681	(float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
5682   (use (match_operand:SI 2 "gpc_reg_operand" "r"))
5683   (use (match_operand:DF 3 "gpc_reg_operand" "f"))
5684   (clobber (match_operand:DF 4 "memory_operand" "=o"))
5685   (clobber (match_operand:DF 5 "gpc_reg_operand" "=&f"))
5686   (clobber (match_operand:SI 6 "gpc_reg_operand" "=&r"))]
5687  "! TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5688  "#"
5689  "&& (!no_new_pseudos || offsettable_nonstrict_memref_p (operands[4]))"
5690  [(pc)]
5691  "
5692{
5693  rtx lowword, highword;
5694  gcc_assert (MEM_P (operands[4]));
5695  highword = adjust_address (operands[4], SImode, 0);
5696  lowword = adjust_address (operands[4], SImode, 4);
5697  if (! WORDS_BIG_ENDIAN)
5698    {
5699      rtx tmp;
5700      tmp = highword; highword = lowword; lowword = tmp;
5701    }
5702
5703  emit_insn (gen_xorsi3 (operands[6], operands[1],
5704			 GEN_INT (~ (HOST_WIDE_INT) 0x7fffffff)));
5705  emit_move_insn (lowword, operands[6]);
5706  emit_move_insn (highword, operands[2]);
5707  emit_move_insn (operands[5], operands[4]);
5708  emit_insn (gen_subdf3 (operands[0], operands[5], operands[3]));
5709  DONE;
5710}"
5711  [(set_attr "length" "24")])
5712
5713(define_expand "floatunssisf2"
5714  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5715        (unsigned_float:SF (match_operand:SI 1 "gpc_reg_operand" "")))]
5716  "TARGET_HARD_FLOAT && !TARGET_FPRS"
5717  "")
5718
5719(define_expand "floatunssidf2"
5720  [(parallel [(set (match_operand:DF 0 "gpc_reg_operand" "")
5721		   (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
5722	      (use (match_dup 2))
5723	      (use (match_dup 3))
5724	      (clobber (match_dup 4))
5725	      (clobber (match_dup 5))])]
5726  "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5727  "
5728{
5729  if (TARGET_E500_DOUBLE)
5730    {
5731      emit_insn (gen_spe_floatunssidf2 (operands[0], operands[1]));
5732      DONE;
5733    }
5734  if (TARGET_POWERPC64)
5735    {
5736      rtx mem = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);
5737      rtx t1 = gen_reg_rtx (DImode);
5738      rtx t2 = gen_reg_rtx (DImode);
5739      emit_insn (gen_floatunssidf_ppc64 (operands[0], operands[1], mem,
5740					 t1, t2));
5741      DONE;
5742    }
5743
5744  operands[2] = force_reg (SImode, GEN_INT (0x43300000));
5745  operands[3] = force_reg (DFmode, CONST_DOUBLE_ATOF (\"4503599627370496\", DFmode));
5746  operands[4] = assign_stack_temp (DFmode, GET_MODE_SIZE (DFmode), 0);
5747  operands[5] = gen_reg_rtx (DFmode);
5748}")
5749
5750(define_insn_and_split "*floatunssidf2_internal"
5751  [(set (match_operand:DF 0 "gpc_reg_operand" "=&f")
5752	(unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
5753   (use (match_operand:SI 2 "gpc_reg_operand" "r"))
5754   (use (match_operand:DF 3 "gpc_reg_operand" "f"))
5755   (clobber (match_operand:DF 4 "memory_operand" "=o"))
5756   (clobber (match_operand:DF 5 "gpc_reg_operand" "=&f"))]
5757  "! TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5758  "#"
5759  "&& (!no_new_pseudos || offsettable_nonstrict_memref_p (operands[4]))"
5760  [(pc)]
5761  "
5762{
5763  rtx lowword, highword;
5764  gcc_assert (MEM_P (operands[4]));
5765  highword = adjust_address (operands[4], SImode, 0);
5766  lowword = adjust_address (operands[4], SImode, 4);
5767  if (! WORDS_BIG_ENDIAN)
5768    {
5769      rtx tmp;
5770      tmp = highword; highword = lowword; lowword = tmp;
5771    }
5772
5773  emit_move_insn (lowword, operands[1]);
5774  emit_move_insn (highword, operands[2]);
5775  emit_move_insn (operands[5], operands[4]);
5776  emit_insn (gen_subdf3 (operands[0], operands[5], operands[3]));
5777  DONE;
5778}"
5779  [(set_attr "length" "20")])
5780
5781(define_expand "fix_truncdfsi2"
5782  [(parallel [(set (match_operand:SI 0 "fix_trunc_dest_operand" "")
5783		   (fix:SI (match_operand:DF 1 "gpc_reg_operand" "")))
5784	      (clobber (match_dup 2))
5785	      (clobber (match_dup 3))])]
5786  "(TARGET_POWER2 || TARGET_POWERPC)
5787   && TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
5788  "
5789{
5790  if (TARGET_E500_DOUBLE)
5791    {
5792     emit_insn (gen_spe_fix_truncdfsi2 (operands[0], operands[1]));
5793     DONE;
5794    }
5795  operands[2] = gen_reg_rtx (DImode);
5796  if (TARGET_PPC_GFXOPT)
5797    {
5798      rtx orig_dest = operands[0];
5799      if (! memory_operand (orig_dest, GET_MODE (orig_dest)))
5800	operands[0] = assign_stack_temp (SImode, GET_MODE_SIZE (SImode), 0);
5801      emit_insn (gen_fix_truncdfsi2_internal_gfxopt (operands[0], operands[1],
5802						     operands[2]));
5803      if (operands[0] != orig_dest)
5804	emit_move_insn (orig_dest, operands[0]);
5805      DONE;
5806    }
5807  operands[3] = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);
5808}")
5809
5810(define_insn_and_split "*fix_truncdfsi2_internal"
5811  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
5812	(fix:SI (match_operand:DF 1 "gpc_reg_operand" "f")))
5813   (clobber (match_operand:DI 2 "gpc_reg_operand" "=f"))
5814   (clobber (match_operand:DI 3 "memory_operand" "=o"))]
5815  "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT && TARGET_FPRS"
5816  "#"
5817  "&& (!no_new_pseudos || offsettable_nonstrict_memref_p (operands[3]))"
5818  [(pc)]
5819  "
5820{
5821  rtx lowword;
5822  gcc_assert (MEM_P (operands[3]));
5823  lowword = adjust_address (operands[3], SImode, WORDS_BIG_ENDIAN ? 4 : 0);
5824
5825  emit_insn (gen_fctiwz (operands[2], operands[1]));
5826  emit_move_insn (operands[3], operands[2]);
5827  emit_move_insn (operands[0], lowword);
5828  DONE;
5829}"
5830  [(set_attr "length" "16")])
5831
5832(define_insn_and_split "fix_truncdfsi2_internal_gfxopt"
5833  [(set (match_operand:SI 0 "memory_operand" "=Z")
5834	(fix:SI (match_operand:DF 1 "gpc_reg_operand" "f")))
5835   (clobber (match_operand:DI 2 "gpc_reg_operand" "=f"))]
5836  "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT && TARGET_FPRS
5837   && TARGET_PPC_GFXOPT"
5838  "#"
5839  "&& 1"
5840  [(pc)]
5841  "
5842{
5843  emit_insn (gen_fctiwz (operands[2], operands[1]));
5844  emit_insn (gen_stfiwx (operands[0], operands[2]));
5845  DONE;
5846}"
5847  [(set_attr "length" "16")])
5848
5849; Here, we use (set (reg) (unspec:DI [(fix:SI ...)] UNSPEC_FCTIWZ))
5850; rather than (set (subreg:SI (reg)) (fix:SI ...))
5851; because the first makes it clear that operand 0 is not live
5852; before the instruction.
5853(define_insn "fctiwz"
5854  [(set (match_operand:DI 0 "gpc_reg_operand" "=f")
5855	(unspec:DI [(fix:SI (match_operand:DF 1 "gpc_reg_operand" "f"))]
5856		   UNSPEC_FCTIWZ))]
5857  "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT && TARGET_FPRS"
5858  "{fcirz|fctiwz} %0,%1"
5859  [(set_attr "type" "fp")])
5860
5861(define_insn "btruncdf2"
5862  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5863	(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIZ))]
5864  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5865  "friz %0,%1"
5866  [(set_attr "type" "fp")])
5867
5868(define_insn "btruncsf2"
5869  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5870	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIZ))]
5871  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5872  "friz %0,%1"
5873  [(set_attr "type" "fp")])
5874
5875(define_insn "ceildf2"
5876  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5877	(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIP))]
5878  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5879  "frip %0,%1"
5880  [(set_attr "type" "fp")])
5881
5882(define_insn "ceilsf2"
5883 [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5884	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIP))]
5885  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5886  "frip %0,%1"
5887  [(set_attr "type" "fp")])
5888
5889(define_insn "floordf2"
5890  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5891	(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIM))]
5892  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5893  "frim %0,%1"
5894  [(set_attr "type" "fp")])
5895
5896(define_insn "floorsf2"
5897  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5898	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIM))]
5899  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5900  "frim %0,%1"
5901  [(set_attr "type" "fp")])
5902
5903(define_insn "rounddf2"
5904  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5905	(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIN))]
5906  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5907  "frin %0,%1"
5908  [(set_attr "type" "fp")])
5909
5910(define_insn "roundsf2"
5911  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5912	(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIN))]
5913  "TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
5914  "frin %0,%1"
5915  [(set_attr "type" "fp")])
5916
5917; An UNSPEC is used so we don't have to support SImode in FP registers.
5918(define_insn "stfiwx"
5919  [(set (match_operand:SI 0 "memory_operand" "=Z")
5920	(unspec:SI [(match_operand:DI 1 "gpc_reg_operand" "f")]
5921		   UNSPEC_STFIWX))]
5922  "TARGET_PPC_GFXOPT"
5923  "stfiwx %1,%y0"
5924  [(set_attr "type" "fpstore")])
5925
5926(define_expand "floatsisf2"
5927  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5928        (float:SF (match_operand:SI 1 "gpc_reg_operand" "")))]
5929  "TARGET_HARD_FLOAT && !TARGET_FPRS"
5930  "")
5931
5932(define_insn "floatdidf2"
5933  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5934	(float:DF (match_operand:DI 1 "gpc_reg_operand" "*f")))]
5935  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5936  "fcfid %0,%1"
5937  [(set_attr "type" "fp")])
5938
5939(define_insn_and_split "floatsidf_ppc64"
5940  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5941	(float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
5942   (clobber (match_operand:DI 2 "memory_operand" "=o"))
5943   (clobber (match_operand:DI 3 "gpc_reg_operand" "=r"))
5944   (clobber (match_operand:DI 4 "gpc_reg_operand" "=f"))]
5945  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5946  "#"
5947  "&& 1"
5948  [(set (match_dup 3) (sign_extend:DI (match_dup 1)))
5949   (set (match_dup 2) (match_dup 3))
5950   (set (match_dup 4) (match_dup 2))
5951   (set (match_dup 0) (float:DF (match_dup 4)))]
5952  "")
5953
5954(define_insn_and_split "floatunssidf_ppc64"
5955  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
5956	(unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
5957   (clobber (match_operand:DI 2 "memory_operand" "=o"))
5958   (clobber (match_operand:DI 3 "gpc_reg_operand" "=r"))
5959   (clobber (match_operand:DI 4 "gpc_reg_operand" "=f"))]
5960  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5961  "#"
5962  "&& 1"
5963  [(set (match_dup 3) (zero_extend:DI (match_dup 1)))
5964   (set (match_dup 2) (match_dup 3))
5965   (set (match_dup 4) (match_dup 2))
5966   (set (match_dup 0) (float:DF (match_dup 4)))]
5967  "")
5968
5969(define_insn "fix_truncdfdi2"
5970  [(set (match_operand:DI 0 "gpc_reg_operand" "=*f")
5971	(fix:DI (match_operand:DF 1 "gpc_reg_operand" "f")))]
5972  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5973  "fctidz %0,%1"
5974  [(set_attr "type" "fp")])
5975
5976(define_expand "floatdisf2"
5977  [(set (match_operand:SF 0 "gpc_reg_operand" "")
5978        (float:SF (match_operand:DI 1 "gpc_reg_operand" "")))]
5979  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
5980  "
5981{
5982  rtx val = operands[1];
5983  if (!flag_unsafe_math_optimizations)
5984    {
5985      rtx label = gen_label_rtx ();
5986      val = gen_reg_rtx (DImode);
5987      emit_insn (gen_floatdisf2_internal2 (val, operands[1], label));
5988      emit_label (label);
5989    }
5990  emit_insn (gen_floatdisf2_internal1 (operands[0], val));
5991  DONE;
5992}")
5993
5994;; This is not IEEE compliant if rounding mode is "round to nearest".
5995;; If the DI->DF conversion is inexact, then it's possible to suffer
5996;; from double rounding.
5997(define_insn_and_split "floatdisf2_internal1"
5998  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
5999        (float:SF (match_operand:DI 1 "gpc_reg_operand" "*f")))
6000   (clobber (match_scratch:DF 2 "=f"))]
6001  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
6002  "#"
6003  "&& reload_completed"
6004  [(set (match_dup 2)
6005        (float:DF (match_dup 1)))
6006   (set (match_dup 0)
6007        (float_truncate:SF (match_dup 2)))]
6008  "")
6009
6010;; Twiddles bits to avoid double rounding.
6011;; Bits that might be truncated when converting to DFmode are replaced
6012;; by a bit that won't be lost at that stage, but is below the SFmode
6013;; rounding position.
6014(define_expand "floatdisf2_internal2"
6015  [(set (match_dup 3) (ashiftrt:DI (match_operand:DI 1 "" "")
6016				   (const_int 53)))
6017   (parallel [(set (match_operand:DI 0 "" "") (and:DI (match_dup 1)
6018						      (const_int 2047)))
6019	      (clobber (scratch:CC))])
6020   (set (match_dup 3) (plus:DI (match_dup 3)
6021			       (const_int 1)))
6022   (set (match_dup 0) (plus:DI (match_dup 0)
6023			       (const_int 2047)))
6024   (set (match_dup 4) (compare:CCUNS (match_dup 3)
6025				     (const_int 2)))
6026   (set (match_dup 0) (ior:DI (match_dup 0)
6027			      (match_dup 1)))
6028   (parallel [(set (match_dup 0) (and:DI (match_dup 0)
6029					 (const_int -2048)))
6030	      (clobber (scratch:CC))])
6031   (set (pc) (if_then_else (geu (match_dup 4) (const_int 0))
6032			   (label_ref (match_operand:DI 2 "" ""))
6033			   (pc)))
6034   (set (match_dup 0) (match_dup 1))]
6035  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
6036  "
6037{
6038  operands[3] = gen_reg_rtx (DImode);
6039  operands[4] = gen_reg_rtx (CCUNSmode);
6040}")
6041
6042;; Define the DImode operations that can be done in a small number
6043;; of instructions.  The & constraints are to prevent the register
6044;; allocator from allocating registers that overlap with the inputs
6045;; (for example, having an input in 7,8 and an output in 6,7).  We
6046;; also allow for the output being the same as one of the inputs.
6047
6048(define_insn "*adddi3_noppc64"
6049  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r,r,r")
6050	(plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,0,0")
6051		 (match_operand:DI 2 "reg_or_short_operand" "r,I,r,I")))]
6052  "! TARGET_POWERPC64"
6053  "*
6054{
6055  if (WORDS_BIG_ENDIAN)
6056    return (GET_CODE (operands[2])) != CONST_INT
6057	    ? \"{a|addc} %L0,%L1,%L2\;{ae|adde} %0,%1,%2\"
6058	    : \"{ai|addic} %L0,%L1,%2\;{a%G2e|add%G2e} %0,%1\";
6059  else
6060    return (GET_CODE (operands[2])) != CONST_INT
6061	    ? \"{a|addc} %0,%1,%2\;{ae|adde} %L0,%L1,%L2\"
6062	    : \"{ai|addic} %0,%1,%2\;{a%G2e|add%G2e} %L0,%L1\";
6063}"
6064  [(set_attr "type" "two")
6065   (set_attr "length" "8")])
6066
6067(define_insn "*subdi3_noppc64"
6068  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r,r,r,r")
6069	(minus:DI (match_operand:DI 1 "reg_or_short_operand" "r,I,0,r,I")
6070		  (match_operand:DI 2 "gpc_reg_operand" "r,r,r,0,0")))]
6071  "! TARGET_POWERPC64"
6072  "*
6073{
6074  if (WORDS_BIG_ENDIAN)
6075    return (GET_CODE (operands[1]) != CONST_INT)
6076	    ? \"{sf|subfc} %L0,%L2,%L1\;{sfe|subfe} %0,%2,%1\"
6077	    : \"{sfi|subfic} %L0,%L2,%1\;{sf%G1e|subf%G1e} %0,%2\";
6078  else
6079    return (GET_CODE (operands[1]) != CONST_INT)
6080	    ? \"{sf|subfc} %0,%2,%1\;{sfe|subfe} %L0,%L2,%L1\"
6081	    : \"{sfi|subfic} %0,%2,%1\;{sf%G1e|subf%G1e} %L0,%L2\";
6082}"
6083  [(set_attr "type" "two")
6084   (set_attr "length" "8")])
6085
6086(define_insn "*negdi2_noppc64"
6087  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
6088	(neg:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))]
6089  "! TARGET_POWERPC64"
6090  "*
6091{
6092  return (WORDS_BIG_ENDIAN)
6093    ? \"{sfi|subfic} %L0,%L1,0\;{sfze|subfze} %0,%1\"
6094    : \"{sfi|subfic} %0,%1,0\;{sfze|subfze} %L0,%L1\";
6095}"
6096  [(set_attr "type" "two")
6097   (set_attr "length" "8")])
6098
6099(define_expand "mulsidi3"
6100  [(set (match_operand:DI 0 "gpc_reg_operand" "")
6101	(mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
6102		 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
6103  "! TARGET_POWERPC64"
6104  "
6105{
6106  if (! TARGET_POWER && ! TARGET_POWERPC)
6107    {
6108      emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
6109      emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
6110      emit_insn (gen_mull_call ());
6111      if (WORDS_BIG_ENDIAN)
6112        emit_move_insn (operands[0], gen_rtx_REG (DImode, 3));
6113      else
6114	{
6115	  emit_move_insn (operand_subword (operands[0], 0, 0, DImode),
6116			  gen_rtx_REG (SImode, 3));
6117	  emit_move_insn (operand_subword (operands[0], 1, 0, DImode),
6118			  gen_rtx_REG (SImode, 4));
6119	}
6120      DONE;
6121    }
6122  else if (TARGET_POWER)
6123    {
6124      emit_insn (gen_mulsidi3_mq (operands[0], operands[1], operands[2]));
6125      DONE;
6126    }
6127}")
6128
6129(define_insn "mulsidi3_mq"
6130  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6131	(mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
6132		 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
6133   (clobber (match_scratch:SI 3 "=q"))]
6134  "TARGET_POWER"
6135  "mul %0,%1,%2\;mfmq %L0"
6136  [(set_attr "type" "imul")
6137   (set_attr "length" "8")])
6138
6139(define_insn "*mulsidi3_no_mq"
6140  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
6141	(mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
6142		 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
6143  "TARGET_POWERPC && ! TARGET_POWER && ! TARGET_POWERPC64"
6144  "*
6145{
6146  return (WORDS_BIG_ENDIAN)
6147    ? \"mulhw %0,%1,%2\;mullw %L0,%1,%2\"
6148    : \"mulhw %L0,%1,%2\;mullw %0,%1,%2\";
6149}"
6150  [(set_attr "type" "imul")
6151   (set_attr "length" "8")])
6152
6153(define_split
6154  [(set (match_operand:DI 0 "gpc_reg_operand" "")
6155	(mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
6156		 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
6157  "TARGET_POWERPC && ! TARGET_POWERPC64 && reload_completed"
6158  [(set (match_dup 3)
6159	(truncate:SI
6160	 (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
6161			       (sign_extend:DI (match_dup 2)))
6162		      (const_int 32))))
6163   (set (match_dup 4)
6164	(mult:SI (match_dup 1)
6165		 (match_dup 2)))]
6166  "
6167{
6168  int endian = (WORDS_BIG_ENDIAN == 0);
6169  operands[3] = operand_subword (operands[0], endian, 0, DImode);
6170  operands[4] = operand_subword (operands[0], 1 - endian, 0, DImode);
6171}")
6172
6173(define_expand "umulsidi3"
6174  [(set (match_operand:DI 0 "gpc_reg_operand" "")
6175	(mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
6176		 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
6177  "TARGET_POWERPC && ! TARGET_POWERPC64"
6178  "
6179{
6180  if (TARGET_POWER)
6181    {
6182      emit_insn (gen_umulsidi3_mq (operands[0], operands[1], operands[2]));
6183      DONE;
6184    }
6185}")
6186
6187(define_insn "umulsidi3_mq"
6188  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
6189	(mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
6190		 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
6191   (clobber (match_scratch:SI 3 "=q"))]
6192  "TARGET_POWERPC && TARGET_POWER"
6193  "*
6194{
6195  return (WORDS_BIG_ENDIAN)
6196    ? \"mulhwu %0,%1,%2\;mullw %L0,%1,%2\"
6197    : \"mulhwu %L0,%1,%2\;mullw %0,%1,%2\";
6198}"
6199  [(set_attr "type" "imul")
6200   (set_attr "length" "8")])
6201
6202(define_insn "*umulsidi3_no_mq"
6203  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
6204	(mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
6205		 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
6206  "TARGET_POWERPC && ! TARGET_POWER && ! TARGET_POWERPC64"
6207  "*
6208{
6209  return (WORDS_BIG_ENDIAN)
6210    ? \"mulhwu %0,%1,%2\;mullw %L0,%1,%2\"
6211    : \"mulhwu %L0,%1,%2\;mullw %0,%1,%2\";
6212}"
6213  [(set_attr "type" "imul")
6214   (set_attr "length" "8")])
6215
6216(define_split
6217  [(set (match_operand:DI 0 "gpc_reg_operand" "")
6218	(mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
6219		 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
6220  "TARGET_POWERPC && ! TARGET_POWERPC64 && reload_completed"
6221  [(set (match_dup 3)
6222	(truncate:SI
6223	 (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
6224			       (zero_extend:DI (match_dup 2)))
6225		      (const_int 32))))
6226   (set (match_dup 4)
6227	(mult:SI (match_dup 1)
6228		 (match_dup 2)))]
6229  "
6230{
6231  int endian = (WORDS_BIG_ENDIAN == 0);
6232  operands[3] = operand_subword (operands[0], endian, 0, DImode);
6233  operands[4] = operand_subword (operands[0], 1 - endian, 0, DImode);
6234}")
6235
6236(define_expand "smulsi3_highpart"
6237  [(set (match_operand:SI 0 "gpc_reg_operand" "")
6238	(truncate:SI
6239	 (lshiftrt:DI (mult:DI (sign_extend:DI
6240				(match_operand:SI 1 "gpc_reg_operand" "%r"))
6241			       (sign_extend:DI
6242				(match_operand:SI 2 "gpc_reg_operand" "r")))
6243		      (const_int 32))))]
6244  ""
6245  "
6246{
6247  if (! TARGET_POWER && ! TARGET_POWERPC)
6248    {
6249      emit_move_insn (gen_rtx_REG (SImode, 3), operands[1]);
6250      emit_move_insn (gen_rtx_REG (SImode, 4), operands[2]);
6251      emit_insn (gen_mulh_call ());
6252      emit_move_insn (operands[0], gen_rtx_REG (SImode, 3));
6253      DONE;
6254    }
6255  else if (TARGET_POWER)
6256    {
6257      emit_insn (gen_smulsi3_highpart_mq (operands[0], operands[1], operands[2]));
6258      DONE;
6259    }
6260}")
6261
6262(define_insn "smulsi3_highpart_mq"
6263  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
6264	(truncate:SI
6265	 (lshiftrt:DI (mult:DI (sign_extend:DI
6266				(match_operand:SI 1 "gpc_reg_operand" "%r"))
6267			       (sign_extend:DI
6268				(match_operand:SI 2 "gpc_reg_operand" "r")))
6269		      (const_int 32))))
6270   (clobber (match_scratch:SI 3 "=q"))]
6271  "TARGET_POWER"
6272  "mul %0,%1,%2"
6273  [(set_attr "type" "imul")])
6274
6275(define_insn "*smulsi3_highpart_no_mq"
6276  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
6277	(truncate:SI
6278	 (lshiftrt:DI (mult:DI (sign_extend:DI
6279				(match_operand:SI 1 "gpc_reg_operand" "%r"))
6280			       (sign_extend:DI
6281				(match_operand:SI 2 "gpc_reg_operand" "r")))
6282		      (const_int 32))))]
6283  "TARGET_POWERPC && ! TARGET_POWER"
6284  "mulhw %0,%1,%2"
6285  [(set_attr "type" "imul")])
6286
6287(define_expand "umulsi3_highpart"
6288  [(set (match_operand:SI 0 "gpc_reg_operand" "")
6289	(truncate:SI
6290	 (lshiftrt:DI (mult:DI (zero_extend:DI
6291				(match_operand:SI 1 "gpc_reg_operand" ""))
6292			       (zero_extend:DI
6293				(match_operand:SI 2 "gpc_reg_operand" "")))
6294		      (const_int 32))))]
6295  "TARGET_POWERPC"
6296  "
6297{
6298  if (TARGET_POWER)
6299    {
6300      emit_insn (gen_umulsi3_highpart_mq (operands[0], operands[1], operands[2]));
6301      DONE;
6302    }
6303}")
6304
6305(define_insn "umulsi3_highpart_mq"
6306  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
6307	(truncate:SI
6308	 (lshiftrt:DI (mult:DI (zero_extend:DI
6309				(match_operand:SI 1 "gpc_reg_operand" "%r"))
6310			       (zero_extend:DI
6311				(match_operand:SI 2 "gpc_reg_operand" "r")))
6312		      (const_int 32))))
6313   (clobber (match_scratch:SI 3 "=q"))]
6314  "TARGET_POWERPC && TARGET_POWER"
6315  "mulhwu %0,%1,%2"
6316  [(set_attr "type" "imul")])
6317
6318(define_insn "*umulsi3_highpart_no_mq"
6319  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
6320	(truncate:SI
6321	 (lshiftrt:DI (mult:DI (zero_extend:DI
6322				(match_operand:SI 1 "gpc_reg_operand" "%r"))
6323			       (zero_extend:DI
6324				(match_operand:SI 2 "gpc_reg_operand" "r")))
6325		      (const_int 32))))]
6326  "TARGET_POWERPC && ! TARGET_POWER"
6327  "mulhwu %0,%1,%2"
6328  [(set_attr "type" "imul")])
6329
6330;; If operands 0 and 2 are in the same register, we have a problem.  But
6331;; operands 0 and 1 (the usual case) can be in the same register.  That's
6332;; why we have the strange constraints below.
6333(define_insn "ashldi3_power"
6334  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,&r")
6335	(ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r,0,r")
6336		   (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
6337   (clobber (match_scratch:SI 3 "=X,q,q,q"))]
6338  "TARGET_POWER"
6339  "@
6340   {sli|slwi} %0,%L1,%h2\;{cal %L0,0(0)|li %L0,0}
6341   sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
6342   sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
6343   sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2"
6344  [(set_attr "length" "8")])
6345
6346(define_insn "lshrdi3_power"
6347  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,&r")
6348	(lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r,0,r")
6349		     (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
6350   (clobber (match_scratch:SI 3 "=X,q,q,q"))]
6351  "TARGET_POWER"
6352  "@
6353   {s%A2i|s%A2wi} %L0,%1,%h2\;{cal %0,0(0)|li %0,0}
6354   sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2
6355   sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2
6356   sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2"
6357  [(set_attr "length" "8")])
6358
6359;; Shift by a variable amount is too complex to be worth open-coding.  We
6360;; just handle shifts by constants.
6361(define_insn "ashrdi3_power"
6362  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
6363	(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6364		     (match_operand:SI 2 "const_int_operand" "M,i")))
6365   (clobber (match_scratch:SI 3 "=X,q"))]
6366  "TARGET_POWER"
6367  "@
6368   {srai|srawi} %0,%1,31\;{srai|srawi} %L0,%1,%h2
6369   sraiq %0,%1,%h2\;srliq %L0,%L1,%h2"
6370  [(set_attr "length" "8")])
6371
6372(define_insn "ashrdi3_no_power"
6373  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
6374	(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6375		     (match_operand:SI 2 "const_int_operand" "M,i")))]
6376  "TARGET_32BIT && !TARGET_POWERPC64 && !TARGET_POWER && WORDS_BIG_ENDIAN"
6377  "@
6378   {srai|srawi} %0,%1,31\;{srai|srawi} %L0,%1,%h2
6379   {sri|srwi} %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;{srai|srawi} %0,%1,%h2"
6380  [(set_attr "type" "two,three")
6381   (set_attr "length" "8,12")])
6382
6383(define_insn "*ashrdisi3_noppc64"
6384  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
6385        (subreg:SI (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6386                                (const_int 32)) 4))]
6387  "TARGET_32BIT && !TARGET_POWERPC64"
6388  "*
6389{
6390  if (REGNO (operands[0]) == REGNO (operands[1]))
6391    return \"\";
6392  else
6393    return \"mr %0,%1\";
6394}"
6395   [(set_attr "length" "4")])
6396
6397
6398;; PowerPC64 DImode operations.
6399
6400(define_insn_and_split "absdi2"
6401  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
6402        (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))
6403   (clobber (match_scratch:DI 2 "=&r,&r"))]
6404  "TARGET_POWERPC64"
6405  "#"
6406  "&& reload_completed"
6407  [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 63)))
6408   (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
6409   (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 2)))]
6410  "")
6411
6412(define_insn_and_split "*nabsdi2"
6413  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
6414        (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0"))))
6415   (clobber (match_scratch:DI 2 "=&r,&r"))]
6416  "TARGET_POWERPC64"
6417  "#"
6418  "&& reload_completed"
6419  [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 63)))
6420   (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
6421   (set (match_dup 0) (minus:DI (match_dup 2) (match_dup 0)))]
6422  "")
6423
6424(define_insn "muldi3"
6425  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6426        (mult:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
6427                 (match_operand:DI 2 "reg_or_short_operand" "r,I")))]
6428  "TARGET_POWERPC64"
6429  "@
6430   mulld %0,%1,%2
6431   mulli %0,%1,%2"
6432   [(set (attr "type")
6433      (cond [(match_operand:SI 2 "s8bit_cint_operand" "")
6434		(const_string "imul3")
6435	     (match_operand:SI 2 "short_cint_operand" "")
6436		(const_string "imul2")]
6437	(const_string "lmul")))])
6438
6439(define_insn "*muldi3_internal1"
6440  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6441	(compare:CC (mult:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
6442			     (match_operand:DI 2 "gpc_reg_operand" "r,r"))
6443		    (const_int 0)))
6444   (clobber (match_scratch:DI 3 "=r,r"))]
6445  "TARGET_POWERPC64"
6446  "@
6447   mulld. %3,%1,%2
6448   #"
6449  [(set_attr "type" "lmul_compare")
6450   (set_attr "length" "4,8")])
6451
6452(define_split
6453  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6454	(compare:CC (mult:DI (match_operand:DI 1 "gpc_reg_operand" "")
6455			     (match_operand:DI 2 "gpc_reg_operand" ""))
6456		    (const_int 0)))
6457   (clobber (match_scratch:DI 3 ""))]
6458  "TARGET_POWERPC64 && reload_completed"
6459  [(set (match_dup 3)
6460	(mult:DI (match_dup 1) (match_dup 2)))
6461   (set (match_dup 0)
6462	(compare:CC (match_dup 3)
6463		    (const_int 0)))]
6464  "")
6465
6466(define_insn "*muldi3_internal2"
6467  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6468	(compare:CC (mult:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
6469			     (match_operand:DI 2 "gpc_reg_operand" "r,r"))
6470		    (const_int 0)))
6471   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6472	(mult:DI (match_dup 1) (match_dup 2)))]
6473  "TARGET_POWERPC64"
6474  "@
6475   mulld. %0,%1,%2
6476   #"
6477  [(set_attr "type" "lmul_compare")
6478   (set_attr "length" "4,8")])
6479
6480(define_split
6481  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6482	(compare:CC (mult:DI (match_operand:DI 1 "gpc_reg_operand" "")
6483			     (match_operand:DI 2 "gpc_reg_operand" ""))
6484		    (const_int 0)))
6485   (set (match_operand:DI 0 "gpc_reg_operand" "")
6486	(mult:DI (match_dup 1) (match_dup 2)))]
6487  "TARGET_POWERPC64 && reload_completed"
6488  [(set (match_dup 0)
6489	(mult:DI (match_dup 1) (match_dup 2)))
6490   (set (match_dup 3)
6491	(compare:CC (match_dup 0)
6492		    (const_int 0)))]
6493  "")
6494
6495(define_insn "smuldi3_highpart"
6496  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6497	(truncate:DI
6498	 (lshiftrt:TI (mult:TI (sign_extend:TI
6499				(match_operand:DI 1 "gpc_reg_operand" "%r"))
6500			       (sign_extend:TI
6501				(match_operand:DI 2 "gpc_reg_operand" "r")))
6502		      (const_int 64))))]
6503  "TARGET_POWERPC64"
6504  "mulhd %0,%1,%2"
6505  [(set_attr "type" "lmul")])
6506
6507(define_insn "umuldi3_highpart"
6508  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6509	(truncate:DI
6510	 (lshiftrt:TI (mult:TI (zero_extend:TI
6511				(match_operand:DI 1 "gpc_reg_operand" "%r"))
6512			       (zero_extend:TI
6513				(match_operand:DI 2 "gpc_reg_operand" "r")))
6514		      (const_int 64))))]
6515  "TARGET_POWERPC64"
6516  "mulhdu %0,%1,%2"
6517  [(set_attr "type" "lmul")])
6518
6519(define_insn "rotldi3"
6520  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6521	(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6522		   (match_operand:DI 2 "reg_or_cint_operand" "ri")))]
6523  "TARGET_POWERPC64"
6524  "rld%I2cl %0,%1,%H2,0")
6525
6526(define_insn "*rotldi3_internal2"
6527  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6528	(compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6529			       (match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
6530		    (const_int 0)))
6531   (clobber (match_scratch:DI 3 "=r,r"))]
6532  "TARGET_64BIT"
6533  "@
6534   rld%I2cl. %3,%1,%H2,0
6535   #"
6536  [(set_attr "type" "delayed_compare")
6537   (set_attr "length" "4,8")])
6538
6539(define_split
6540  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6541	(compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6542			       (match_operand:DI 2 "reg_or_cint_operand" ""))
6543		    (const_int 0)))
6544   (clobber (match_scratch:DI 3 ""))]
6545  "TARGET_POWERPC64 && reload_completed"
6546  [(set (match_dup 3)
6547	(rotate:DI (match_dup 1) (match_dup 2)))
6548   (set (match_dup 0)
6549	(compare:CC (match_dup 3)
6550		    (const_int 0)))]
6551  "")
6552
6553(define_insn "*rotldi3_internal3"
6554  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6555	(compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6556			       (match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
6557		    (const_int 0)))
6558   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6559	(rotate:DI (match_dup 1) (match_dup 2)))]
6560  "TARGET_64BIT"
6561  "@
6562   rld%I2cl. %0,%1,%H2,0
6563   #"
6564  [(set_attr "type" "delayed_compare")
6565   (set_attr "length" "4,8")])
6566
6567(define_split
6568  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6569	(compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6570			       (match_operand:DI 2 "reg_or_cint_operand" ""))
6571		    (const_int 0)))
6572   (set (match_operand:DI 0 "gpc_reg_operand" "")
6573	(rotate:DI (match_dup 1) (match_dup 2)))]
6574  "TARGET_POWERPC64 && reload_completed"
6575  [(set (match_dup 0)
6576	(rotate:DI (match_dup 1) (match_dup 2)))
6577   (set (match_dup 3)
6578	(compare:CC (match_dup 0)
6579		    (const_int 0)))]
6580  "")
6581
6582(define_insn "*rotldi3_internal4"
6583  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6584	(and:DI (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6585			   (match_operand:DI 2 "reg_or_cint_operand" "ri"))
6586		(match_operand:DI 3 "mask64_operand" "n")))]
6587  "TARGET_POWERPC64"
6588  "rld%I2c%B3 %0,%1,%H2,%S3")
6589
6590(define_insn "*rotldi3_internal5"
6591  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6592	(compare:CC (and:DI
6593		     (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6594				(match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
6595		     (match_operand:DI 3 "mask64_operand" "n,n"))
6596		    (const_int 0)))
6597   (clobber (match_scratch:DI 4 "=r,r"))]
6598  "TARGET_64BIT"
6599  "@
6600   rld%I2c%B3. %4,%1,%H2,%S3
6601   #"
6602  [(set_attr "type" "delayed_compare")
6603   (set_attr "length" "4,8")])
6604
6605(define_split
6606  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6607	(compare:CC (and:DI
6608		     (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6609				(match_operand:DI 2 "reg_or_cint_operand" ""))
6610		     (match_operand:DI 3 "mask64_operand" ""))
6611		    (const_int 0)))
6612   (clobber (match_scratch:DI 4 ""))]
6613  "TARGET_POWERPC64 && reload_completed"
6614  [(set (match_dup 4)
6615	(and:DI (rotate:DI (match_dup 1)
6616				(match_dup 2))
6617		     (match_dup 3)))
6618   (set (match_dup 0)
6619	(compare:CC (match_dup 4)
6620		    (const_int 0)))]
6621  "")
6622
6623(define_insn "*rotldi3_internal6"
6624  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
6625	(compare:CC (and:DI
6626		     (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6627				(match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
6628		     (match_operand:DI 3 "mask64_operand" "n,n"))
6629		    (const_int 0)))
6630   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6631	(and:DI (rotate:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
6632  "TARGET_64BIT"
6633  "@
6634   rld%I2c%B3. %0,%1,%H2,%S3
6635   #"
6636  [(set_attr "type" "delayed_compare")
6637   (set_attr "length" "4,8")])
6638
6639(define_split
6640  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
6641	(compare:CC (and:DI
6642		     (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6643				(match_operand:DI 2 "reg_or_cint_operand" ""))
6644		     (match_operand:DI 3 "mask64_operand" ""))
6645		    (const_int 0)))
6646   (set (match_operand:DI 0 "gpc_reg_operand" "")
6647	(and:DI (rotate:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
6648  "TARGET_POWERPC64 && reload_completed"
6649  [(set (match_dup 0)
6650	(and:DI (rotate:DI (match_dup 1) (match_dup 2)) (match_dup 3)))
6651   (set (match_dup 4)
6652	(compare:CC (match_dup 0)
6653		    (const_int 0)))]
6654  "")
6655
6656(define_insn "*rotldi3_internal7"
6657  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6658	(zero_extend:DI
6659	 (subreg:QI
6660	  (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6661		     (match_operand:DI 2 "reg_or_cint_operand" "ri")) 0)))]
6662  "TARGET_POWERPC64"
6663  "rld%I2cl %0,%1,%H2,56")
6664
6665(define_insn "*rotldi3_internal8"
6666  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6667	(compare:CC (zero_extend:DI
6668		     (subreg:QI
6669		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6670				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6671		    (const_int 0)))
6672   (clobber (match_scratch:DI 3 "=r,r"))]
6673  "TARGET_64BIT"
6674  "@
6675   rld%I2cl. %3,%1,%H2,56
6676   #"
6677  [(set_attr "type" "delayed_compare")
6678   (set_attr "length" "4,8")])
6679
6680(define_split
6681  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6682	(compare:CC (zero_extend:DI
6683		     (subreg:QI
6684		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6685				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6686		    (const_int 0)))
6687   (clobber (match_scratch:DI 3 ""))]
6688  "TARGET_POWERPC64 && reload_completed"
6689  [(set (match_dup 3)
6690	(zero_extend:DI (subreg:QI
6691		      (rotate:DI (match_dup 1)
6692				 (match_dup 2)) 0)))
6693   (set (match_dup 0)
6694	(compare:CC (match_dup 3)
6695		    (const_int 0)))]
6696  "")
6697
6698(define_insn "*rotldi3_internal9"
6699  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6700	(compare:CC (zero_extend:DI
6701		     (subreg:QI
6702		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6703				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6704		    (const_int 0)))
6705   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6706	(zero_extend:DI (subreg:QI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6707  "TARGET_64BIT"
6708  "@
6709   rld%I2cl. %0,%1,%H2,56
6710   #"
6711  [(set_attr "type" "delayed_compare")
6712   (set_attr "length" "4,8")])
6713
6714(define_split
6715  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6716	(compare:CC (zero_extend:DI
6717		     (subreg:QI
6718		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6719				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6720		    (const_int 0)))
6721   (set (match_operand:DI 0 "gpc_reg_operand" "")
6722	(zero_extend:DI (subreg:QI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6723  "TARGET_POWERPC64 && reload_completed"
6724  [(set (match_dup 0)
6725	(zero_extend:DI (subreg:QI (rotate:DI (match_dup 1) (match_dup 2)) 0)))
6726   (set (match_dup 3)
6727	(compare:CC (match_dup 0)
6728		    (const_int 0)))]
6729  "")
6730
6731(define_insn "*rotldi3_internal10"
6732  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6733	(zero_extend:DI
6734	 (subreg:HI
6735	  (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6736		     (match_operand:DI 2 "reg_or_cint_operand" "ri")) 0)))]
6737  "TARGET_POWERPC64"
6738  "rld%I2cl %0,%1,%H2,48")
6739
6740(define_insn "*rotldi3_internal11"
6741  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6742	(compare:CC (zero_extend:DI
6743		     (subreg:HI
6744		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6745				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6746		    (const_int 0)))
6747   (clobber (match_scratch:DI 3 "=r,r"))]
6748  "TARGET_64BIT"
6749  "@
6750   rld%I2cl. %3,%1,%H2,48
6751   #"
6752  [(set_attr "type" "delayed_compare")
6753   (set_attr "length" "4,8")])
6754
6755(define_split
6756  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6757	(compare:CC (zero_extend:DI
6758		     (subreg:HI
6759		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6760				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6761		    (const_int 0)))
6762   (clobber (match_scratch:DI 3 ""))]
6763  "TARGET_POWERPC64 && reload_completed"
6764  [(set (match_dup 3)
6765	(zero_extend:DI (subreg:HI
6766		      (rotate:DI (match_dup 1)
6767				 (match_dup 2)) 0)))
6768   (set (match_dup 0)
6769	(compare:CC (match_dup 3)
6770		    (const_int 0)))]
6771  "")
6772
6773(define_insn "*rotldi3_internal12"
6774  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6775	(compare:CC (zero_extend:DI
6776		     (subreg:HI
6777		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6778				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6779		    (const_int 0)))
6780   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6781	(zero_extend:DI (subreg:HI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6782  "TARGET_64BIT"
6783  "@
6784   rld%I2cl. %0,%1,%H2,48
6785   #"
6786  [(set_attr "type" "delayed_compare")
6787   (set_attr "length" "4,8")])
6788
6789(define_split
6790  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6791	(compare:CC (zero_extend:DI
6792		     (subreg:HI
6793		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6794				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6795		    (const_int 0)))
6796   (set (match_operand:DI 0 "gpc_reg_operand" "")
6797	(zero_extend:DI (subreg:HI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6798  "TARGET_POWERPC64 && reload_completed"
6799  [(set (match_dup 0)
6800	(zero_extend:DI (subreg:HI (rotate:DI (match_dup 1) (match_dup 2)) 0)))
6801   (set (match_dup 3)
6802	(compare:CC (match_dup 0)
6803		    (const_int 0)))]
6804  "")
6805
6806(define_insn "*rotldi3_internal13"
6807  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6808	(zero_extend:DI
6809	 (subreg:SI
6810	  (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6811		     (match_operand:DI 2 "reg_or_cint_operand" "ri")) 0)))]
6812  "TARGET_POWERPC64"
6813  "rld%I2cl %0,%1,%H2,32")
6814
6815(define_insn "*rotldi3_internal14"
6816  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6817	(compare:CC (zero_extend:DI
6818		     (subreg:SI
6819		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6820				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6821		    (const_int 0)))
6822   (clobber (match_scratch:DI 3 "=r,r"))]
6823  "TARGET_64BIT"
6824  "@
6825   rld%I2cl. %3,%1,%H2,32
6826   #"
6827  [(set_attr "type" "delayed_compare")
6828   (set_attr "length" "4,8")])
6829
6830(define_split
6831  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6832	(compare:CC (zero_extend:DI
6833		     (subreg:SI
6834		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6835				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6836		    (const_int 0)))
6837   (clobber (match_scratch:DI 3 ""))]
6838  "TARGET_POWERPC64 && reload_completed"
6839  [(set (match_dup 3)
6840	(zero_extend:DI (subreg:SI
6841		      (rotate:DI (match_dup 1)
6842				 (match_dup 2)) 0)))
6843   (set (match_dup 0)
6844	(compare:CC (match_dup 3)
6845		    (const_int 0)))]
6846  "")
6847
6848(define_insn "*rotldi3_internal15"
6849  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6850	(compare:CC (zero_extend:DI
6851		     (subreg:SI
6852		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6853				 (match_operand:DI 2 "reg_or_cint_operand" "ri,ri")) 0))
6854		    (const_int 0)))
6855   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6856	(zero_extend:DI (subreg:SI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6857  "TARGET_64BIT"
6858  "@
6859   rld%I2cl. %0,%1,%H2,32
6860   #"
6861  [(set_attr "type" "delayed_compare")
6862   (set_attr "length" "4,8")])
6863
6864(define_split
6865  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6866	(compare:CC (zero_extend:DI
6867		     (subreg:SI
6868		      (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
6869				 (match_operand:DI 2 "reg_or_cint_operand" "")) 0))
6870		    (const_int 0)))
6871   (set (match_operand:DI 0 "gpc_reg_operand" "")
6872	(zero_extend:DI (subreg:SI (rotate:DI (match_dup 1) (match_dup 2)) 0)))]
6873  "TARGET_POWERPC64 && reload_completed"
6874  [(set (match_dup 0)
6875	(zero_extend:DI (subreg:SI (rotate:DI (match_dup 1) (match_dup 2)) 0)))
6876   (set (match_dup 3)
6877	(compare:CC (match_dup 0)
6878		    (const_int 0)))]
6879  "")
6880
6881(define_expand "ashldi3"
6882  [(set (match_operand:DI 0 "gpc_reg_operand" "")
6883	(ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
6884		   (match_operand:SI 2 "reg_or_cint_operand" "")))]
6885  "TARGET_POWERPC64 || TARGET_POWER"
6886  "
6887{
6888  if (TARGET_POWERPC64)
6889    ;
6890  else if (TARGET_POWER)
6891    {
6892      emit_insn (gen_ashldi3_power (operands[0], operands[1], operands[2]));
6893      DONE;
6894    }
6895  else
6896    FAIL;
6897}")
6898
6899(define_insn "*ashldi3_internal1"
6900  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6901	(ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6902		   (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
6903  "TARGET_POWERPC64"
6904  "sld%I2 %0,%1,%H2")
6905
6906(define_insn "*ashldi3_internal2"
6907  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6908	(compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6909			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
6910		    (const_int 0)))
6911   (clobber (match_scratch:DI 3 "=r,r"))]
6912  "TARGET_64BIT"
6913  "@
6914   sld%I2. %3,%1,%H2
6915   #"
6916  [(set_attr "type" "delayed_compare")
6917   (set_attr "length" "4,8")])
6918
6919(define_split
6920  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6921	(compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
6922			       (match_operand:SI 2 "reg_or_cint_operand" ""))
6923		    (const_int 0)))
6924   (clobber (match_scratch:DI 3 ""))]
6925  "TARGET_POWERPC64 && reload_completed"
6926  [(set (match_dup 3)
6927	(ashift:DI (match_dup 1) (match_dup 2)))
6928   (set (match_dup 0)
6929	(compare:CC (match_dup 3)
6930		    (const_int 0)))]
6931  "")
6932
6933(define_insn "*ashldi3_internal3"
6934  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
6935	(compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6936			       (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
6937		    (const_int 0)))
6938   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
6939	(ashift:DI (match_dup 1) (match_dup 2)))]
6940  "TARGET_64BIT"
6941  "@
6942   sld%I2. %0,%1,%H2
6943   #"
6944  [(set_attr "type" "delayed_compare")
6945   (set_attr "length" "4,8")])
6946
6947(define_split
6948  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
6949	(compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
6950			       (match_operand:SI 2 "reg_or_cint_operand" ""))
6951		    (const_int 0)))
6952   (set (match_operand:DI 0 "gpc_reg_operand" "")
6953	(ashift:DI (match_dup 1) (match_dup 2)))]
6954  "TARGET_POWERPC64 && reload_completed"
6955  [(set (match_dup 0)
6956	(ashift:DI (match_dup 1) (match_dup 2)))
6957   (set (match_dup 3)
6958	(compare:CC (match_dup 0)
6959		    (const_int 0)))]
6960  "")
6961
6962(define_insn "*ashldi3_internal4"
6963  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
6964	(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
6965			   (match_operand:SI 2 "const_int_operand" "i"))
6966		(match_operand:DI 3 "const_int_operand" "n")))]
6967  "TARGET_POWERPC64 && includes_rldic_lshift_p (operands[2], operands[3])"
6968  "rldic %0,%1,%H2,%W3")
6969
6970(define_insn "ashldi3_internal5"
6971  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
6972	(compare:CC
6973	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
6974			    (match_operand:SI 2 "const_int_operand" "i,i"))
6975		 (match_operand:DI 3 "const_int_operand" "n,n"))
6976	 (const_int 0)))
6977   (clobber (match_scratch:DI 4 "=r,r"))]
6978  "TARGET_64BIT && includes_rldic_lshift_p (operands[2], operands[3])"
6979  "@
6980   rldic. %4,%1,%H2,%W3
6981   #"
6982  [(set_attr "type" "compare")
6983   (set_attr "length" "4,8")])
6984
6985(define_split
6986  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
6987	(compare:CC
6988	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
6989			    (match_operand:SI 2 "const_int_operand" ""))
6990		 (match_operand:DI 3 "const_int_operand" ""))
6991	 (const_int 0)))
6992   (clobber (match_scratch:DI 4 ""))]
6993  "TARGET_POWERPC64 && reload_completed
6994   && includes_rldic_lshift_p (operands[2], operands[3])"
6995  [(set (match_dup 4)
6996	(and:DI (ashift:DI (match_dup 1) (match_dup 2))
6997		(match_dup 3)))
6998   (set (match_dup 0)
6999	(compare:CC (match_dup 4)
7000		    (const_int 0)))]
7001  "")
7002
7003(define_insn "*ashldi3_internal6"
7004  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
7005	(compare:CC
7006	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7007			    (match_operand:SI 2 "const_int_operand" "i,i"))
7008		    (match_operand:DI 3 "const_int_operand" "n,n"))
7009	 (const_int 0)))
7010   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7011	(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
7012  "TARGET_64BIT && includes_rldic_lshift_p (operands[2], operands[3])"
7013  "@
7014   rldic. %0,%1,%H2,%W3
7015   #"
7016  [(set_attr "type" "compare")
7017   (set_attr "length" "4,8")])
7018
7019(define_split
7020  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
7021	(compare:CC
7022	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
7023			    (match_operand:SI 2 "const_int_operand" ""))
7024		 (match_operand:DI 3 "const_int_operand" ""))
7025	 (const_int 0)))
7026   (set (match_operand:DI 0 "gpc_reg_operand" "")
7027	(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
7028  "TARGET_POWERPC64 && reload_completed
7029   && includes_rldic_lshift_p (operands[2], operands[3])"
7030  [(set (match_dup 0)
7031	(and:DI (ashift:DI (match_dup 1) (match_dup 2))
7032		(match_dup 3)))
7033   (set (match_dup 4)
7034	(compare:CC (match_dup 0)
7035		    (const_int 0)))]
7036  "")
7037
7038(define_insn "*ashldi3_internal7"
7039  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
7040	(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
7041			   (match_operand:SI 2 "const_int_operand" "i"))
7042		(match_operand:DI 3 "mask64_operand" "n")))]
7043  "TARGET_POWERPC64 && includes_rldicr_lshift_p (operands[2], operands[3])"
7044  "rldicr %0,%1,%H2,%S3")
7045
7046(define_insn "ashldi3_internal8"
7047  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7048	(compare:CC
7049	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7050			    (match_operand:SI 2 "const_int_operand" "i,i"))
7051		 (match_operand:DI 3 "mask64_operand" "n,n"))
7052	 (const_int 0)))
7053   (clobber (match_scratch:DI 4 "=r,r"))]
7054  "TARGET_64BIT && includes_rldicr_lshift_p (operands[2], operands[3])"
7055  "@
7056   rldicr. %4,%1,%H2,%S3
7057   #"
7058  [(set_attr "type" "compare")
7059   (set_attr "length" "4,8")])
7060
7061(define_split
7062  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7063	(compare:CC
7064	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
7065			    (match_operand:SI 2 "const_int_operand" ""))
7066		 (match_operand:DI 3 "mask64_operand" ""))
7067	 (const_int 0)))
7068   (clobber (match_scratch:DI 4 ""))]
7069  "TARGET_POWERPC64 && reload_completed
7070   && includes_rldicr_lshift_p (operands[2], operands[3])"
7071  [(set (match_dup 4)
7072	(and:DI (ashift:DI (match_dup 1) (match_dup 2))
7073		(match_dup 3)))
7074   (set (match_dup 0)
7075	(compare:CC (match_dup 4)
7076		    (const_int 0)))]
7077  "")
7078
7079(define_insn "*ashldi3_internal9"
7080  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
7081	(compare:CC
7082	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7083			    (match_operand:SI 2 "const_int_operand" "i,i"))
7084		    (match_operand:DI 3 "mask64_operand" "n,n"))
7085	 (const_int 0)))
7086   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7087	(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
7088  "TARGET_64BIT && includes_rldicr_lshift_p (operands[2], operands[3])"
7089  "@
7090   rldicr. %0,%1,%H2,%S3
7091   #"
7092  [(set_attr "type" "compare")
7093   (set_attr "length" "4,8")])
7094
7095(define_split
7096  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
7097	(compare:CC
7098	 (and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
7099			    (match_operand:SI 2 "const_int_operand" ""))
7100		 (match_operand:DI 3 "mask64_operand" ""))
7101	 (const_int 0)))
7102   (set (match_operand:DI 0 "gpc_reg_operand" "")
7103	(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
7104  "TARGET_POWERPC64 && reload_completed
7105   && includes_rldicr_lshift_p (operands[2], operands[3])"
7106  [(set (match_dup 0)
7107	(and:DI (ashift:DI (match_dup 1) (match_dup 2))
7108		(match_dup 3)))
7109   (set (match_dup 4)
7110	(compare:CC (match_dup 0)
7111		    (const_int 0)))]
7112  "")
7113
7114(define_expand "lshrdi3"
7115  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7116	(lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7117		     (match_operand:SI 2 "reg_or_cint_operand" "")))]
7118  "TARGET_POWERPC64 || TARGET_POWER"
7119  "
7120{
7121  if (TARGET_POWERPC64)
7122    ;
7123  else if (TARGET_POWER)
7124    {
7125      emit_insn (gen_lshrdi3_power (operands[0], operands[1], operands[2]));
7126      DONE;
7127    }
7128  else
7129    FAIL;
7130}")
7131
7132(define_insn "*lshrdi3_internal1"
7133  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
7134	(lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
7135		     (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
7136  "TARGET_POWERPC64"
7137  "srd%I2 %0,%1,%H2")
7138
7139(define_insn "*lshrdi3_internal2"
7140  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7141	(compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7142				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
7143		    (const_int 0)))
7144   (clobber (match_scratch:DI 3 "=r,r"))]
7145  "TARGET_64BIT "
7146  "@
7147   srd%I2. %3,%1,%H2
7148   #"
7149  [(set_attr "type" "delayed_compare")
7150   (set_attr "length" "4,8")])
7151
7152(define_split
7153  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7154	(compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7155				 (match_operand:SI 2 "reg_or_cint_operand" ""))
7156		    (const_int 0)))
7157   (clobber (match_scratch:DI 3 ""))]
7158  "TARGET_POWERPC64 && reload_completed"
7159  [(set (match_dup 3)
7160	(lshiftrt:DI (match_dup 1) (match_dup 2)))
7161   (set (match_dup 0)
7162	(compare:CC (match_dup 3)
7163		    (const_int 0)))]
7164  "")
7165
7166(define_insn "*lshrdi3_internal3"
7167  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
7168	(compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7169				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
7170		    (const_int 0)))
7171   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7172	(lshiftrt:DI (match_dup 1) (match_dup 2)))]
7173  "TARGET_64BIT"
7174  "@
7175   srd%I2. %0,%1,%H2
7176   #"
7177  [(set_attr "type" "delayed_compare")
7178   (set_attr "length" "4,8")])
7179
7180(define_split
7181  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7182	(compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7183				 (match_operand:SI 2 "reg_or_cint_operand" ""))
7184		    (const_int 0)))
7185   (set (match_operand:DI 0 "gpc_reg_operand" "")
7186	(lshiftrt:DI (match_dup 1) (match_dup 2)))]
7187  "TARGET_POWERPC64 && reload_completed"
7188  [(set (match_dup 0)
7189	(lshiftrt:DI (match_dup 1) (match_dup 2)))
7190   (set (match_dup 3)
7191	(compare:CC (match_dup 0)
7192		    (const_int 0)))]
7193  "")
7194
7195(define_expand "ashrdi3"
7196  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7197	(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7198		     (match_operand:SI 2 "reg_or_cint_operand" "")))]
7199  "WORDS_BIG_ENDIAN"
7200  "
7201{
7202  if (TARGET_POWERPC64)
7203    ;
7204  else if (TARGET_POWER && GET_CODE (operands[2]) == CONST_INT)
7205    {
7206      emit_insn (gen_ashrdi3_power (operands[0], operands[1], operands[2]));
7207      DONE;
7208    }
7209  else if (TARGET_32BIT && GET_CODE (operands[2]) == CONST_INT
7210	   && WORDS_BIG_ENDIAN)
7211    {
7212      emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2]));
7213      DONE;
7214    }
7215  else
7216    FAIL;
7217}")
7218
7219(define_insn "*ashrdi3_internal1"
7220  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
7221	(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
7222		     (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
7223  "TARGET_POWERPC64"
7224  "srad%I2 %0,%1,%H2")
7225
7226(define_insn "*ashrdi3_internal2"
7227  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7228	(compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7229				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
7230		    (const_int 0)))
7231   (clobber (match_scratch:DI 3 "=r,r"))]
7232  "TARGET_64BIT"
7233  "@
7234   srad%I2. %3,%1,%H2
7235   #"
7236  [(set_attr "type" "delayed_compare")
7237   (set_attr "length" "4,8")])
7238
7239(define_split
7240  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7241	(compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7242				 (match_operand:SI 2 "reg_or_cint_operand" ""))
7243		    (const_int 0)))
7244   (clobber (match_scratch:DI 3 ""))]
7245  "TARGET_POWERPC64 && reload_completed"
7246  [(set (match_dup 3)
7247	(ashiftrt:DI (match_dup 1) (match_dup 2)))
7248   (set (match_dup 0)
7249	(compare:CC (match_dup 3)
7250		    (const_int 0)))]
7251  "")
7252
7253(define_insn "*ashrdi3_internal3"
7254  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
7255	(compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
7256				 (match_operand:SI 2 "reg_or_cint_operand" "ri,ri"))
7257		    (const_int 0)))
7258   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7259	(ashiftrt:DI (match_dup 1) (match_dup 2)))]
7260  "TARGET_64BIT"
7261  "@
7262   srad%I2. %0,%1,%H2
7263   #"
7264  [(set_attr "type" "delayed_compare")
7265   (set_attr "length" "4,8")])
7266
7267(define_split
7268  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7269	(compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
7270				 (match_operand:SI 2 "reg_or_cint_operand" ""))
7271		    (const_int 0)))
7272   (set (match_operand:DI 0 "gpc_reg_operand" "")
7273	(ashiftrt:DI (match_dup 1) (match_dup 2)))]
7274  "TARGET_POWERPC64 && reload_completed"
7275  [(set (match_dup 0)
7276	(ashiftrt:DI (match_dup 1) (match_dup 2)))
7277   (set (match_dup 3)
7278	(compare:CC (match_dup 0)
7279		    (const_int 0)))]
7280  "")
7281
7282(define_insn "anddi3"
7283  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,r,r,r")
7284	(and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r,r,r,r")
7285		(match_operand:DI 2 "and64_2_operand" "?r,S,T,K,J,t")))
7286   (clobber (match_scratch:CC 3 "=X,X,X,x,x,X"))]
7287  "TARGET_POWERPC64"
7288  "@
7289   and %0,%1,%2
7290   rldic%B2 %0,%1,0,%S2
7291   rlwinm %0,%1,0,%m2,%M2
7292   andi. %0,%1,%b2
7293   andis. %0,%1,%u2
7294   #"
7295  [(set_attr "type" "*,*,*,compare,compare,*")
7296   (set_attr "length" "4,4,4,4,4,8")])
7297
7298(define_split
7299  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7300	(and:DI (match_operand:DI 1 "gpc_reg_operand" "")
7301		(match_operand:DI 2 "mask64_2_operand" "")))
7302   (clobber (match_scratch:CC 3 ""))]
7303  "TARGET_POWERPC64
7304    && (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
7305    && !mask_operand (operands[2], DImode)
7306    && !mask64_operand (operands[2], DImode)"
7307  [(set (match_dup 0)
7308	(and:DI (rotate:DI (match_dup 1)
7309			   (match_dup 4))
7310		(match_dup 5)))
7311   (set (match_dup 0)
7312	(and:DI (rotate:DI (match_dup 0)
7313			   (match_dup 6))
7314		(match_dup 7)))]
7315{
7316  build_mask64_2_operands (operands[2], &operands[4]);
7317})
7318
7319(define_insn "*anddi3_internal2"
7320  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,x,x,?y,?y,?y,??y,??y,?y")
7321	(compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r,r,r")
7322			    (match_operand:DI 2 "and64_2_operand" "r,S,T,K,J,t,r,S,T,K,J,t"))
7323		    (const_int 0)))
7324   (clobber (match_scratch:DI 3 "=r,r,r,r,r,r,r,r,r,r,r,r"))
7325   (clobber (match_scratch:CC 4 "=X,X,X,X,X,X,X,X,X,x,x,X"))]
7326  "TARGET_64BIT"
7327  "@
7328   and. %3,%1,%2
7329   rldic%B2. %3,%1,0,%S2
7330   rlwinm. %3,%1,0,%m2,%M2
7331   andi. %3,%1,%b2
7332   andis. %3,%1,%u2
7333   #
7334   #
7335   #
7336   #
7337   #
7338   #
7339   #"
7340  [(set_attr "type" "compare,compare,compare,compare,compare,compare,compare,compare,compare,compare,compare,compare")
7341   (set_attr "length" "4,4,4,4,4,8,8,8,8,8,8,12")])
7342
7343(define_split
7344  [(set (match_operand:CC 0 "cc_reg_operand" "")
7345        (compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
7346                            (match_operand:DI 2 "mask64_2_operand" ""))
7347                    (const_int 0)))
7348   (clobber (match_scratch:DI 3 ""))
7349   (clobber (match_scratch:CC 4 ""))]
7350  "TARGET_64BIT && reload_completed
7351    && (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
7352    && !mask_operand (operands[2], DImode)
7353    && !mask64_operand (operands[2], DImode)"
7354  [(set (match_dup 3)
7355	(and:DI (rotate:DI (match_dup 1)
7356			   (match_dup 5))
7357		(match_dup 6)))
7358   (parallel [(set (match_dup 0)
7359		   (compare:CC (and:DI (rotate:DI (match_dup 3)
7360						  (match_dup 7))
7361				       (match_dup 8))
7362			       (const_int 0)))
7363	      (clobber (match_dup 3))])]
7364  "
7365{
7366  build_mask64_2_operands (operands[2], &operands[5]);
7367}")
7368
7369(define_insn "*anddi3_internal3"
7370  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x,x,x,?y,?y,?y,??y,??y,?y")
7371	(compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r,r,r")
7372			    (match_operand:DI 2 "and64_2_operand" "r,S,T,K,J,t,r,S,T,K,J,t"))
7373		    (const_int 0)))
7374   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r,r,r,r,r")
7375	(and:DI (match_dup 1) (match_dup 2)))
7376   (clobber (match_scratch:CC 4 "=X,X,X,X,X,X,X,X,X,x,x,X"))]
7377  "TARGET_64BIT"
7378  "@
7379   and. %0,%1,%2
7380   rldic%B2. %0,%1,0,%S2
7381   rlwinm. %0,%1,0,%m2,%M2
7382   andi. %0,%1,%b2
7383   andis. %0,%1,%u2
7384   #
7385   #
7386   #
7387   #
7388   #
7389   #
7390   #"
7391  [(set_attr "type" "compare,compare,compare,compare,compare,compare,compare,compare,compare,compare,compare,compare")
7392   (set_attr "length" "4,4,4,4,4,8,8,8,8,8,8,12")])
7393
7394(define_split
7395  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7396	(compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
7397			    (match_operand:DI 2 "and64_2_operand" ""))
7398		    (const_int 0)))
7399   (set (match_operand:DI 0 "gpc_reg_operand" "")
7400	(and:DI (match_dup 1) (match_dup 2)))
7401   (clobber (match_scratch:CC 4 ""))]
7402  "TARGET_64BIT && reload_completed"
7403  [(parallel [(set (match_dup 0)
7404		    (and:DI (match_dup 1) (match_dup 2)))
7405	       (clobber (match_dup 4))])
7406   (set (match_dup 3)
7407	(compare:CC (match_dup 0)
7408		    (const_int 0)))]
7409  "")
7410
7411(define_split
7412  [(set (match_operand:CC 3 "cc_reg_operand" "")
7413        (compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
7414                            (match_operand:DI 2 "mask64_2_operand" ""))
7415                    (const_int 0)))
7416   (set (match_operand:DI 0 "gpc_reg_operand" "")
7417	(and:DI (match_dup 1) (match_dup 2)))
7418   (clobber (match_scratch:CC 4 ""))]
7419  "TARGET_64BIT && reload_completed
7420    && (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
7421    && !mask_operand (operands[2], DImode)
7422    && !mask64_operand (operands[2], DImode)"
7423  [(set (match_dup 0)
7424	(and:DI (rotate:DI (match_dup 1)
7425			   (match_dup 5))
7426		(match_dup 6)))
7427   (parallel [(set (match_dup 3)
7428		   (compare:CC (and:DI (rotate:DI (match_dup 0)
7429						  (match_dup 7))
7430				       (match_dup 8))
7431			       (const_int 0)))
7432	      (set (match_dup 0)
7433		   (and:DI (rotate:DI (match_dup 0)
7434				      (match_dup 7))
7435			   (match_dup 8)))])]
7436  "
7437{
7438  build_mask64_2_operands (operands[2], &operands[5]);
7439}")
7440
7441(define_expand "iordi3"
7442  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7443	(ior:DI (match_operand:DI 1 "gpc_reg_operand" "")
7444		(match_operand:DI 2 "reg_or_logical_cint_operand" "")))]
7445  "TARGET_POWERPC64"
7446  "
7447{
7448  if (non_logical_cint_operand (operands[2], DImode))
7449    {
7450      HOST_WIDE_INT value;
7451      rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1]))
7452		 ? operands[0] : gen_reg_rtx (DImode));
7453
7454      if (GET_CODE (operands[2]) == CONST_INT)
7455        {
7456          value = INTVAL (operands[2]);
7457	  emit_insn (gen_iordi3 (tmp, operands[1],
7458				 GEN_INT (value & (~ (HOST_WIDE_INT) 0xffff))));
7459	}
7460      else
7461        {
7462	  value = CONST_DOUBLE_LOW (operands[2]);
7463	  emit_insn (gen_iordi3 (tmp, operands[1],
7464				 immed_double_const (value
7465						     & (~ (HOST_WIDE_INT) 0xffff),
7466						     0, DImode)));
7467	}
7468
7469      emit_insn (gen_iordi3 (operands[0], tmp, GEN_INT (value & 0xffff)));
7470      DONE;
7471    }
7472}")
7473
7474(define_expand "xordi3"
7475  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7476	(xor:DI (match_operand:DI 1 "gpc_reg_operand" "")
7477		(match_operand:DI 2 "reg_or_logical_cint_operand" "")))]
7478  "TARGET_POWERPC64"
7479  "
7480{
7481  if (non_logical_cint_operand (operands[2], DImode))
7482    {
7483      HOST_WIDE_INT value;
7484      rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1]))
7485		 ? operands[0] : gen_reg_rtx (DImode));
7486
7487      if (GET_CODE (operands[2]) == CONST_INT)
7488        {
7489          value = INTVAL (operands[2]);
7490	  emit_insn (gen_xordi3 (tmp, operands[1],
7491				 GEN_INT (value & (~ (HOST_WIDE_INT) 0xffff))));
7492	}
7493      else
7494        {
7495	  value = CONST_DOUBLE_LOW (operands[2]);
7496	  emit_insn (gen_xordi3 (tmp, operands[1],
7497				 immed_double_const (value
7498						     & (~ (HOST_WIDE_INT) 0xffff),
7499						     0, DImode)));
7500	}
7501
7502      emit_insn (gen_xordi3 (operands[0], tmp, GEN_INT (value & 0xffff)));
7503      DONE;
7504    }
7505}")
7506
7507(define_insn "*booldi3_internal1"
7508  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r")
7509	(match_operator:DI 3 "boolean_or_operator"
7510	 [(match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
7511	  (match_operand:DI 2 "logical_operand" "r,K,JF")]))]
7512  "TARGET_POWERPC64"
7513  "@
7514   %q3 %0,%1,%2
7515   %q3i %0,%1,%b2
7516   %q3is %0,%1,%u2")
7517
7518(define_insn "*booldi3_internal2"
7519  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7520	(compare:CC (match_operator:DI 4 "boolean_or_operator"
7521	 [(match_operand:DI 1 "gpc_reg_operand" "%r,r")
7522	  (match_operand:DI 2 "gpc_reg_operand" "r,r")])
7523	 (const_int 0)))
7524   (clobber (match_scratch:DI 3 "=r,r"))]
7525  "TARGET_64BIT"
7526  "@
7527   %q4. %3,%1,%2
7528   #"
7529  [(set_attr "type" "compare")
7530   (set_attr "length" "4,8")])
7531
7532(define_split
7533  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7534	(compare:CC (match_operator:DI 4 "boolean_operator"
7535	 [(match_operand:DI 1 "gpc_reg_operand" "")
7536	  (match_operand:DI 2 "gpc_reg_operand" "")])
7537	 (const_int 0)))
7538   (clobber (match_scratch:DI 3 ""))]
7539  "TARGET_POWERPC64 && reload_completed"
7540  [(set (match_dup 3) (match_dup 4))
7541   (set (match_dup 0)
7542	(compare:CC (match_dup 3)
7543		    (const_int 0)))]
7544  "")
7545
7546(define_insn "*booldi3_internal3"
7547  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
7548	(compare:CC (match_operator:DI 4 "boolean_operator"
7549	 [(match_operand:DI 1 "gpc_reg_operand" "%r,r")
7550	  (match_operand:DI 2 "gpc_reg_operand" "r,r")])
7551	 (const_int 0)))
7552   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7553	(match_dup 4))]
7554  "TARGET_64BIT"
7555  "@
7556   %q4. %0,%1,%2
7557   #"
7558  [(set_attr "type" "compare")
7559   (set_attr "length" "4,8")])
7560
7561(define_split
7562  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7563	(compare:CC (match_operator:DI 4 "boolean_operator"
7564	 [(match_operand:DI 1 "gpc_reg_operand" "")
7565	  (match_operand:DI 2 "gpc_reg_operand" "")])
7566	 (const_int 0)))
7567   (set (match_operand:DI 0 "gpc_reg_operand" "")
7568	(match_dup 4))]
7569  "TARGET_POWERPC64 && reload_completed"
7570  [(set (match_dup 0) (match_dup 4))
7571   (set (match_dup 3)
7572	(compare:CC (match_dup 0)
7573		    (const_int 0)))]
7574  "")
7575
7576;; Split a logical operation that we can't do in one insn into two insns,
7577;; each of which does one 16-bit part.  This is used by combine.
7578
7579(define_split
7580  [(set (match_operand:DI 0 "gpc_reg_operand" "")
7581	(match_operator:DI 3 "boolean_or_operator"
7582	 [(match_operand:DI 1 "gpc_reg_operand" "")
7583	  (match_operand:DI 2 "non_logical_cint_operand" "")]))]
7584  "TARGET_POWERPC64"
7585  [(set (match_dup 0) (match_dup 4))
7586   (set (match_dup 0) (match_dup 5))]
7587"
7588{
7589  rtx i3,i4;
7590
7591  if (GET_CODE (operands[2]) == CONST_DOUBLE)
7592    {
7593      HOST_WIDE_INT value = CONST_DOUBLE_LOW (operands[2]);
7594      i3 = immed_double_const (value & (~ (HOST_WIDE_INT) 0xffff),
7595					0, DImode);
7596      i4 = GEN_INT (value & 0xffff);
7597    }
7598  else
7599    {
7600      i3 = GEN_INT (INTVAL (operands[2])
7601			     & (~ (HOST_WIDE_INT) 0xffff));
7602      i4 = GEN_INT (INTVAL (operands[2]) & 0xffff);
7603    }
7604  operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[3]), DImode,
7605				operands[1], i3);
7606  operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[3]), DImode,
7607				operands[0], i4);
7608}")
7609
7610(define_insn "*boolcdi3_internal1"
7611  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
7612	(match_operator:DI 3 "boolean_operator"
7613	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
7614	  (match_operand:DI 2 "gpc_reg_operand" "r")]))]
7615  "TARGET_POWERPC64"
7616  "%q3 %0,%2,%1")
7617
7618(define_insn "*boolcdi3_internal2"
7619  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7620	(compare:CC (match_operator:DI 4 "boolean_operator"
7621	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "r,r"))
7622	  (match_operand:DI 2 "gpc_reg_operand" "r,r")])
7623	 (const_int 0)))
7624   (clobber (match_scratch:DI 3 "=r,r"))]
7625  "TARGET_64BIT"
7626  "@
7627   %q4. %3,%2,%1
7628   #"
7629  [(set_attr "type" "compare")
7630   (set_attr "length" "4,8")])
7631
7632(define_split
7633  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7634	(compare:CC (match_operator:DI 4 "boolean_operator"
7635	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
7636	  (match_operand:DI 2 "gpc_reg_operand" "")])
7637	 (const_int 0)))
7638   (clobber (match_scratch:DI 3 ""))]
7639  "TARGET_POWERPC64 && reload_completed"
7640  [(set (match_dup 3) (match_dup 4))
7641   (set (match_dup 0)
7642	(compare:CC (match_dup 3)
7643		    (const_int 0)))]
7644  "")
7645
7646(define_insn "*boolcdi3_internal3"
7647  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
7648	(compare:CC (match_operator:DI 4 "boolean_operator"
7649	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r"))
7650	  (match_operand:DI 2 "gpc_reg_operand" "r,r")])
7651	 (const_int 0)))
7652   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7653	(match_dup 4))]
7654  "TARGET_64BIT"
7655  "@
7656   %q4. %0,%2,%1
7657   #"
7658  [(set_attr "type" "compare")
7659   (set_attr "length" "4,8")])
7660
7661(define_split
7662  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7663	(compare:CC (match_operator:DI 4 "boolean_operator"
7664	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
7665	  (match_operand:DI 2 "gpc_reg_operand" "")])
7666	 (const_int 0)))
7667   (set (match_operand:DI 0 "gpc_reg_operand" "")
7668	(match_dup 4))]
7669  "TARGET_POWERPC64 && reload_completed"
7670  [(set (match_dup 0) (match_dup 4))
7671   (set (match_dup 3)
7672	(compare:CC (match_dup 0)
7673		    (const_int 0)))]
7674  "")
7675
7676(define_insn "*boolccdi3_internal1"
7677  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
7678	(match_operator:DI 3 "boolean_operator"
7679	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
7680	  (not:DI (match_operand:DI 2 "gpc_reg_operand" "r"))]))]
7681  "TARGET_POWERPC64"
7682  "%q3 %0,%1,%2")
7683
7684(define_insn "*boolccdi3_internal2"
7685  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
7686	(compare:CC (match_operator:DI 4 "boolean_operator"
7687	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "r,r"))
7688	  (not:DI (match_operand:DI 2 "gpc_reg_operand" "r,r"))])
7689	 (const_int 0)))
7690   (clobber (match_scratch:DI 3 "=r,r"))]
7691  "TARGET_64BIT"
7692  "@
7693   %q4. %3,%1,%2
7694   #"
7695  [(set_attr "type" "compare")
7696   (set_attr "length" "4,8")])
7697
7698(define_split
7699  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
7700	(compare:CC (match_operator:DI 4 "boolean_operator"
7701	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
7702	  (not:DI (match_operand:DI 2 "gpc_reg_operand" ""))])
7703	 (const_int 0)))
7704   (clobber (match_scratch:DI 3 ""))]
7705  "TARGET_POWERPC64 && reload_completed"
7706  [(set (match_dup 3) (match_dup 4))
7707   (set (match_dup 0)
7708	(compare:CC (match_dup 3)
7709		    (const_int 0)))]
7710  "")
7711
7712(define_insn "*boolccdi3_internal3"
7713  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
7714	(compare:CC (match_operator:DI 4 "boolean_operator"
7715	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r"))
7716	  (not:DI (match_operand:DI 2 "gpc_reg_operand" "r,r"))])
7717	 (const_int 0)))
7718   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
7719	(match_dup 4))]
7720  "TARGET_64BIT"
7721  "@
7722   %q4. %0,%1,%2
7723   #"
7724  [(set_attr "type" "compare")
7725   (set_attr "length" "4,8")])
7726
7727(define_split
7728  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
7729	(compare:CC (match_operator:DI 4 "boolean_operator"
7730	 [(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
7731	  (not:DI (match_operand:DI 2 "gpc_reg_operand" ""))])
7732	 (const_int 0)))
7733   (set (match_operand:DI 0 "gpc_reg_operand" "")
7734	(match_dup 4))]
7735  "TARGET_POWERPC64 && reload_completed"
7736  [(set (match_dup 0) (match_dup 4))
7737   (set (match_dup 3)
7738	(compare:CC (match_dup 0)
7739		    (const_int 0)))]
7740  "")
7741
7742;; Now define ways of moving data around.
7743
7744;; Set up a register with a value from the GOT table
7745
7746(define_expand "movsi_got"
7747  [(set (match_operand:SI 0 "gpc_reg_operand" "")
7748	(unspec:SI [(match_operand:SI 1 "got_operand" "")
7749		    (match_dup 2)] UNSPEC_MOVSI_GOT))]
7750  "DEFAULT_ABI == ABI_V4 && flag_pic == 1"
7751  "
7752{
7753  if (GET_CODE (operands[1]) == CONST)
7754    {
7755      rtx offset = const0_rtx;
7756      HOST_WIDE_INT value;
7757
7758      operands[1] = eliminate_constant_term (XEXP (operands[1], 0), &offset);
7759      value = INTVAL (offset);
7760      if (value != 0)
7761	{
7762	  rtx tmp = (no_new_pseudos ? operands[0] : gen_reg_rtx (Pmode));
7763	  emit_insn (gen_movsi_got (tmp, operands[1]));
7764	  emit_insn (gen_addsi3 (operands[0], tmp, offset));
7765	  DONE;
7766	}
7767    }
7768
7769  operands[2] = rs6000_got_register (operands[1]);
7770}")
7771
7772(define_insn "*movsi_got_internal"
7773  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
7774	(unspec:SI [(match_operand:SI 1 "got_no_const_operand" "")
7775		    (match_operand:SI 2 "gpc_reg_operand" "b")]
7776		   UNSPEC_MOVSI_GOT))]
7777  "DEFAULT_ABI == ABI_V4 && flag_pic == 1"
7778  "{l|lwz} %0,%a1@got(%2)"
7779  [(set_attr "type" "load")])
7780
7781;; Used by sched, shorten_branches and final when the GOT pseudo reg
7782;; didn't get allocated to a hard register.
7783(define_split
7784  [(set (match_operand:SI 0 "gpc_reg_operand" "")
7785	(unspec:SI [(match_operand:SI 1 "got_no_const_operand" "")
7786		    (match_operand:SI 2 "memory_operand" "")]
7787		   UNSPEC_MOVSI_GOT))]
7788  "DEFAULT_ABI == ABI_V4
7789    && flag_pic == 1
7790    && (reload_in_progress || reload_completed)"
7791  [(set (match_dup 0) (match_dup 2))
7792   (set (match_dup 0) (unspec:SI [(match_dup 1)(match_dup 0)]
7793				 UNSPEC_MOVSI_GOT))]
7794  "")
7795
7796;; For SI, we special-case integers that can't be loaded in one insn.  We
7797;; do the load 16-bits at a time.  We could do this by loading from memory,
7798;; and this is even supposed to be faster, but it is simpler not to get
7799;; integers in the TOC.
7800(define_insn "movsi_low"
7801  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
7802        (mem:SI (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b")
7803                           (match_operand 2 "" ""))))]
7804  "TARGET_MACHO && ! TARGET_64BIT"
7805  "{l|lwz} %0,lo16(%2)(%1)"
7806  [(set_attr "type" "load")
7807   (set_attr "length" "4")])
7808
7809(define_insn "*movsi_internal1"
7810  [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "=r,r,r,m,r,r,r,r,r,*q,*c*l,*h,*h")
7811	(match_operand:SI 1 "input_operand" "r,U,m,r,I,L,n,R,*h,r,r,r,0"))]
7812  "gpc_reg_operand (operands[0], SImode)
7813   || gpc_reg_operand (operands[1], SImode)"
7814  "@
7815   mr %0,%1
7816   {cal|la} %0,%a1
7817   {l%U1%X1|lwz%U1%X1} %0,%1
7818   {st%U0%X0|stw%U0%X0} %1,%0
7819   {lil|li} %0,%1
7820   {liu|lis} %0,%v1
7821   #
7822   {cal|la} %0,%a1
7823   mf%1 %0
7824   mt%0 %1
7825   mt%0 %1
7826   mt%0 %1
7827   {cror 0,0,0|nop}"
7828  [(set_attr "type" "*,*,load,store,*,*,*,*,mfjmpr,*,mtjmpr,*,*")
7829   (set_attr "length" "4,4,4,4,4,4,8,4,4,4,4,4,4")])
7830
7831;; Split a load of a large constant into the appropriate two-insn
7832;; sequence.
7833
7834(define_split
7835  [(set (match_operand:SI 0 "gpc_reg_operand" "")
7836	(match_operand:SI 1 "const_int_operand" ""))]
7837  "(unsigned HOST_WIDE_INT) (INTVAL (operands[1]) + 0x8000) >= 0x10000
7838   && (INTVAL (operands[1]) & 0xffff) != 0"
7839  [(set (match_dup 0)
7840	(match_dup 2))
7841   (set (match_dup 0)
7842	(ior:SI (match_dup 0)
7843		(match_dup 3)))]
7844  "
7845{ rtx tem = rs6000_emit_set_const (operands[0], SImode, operands[1], 2);
7846
7847  if (tem == operands[0])
7848    DONE;
7849  else
7850    FAIL;
7851}")
7852
7853(define_insn "*mov<mode>_internal2"
7854  [(set (match_operand:CC 2 "cc_reg_operand" "=y,x,?y")
7855	(compare:CC (match_operand:P 1 "gpc_reg_operand" "0,r,r")
7856		    (const_int 0)))
7857   (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r") (match_dup 1))]
7858  ""
7859  "@
7860   {cmpi|cmp<wd>i} %2,%0,0
7861   mr. %0,%1
7862   #"
7863  [(set_attr "type" "cmp,compare,cmp")
7864   (set_attr "length" "4,4,8")])
7865
7866(define_split
7867  [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
7868	(compare:CC (match_operand:P 1 "gpc_reg_operand" "")
7869		    (const_int 0)))
7870   (set (match_operand:P 0 "gpc_reg_operand" "") (match_dup 1))]
7871  "reload_completed"
7872  [(set (match_dup 0) (match_dup 1))
7873   (set (match_dup 2)
7874	(compare:CC (match_dup 0)
7875		    (const_int 0)))]
7876  "")
7877
7878(define_insn "*movhi_internal"
7879  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
7880	(match_operand:HI 1 "input_operand" "r,m,r,i,*h,r,r,0"))]
7881  "gpc_reg_operand (operands[0], HImode)
7882   || gpc_reg_operand (operands[1], HImode)"
7883  "@
7884   mr %0,%1
7885   lhz%U1%X1 %0,%1
7886   sth%U0%X0 %1,%0
7887   {lil|li} %0,%w1
7888   mf%1 %0
7889   mt%0 %1
7890   mt%0 %1
7891   {cror 0,0,0|nop}"
7892  [(set_attr "type" "*,load,store,*,mfjmpr,*,mtjmpr,*")])
7893
7894(define_expand "mov<mode>"
7895  [(set (match_operand:INT 0 "general_operand" "")
7896	(match_operand:INT 1 "any_operand" ""))]
7897  ""
7898  "{ rs6000_emit_move (operands[0], operands[1], <MODE>mode); DONE; }")
7899
7900(define_insn "*movqi_internal"
7901  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
7902	(match_operand:QI 1 "input_operand" "r,m,r,i,*h,r,r,0"))]
7903  "gpc_reg_operand (operands[0], QImode)
7904   || gpc_reg_operand (operands[1], QImode)"
7905  "@
7906   mr %0,%1
7907   lbz%U1%X1 %0,%1
7908   stb%U0%X0 %1,%0
7909   {lil|li} %0,%1
7910   mf%1 %0
7911   mt%0 %1
7912   mt%0 %1
7913   {cror 0,0,0|nop}"
7914  [(set_attr "type" "*,load,store,*,mfjmpr,*,mtjmpr,*")])
7915
7916;; Here is how to move condition codes around.  When we store CC data in
7917;; an integer register or memory, we store just the high-order 4 bits.
7918;; This lets us not shift in the most common case of CR0.
7919(define_expand "movcc"
7920  [(set (match_operand:CC 0 "nonimmediate_operand" "")
7921	(match_operand:CC 1 "nonimmediate_operand" ""))]
7922  ""
7923  "")
7924
7925(define_insn "*movcc_internal1"
7926  [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,?y,y,r,r,r,r,r,q,cl,r,m")
7927	(match_operand:CC 1 "general_operand" "y,r,r,O,x,y,r,I,h,r,r,m,r"))]
7928  "register_operand (operands[0], CCmode)
7929   || register_operand (operands[1], CCmode)"
7930  "@
7931   mcrf %0,%1
7932   mtcrf 128,%1
7933   {rlinm|rlwinm} %1,%1,%F0,0xffffffff\;mtcrf %R0,%1\;{rlinm|rlwinm} %1,%1,%f0,0xffffffff
7934   crxor %0,%0,%0
7935   mfcr %0%Q1
7936   mfcr %0%Q1\;{rlinm|rlwinm} %0,%0,%f1,0xf0000000
7937   mr %0,%1
7938   {lil|li} %0,%1
7939   mf%1 %0
7940   mt%0 %1
7941   mt%0 %1
7942   {l%U1%X1|lwz%U1%X1} %0,%1
7943   {st%U0%U1|stw%U0%U1} %1,%0"
7944  [(set (attr "type")
7945     (cond [(eq_attr "alternative" "0,3")
7946		(const_string "cr_logical")
7947	    (eq_attr "alternative" "1,2")
7948		(const_string "mtcr")
7949	    (eq_attr "alternative" "6,7,9")
7950		(const_string "integer")
7951	    (eq_attr "alternative" "8")
7952		(const_string "mfjmpr")
7953	    (eq_attr "alternative" "10")
7954		(const_string "mtjmpr")
7955	    (eq_attr "alternative" "11")
7956		(const_string "load")
7957	    (eq_attr "alternative" "12")
7958		(const_string "store")
7959	    (ne (symbol_ref "TARGET_MFCRF") (const_int 0))
7960		(const_string "mfcrf")
7961	   ]
7962	(const_string "mfcr")))
7963   (set_attr "length" "4,4,12,4,4,8,4,4,4,4,4,4,4")])
7964
7965;; For floating-point, we normally deal with the floating-point registers
7966;; unless -msoft-float is used.  The sole exception is that parameter passing
7967;; can produce floating-point values in fixed-point registers.  Unless the
7968;; value is a simple constant or already in memory, we deal with this by
7969;; allocating memory and copying the value explicitly via that memory location.
7970(define_expand "movsf"
7971  [(set (match_operand:SF 0 "nonimmediate_operand" "")
7972	(match_operand:SF 1 "any_operand" ""))]
7973  ""
7974  "{ rs6000_emit_move (operands[0], operands[1], SFmode); DONE; }")
7975
7976(define_split
7977  [(set (match_operand:SF 0 "gpc_reg_operand" "")
7978	(match_operand:SF 1 "const_double_operand" ""))]
7979  "reload_completed
7980   && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
7981       || (GET_CODE (operands[0]) == SUBREG
7982	   && GET_CODE (SUBREG_REG (operands[0])) == REG
7983	   && REGNO (SUBREG_REG (operands[0])) <= 31))"
7984  [(set (match_dup 2) (match_dup 3))]
7985  "
7986{
7987  long l;
7988  REAL_VALUE_TYPE rv;
7989
7990  REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
7991  REAL_VALUE_TO_TARGET_SINGLE (rv, l);
7992
7993  if (! TARGET_POWERPC64)
7994    operands[2] = operand_subword (operands[0], 0, 0, SFmode);
7995  else
7996    operands[2] = gen_lowpart (SImode, operands[0]);
7997
7998  operands[3] = gen_int_mode (l, SImode);
7999}")
8000
8001(define_insn "*movsf_hardfloat"
8002  [(set (match_operand:SF 0 "nonimmediate_operand" "=!r,!r,m,f,f,m,*c*l,*q,!r,*h,!r,!r")
8003	(match_operand:SF 1 "input_operand" "r,m,r,f,m,f,r,r,h,0,G,Fn"))]
8004  "(gpc_reg_operand (operands[0], SFmode)
8005   || gpc_reg_operand (operands[1], SFmode))
8006   && (TARGET_HARD_FLOAT && TARGET_FPRS)"
8007  "@
8008   mr %0,%1
8009   {l%U1%X1|lwz%U1%X1} %0,%1
8010   {st%U0%X0|stw%U0%X0} %1,%0
8011   fmr %0,%1
8012   lfs%U1%X1 %0,%1
8013   stfs%U0%X0 %1,%0
8014   mt%0 %1
8015   mt%0 %1
8016   mf%1 %0
8017   {cror 0,0,0|nop}
8018   #
8019   #"
8020  [(set_attr "type" "*,load,store,fp,fpload,fpstore,mtjmpr,*,mfjmpr,*,*,*")
8021   (set_attr "length" "4,4,4,4,4,4,4,4,4,4,4,8")])
8022
8023(define_insn "*movsf_softfloat"
8024  [(set (match_operand:SF 0 "nonimmediate_operand" "=r,cl,q,r,r,m,r,r,r,r,r,*h")
8025	(match_operand:SF 1 "input_operand" "r,r,r,h,m,r,I,L,R,G,Fn,0"))]
8026  "(gpc_reg_operand (operands[0], SFmode)
8027   || gpc_reg_operand (operands[1], SFmode))
8028   && (TARGET_SOFT_FLOAT || !TARGET_FPRS)"
8029  "@
8030   mr %0,%1
8031   mt%0 %1
8032   mt%0 %1
8033   mf%1 %0
8034   {l%U1%X1|lwz%U1%X1} %0,%1
8035   {st%U0%X0|stw%U0%X0} %1,%0
8036   {lil|li} %0,%1
8037   {liu|lis} %0,%v1
8038   {cal|la} %0,%a1
8039   #
8040   #
8041   {cror 0,0,0|nop}"
8042  [(set_attr "type" "*,mtjmpr,*,mfjmpr,load,store,*,*,*,*,*,*")
8043   (set_attr "length" "4,4,4,4,4,4,4,4,4,4,8,4")])
8044
8045
8046(define_expand "movdf"
8047  [(set (match_operand:DF 0 "nonimmediate_operand" "")
8048	(match_operand:DF 1 "any_operand" ""))]
8049  ""
8050  "{ rs6000_emit_move (operands[0], operands[1], DFmode); DONE; }")
8051
8052(define_split
8053  [(set (match_operand:DF 0 "gpc_reg_operand" "")
8054	(match_operand:DF 1 "const_int_operand" ""))]
8055  "! TARGET_POWERPC64 && reload_completed
8056   && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
8057       || (GET_CODE (operands[0]) == SUBREG
8058	   && GET_CODE (SUBREG_REG (operands[0])) == REG
8059	   && REGNO (SUBREG_REG (operands[0])) <= 31))"
8060  [(set (match_dup 2) (match_dup 4))
8061   (set (match_dup 3) (match_dup 1))]
8062  "
8063{
8064  int endian = (WORDS_BIG_ENDIAN == 0);
8065  HOST_WIDE_INT value = INTVAL (operands[1]);
8066
8067  operands[2] = operand_subword (operands[0], endian, 0, DFmode);
8068  operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
8069#if HOST_BITS_PER_WIDE_INT == 32
8070  operands[4] = (value & 0x80000000) ? constm1_rtx : const0_rtx;
8071#else
8072  operands[4] = GEN_INT (value >> 32);
8073  operands[1] = GEN_INT (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
8074#endif
8075}")
8076
8077(define_split
8078  [(set (match_operand:DF 0 "gpc_reg_operand" "")
8079	(match_operand:DF 1 "const_double_operand" ""))]
8080  "! TARGET_POWERPC64 && reload_completed
8081   && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
8082       || (GET_CODE (operands[0]) == SUBREG
8083	   && GET_CODE (SUBREG_REG (operands[0])) == REG
8084	   && REGNO (SUBREG_REG (operands[0])) <= 31))"
8085  [(set (match_dup 2) (match_dup 4))
8086   (set (match_dup 3) (match_dup 5))]
8087  "
8088{
8089  int endian = (WORDS_BIG_ENDIAN == 0);
8090  long l[2];
8091  REAL_VALUE_TYPE rv;
8092
8093  REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
8094  REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
8095
8096  operands[2] = operand_subword (operands[0], endian, 0, DFmode);
8097  operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
8098  operands[4] = gen_int_mode (l[endian], SImode);
8099  operands[5] = gen_int_mode (l[1 - endian], SImode);
8100}")
8101
8102(define_split
8103  [(set (match_operand:DF 0 "gpc_reg_operand" "")
8104	(match_operand:DF 1 "const_double_operand" ""))]
8105  "TARGET_POWERPC64 && reload_completed
8106   && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
8107       || (GET_CODE (operands[0]) == SUBREG
8108	   && GET_CODE (SUBREG_REG (operands[0])) == REG
8109	   && REGNO (SUBREG_REG (operands[0])) <= 31))"
8110  [(set (match_dup 2) (match_dup 3))]
8111  "
8112{
8113  int endian = (WORDS_BIG_ENDIAN == 0);
8114  long l[2];
8115  REAL_VALUE_TYPE rv;
8116#if HOST_BITS_PER_WIDE_INT >= 64
8117  HOST_WIDE_INT val;
8118#endif
8119
8120  REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
8121  REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
8122
8123  operands[2] = gen_lowpart (DImode, operands[0]);
8124  /* HIGHPART is lower memory address when WORDS_BIG_ENDIAN.  */
8125#if HOST_BITS_PER_WIDE_INT >= 64
8126  val = ((HOST_WIDE_INT)(unsigned long)l[endian] << 32
8127         | ((HOST_WIDE_INT)(unsigned long)l[1 - endian]));
8128
8129  operands[3] = gen_int_mode (val, DImode);
8130#else
8131  operands[3] = immed_double_const (l[1 - endian], l[endian], DImode);
8132#endif
8133}")
8134
8135;; Don't have reload use general registers to load a constant.  First,
8136;; it might not work if the output operand is the equivalent of
8137;; a non-offsettable memref, but also it is less efficient than loading
8138;; the constant into an FP register, since it will probably be used there.
8139;; The "??" is a kludge until we can figure out a more reasonable way
8140;; of handling these non-offsettable values.
8141(define_insn "*movdf_hardfloat32"
8142  [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,m,f,f,m,!r,!r,!r")
8143	(match_operand:DF 1 "input_operand" "r,m,r,f,m,f,G,H,F"))]
8144  "! TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
8145   && (gpc_reg_operand (operands[0], DFmode)
8146       || gpc_reg_operand (operands[1], DFmode))"
8147  "*
8148{
8149  switch (which_alternative)
8150    {
8151    default:
8152      gcc_unreachable ();
8153    case 0:
8154      /* We normally copy the low-numbered register first.  However, if
8155	 the first register operand 0 is the same as the second register
8156	 of operand 1, we must copy in the opposite order.  */
8157      if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
8158	return \"mr %L0,%L1\;mr %0,%1\";
8159      else
8160	return \"mr %0,%1\;mr %L0,%L1\";
8161    case 1:
8162      if (rs6000_offsettable_memref_p (operands[1])
8163	  || (GET_CODE (operands[1]) == MEM
8164	      && (GET_CODE (XEXP (operands[1], 0)) == LO_SUM
8165		  || GET_CODE (XEXP (operands[1], 0)) == PRE_INC
8166		  || GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)))
8167	{
8168	  /* If the low-address word is used in the address, we must load
8169	     it last.  Otherwise, load it first.  Note that we cannot have
8170	     auto-increment in that case since the address register is
8171	     known to be dead.  */
8172	  if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
8173				 operands[1], 0))
8174	    return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
8175	  else
8176	    return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\";
8177	}
8178      else
8179	{
8180	  rtx addreg;
8181
8182	  addreg = find_addr_reg (XEXP (operands[1], 0));
8183	  if (refers_to_regno_p (REGNO (operands[0]),
8184				 REGNO (operands[0]) + 1,
8185				 operands[1], 0))
8186	    {
8187	      output_asm_insn (\"{cal|la} %0,4(%0)\", &addreg);
8188	      output_asm_insn (\"{lx|lwzx} %L0,%1\", operands);
8189	      output_asm_insn (\"{cal|la} %0,-4(%0)\", &addreg);
8190	      return \"{lx|lwzx} %0,%1\";
8191	    }
8192	  else
8193	    {
8194	      output_asm_insn (\"{lx|lwzx} %0,%1\", operands);
8195	      output_asm_insn (\"{cal|la} %0,4(%0)\", &addreg);
8196	      output_asm_insn (\"{lx|lwzx} %L0,%1\", operands);
8197	      output_asm_insn (\"{cal|la} %0,-4(%0)\", &addreg);
8198	      return \"\";
8199	    }
8200	}
8201    case 2:
8202      if (rs6000_offsettable_memref_p (operands[0])
8203	  || (GET_CODE (operands[0]) == MEM
8204	      && (GET_CODE (XEXP (operands[0], 0)) == LO_SUM
8205		  || GET_CODE (XEXP (operands[0], 0)) == PRE_INC
8206		  || GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)))
8207	return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
8208      else
8209	{
8210	  rtx addreg;
8211
8212	  addreg = find_addr_reg (XEXP (operands[0], 0));
8213	  output_asm_insn (\"{stx|stwx} %1,%0\", operands);
8214	  output_asm_insn (\"{cal|la} %0,4(%0)\", &addreg);
8215	  output_asm_insn (\"{stx|stwx} %L1,%0\", operands);
8216	  output_asm_insn (\"{cal|la} %0,-4(%0)\", &addreg);
8217	  return \"\";
8218	}
8219    case 3:
8220      return \"fmr %0,%1\";
8221    case 4:
8222      return \"lfd%U1%X1 %0,%1\";
8223    case 5:
8224      return \"stfd%U0%X0 %1,%0\";
8225    case 6:
8226    case 7:
8227    case 8:
8228      return \"#\";
8229    }
8230}"
8231  [(set_attr "type" "two,load,store,fp,fpload,fpstore,*,*,*")
8232   (set_attr "length" "8,16,16,4,4,4,8,12,16")])
8233
8234(define_insn "*movdf_softfloat32"
8235  [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m,r,r,r")
8236	(match_operand:DF 1 "input_operand" "r,m,r,G,H,F"))]
8237  "! TARGET_POWERPC64 && (TARGET_SOFT_FLOAT || TARGET_E500_SINGLE)
8238   && (gpc_reg_operand (operands[0], DFmode)
8239       || gpc_reg_operand (operands[1], DFmode))"
8240  "*
8241{
8242  switch (which_alternative)
8243    {
8244    default:
8245      gcc_unreachable ();
8246    case 0:
8247      /* We normally copy the low-numbered register first.  However, if
8248	 the first register operand 0 is the same as the second register of
8249	 operand 1, we must copy in the opposite order.  */
8250      if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
8251	return \"mr %L0,%L1\;mr %0,%1\";
8252      else
8253	return \"mr %0,%1\;mr %L0,%L1\";
8254    case 1:
8255      /* If the low-address word is used in the address, we must load
8256	 it last.  Otherwise, load it first.  Note that we cannot have
8257	 auto-increment in that case since the address register is
8258	 known to be dead.  */
8259      if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
8260			     operands[1], 0))
8261	return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
8262      else
8263	return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\";
8264    case 2:
8265      return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
8266    case 3:
8267    case 4:
8268    case 5:
8269      return \"#\";
8270    }
8271}"
8272  [(set_attr "type" "two,load,store,*,*,*")
8273   (set_attr "length" "8,8,8,8,12,16")])
8274
8275; ld/std require word-aligned displacements -> 'Y' constraint.
8276; List Y->r and r->Y before r->r for reload.
8277(define_insn "*movdf_hardfloat64"
8278  [(set (match_operand:DF 0 "nonimmediate_operand" "=Y,r,!r,f,f,m,*c*l,!r,*h,!r,!r,!r")
8279	(match_operand:DF 1 "input_operand" "r,Y,r,f,m,f,r,h,0,G,H,F"))]
8280  "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
8281   && (gpc_reg_operand (operands[0], DFmode)
8282       || gpc_reg_operand (operands[1], DFmode))"
8283  "@
8284   std%U0%X0 %1,%0
8285   ld%U1%X1 %0,%1
8286   mr %0,%1
8287   fmr %0,%1
8288   lfd%U1%X1 %0,%1
8289   stfd%U0%X0 %1,%0
8290   mt%0 %1
8291   mf%1 %0
8292   {cror 0,0,0|nop}
8293   #
8294   #
8295   #"
8296  [(set_attr "type" "store,load,*,fp,fpload,fpstore,mtjmpr,mfjmpr,*,*,*,*")
8297   (set_attr "length" "4,4,4,4,4,4,4,4,4,8,12,16")])
8298
8299(define_insn "*movdf_softfloat64"
8300  [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Y,r,cl,r,r,r,r,*h")
8301	(match_operand:DF 1 "input_operand" "Y,r,r,r,h,G,H,F,0"))]
8302  "TARGET_POWERPC64 && (TARGET_SOFT_FLOAT || !TARGET_FPRS)
8303   && (gpc_reg_operand (operands[0], DFmode)
8304       || gpc_reg_operand (operands[1], DFmode))"
8305  "@
8306   ld%U1%X1 %0,%1
8307   std%U0%X0 %1,%0
8308   mr %0,%1
8309   mt%0 %1
8310   mf%1 %0
8311   #
8312   #
8313   #
8314   {cror 0,0,0|nop}"
8315  [(set_attr "type" "load,store,*,mtjmpr,mfjmpr,*,*,*,*")
8316   (set_attr "length" "4,4,4,4,4,8,12,16,4")])
8317
8318(define_expand "movtf"
8319  [(set (match_operand:TF 0 "general_operand" "")
8320	(match_operand:TF 1 "any_operand" ""))]
8321  "!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128"
8322  "{ rs6000_emit_move (operands[0], operands[1], TFmode); DONE; }")
8323
8324; It's important to list the o->f and f->o moves before f->f because
8325; otherwise reload, given m->f, will try to pick f->f and reload it,
8326; which doesn't make progress.  Likewise r->Y must be before r->r.
8327(define_insn_and_split "*movtf_internal"
8328  [(set (match_operand:TF 0 "nonimmediate_operand" "=o,f,f,r,Y,r")
8329	(match_operand:TF 1 "input_operand"         "f,o,f,YGHF,r,r"))]
8330  "!TARGET_IEEEQUAD
8331   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128
8332   && (gpc_reg_operand (operands[0], TFmode)
8333       || gpc_reg_operand (operands[1], TFmode))"
8334  "#"
8335  "&& reload_completed"
8336  [(pc)]
8337{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
8338  [(set_attr "length" "8,8,8,20,20,16")])
8339
8340(define_insn_and_split "*movtf_softfloat"
8341  [(set (match_operand:TF 0 "nonimmediate_operand" "=r,Y,r")
8342	(match_operand:TF 1 "input_operand"         "YGHF,r,r"))]
8343  "!TARGET_IEEEQUAD
8344   && (TARGET_SOFT_FLOAT || !TARGET_FPRS) && TARGET_LONG_DOUBLE_128
8345   && (gpc_reg_operand (operands[0], TFmode)
8346       || gpc_reg_operand (operands[1], TFmode))"
8347  "#"
8348  "&& reload_completed"
8349  [(pc)]
8350{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
8351  [(set_attr "length" "20,20,16")])
8352
8353(define_expand "extenddftf2"
8354  [(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "")
8355		   (float_extend:TF (match_operand:DF 1 "input_operand" "")))
8356	      (use (match_dup 2))])]
8357  "!TARGET_IEEEQUAD
8358   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8359{
8360  operands[2] = CONST0_RTX (DFmode);
8361  /* Generate GOT reference early for SVR4 PIC.  */
8362  if (DEFAULT_ABI == ABI_V4 && flag_pic)
8363    operands[2] = validize_mem (force_const_mem (DFmode, operands[2]));
8364})
8365
8366(define_insn_and_split "*extenddftf2_internal"
8367  [(set (match_operand:TF 0 "nonimmediate_operand" "=o,f,&f,r")
8368       (float_extend:TF (match_operand:DF 1 "input_operand" "fr,mf,mf,rmGHF")))
8369   (use (match_operand:DF 2 "zero_reg_mem_operand" "rf,m,f,n"))]
8370  "!TARGET_IEEEQUAD
8371   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8372  "#"
8373  "&& reload_completed"
8374  [(pc)]
8375{
8376  const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
8377  const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
8378  emit_move_insn (simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word),
8379		  operands[1]);
8380  emit_move_insn (simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word),
8381		  operands[2]);
8382  DONE;
8383})
8384
8385(define_expand "extendsftf2"
8386  [(set (match_operand:TF 0 "nonimmediate_operand" "")
8387	(float_extend:TF (match_operand:SF 1 "gpc_reg_operand" "")))]
8388  "!TARGET_IEEEQUAD
8389   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8390{
8391  rtx tmp = gen_reg_rtx (DFmode);
8392  emit_insn (gen_extendsfdf2 (tmp, operands[1]));
8393  emit_insn (gen_extenddftf2 (operands[0], tmp));
8394  DONE;
8395})
8396
8397(define_expand "trunctfdf2"
8398  [(set (match_operand:DF 0 "gpc_reg_operand" "")
8399	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "")))]
8400  "!TARGET_IEEEQUAD
8401   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8402  "")
8403
8404(define_insn_and_split "trunctfdf2_internal1"
8405  [(set (match_operand:DF 0 "gpc_reg_operand" "=f,?f")
8406	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "0,f")))]
8407  "!TARGET_IEEEQUAD && !TARGET_XL_COMPAT
8408   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8409  "@
8410   #
8411   fmr %0,%1"
8412  "&& reload_completed && REGNO (operands[0]) == REGNO (operands[1])"
8413  [(const_int 0)]
8414{
8415  emit_note (NOTE_INSN_DELETED);
8416  DONE;
8417}
8418  [(set_attr "type" "fp")])
8419
8420(define_insn "trunctfdf2_internal2"
8421  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
8422	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))]
8423  "!TARGET_IEEEQUAD && TARGET_XL_COMPAT
8424   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8425  "fadd %0,%1,%L1"
8426  [(set_attr "type" "fp")])
8427
8428(define_insn_and_split "trunctfsf2"
8429  [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
8430	(float_truncate:SF (match_operand:TF 1 "gpc_reg_operand" "f")))
8431   (clobber (match_scratch:DF 2 "=f"))]
8432  "!TARGET_IEEEQUAD
8433   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8434  "#"
8435  "&& reload_completed"
8436  [(set (match_dup 2)
8437	(float_truncate:DF (match_dup 1)))
8438   (set (match_dup 0)
8439	(float_truncate:SF (match_dup 2)))]
8440  "")
8441
8442(define_expand "floatsitf2"
8443  [(set (match_operand:TF 0 "gpc_reg_operand" "")
8444        (float:TF (match_operand:SI 1 "gpc_reg_operand" "")))]
8445  "!TARGET_IEEEQUAD
8446   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8447{
8448  rtx tmp = gen_reg_rtx (DFmode);
8449  expand_float (tmp, operands[1], false);
8450  emit_insn (gen_extenddftf2 (operands[0], tmp));
8451  DONE;
8452})
8453
8454; fadd, but rounding towards zero.
8455; This is probably not the optimal code sequence.
8456(define_insn "fix_trunc_helper"
8457  [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
8458	(unspec:DF [(match_operand:TF 1 "gpc_reg_operand" "f")]
8459		   UNSPEC_FIX_TRUNC_TF))
8460   (clobber (match_operand:DF 2 "gpc_reg_operand" "=&f"))]
8461  "TARGET_HARD_FLOAT && TARGET_FPRS"
8462  "mffs %2\n\tmtfsb1 31\n\tmtfsb0 30\n\tfadd %0,%1,%L1\n\tmtfsf 1,%2"
8463  [(set_attr "type" "fp")
8464   (set_attr "length" "20")])
8465
8466(define_expand "fix_trunctfsi2"
8467  [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
8468		   (fix:SI (match_operand:TF 1 "gpc_reg_operand" "")))
8469	      (clobber (match_dup 2))
8470	      (clobber (match_dup 3))
8471	      (clobber (match_dup 4))
8472	      (clobber (match_dup 5))])]
8473  "!TARGET_IEEEQUAD
8474   && (TARGET_POWER2 || TARGET_POWERPC)
8475   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8476{
8477  operands[2] = gen_reg_rtx (DFmode);
8478  operands[3] = gen_reg_rtx (DFmode);
8479  operands[4] = gen_reg_rtx (DImode);
8480  operands[5] = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);
8481})
8482
8483(define_insn_and_split "*fix_trunctfsi2_internal"
8484  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8485        (fix:SI (match_operand:TF 1 "gpc_reg_operand" "f")))
8486   (clobber (match_operand:DF 2 "gpc_reg_operand" "=f"))
8487   (clobber (match_operand:DF 3 "gpc_reg_operand" "=&f"))
8488   (clobber (match_operand:DI 4 "gpc_reg_operand" "=f"))
8489   (clobber (match_operand:DI 5 "memory_operand" "=o"))]
8490  "!TARGET_IEEEQUAD
8491   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8492  "#"
8493  "&& (!no_new_pseudos || offsettable_nonstrict_memref_p (operands[5]))"
8494  [(pc)]
8495{
8496  rtx lowword;
8497  emit_insn (gen_fix_trunc_helper (operands[2], operands[1], operands[3]));
8498
8499  gcc_assert (MEM_P (operands[5]));
8500  lowword = adjust_address (operands[5], SImode, WORDS_BIG_ENDIAN ? 4 : 0);
8501
8502  emit_insn (gen_fctiwz (operands[4], operands[2]));
8503  emit_move_insn (operands[5], operands[4]);
8504  emit_move_insn (operands[0], lowword);
8505  DONE;
8506})
8507
8508(define_insn "negtf2"
8509  [(set (match_operand:TF 0 "gpc_reg_operand" "=f")
8510	(neg:TF (match_operand:TF 1 "gpc_reg_operand" "f")))]
8511  "!TARGET_IEEEQUAD
8512   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8513  "*
8514{
8515  if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
8516    return \"fneg %L0,%L1\;fneg %0,%1\";
8517  else
8518    return \"fneg %0,%1\;fneg %L0,%L1\";
8519}"
8520  [(set_attr "type" "fp")
8521   (set_attr "length" "8")])
8522
8523(define_expand "abstf2"
8524  [(set (match_operand:TF 0 "gpc_reg_operand" "=f")
8525	(abs:TF (match_operand:TF 1 "gpc_reg_operand" "f")))]
8526  "!TARGET_IEEEQUAD
8527   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8528  "
8529{
8530  rtx label = gen_label_rtx ();
8531  emit_insn (gen_abstf2_internal (operands[0], operands[1], label));
8532  emit_label (label);
8533  DONE;
8534}")
8535
8536(define_expand "abstf2_internal"
8537  [(set (match_operand:TF 0 "gpc_reg_operand" "=f")
8538	(match_operand:TF 1 "gpc_reg_operand" "f"))
8539   (set (match_dup 3) (match_dup 5))
8540   (set (match_dup 5) (abs:DF (match_dup 5)))
8541   (set (match_dup 4) (compare:CCFP (match_dup 3) (match_dup 5)))
8542   (set (pc) (if_then_else (eq (match_dup 4) (const_int 0))
8543			   (label_ref (match_operand 2 "" ""))
8544			   (pc)))
8545   (set (match_dup 6) (neg:DF (match_dup 6)))]
8546  "!TARGET_IEEEQUAD
8547   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
8548  "
8549{
8550  const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
8551  const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
8552  operands[3] = gen_reg_rtx (DFmode);
8553  operands[4] = gen_reg_rtx (CCFPmode);
8554  operands[5] = simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word);
8555  operands[6] = simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word);
8556}")
8557
8558;; Next come the multi-word integer load and store and the load and store
8559;; multiple insns.
8560
8561; List r->r after r->"o<>", otherwise reload will try to reload a
8562; non-offsettable address by using r->r which won't make progress.
8563(define_insn "*movdi_internal32"
8564  [(set (match_operand:DI 0 "nonimmediate_operand" "=o<>,r,r,*f,*f,m,r")
8565	(match_operand:DI 1 "input_operand" "r,r,m,f,m,f,IJKnGHF"))]
8566  "! TARGET_POWERPC64
8567   && (gpc_reg_operand (operands[0], DImode)
8568       || gpc_reg_operand (operands[1], DImode))"
8569  "@
8570   #
8571   #
8572   #
8573   fmr %0,%1
8574   lfd%U1%X1 %0,%1
8575   stfd%U0%X0 %1,%0
8576   #"
8577  [(set_attr "type" "load,*,store,fp,fpload,fpstore,*")])
8578
8579(define_split
8580  [(set (match_operand:DI 0 "gpc_reg_operand" "")
8581	(match_operand:DI 1 "const_int_operand" ""))]
8582  "! TARGET_POWERPC64 && reload_completed"
8583  [(set (match_dup 2) (match_dup 4))
8584   (set (match_dup 3) (match_dup 1))]
8585  "
8586{
8587  HOST_WIDE_INT value = INTVAL (operands[1]);
8588  operands[2] = operand_subword_force (operands[0], WORDS_BIG_ENDIAN == 0,
8589				       DImode);
8590  operands[3] = operand_subword_force (operands[0], WORDS_BIG_ENDIAN != 0,
8591				       DImode);
8592#if HOST_BITS_PER_WIDE_INT == 32
8593  operands[4] = (value & 0x80000000) ? constm1_rtx : const0_rtx;
8594#else
8595  operands[4] = GEN_INT (value >> 32);
8596  operands[1] = GEN_INT (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
8597#endif
8598}")
8599
8600(define_split
8601  [(set (match_operand:DI 0 "nonimmediate_operand" "")
8602        (match_operand:DI 1 "input_operand" ""))]
8603  "reload_completed && !TARGET_POWERPC64
8604   && gpr_or_gpr_p (operands[0], operands[1])"
8605  [(pc)]
8606{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
8607
8608(define_insn "*movdi_internal64"
8609  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,*f,*f,m,r,*h,*h")
8610	(match_operand:DI 1 "input_operand" "r,m,r,I,L,nF,R,f,m,f,*h,r,0"))]
8611  "TARGET_POWERPC64
8612   && (gpc_reg_operand (operands[0], DImode)
8613       || gpc_reg_operand (operands[1], DImode))"
8614  "@
8615   mr %0,%1
8616   ld%U1%X1 %0,%1
8617   std%U0%X0 %1,%0
8618   li %0,%1
8619   lis %0,%v1
8620   #
8621   {cal|la} %0,%a1
8622   fmr %0,%1
8623   lfd%U1%X1 %0,%1
8624   stfd%U0%X0 %1,%0
8625   mf%1 %0
8626   mt%0 %1
8627   {cror 0,0,0|nop}"
8628  [(set_attr "type" "*,load,store,*,*,*,*,fp,fpload,fpstore,mfjmpr,mtjmpr,*")
8629   (set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4")])
8630
8631;; immediate value valid for a single instruction hiding in a const_double
8632(define_insn ""
8633  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
8634	(match_operand:DI 1 "const_double_operand" "F"))]
8635  "HOST_BITS_PER_WIDE_INT == 32 && TARGET_POWERPC64
8636   && GET_CODE (operands[1]) == CONST_DOUBLE
8637   && num_insns_constant (operands[1], DImode) == 1"
8638  "*
8639{
8640  return ((unsigned HOST_WIDE_INT)
8641	  (CONST_DOUBLE_LOW (operands[1]) + 0x8000) < 0x10000)
8642	 ? \"li %0,%1\" : \"lis %0,%v1\";
8643}")
8644
8645;; Generate all one-bits and clear left or right.
8646;; Use (and:DI (rotate:DI ...)) to avoid anddi3 unnecessary clobber.
8647(define_split
8648  [(set (match_operand:DI 0 "gpc_reg_operand" "")
8649	(match_operand:DI 1 "mask64_operand" ""))]
8650  "TARGET_POWERPC64 && num_insns_constant (operands[1], DImode) > 1"
8651  [(set (match_dup 0) (const_int -1))
8652   (set (match_dup 0)
8653	(and:DI (rotate:DI (match_dup 0)
8654			   (const_int 0))
8655		(match_dup 1)))]
8656  "")
8657
8658;; Split a load of a large constant into the appropriate five-instruction
8659;; sequence.  Handle anything in a constant number of insns.
8660;; When non-easy constants can go in the TOC, this should use
8661;; easy_fp_constant predicate.
8662(define_split
8663  [(set (match_operand:DI 0 "gpc_reg_operand" "")
8664	(match_operand:DI 1 "const_int_operand" ""))]
8665  "TARGET_POWERPC64 && num_insns_constant (operands[1], DImode) > 1"
8666  [(set (match_dup 0) (match_dup 2))
8667   (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 3)))]
8668  "
8669{ rtx tem = rs6000_emit_set_const (operands[0], DImode, operands[1], 5);
8670
8671  if (tem == operands[0])
8672    DONE;
8673  else
8674    FAIL;
8675}")
8676
8677(define_split
8678  [(set (match_operand:DI 0 "gpc_reg_operand" "")
8679	(match_operand:DI 1 "const_double_operand" ""))]
8680  "TARGET_POWERPC64 && num_insns_constant (operands[1], DImode) > 1"
8681  [(set (match_dup 0) (match_dup 2))
8682   (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 3)))]
8683  "
8684{ rtx tem = rs6000_emit_set_const (operands[0], DImode, operands[1], 5);
8685
8686  if (tem == operands[0])
8687    DONE;
8688  else
8689    FAIL;
8690}")
8691
8692;; TImode is similar, except that we usually want to compute the address into
8693;; a register and use lsi/stsi (the exception is during reload).  MQ is also
8694;; clobbered in stsi for POWER, so we need a SCRATCH for it.
8695
8696;; We say that MQ is clobbered in the last alternative because the first
8697;; alternative would never get used otherwise since it would need a reload
8698;; while the 2nd alternative would not.  We put memory cases first so they
8699;; are preferred.  Otherwise, we'd try to reload the output instead of
8700;; giving the SCRATCH mq.
8701
8702(define_insn "*movti_power"
8703  [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,????r,????r,????r,r")
8704	(match_operand:TI 1 "input_operand" "r,r,r,Q,m,n"))
8705   (clobber (match_scratch:SI 2 "=q,q#X,X,X,X,X"))]
8706  "TARGET_POWER && ! TARGET_POWERPC64
8707   && (gpc_reg_operand (operands[0], TImode) || gpc_reg_operand (operands[1], TImode))"
8708  "*
8709{
8710  switch (which_alternative)
8711    {
8712    default:
8713      gcc_unreachable ();
8714
8715    case 0:
8716      if (TARGET_STRING)
8717        return \"{stsi|stswi} %1,%P0,16\";
8718    case 1:
8719    case 2:
8720      return \"#\";
8721    case 3:
8722      /* If the address is not used in the output, we can use lsi.  Otherwise,
8723	 fall through to generating four loads.  */
8724      if (TARGET_STRING
8725	  && ! reg_overlap_mentioned_p (operands[0], operands[1]))
8726	return \"{lsi|lswi} %0,%P1,16\";
8727      /* ... fall through ...  */
8728    case 4:
8729    case 5:
8730      return \"#\";
8731    }
8732}"
8733  [(set_attr "type" "store,store,*,load,load,*")])
8734
8735(define_insn "*movti_string"
8736  [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,o<>,????r,????r,????r,r")
8737	(match_operand:TI 1 "input_operand" "r,r,r,Q,m,n"))]
8738  "! TARGET_POWER && ! TARGET_POWERPC64
8739   && (gpc_reg_operand (operands[0], TImode) || gpc_reg_operand (operands[1], TImode))"
8740  "*
8741{
8742  switch (which_alternative)
8743    {
8744    default:
8745      gcc_unreachable ();
8746    case 0:
8747      if (TARGET_STRING)
8748        return \"{stsi|stswi} %1,%P0,16\";
8749    case 1:
8750    case 2:
8751      return \"#\";
8752    case 3:
8753      /* If the address is not used in the output, we can use lsi.  Otherwise,
8754	 fall through to generating four loads.  */
8755      if (TARGET_STRING
8756          && ! reg_overlap_mentioned_p (operands[0], operands[1]))
8757	return \"{lsi|lswi} %0,%P1,16\";
8758      /* ... fall through ...  */
8759    case 4:
8760    case 5:
8761      return \"#\";
8762    }
8763}"
8764  [(set_attr "type" "store_ux,store_ux,*,load_ux,load_ux,*")])
8765
8766(define_insn "*movti_ppc64"
8767  [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o<>,r")
8768	(match_operand:TI 1 "input_operand" "r,r,m"))]
8769  "TARGET_POWERPC64 && (gpc_reg_operand (operands[0], TImode)
8770   || gpc_reg_operand (operands[1], TImode))"
8771  "#"
8772  [(set_attr "type" "*,load,store")])
8773
8774(define_split
8775  [(set (match_operand:TI 0 "gpc_reg_operand" "")
8776	(match_operand:TI 1 "const_double_operand" ""))]
8777  "TARGET_POWERPC64"
8778  [(set (match_dup 2) (match_dup 4))
8779   (set (match_dup 3) (match_dup 5))]
8780  "
8781{
8782  operands[2] = operand_subword_force (operands[0], WORDS_BIG_ENDIAN == 0,
8783				       TImode);
8784  operands[3] = operand_subword_force (operands[0], WORDS_BIG_ENDIAN != 0,
8785				       TImode);
8786  if (GET_CODE (operands[1]) == CONST_DOUBLE)
8787    {
8788      operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
8789      operands[5] = GEN_INT (CONST_DOUBLE_LOW (operands[1]));
8790    }
8791  else if (GET_CODE (operands[1]) == CONST_INT)
8792    {
8793      operands[4] = GEN_INT (- (INTVAL (operands[1]) < 0));
8794      operands[5] = operands[1];
8795    }
8796  else
8797    FAIL;
8798}")
8799
8800(define_split
8801  [(set (match_operand:TI 0 "nonimmediate_operand" "")
8802        (match_operand:TI 1 "input_operand" ""))]
8803  "reload_completed
8804   && gpr_or_gpr_p (operands[0], operands[1])"
8805  [(pc)]
8806{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
8807
8808(define_expand "load_multiple"
8809  [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
8810			  (match_operand:SI 1 "" ""))
8811		     (use (match_operand:SI 2 "" ""))])]
8812  "TARGET_STRING && !TARGET_POWERPC64"
8813  "
8814{
8815  int regno;
8816  int count;
8817  rtx op1;
8818  int i;
8819
8820  /* Support only loading a constant number of fixed-point registers from
8821     memory and only bother with this if more than two; the machine
8822     doesn't support more than eight.  */
8823  if (GET_CODE (operands[2]) != CONST_INT
8824      || INTVAL (operands[2]) <= 2
8825      || INTVAL (operands[2]) > 8
8826      || GET_CODE (operands[1]) != MEM
8827      || GET_CODE (operands[0]) != REG
8828      || REGNO (operands[0]) >= 32)
8829    FAIL;
8830
8831  count = INTVAL (operands[2]);
8832  regno = REGNO (operands[0]);
8833
8834  operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
8835  op1 = replace_equiv_address (operands[1],
8836			       force_reg (SImode, XEXP (operands[1], 0)));
8837
8838  for (i = 0; i < count; i++)
8839    XVECEXP (operands[3], 0, i)
8840      = gen_rtx_SET (VOIDmode, gen_rtx_REG (SImode, regno + i),
8841		     adjust_address_nv (op1, SImode, i * 4));
8842}")
8843
8844(define_insn "*ldmsi8"
8845  [(match_parallel 0 "load_multiple_operation"
8846    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8847          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8848     (set (match_operand:SI 3 "gpc_reg_operand" "")
8849          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8850     (set (match_operand:SI 4 "gpc_reg_operand" "")
8851          (mem:SI (plus:SI (match_dup 1) (const_int 8))))
8852     (set (match_operand:SI 5 "gpc_reg_operand" "")
8853          (mem:SI (plus:SI (match_dup 1) (const_int 12))))
8854     (set (match_operand:SI 6 "gpc_reg_operand" "")
8855          (mem:SI (plus:SI (match_dup 1) (const_int 16))))
8856     (set (match_operand:SI 7 "gpc_reg_operand" "")
8857          (mem:SI (plus:SI (match_dup 1) (const_int 20))))
8858     (set (match_operand:SI 8 "gpc_reg_operand" "")
8859          (mem:SI (plus:SI (match_dup 1) (const_int 24))))
8860     (set (match_operand:SI 9 "gpc_reg_operand" "")
8861          (mem:SI (plus:SI (match_dup 1) (const_int 28))))])]
8862  "TARGET_STRING && XVECLEN (operands[0], 0) == 8"
8863  "*
8864{ return rs6000_output_load_multiple (operands); }"
8865  [(set_attr "type" "load_ux")
8866   (set_attr "length" "32")])
8867
8868(define_insn "*ldmsi7"
8869  [(match_parallel 0 "load_multiple_operation"
8870    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8871          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8872     (set (match_operand:SI 3 "gpc_reg_operand" "")
8873          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8874     (set (match_operand:SI 4 "gpc_reg_operand" "")
8875          (mem:SI (plus:SI (match_dup 1) (const_int 8))))
8876     (set (match_operand:SI 5 "gpc_reg_operand" "")
8877          (mem:SI (plus:SI (match_dup 1) (const_int 12))))
8878     (set (match_operand:SI 6 "gpc_reg_operand" "")
8879          (mem:SI (plus:SI (match_dup 1) (const_int 16))))
8880     (set (match_operand:SI 7 "gpc_reg_operand" "")
8881          (mem:SI (plus:SI (match_dup 1) (const_int 20))))
8882     (set (match_operand:SI 8 "gpc_reg_operand" "")
8883          (mem:SI (plus:SI (match_dup 1) (const_int 24))))])]
8884  "TARGET_STRING && XVECLEN (operands[0], 0) == 7"
8885  "*
8886{ return rs6000_output_load_multiple (operands); }"
8887  [(set_attr "type" "load_ux")
8888   (set_attr "length" "32")])
8889
8890(define_insn "*ldmsi6"
8891  [(match_parallel 0 "load_multiple_operation"
8892    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8893          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8894     (set (match_operand:SI 3 "gpc_reg_operand" "")
8895          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8896     (set (match_operand:SI 4 "gpc_reg_operand" "")
8897          (mem:SI (plus:SI (match_dup 1) (const_int 8))))
8898     (set (match_operand:SI 5 "gpc_reg_operand" "")
8899          (mem:SI (plus:SI (match_dup 1) (const_int 12))))
8900     (set (match_operand:SI 6 "gpc_reg_operand" "")
8901          (mem:SI (plus:SI (match_dup 1) (const_int 16))))
8902     (set (match_operand:SI 7 "gpc_reg_operand" "")
8903          (mem:SI (plus:SI (match_dup 1) (const_int 20))))])]
8904  "TARGET_STRING && XVECLEN (operands[0], 0) == 6"
8905  "*
8906{ return rs6000_output_load_multiple (operands); }"
8907  [(set_attr "type" "load_ux")
8908   (set_attr "length" "32")])
8909
8910(define_insn "*ldmsi5"
8911  [(match_parallel 0 "load_multiple_operation"
8912    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8913          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8914     (set (match_operand:SI 3 "gpc_reg_operand" "")
8915          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8916     (set (match_operand:SI 4 "gpc_reg_operand" "")
8917          (mem:SI (plus:SI (match_dup 1) (const_int 8))))
8918     (set (match_operand:SI 5 "gpc_reg_operand" "")
8919          (mem:SI (plus:SI (match_dup 1) (const_int 12))))
8920     (set (match_operand:SI 6 "gpc_reg_operand" "")
8921          (mem:SI (plus:SI (match_dup 1) (const_int 16))))])]
8922  "TARGET_STRING && XVECLEN (operands[0], 0) == 5"
8923  "*
8924{ return rs6000_output_load_multiple (operands); }"
8925  [(set_attr "type" "load_ux")
8926   (set_attr "length" "32")])
8927
8928(define_insn "*ldmsi4"
8929  [(match_parallel 0 "load_multiple_operation"
8930    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8931          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8932     (set (match_operand:SI 3 "gpc_reg_operand" "")
8933          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8934     (set (match_operand:SI 4 "gpc_reg_operand" "")
8935          (mem:SI (plus:SI (match_dup 1) (const_int 8))))
8936     (set (match_operand:SI 5 "gpc_reg_operand" "")
8937          (mem:SI (plus:SI (match_dup 1) (const_int 12))))])]
8938  "TARGET_STRING && XVECLEN (operands[0], 0) == 4"
8939  "*
8940{ return rs6000_output_load_multiple (operands); }"
8941  [(set_attr "type" "load_ux")
8942   (set_attr "length" "32")])
8943
8944(define_insn "*ldmsi3"
8945  [(match_parallel 0 "load_multiple_operation"
8946    [(set (match_operand:SI 2 "gpc_reg_operand" "")
8947          (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")))
8948     (set (match_operand:SI 3 "gpc_reg_operand" "")
8949          (mem:SI (plus:SI (match_dup 1) (const_int 4))))
8950     (set (match_operand:SI 4 "gpc_reg_operand" "")
8951          (mem:SI (plus:SI (match_dup 1) (const_int 8))))])]
8952  "TARGET_STRING && XVECLEN (operands[0], 0) == 3"
8953  "*
8954{ return rs6000_output_load_multiple (operands); }"
8955  [(set_attr "type" "load_ux")
8956   (set_attr "length" "32")])
8957
8958(define_expand "store_multiple"
8959  [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
8960			  (match_operand:SI 1 "" ""))
8961		     (clobber (scratch:SI))
8962		     (use (match_operand:SI 2 "" ""))])]
8963  "TARGET_STRING && !TARGET_POWERPC64"
8964  "
8965{
8966  int regno;
8967  int count;
8968  rtx to;
8969  rtx op0;
8970  int i;
8971
8972  /* Support only storing a constant number of fixed-point registers to
8973     memory and only bother with this if more than two; the machine
8974     doesn't support more than eight.  */
8975  if (GET_CODE (operands[2]) != CONST_INT
8976      || INTVAL (operands[2]) <= 2
8977      || INTVAL (operands[2]) > 8
8978      || GET_CODE (operands[0]) != MEM
8979      || GET_CODE (operands[1]) != REG
8980      || REGNO (operands[1]) >= 32)
8981    FAIL;
8982
8983  count = INTVAL (operands[2]);
8984  regno = REGNO (operands[1]);
8985
8986  operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + 1));
8987  to = force_reg (SImode, XEXP (operands[0], 0));
8988  op0 = replace_equiv_address (operands[0], to);
8989
8990  XVECEXP (operands[3], 0, 0)
8991    = gen_rtx_SET (VOIDmode, adjust_address_nv (op0, SImode, 0), operands[1]);
8992  XVECEXP (operands[3], 0, 1) = gen_rtx_CLOBBER (VOIDmode,
8993						 gen_rtx_SCRATCH (SImode));
8994
8995  for (i = 1; i < count; i++)
8996    XVECEXP (operands[3], 0, i + 1)
8997      = gen_rtx_SET (VOIDmode,
8998		     adjust_address_nv (op0, SImode, i * 4),
8999		     gen_rtx_REG (SImode, regno + i));
9000}")
9001
9002(define_insn "*stmsi8"
9003  [(match_parallel 0 "store_multiple_operation"
9004    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9005	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9006     (clobber (match_scratch:SI 3 "=X"))
9007     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9008	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9009     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9010	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9011     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9012	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9013     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9014	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9015     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9016	  (match_operand:SI 8 "gpc_reg_operand" "r"))
9017     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
9018	  (match_operand:SI 9 "gpc_reg_operand" "r"))
9019     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
9020	  (match_operand:SI 10 "gpc_reg_operand" "r"))])]
9021  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 9"
9022  "{stsi|stswi} %2,%1,%O0"
9023  [(set_attr "type" "store_ux")])
9024
9025(define_insn "*stmsi7"
9026  [(match_parallel 0 "store_multiple_operation"
9027    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9028	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9029     (clobber (match_scratch:SI 3 "=X"))
9030     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9031	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9032     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9033	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9034     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9035	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9036     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9037	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9038     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9039	  (match_operand:SI 8 "gpc_reg_operand" "r"))
9040     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
9041	  (match_operand:SI 9 "gpc_reg_operand" "r"))])]
9042  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 8"
9043  "{stsi|stswi} %2,%1,%O0"
9044  [(set_attr "type" "store_ux")])
9045
9046(define_insn "*stmsi6"
9047  [(match_parallel 0 "store_multiple_operation"
9048    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9049	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9050     (clobber (match_scratch:SI 3 "=X"))
9051     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9052	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9053     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9054	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9055     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9056	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9057     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9058	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9059     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9060	  (match_operand:SI 8 "gpc_reg_operand" "r"))])]
9061  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 7"
9062  "{stsi|stswi} %2,%1,%O0"
9063  [(set_attr "type" "store_ux")])
9064
9065(define_insn "*stmsi5"
9066  [(match_parallel 0 "store_multiple_operation"
9067    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9068	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9069     (clobber (match_scratch:SI 3 "=X"))
9070     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9071	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9072     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9073	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9074     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9075	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9076     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9077	  (match_operand:SI 7 "gpc_reg_operand" "r"))])]
9078  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 6"
9079  "{stsi|stswi} %2,%1,%O0"
9080  [(set_attr "type" "store_ux")])
9081
9082(define_insn "*stmsi4"
9083  [(match_parallel 0 "store_multiple_operation"
9084    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9085	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9086     (clobber (match_scratch:SI 3 "=X"))
9087     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9088	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9089     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9090	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9091     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9092	  (match_operand:SI 6 "gpc_reg_operand" "r"))])]
9093  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 5"
9094  "{stsi|stswi} %2,%1,%O0"
9095  [(set_attr "type" "store_ux")])
9096
9097(define_insn "*stmsi3"
9098  [(match_parallel 0 "store_multiple_operation"
9099    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9100	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9101     (clobber (match_scratch:SI 3 "=X"))
9102     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9103	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9104     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9105	  (match_operand:SI 5 "gpc_reg_operand" "r"))])]
9106  "TARGET_STRING && !TARGET_POWER && XVECLEN (operands[0], 0) == 4"
9107  "{stsi|stswi} %2,%1,%O0"
9108  [(set_attr "type" "store_ux")])
9109
9110(define_insn "*stmsi8_power"
9111  [(match_parallel 0 "store_multiple_operation"
9112    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9113	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9114     (clobber (match_scratch:SI 3 "=q"))
9115     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9116	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9117     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9118	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9119     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9120	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9121     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9122	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9123     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9124	  (match_operand:SI 8 "gpc_reg_operand" "r"))
9125     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
9126	  (match_operand:SI 9 "gpc_reg_operand" "r"))
9127     (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
9128	  (match_operand:SI 10 "gpc_reg_operand" "r"))])]
9129  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 9"
9130  "{stsi|stswi} %2,%1,%O0"
9131  [(set_attr "type" "store_ux")])
9132
9133(define_insn "*stmsi7_power"
9134  [(match_parallel 0 "store_multiple_operation"
9135    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9136	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9137     (clobber (match_scratch:SI 3 "=q"))
9138     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9139	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9140     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9141	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9142     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9143	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9144     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9145	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9146     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9147	  (match_operand:SI 8 "gpc_reg_operand" "r"))
9148     (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
9149	  (match_operand:SI 9 "gpc_reg_operand" "r"))])]
9150  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 8"
9151  "{stsi|stswi} %2,%1,%O0"
9152  [(set_attr "type" "store_ux")])
9153
9154(define_insn "*stmsi6_power"
9155  [(match_parallel 0 "store_multiple_operation"
9156    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9157	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9158     (clobber (match_scratch:SI 3 "=q"))
9159     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9160	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9161     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9162	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9163     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9164	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9165     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9166	  (match_operand:SI 7 "gpc_reg_operand" "r"))
9167     (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
9168	  (match_operand:SI 8 "gpc_reg_operand" "r"))])]
9169  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 7"
9170  "{stsi|stswi} %2,%1,%O0"
9171  [(set_attr "type" "store_ux")])
9172
9173(define_insn "*stmsi5_power"
9174  [(match_parallel 0 "store_multiple_operation"
9175    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9176	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9177     (clobber (match_scratch:SI 3 "=q"))
9178     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9179	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9180     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9181	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9182     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9183	  (match_operand:SI 6 "gpc_reg_operand" "r"))
9184     (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
9185	  (match_operand:SI 7 "gpc_reg_operand" "r"))])]
9186  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 6"
9187  "{stsi|stswi} %2,%1,%O0"
9188  [(set_attr "type" "store_ux")])
9189
9190(define_insn "*stmsi4_power"
9191  [(match_parallel 0 "store_multiple_operation"
9192    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9193	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9194     (clobber (match_scratch:SI 3 "=q"))
9195     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9196	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9197     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9198	  (match_operand:SI 5 "gpc_reg_operand" "r"))
9199     (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
9200	  (match_operand:SI 6 "gpc_reg_operand" "r"))])]
9201  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 5"
9202  "{stsi|stswi} %2,%1,%O0"
9203  [(set_attr "type" "store_ux")])
9204
9205(define_insn "*stmsi3_power"
9206  [(match_parallel 0 "store_multiple_operation"
9207    [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))
9208	  (match_operand:SI 2 "gpc_reg_operand" "r"))
9209     (clobber (match_scratch:SI 3 "=q"))
9210     (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
9211	  (match_operand:SI 4 "gpc_reg_operand" "r"))
9212     (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
9213	  (match_operand:SI 5 "gpc_reg_operand" "r"))])]
9214  "TARGET_STRING && TARGET_POWER && XVECLEN (operands[0], 0) == 4"
9215  "{stsi|stswi} %2,%1,%O0"
9216  [(set_attr "type" "store_ux")])
9217
9218(define_expand "setmemsi"
9219  [(parallel [(set (match_operand:BLK 0 "" "")
9220		   (match_operand 2 "const_int_operand" ""))
9221	      (use (match_operand:SI 1 "" ""))
9222	      (use (match_operand:SI 3 "" ""))])]
9223  ""
9224  "
9225{
9226  /* If value to set is not zero, use the library routine.  */
9227  if (operands[2] != const0_rtx)
9228    FAIL;
9229
9230  if (expand_block_clear (operands))
9231    DONE;
9232  else
9233    FAIL;
9234}")
9235
9236;; String/block move insn.
9237;; Argument 0 is the destination
9238;; Argument 1 is the source
9239;; Argument 2 is the length
9240;; Argument 3 is the alignment
9241
9242(define_expand "movmemsi"
9243  [(parallel [(set (match_operand:BLK 0 "" "")
9244		   (match_operand:BLK 1 "" ""))
9245	      (use (match_operand:SI 2 "" ""))
9246	      (use (match_operand:SI 3 "" ""))])]
9247  ""
9248  "
9249{
9250  if (expand_block_move (operands))
9251    DONE;
9252  else
9253    FAIL;
9254}")
9255
9256;; Move up to 32 bytes at a time.  The fixed registers are needed because the
9257;; register allocator doesn't have a clue about allocating 8 word registers.
9258;; rD/rS = r5 is preferred, efficient form.
9259(define_expand "movmemsi_8reg"
9260  [(parallel [(set (match_operand 0 "" "")
9261		   (match_operand 1 "" ""))
9262	      (use (match_operand 2 "" ""))
9263	      (use (match_operand 3 "" ""))
9264	      (clobber (reg:SI  5))
9265	      (clobber (reg:SI  6))
9266	      (clobber (reg:SI  7))
9267	      (clobber (reg:SI  8))
9268	      (clobber (reg:SI  9))
9269	      (clobber (reg:SI 10))
9270	      (clobber (reg:SI 11))
9271	      (clobber (reg:SI 12))
9272	      (clobber (match_scratch:SI 4 ""))])]
9273  "TARGET_STRING"
9274  "")
9275
9276(define_insn ""
9277  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9278	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9279   (use (match_operand:SI 2 "immediate_operand" "i"))
9280   (use (match_operand:SI 3 "immediate_operand" "i"))
9281   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9282   (clobber (reg:SI  6))
9283   (clobber (reg:SI  7))
9284   (clobber (reg:SI  8))
9285   (clobber (reg:SI  9))
9286   (clobber (reg:SI 10))
9287   (clobber (reg:SI 11))
9288   (clobber (reg:SI 12))
9289   (clobber (match_scratch:SI 5 "=q"))]
9290  "TARGET_STRING && TARGET_POWER
9291   && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32)
9292       || INTVAL (operands[2]) == 0)
9293   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
9294   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
9295   && REGNO (operands[4]) == 5"
9296  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9297  [(set_attr "type" "store_ux")
9298   (set_attr "length" "8")])
9299
9300(define_insn ""
9301  [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
9302	(mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
9303   (use (match_operand:SI 2 "immediate_operand" "i"))
9304   (use (match_operand:SI 3 "immediate_operand" "i"))
9305   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9306   (clobber (reg:SI  6))
9307   (clobber (reg:SI  7))
9308   (clobber (reg:SI  8))
9309   (clobber (reg:SI  9))
9310   (clobber (reg:SI 10))
9311   (clobber (reg:SI 11))
9312   (clobber (reg:SI 12))
9313   (clobber (match_scratch:SI 5 "=X"))]
9314  "TARGET_STRING && ! TARGET_POWER
9315   && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32)
9316       || INTVAL (operands[2]) == 0)
9317   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
9318   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
9319   && REGNO (operands[4]) == 5"
9320  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9321  [(set_attr "type" "store_ux")
9322   (set_attr "length" "8")])
9323
9324;; Move up to 24 bytes at a time.  The fixed registers are needed because the
9325;; register allocator doesn't have a clue about allocating 6 word registers.
9326;; rD/rS = r5 is preferred, efficient form.
9327(define_expand "movmemsi_6reg"
9328  [(parallel [(set (match_operand 0 "" "")
9329		   (match_operand 1 "" ""))
9330	      (use (match_operand 2 "" ""))
9331	      (use (match_operand 3 "" ""))
9332	      (clobber (reg:SI  5))
9333	      (clobber (reg:SI  6))
9334	      (clobber (reg:SI  7))
9335	      (clobber (reg:SI  8))
9336	      (clobber (reg:SI  9))
9337	      (clobber (reg:SI 10))
9338	      (clobber (match_scratch:SI 4 ""))])]
9339  "TARGET_STRING"
9340  "")
9341
9342(define_insn ""
9343  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9344	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9345   (use (match_operand:SI 2 "immediate_operand" "i"))
9346   (use (match_operand:SI 3 "immediate_operand" "i"))
9347   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9348   (clobber (reg:SI  6))
9349   (clobber (reg:SI  7))
9350   (clobber (reg:SI  8))
9351   (clobber (reg:SI  9))
9352   (clobber (reg:SI 10))
9353   (clobber (match_scratch:SI 5 "=q"))]
9354  "TARGET_STRING && TARGET_POWER
9355   && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24
9356   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 10)
9357   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 10)
9358   && REGNO (operands[4]) == 5"
9359  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9360  [(set_attr "type" "store_ux")
9361   (set_attr "length" "8")])
9362
9363(define_insn ""
9364  [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
9365	(mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
9366   (use (match_operand:SI 2 "immediate_operand" "i"))
9367   (use (match_operand:SI 3 "immediate_operand" "i"))
9368   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9369   (clobber (reg:SI  6))
9370   (clobber (reg:SI  7))
9371   (clobber (reg:SI  8))
9372   (clobber (reg:SI  9))
9373   (clobber (reg:SI 10))
9374   (clobber (match_scratch:SI 5 "=X"))]
9375  "TARGET_STRING && ! TARGET_POWER
9376   && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 32
9377   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 10)
9378   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 10)
9379   && REGNO (operands[4]) == 5"
9380  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9381  [(set_attr "type" "store_ux")
9382   (set_attr "length" "8")])
9383
9384;; Move up to 16 bytes at a time, using 4 fixed registers to avoid spill
9385;; problems with TImode.
9386;; rD/rS = r5 is preferred, efficient form.
9387(define_expand "movmemsi_4reg"
9388  [(parallel [(set (match_operand 0 "" "")
9389		   (match_operand 1 "" ""))
9390	      (use (match_operand 2 "" ""))
9391	      (use (match_operand 3 "" ""))
9392	      (clobber (reg:SI 5))
9393	      (clobber (reg:SI 6))
9394	      (clobber (reg:SI 7))
9395	      (clobber (reg:SI 8))
9396	      (clobber (match_scratch:SI 4 ""))])]
9397  "TARGET_STRING"
9398  "")
9399
9400(define_insn ""
9401  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9402	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9403   (use (match_operand:SI 2 "immediate_operand" "i"))
9404   (use (match_operand:SI 3 "immediate_operand" "i"))
9405   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9406   (clobber (reg:SI 6))
9407   (clobber (reg:SI 7))
9408   (clobber (reg:SI 8))
9409   (clobber (match_scratch:SI 5 "=q"))]
9410  "TARGET_STRING && TARGET_POWER
9411   && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
9412   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 8)
9413   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 8)
9414   && REGNO (operands[4]) == 5"
9415  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9416  [(set_attr "type" "store_ux")
9417   (set_attr "length" "8")])
9418
9419(define_insn ""
9420  [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
9421	(mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
9422   (use (match_operand:SI 2 "immediate_operand" "i"))
9423   (use (match_operand:SI 3 "immediate_operand" "i"))
9424   (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
9425   (clobber (reg:SI 6))
9426   (clobber (reg:SI 7))
9427   (clobber (reg:SI 8))
9428   (clobber (match_scratch:SI 5 "=X"))]
9429  "TARGET_STRING && ! TARGET_POWER
9430   && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
9431   && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 8)
9432   && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 8)
9433   && REGNO (operands[4]) == 5"
9434  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9435  [(set_attr "type" "store_ux")
9436   (set_attr "length" "8")])
9437
9438;; Move up to 8 bytes at a time.
9439(define_expand "movmemsi_2reg"
9440  [(parallel [(set (match_operand 0 "" "")
9441		   (match_operand 1 "" ""))
9442	      (use (match_operand 2 "" ""))
9443	      (use (match_operand 3 "" ""))
9444	      (clobber (match_scratch:DI 4 ""))
9445	      (clobber (match_scratch:SI 5 ""))])]
9446  "TARGET_STRING && ! TARGET_POWERPC64"
9447  "")
9448
9449(define_insn ""
9450  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9451	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9452   (use (match_operand:SI 2 "immediate_operand" "i"))
9453   (use (match_operand:SI 3 "immediate_operand" "i"))
9454   (clobber (match_scratch:DI 4 "=&r"))
9455   (clobber (match_scratch:SI 5 "=q"))]
9456  "TARGET_STRING && TARGET_POWER && ! TARGET_POWERPC64
9457   && INTVAL (operands[2]) > 4 && INTVAL (operands[2]) <= 8"
9458  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9459  [(set_attr "type" "store_ux")
9460   (set_attr "length" "8")])
9461
9462(define_insn ""
9463  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9464	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9465   (use (match_operand:SI 2 "immediate_operand" "i"))
9466   (use (match_operand:SI 3 "immediate_operand" "i"))
9467   (clobber (match_scratch:DI 4 "=&r"))
9468   (clobber (match_scratch:SI 5 "=X"))]
9469  "TARGET_STRING && ! TARGET_POWER && ! TARGET_POWERPC64
9470   && INTVAL (operands[2]) > 4 && INTVAL (operands[2]) <= 8"
9471  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9472  [(set_attr "type" "store_ux")
9473   (set_attr "length" "8")])
9474
9475;; Move up to 4 bytes at a time.
9476(define_expand "movmemsi_1reg"
9477  [(parallel [(set (match_operand 0 "" "")
9478		   (match_operand 1 "" ""))
9479	      (use (match_operand 2 "" ""))
9480	      (use (match_operand 3 "" ""))
9481	      (clobber (match_scratch:SI 4 ""))
9482	      (clobber (match_scratch:SI 5 ""))])]
9483  "TARGET_STRING"
9484  "")
9485
9486(define_insn ""
9487  [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
9488	(mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
9489   (use (match_operand:SI 2 "immediate_operand" "i"))
9490   (use (match_operand:SI 3 "immediate_operand" "i"))
9491   (clobber (match_scratch:SI 4 "=&r"))
9492   (clobber (match_scratch:SI 5 "=q"))]
9493  "TARGET_STRING && TARGET_POWER
9494   && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
9495  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9496  [(set_attr "type" "store_ux")
9497   (set_attr "length" "8")])
9498
9499(define_insn ""
9500  [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
9501	(mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
9502   (use (match_operand:SI 2 "immediate_operand" "i"))
9503   (use (match_operand:SI 3 "immediate_operand" "i"))
9504   (clobber (match_scratch:SI 4 "=&r"))
9505   (clobber (match_scratch:SI 5 "=X"))]
9506  "TARGET_STRING && ! TARGET_POWER
9507   && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
9508  "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
9509  [(set_attr "type" "store_ux")
9510   (set_attr "length" "8")])
9511
9512;; Define insns that do load or store with update.  Some of these we can
9513;; get by using pre-decrement or pre-increment, but the hardware can also
9514;; do cases where the increment is not the size of the object.
9515;;
9516;; In all these cases, we use operands 0 and 1 for the register being
9517;; incremented because those are the operands that local-alloc will
9518;; tie and these are the pair most likely to be tieable (and the ones
9519;; that will benefit the most).
9520
9521(define_insn "*movdi_update1"
9522  [(set (match_operand:DI 3 "gpc_reg_operand" "=r,r")
9523	(mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
9524			 (match_operand:DI 2 "reg_or_aligned_short_operand" "r,I"))))
9525   (set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
9526	(plus:DI (match_dup 1) (match_dup 2)))]
9527  "TARGET_POWERPC64 && TARGET_UPDATE"
9528  "@
9529   ldux %3,%0,%2
9530   ldu %3,%2(%0)"
9531  [(set_attr "type" "load_ux,load_u")])
9532
9533(define_insn "movdi_<mode>_update"
9534  [(set (mem:DI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
9535			 (match_operand:P 2 "reg_or_aligned_short_operand" "r,I")))
9536	(match_operand:DI 3 "gpc_reg_operand" "r,r"))
9537   (set (match_operand:P 0 "gpc_reg_operand" "=b,b")
9538	(plus:P (match_dup 1) (match_dup 2)))]
9539  "TARGET_POWERPC64 && TARGET_UPDATE"
9540  "@
9541   stdux %3,%0,%2
9542   stdu %3,%2(%0)"
9543  [(set_attr "type" "store_ux,store_u")])
9544
9545(define_insn "*movsi_update1"
9546  [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
9547	(mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9548			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9549   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9550	(plus:SI (match_dup 1) (match_dup 2)))]
9551  "TARGET_UPDATE"
9552  "@
9553   {lux|lwzux} %3,%0,%2
9554   {lu|lwzu} %3,%2(%0)"
9555  [(set_attr "type" "load_ux,load_u")])
9556
9557(define_insn "*movsi_update2"
9558  [(set (match_operand:DI 3 "gpc_reg_operand" "=r")
9559	(sign_extend:DI
9560	 (mem:SI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0")
9561			  (match_operand:DI 2 "gpc_reg_operand" "r")))))
9562   (set (match_operand:DI 0 "gpc_reg_operand" "=b")
9563	(plus:DI (match_dup 1) (match_dup 2)))]
9564  "TARGET_POWERPC64"
9565  "lwaux %3,%0,%2"
9566  [(set_attr "type" "load_ext_ux")])
9567
9568(define_insn "movsi_update"
9569  [(set (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9570			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9571	(match_operand:SI 3 "gpc_reg_operand" "r,r"))
9572   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9573	(plus:SI (match_dup 1) (match_dup 2)))]
9574  "TARGET_UPDATE"
9575  "@
9576   {stux|stwux} %3,%0,%2
9577   {stu|stwu} %3,%2(%0)"
9578  [(set_attr "type" "store_ux,store_u")])
9579
9580(define_insn "*movhi_update1"
9581  [(set (match_operand:HI 3 "gpc_reg_operand" "=r,r")
9582	(mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9583			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9584   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9585	(plus:SI (match_dup 1) (match_dup 2)))]
9586  "TARGET_UPDATE"
9587  "@
9588   lhzux %3,%0,%2
9589   lhzu %3,%2(%0)"
9590  [(set_attr "type" "load_ux,load_u")])
9591
9592(define_insn "*movhi_update2"
9593  [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
9594	(zero_extend:SI
9595	 (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9596			  (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
9597   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9598	(plus:SI (match_dup 1) (match_dup 2)))]
9599  "TARGET_UPDATE"
9600  "@
9601   lhzux %3,%0,%2
9602   lhzu %3,%2(%0)"
9603  [(set_attr "type" "load_ux,load_u")])
9604
9605(define_insn "*movhi_update3"
9606  [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
9607	(sign_extend:SI
9608	 (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9609			  (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
9610   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9611	(plus:SI (match_dup 1) (match_dup 2)))]
9612  "TARGET_UPDATE"
9613  "@
9614   lhaux %3,%0,%2
9615   lhau %3,%2(%0)"
9616  [(set_attr "type" "load_ext_ux,load_ext_u")])
9617
9618(define_insn "*movhi_update4"
9619  [(set (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9620			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9621	(match_operand:HI 3 "gpc_reg_operand" "r,r"))
9622   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9623	(plus:SI (match_dup 1) (match_dup 2)))]
9624  "TARGET_UPDATE"
9625  "@
9626   sthux %3,%0,%2
9627   sthu %3,%2(%0)"
9628  [(set_attr "type" "store_ux,store_u")])
9629
9630(define_insn "*movqi_update1"
9631  [(set (match_operand:QI 3 "gpc_reg_operand" "=r,r")
9632	(mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9633			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9634   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9635	(plus:SI (match_dup 1) (match_dup 2)))]
9636  "TARGET_UPDATE"
9637  "@
9638   lbzux %3,%0,%2
9639   lbzu %3,%2(%0)"
9640  [(set_attr "type" "load_ux,load_u")])
9641
9642(define_insn "*movqi_update2"
9643  [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
9644	(zero_extend:SI
9645	 (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9646			  (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
9647   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9648	(plus:SI (match_dup 1) (match_dup 2)))]
9649  "TARGET_UPDATE"
9650  "@
9651   lbzux %3,%0,%2
9652   lbzu %3,%2(%0)"
9653  [(set_attr "type" "load_ux,load_u")])
9654
9655(define_insn "*movqi_update3"
9656  [(set (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9657			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9658	(match_operand:QI 3 "gpc_reg_operand" "r,r"))
9659   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9660	(plus:SI (match_dup 1) (match_dup 2)))]
9661  "TARGET_UPDATE"
9662  "@
9663   stbux %3,%0,%2
9664   stbu %3,%2(%0)"
9665  [(set_attr "type" "store_ux,store_u")])
9666
9667(define_insn "*movsf_update1"
9668  [(set (match_operand:SF 3 "gpc_reg_operand" "=f,f")
9669	(mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9670			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9671   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9672	(plus:SI (match_dup 1) (match_dup 2)))]
9673  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_UPDATE"
9674  "@
9675   lfsux %3,%0,%2
9676   lfsu %3,%2(%0)"
9677  [(set_attr "type" "fpload_ux,fpload_u")])
9678
9679(define_insn "*movsf_update2"
9680  [(set (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9681			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9682	(match_operand:SF 3 "gpc_reg_operand" "f,f"))
9683   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9684	(plus:SI (match_dup 1) (match_dup 2)))]
9685  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_UPDATE"
9686  "@
9687   stfsux %3,%0,%2
9688   stfsu %3,%2(%0)"
9689  [(set_attr "type" "fpstore_ux,fpstore_u")])
9690
9691(define_insn "*movsf_update3"
9692  [(set (match_operand:SF 3 "gpc_reg_operand" "=r,r")
9693	(mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9694			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9695   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9696	(plus:SI (match_dup 1) (match_dup 2)))]
9697  "(TARGET_SOFT_FLOAT || !TARGET_FPRS) && TARGET_UPDATE"
9698  "@
9699   {lux|lwzux} %3,%0,%2
9700   {lu|lwzu} %3,%2(%0)"
9701  [(set_attr "type" "load_ux,load_u")])
9702
9703(define_insn "*movsf_update4"
9704  [(set (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9705			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9706	(match_operand:SF 3 "gpc_reg_operand" "r,r"))
9707   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9708	(plus:SI (match_dup 1) (match_dup 2)))]
9709  "(TARGET_SOFT_FLOAT || !TARGET_FPRS) && TARGET_UPDATE"
9710  "@
9711   {stux|stwux} %3,%0,%2
9712   {stu|stwu} %3,%2(%0)"
9713  [(set_attr "type" "store_ux,store_u")])
9714
9715(define_insn "*movdf_update1"
9716  [(set (match_operand:DF 3 "gpc_reg_operand" "=f,f")
9717	(mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9718			 (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
9719   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9720	(plus:SI (match_dup 1) (match_dup 2)))]
9721  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_UPDATE"
9722  "@
9723   lfdux %3,%0,%2
9724   lfdu %3,%2(%0)"
9725  [(set_attr "type" "fpload_ux,fpload_u")])
9726
9727(define_insn "*movdf_update2"
9728  [(set (mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
9729			 (match_operand:SI 2 "reg_or_short_operand" "r,I")))
9730	(match_operand:DF 3 "gpc_reg_operand" "f,f"))
9731   (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
9732	(plus:SI (match_dup 1) (match_dup 2)))]
9733  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_UPDATE"
9734  "@
9735   stfdux %3,%0,%2
9736   stfdu %3,%2(%0)"
9737  [(set_attr "type" "fpstore_ux,fpstore_u")])
9738
9739;; Peephole to convert two consecutive FP loads or stores into lfq/stfq.
9740
9741(define_insn "*lfq_power2"
9742  [(set (match_operand:V2DF 0 "gpc_reg_operand" "=f")
9743	(match_operand:V2DF 1 "memory_operand" ""))]
9744  "TARGET_POWER2
9745   && TARGET_HARD_FLOAT && TARGET_FPRS"
9746  "lfq%U1%X1 %0,%1")
9747
9748(define_peephole2
9749  [(set (match_operand:DF 0 "gpc_reg_operand" "")
9750	(match_operand:DF 1 "memory_operand" ""))
9751   (set (match_operand:DF 2 "gpc_reg_operand" "")
9752	(match_operand:DF 3 "memory_operand" ""))]
9753  "TARGET_POWER2
9754   && TARGET_HARD_FLOAT && TARGET_FPRS
9755   && registers_ok_for_quad_peep (operands[0], operands[2])
9756   && mems_ok_for_quad_peep (operands[1], operands[3])"
9757  [(set (match_dup 0)
9758	(match_dup 1))]
9759  "operands[1] = widen_memory_access (operands[1], V2DFmode, 0);
9760   operands[0] = gen_rtx_REG (V2DFmode, REGNO (operands[0]));")
9761
9762(define_insn "*stfq_power2"
9763  [(set (match_operand:V2DF 0 "memory_operand" "")
9764	(match_operand:V2DF 1 "gpc_reg_operand" "f"))]
9765  "TARGET_POWER2
9766   && TARGET_HARD_FLOAT && TARGET_FPRS"
9767  "stfq%U0%X0 %1,%0")
9768
9769
9770(define_peephole2
9771  [(set (match_operand:DF 0 "memory_operand" "")
9772	(match_operand:DF 1 "gpc_reg_operand" ""))
9773   (set (match_operand:DF 2 "memory_operand" "")
9774	(match_operand:DF 3 "gpc_reg_operand" ""))]
9775  "TARGET_POWER2
9776   && TARGET_HARD_FLOAT && TARGET_FPRS
9777   && registers_ok_for_quad_peep (operands[1], operands[3])
9778   && mems_ok_for_quad_peep (operands[0], operands[2])"
9779  [(set (match_dup 0)
9780	(match_dup 1))]
9781  "operands[0] = widen_memory_access (operands[0], V2DFmode, 0);
9782   operands[1] = gen_rtx_REG (V2DFmode, REGNO (operands[1]));")
9783
9784;; After inserting conditional returns we can sometimes have
9785;; unnecessary register moves.  Unfortunately we cannot have a
9786;; modeless peephole here, because some single SImode sets have early
9787;; clobber outputs.  Although those sets expand to multi-ppc-insn
9788;; sequences, using get_attr_length here will smash the operands
9789;; array.  Neither is there an early_cobbler_p predicate.
9790;; Disallow subregs for E500 so we don't munge frob_di_df_2.
9791(define_peephole2
9792  [(set (match_operand:DF 0 "gpc_reg_operand" "")
9793	(match_operand:DF 1 "any_operand" ""))
9794   (set (match_operand:DF 2 "gpc_reg_operand" "")
9795	(match_dup 0))]
9796  "!(TARGET_E500_DOUBLE && GET_CODE (operands[2]) == SUBREG)
9797   && peep2_reg_dead_p (2, operands[0])"
9798  [(set (match_dup 2) (match_dup 1))])
9799
9800(define_peephole2
9801  [(set (match_operand:SF 0 "gpc_reg_operand" "")
9802	(match_operand:SF 1 "any_operand" ""))
9803   (set (match_operand:SF 2 "gpc_reg_operand" "")
9804	(match_dup 0))]
9805  "peep2_reg_dead_p (2, operands[0])"
9806  [(set (match_dup 2) (match_dup 1))])
9807
9808
9809;; TLS support.
9810
9811;; "b" output constraint here and on tls_ld to support tls linker optimization.
9812(define_insn "tls_gd_32"
9813  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
9814	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9815		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9816		   UNSPEC_TLSGD))]
9817  "HAVE_AS_TLS && !TARGET_64BIT"
9818  "addi %0,%1,%2@got@tlsgd")
9819
9820(define_insn "tls_gd_64"
9821  [(set (match_operand:DI 0 "gpc_reg_operand" "=b")
9822	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9823		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9824		   UNSPEC_TLSGD))]
9825  "HAVE_AS_TLS && TARGET_64BIT"
9826  "addi %0,%1,%2@got@tlsgd")
9827
9828(define_insn "tls_ld_32"
9829  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
9830	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")]
9831		   UNSPEC_TLSLD))]
9832  "HAVE_AS_TLS && !TARGET_64BIT"
9833  "addi %0,%1,%&@got@tlsld")
9834
9835(define_insn "tls_ld_64"
9836  [(set (match_operand:DI 0 "gpc_reg_operand" "=b")
9837	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")]
9838		   UNSPEC_TLSLD))]
9839  "HAVE_AS_TLS && TARGET_64BIT"
9840  "addi %0,%1,%&@got@tlsld")
9841
9842(define_insn "tls_dtprel_32"
9843  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9844	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9845		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9846		   UNSPEC_TLSDTPREL))]
9847  "HAVE_AS_TLS && !TARGET_64BIT"
9848  "addi %0,%1,%2@dtprel")
9849
9850(define_insn "tls_dtprel_64"
9851  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9852	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9853		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9854		   UNSPEC_TLSDTPREL))]
9855  "HAVE_AS_TLS && TARGET_64BIT"
9856  "addi %0,%1,%2@dtprel")
9857
9858(define_insn "tls_dtprel_ha_32"
9859  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9860	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9861		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9862		   UNSPEC_TLSDTPRELHA))]
9863  "HAVE_AS_TLS && !TARGET_64BIT"
9864  "addis %0,%1,%2@dtprel@ha")
9865
9866(define_insn "tls_dtprel_ha_64"
9867  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9868	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9869		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9870		   UNSPEC_TLSDTPRELHA))]
9871  "HAVE_AS_TLS && TARGET_64BIT"
9872  "addis %0,%1,%2@dtprel@ha")
9873
9874(define_insn "tls_dtprel_lo_32"
9875  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9876	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9877		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9878		   UNSPEC_TLSDTPRELLO))]
9879  "HAVE_AS_TLS && !TARGET_64BIT"
9880  "addi %0,%1,%2@dtprel@l")
9881
9882(define_insn "tls_dtprel_lo_64"
9883  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9884	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9885		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9886		   UNSPEC_TLSDTPRELLO))]
9887  "HAVE_AS_TLS && TARGET_64BIT"
9888  "addi %0,%1,%2@dtprel@l")
9889
9890(define_insn "tls_got_dtprel_32"
9891  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9892	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9893		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9894		   UNSPEC_TLSGOTDTPREL))]
9895  "HAVE_AS_TLS && !TARGET_64BIT"
9896  "lwz %0,%2@got@dtprel(%1)")
9897
9898(define_insn "tls_got_dtprel_64"
9899  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9900	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9901		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9902		   UNSPEC_TLSGOTDTPREL))]
9903  "HAVE_AS_TLS && TARGET_64BIT"
9904  "ld %0,%2@got@dtprel(%1)")
9905
9906(define_insn "tls_tprel_32"
9907  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9908	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9909		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9910		   UNSPEC_TLSTPREL))]
9911  "HAVE_AS_TLS && !TARGET_64BIT"
9912  "addi %0,%1,%2@tprel")
9913
9914(define_insn "tls_tprel_64"
9915  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9916	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9917		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9918		   UNSPEC_TLSTPREL))]
9919  "HAVE_AS_TLS && TARGET_64BIT"
9920  "addi %0,%1,%2@tprel")
9921
9922(define_insn "tls_tprel_ha_32"
9923  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9924	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9925		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9926		   UNSPEC_TLSTPRELHA))]
9927  "HAVE_AS_TLS && !TARGET_64BIT"
9928  "addis %0,%1,%2@tprel@ha")
9929
9930(define_insn "tls_tprel_ha_64"
9931  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9932	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9933		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9934		   UNSPEC_TLSTPRELHA))]
9935  "HAVE_AS_TLS && TARGET_64BIT"
9936  "addis %0,%1,%2@tprel@ha")
9937
9938(define_insn "tls_tprel_lo_32"
9939  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9940	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9941		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9942		   UNSPEC_TLSTPRELLO))]
9943  "HAVE_AS_TLS && !TARGET_64BIT"
9944  "addi %0,%1,%2@tprel@l")
9945
9946(define_insn "tls_tprel_lo_64"
9947  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9948	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9949		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9950		   UNSPEC_TLSTPRELLO))]
9951  "HAVE_AS_TLS && TARGET_64BIT"
9952  "addi %0,%1,%2@tprel@l")
9953
9954;; "b" output constraint here and on tls_tls input to support linker tls
9955;; optimization.  The linker may edit the instructions emitted by a
9956;; tls_got_tprel/tls_tls pair to addis,addi.
9957(define_insn "tls_got_tprel_32"
9958  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
9959	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9960		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9961		   UNSPEC_TLSGOTTPREL))]
9962  "HAVE_AS_TLS && !TARGET_64BIT"
9963  "lwz %0,%2@got@tprel(%1)")
9964
9965(define_insn "tls_got_tprel_64"
9966  [(set (match_operand:DI 0 "gpc_reg_operand" "=b")
9967	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9968		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9969		   UNSPEC_TLSGOTTPREL))]
9970  "HAVE_AS_TLS && TARGET_64BIT"
9971  "ld %0,%2@got@tprel(%1)")
9972
9973(define_insn "tls_tls_32"
9974  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9975	(unspec:SI [(match_operand:SI 1 "gpc_reg_operand" "b")
9976		    (match_operand:SI 2 "rs6000_tls_symbol_ref" "")]
9977		   UNSPEC_TLSTLS))]
9978  "HAVE_AS_TLS && !TARGET_64BIT"
9979  "add %0,%1,%2@tls")
9980
9981(define_insn "tls_tls_64"
9982  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
9983	(unspec:DI [(match_operand:DI 1 "gpc_reg_operand" "b")
9984		    (match_operand:DI 2 "rs6000_tls_symbol_ref" "")]
9985		   UNSPEC_TLSTLS))]
9986  "HAVE_AS_TLS && TARGET_64BIT"
9987  "add %0,%1,%2@tls")
9988
9989;; Next come insns related to the calling sequence.
9990;;
9991;; First, an insn to allocate new stack space for dynamic use (e.g., alloca).
9992;; We move the back-chain and decrement the stack pointer.
9993
9994(define_expand "allocate_stack"
9995  [(set (match_operand 0 "gpc_reg_operand" "=r")
9996	(minus (reg 1) (match_operand 1 "reg_or_short_operand" "")))
9997   (set (reg 1)
9998	(minus (reg 1) (match_dup 1)))]
9999  ""
10000  "
10001{ rtx chain = gen_reg_rtx (Pmode);
10002  rtx stack_bot = gen_rtx_MEM (Pmode, stack_pointer_rtx);
10003  rtx neg_op0;
10004
10005  emit_move_insn (chain, stack_bot);
10006
10007  /* Check stack bounds if necessary.  */
10008  if (current_function_limit_stack)
10009    {
10010      rtx available;
10011      available = expand_binop (Pmode, sub_optab,
10012				stack_pointer_rtx, stack_limit_rtx,
10013				NULL_RTX, 1, OPTAB_WIDEN);
10014      emit_insn (gen_cond_trap (LTU, available, operands[1], const0_rtx));
10015    }
10016
10017  if (GET_CODE (operands[1]) != CONST_INT
10018      || INTVAL (operands[1]) < -32767
10019      || INTVAL (operands[1]) > 32768)
10020    {
10021      neg_op0 = gen_reg_rtx (Pmode);
10022      if (TARGET_32BIT)
10023	emit_insn (gen_negsi2 (neg_op0, operands[1]));
10024      else
10025	emit_insn (gen_negdi2 (neg_op0, operands[1]));
10026    }
10027  else
10028    neg_op0 = GEN_INT (- INTVAL (operands[1]));
10029
10030  if (TARGET_UPDATE)
10031    emit_insn ((* ((TARGET_32BIT) ? gen_movsi_update : gen_movdi_di_update))
10032		(stack_pointer_rtx, stack_pointer_rtx, neg_op0, chain));
10033
10034  else
10035    {
10036      emit_insn ((* ((TARGET_32BIT) ? gen_addsi3 : gen_adddi3))
10037		 (stack_pointer_rtx, stack_pointer_rtx, neg_op0));
10038      emit_move_insn (gen_rtx_MEM (Pmode, stack_pointer_rtx), chain);
10039    }
10040
10041  emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
10042  DONE;
10043}")
10044
10045;; These patterns say how to save and restore the stack pointer.  We need not
10046;; save the stack pointer at function level since we are careful to
10047;; preserve the backchain.  At block level, we have to restore the backchain
10048;; when we restore the stack pointer.
10049;;
10050;; For nonlocal gotos, we must save both the stack pointer and its
10051;; backchain and restore both.  Note that in the nonlocal case, the
10052;; save area is a memory location.
10053
10054(define_expand "save_stack_function"
10055  [(match_operand 0 "any_operand" "")
10056   (match_operand 1 "any_operand" "")]
10057  ""
10058  "DONE;")
10059
10060(define_expand "restore_stack_function"
10061  [(match_operand 0 "any_operand" "")
10062   (match_operand 1 "any_operand" "")]
10063  ""
10064  "DONE;")
10065
10066;; Adjust stack pointer (op0) to a new value (op1).
10067;; First copy old stack backchain to new location, and ensure that the
10068;; scheduler won't reorder the sp assignment before the backchain write.
10069(define_expand "restore_stack_block"
10070  [(set (match_dup 2) (match_dup 3))
10071   (set (match_dup 4) (match_dup 2))
10072   (set (match_dup 5) (unspec:BLK [(match_dup 5)] UNSPEC_TIE))
10073   (set (match_operand 0 "register_operand" "")
10074	(match_operand 1 "register_operand" ""))]
10075  ""
10076  "
10077{
10078  operands[1] = force_reg (Pmode, operands[1]);
10079  operands[2] = gen_reg_rtx (Pmode);
10080  operands[3] = gen_frame_mem (Pmode, operands[0]);
10081  operands[4] = gen_frame_mem (Pmode, operands[1]);
10082  operands[5] = gen_frame_mem (BLKmode, operands[0]);
10083}")
10084
10085(define_expand "save_stack_nonlocal"
10086  [(set (match_dup 3) (match_dup 4))
10087   (set (match_operand 0 "memory_operand" "") (match_dup 3))
10088   (set (match_dup 2) (match_operand 1 "register_operand" ""))]
10089  ""
10090  "
10091{
10092  int units_per_word = (TARGET_32BIT) ? 4 : 8;
10093
10094  /* Copy the backchain to the first word, sp to the second.  */
10095  operands[0] = adjust_address_nv (operands[0], Pmode, 0);
10096  operands[2] = adjust_address_nv (operands[0], Pmode, units_per_word);
10097  operands[3] = gen_reg_rtx (Pmode);
10098  operands[4] = gen_frame_mem (Pmode, operands[1]);
10099}")
10100
10101(define_expand "restore_stack_nonlocal"
10102  [(set (match_dup 2) (match_operand 1 "memory_operand" ""))
10103   (set (match_dup 3) (match_dup 4))
10104   (set (match_dup 5) (match_dup 2))
10105   (set (match_dup 6) (unspec:BLK [(match_dup 6)] UNSPEC_TIE))
10106   (set (match_operand 0 "register_operand" "") (match_dup 3))]
10107  ""
10108  "
10109{
10110  int units_per_word = (TARGET_32BIT) ? 4 : 8;
10111
10112  /* Restore the backchain from the first word, sp from the second.  */
10113  operands[2] = gen_reg_rtx (Pmode);
10114  operands[3] = gen_reg_rtx (Pmode);
10115  operands[1] = adjust_address_nv (operands[1], Pmode, 0);
10116  operands[4] = adjust_address_nv (operands[1], Pmode, units_per_word);
10117  operands[5] = gen_frame_mem (Pmode, operands[3]);
10118  operands[6] = gen_frame_mem (BLKmode, operands[0]);
10119}")
10120
10121;; TOC register handling.
10122
10123;; Code to initialize the TOC register...
10124
10125(define_insn "load_toc_aix_si"
10126  [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
10127		   (unspec:SI [(const_int 0)] UNSPEC_TOC))
10128	      (use (reg:SI 2))])]
10129  "DEFAULT_ABI == ABI_AIX && TARGET_32BIT"
10130  "*
10131{
10132  char buf[30];
10133  ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", 1);
10134  operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
10135  operands[2] = gen_rtx_REG (Pmode, 2);
10136  return \"{l|lwz} %0,%1(%2)\";
10137}"
10138  [(set_attr "type" "load")])
10139
10140(define_insn "load_toc_aix_di"
10141  [(parallel [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
10142		   (unspec:DI [(const_int 0)] UNSPEC_TOC))
10143	      (use (reg:DI 2))])]
10144  "DEFAULT_ABI == ABI_AIX && TARGET_64BIT"
10145  "*
10146{
10147  char buf[30];
10148#ifdef TARGET_RELOCATABLE
10149  ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\",
10150			       !TARGET_MINIMAL_TOC || TARGET_RELOCATABLE);
10151#else
10152  ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", 1);
10153#endif
10154  if (TARGET_ELF)
10155    strcat (buf, \"@toc\");
10156  operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
10157  operands[2] = gen_rtx_REG (Pmode, 2);
10158  return \"ld %0,%1(%2)\";
10159}"
10160  [(set_attr "type" "load")])
10161
10162(define_insn "load_toc_v4_pic_si"
10163  [(set (match_operand:SI 0 "register_operand" "=l")
10164	(unspec:SI [(const_int 0)] UNSPEC_TOC))]
10165  "DEFAULT_ABI == ABI_V4 && flag_pic == 1 && TARGET_32BIT"
10166  "bl _GLOBAL_OFFSET_TABLE_@local-4"
10167  [(set_attr "type" "branch")
10168   (set_attr "length" "4")])
10169
10170(define_insn "load_toc_v4_PIC_1"
10171  [(set (match_operand:SI 0 "register_operand" "=l")
10172	(match_operand:SI 1 "immediate_operand" "s"))
10173   (use (unspec [(match_dup 1)] UNSPEC_TOC))]
10174  "TARGET_ELF && DEFAULT_ABI != ABI_AIX
10175   && (flag_pic == 2 || (flag_pic && TARGET_SECURE_PLT))"
10176  "bcl 20,31,%1\\n%1:"
10177  [(set_attr "type" "branch")
10178   (set_attr "length" "4")])
10179
10180(define_insn "load_toc_v4_PIC_1b"
10181  [(set (match_operand:SI 0 "register_operand" "=l")
10182	(unspec:SI [(match_operand:SI 1 "immediate_operand" "s")]
10183		UNSPEC_TOCPTR))]
10184  "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
10185  "bcl 20,31,$+8\\n\\t.long %1-$"
10186  [(set_attr "type" "branch")
10187   (set_attr "length" "8")])
10188
10189(define_insn "load_toc_v4_PIC_2"
10190  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
10191	(mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
10192		   (minus:SI (match_operand:SI 2 "immediate_operand" "s")
10193			     (match_operand:SI 3 "immediate_operand" "s")))))]
10194  "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
10195  "{l|lwz} %0,%2-%3(%1)"
10196  [(set_attr "type" "load")])
10197
10198(define_insn "load_toc_v4_PIC_3b"
10199  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
10200	(plus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
10201		 (high:SI
10202		   (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
10203			     (match_operand:SI 3 "symbol_ref_operand" "s")))))]
10204  "TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic"
10205  "{cau|addis} %0,%1,%2-%3@ha")
10206
10207(define_insn "load_toc_v4_PIC_3c"
10208  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
10209	(lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b")
10210		   (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
10211			     (match_operand:SI 3 "symbol_ref_operand" "s"))))]
10212  "TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic"
10213  "{cal|addi} %0,%1,%2-%3@l")
10214
10215;; If the TOC is shared over a translation unit, as happens with all
10216;; the kinds of PIC that we support, we need to restore the TOC
10217;; pointer only when jumping over units of translation.
10218;; On Darwin, we need to reload the picbase.
10219
10220(define_expand "builtin_setjmp_receiver"
10221  [(use (label_ref (match_operand 0 "" "")))]
10222  "(DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10223   || (TARGET_TOC && TARGET_MINIMAL_TOC)
10224   || (DEFAULT_ABI == ABI_DARWIN && flag_pic)"
10225  "
10226{
10227#if TARGET_MACHO
10228  if (DEFAULT_ABI == ABI_DARWIN)
10229    {
10230      const char *picbase = machopic_function_base_name ();
10231      rtx picrtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (picbase));
10232      rtx picreg = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
10233      rtx tmplabrtx;
10234      char tmplab[20];
10235
10236      ASM_GENERATE_INTERNAL_LABEL(tmplab, \"LSJR\",
10237				  CODE_LABEL_NUMBER (operands[0]));
10238      tmplabrtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (tmplab));
10239
10240      emit_insn (gen_load_macho_picbase (picreg, tmplabrtx));
10241      emit_insn (gen_macho_correct_pic (picreg, picreg, picrtx, tmplabrtx));
10242    }
10243  else
10244#endif
10245    rs6000_emit_load_toc_table (FALSE);
10246  DONE;
10247}")
10248
10249;; Elf specific ways of loading addresses for non-PIC code.
10250;; The output of this could be r0, but we make a very strong
10251;; preference for a base register because it will usually
10252;; be needed there.
10253(define_insn "elf_high"
10254  [(set (match_operand:SI 0 "gpc_reg_operand" "=b*r")
10255	(high:SI (match_operand 1 "" "")))]
10256  "TARGET_ELF && ! TARGET_64BIT"
10257  "{liu|lis} %0,%1@ha")
10258
10259(define_insn "elf_low"
10260  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
10261	(lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b,!*r")
10262		   (match_operand 2 "" "")))]
10263   "TARGET_ELF && ! TARGET_64BIT"
10264   "@
10265    {cal|la} %0,%2@l(%1)
10266    {ai|addic} %0,%1,%K2")
10267
10268;; A function pointer under AIX is a pointer to a data area whose first word
10269;; contains the actual address of the function, whose second word contains a
10270;; pointer to its TOC, and whose third word contains a value to place in the
10271;; static chain register (r11).  Note that if we load the static chain, our
10272;; "trampoline" need not have any executable code.
10273
10274(define_expand "call_indirect_aix32"
10275  [(set (match_dup 2)
10276	(mem:SI (match_operand:SI 0 "gpc_reg_operand" "")))
10277   (set (mem:SI (plus:SI (reg:SI 1) (const_int 20)))
10278	(reg:SI 2))
10279   (set (reg:SI 2)
10280	(mem:SI (plus:SI (match_dup 0)
10281			 (const_int 4))))
10282   (set (reg:SI 11)
10283	(mem:SI (plus:SI (match_dup 0)
10284			 (const_int 8))))
10285   (parallel [(call (mem:SI (match_dup 2))
10286		    (match_operand 1 "" ""))
10287	      (use (reg:SI 2))
10288	      (use (reg:SI 11))
10289	      (set (reg:SI 2)
10290		   (mem:SI (plus:SI (reg:SI 1) (const_int 20))))
10291	      (clobber (scratch:SI))])]
10292  "TARGET_32BIT"
10293  "
10294{ operands[2] = gen_reg_rtx (SImode); }")
10295
10296(define_expand "call_indirect_aix64"
10297  [(set (match_dup 2)
10298	(mem:DI (match_operand:DI 0 "gpc_reg_operand" "")))
10299   (set (mem:DI (plus:DI (reg:DI 1) (const_int 40)))
10300	(reg:DI 2))
10301   (set (reg:DI 2)
10302	(mem:DI (plus:DI (match_dup 0)
10303			 (const_int 8))))
10304   (set (reg:DI 11)
10305	(mem:DI (plus:DI (match_dup 0)
10306			 (const_int 16))))
10307   (parallel [(call (mem:SI (match_dup 2))
10308		    (match_operand 1 "" ""))
10309	      (use (reg:DI 2))
10310	      (use (reg:DI 11))
10311	      (set (reg:DI 2)
10312		   (mem:DI (plus:DI (reg:DI 1) (const_int 40))))
10313	      (clobber (scratch:SI))])]
10314  "TARGET_64BIT"
10315  "
10316{ operands[2] = gen_reg_rtx (DImode); }")
10317
10318(define_expand "call_value_indirect_aix32"
10319  [(set (match_dup 3)
10320	(mem:SI (match_operand:SI 1 "gpc_reg_operand" "")))
10321   (set (mem:SI (plus:SI (reg:SI 1) (const_int 20)))
10322	(reg:SI 2))
10323   (set (reg:SI 2)
10324	(mem:SI (plus:SI (match_dup 1)
10325			 (const_int 4))))
10326   (set (reg:SI 11)
10327	(mem:SI (plus:SI (match_dup 1)
10328			 (const_int 8))))
10329   (parallel [(set (match_operand 0 "" "")
10330		   (call (mem:SI (match_dup 3))
10331			 (match_operand 2 "" "")))
10332	      (use (reg:SI 2))
10333	      (use (reg:SI 11))
10334	      (set (reg:SI 2)
10335		   (mem:SI (plus:SI (reg:SI 1) (const_int 20))))
10336	      (clobber (scratch:SI))])]
10337  "TARGET_32BIT"
10338  "
10339{ operands[3] = gen_reg_rtx (SImode); }")
10340
10341(define_expand "call_value_indirect_aix64"
10342  [(set (match_dup 3)
10343	(mem:DI (match_operand:DI 1 "gpc_reg_operand" "")))
10344   (set (mem:DI (plus:DI (reg:DI 1) (const_int 40)))
10345	(reg:DI 2))
10346   (set (reg:DI 2)
10347	(mem:DI (plus:DI (match_dup 1)
10348			 (const_int 8))))
10349   (set (reg:DI 11)
10350	(mem:DI (plus:DI (match_dup 1)
10351			 (const_int 16))))
10352   (parallel [(set (match_operand 0 "" "")
10353		   (call (mem:SI (match_dup 3))
10354			 (match_operand 2 "" "")))
10355	      (use (reg:DI 2))
10356	      (use (reg:DI 11))
10357	      (set (reg:DI 2)
10358		   (mem:DI (plus:DI (reg:DI 1) (const_int 40))))
10359	      (clobber (scratch:SI))])]
10360  "TARGET_64BIT"
10361  "
10362{ operands[3] = gen_reg_rtx (DImode); }")
10363
10364;; Now the definitions for the call and call_value insns
10365(define_expand "call"
10366  [(parallel [(call (mem:SI (match_operand 0 "address_operand" ""))
10367		    (match_operand 1 "" ""))
10368	      (use (match_operand 2 "" ""))
10369	      (clobber (scratch:SI))])]
10370  ""
10371  "
10372{
10373#if TARGET_MACHO
10374  if (MACHOPIC_INDIRECT)
10375    operands[0] = machopic_indirect_call_target (operands[0]);
10376#endif
10377
10378  gcc_assert (GET_CODE (operands[0]) == MEM);
10379  gcc_assert (GET_CODE (operands[1]) == CONST_INT);
10380
10381  operands[0] = XEXP (operands[0], 0);
10382
10383  if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
10384      && flag_pic
10385      && GET_CODE (operands[0]) == SYMBOL_REF
10386      && !SYMBOL_REF_LOCAL_P (operands[0]))
10387    {
10388      rtx call;
10389      rtvec tmp;
10390
10391      tmp = gen_rtvec (3,
10392		       gen_rtx_CALL (VOIDmode,
10393				     gen_rtx_MEM (SImode, operands[0]),
10394				     operands[1]),
10395		       gen_rtx_USE (VOIDmode, operands[2]),
10396		       gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
10397      call = emit_call_insn (gen_rtx_PARALLEL (VOIDmode, tmp));
10398      use_reg (&CALL_INSN_FUNCTION_USAGE (call), pic_offset_table_rtx);
10399      DONE;
10400    }
10401
10402  if (GET_CODE (operands[0]) != SYMBOL_REF
10403      || (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (operands[0]))
10404      || (DEFAULT_ABI != ABI_DARWIN && (INTVAL (operands[2]) & CALL_LONG) != 0))
10405    {
10406      if (INTVAL (operands[2]) & CALL_LONG)
10407	operands[0] = rs6000_longcall_ref (operands[0]);
10408
10409      switch (DEFAULT_ABI)
10410        {
10411	case ABI_V4:
10412	case ABI_DARWIN:
10413	  operands[0] = force_reg (Pmode, operands[0]);
10414	  break;
10415
10416	case ABI_AIX:
10417	  /* AIX function pointers are really pointers to a three word
10418	     area.  */
10419	  emit_call_insn (TARGET_32BIT
10420			  ? gen_call_indirect_aix32 (force_reg (SImode,
10421							        operands[0]),
10422						     operands[1])
10423			  : gen_call_indirect_aix64 (force_reg (DImode,
10424							        operands[0]),
10425						     operands[1]));
10426	  DONE;
10427
10428	default:
10429	  gcc_unreachable ();
10430	}
10431    }
10432}")
10433
10434(define_expand "call_value"
10435  [(parallel [(set (match_operand 0 "" "")
10436		   (call (mem:SI (match_operand 1 "address_operand" ""))
10437			 (match_operand 2 "" "")))
10438	      (use (match_operand 3 "" ""))
10439	      (clobber (scratch:SI))])]
10440  ""
10441  "
10442{
10443#if TARGET_MACHO
10444  if (MACHOPIC_INDIRECT)
10445    operands[1] = machopic_indirect_call_target (operands[1]);
10446#endif
10447
10448  gcc_assert (GET_CODE (operands[1]) == MEM);
10449  gcc_assert (GET_CODE (operands[2]) == CONST_INT);
10450
10451  operands[1] = XEXP (operands[1], 0);
10452
10453  if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
10454      && flag_pic
10455      && GET_CODE (operands[1]) == SYMBOL_REF
10456      && !SYMBOL_REF_LOCAL_P (operands[1]))
10457    {
10458      rtx call;
10459      rtvec tmp;
10460
10461      tmp = gen_rtvec (3,
10462		       gen_rtx_SET (VOIDmode,
10463				    operands[0],
10464				    gen_rtx_CALL (VOIDmode,
10465						  gen_rtx_MEM (SImode,
10466							       operands[1]),
10467						  operands[2])),
10468		       gen_rtx_USE (VOIDmode, operands[3]),
10469		       gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
10470      call = emit_call_insn (gen_rtx_PARALLEL (VOIDmode, tmp));
10471      use_reg (&CALL_INSN_FUNCTION_USAGE (call), pic_offset_table_rtx);
10472      DONE;
10473    }
10474
10475  if (GET_CODE (operands[1]) != SYMBOL_REF
10476      || (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (operands[1]))
10477      || (DEFAULT_ABI != ABI_DARWIN && (INTVAL (operands[3]) & CALL_LONG) != 0))
10478    {
10479      if (INTVAL (operands[3]) & CALL_LONG)
10480	operands[1] = rs6000_longcall_ref (operands[1]);
10481
10482      switch (DEFAULT_ABI)
10483        {
10484	case ABI_V4:
10485	case ABI_DARWIN:
10486	  operands[1] = force_reg (Pmode, operands[1]);
10487	  break;
10488
10489	case ABI_AIX:
10490	  /* AIX function pointers are really pointers to a three word
10491	     area.  */
10492	  emit_call_insn (TARGET_32BIT
10493			  ? gen_call_value_indirect_aix32 (operands[0],
10494							   force_reg (SImode,
10495								      operands[1]),
10496							   operands[2])
10497			  : gen_call_value_indirect_aix64 (operands[0],
10498							   force_reg (DImode,
10499								      operands[1]),
10500							   operands[2]));
10501	  DONE;
10502
10503	default:
10504	  gcc_unreachable ();
10505	}
10506    }
10507}")
10508
10509;; Call to function in current module.  No TOC pointer reload needed.
10510;; Operand2 is nonzero if we are using the V.4 calling sequence and
10511;; either the function was not prototyped, or it was prototyped as a
10512;; variable argument function.  It is > 0 if FP registers were passed
10513;; and < 0 if they were not.
10514
10515(define_insn "*call_local32"
10516  [(call (mem:SI (match_operand:SI 0 "current_file_function_operand" "s,s"))
10517	 (match_operand 1 "" "g,g"))
10518   (use (match_operand:SI 2 "immediate_operand" "O,n"))
10519   (clobber (match_scratch:SI 3 "=l,l"))]
10520  "(INTVAL (operands[2]) & CALL_LONG) == 0"
10521  "*
10522{
10523  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10524    output_asm_insn (\"crxor 6,6,6\", operands);
10525
10526  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10527    output_asm_insn (\"creqv 6,6,6\", operands);
10528
10529  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z0@local\" : \"bl %z0\";
10530}"
10531  [(set_attr "type" "branch")
10532   (set_attr "length" "4,8")])
10533
10534(define_insn "*call_local64"
10535  [(call (mem:SI (match_operand:DI 0 "current_file_function_operand" "s,s"))
10536	 (match_operand 1 "" "g,g"))
10537   (use (match_operand:SI 2 "immediate_operand" "O,n"))
10538   (clobber (match_scratch:SI 3 "=l,l"))]
10539  "TARGET_64BIT && (INTVAL (operands[2]) & CALL_LONG) == 0"
10540  "*
10541{
10542  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10543    output_asm_insn (\"crxor 6,6,6\", operands);
10544
10545  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10546    output_asm_insn (\"creqv 6,6,6\", operands);
10547
10548  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z0@local\" : \"bl %z0\";
10549}"
10550  [(set_attr "type" "branch")
10551   (set_attr "length" "4,8")])
10552
10553(define_insn "*call_value_local32"
10554  [(set (match_operand 0 "" "")
10555	(call (mem:SI (match_operand:SI 1 "current_file_function_operand" "s,s"))
10556	      (match_operand 2 "" "g,g")))
10557   (use (match_operand:SI 3 "immediate_operand" "O,n"))
10558   (clobber (match_scratch:SI 4 "=l,l"))]
10559  "(INTVAL (operands[3]) & CALL_LONG) == 0"
10560  "*
10561{
10562  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10563    output_asm_insn (\"crxor 6,6,6\", operands);
10564
10565  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10566    output_asm_insn (\"creqv 6,6,6\", operands);
10567
10568  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z1@local\" : \"bl %z1\";
10569}"
10570  [(set_attr "type" "branch")
10571   (set_attr "length" "4,8")])
10572
10573
10574(define_insn "*call_value_local64"
10575  [(set (match_operand 0 "" "")
10576	(call (mem:SI (match_operand:DI 1 "current_file_function_operand" "s,s"))
10577	      (match_operand 2 "" "g,g")))
10578   (use (match_operand:SI 3 "immediate_operand" "O,n"))
10579   (clobber (match_scratch:SI 4 "=l,l"))]
10580  "TARGET_64BIT && (INTVAL (operands[3]) & CALL_LONG) == 0"
10581  "*
10582{
10583  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10584    output_asm_insn (\"crxor 6,6,6\", operands);
10585
10586  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10587    output_asm_insn (\"creqv 6,6,6\", operands);
10588
10589  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z1@local\" : \"bl %z1\";
10590}"
10591  [(set_attr "type" "branch")
10592   (set_attr "length" "4,8")])
10593
10594;; Call to function which may be in another module.  Restore the TOC
10595;; pointer (r2) after the call unless this is System V.
10596;; Operand2 is nonzero if we are using the V.4 calling sequence and
10597;; either the function was not prototyped, or it was prototyped as a
10598;; variable argument function.  It is > 0 if FP registers were passed
10599;; and < 0 if they were not.
10600
10601(define_insn "*call_indirect_nonlocal_aix32"
10602  [(call (mem:SI (match_operand:SI 0 "register_operand" "c,*l"))
10603	 (match_operand 1 "" "g,g"))
10604   (use (reg:SI 2))
10605   (use (reg:SI 11))
10606   (set (reg:SI 2)
10607	(mem:SI (plus:SI (reg:SI 1) (const_int 20))))
10608   (clobber (match_scratch:SI 2 "=l,l"))]
10609  "TARGET_32BIT && DEFAULT_ABI == ABI_AIX"
10610  "b%T0l\;{l|lwz} 2,20(1)"
10611  [(set_attr "type" "jmpreg")
10612   (set_attr "length" "8")])
10613
10614(define_insn "*call_nonlocal_aix32"
10615  [(call (mem:SI (match_operand:SI 0 "symbol_ref_operand" "s"))
10616	 (match_operand 1 "" "g"))
10617   (use (match_operand:SI 2 "immediate_operand" "O"))
10618   (clobber (match_scratch:SI 3 "=l"))]
10619  "TARGET_32BIT
10620   && DEFAULT_ABI == ABI_AIX
10621   && (INTVAL (operands[2]) & CALL_LONG) == 0"
10622  "bl %z0\;%."
10623  [(set_attr "type" "branch")
10624   (set_attr "length" "8")])
10625
10626(define_insn "*call_indirect_nonlocal_aix64"
10627  [(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l"))
10628	 (match_operand 1 "" "g,g"))
10629   (use (reg:DI 2))
10630   (use (reg:DI 11))
10631   (set (reg:DI 2)
10632	(mem:DI (plus:DI (reg:DI 1) (const_int 40))))
10633   (clobber (match_scratch:SI 2 "=l,l"))]
10634  "TARGET_64BIT && DEFAULT_ABI == ABI_AIX"
10635  "b%T0l\;ld 2,40(1)"
10636  [(set_attr "type" "jmpreg")
10637   (set_attr "length" "8")])
10638
10639(define_insn "*call_nonlocal_aix64"
10640  [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s"))
10641	 (match_operand 1 "" "g"))
10642   (use (match_operand:SI 2 "immediate_operand" "O"))
10643   (clobber (match_scratch:SI 3 "=l"))]
10644  "TARGET_64BIT
10645   && DEFAULT_ABI == ABI_AIX
10646   && (INTVAL (operands[2]) & CALL_LONG) == 0"
10647  "bl %z0\;%."
10648  [(set_attr "type" "branch")
10649   (set_attr "length" "8")])
10650
10651(define_insn "*call_value_indirect_nonlocal_aix32"
10652  [(set (match_operand 0 "" "")
10653	(call (mem:SI (match_operand:SI 1 "register_operand" "c,*l"))
10654	      (match_operand 2 "" "g,g")))
10655   (use (reg:SI 2))
10656   (use (reg:SI 11))
10657   (set (reg:SI 2)
10658	(mem:SI (plus:SI (reg:SI 1) (const_int 20))))
10659   (clobber (match_scratch:SI 3 "=l,l"))]
10660  "TARGET_32BIT && DEFAULT_ABI == ABI_AIX"
10661  "b%T1l\;{l|lwz} 2,20(1)"
10662  [(set_attr "type" "jmpreg")
10663   (set_attr "length" "8")])
10664
10665(define_insn "*call_value_nonlocal_aix32"
10666  [(set (match_operand 0 "" "")
10667	(call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "s"))
10668	      (match_operand 2 "" "g")))
10669   (use (match_operand:SI 3 "immediate_operand" "O"))
10670   (clobber (match_scratch:SI 4 "=l"))]
10671  "TARGET_32BIT
10672   && DEFAULT_ABI == ABI_AIX
10673   && (INTVAL (operands[3]) & CALL_LONG) == 0"
10674  "bl %z1\;%."
10675  [(set_attr "type" "branch")
10676   (set_attr "length" "8")])
10677
10678(define_insn "*call_value_indirect_nonlocal_aix64"
10679  [(set (match_operand 0 "" "")
10680	(call (mem:SI (match_operand:DI 1 "register_operand" "c,*l"))
10681	      (match_operand 2 "" "g,g")))
10682   (use (reg:DI 2))
10683   (use (reg:DI 11))
10684   (set (reg:DI 2)
10685	(mem:DI (plus:DI (reg:DI 1) (const_int 40))))
10686   (clobber (match_scratch:SI 3 "=l,l"))]
10687  "TARGET_64BIT && DEFAULT_ABI == ABI_AIX"
10688  "b%T1l\;ld 2,40(1)"
10689  [(set_attr "type" "jmpreg")
10690   (set_attr "length" "8")])
10691
10692(define_insn "*call_value_nonlocal_aix64"
10693  [(set (match_operand 0 "" "")
10694	(call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s"))
10695	      (match_operand 2 "" "g")))
10696   (use (match_operand:SI 3 "immediate_operand" "O"))
10697   (clobber (match_scratch:SI 4 "=l"))]
10698  "TARGET_64BIT
10699   && DEFAULT_ABI == ABI_AIX
10700   && (INTVAL (operands[3]) & CALL_LONG) == 0"
10701  "bl %z1\;%."
10702  [(set_attr "type" "branch")
10703   (set_attr "length" "8")])
10704
10705;; A function pointer under System V is just a normal pointer
10706;; operands[0] is the function pointer
10707;; operands[1] is the stack size to clean up
10708;; operands[2] is the value FUNCTION_ARG returns for the VOID argument
10709;; which indicates how to set cr1
10710
10711(define_insn "*call_indirect_nonlocal_sysv<mode>"
10712  [(call (mem:SI (match_operand:P 0 "register_operand" "c,*l,c,*l"))
10713	 (match_operand 1 "" "g,g,g,g"))
10714   (use (match_operand:SI 2 "immediate_operand" "O,O,n,n"))
10715   (clobber (match_scratch:SI 3 "=l,l,l,l"))]
10716  "DEFAULT_ABI == ABI_V4
10717   || DEFAULT_ABI == ABI_DARWIN"
10718{
10719  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10720    output_asm_insn ("crxor 6,6,6", operands);
10721
10722  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10723    output_asm_insn ("creqv 6,6,6", operands);
10724
10725  return "b%T0l";
10726}
10727  [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
10728   (set_attr "length" "4,4,8,8")])
10729
10730(define_insn "*call_nonlocal_sysv<mode>"
10731  [(call (mem:SI (match_operand:P 0 "symbol_ref_operand" "s,s"))
10732	 (match_operand 1 "" "g,g"))
10733   (use (match_operand:SI 2 "immediate_operand" "O,n"))
10734   (clobber (match_scratch:SI 3 "=l,l"))]
10735  "(DEFAULT_ABI == ABI_DARWIN
10736   || (DEFAULT_ABI == ABI_V4
10737       && (INTVAL (operands[2]) & CALL_LONG) == 0))"
10738{
10739  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10740    output_asm_insn ("crxor 6,6,6", operands);
10741
10742  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10743    output_asm_insn ("creqv 6,6,6", operands);
10744
10745#if TARGET_MACHO
10746  return output_call(insn, operands, 0, 2);
10747#else
10748  if (DEFAULT_ABI == ABI_V4 && flag_pic)
10749    {
10750      if (TARGET_SECURE_PLT && flag_pic == 2)
10751	/* The magic 32768 offset here and in the other sysv call insns
10752	   corresponds to the offset of r30 in .got2, as given by LCTOC1.
10753	   See sysv4.h:toc_section.  */
10754	return "bl %z0+32768@plt";
10755      else
10756	return "bl %z0@plt";
10757    }
10758  else
10759    return "bl %z0";
10760#endif
10761}
10762  [(set_attr "type" "branch,branch")
10763   (set_attr "length" "4,8")])
10764
10765(define_insn "*call_value_indirect_nonlocal_sysv<mode>"
10766  [(set (match_operand 0 "" "")
10767	(call (mem:SI (match_operand:P 1 "register_operand" "c,*l,c,*l"))
10768	      (match_operand 2 "" "g,g,g,g")))
10769   (use (match_operand:SI 3 "immediate_operand" "O,O,n,n"))
10770   (clobber (match_scratch:SI 4 "=l,l,l,l"))]
10771  "DEFAULT_ABI == ABI_V4
10772   || DEFAULT_ABI == ABI_DARWIN"
10773{
10774  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10775    output_asm_insn ("crxor 6,6,6", operands);
10776
10777  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10778    output_asm_insn ("creqv 6,6,6", operands);
10779
10780  return "b%T1l";
10781}
10782  [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
10783   (set_attr "length" "4,4,8,8")])
10784
10785(define_insn "*call_value_nonlocal_sysv<mode>"
10786  [(set (match_operand 0 "" "")
10787	(call (mem:SI (match_operand:P 1 "symbol_ref_operand" "s,s"))
10788	      (match_operand 2 "" "g,g")))
10789   (use (match_operand:SI 3 "immediate_operand" "O,n"))
10790   (clobber (match_scratch:SI 4 "=l,l"))]
10791  "(DEFAULT_ABI == ABI_DARWIN
10792   || (DEFAULT_ABI == ABI_V4
10793       && (INTVAL (operands[3]) & CALL_LONG) == 0))"
10794{
10795  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10796    output_asm_insn ("crxor 6,6,6", operands);
10797
10798  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10799    output_asm_insn ("creqv 6,6,6", operands);
10800
10801#if TARGET_MACHO
10802  return output_call(insn, operands, 1, 3);
10803#else
10804  if (DEFAULT_ABI == ABI_V4 && flag_pic)
10805    {
10806      if (TARGET_SECURE_PLT && flag_pic == 2)
10807	return "bl %z1+32768@plt";
10808      else
10809	return "bl %z1@plt";
10810    }
10811  else
10812    return "bl %z1";
10813#endif
10814}
10815  [(set_attr "type" "branch,branch")
10816   (set_attr "length" "4,8")])
10817
10818;; Call subroutine returning any type.
10819(define_expand "untyped_call"
10820  [(parallel [(call (match_operand 0 "" "")
10821		    (const_int 0))
10822	      (match_operand 1 "" "")
10823	      (match_operand 2 "" "")])]
10824  ""
10825  "
10826{
10827  int i;
10828
10829  emit_call_insn (GEN_CALL (operands[0], const0_rtx, const0_rtx, const0_rtx));
10830
10831  for (i = 0; i < XVECLEN (operands[2], 0); i++)
10832    {
10833      rtx set = XVECEXP (operands[2], 0, i);
10834      emit_move_insn (SET_DEST (set), SET_SRC (set));
10835    }
10836
10837  /* The optimizer does not know that the call sets the function value
10838     registers we stored in the result block.  We avoid problems by
10839     claiming that all hard registers are used and clobbered at this
10840     point.  */
10841  emit_insn (gen_blockage ());
10842
10843  DONE;
10844}")
10845
10846;; sibling call patterns
10847(define_expand "sibcall"
10848  [(parallel [(call (mem:SI (match_operand 0 "address_operand" ""))
10849		    (match_operand 1 "" ""))
10850	      (use (match_operand 2 "" ""))
10851	      (use (match_operand 3 "" ""))
10852	      (return)])]
10853  ""
10854  "
10855{
10856#if TARGET_MACHO
10857  if (MACHOPIC_INDIRECT)
10858    operands[0] = machopic_indirect_call_target (operands[0]);
10859#endif
10860
10861  gcc_assert (GET_CODE (operands[0]) == MEM);
10862  gcc_assert (GET_CODE (operands[1]) == CONST_INT);
10863
10864  operands[0] = XEXP (operands[0], 0);
10865  operands[3] = gen_reg_rtx (SImode);
10866
10867}")
10868
10869;; this and similar patterns must be marked as using LR, otherwise
10870;; dataflow will try to delete the store into it.  This is true
10871;; even when the actual reg to jump to is in CTR, when LR was
10872;; saved and restored around the PIC-setting BCL.
10873(define_insn "*sibcall_local32"
10874  [(call (mem:SI (match_operand:SI 0 "current_file_function_operand" "s,s"))
10875	 (match_operand 1 "" "g,g"))
10876   (use (match_operand:SI 2 "immediate_operand" "O,n"))
10877   (use (match_operand:SI 3 "register_operand" "l,l"))
10878   (return)]
10879  "(INTVAL (operands[2]) & CALL_LONG) == 0"
10880  "*
10881{
10882  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10883    output_asm_insn (\"crxor 6,6,6\", operands);
10884
10885  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10886    output_asm_insn (\"creqv 6,6,6\", operands);
10887
10888  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z0@local\" : \"b %z0\";
10889}"
10890  [(set_attr "type" "branch")
10891   (set_attr "length" "4,8")])
10892
10893(define_insn "*sibcall_local64"
10894  [(call (mem:SI (match_operand:DI 0 "current_file_function_operand" "s,s"))
10895	 (match_operand 1 "" "g,g"))
10896   (use (match_operand:SI 2 "immediate_operand" "O,n"))
10897   (use (match_operand:SI 3 "register_operand" "l,l"))
10898   (return)]
10899  "TARGET_64BIT && (INTVAL (operands[2]) & CALL_LONG) == 0"
10900  "*
10901{
10902  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
10903    output_asm_insn (\"crxor 6,6,6\", operands);
10904
10905  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
10906    output_asm_insn (\"creqv 6,6,6\", operands);
10907
10908  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z0@local\" : \"b %z0\";
10909}"
10910  [(set_attr "type" "branch")
10911   (set_attr "length" "4,8")])
10912
10913(define_insn "*sibcall_value_local32"
10914  [(set (match_operand 0 "" "")
10915	(call (mem:SI (match_operand:SI 1 "current_file_function_operand" "s,s"))
10916	      (match_operand 2 "" "g,g")))
10917   (use (match_operand:SI 3 "immediate_operand" "O,n"))
10918   (use (match_operand:SI 4 "register_operand" "l,l"))
10919   (return)]
10920  "(INTVAL (operands[3]) & CALL_LONG) == 0"
10921  "*
10922{
10923  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10924    output_asm_insn (\"crxor 6,6,6\", operands);
10925
10926  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10927    output_asm_insn (\"creqv 6,6,6\", operands);
10928
10929  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z1@local\" : \"b %z1\";
10930}"
10931  [(set_attr "type" "branch")
10932   (set_attr "length" "4,8")])
10933
10934
10935(define_insn "*sibcall_value_local64"
10936  [(set (match_operand 0 "" "")
10937	(call (mem:SI (match_operand:DI 1 "current_file_function_operand" "s,s"))
10938	      (match_operand 2 "" "g,g")))
10939   (use (match_operand:SI 3 "immediate_operand" "O,n"))
10940   (use (match_operand:SI 4 "register_operand" "l,l"))
10941   (return)]
10942  "TARGET_64BIT && (INTVAL (operands[3]) & CALL_LONG) == 0"
10943  "*
10944{
10945  if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
10946    output_asm_insn (\"crxor 6,6,6\", operands);
10947
10948  else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
10949    output_asm_insn (\"creqv 6,6,6\", operands);
10950
10951  return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z1@local\" : \"b %z1\";
10952}"
10953  [(set_attr "type" "branch")
10954   (set_attr "length" "4,8")])
10955
10956(define_insn "*sibcall_nonlocal_aix32"
10957  [(call (mem:SI (match_operand:SI 0 "symbol_ref_operand" "s"))
10958	 (match_operand 1 "" "g"))
10959   (use (match_operand:SI 2 "immediate_operand" "O"))
10960   (use (match_operand:SI 3 "register_operand" "l"))
10961   (return)]
10962  "TARGET_32BIT
10963   && DEFAULT_ABI == ABI_AIX
10964   && (INTVAL (operands[2]) & CALL_LONG) == 0"
10965  "b %z0"
10966  [(set_attr "type" "branch")
10967   (set_attr "length" "4")])
10968
10969(define_insn "*sibcall_nonlocal_aix64"
10970  [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s"))
10971	 (match_operand 1 "" "g"))
10972   (use (match_operand:SI 2 "immediate_operand" "O"))
10973   (use (match_operand:SI 3 "register_operand" "l"))
10974   (return)]
10975  "TARGET_64BIT
10976   && DEFAULT_ABI == ABI_AIX
10977   && (INTVAL (operands[2]) & CALL_LONG) == 0"
10978  "b %z0"
10979  [(set_attr "type" "branch")
10980   (set_attr "length" "4")])
10981
10982(define_insn "*sibcall_value_nonlocal_aix32"
10983  [(set (match_operand 0 "" "")
10984	(call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "s"))
10985	      (match_operand 2 "" "g")))
10986   (use (match_operand:SI 3 "immediate_operand" "O"))
10987   (use (match_operand:SI 4 "register_operand" "l"))
10988   (return)]
10989  "TARGET_32BIT
10990   && DEFAULT_ABI == ABI_AIX
10991   && (INTVAL (operands[3]) & CALL_LONG) == 0"
10992  "b %z1"
10993  [(set_attr "type" "branch")
10994   (set_attr "length" "4")])
10995
10996(define_insn "*sibcall_value_nonlocal_aix64"
10997  [(set (match_operand 0 "" "")
10998	(call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s"))
10999	      (match_operand 2 "" "g")))
11000   (use (match_operand:SI 3 "immediate_operand" "O"))
11001   (use (match_operand:SI 4 "register_operand" "l"))
11002   (return)]
11003  "TARGET_64BIT
11004   && DEFAULT_ABI == ABI_AIX
11005   && (INTVAL (operands[3]) & CALL_LONG) == 0"
11006  "b %z1"
11007  [(set_attr "type" "branch")
11008   (set_attr "length" "4")])
11009
11010(define_insn "*sibcall_nonlocal_sysv<mode>"
11011  [(call (mem:SI (match_operand:P 0 "symbol_ref_operand" "s,s"))
11012	 (match_operand 1 "" ""))
11013   (use (match_operand 2 "immediate_operand" "O,n"))
11014   (use (match_operand:SI 3 "register_operand" "l,l"))
11015   (return)]
11016  "(DEFAULT_ABI == ABI_DARWIN
11017     || DEFAULT_ABI == ABI_V4)
11018   && (INTVAL (operands[2]) & CALL_LONG) == 0"
11019  "*
11020{
11021  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
11022    output_asm_insn (\"crxor 6,6,6\", operands);
11023
11024  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
11025    output_asm_insn (\"creqv 6,6,6\", operands);
11026
11027  if (DEFAULT_ABI == ABI_V4 && flag_pic)
11028    {
11029      if (TARGET_SECURE_PLT && flag_pic == 2)
11030	return \"b %z0+32768@plt\";
11031      else
11032	return \"b %z0@plt\";
11033    }
11034  else
11035    return \"b %z0\";
11036}"
11037  [(set_attr "type" "branch,branch")
11038   (set_attr "length" "4,8")])
11039
11040(define_expand "sibcall_value"
11041  [(parallel [(set (match_operand 0 "register_operand" "")
11042		(call (mem:SI (match_operand 1 "address_operand" ""))
11043		      (match_operand 2 "" "")))
11044	      (use (match_operand 3 "" ""))
11045	      (use (match_operand 4 "" ""))
11046	      (return)])]
11047  ""
11048  "
11049{
11050#if TARGET_MACHO
11051  if (MACHOPIC_INDIRECT)
11052    operands[1] = machopic_indirect_call_target (operands[1]);
11053#endif
11054
11055  gcc_assert (GET_CODE (operands[1]) == MEM);
11056  gcc_assert (GET_CODE (operands[2]) == CONST_INT);
11057
11058  operands[1] = XEXP (operands[1], 0);
11059  operands[4] = gen_reg_rtx (SImode);
11060
11061}")
11062
11063(define_insn "*sibcall_value_nonlocal_sysv<mode>"
11064  [(set (match_operand 0 "" "")
11065	(call (mem:SI (match_operand:P 1 "symbol_ref_operand" "s,s"))
11066	      (match_operand 2 "" "")))
11067   (use (match_operand:SI 3 "immediate_operand" "O,n"))
11068   (use (match_operand:SI 4 "register_operand" "l,l"))
11069   (return)]
11070  "(DEFAULT_ABI == ABI_DARWIN
11071       || DEFAULT_ABI == ABI_V4)
11072   && (INTVAL (operands[3]) & CALL_LONG) == 0"
11073  "*
11074{
11075  if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
11076    output_asm_insn (\"crxor 6,6,6\", operands);
11077
11078  else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
11079    output_asm_insn (\"creqv 6,6,6\", operands);
11080
11081  if (DEFAULT_ABI == ABI_V4 && flag_pic)
11082    {
11083      if (TARGET_SECURE_PLT && flag_pic == 2)
11084	return \"b %z1+32768@plt\";
11085      else
11086	return \"b %z1@plt\";
11087    }
11088  else
11089    return \"b %z1\";
11090}"
11091  [(set_attr "type" "branch,branch")
11092   (set_attr "length" "4,8")])
11093
11094(define_expand "sibcall_epilogue"
11095  [(use (const_int 0))]
11096  "TARGET_SCHED_PROLOG"
11097  "
11098{
11099      rs6000_emit_epilogue (TRUE);
11100      DONE;
11101}")
11102
11103;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
11104;; all of memory.  This blocks insns from being moved across this point.
11105
11106(define_insn "blockage"
11107  [(unspec_volatile [(const_int 0)] UNSPECV_BLOCK)]
11108  ""
11109  "")
11110
11111;; Compare insns are next.  Note that the RS/6000 has two types of compares,
11112;; signed & unsigned, and one type of branch.
11113;;
11114;; Start with the DEFINE_EXPANDs to generate the rtl for compares, scc
11115;; insns, and branches.  We store the operands of compares until we see
11116;; how it is used.
11117(define_expand "cmp<mode>"
11118  [(set (cc0)
11119        (compare (match_operand:GPR 0 "gpc_reg_operand" "")
11120  		 (match_operand:GPR 1 "reg_or_short_operand" "")))]
11121  ""
11122  "
11123{
11124  /* Take care of the possibility that operands[1] might be negative but
11125     this might be a logical operation.  That insn doesn't exist.  */
11126  if (GET_CODE (operands[1]) == CONST_INT
11127      && INTVAL (operands[1]) < 0)
11128    operands[1] = force_reg (<MODE>mode, operands[1]);
11129
11130  rs6000_compare_op0 = operands[0];
11131  rs6000_compare_op1 = operands[1];
11132  rs6000_compare_fp_p = 0;
11133  DONE;
11134}")
11135
11136(define_expand "cmp<mode>"
11137  [(set (cc0) (compare (match_operand:FP 0 "gpc_reg_operand" "")
11138		       (match_operand:FP 1 "gpc_reg_operand" "")))]
11139  ""
11140  "
11141{
11142  rs6000_compare_op0 = operands[0];
11143  rs6000_compare_op1 = operands[1];
11144  rs6000_compare_fp_p = 1;
11145  DONE;
11146}")
11147
11148(define_expand "beq"
11149  [(use (match_operand 0 "" ""))]
11150  ""
11151  "{ rs6000_emit_cbranch (EQ, operands[0]); DONE; }")
11152
11153(define_expand "bne"
11154  [(use (match_operand 0 "" ""))]
11155  ""
11156  "{ rs6000_emit_cbranch (NE, operands[0]); DONE; }")
11157
11158(define_expand "bge"
11159  [(use (match_operand 0 "" ""))]
11160  ""
11161  "{ rs6000_emit_cbranch (GE, operands[0]); DONE; }")
11162
11163(define_expand "bgt"
11164  [(use (match_operand 0 "" ""))]
11165  ""
11166  "{ rs6000_emit_cbranch (GT, operands[0]); DONE; }")
11167
11168(define_expand "ble"
11169  [(use (match_operand 0 "" ""))]
11170  ""
11171  "{ rs6000_emit_cbranch (LE, operands[0]); DONE; }")
11172
11173(define_expand "blt"
11174  [(use (match_operand 0 "" ""))]
11175  ""
11176  "{ rs6000_emit_cbranch (LT, operands[0]); DONE; }")
11177
11178(define_expand "bgeu"
11179  [(use (match_operand 0 "" ""))]
11180  ""
11181  "{ rs6000_emit_cbranch (GEU, operands[0]); DONE; }")
11182
11183(define_expand "bgtu"
11184  [(use (match_operand 0 "" ""))]
11185  ""
11186  "{ rs6000_emit_cbranch (GTU, operands[0]); DONE; }")
11187
11188(define_expand "bleu"
11189  [(use (match_operand 0 "" ""))]
11190  ""
11191  "{ rs6000_emit_cbranch (LEU, operands[0]); DONE; }")
11192
11193(define_expand "bltu"
11194  [(use (match_operand 0 "" ""))]
11195  ""
11196  "{ rs6000_emit_cbranch (LTU, operands[0]); DONE; }")
11197
11198(define_expand "bunordered"
11199  [(use (match_operand 0 "" ""))]
11200  "! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)"
11201  "{ rs6000_emit_cbranch (UNORDERED, operands[0]); DONE; }")
11202
11203(define_expand "bordered"
11204  [(use (match_operand 0 "" ""))]
11205  "! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)"
11206  "{ rs6000_emit_cbranch (ORDERED, operands[0]); DONE; }")
11207
11208(define_expand "buneq"
11209  [(use (match_operand 0 "" ""))]
11210  ""
11211  "{ rs6000_emit_cbranch (UNEQ, operands[0]); DONE; }")
11212
11213(define_expand "bunge"
11214  [(use (match_operand 0 "" ""))]
11215  ""
11216  "{ rs6000_emit_cbranch (UNGE, operands[0]); DONE; }")
11217
11218(define_expand "bungt"
11219  [(use (match_operand 0 "" ""))]
11220  ""
11221  "{ rs6000_emit_cbranch (UNGT, operands[0]); DONE; }")
11222
11223(define_expand "bunle"
11224  [(use (match_operand 0 "" ""))]
11225  ""
11226  "{ rs6000_emit_cbranch (UNLE, operands[0]); DONE; }")
11227
11228(define_expand "bunlt"
11229  [(use (match_operand 0 "" ""))]
11230  ""
11231  "{ rs6000_emit_cbranch (UNLT, operands[0]); DONE; }")
11232
11233(define_expand "bltgt"
11234  [(use (match_operand 0 "" ""))]
11235  ""
11236  "{ rs6000_emit_cbranch (LTGT, operands[0]); DONE; }")
11237
11238;; For SNE, we would prefer that the xor/abs sequence be used for integers.
11239;; For SEQ, likewise, except that comparisons with zero should be done
11240;; with an scc insns.  However, due to the order that combine see the
11241;; resulting insns, we must, in fact, allow SEQ for integers.  Fail in
11242;; the cases we don't want to handle.
11243(define_expand "seq"
11244  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11245  ""
11246  "{ rs6000_emit_sCOND (EQ, operands[0]); DONE; }")
11247
11248(define_expand "sne"
11249  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11250  ""
11251  "
11252{
11253  if (! rs6000_compare_fp_p)
11254    FAIL;
11255
11256  rs6000_emit_sCOND (NE, operands[0]);
11257  DONE;
11258}")
11259
11260;; A >= 0 is best done the portable way for A an integer.
11261(define_expand "sge"
11262  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11263  ""
11264  "
11265{
11266  if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
11267    FAIL;
11268
11269  rs6000_emit_sCOND (GE, operands[0]);
11270  DONE;
11271}")
11272
11273;; A > 0 is best done using the portable sequence, so fail in that case.
11274(define_expand "sgt"
11275  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11276  ""
11277  "
11278{
11279  if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
11280    FAIL;
11281
11282  rs6000_emit_sCOND (GT, operands[0]);
11283  DONE;
11284}")
11285
11286;; A <= 0 is best done the portable way for A an integer.
11287(define_expand "sle"
11288  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11289  ""
11290  "
11291{
11292  if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
11293    FAIL;
11294
11295  rs6000_emit_sCOND (LE, operands[0]);
11296  DONE;
11297}")
11298
11299;; A < 0 is best done in the portable way for A an integer.
11300(define_expand "slt"
11301  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11302  ""
11303  "
11304{
11305  if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
11306    FAIL;
11307
11308  rs6000_emit_sCOND (LT, operands[0]);
11309  DONE;
11310}")
11311
11312(define_expand "sgeu"
11313  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11314  ""
11315  "{ rs6000_emit_sCOND (GEU, operands[0]); DONE; }")
11316
11317(define_expand "sgtu"
11318  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11319  ""
11320  "{ rs6000_emit_sCOND (GTU, operands[0]); DONE; }")
11321
11322(define_expand "sleu"
11323  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11324  ""
11325  "{ rs6000_emit_sCOND (LEU, operands[0]); DONE; }")
11326
11327(define_expand "sltu"
11328  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11329  ""
11330  "{ rs6000_emit_sCOND (LTU, operands[0]); DONE; }")
11331
11332(define_expand "sunordered"
11333  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11334  "! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)"
11335  "{ rs6000_emit_sCOND (UNORDERED, operands[0]); DONE; }")
11336
11337(define_expand "sordered"
11338  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11339  "! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)"
11340  "{ rs6000_emit_sCOND (ORDERED, operands[0]); DONE; }")
11341
11342(define_expand "suneq"
11343  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11344  ""
11345  "{ rs6000_emit_sCOND (UNEQ, operands[0]); DONE; }")
11346
11347(define_expand "sunge"
11348  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11349  ""
11350  "{ rs6000_emit_sCOND (UNGE, operands[0]); DONE; }")
11351
11352(define_expand "sungt"
11353  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11354  ""
11355  "{ rs6000_emit_sCOND (UNGT, operands[0]); DONE; }")
11356
11357(define_expand "sunle"
11358  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11359  ""
11360  "{ rs6000_emit_sCOND (UNLE, operands[0]); DONE; }")
11361
11362(define_expand "sunlt"
11363  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11364  ""
11365  "{ rs6000_emit_sCOND (UNLT, operands[0]); DONE; }")
11366
11367(define_expand "sltgt"
11368  [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
11369  ""
11370  "{ rs6000_emit_sCOND (LTGT, operands[0]); DONE; }")
11371
11372(define_expand "stack_protect_set"
11373  [(match_operand 0 "memory_operand" "")
11374   (match_operand 1 "memory_operand" "")]
11375  ""
11376{
11377#ifdef TARGET_THREAD_SSP_OFFSET
11378  rtx tlsreg = gen_rtx_REG (Pmode, TARGET_64BIT ? 13 : 2);
11379  rtx addr = gen_rtx_PLUS (Pmode, tlsreg, GEN_INT (TARGET_THREAD_SSP_OFFSET));
11380  operands[1] = gen_rtx_MEM (Pmode, addr);
11381#endif
11382  if (TARGET_64BIT)
11383    emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
11384  else
11385    emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
11386  DONE;
11387})
11388
11389(define_insn "stack_protect_setsi"
11390  [(set (match_operand:SI 0 "memory_operand" "=m")
11391	(unspec:SI [(match_operand:SI 1 "memory_operand" "m")] UNSPEC_SP_SET))
11392   (set (match_scratch:SI 2 "=&r") (const_int 0))]
11393  "TARGET_32BIT"
11394  "{l%U1%X1|lwz%U1%X1} %2,%1\;{st%U0%X0|stw%U0%X0} %2,%0\;{lil|li} %2,0"
11395  [(set_attr "type" "three")
11396   (set_attr "length" "12")])
11397
11398(define_insn "stack_protect_setdi"
11399  [(set (match_operand:DI 0 "memory_operand" "=m")
11400	(unspec:DI [(match_operand:DI 1 "memory_operand" "m")] UNSPEC_SP_SET))
11401   (set (match_scratch:DI 2 "=&r") (const_int 0))]
11402  "TARGET_64BIT"
11403  "ld%U1%X1 %2,%1\;std%U0%X0 %2,%0\;{lil|li} %2,0"
11404  [(set_attr "type" "three")
11405   (set_attr "length" "12")])
11406
11407(define_expand "stack_protect_test"
11408  [(match_operand 0 "memory_operand" "")
11409   (match_operand 1 "memory_operand" "")
11410   (match_operand 2 "" "")]
11411  ""
11412{
11413#ifdef TARGET_THREAD_SSP_OFFSET
11414  rtx tlsreg = gen_rtx_REG (Pmode, TARGET_64BIT ? 13 : 2);
11415  rtx addr = gen_rtx_PLUS (Pmode, tlsreg, GEN_INT (TARGET_THREAD_SSP_OFFSET));
11416  operands[1] = gen_rtx_MEM (Pmode, addr);
11417#endif
11418  rs6000_compare_op0 = operands[0];
11419  rs6000_compare_op1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, operands[1]),
11420				       UNSPEC_SP_TEST);
11421  rs6000_compare_fp_p = 0;
11422  emit_jump_insn (gen_beq (operands[2]));
11423  DONE;
11424})
11425
11426(define_insn "stack_protect_testsi"
11427  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=x,?y")
11428        (unspec:CCEQ [(match_operand:SI 1 "memory_operand" "m,m")
11429		      (match_operand:SI 2 "memory_operand" "m,m")]
11430		     UNSPEC_SP_TEST))
11431   (set (match_scratch:SI 4 "=r,r") (const_int 0))
11432   (clobber (match_scratch:SI 3 "=&r,&r"))]
11433  "TARGET_32BIT"
11434  "@
11435   {l%U1%X1|lwz%U1%X1} %3,%1\;{l%U2%X2|lwz%U2%X2} %4,%2\;xor. %3,%3,%4\;{lil|li} %4,0
11436   {l%U1%X1|lwz%U1%X1} %3,%1\;{l%U2%X2|lwz%U2%X2} %4,%2\;{cmpl|cmplw} %0,%3,%4\;{lil|li} %3,0\;{lil|li} %4,0"
11437  [(set_attr "length" "16,20")])
11438
11439(define_insn "stack_protect_testdi"
11440  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=x,?y")
11441        (unspec:CCEQ [(match_operand:DI 1 "memory_operand" "m,m")
11442		      (match_operand:DI 2 "memory_operand" "m,m")]
11443		     UNSPEC_SP_TEST))
11444   (set (match_scratch:DI 4 "=r,r") (const_int 0))
11445   (clobber (match_scratch:DI 3 "=&r,&r"))]
11446  "TARGET_64BIT"
11447  "@
11448   ld%U1%X1 %3,%1\;ld%U2%X2 %4,%2\;xor. %3,%3,%4\;{lil|li} %4,0
11449   ld%U1%X1 %3,%1\;ld%U2%X2 %4,%2\;cmpld %0,%3,%4\;{lil|li} %3,0\;{lil|li} %4,0"
11450  [(set_attr "length" "16,20")])
11451
11452
11453;; Here are the actual compare insns.
11454(define_insn "*cmp<mode>_internal1"
11455  [(set (match_operand:CC 0 "cc_reg_operand" "=y")
11456	(compare:CC (match_operand:GPR 1 "gpc_reg_operand" "r")
11457		    (match_operand:GPR 2 "reg_or_short_operand" "rI")))]
11458  ""
11459  "{cmp%I2|cmp<wd>%I2} %0,%1,%2"
11460  [(set_attr "type" "cmp")])
11461
11462;; If we are comparing a register for equality with a large constant,
11463;; we can do this with an XOR followed by a compare.  But this is profitable
11464;; only if the large constant is only used for the comparison (and in this
11465;; case we already have a register to reuse as scratch).
11466;;
11467;; For 64-bit registers, we could only do so if the constant's bit 15 is clear:
11468;; otherwise we'd need to XOR with FFFFFFFF????0000 which is not available.
11469
11470(define_peephole2
11471  [(set (match_operand:SI 0 "register_operand")
11472        (match_operand:SI 1 "logical_const_operand" ""))
11473   (set (match_dup 0) (match_operator:SI 3 "boolean_or_operator"
11474		       [(match_dup 0)
11475			(match_operand:SI 2 "logical_const_operand" "")]))
11476   (set (match_operand:CC 4 "cc_reg_operand" "")
11477        (compare:CC (match_operand:SI 5 "gpc_reg_operand" "")
11478                    (match_dup 0)))
11479   (set (pc)
11480        (if_then_else (match_operator 6 "equality_operator"
11481                       [(match_dup 4) (const_int 0)])
11482                      (match_operand 7 "" "")
11483                      (match_operand 8 "" "")))]
11484  "peep2_reg_dead_p (3, operands[0])
11485   && peep2_reg_dead_p (4, operands[4])"
11486 [(set (match_dup 0) (xor:SI (match_dup 5) (match_dup 9)))
11487  (set (match_dup 4) (compare:CC (match_dup 0) (match_dup 10)))
11488  (set (pc) (if_then_else (match_dup 6) (match_dup 7) (match_dup 8)))]
11489 
11490{
11491  /* Get the constant we are comparing against, and see what it looks like
11492     when sign-extended from 16 to 32 bits.  Then see what constant we could
11493     XOR with SEXTC to get the sign-extended value.  */
11494  rtx cnst = simplify_const_binary_operation (GET_CODE (operands[3]),
11495					      SImode,
11496					      operands[1], operands[2]);
11497  HOST_WIDE_INT c = INTVAL (cnst);
11498  HOST_WIDE_INT sextc = ((c & 0xffff) ^ 0x8000) - 0x8000;
11499  HOST_WIDE_INT xorv = c ^ sextc;
11500
11501  operands[9] = GEN_INT (xorv);
11502  operands[10] = GEN_INT (sextc);
11503})
11504
11505(define_insn "*cmpsi_internal2"
11506  [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y")
11507	(compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "r")
11508		       (match_operand:SI 2 "reg_or_u_short_operand" "rK")))]
11509  ""
11510  "{cmpl%I2|cmplw%I2} %0,%1,%b2"
11511  [(set_attr "type" "cmp")])
11512
11513(define_insn "*cmpdi_internal2"
11514  [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y")
11515	(compare:CCUNS (match_operand:DI 1 "gpc_reg_operand" "r")
11516		       (match_operand:DI 2 "reg_or_u_short_operand" "rK")))]
11517  ""
11518  "cmpld%I2 %0,%1,%b2"
11519  [(set_attr "type" "cmp")])
11520
11521;; The following two insns don't exist as single insns, but if we provide
11522;; them, we can swap an add and compare, which will enable us to overlap more
11523;; of the required delay between a compare and branch.  We generate code for
11524;; them by splitting.
11525
11526(define_insn ""
11527  [(set (match_operand:CC 3 "cc_reg_operand" "=y")
11528	(compare:CC (match_operand:SI 1 "gpc_reg_operand" "r")
11529		    (match_operand:SI 2 "short_cint_operand" "i")))
11530   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
11531	(plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
11532  ""
11533  "#"
11534  [(set_attr "length" "8")])
11535
11536(define_insn ""
11537  [(set (match_operand:CCUNS 3 "cc_reg_operand" "=y")
11538	(compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "r")
11539		       (match_operand:SI 2 "u_short_cint_operand" "i")))
11540   (set (match_operand:SI 0 "gpc_reg_operand" "=r")
11541	(plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
11542  ""
11543  "#"
11544  [(set_attr "length" "8")])
11545
11546(define_split
11547  [(set (match_operand:CC 3 "cc_reg_operand" "")
11548	(compare:CC (match_operand:SI 1 "gpc_reg_operand" "")
11549		    (match_operand:SI 2 "short_cint_operand" "")))
11550   (set (match_operand:SI 0 "gpc_reg_operand" "")
11551	(plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
11552  ""
11553  [(set (match_dup 3) (compare:CC (match_dup 1) (match_dup 2)))
11554   (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
11555
11556(define_split
11557  [(set (match_operand:CCUNS 3 "cc_reg_operand" "")
11558	(compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "")
11559		       (match_operand:SI 2 "u_short_cint_operand" "")))
11560   (set (match_operand:SI 0 "gpc_reg_operand" "")
11561	(plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
11562  ""
11563  [(set (match_dup 3) (compare:CCUNS (match_dup 1) (match_dup 2)))
11564   (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
11565
11566(define_insn "*cmpsf_internal1"
11567  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
11568	(compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "f")
11569		      (match_operand:SF 2 "gpc_reg_operand" "f")))]
11570  "TARGET_HARD_FLOAT && TARGET_FPRS"
11571  "fcmpu %0,%1,%2"
11572  [(set_attr "type" "fpcompare")])
11573
11574(define_insn "*cmpdf_internal1"
11575  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
11576	(compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "f")
11577		      (match_operand:DF 2 "gpc_reg_operand" "f")))]
11578  "TARGET_HARD_FLOAT && TARGET_FPRS"
11579  "fcmpu %0,%1,%2"
11580  [(set_attr "type" "fpcompare")])
11581
11582;; Only need to compare second words if first words equal
11583(define_insn "*cmptf_internal1"
11584  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
11585	(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "f")
11586		      (match_operand:TF 2 "gpc_reg_operand" "f")))]
11587  "!TARGET_IEEEQUAD && !TARGET_XL_COMPAT
11588   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
11589  "fcmpu %0,%1,%2\;bne %0,$+8\;fcmpu %0,%L1,%L2"
11590  [(set_attr "type" "fpcompare")
11591   (set_attr "length" "12")])
11592
11593(define_insn_and_split "*cmptf_internal2"
11594  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
11595	(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "f")
11596		      (match_operand:TF 2 "gpc_reg_operand" "f")))
11597    (clobber (match_scratch:DF 3 "=f"))
11598    (clobber (match_scratch:DF 4 "=f"))
11599    (clobber (match_scratch:DF 5 "=f"))
11600    (clobber (match_scratch:DF 6 "=f"))
11601    (clobber (match_scratch:DF 7 "=f"))
11602    (clobber (match_scratch:DF 8 "=f"))
11603    (clobber (match_scratch:DF 9 "=f"))
11604    (clobber (match_scratch:DF 10 "=f"))]
11605  "!TARGET_IEEEQUAD && TARGET_XL_COMPAT
11606   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
11607  "#"
11608  "&& reload_completed"
11609  [(set (match_dup 3) (match_dup 13))
11610   (set (match_dup 4) (match_dup 14))
11611   (set (match_dup 9) (abs:DF (match_dup 5)))
11612   (set (match_dup 0) (compare:CCFP (match_dup 9) (match_dup 3)))
11613   (set (pc) (if_then_else (ne (match_dup 0) (const_int 0))
11614			   (label_ref (match_dup 11))
11615			   (pc)))
11616   (set (match_dup 0) (compare:CCFP (match_dup 5) (match_dup 7)))
11617   (set (pc) (label_ref (match_dup 12)))
11618   (match_dup 11)
11619   (set (match_dup 10) (minus:DF (match_dup 5) (match_dup 7)))
11620   (set (match_dup 9) (minus:DF (match_dup 6) (match_dup 8)))
11621   (set (match_dup 9) (plus:DF (match_dup 10) (match_dup 9)))
11622   (set (match_dup 0) (compare:CCFP (match_dup 7) (match_dup 4)))
11623   (match_dup 12)]
11624{
11625  REAL_VALUE_TYPE rv;
11626  const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
11627  const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
11628
11629  operands[5] = simplify_gen_subreg (DFmode, operands[1], TFmode, hi_word);
11630  operands[6] = simplify_gen_subreg (DFmode, operands[1], TFmode, lo_word);
11631  operands[7] = simplify_gen_subreg (DFmode, operands[2], TFmode, hi_word);
11632  operands[8] = simplify_gen_subreg (DFmode, operands[2], TFmode, lo_word);
11633  operands[11] = gen_label_rtx ();
11634  operands[12] = gen_label_rtx ();
11635  real_inf (&rv);
11636  operands[13] = force_const_mem (DFmode,
11637				  CONST_DOUBLE_FROM_REAL_VALUE (rv, DFmode));
11638  operands[14] = force_const_mem (DFmode,
11639				  CONST_DOUBLE_FROM_REAL_VALUE (dconst0,
11640								DFmode));
11641  if (TARGET_TOC)
11642    {
11643      operands[13] = gen_const_mem (DFmode,
11644				    create_TOC_reference (XEXP (operands[13], 0)));
11645      operands[14] = gen_const_mem (DFmode,
11646				    create_TOC_reference (XEXP (operands[14], 0)));
11647      set_mem_alias_set (operands[13], get_TOC_alias_set ());
11648      set_mem_alias_set (operands[14], get_TOC_alias_set ());
11649    }
11650})
11651
11652;; Now we have the scc insns.  We can do some combinations because of the
11653;; way the machine works.
11654;;
11655;; Note that this is probably faster if we can put an insn between the
11656;; mfcr and rlinm, but this is tricky.  Let's leave it for now.  In most
11657;; cases the insns below which don't use an intermediate CR field will
11658;; be used instead.
11659(define_insn ""
11660  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
11661	(match_operator:SI 1 "scc_comparison_operator"
11662			   [(match_operand 2 "cc_reg_operand" "y")
11663			    (const_int 0)]))]
11664  ""
11665  "mfcr %0%Q2\;{rlinm|rlwinm} %0,%0,%J1,1"
11666  [(set (attr "type")
11667     (cond [(ne (symbol_ref "TARGET_MFCRF") (const_int 0))
11668		(const_string "mfcrf")
11669	   ]
11670	(const_string "mfcr")))
11671   (set_attr "length" "8")])
11672
11673;; Same as above, but get the GT bit.
11674(define_insn "move_from_CR_gt_bit"
11675  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
11676	(unspec:SI [(match_operand 1 "cc_reg_operand" "y")] UNSPEC_MV_CR_GT))]
11677  "TARGET_E500"
11678  "mfcr %0\;{rlinm|rlwinm} %0,%0,%D1,31,31"
11679  [(set_attr "type" "mfcr")
11680   (set_attr "length" "8")])
11681
11682;; Same as above, but get the OV/ORDERED bit.
11683(define_insn "move_from_CR_ov_bit"
11684  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
11685	(unspec:SI [(match_operand 1 "cc_reg_operand" "y")] UNSPEC_MV_CR_OV))]
11686  "TARGET_ISEL"
11687  "mfcr %0\;{rlinm|rlwinm} %0,%0,%t1,1"
11688  [(set_attr "type" "mfcr")
11689   (set_attr "length" "8")])
11690
11691(define_insn ""
11692  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
11693	(match_operator:DI 1 "scc_comparison_operator"
11694			   [(match_operand 2 "cc_reg_operand" "y")
11695			    (const_int 0)]))]
11696  "TARGET_POWERPC64"
11697  "mfcr %0%Q2\;{rlinm|rlwinm} %0,%0,%J1,1"
11698  [(set (attr "type")
11699     (cond [(ne (symbol_ref "TARGET_MFCRF") (const_int 0))
11700		(const_string "mfcrf")
11701	   ]
11702	(const_string "mfcr")))
11703   (set_attr "length" "8")])
11704
11705(define_insn ""
11706  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
11707	(compare:CC (match_operator:SI 1 "scc_comparison_operator"
11708				       [(match_operand 2 "cc_reg_operand" "y,y")
11709					(const_int 0)])
11710		    (const_int 0)))
11711   (set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
11712	(match_op_dup 1 [(match_dup 2) (const_int 0)]))]
11713  "TARGET_32BIT"
11714  "@
11715   mfcr %3%Q2\;{rlinm.|rlwinm.} %3,%3,%J1,1
11716   #"
11717  [(set_attr "type" "delayed_compare")
11718   (set_attr "length" "8,16")])
11719
11720(define_split
11721  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
11722	(compare:CC (match_operator:SI 1 "scc_comparison_operator"
11723				       [(match_operand 2 "cc_reg_operand" "")
11724					(const_int 0)])
11725		    (const_int 0)))
11726   (set (match_operand:SI 3 "gpc_reg_operand" "")
11727	(match_op_dup 1 [(match_dup 2) (const_int 0)]))]
11728  "TARGET_32BIT && reload_completed"
11729  [(set (match_dup 3)
11730	(match_op_dup 1 [(match_dup 2) (const_int 0)]))
11731   (set (match_dup 0)
11732	(compare:CC (match_dup 3)
11733		    (const_int 0)))]
11734  "")
11735
11736(define_insn ""
11737  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
11738	(ashift:SI (match_operator:SI 1 "scc_comparison_operator"
11739				      [(match_operand 2 "cc_reg_operand" "y")
11740				       (const_int 0)])
11741		   (match_operand:SI 3 "const_int_operand" "n")))]
11742  ""
11743  "*
11744{
11745  int is_bit = ccr_bit (operands[1], 1);
11746  int put_bit = 31 - (INTVAL (operands[3]) & 31);
11747  int count;
11748
11749  if (is_bit >= put_bit)
11750    count = is_bit - put_bit;
11751  else
11752    count = 32 - (put_bit - is_bit);
11753
11754  operands[4] = GEN_INT (count);
11755  operands[5] = GEN_INT (put_bit);
11756
11757  return \"mfcr %0%Q2\;{rlinm|rlwinm} %0,%0,%4,%5,%5\";
11758}"
11759  [(set (attr "type")
11760     (cond [(ne (symbol_ref "TARGET_MFCRF") (const_int 0))
11761		(const_string "mfcrf")
11762	   ]
11763	(const_string "mfcr")))
11764   (set_attr "length" "8")])
11765
11766(define_insn ""
11767  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
11768	(compare:CC
11769	 (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
11770				       [(match_operand 2 "cc_reg_operand" "y,y")
11771					(const_int 0)])
11772		    (match_operand:SI 3 "const_int_operand" "n,n"))
11773	 (const_int 0)))
11774   (set (match_operand:SI 4 "gpc_reg_operand" "=r,r")
11775	(ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)])
11776		   (match_dup 3)))]
11777  ""
11778  "*
11779{
11780  int is_bit = ccr_bit (operands[1], 1);
11781  int put_bit = 31 - (INTVAL (operands[3]) & 31);
11782  int count;
11783
11784  /* Force split for non-cc0 compare.  */
11785  if (which_alternative == 1)
11786     return \"#\";
11787
11788  if (is_bit >= put_bit)
11789    count = is_bit - put_bit;
11790  else
11791    count = 32 - (put_bit - is_bit);
11792
11793  operands[5] = GEN_INT (count);
11794  operands[6] = GEN_INT (put_bit);
11795
11796  return \"mfcr %4%Q2\;{rlinm.|rlwinm.} %4,%4,%5,%6,%6\";
11797}"
11798  [(set_attr "type" "delayed_compare")
11799   (set_attr "length" "8,16")])
11800
11801(define_split
11802  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
11803	(compare:CC
11804	 (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
11805				       [(match_operand 2 "cc_reg_operand" "")
11806					(const_int 0)])
11807		    (match_operand:SI 3 "const_int_operand" ""))
11808	 (const_int 0)))
11809   (set (match_operand:SI 4 "gpc_reg_operand" "")
11810	(ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)])
11811		   (match_dup 3)))]
11812  "reload_completed"
11813  [(set (match_dup 4)
11814	(ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)])
11815		   (match_dup 3)))
11816   (set (match_dup 0)
11817	(compare:CC (match_dup 4)
11818		    (const_int 0)))]
11819  "")
11820
11821;; There is a 3 cycle delay between consecutive mfcr instructions
11822;; so it is useful to combine 2 scc instructions to use only one mfcr.
11823
11824(define_peephole
11825  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
11826	(match_operator:SI 1 "scc_comparison_operator"
11827			   [(match_operand 2 "cc_reg_operand" "y")
11828			    (const_int 0)]))
11829   (set (match_operand:SI 3 "gpc_reg_operand" "=r")
11830	(match_operator:SI 4 "scc_comparison_operator"
11831			   [(match_operand 5 "cc_reg_operand" "y")
11832			    (const_int 0)]))]
11833  "REGNO (operands[2]) != REGNO (operands[5])"
11834  "mfcr %3\;{rlinm|rlwinm} %0,%3,%J1,1\;{rlinm|rlwinm} %3,%3,%J4,1"
11835  [(set_attr "type" "mfcr")
11836   (set_attr "length" "12")])
11837
11838(define_peephole
11839  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
11840	(match_operator:DI 1 "scc_comparison_operator"
11841			   [(match_operand 2 "cc_reg_operand" "y")
11842			    (const_int 0)]))
11843   (set (match_operand:DI 3 "gpc_reg_operand" "=r")
11844	(match_operator:DI 4 "scc_comparison_operator"
11845			   [(match_operand 5 "cc_reg_operand" "y")
11846			    (const_int 0)]))]
11847  "TARGET_POWERPC64 && REGNO (operands[2]) != REGNO (operands[5])"
11848  "mfcr %3\;{rlinm|rlwinm} %0,%3,%J1,1\;{rlinm|rlwinm} %3,%3,%J4,1"
11849  [(set_attr "type" "mfcr")
11850   (set_attr "length" "12")])
11851
11852;; There are some scc insns that can be done directly, without a compare.
11853;; These are faster because they don't involve the communications between
11854;; the FXU and branch units.   In fact, we will be replacing all of the
11855;; integer scc insns here or in the portable methods in emit_store_flag.
11856;;
11857;; Also support (neg (scc ..)) since that construct is used to replace
11858;; branches, (plus (scc ..) ..) since that construct is common and
11859;; takes no more insns than scc, and (and (neg (scc ..)) ..) in the
11860;; cases where it is no more expensive than (neg (scc ..)).
11861
11862;; Have reload force a constant into a register for the simple insns that
11863;; otherwise won't accept constants.  We do this because it is faster than
11864;; the cmp/mfcr sequence we would otherwise generate.
11865
11866(define_mode_attr scc_eq_op2 [(SI "rKLI")
11867			      (DI "rKJI")])
11868
11869(define_insn_and_split "*eq<mode>"
11870  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
11871	(eq:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
11872		(match_operand:GPR 2 "scc_eq_operand" "<scc_eq_op2>")))]
11873  "!TARGET_POWER"
11874  "#"
11875  "!TARGET_POWER"
11876  [(set (match_dup 0)
11877	(clz:GPR (match_dup 3)))
11878   (set (match_dup 0)
11879	(lshiftrt:GPR (match_dup 0) (match_dup 4)))]
11880  {
11881    if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)
11882      {
11883	/* Use output operand as intermediate.  */
11884	operands[3] = operands[0];
11885
11886	if (logical_operand (operands[2], <MODE>mode))
11887	  emit_insn (gen_rtx_SET (VOIDmode, operands[3],
11888				  gen_rtx_XOR (<MODE>mode,
11889					       operands[1], operands[2])));
11890	else
11891	  emit_insn (gen_rtx_SET (VOIDmode, operands[3],
11892				  gen_rtx_PLUS (<MODE>mode, operands[1],
11893						negate_rtx (<MODE>mode,
11894							    operands[2]))));
11895      }
11896    else
11897      operands[3] = operands[1];
11898
11899    operands[4] = GEN_INT (exact_log2 (GET_MODE_BITSIZE (<MODE>mode)));
11900  })
11901
11902(define_insn_and_split "*eq<mode>_compare"
11903  [(set (match_operand:CC 3 "cc_reg_operand" "=y")
11904	(compare:CC
11905	 (eq:P (match_operand:P 1 "gpc_reg_operand" "=r")
11906	       (match_operand:P 2 "scc_eq_operand" "<scc_eq_op2>"))
11907	 (const_int 0)))
11908   (set (match_operand:P 0 "gpc_reg_operand" "=r")
11909	(eq:P (match_dup 1) (match_dup 2)))]
11910  "!TARGET_POWER && optimize_size"
11911  "#"
11912  "!TARGET_POWER && optimize_size"
11913  [(set (match_dup 0)
11914	(clz:P (match_dup 4)))
11915   (parallel [(set (match_dup 3)
11916		   (compare:CC (lshiftrt:P (match_dup 0) (match_dup 5))
11917			       (const_int 0)))
11918	      (set (match_dup 0)
11919		   (lshiftrt:P (match_dup 0) (match_dup 5)))])]
11920  {
11921    if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)
11922      {
11923	/* Use output operand as intermediate.  */
11924	operands[4] = operands[0];
11925
11926	if (logical_operand (operands[2], <MODE>mode))
11927	  emit_insn (gen_rtx_SET (VOIDmode, operands[4],
11928				  gen_rtx_XOR (<MODE>mode,
11929					       operands[1], operands[2])));
11930	else
11931	  emit_insn (gen_rtx_SET (VOIDmode, operands[4],
11932				  gen_rtx_PLUS (<MODE>mode, operands[1],
11933						negate_rtx (<MODE>mode,
11934							    operands[2]))));
11935      }
11936    else
11937      operands[4] = operands[1];
11938
11939    operands[5] = GEN_INT (exact_log2 (GET_MODE_BITSIZE (<MODE>mode)));
11940  })
11941
11942(define_insn "*eqsi_power"
11943  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
11944	(eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
11945	       (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I")))
11946   (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
11947  "TARGET_POWER"
11948  "@
11949   xor %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
11950   {sfi|subfic} %3,%1,0\;{ae|adde} %0,%3,%1
11951   {xoril|xori} %0,%1,%b2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
11952   {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
11953   {sfi|subfic} %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0"
11954  [(set_attr "type" "three,two,three,three,three")
11955   (set_attr "length" "12,8,12,12,12")])
11956
11957;; We have insns of the form shown by the first define_insn below.  If
11958;; there is something inside the comparison operation, we must split it.
11959(define_split
11960  [(set (match_operand:SI 0 "gpc_reg_operand" "")
11961	(plus:SI (match_operator 1 "comparison_operator"
11962				 [(match_operand:SI 2 "" "")
11963				  (match_operand:SI 3
11964						    "reg_or_cint_operand" "")])
11965		 (match_operand:SI 4 "gpc_reg_operand" "")))
11966   (clobber (match_operand:SI 5 "register_operand" ""))]
11967  "! gpc_reg_operand (operands[2], SImode)"
11968  [(set (match_dup 5) (match_dup 2))
11969   (set (match_dup 2) (plus:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)])
11970			       (match_dup 4)))])
11971
11972(define_insn "*plus_eqsi"
11973  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r")
11974	(plus:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
11975			(match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I"))
11976		 (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r")))]
11977  "TARGET_32BIT"
11978  "@
11979   xor %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
11980   {sfi|subfic} %0,%1,0\;{aze|addze} %0,%3
11981   {xoril|xori} %0,%1,%b2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
11982   {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
11983   {sfi|subfic} %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3"
11984  [(set_attr "type" "three,two,three,three,three")
11985   (set_attr "length" "12,8,12,12,12")])
11986
11987(define_insn "*compare_plus_eqsi"
11988  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
11989	(compare:CC
11990	 (plus:SI
11991	  (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
11992		 (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I,r,O,K,L,I"))
11993	  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r,r,r,r,r,r"))
11994	 (const_int 0)))
11995   (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r"))]
11996  "TARGET_32BIT && optimize_size"
11997  "@
11998   xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
11999   {sfi|subfic} %4,%1,0\;{aze.|addze.} %4,%3
12000   {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
12001   {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
12002   {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
12003   #
12004   #
12005   #
12006   #
12007   #"
12008  [(set_attr "type" "compare")
12009   (set_attr "length" "12,8,12,12,12,16,12,16,16,16")])
12010
12011(define_split
12012  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12013	(compare:CC
12014	 (plus:SI
12015	  (eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
12016		 (match_operand:SI 2 "scc_eq_operand" ""))
12017	  (match_operand:SI 3 "gpc_reg_operand" ""))
12018	 (const_int 0)))
12019   (clobber (match_scratch:SI 4 ""))]
12020  "TARGET_32BIT && optimize_size && reload_completed"
12021  [(set (match_dup 4)
12022	(plus:SI (eq:SI (match_dup 1)
12023		 (match_dup 2))
12024	  (match_dup 3)))
12025   (set (match_dup 0)
12026	(compare:CC (match_dup 4)
12027		    (const_int 0)))]
12028  "")
12029
12030(define_insn "*plus_eqsi_compare"
12031  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
12032	(compare:CC
12033	 (plus:SI
12034	  (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
12035		 (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I,r,O,K,L,I"))
12036	  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r,r,r,r,r,r"))
12037	 (const_int 0)))
12038   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r")
12039	(plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12040  "TARGET_32BIT && optimize_size"
12041  "@
12042   xor %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12043   {sfi|subfic} %0,%1,0\;{aze.|addze.} %0,%3
12044   {xoril|xori} %0,%1,%b2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12045   {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12046   {sfi|subfic} %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12047   #
12048   #
12049   #
12050   #
12051   #"
12052  [(set_attr "type" "compare")
12053   (set_attr "length" "12,8,12,12,12,16,12,16,16,16")])
12054
12055(define_split
12056  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12057	(compare:CC
12058	 (plus:SI
12059	  (eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
12060		 (match_operand:SI 2 "scc_eq_operand" ""))
12061	  (match_operand:SI 3 "gpc_reg_operand" ""))
12062	 (const_int 0)))
12063   (set (match_operand:SI 0 "gpc_reg_operand" "")
12064	(plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12065  "TARGET_32BIT && optimize_size && reload_completed"
12066  [(set (match_dup 0)
12067	(plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
12068   (set (match_dup 4)
12069	(compare:CC (match_dup 0)
12070		    (const_int 0)))]
12071  "")
12072
12073(define_insn "*neg_eq0<mode>"
12074  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
12075	(neg:P (eq:P (match_operand:P 1 "gpc_reg_operand" "r")
12076		     (const_int 0))))]
12077  ""
12078  "{ai|addic} %0,%1,-1\;{sfe|subfe} %0,%0,%0"
12079  [(set_attr "type" "two")
12080   (set_attr "length" "8")])
12081
12082(define_insn_and_split "*neg_eq<mode>"
12083  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
12084	(neg:P (eq:P (match_operand:P 1 "gpc_reg_operand" "%r")
12085		     (match_operand:P 2 "scc_eq_operand" "<scc_eq_op2>"))))]
12086  ""
12087  "#"
12088  ""
12089  [(set (match_dup 0) (neg:P (eq:P (match_dup 3) (const_int 0))))]
12090  {
12091    if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)
12092      {
12093	/* Use output operand as intermediate.  */
12094	operands[3] = operands[0];
12095
12096	if (logical_operand (operands[2], <MODE>mode))
12097	  emit_insn (gen_rtx_SET (VOIDmode, operands[3],
12098				  gen_rtx_XOR (<MODE>mode,
12099					       operands[1], operands[2])));
12100	else
12101	  emit_insn (gen_rtx_SET (VOIDmode, operands[3],
12102				  gen_rtx_PLUS (<MODE>mode, operands[1],
12103						negate_rtx (<MODE>mode,
12104							    operands[2]))));
12105      }
12106    else
12107      operands[3] = operands[1];
12108  })
12109
12110;; Simplify (ne X (const_int 0)) on the PowerPC.  No need to on the Power,
12111;; since it nabs/sr is just as fast.
12112(define_insn "*ne0si"
12113  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
12114	(lshiftrt:SI (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
12115		     (const_int 31)))
12116   (clobber (match_scratch:SI 2 "=&r"))]
12117  "! TARGET_POWER && TARGET_32BIT && !TARGET_ISEL"
12118  "{ai|addic} %2,%1,-1\;{sfe|subfe} %0,%2,%1"
12119  [(set_attr "type" "two")
12120   (set_attr "length" "8")])
12121
12122(define_insn "*ne0di"
12123  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
12124	(lshiftrt:DI (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r")))
12125		     (const_int 63)))
12126   (clobber (match_scratch:DI 2 "=&r"))]
12127  "TARGET_64BIT"
12128  "addic %2,%1,-1\;subfe %0,%2,%1"
12129  [(set_attr "type" "two")
12130   (set_attr "length" "8")])
12131
12132;; This is what (plus (ne X (const_int 0)) Y) looks like.
12133(define_insn "*plus_ne0si"
12134  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
12135	(plus:SI (lshiftrt:SI
12136		  (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
12137		  (const_int 31))
12138		 (match_operand:SI 2 "gpc_reg_operand" "r")))
12139   (clobber (match_scratch:SI 3 "=&r"))]
12140  "TARGET_32BIT"
12141  "{ai|addic} %3,%1,-1\;{aze|addze} %0,%2"
12142  [(set_attr "type" "two")
12143   (set_attr "length" "8")])
12144
12145(define_insn "*plus_ne0di"
12146  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
12147	(plus:DI (lshiftrt:DI
12148		  (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r")))
12149		  (const_int 63))
12150		 (match_operand:DI 2 "gpc_reg_operand" "r")))
12151   (clobber (match_scratch:DI 3 "=&r"))]
12152  "TARGET_64BIT"
12153  "addic %3,%1,-1\;addze %0,%2"
12154  [(set_attr "type" "two")
12155   (set_attr "length" "8")])
12156
12157(define_insn "*compare_plus_ne0si"
12158  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12159	(compare:CC
12160	 (plus:SI (lshiftrt:SI
12161		   (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")))
12162		   (const_int 31))
12163		  (match_operand:SI 2 "gpc_reg_operand" "r,r"))
12164	 (const_int 0)))
12165   (clobber (match_scratch:SI 3 "=&r,&r"))
12166   (clobber (match_scratch:SI 4 "=X,&r"))]
12167  "TARGET_32BIT"
12168  "@
12169   {ai|addic} %3,%1,-1\;{aze.|addze.} %3,%2
12170   #"
12171  [(set_attr "type" "compare")
12172   (set_attr "length" "8,12")])
12173
12174(define_split
12175  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12176	(compare:CC
12177	 (plus:SI (lshiftrt:SI
12178		   (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "")))
12179		   (const_int 31))
12180		  (match_operand:SI 2 "gpc_reg_operand" ""))
12181	 (const_int 0)))
12182   (clobber (match_scratch:SI 3 ""))
12183   (clobber (match_scratch:SI 4 ""))]
12184  "TARGET_32BIT && reload_completed"
12185  [(parallel [(set (match_dup 3)
12186		   (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1)))
12187					 (const_int 31))
12188			    (match_dup 2)))
12189              (clobber (match_dup 4))])
12190   (set (match_dup 0)
12191	(compare:CC (match_dup 3)
12192		    (const_int 0)))]
12193  "")
12194
12195(define_insn "*compare_plus_ne0di"
12196  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12197	(compare:CC
12198	 (plus:DI (lshiftrt:DI
12199		   (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")))
12200		   (const_int 63))
12201		  (match_operand:DI 2 "gpc_reg_operand" "r,r"))
12202	 (const_int 0)))
12203   (clobber (match_scratch:DI 3 "=&r,&r"))]
12204  "TARGET_64BIT"
12205  "@
12206   addic %3,%1,-1\;addze. %3,%2
12207   #"
12208  [(set_attr "type" "compare")
12209   (set_attr "length" "8,12")])
12210
12211(define_split
12212  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12213	(compare:CC
12214	 (plus:DI (lshiftrt:DI
12215		   (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "")))
12216		   (const_int 63))
12217		  (match_operand:DI 2 "gpc_reg_operand" ""))
12218	 (const_int 0)))
12219   (clobber (match_scratch:DI 3 ""))]
12220  "TARGET_64BIT && reload_completed"
12221  [(set (match_dup 3)
12222	(plus:DI (lshiftrt:DI (neg:DI (abs:DI (match_dup 1)))
12223		   (const_int 63))
12224		  (match_dup 2)))
12225   (set (match_dup 0)
12226	(compare:CC (match_dup 3)
12227		    (const_int 0)))]
12228  "")
12229
12230(define_insn "*plus_ne0si_compare"
12231  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12232	(compare:CC
12233	 (plus:SI (lshiftrt:SI
12234		   (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")))
12235		   (const_int 31))
12236		  (match_operand:SI 2 "gpc_reg_operand" "r,r"))
12237	 (const_int 0)))
12238   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
12239	(plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31))
12240		 (match_dup 2)))
12241   (clobber (match_scratch:SI 3 "=&r,&r"))]
12242  "TARGET_32BIT"
12243  "@
12244   {ai|addic} %3,%1,-1\;{aze.|addze.} %0,%2
12245   #"
12246  [(set_attr "type" "compare")
12247   (set_attr "length" "8,12")])
12248
12249(define_split
12250  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12251	(compare:CC
12252	 (plus:SI (lshiftrt:SI
12253		   (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "")))
12254		   (const_int 31))
12255		  (match_operand:SI 2 "gpc_reg_operand" ""))
12256	 (const_int 0)))
12257   (set (match_operand:SI 0 "gpc_reg_operand" "")
12258	(plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31))
12259		 (match_dup 2)))
12260   (clobber (match_scratch:SI 3 ""))]
12261  "TARGET_32BIT && reload_completed"
12262  [(parallel [(set (match_dup 0)
12263	(plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31))
12264		 (match_dup 2)))
12265   (clobber (match_dup 3))])
12266   (set (match_dup 4)
12267	(compare:CC (match_dup 0)
12268		    (const_int 0)))]
12269  "")
12270
12271(define_insn "*plus_ne0di_compare"
12272  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12273	(compare:CC
12274	 (plus:DI (lshiftrt:DI
12275		   (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")))
12276		   (const_int 63))
12277		  (match_operand:DI 2 "gpc_reg_operand" "r,r"))
12278	 (const_int 0)))
12279   (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
12280	(plus:DI (lshiftrt:DI (neg:DI (abs:DI (match_dup 1))) (const_int 63))
12281		 (match_dup 2)))
12282   (clobber (match_scratch:DI 3 "=&r,&r"))]
12283  "TARGET_64BIT"
12284  "@
12285   addic %3,%1,-1\;addze. %0,%2
12286   #"
12287  [(set_attr "type" "compare")
12288   (set_attr "length" "8,12")])
12289
12290(define_split
12291  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12292	(compare:CC
12293	 (plus:DI (lshiftrt:DI
12294		   (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "")))
12295		   (const_int 63))
12296		  (match_operand:DI 2 "gpc_reg_operand" ""))
12297	 (const_int 0)))
12298   (set (match_operand:DI 0 "gpc_reg_operand" "")
12299	(plus:DI (lshiftrt:DI (neg:DI (abs:DI (match_dup 1))) (const_int 63))
12300		 (match_dup 2)))
12301   (clobber (match_scratch:DI 3 ""))]
12302  "TARGET_64BIT && reload_completed"
12303  [(parallel [(set (match_dup 0)
12304	(plus:DI (lshiftrt:DI (neg:DI (abs:DI (match_dup 1))) (const_int 63))
12305		 (match_dup 2)))
12306   (clobber (match_dup 3))])
12307   (set (match_dup 4)
12308	(compare:CC (match_dup 0)
12309		    (const_int 0)))]
12310  "")
12311
12312(define_insn ""
12313  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
12314	(le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12315	       (match_operand:SI 2 "reg_or_short_operand" "r,O")))
12316   (clobber (match_scratch:SI 3 "=r,X"))]
12317  "TARGET_POWER"
12318  "@
12319   doz %3,%2,%1\;{sfi|subfic} %0,%3,0\;{ae|adde} %0,%0,%3
12320   {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{sri|srwi} %0,%0,31"
12321  [(set_attr "length" "12")])
12322
12323(define_insn ""
12324  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
12325	(compare:CC
12326	 (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
12327		(match_operand:SI 2 "reg_or_short_operand" "r,O,r,O"))
12328	 (const_int 0)))
12329   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
12330	(le:SI (match_dup 1) (match_dup 2)))
12331   (clobber (match_scratch:SI 3 "=r,X,r,X"))]
12332  "TARGET_POWER"
12333  "@
12334   doz %3,%2,%1\;{sfi|subfic} %0,%3,0\;{ae.|adde.} %0,%0,%3
12335   {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{sri.|srwi.} %0,%0,31
12336   #
12337   #"
12338  [(set_attr "type" "compare,delayed_compare,compare,delayed_compare")
12339   (set_attr "length" "12,12,16,16")])
12340
12341(define_split
12342  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12343	(compare:CC
12344	 (le:SI (match_operand:SI 1 "gpc_reg_operand" "")
12345		(match_operand:SI 2 "reg_or_short_operand" ""))
12346	 (const_int 0)))
12347   (set (match_operand:SI 0 "gpc_reg_operand" "")
12348	(le:SI (match_dup 1) (match_dup 2)))
12349   (clobber (match_scratch:SI 3 ""))]
12350  "TARGET_POWER && reload_completed"
12351  [(parallel [(set (match_dup 0)
12352	(le:SI (match_dup 1) (match_dup 2)))
12353   (clobber (match_dup 3))])
12354   (set (match_dup 4)
12355	(compare:CC (match_dup 0)
12356		    (const_int 0)))]
12357  "")
12358
12359(define_insn ""
12360  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
12361	(plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12362			(match_operand:SI 2 "reg_or_short_operand" "r,O"))
12363		 (match_operand:SI 3 "gpc_reg_operand" "r,r")))]
12364  "TARGET_POWER"
12365  "@
12366   doz %0,%2,%1\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
12367   {srai|srawi} %0,%1,31\;{sf|subfc} %0,%1,%0\;{aze|addze} %0,%3"
12368  [(set_attr "length" "12")])
12369
12370(define_insn ""
12371  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
12372	(compare:CC
12373	 (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
12374			 (match_operand:SI 2 "reg_or_short_operand" "r,O,r,O"))
12375		  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
12376	 (const_int 0)))
12377   (clobber (match_scratch:SI 4 "=&r,&r,&r,&r"))]
12378  "TARGET_POWER"
12379  "@
12380   doz %4,%2,%1\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
12381   {srai|srawi} %4,%1,31\;{sf|subfc} %4,%1,%4\;{aze.|addze.} %4,%3
12382   #
12383   #"
12384  [(set_attr "type" "compare")
12385   (set_attr "length" "12,12,16,16")])
12386
12387(define_split
12388  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12389	(compare:CC
12390	 (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "")
12391			 (match_operand:SI 2 "reg_or_short_operand" ""))
12392		  (match_operand:SI 3 "gpc_reg_operand" ""))
12393	 (const_int 0)))
12394   (clobber (match_scratch:SI 4 ""))]
12395  "TARGET_POWER && reload_completed"
12396  [(set (match_dup 4)
12397	(plus:SI (le:SI (match_dup 1) (match_dup 2))
12398		 (match_dup 3)))
12399   (set (match_dup 0)
12400	(compare:CC (match_dup 4)
12401		    (const_int 0)))]
12402  "")
12403
12404(define_insn ""
12405  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
12406	(compare:CC
12407	 (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
12408			 (match_operand:SI 2 "reg_or_short_operand" "r,O,r,O"))
12409		  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
12410	 (const_int 0)))
12411   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r")
12412	(plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12413  "TARGET_POWER"
12414  "@
12415   doz %0,%2,%1\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12416   {srai|srawi} %0,%1,31\;{sf|subfc} %0,%1,%0\;{aze.|addze.} %0,%3
12417   #
12418   #"
12419  [(set_attr "type" "compare")
12420   (set_attr "length" "12,12,16,16")])
12421
12422(define_split
12423  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12424	(compare:CC
12425	 (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "")
12426			 (match_operand:SI 2 "reg_or_short_operand" ""))
12427		  (match_operand:SI 3 "gpc_reg_operand" ""))
12428	 (const_int 0)))
12429   (set (match_operand:SI 0 "gpc_reg_operand" "")
12430	(plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12431  "TARGET_POWER && reload_completed"
12432  [(set (match_dup 0)
12433	(plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
12434   (set (match_dup 4)
12435	(compare:CC (match_dup 0)
12436		    (const_int 0)))]
12437  "")
12438
12439(define_insn ""
12440  [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
12441	(neg:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12442		       (match_operand:SI 2 "reg_or_short_operand" "r,O"))))]
12443  "TARGET_POWER"
12444  "@
12445   doz %0,%2,%1\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
12446   {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{srai|srawi} %0,%0,31"
12447  [(set_attr "length" "12")])
12448
12449(define_insn "*leu<mode>"
12450  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
12451	(leu:P (match_operand:P 1 "gpc_reg_operand" "r")
12452	       (match_operand:P 2 "reg_or_short_operand" "rI")))]
12453  ""
12454  "{sf%I2|subf%I2c} %0,%1,%2\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0"
12455  [(set_attr "type" "three")
12456   (set_attr "length" "12")])
12457
12458(define_insn "*leu<mode>_compare"
12459  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
12460	(compare:CC
12461	 (leu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
12462		(match_operand:P 2 "reg_or_short_operand" "rI,rI"))
12463	 (const_int 0)))
12464   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
12465	(leu:P (match_dup 1) (match_dup 2)))]
12466  ""
12467  "@
12468   {sf%I2|subf%I2c} %0,%1,%2\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0
12469   #"
12470  [(set_attr "type" "compare")
12471   (set_attr "length" "12,16")])
12472
12473(define_split
12474  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
12475	(compare:CC
12476	 (leu:P (match_operand:P 1 "gpc_reg_operand" "")
12477		(match_operand:P 2 "reg_or_short_operand" ""))
12478	 (const_int 0)))
12479   (set (match_operand:P 0 "gpc_reg_operand" "")
12480	(leu:P (match_dup 1) (match_dup 2)))]
12481  "reload_completed"
12482  [(set (match_dup 0)
12483	(leu:P (match_dup 1) (match_dup 2)))
12484   (set (match_dup 3)
12485	(compare:CC (match_dup 0)
12486		    (const_int 0)))]
12487  "")
12488
12489(define_insn "*plus_leu<mode>"
12490  [(set (match_operand:P 0 "gpc_reg_operand" "=&r")
12491	(plus:P (leu:P (match_operand:P 1 "gpc_reg_operand" "r")
12492		       (match_operand:P 2 "reg_or_short_operand" "rI"))
12493		(match_operand:P 3 "gpc_reg_operand" "r")))]
12494  ""
12495  "{sf%I2|subf%I2c} %0,%1,%2\;{aze|addze} %0,%3"
12496  [(set_attr "type" "two")
12497   (set_attr "length" "8")])
12498
12499(define_insn ""
12500  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12501	(compare:CC
12502	 (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12503			  (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12504		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12505	 (const_int 0)))
12506   (clobber (match_scratch:SI 4 "=&r,&r"))]
12507  "TARGET_32BIT"
12508  "@
12509   {sf%I2|subf%I2c} %4,%1,%2\;{aze.|addze.} %4,%3
12510   #"
12511  [(set_attr "type" "compare")
12512   (set_attr "length" "8,12")])
12513
12514(define_split
12515  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12516	(compare:CC
12517	 (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "")
12518			  (match_operand:SI 2 "reg_or_short_operand" ""))
12519		  (match_operand:SI 3 "gpc_reg_operand" ""))
12520	 (const_int 0)))
12521   (clobber (match_scratch:SI 4 ""))]
12522  "TARGET_32BIT && reload_completed"
12523  [(set (match_dup 4)
12524	(plus:SI (leu:SI (match_dup 1) (match_dup 2))
12525		  (match_dup 3)))
12526   (set (match_dup 0)
12527	(compare:CC (match_dup 4)
12528		    (const_int 0)))]
12529  "")
12530
12531(define_insn ""
12532  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12533	(compare:CC
12534	 (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12535			  (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12536		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12537	 (const_int 0)))
12538   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
12539	(plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12540  "TARGET_32BIT"
12541  "@
12542   {sf%I2|subf%I2c} %0,%1,%2\;{aze.|addze.} %0,%3
12543   #"
12544  [(set_attr "type" "compare")
12545   (set_attr "length" "8,12")])
12546
12547(define_split
12548  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12549	(compare:CC
12550	 (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "")
12551			  (match_operand:SI 2 "reg_or_short_operand" ""))
12552		  (match_operand:SI 3 "gpc_reg_operand" ""))
12553	 (const_int 0)))
12554   (set (match_operand:SI 0 "gpc_reg_operand" "")
12555	(plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12556  "TARGET_32BIT && reload_completed"
12557  [(set (match_dup 0)
12558	(plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
12559   (set (match_dup 4)
12560	(compare:CC (match_dup 0)
12561		    (const_int 0)))]
12562  "")
12563
12564(define_insn "*neg_leu<mode>"
12565  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
12566	(neg:P (leu:P (match_operand:P 1 "gpc_reg_operand" "r")
12567		      (match_operand:P 2 "reg_or_short_operand" "rI"))))]
12568  ""
12569  "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;nand %0,%0,%0"
12570   [(set_attr "type" "three")
12571    (set_attr "length" "12")])
12572
12573(define_insn "*and_neg_leu<mode>"
12574  [(set (match_operand:P 0 "gpc_reg_operand" "=&r")
12575	(and:P (neg:P
12576		 (leu:P (match_operand:P 1 "gpc_reg_operand" "r")
12577			(match_operand:P 2 "reg_or_short_operand" "rI")))
12578		(match_operand:P 3 "gpc_reg_operand" "r")))]
12579  ""
12580  "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;andc %0,%3,%0"
12581  [(set_attr "type" "three")
12582   (set_attr "length" "12")])
12583
12584(define_insn ""
12585  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12586	(compare:CC
12587	 (and:SI (neg:SI
12588		  (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12589			  (match_operand:SI 2 "reg_or_short_operand" "rI,rI")))
12590		 (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12591	 (const_int 0)))
12592   (clobber (match_scratch:SI 4 "=&r,&r"))]
12593  "TARGET_32BIT"
12594  "@
12595   {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4
12596   #"
12597  [(set_attr "type" "compare")
12598   (set_attr "length" "12,16")])
12599
12600(define_split
12601  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12602	(compare:CC
12603	 (and:SI (neg:SI
12604		  (leu:SI (match_operand:SI 1 "gpc_reg_operand" "")
12605			  (match_operand:SI 2 "reg_or_short_operand" "")))
12606		 (match_operand:SI 3 "gpc_reg_operand" ""))
12607	 (const_int 0)))
12608   (clobber (match_scratch:SI 4 ""))]
12609  "TARGET_32BIT && reload_completed"
12610  [(set (match_dup 4)
12611	(and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2)))
12612		(match_dup 3)))
12613   (set (match_dup 0)
12614	(compare:CC (match_dup 4)
12615		    (const_int 0)))]
12616  "")
12617
12618(define_insn ""
12619  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12620	(compare:CC
12621	 (and:SI (neg:SI
12622		  (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12623			  (match_operand:SI 2 "reg_or_short_operand" "rI,rI")))
12624		 (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12625	 (const_int 0)))
12626   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
12627	(and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))]
12628  "TARGET_32BIT"
12629  "@
12630   {sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;andc. %0,%3,%0
12631   #"
12632  [(set_attr "type" "compare")
12633   (set_attr "length" "12,16")])
12634
12635(define_split
12636  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12637	(compare:CC
12638	 (and:SI (neg:SI
12639		  (leu:SI (match_operand:SI 1 "gpc_reg_operand" "")
12640			  (match_operand:SI 2 "reg_or_short_operand" "")))
12641		 (match_operand:SI 3 "gpc_reg_operand" ""))
12642	 (const_int 0)))
12643   (set (match_operand:SI 0 "gpc_reg_operand" "")
12644	(and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))]
12645  "TARGET_32BIT && reload_completed"
12646  [(set (match_dup 0)
12647	(and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2)))
12648		(match_dup 3)))
12649   (set (match_dup 4)
12650	(compare:CC (match_dup 0)
12651		    (const_int 0)))]
12652  "")
12653
12654(define_insn ""
12655  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
12656	(lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12657	       (match_operand:SI 2 "reg_or_short_operand" "rI")))]
12658  "TARGET_POWER"
12659  "doz%I2 %0,%1,%2\;nabs %0,%0\;{sri|srwi} %0,%0,31"
12660   [(set_attr "length" "12")])
12661
12662(define_insn ""
12663  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
12664	(compare:CC
12665	 (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12666		(match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12667	 (const_int 0)))
12668   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
12669	(lt:SI (match_dup 1) (match_dup 2)))]
12670  "TARGET_POWER"
12671  "@
12672   doz%I2 %0,%1,%2\;nabs %0,%0\;{sri.|srwi.} %0,%0,31
12673   #"
12674  [(set_attr "type" "delayed_compare")
12675   (set_attr "length" "12,16")])
12676
12677(define_split
12678  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
12679	(compare:CC
12680	 (lt:SI (match_operand:SI 1 "gpc_reg_operand" "")
12681		(match_operand:SI 2 "reg_or_short_operand" ""))
12682	 (const_int 0)))
12683   (set (match_operand:SI 0 "gpc_reg_operand" "")
12684	(lt:SI (match_dup 1) (match_dup 2)))]
12685  "TARGET_POWER && reload_completed"
12686  [(set (match_dup 0)
12687	(lt:SI (match_dup 1) (match_dup 2)))
12688   (set (match_dup 3)
12689	(compare:CC (match_dup 0)
12690		    (const_int 0)))]
12691  "")
12692
12693(define_insn ""
12694  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
12695	(plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12696			(match_operand:SI 2 "reg_or_short_operand" "rI"))
12697		 (match_operand:SI 3 "gpc_reg_operand" "r")))]
12698  "TARGET_POWER"
12699  "doz%I2 %0,%1,%2\;{ai|addic} %0,%0,-1\;{aze|addze} %0,%3"
12700  [(set_attr "length" "12")])
12701
12702(define_insn ""
12703  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12704	(compare:CC
12705	 (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12706			 (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12707		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12708	 (const_int 0)))
12709   (clobber (match_scratch:SI 4 "=&r,&r"))]
12710  "TARGET_POWER"
12711  "@
12712   doz%I2 %4,%1,%2\;{ai|addic} %4,%4,-1\;{aze.|addze.} %4,%3
12713   #"
12714  [(set_attr "type" "compare")
12715   (set_attr "length" "12,16")])
12716
12717(define_split
12718  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12719	(compare:CC
12720	 (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "")
12721			 (match_operand:SI 2 "reg_or_short_operand" ""))
12722		  (match_operand:SI 3 "gpc_reg_operand" ""))
12723	 (const_int 0)))
12724   (clobber (match_scratch:SI 4 ""))]
12725  "TARGET_POWER && reload_completed"
12726  [(set (match_dup 4)
12727	(plus:SI (lt:SI (match_dup 1) (match_dup 2))
12728		 (match_dup 3)))
12729   (set (match_dup 0)
12730	(compare:CC (match_dup 4)
12731		    (const_int 0)))]
12732  "")
12733
12734(define_insn ""
12735  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12736	(compare:CC
12737	 (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12738			 (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12739		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12740	 (const_int 0)))
12741   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
12742	(plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12743  "TARGET_POWER"
12744  "@
12745   doz%I2 %0,%1,%2\;{ai|addic} %0,%0,-1\;{aze.|addze.} %0,%3
12746   #"
12747  [(set_attr "type" "compare")
12748   (set_attr "length" "12,16")])
12749
12750(define_split
12751  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12752	(compare:CC
12753	 (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "")
12754			 (match_operand:SI 2 "reg_or_short_operand" ""))
12755		  (match_operand:SI 3 "gpc_reg_operand" ""))
12756	 (const_int 0)))
12757   (set (match_operand:SI 0 "gpc_reg_operand" "")
12758	(plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12759  "TARGET_POWER && reload_completed"
12760  [(set (match_dup 0)
12761	(plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
12762   (set (match_dup 4)
12763	(compare:CC (match_dup 0)
12764		    (const_int 0)))]
12765  "")
12766
12767(define_insn ""
12768  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
12769	(neg:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12770		       (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
12771  "TARGET_POWER"
12772  "doz%I2 %0,%1,%2\;nabs %0,%0\;{srai|srawi} %0,%0,31"
12773  [(set_attr "length" "12")])
12774
12775(define_insn_and_split "*ltu<mode>"
12776  [(set (match_operand:P 0 "gpc_reg_operand" "=r,r")
12777	(ltu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
12778	       (match_operand:P 2 "reg_or_neg_short_operand" "r,P")))]
12779  ""
12780  "#"
12781  ""
12782  [(set (match_dup 0) (neg:P (ltu:P (match_dup 1) (match_dup 2))))
12783   (set (match_dup 0) (neg:P (match_dup 0)))]
12784  "")
12785
12786(define_insn_and_split "*ltu<mode>_compare"
12787  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
12788	(compare:CC
12789	 (ltu:P (match_operand:P 1 "gpc_reg_operand" "r,r,r,r")
12790		(match_operand:P 2 "reg_or_neg_short_operand" "r,P,r,P"))
12791	 (const_int 0)))
12792   (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r,r")
12793	(ltu:P (match_dup 1) (match_dup 2)))]
12794  ""
12795  "#"
12796  ""
12797  [(set (match_dup 0) (neg:P (ltu:P (match_dup 1) (match_dup 2))))
12798   (parallel [(set (match_dup 3)
12799		   (compare:CC (neg:P (match_dup 0)) (const_int 0)))
12800	      (set (match_dup 0) (neg:P (match_dup 0)))])]
12801  "")
12802
12803(define_insn_and_split "*plus_ltu<mode>"
12804  [(set (match_operand:P 0 "gpc_reg_operand" "=&r,r")
12805	(plus:P (ltu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
12806		       (match_operand:P 2 "reg_or_neg_short_operand" "r,P"))
12807		(match_operand:P 3 "reg_or_short_operand" "rI,rI")))]
12808  ""
12809  "#"
12810  "&& !reg_overlap_mentioned_p (operands[0], operands[3])"
12811  [(set (match_dup 0) (neg:P (ltu:P (match_dup 1) (match_dup 2))))
12812   (set (match_dup 0) (minus:P (match_dup 3) (match_dup 0)))]
12813  "")
12814
12815(define_insn_and_split "*plus_ltu<mode>_compare"
12816  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
12817	(compare:CC
12818	 (plus:P (ltu:P (match_operand:P 1 "gpc_reg_operand" "r,r,r,r")
12819			(match_operand:P 2 "reg_or_neg_short_operand" "r,P,r,P"))
12820		 (match_operand:P 3 "gpc_reg_operand" "r,r,r,r"))
12821	 (const_int 0)))
12822   (set (match_operand:P 0 "gpc_reg_operand" "=&r,&r,&r,&r")
12823	(plus:P (ltu:P (match_dup 1) (match_dup 2)) (match_dup 3)))]
12824  ""
12825  "#"
12826  "&& !reg_overlap_mentioned_p (operands[0], operands[3])"
12827  [(set (match_dup 0) (neg:P (ltu:P (match_dup 1) (match_dup 2))))
12828   (parallel [(set (match_dup 4)
12829		   (compare:CC (minus:P (match_dup 3) (match_dup 0))
12830			       (const_int 0)))
12831	      (set (match_dup 0) (minus:P (match_dup 3) (match_dup 0)))])]
12832  "")
12833
12834(define_insn "*neg_ltu<mode>"
12835  [(set (match_operand:P 0 "gpc_reg_operand" "=r,r")
12836	(neg:P (ltu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
12837		      (match_operand:P 2 "reg_or_neg_short_operand" "r,P"))))]
12838  ""
12839  "@
12840   {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0
12841   {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0"
12842  [(set_attr "type" "two")
12843   (set_attr "length" "8")])
12844
12845(define_insn ""
12846  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
12847	(ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12848	       (match_operand:SI 2 "reg_or_short_operand" "rI")))
12849   (clobber (match_scratch:SI 3 "=r"))]
12850  "TARGET_POWER"
12851  "doz%I2 %3,%1,%2\;{sfi|subfic} %0,%3,0\;{ae|adde} %0,%0,%3"
12852   [(set_attr "length" "12")])
12853
12854(define_insn ""
12855  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12856	(compare:CC
12857	 (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12858		(match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12859	 (const_int 0)))
12860   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
12861	(ge:SI (match_dup 1) (match_dup 2)))
12862   (clobber (match_scratch:SI 3 "=r,r"))]
12863  "TARGET_POWER"
12864  "@
12865   doz%I2 %3,%1,%2\;{sfi|subfic} %0,%3,0\;{ae.|adde.} %0,%0,%3
12866   #"
12867  [(set_attr "type" "compare")
12868   (set_attr "length" "12,16")])
12869
12870(define_split
12871  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12872	(compare:CC
12873	 (ge:SI (match_operand:SI 1 "gpc_reg_operand" "")
12874		(match_operand:SI 2 "reg_or_short_operand" ""))
12875	 (const_int 0)))
12876   (set (match_operand:SI 0 "gpc_reg_operand" "")
12877	(ge:SI (match_dup 1) (match_dup 2)))
12878   (clobber (match_scratch:SI 3 ""))]
12879  "TARGET_POWER && reload_completed"
12880  [(parallel [(set (match_dup 0)
12881		   (ge:SI (match_dup 1) (match_dup 2)))
12882	      (clobber (match_dup 3))])
12883   (set (match_dup 4)
12884	(compare:CC (match_dup 0)
12885		    (const_int 0)))]
12886  "")
12887
12888(define_insn ""
12889  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
12890	(plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12891			(match_operand:SI 2 "reg_or_short_operand" "rI"))
12892		 (match_operand:SI 3 "gpc_reg_operand" "r")))]
12893  "TARGET_POWER"
12894  "doz%I2 %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3"
12895  [(set_attr "length" "12")])
12896
12897(define_insn ""
12898  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
12899	(compare:CC
12900	 (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12901			 (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12902		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12903	 (const_int 0)))
12904   (clobber (match_scratch:SI 4 "=&r,&r"))]
12905  "TARGET_POWER"
12906  "@
12907   doz%I2 %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
12908   #"
12909  [(set_attr "type" "compare")
12910   (set_attr "length" "12,16")])
12911
12912(define_split
12913  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
12914	(compare:CC
12915	 (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "")
12916			 (match_operand:SI 2 "reg_or_short_operand" ""))
12917		  (match_operand:SI 3 "gpc_reg_operand" ""))
12918	 (const_int 0)))
12919   (clobber (match_scratch:SI 4 ""))]
12920  "TARGET_POWER && reload_completed"
12921  [(set (match_dup 4)
12922	(plus:SI (ge:SI (match_dup 1) (match_dup 2))
12923		 (match_dup 3)))
12924   (set (match_dup 0)
12925	(compare:CC (match_dup 4)
12926		    (const_int 0)))]
12927  "")
12928
12929(define_insn ""
12930  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
12931	(compare:CC
12932	 (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
12933			 (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
12934		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
12935	 (const_int 0)))
12936   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
12937	(plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12938  "TARGET_POWER"
12939  "@
12940   doz%I2 %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
12941   #"
12942  [(set_attr "type" "compare")
12943   (set_attr "length" "12,16")])
12944
12945(define_split
12946  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
12947	(compare:CC
12948	 (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "")
12949			 (match_operand:SI 2 "reg_or_short_operand" ""))
12950		  (match_operand:SI 3 "gpc_reg_operand" ""))
12951	 (const_int 0)))
12952   (set (match_operand:SI 0 "gpc_reg_operand" "")
12953	(plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
12954  "TARGET_POWER && reload_completed"
12955  [(set (match_dup 0)
12956	(plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
12957   (set (match_dup 4)
12958	(compare:CC (match_dup 0)
12959		    (const_int 0)))]
12960  "")
12961
12962(define_insn ""
12963  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
12964	(neg:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
12965		       (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
12966  "TARGET_POWER"
12967  "doz%I2 %0,%1,%2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0"
12968  [(set_attr "length" "12")])
12969
12970(define_insn "*geu<mode>"
12971  [(set (match_operand:P 0 "gpc_reg_operand" "=r,r")
12972	(geu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
12973	       (match_operand:P 2 "reg_or_neg_short_operand" "r,P")))]
12974  ""
12975  "@
12976   {sf|subfc} %0,%2,%1\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0
12977   {ai|addic} %0,%1,%n2\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0"
12978  [(set_attr "type" "three")
12979   (set_attr "length" "12")])
12980
12981(define_insn "*geu<mode>_compare"
12982  [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y")
12983	(compare:CC
12984	 (geu:P (match_operand:P 1 "gpc_reg_operand" "r,r,r,r")
12985		(match_operand:P 2 "reg_or_neg_short_operand" "r,P,r,P"))
12986	 (const_int 0)))
12987   (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r,r")
12988	(geu:P (match_dup 1) (match_dup 2)))]
12989  ""
12990  "@
12991   {sf|subfc} %0,%2,%1\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0
12992   {ai|addic} %0,%1,%n2\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0
12993   #
12994   #"
12995  [(set_attr "type" "compare")
12996   (set_attr "length" "12,12,16,16")])
12997
12998(define_split
12999  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
13000	(compare:CC
13001	 (geu:P (match_operand:P 1 "gpc_reg_operand" "")
13002		(match_operand:P 2 "reg_or_neg_short_operand" ""))
13003	 (const_int 0)))
13004   (set (match_operand:P 0 "gpc_reg_operand" "")
13005	(geu:P (match_dup 1) (match_dup 2)))]
13006  "reload_completed"
13007  [(set (match_dup 0)
13008	(geu:P (match_dup 1) (match_dup 2)))
13009   (set (match_dup 3)
13010	(compare:CC (match_dup 0)
13011		    (const_int 0)))]
13012  "")
13013
13014(define_insn "*plus_geu<mode>"
13015  [(set (match_operand:P 0 "gpc_reg_operand" "=&r,&r")
13016	(plus:P (geu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
13017		       (match_operand:P 2 "reg_or_neg_short_operand" "r,P"))
13018		(match_operand:P 3 "gpc_reg_operand" "r,r")))]
13019  ""
13020  "@
13021   {sf|subfc} %0,%2,%1\;{aze|addze} %0,%3
13022   {ai|addic} %0,%1,%n2\;{aze|addze} %0,%3"
13023  [(set_attr "type" "two")
13024   (set_attr "length" "8")])
13025
13026(define_insn ""
13027  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
13028	(compare:CC
13029	 (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
13030			  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P,r,P"))
13031		  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
13032	 (const_int 0)))
13033   (clobber (match_scratch:SI 4 "=&r,&r,&r,&r"))]
13034  "TARGET_32BIT"
13035  "@
13036   {sf|subfc} %4,%2,%1\;{aze.|addze.} %4,%3
13037   {ai|addic} %4,%1,%n2\;{aze.|addze.} %4,%3
13038   #
13039   #"
13040  [(set_attr "type" "compare")
13041   (set_attr "length" "8,8,12,12")])
13042
13043(define_split
13044  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
13045	(compare:CC
13046	 (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "")
13047			  (match_operand:SI 2 "reg_or_neg_short_operand" ""))
13048		  (match_operand:SI 3 "gpc_reg_operand" ""))
13049	 (const_int 0)))
13050   (clobber (match_scratch:SI 4 ""))]
13051  "TARGET_32BIT && reload_completed"
13052  [(set (match_dup 4)
13053	(plus:SI (geu:SI (match_dup 1) (match_dup 2))
13054		  (match_dup 3)))
13055   (set (match_dup 0)
13056	(compare:CC (match_dup 4)
13057		    (const_int 0)))]
13058  "")
13059
13060(define_insn ""
13061  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
13062	(compare:CC
13063	 (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
13064			  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P,r,P"))
13065		  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
13066	 (const_int 0)))
13067   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r")
13068	(plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
13069  "TARGET_32BIT"
13070  "@
13071   {sf|subfc} %0,%2,%1\;{aze.|addze.} %0,%3
13072   {ai|addic} %0,%1,%n2\;{aze.|addze.} %0,%3
13073   #
13074   #"
13075  [(set_attr "type" "compare")
13076   (set_attr "length" "8,8,12,12")])
13077
13078(define_split
13079  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
13080	(compare:CC
13081	 (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "")
13082			  (match_operand:SI 2 "reg_or_neg_short_operand" ""))
13083		  (match_operand:SI 3 "gpc_reg_operand" ""))
13084	 (const_int 0)))
13085   (set (match_operand:SI 0 "gpc_reg_operand" "")
13086	(plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
13087  "TARGET_32BIT && reload_completed"
13088  [(set (match_dup 0)
13089	(plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
13090   (set (match_dup 4)
13091	(compare:CC (match_dup 0)
13092		    (const_int 0)))]
13093  "")
13094
13095(define_insn "*neg_geu<mode>"
13096  [(set (match_operand:P 0 "gpc_reg_operand" "=r,r")
13097	(neg:P (geu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
13098		      (match_operand:P 2 "reg_or_short_operand" "r,I"))))]
13099  ""
13100  "@
13101   {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;nand %0,%0,%0
13102   {sfi|subfic} %0,%1,-1\;{a%I2|add%I2c} %0,%0,%2\;{sfe|subfe} %0,%0,%0"
13103  [(set_attr "type" "three")
13104   (set_attr "length" "12")])
13105
13106(define_insn "*and_neg_geu<mode>"
13107  [(set (match_operand:P 0 "gpc_reg_operand" "=&r,&r")
13108	(and:P (neg:P
13109		 (geu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
13110			(match_operand:P 2 "reg_or_neg_short_operand" "r,P")))
13111		(match_operand:P 3 "gpc_reg_operand" "r,r")))]
13112  ""
13113  "@
13114   {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;andc %0,%3,%0
13115   {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0\;andc %0,%3,%0"
13116  [(set_attr "type" "three")
13117   (set_attr "length" "12")])
13118
13119(define_insn ""
13120  [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y")
13121	(compare:CC
13122	 (and:SI (neg:SI
13123		  (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
13124			  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P,r,P")))
13125		 (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
13126	 (const_int 0)))
13127   (clobber (match_scratch:SI 4 "=&r,&r,&r,&r"))]
13128  "TARGET_32BIT"
13129  "@
13130   {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4
13131   {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4
13132   #
13133   #"
13134  [(set_attr "type" "compare")
13135   (set_attr "length" "12,12,16,16")])
13136
13137(define_split
13138  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
13139	(compare:CC
13140	 (and:SI (neg:SI
13141		  (geu:SI (match_operand:SI 1 "gpc_reg_operand" "")
13142			  (match_operand:SI 2 "reg_or_neg_short_operand" "")))
13143		 (match_operand:SI 3 "gpc_reg_operand" ""))
13144	 (const_int 0)))
13145   (clobber (match_scratch:SI 4 ""))]
13146  "TARGET_32BIT && reload_completed"
13147  [(set (match_dup 4)
13148	(and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2)))
13149		(match_dup 3)))
13150   (set (match_dup 0)
13151	(compare:CC (match_dup 4)
13152		    (const_int 0)))]
13153  "")
13154
13155(define_insn ""
13156  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
13157	(compare:CC
13158	 (and:SI (neg:SI
13159		  (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
13160			  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P,r,P")))
13161		 (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r"))
13162	 (const_int 0)))
13163   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r")
13164	(and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))]
13165  "TARGET_32BIT"
13166  "@
13167   {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;andc. %0,%3,%0
13168   {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0\;andc. %0,%3,%0
13169   #
13170   #"
13171  [(set_attr "type" "compare")
13172   (set_attr "length" "12,12,16,16")])
13173
13174(define_split
13175  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
13176	(compare:CC
13177	 (and:SI (neg:SI
13178		  (geu:SI (match_operand:SI 1 "gpc_reg_operand" "")
13179			  (match_operand:SI 2 "reg_or_neg_short_operand" "")))
13180		 (match_operand:SI 3 "gpc_reg_operand" ""))
13181	 (const_int 0)))
13182   (set (match_operand:SI 0 "gpc_reg_operand" "")
13183	(and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))]
13184  "TARGET_32BIT && reload_completed"
13185  [(set (match_dup 0)
13186	(and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))
13187   (set (match_dup 4)
13188	(compare:CC (match_dup 0)
13189		    (const_int 0)))]
13190  "")
13191
13192(define_insn ""
13193  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
13194	(gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
13195	       (match_operand:SI 2 "reg_or_short_operand" "r")))]
13196  "TARGET_POWER"
13197  "doz %0,%2,%1\;nabs %0,%0\;{sri|srwi} %0,%0,31"
13198  [(set_attr "length" "12")])
13199
13200(define_insn ""
13201  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
13202	(compare:CC
13203	 (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
13204		(match_operand:SI 2 "reg_or_short_operand" "r,r"))
13205	 (const_int 0)))
13206   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
13207	(gt:SI (match_dup 1) (match_dup 2)))]
13208  "TARGET_POWER"
13209  "@
13210   doz %0,%2,%1\;nabs %0,%0\;{sri.|srwi.} %0,%0,31
13211   #"
13212  [(set_attr "type" "delayed_compare")
13213   (set_attr "length" "12,16")])
13214
13215(define_split
13216  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
13217	(compare:CC
13218	 (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
13219		(match_operand:SI 2 "reg_or_short_operand" ""))
13220	 (const_int 0)))
13221   (set (match_operand:SI 0 "gpc_reg_operand" "")
13222	(gt:SI (match_dup 1) (match_dup 2)))]
13223  "TARGET_POWER && reload_completed"
13224  [(set (match_dup 0)
13225	(gt:SI (match_dup 1) (match_dup 2)))
13226   (set (match_dup 3)
13227	(compare:CC (match_dup 0)
13228		    (const_int 0)))]
13229  "")
13230
13231(define_insn "*plus_gt0<mode>"
13232  [(set (match_operand:P 0 "gpc_reg_operand" "=&r")
13233	(plus:P (gt:P (match_operand:P 1 "gpc_reg_operand" "r")
13234		      (const_int 0))
13235		 (match_operand:P 2 "gpc_reg_operand" "r")))]
13236  ""
13237  "{a|addc} %0,%1,%1\;{sfe|subfe} %0,%1,%0\;{aze|addze} %0,%2"
13238  [(set_attr "type" "three")
13239   (set_attr "length" "12")])
13240
13241(define_insn ""
13242  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
13243	(compare:CC
13244	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
13245			 (const_int 0))
13246		  (match_operand:SI 2 "gpc_reg_operand" "r,r"))
13247	 (const_int 0)))
13248   (clobber (match_scratch:SI 3 "=&r,&r"))]
13249  "TARGET_32BIT"
13250  "@
13251   {a|addc} %3,%1,%1\;{sfe|subfe} %3,%1,%3\;{aze.|addze.} %3,%2
13252   #"
13253  [(set_attr "type" "compare")
13254   (set_attr "length" "12,16")])
13255
13256(define_split
13257  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
13258	(compare:CC
13259	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
13260			 (const_int 0))
13261		  (match_operand:SI 2 "gpc_reg_operand" ""))
13262	 (const_int 0)))
13263   (clobber (match_scratch:SI 3 ""))]
13264  "TARGET_32BIT && reload_completed"
13265  [(set (match_dup 3)
13266	(plus:SI (gt:SI (match_dup 1) (const_int 0))
13267		  (match_dup 2)))
13268   (set (match_dup 0)
13269	(compare:CC (match_dup 3)
13270		    (const_int 0)))]
13271  "")
13272
13273(define_insn ""
13274  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
13275	(compare:CC
13276	 (plus:DI (gt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
13277			 (const_int 0))
13278		  (match_operand:DI 2 "gpc_reg_operand" "r,r"))
13279	 (const_int 0)))
13280   (clobber (match_scratch:DI 3 "=&r,&r"))]
13281  "TARGET_64BIT"
13282  "@
13283   addc %3,%1,%1\;subfe %3,%1,%3\;addze. %3,%2
13284   #"
13285  [(set_attr "type" "compare")
13286   (set_attr "length" "12,16")])
13287
13288(define_split
13289  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
13290	(compare:CC
13291	 (plus:DI (gt:DI (match_operand:DI 1 "gpc_reg_operand" "")
13292			 (const_int 0))
13293		  (match_operand:DI 2 "gpc_reg_operand" ""))
13294	 (const_int 0)))
13295   (clobber (match_scratch:DI 3 ""))]
13296  "TARGET_64BIT && reload_completed"
13297  [(set (match_dup 3)
13298	(plus:DI (gt:DI (match_dup 1) (const_int 0))
13299		 (match_dup 2)))
13300   (set (match_dup 0)
13301	(compare:CC (match_dup 3)
13302		    (const_int 0)))]
13303  "")
13304
13305(define_insn ""
13306  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
13307	(compare:CC
13308	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
13309			 (const_int 0))
13310		  (match_operand:SI 2 "gpc_reg_operand" "r,r"))
13311	 (const_int 0)))
13312   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
13313	(plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2)))]
13314  "TARGET_32BIT"
13315  "@
13316   {a|addc} %0,%1,%1\;{sfe|subfe} %0,%1,%0\;{aze.|addze.} %0,%2
13317   #"
13318  [(set_attr "type" "compare")
13319   (set_attr "length" "12,16")])
13320
13321(define_split
13322  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
13323	(compare:CC
13324	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
13325			 (const_int 0))
13326		  (match_operand:SI 2 "gpc_reg_operand" ""))
13327	 (const_int 0)))
13328   (set (match_operand:SI 0 "gpc_reg_operand" "")
13329	(plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2)))]
13330  "TARGET_32BIT && reload_completed"
13331  [(set (match_dup 0)
13332	(plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2)))
13333   (set (match_dup 3)
13334	(compare:CC (match_dup 0)
13335		    (const_int 0)))]
13336  "")
13337
13338(define_insn ""
13339  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
13340	(compare:CC
13341	 (plus:DI (gt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
13342			 (const_int 0))
13343		  (match_operand:DI 2 "gpc_reg_operand" "r,r"))
13344	 (const_int 0)))
13345   (set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
13346	(plus:DI (gt:DI (match_dup 1) (const_int 0)) (match_dup 2)))]
13347  "TARGET_64BIT"
13348  "@
13349   addc %0,%1,%1\;subfe %0,%1,%0\;addze. %0,%2
13350   #"
13351  [(set_attr "type" "compare")
13352   (set_attr "length" "12,16")])
13353
13354(define_split
13355  [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
13356	(compare:CC
13357	 (plus:DI (gt:DI (match_operand:DI 1 "gpc_reg_operand" "")
13358			 (const_int 0))
13359		  (match_operand:DI 2 "gpc_reg_operand" ""))
13360	 (const_int 0)))
13361   (set (match_operand:DI 0 "gpc_reg_operand" "")
13362	(plus:DI (gt:DI (match_dup 1) (const_int 0)) (match_dup 2)))]
13363  "TARGET_64BIT && reload_completed"
13364  [(set (match_dup 0)
13365	(plus:DI (gt:DI (match_dup 1) (const_int 0)) (match_dup 2)))
13366   (set (match_dup 3)
13367	(compare:CC (match_dup 0)
13368		    (const_int 0)))]
13369  "")
13370
13371(define_insn ""
13372  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
13373	(plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
13374			(match_operand:SI 2 "reg_or_short_operand" "r"))
13375		 (match_operand:SI 3 "gpc_reg_operand" "r")))]
13376  "TARGET_POWER"
13377  "doz %0,%2,%1\;{ai|addic} %0,%0,-1\;{aze|addze} %0,%3"
13378  [(set_attr "length" "12")])
13379
13380(define_insn ""
13381  [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
13382	(compare:CC
13383	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
13384			 (match_operand:SI 2 "reg_or_short_operand" "r,r"))
13385		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
13386	 (const_int 0)))
13387   (clobber (match_scratch:SI 4 "=&r,&r"))]
13388  "TARGET_POWER"
13389  "@
13390   doz %4,%2,%1\;{ai|addic} %4,%4,-1\;{aze.|addze.} %4,%3
13391   #"
13392  [(set_attr "type" "compare")
13393   (set_attr "length" "12,16")])
13394
13395(define_split
13396  [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
13397	(compare:CC
13398	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
13399			 (match_operand:SI 2 "reg_or_short_operand" ""))
13400		  (match_operand:SI 3 "gpc_reg_operand" ""))
13401	 (const_int 0)))
13402   (clobber (match_scratch:SI 4 ""))]
13403  "TARGET_POWER && reload_completed"
13404  [(set (match_dup 4)
13405	(plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
13406   (set (match_dup 0)
13407	(compare:CC (match_dup 4)
13408		    (const_int 0)))]
13409  "")
13410
13411(define_insn ""
13412  [(set (match_operand:CC 4 "cc_reg_operand" "=x,?y")
13413	(compare:CC
13414	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
13415			 (match_operand:SI 2 "reg_or_short_operand" "r,r"))
13416		  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
13417	 (const_int 0)))
13418   (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
13419	(plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
13420  "TARGET_POWER"
13421  "@
13422   doz %0,%2,%1\;{ai|addic} %0,%0,-1\;{aze.|addze.} %0,%3
13423   #"
13424  [(set_attr "type" "compare")
13425   (set_attr "length" "12,16")])
13426
13427(define_split
13428  [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
13429	(compare:CC
13430	 (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
13431			 (match_operand:SI 2 "reg_or_short_operand" ""))
13432		  (match_operand:SI 3 "gpc_reg_operand" ""))
13433	 (const_int 0)))
13434   (set (match_operand:SI 0 "gpc_reg_operand" "")
13435	(plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
13436  "TARGET_POWER && reload_completed"
13437  [(set (match_dup 0)
13438	(plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
13439   (set (match_dup 4)
13440	(compare:CC (match_dup 0)
13441		    (const_int 0)))]
13442  "")
13443
13444(define_insn ""
13445  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
13446	(neg:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
13447		       (match_operand:SI 2 "reg_or_short_operand" "r"))))]
13448  "TARGET_POWER"
13449  "doz %0,%2,%1\;nabs %0,%0\;{srai|srawi} %0,%0,31"
13450  [(set_attr "length" "12")])
13451
13452(define_insn_and_split "*gtu<mode>"
13453  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
13454	(gtu:P (match_operand:P 1 "gpc_reg_operand" "r")
13455	       (match_operand:P 2 "reg_or_short_operand" "rI")))]
13456  ""
13457  "#"
13458  ""
13459  [(set (match_dup 0) (neg:P (gtu:P (match_dup 1) (match_dup 2))))
13460   (set (match_dup 0) (neg:P (match_dup 0)))]
13461  "")
13462
13463(define_insn_and_split "*gtu<mode>_compare"
13464  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
13465	(compare:CC
13466	 (gtu:P (match_operand:P 1 "gpc_reg_operand" "r,r")
13467		 (match_operand:P 2 "reg_or_short_operand" "rI,rI"))
13468	 (const_int 0)))
13469   (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
13470	(gtu:P (match_dup 1) (match_dup 2)))]
13471  ""
13472  "#"
13473  ""
13474  [(set (match_dup 0) (neg:P (gtu:P (match_dup 1) (match_dup 2))))
13475   (parallel [(set (match_dup 3)
13476		   (compare:CC (neg:P (match_dup 0)) (const_int 0)))
13477	      (set (match_dup 0) (neg:P (match_dup 0)))])]
13478  "")
13479
13480(define_insn_and_split "*plus_gtu<mode>"
13481  [(set (match_operand:P 0 "gpc_reg_operand" "=&r")
13482        (plus:P (gtu:P (match_operand:P 1 "gpc_reg_operand" "r")
13483		       (match_operand:P 2 "reg_or_short_operand" "rI"))
13484		(match_operand:P 3 "reg_or_short_operand" "rI")))]
13485  ""
13486  "#"
13487  "&& !reg_overlap_mentioned_p (operands[0], operands[3])"
13488  [(set (match_dup 0) (neg:P (gtu:P (match_dup 1) (match_dup 2))))
13489   (set (match_dup 0) (minus:P (match_dup 3) (match_dup 0)))]
13490  "")
13491
13492(define_insn_and_split "*plus_gtu<mode>_compare"
13493  [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,?y,?y")
13494	(compare:CC
13495	 (plus:P (gtu:P (match_operand:P 1 "gpc_reg_operand" "r,r,r,r")
13496			(match_operand:P 2 "reg_or_short_operand" "I,r,I,r"))
13497		 (match_operand:P 3 "gpc_reg_operand" "r,r,r,r"))
13498	 (const_int 0)))
13499   (set (match_operand:P 0 "gpc_reg_operand" "=&r,&r,&r,&r")
13500	(plus:P (gtu:P (match_dup 1) (match_dup 2)) (match_dup 3)))]
13501  ""
13502  "#"
13503  "&& !reg_overlap_mentioned_p (operands[0], operands[3])"
13504  [(set (match_dup 0) (neg:P (gtu:P (match_dup 1) (match_dup 2))))
13505   (parallel [(set (match_dup 4)
13506		   (compare:CC (minus:P (match_dup 3) (match_dup 0))
13507			       (const_int 0)))
13508	      (set (match_dup 0) (minus:P (match_dup 3) (match_dup 0)))])]
13509  "")
13510
13511(define_insn "*neg_gtu<mode>"
13512  [(set (match_operand:P 0 "gpc_reg_operand" "=r")
13513	(neg:P (gtu:P (match_operand:P 1 "gpc_reg_operand" "r")
13514		      (match_operand:P 2 "reg_or_short_operand" "rI"))))]
13515  ""
13516  "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0"
13517  [(set_attr "type" "two")
13518   (set_attr "length" "8")])
13519
13520
13521;; Define both directions of branch and return.  If we need a reload
13522;; register, we'd rather use CR0 since it is much easier to copy a
13523;; register CC value to there.
13524
13525(define_insn ""
13526  [(set (pc)
13527	(if_then_else (match_operator 1 "branch_comparison_operator"
13528				      [(match_operand 2
13529						      "cc_reg_operand" "y")
13530				       (const_int 0)])
13531		      (label_ref (match_operand 0 "" ""))
13532		      (pc)))]
13533  ""
13534  "*
13535{
13536  return output_cbranch (operands[1], \"%l0\", 0, insn);
13537}"
13538  [(set_attr "type" "branch")])
13539
13540(define_insn ""
13541  [(set (pc)
13542	(if_then_else (match_operator 0 "branch_comparison_operator"
13543				      [(match_operand 1
13544						      "cc_reg_operand" "y")
13545				       (const_int 0)])
13546		      (return)
13547		      (pc)))]
13548  "direct_return ()"
13549  "*
13550{
13551  return output_cbranch (operands[0], NULL, 0, insn);
13552}"
13553  [(set_attr "type" "jmpreg")
13554   (set_attr "length" "4")])
13555
13556(define_insn ""
13557  [(set (pc)
13558	(if_then_else (match_operator 1 "branch_comparison_operator"
13559				      [(match_operand 2
13560						      "cc_reg_operand" "y")
13561				       (const_int 0)])
13562		      (pc)
13563		      (label_ref (match_operand 0 "" ""))))]
13564  ""
13565  "*
13566{
13567  return output_cbranch (operands[1], \"%l0\", 1, insn);
13568}"
13569  [(set_attr "type" "branch")])
13570
13571(define_insn ""
13572  [(set (pc)
13573	(if_then_else (match_operator 0 "branch_comparison_operator"
13574				      [(match_operand 1
13575						      "cc_reg_operand" "y")
13576				       (const_int 0)])
13577		      (pc)
13578		      (return)))]
13579  "direct_return ()"
13580  "*
13581{
13582  return output_cbranch (operands[0], NULL, 1, insn);
13583}"
13584  [(set_attr "type" "jmpreg")
13585   (set_attr "length" "4")])
13586
13587;; Logic on condition register values.
13588
13589; This pattern matches things like
13590; (set (reg:CCEQ 68) (compare:CCEQ (ior:SI (gt:SI (reg:CCFP 68) (const_int 0))
13591;					   (eq:SI (reg:CCFP 68) (const_int 0)))
13592;				   (const_int 1)))
13593; which are generated by the branch logic.
13594; Prefer destructive operations where BT = BB (for crXX BT,BA,BB)
13595
13596(define_insn "*cceq_ior_compare"
13597  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y,?y")
13598        (compare:CCEQ (match_operator:SI 1 "boolean_operator"
13599	                [(match_operator:SI 2
13600				      "branch_positive_comparison_operator"
13601				      [(match_operand 3
13602						      "cc_reg_operand" "y,y")
13603				       (const_int 0)])
13604	                 (match_operator:SI 4
13605				      "branch_positive_comparison_operator"
13606				      [(match_operand 5
13607						      "cc_reg_operand" "0,y")
13608				       (const_int 0)])])
13609		      (const_int 1)))]
13610  ""
13611  "cr%q1 %E0,%j2,%j4"
13612  [(set_attr "type" "cr_logical,delayed_cr")])
13613
13614; Why is the constant -1 here, but 1 in the previous pattern?
13615; Because ~1 has all but the low bit set.
13616(define_insn ""
13617  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y,?y")
13618        (compare:CCEQ (match_operator:SI 1 "boolean_or_operator"
13619	                [(not:SI (match_operator:SI 2
13620				      "branch_positive_comparison_operator"
13621				      [(match_operand 3
13622						      "cc_reg_operand" "y,y")
13623				       (const_int 0)]))
13624	                 (match_operator:SI 4
13625				"branch_positive_comparison_operator"
13626				[(match_operand 5
13627						"cc_reg_operand" "0,y")
13628				 (const_int 0)])])
13629		      (const_int -1)))]
13630  ""
13631  "cr%q1 %E0,%j2,%j4"
13632  [(set_attr "type" "cr_logical,delayed_cr")])
13633
13634(define_insn "*cceq_rev_compare"
13635  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y,?y")
13636	(compare:CCEQ (match_operator:SI 1
13637				      "branch_positive_comparison_operator"
13638				      [(match_operand 2
13639						      "cc_reg_operand" "0,y")
13640				       (const_int 0)])
13641		      (const_int 0)))]
13642  ""
13643  "{crnor %E0,%j1,%j1|crnot %E0,%j1}"
13644  [(set_attr "type" "cr_logical,delayed_cr")])
13645
13646;; If we are comparing the result of two comparisons, this can be done
13647;; using creqv or crxor.
13648
13649(define_insn_and_split ""
13650  [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y")
13651	(compare:CCEQ (match_operator 1 "branch_comparison_operator"
13652			      [(match_operand 2 "cc_reg_operand" "y")
13653			       (const_int 0)])
13654		      (match_operator 3 "branch_comparison_operator"
13655			      [(match_operand 4 "cc_reg_operand" "y")
13656			       (const_int 0)])))]
13657  ""
13658  "#"
13659  ""
13660  [(set (match_dup 0) (compare:CCEQ (xor:SI (match_dup 1) (match_dup 3))
13661				    (match_dup 5)))]
13662  "
13663{
13664  int positive_1, positive_2;
13665
13666  positive_1 = branch_positive_comparison_operator (operands[1],
13667						    GET_MODE (operands[1]));
13668  positive_2 = branch_positive_comparison_operator (operands[3],
13669						    GET_MODE (operands[3]));
13670
13671  if (! positive_1)
13672    operands[1] = gen_rtx_fmt_ee (rs6000_reverse_condition (GET_MODE (operands[2]),
13673							    GET_CODE (operands[1])),
13674				  SImode,
13675				  operands[2], const0_rtx);
13676  else if (GET_MODE (operands[1]) != SImode)
13677    operands[1] = gen_rtx_fmt_ee (GET_CODE (operands[1]), SImode,
13678				  operands[2], const0_rtx);
13679
13680  if (! positive_2)
13681    operands[3] = gen_rtx_fmt_ee (rs6000_reverse_condition (GET_MODE (operands[4]),
13682							    GET_CODE (operands[3])),
13683				  SImode,
13684				  operands[4], const0_rtx);
13685  else if (GET_MODE (operands[3]) != SImode)
13686    operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[3]), SImode,
13687				  operands[4], const0_rtx);
13688
13689  if (positive_1 == positive_2)
13690    {
13691      operands[1] = gen_rtx_NOT (SImode, operands[1]);
13692      operands[5] = constm1_rtx;
13693    }
13694  else
13695    {
13696      operands[5] = const1_rtx;
13697    }
13698}")
13699
13700;; Unconditional branch and return.
13701
13702(define_insn "jump"
13703  [(set (pc)
13704	(label_ref (match_operand 0 "" "")))]
13705  ""
13706  "b %l0"
13707  [(set_attr "type" "branch")])
13708
13709(define_insn "return"
13710  [(return)]
13711  "direct_return ()"
13712  "{br|blr}"
13713  [(set_attr "type" "jmpreg")])
13714
13715(define_expand "indirect_jump"
13716  [(set (pc) (match_operand 0 "register_operand" ""))])
13717
13718(define_insn "*indirect_jump<mode>"
13719  [(set (pc) (match_operand:P 0 "register_operand" "c,*l"))]
13720  ""
13721  "@
13722   bctr
13723   {br|blr}"
13724  [(set_attr "type" "jmpreg")])
13725
13726;; Table jump for switch statements:
13727(define_expand "tablejump"
13728  [(use (match_operand 0 "" ""))
13729   (use (label_ref (match_operand 1 "" "")))]
13730  ""
13731  "
13732{
13733  if (TARGET_32BIT)
13734    emit_jump_insn (gen_tablejumpsi (operands[0], operands[1]));
13735  else
13736    emit_jump_insn (gen_tablejumpdi (operands[0], operands[1]));
13737  DONE;
13738}")
13739
13740(define_expand "tablejumpsi"
13741  [(set (match_dup 3)
13742	(plus:SI (match_operand:SI 0 "" "")
13743		 (match_dup 2)))
13744   (parallel [(set (pc) (match_dup 3))
13745	      (use (label_ref (match_operand 1 "" "")))])]
13746  "TARGET_32BIT"
13747  "
13748{ operands[0] = force_reg (SImode, operands[0]);
13749  operands[2] = force_reg (SImode, gen_rtx_LABEL_REF (SImode, operands[1]));
13750  operands[3] = gen_reg_rtx (SImode);
13751}")
13752
13753(define_expand "tablejumpdi"
13754  [(set (match_dup 4)
13755        (sign_extend:DI (match_operand:SI 0 "lwa_operand" "rm")))
13756   (set (match_dup 3)
13757	(plus:DI (match_dup 4)
13758		 (match_dup 2)))
13759   (parallel [(set (pc) (match_dup 3))
13760	      (use (label_ref (match_operand 1 "" "")))])]
13761  "TARGET_64BIT"
13762  "
13763{ operands[2] = force_reg (DImode, gen_rtx_LABEL_REF (DImode, operands[1]));
13764  operands[3] = gen_reg_rtx (DImode);
13765  operands[4] = gen_reg_rtx (DImode);
13766}")
13767
13768(define_insn "*tablejump<mode>_internal1"
13769  [(set (pc)
13770	(match_operand:P 0 "register_operand" "c,*l"))
13771   (use (label_ref (match_operand 1 "" "")))]
13772  ""
13773  "@
13774   bctr
13775   {br|blr}"
13776  [(set_attr "type" "jmpreg")])
13777
13778(define_insn "nop"
13779  [(const_int 0)]
13780  ""
13781  "{cror 0,0,0|nop}")
13782
13783;; Define the subtract-one-and-jump insns, starting with the template
13784;; so loop.c knows what to generate.
13785
13786(define_expand "doloop_end"
13787  [(use (match_operand 0 "" ""))	; loop pseudo
13788   (use (match_operand 1 "" ""))	; iterations; zero if unknown
13789   (use (match_operand 2 "" ""))	; max iterations
13790   (use (match_operand 3 "" ""))	; loop level
13791   (use (match_operand 4 "" ""))]	; label
13792  ""
13793  "
13794{
13795  /* Only use this on innermost loops.  */
13796  if (INTVAL (operands[3]) > 1)
13797    FAIL;
13798  if (TARGET_64BIT)
13799    {
13800      if (GET_MODE (operands[0]) != DImode)
13801	FAIL;
13802      emit_jump_insn (gen_ctrdi (operands[0], operands[4]));
13803    }
13804  else
13805    {
13806      if (GET_MODE (operands[0]) != SImode)
13807	FAIL;
13808      emit_jump_insn (gen_ctrsi (operands[0], operands[4]));
13809    }
13810  DONE;
13811}")
13812
13813(define_expand "ctr<mode>"
13814  [(parallel [(set (pc)
13815		   (if_then_else (ne (match_operand:P 0 "register_operand" "")
13816				     (const_int 1))
13817				 (label_ref (match_operand 1 "" ""))
13818				 (pc)))
13819	      (set (match_dup 0)
13820		   (plus:P (match_dup 0)
13821			    (const_int -1)))
13822	      (clobber (match_scratch:CC 2 ""))
13823	      (clobber (match_scratch:P 3 ""))])]
13824  ""
13825  "")
13826
13827;; We need to be able to do this for any operand, including MEM, or we
13828;; will cause reload to blow up since we don't allow output reloads on
13829;; JUMP_INSNs.
13830;; For the length attribute to be calculated correctly, the
13831;; label MUST be operand 0.
13832
13833(define_insn "*ctr<mode>_internal1"
13834  [(set (pc)
13835	(if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
13836			  (const_int 1))
13837		      (label_ref (match_operand 0 "" ""))
13838		      (pc)))
13839   (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
13840	(plus:P (match_dup 1)
13841		 (const_int -1)))
13842   (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
13843   (clobber (match_scratch:P 4 "=X,X,&r,r"))]
13844  ""
13845  "*
13846{
13847  if (which_alternative != 0)
13848    return \"#\";
13849  else if (get_attr_length (insn) == 4)
13850    return \"{bdn|bdnz} %l0\";
13851  else
13852    return \"bdz $+8\;b %l0\";
13853}"
13854  [(set_attr "type" "branch")
13855   (set_attr "length" "*,12,16,16")])
13856
13857(define_insn "*ctr<mode>_internal2"
13858  [(set (pc)
13859	(if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
13860			  (const_int 1))
13861		      (pc)
13862		      (label_ref (match_operand 0 "" ""))))
13863   (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
13864	(plus:P (match_dup 1)
13865		 (const_int -1)))
13866   (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
13867   (clobber (match_scratch:P 4 "=X,X,&r,r"))]
13868  ""
13869  "*
13870{
13871  if (which_alternative != 0)
13872    return \"#\";
13873  else if (get_attr_length (insn) == 4)
13874    return \"bdz %l0\";
13875  else
13876    return \"{bdn|bdnz} $+8\;b %l0\";
13877}"
13878  [(set_attr "type" "branch")
13879   (set_attr "length" "*,12,16,16")])
13880
13881;; Similar but use EQ
13882
13883(define_insn "*ctr<mode>_internal5"
13884  [(set (pc)
13885	(if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
13886			  (const_int 1))
13887		      (label_ref (match_operand 0 "" ""))
13888		      (pc)))
13889   (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
13890	(plus:P (match_dup 1)
13891		 (const_int -1)))
13892   (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
13893   (clobber (match_scratch:P 4 "=X,X,&r,r"))]
13894  ""
13895  "*
13896{
13897  if (which_alternative != 0)
13898    return \"#\";
13899  else if (get_attr_length (insn) == 4)
13900    return \"bdz %l0\";
13901  else
13902    return \"{bdn|bdnz} $+8\;b %l0\";
13903}"
13904  [(set_attr "type" "branch")
13905   (set_attr "length" "*,12,16,16")])
13906
13907(define_insn "*ctr<mode>_internal6"
13908  [(set (pc)
13909	(if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
13910			  (const_int 1))
13911		      (pc)
13912		      (label_ref (match_operand 0 "" ""))))
13913   (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
13914	(plus:P (match_dup 1)
13915		 (const_int -1)))
13916   (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
13917   (clobber (match_scratch:P 4 "=X,X,&r,r"))]
13918  ""
13919  "*
13920{
13921  if (which_alternative != 0)
13922    return \"#\";
13923  else if (get_attr_length (insn) == 4)
13924    return \"{bdn|bdnz} %l0\";
13925  else
13926    return \"bdz $+8\;b %l0\";
13927}"
13928  [(set_attr "type" "branch")
13929   (set_attr "length" "*,12,16,16")])
13930
13931;; Now the splitters if we could not allocate the CTR register
13932
13933(define_split
13934  [(set (pc)
13935	(if_then_else (match_operator 2 "comparison_operator"
13936				      [(match_operand:P 1 "gpc_reg_operand" "")
13937				       (const_int 1)])
13938		      (match_operand 5 "" "")
13939		      (match_operand 6 "" "")))
13940   (set (match_operand:P 0 "gpc_reg_operand" "")
13941	(plus:P (match_dup 1) (const_int -1)))
13942   (clobber (match_scratch:CC 3 ""))
13943   (clobber (match_scratch:P 4 ""))]
13944  "reload_completed"
13945  [(parallel [(set (match_dup 3)
13946		   (compare:CC (plus:P (match_dup 1)
13947					(const_int -1))
13948			       (const_int 0)))
13949	      (set (match_dup 0)
13950		   (plus:P (match_dup 1)
13951			    (const_int -1)))])
13952   (set (pc) (if_then_else (match_dup 7)
13953			   (match_dup 5)
13954			   (match_dup 6)))]
13955  "
13956{ operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[2]), VOIDmode,
13957				operands[3], const0_rtx); }")
13958
13959(define_split
13960  [(set (pc)
13961	(if_then_else (match_operator 2 "comparison_operator"
13962				      [(match_operand:P 1 "gpc_reg_operand" "")
13963				       (const_int 1)])
13964		      (match_operand 5 "" "")
13965		      (match_operand 6 "" "")))
13966   (set (match_operand:P 0 "nonimmediate_operand" "")
13967	(plus:P (match_dup 1) (const_int -1)))
13968   (clobber (match_scratch:CC 3 ""))
13969   (clobber (match_scratch:P 4 ""))]
13970  "reload_completed && ! gpc_reg_operand (operands[0], SImode)"
13971  [(parallel [(set (match_dup 3)
13972		   (compare:CC (plus:P (match_dup 1)
13973					(const_int -1))
13974			       (const_int 0)))
13975	      (set (match_dup 4)
13976		   (plus:P (match_dup 1)
13977			    (const_int -1)))])
13978   (set (match_dup 0)
13979	(match_dup 4))
13980   (set (pc) (if_then_else (match_dup 7)
13981			   (match_dup 5)
13982			   (match_dup 6)))]
13983  "
13984{ operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[2]), VOIDmode,
13985				operands[3], const0_rtx); }")
13986
13987(define_insn "trap"
13988  [(trap_if (const_int 1) (const_int 0))]
13989  ""
13990  "{t 31,0,0|trap}")
13991
13992(define_expand "conditional_trap"
13993  [(trap_if (match_operator 0 "trap_comparison_operator"
13994			    [(match_dup 2) (match_dup 3)])
13995	    (match_operand 1 "const_int_operand" ""))]
13996  ""
13997  "if (rs6000_compare_fp_p || operands[1] != const0_rtx) FAIL;
13998   operands[2] = rs6000_compare_op0;
13999   operands[3] = rs6000_compare_op1;")
14000
14001(define_insn ""
14002  [(trap_if (match_operator 0 "trap_comparison_operator"
14003                            [(match_operand:GPR 1 "register_operand" "r")
14004                             (match_operand:GPR 2 "reg_or_short_operand" "rI")])
14005	    (const_int 0))]
14006  ""
14007  "{t|t<wd>}%V0%I2 %1,%2")
14008
14009;; Insns related to generating the function prologue and epilogue.
14010
14011(define_expand "prologue"
14012  [(use (const_int 0))]
14013  "TARGET_SCHED_PROLOG"
14014  "
14015{
14016      rs6000_emit_prologue ();
14017      DONE;
14018}")
14019
14020(define_insn "*movesi_from_cr_one"
14021  [(match_parallel 0 "mfcr_operation"
14022		   [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
14023			 (unspec:SI [(match_operand:CC 2 "cc_reg_operand" "y")
14024				     (match_operand 3 "immediate_operand" "n")]
14025			  UNSPEC_MOVESI_FROM_CR))])]
14026  "TARGET_MFCRF"
14027  "*
14028{
14029  int mask = 0;
14030  int i;
14031  for (i = 0; i < XVECLEN (operands[0], 0); i++)
14032  {
14033    mask = INTVAL (XVECEXP (SET_SRC (XVECEXP (operands[0], 0, i)), 0, 1));
14034    operands[4] = GEN_INT (mask);
14035    output_asm_insn (\"mfcr %1,%4\", operands);
14036  }
14037  return \"\";
14038}"
14039  [(set_attr "type" "mfcrf")])
14040
14041(define_insn "movesi_from_cr"
14042  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
14043        (unspec:SI [(reg:CC 68) (reg:CC 69) (reg:CC 70) (reg:CC 71)
14044		    (reg:CC 72)	(reg:CC 73) (reg:CC 74) (reg:CC 75)]
14045		   UNSPEC_MOVESI_FROM_CR))]
14046  ""
14047  "mfcr %0"
14048  [(set_attr "type" "mfcr")])
14049
14050(define_insn "*stmw"
14051  [(match_parallel 0 "stmw_operation"
14052		   [(set (match_operand:SI 1 "memory_operand" "=m")
14053       			 (match_operand:SI 2 "gpc_reg_operand" "r"))])]
14054  "TARGET_MULTIPLE"
14055  "{stm|stmw} %2,%1"
14056  [(set_attr "type" "store_ux")])
14057
14058(define_insn "*save_fpregs_<mode>"
14059  [(match_parallel 0 "any_parallel_operand"
14060		   [(clobber (match_operand:P 1 "register_operand" "=l"))
14061		    (use (match_operand:P 2 "call_operand" "s"))
14062		    (set (match_operand:DF 3 "memory_operand" "=m")
14063			 (match_operand:DF 4 "gpc_reg_operand" "f"))])]
14064  ""
14065  "bl %z2"
14066  [(set_attr "type" "branch")
14067   (set_attr "length" "4")])
14068
14069; These are to explain that changes to the stack pointer should
14070; not be moved over stores to stack memory.
14071(define_insn "stack_tie"
14072  [(set (match_operand:BLK 0 "memory_operand" "+m")
14073        (unspec:BLK [(match_dup 0)] UNSPEC_TIE))]
14074  ""
14075  ""
14076  [(set_attr "length" "0")])
14077
14078
14079(define_expand "epilogue"
14080  [(use (const_int 0))]
14081  "TARGET_SCHED_PROLOG"
14082  "
14083{
14084      rs6000_emit_epilogue (FALSE);
14085      DONE;
14086}")
14087
14088; On some processors, doing the mtcrf one CC register at a time is
14089; faster (like on the 604e).  On others, doing them all at once is
14090; faster; for instance, on the 601 and 750.
14091
14092(define_expand "movsi_to_cr_one"
14093  [(set (match_operand:CC 0 "cc_reg_operand" "=y")
14094        (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
14095		    (match_dup 2)] UNSPEC_MOVESI_TO_CR))]
14096  ""
14097  "operands[2] = GEN_INT (1 << (75 - REGNO (operands[0])));")
14098
14099(define_insn "*movsi_to_cr"
14100  [(match_parallel 0 "mtcrf_operation"
14101		   [(set (match_operand:CC 1 "cc_reg_operand" "=y")
14102			 (unspec:CC [(match_operand:SI 2 "gpc_reg_operand" "r")
14103				     (match_operand 3 "immediate_operand" "n")]
14104				    UNSPEC_MOVESI_TO_CR))])]
14105 ""
14106 "*
14107{
14108  int mask = 0;
14109  int i;
14110  for (i = 0; i < XVECLEN (operands[0], 0); i++)
14111    mask |= INTVAL (XVECEXP (SET_SRC (XVECEXP (operands[0], 0, i)), 0, 1));
14112  operands[4] = GEN_INT (mask);
14113  return \"mtcrf %4,%2\";
14114}"
14115  [(set_attr "type" "mtcr")])
14116
14117(define_insn "*mtcrfsi"
14118  [(set (match_operand:CC 0 "cc_reg_operand" "=y")
14119        (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
14120		    (match_operand 2 "immediate_operand" "n")]
14121		   UNSPEC_MOVESI_TO_CR))]
14122  "GET_CODE (operands[0]) == REG
14123   && CR_REGNO_P (REGNO (operands[0]))
14124   && GET_CODE (operands[2]) == CONST_INT
14125   && INTVAL (operands[2]) == 1 << (75 - REGNO (operands[0]))"
14126  "mtcrf %R0,%1"
14127  [(set_attr "type" "mtcr")])
14128
14129; The load-multiple instructions have similar properties.
14130; Note that "load_multiple" is a name known to the machine-independent
14131; code that actually corresponds to the PowerPC load-string.
14132
14133(define_insn "*lmw"
14134  [(match_parallel 0 "lmw_operation"
14135		   [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
14136       			 (match_operand:SI 2 "memory_operand" "m"))])]
14137  "TARGET_MULTIPLE"
14138  "{lm|lmw} %1,%2"
14139  [(set_attr "type" "load_ux")])
14140
14141(define_insn "*return_internal_<mode>"
14142  [(return)
14143   (use (match_operand:P 0 "register_operand" "lc"))]
14144  ""
14145  "b%T0"
14146  [(set_attr "type" "jmpreg")])
14147
14148; FIXME: This would probably be somewhat simpler if the Cygnus sibcall
14149; stuff was in GCC.  Oh, and "any_parallel_operand" is a bit flexible...
14150
14151(define_insn "*return_and_restore_fpregs_<mode>"
14152 [(match_parallel 0 "any_parallel_operand"
14153                  [(return)
14154		   (use (match_operand:P 1 "register_operand" "l"))
14155		   (use (match_operand:P 2 "call_operand" "s"))
14156		   (set (match_operand:DF 3 "gpc_reg_operand" "=f")
14157			(match_operand:DF 4 "memory_operand" "m"))])]
14158 ""
14159 "b %z2")
14160
14161; This is used in compiling the unwind routines.
14162(define_expand "eh_return"
14163  [(use (match_operand 0 "general_operand" ""))]
14164  ""
14165  "
14166{
14167  if (TARGET_32BIT)
14168    emit_insn (gen_eh_set_lr_si (operands[0]));
14169  else
14170    emit_insn (gen_eh_set_lr_di (operands[0]));
14171  DONE;
14172}")
14173
14174; We can't expand this before we know where the link register is stored.
14175(define_insn "eh_set_lr_<mode>"
14176  [(unspec_volatile [(match_operand:P 0 "register_operand" "r")]
14177  		    UNSPECV_EH_RR)
14178   (clobber (match_scratch:P 1 "=&b"))]
14179  ""
14180  "#")
14181
14182(define_split
14183  [(unspec_volatile [(match_operand 0 "register_operand" "")] UNSPECV_EH_RR)
14184   (clobber (match_scratch 1 ""))]
14185  "reload_completed"
14186  [(const_int 0)]
14187  "
14188{
14189  rs6000_emit_eh_reg_restore (operands[0], operands[1]);
14190  DONE;
14191}")
14192
14193(define_insn "prefetch"
14194  [(prefetch (match_operand 0 "indexed_or_indirect_address" "a")
14195	     (match_operand:SI 1 "const_int_operand" "n")
14196	     (match_operand:SI 2 "const_int_operand" "n"))]
14197  "TARGET_POWERPC"
14198  "*
14199{
14200  if (GET_CODE (operands[0]) == REG)
14201    return INTVAL (operands[1]) ? \"dcbtst 0,%0\" : \"dcbt 0,%0\";
14202  return INTVAL (operands[1]) ? \"dcbtst %a0\" : \"dcbt %a0\";
14203}"
14204  [(set_attr "type" "load")])
14205
14206
14207(include "sync.md")
14208(include "altivec.md")
14209(include "spe.md")
14210