OSDN Git Service

eba1a8963233b1bccf0e0e5e3747eba89620dc08
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.md
1 ;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
2 ;; Copyright (C) 1990, 91-96, 1997 Free Software Foundation, Inc.
3 ;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
4
5 ;; This file is part of GNU CC.
6
7 ;; GNU CC is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 2, or (at your option)
10 ;; any later version.
11
12 ;; GNU CC is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
16
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GNU CC; see the file COPYING.  If not, write to
19 ;; the Free Software Foundation, 59 Temple Place - Suite 330,
20 ;; Boston, MA 02111-1307, USA.
21
22 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
23 \f
24 ;; Define an insn type attribute.  This is used in function unit delay
25 ;; computations.
26 (define_attr "type" "integer,load,store,fpload,fpstore,imul,idiv,branch,compare,delayed_compare,fpcompare,mtjmpr,fp,dmul,sdiv,ddiv,ssqrt,dsqrt,jmpreg"
27   (const_string "integer"))
28
29 ;; Length (in bytes).
30 (define_attr "length" ""
31   (if_then_else (eq_attr "type" "branch")
32                 (if_then_else (and (ge (minus (pc) (match_dup 0))
33                                        (const_int -32768))
34                                    (lt (minus (pc) (match_dup 0))
35                                        (const_int 32767)))
36                               (const_int 8)
37                               (const_int 12))
38                 (const_int 4)))
39
40 ;; Processor type -- this attribute must exactly match the processor_type
41 ;; enumeration in rs6000.h.
42
43 (define_attr "cpu" "rios1,rios2,mpccore,ppc403,ppc601,ppc603,ppc604,ppc620"
44   (const (symbol_ref "rs6000_cpu_attr")))
45
46 ; (define_function_unit NAME MULTIPLICITY SIMULTANEITY
47 ;                       TEST READY-DELAY ISSUE-DELAY [CONFLICT-LIST])
48
49 ; Load/Store Unit -- pure PowerPC only
50 ; (POWER and 601 use Integer Unit)
51 (define_function_unit "lsu" 1 0
52   (and (eq_attr "type" "load")
53        (eq_attr "cpu" "mpccore,ppc603,ppc604,ppc620"))
54   2 1)
55
56 (define_function_unit "lsu" 1 0
57   (and (eq_attr "type" "store,fpstore")
58        (eq_attr "cpu" "mpccore,ppc603,ppc604,ppc620"))
59   1 1)
60
61 (define_function_unit "lsu" 1 0
62   (and (eq_attr "type" "fpload")
63        (eq_attr "cpu" "mpccore,ppc603"))
64   2 1)
65
66 (define_function_unit "lsu" 1 0
67   (and (eq_attr "type" "fpload")
68        (eq_attr "cpu" "ppc604,ppc620"))
69   3 1)
70
71 (define_function_unit "iu" 1 0
72   (and (eq_attr "type" "load")
73        (eq_attr "cpu" "rios1,ppc403,ppc601"))
74   2 1)
75
76 (define_function_unit "iu" 1 0
77   (and (eq_attr "type" "store,fpstore")
78        (eq_attr "cpu" "rios1,ppc403,ppc601"))
79   1 1)
80
81 (define_function_unit "fpu" 1 0
82   (and (eq_attr "type" "fpstore")
83        (eq_attr "cpu" "rios1,ppc601"))
84   0 1)
85
86 (define_function_unit "iu" 1 0
87   (and (eq_attr "type" "fpload")
88        (eq_attr "cpu" "rios1"))
89   2 1)
90
91 (define_function_unit "iu" 1 0
92   (and (eq_attr "type" "fpload")
93        (eq_attr "cpu" "ppc601"))
94   3 1)
95
96 (define_function_unit "iu2" 2 0
97   (and (eq_attr "type" "load,fpload")
98        (eq_attr "cpu" "rios2"))
99   2 1)
100
101 (define_function_unit "iu2" 2 0
102   (and (eq_attr "type" "store,fpstore")
103        (eq_attr "cpu" "rios2"))
104   1 1)
105
106 ; Integer Unit (RIOS1, PPC601, PPC603)
107 (define_function_unit "iu" 1 0
108   (and (eq_attr "type" "integer")
109        (eq_attr "cpu" "rios1,mpccore,ppc403,ppc601,ppc603"))
110   1 1)
111
112 (define_function_unit "iu" 1 0
113   (and (eq_attr "type" "imul")
114        (eq_attr "cpu" "ppc403"))
115   4 4)
116
117 (define_function_unit "iu" 1 0
118   (and (eq_attr "type" "imul")
119        (eq_attr "cpu" "rios1,ppc601,ppc603"))
120   5 5)
121
122 (define_function_unit "iu" 1 0
123   (and (eq_attr "type" "idiv")
124        (eq_attr "cpu" "rios1"))
125   19 19)
126
127 (define_function_unit "iu" 1 0
128   (and (eq_attr "type" "idiv")
129        (eq_attr "cpu" "ppc403"))
130   33 33)
131
132 (define_function_unit "iu" 1 0
133   (and (eq_attr "type" "idiv")
134        (eq_attr "cpu" "ppc601"))
135   36 36)
136
137 (define_function_unit "iu" 1 0
138   (and (eq_attr "type" "idiv")
139        (eq_attr "cpu" "ppc603"))
140   37 36)
141
142 ; RIOS2 has two integer units: a primary one which can perform all
143 ; operations and a secondary one which is fed in lock step with the first
144 ; and can perform "simple" integer operations.  
145 ; To catch this we define a 'dummy' imuldiv-unit that is also needed
146 ; for the complex insns. 
147 (define_function_unit "iu2" 2 0
148   (and (eq_attr "type" "integer")
149        (eq_attr "cpu" "rios2"))
150   1 1)
151
152 (define_function_unit "iu2" 2 0
153   (and (eq_attr "type" "imul")
154        (eq_attr "cpu" "rios2"))
155   2 2)
156
157 (define_function_unit "iu2" 2 0
158   (and (eq_attr "type" "idiv")
159        (eq_attr "cpu" "rios2"))
160   13 13)
161
162 (define_function_unit "imuldiv" 1 0
163   (and (eq_attr "type" "imul")
164        (eq_attr "cpu" "rios2"))
165   2 2)
166
167 (define_function_unit "imuldiv" 1 0
168   (and (eq_attr "type" "idiv")
169        (eq_attr "cpu" "rios2"))
170   13 13)
171
172 ; MPCCORE has separate IMUL/IDIV unit for multicycle instructions
173 ; Divide latency varies greatly from 2-11, use 6 as average
174 (define_function_unit "imuldiv" 1 0
175   (and (eq_attr "type" "imul")
176        (eq_attr "cpu" "mpccore"))
177   2 1)
178
179 (define_function_unit "imuldiv" 1 0
180   (and (eq_attr "type" "idiv")
181        (eq_attr "cpu" "mpccore"))
182   6 6)
183
184 ; PPC604 has two units that perform integer operations
185 ; and one unit for divide/multiply operations (and move
186 ; from/to spr).
187 (define_function_unit "iu2" 2 0
188   (and (eq_attr "type" "integer")
189        (eq_attr "cpu" "ppc604,ppc620"))
190   1 1)
191
192 (define_function_unit "imuldiv" 1 0
193   (and (eq_attr "type" "imul")
194        (eq_attr "cpu" "ppc604,ppc620"))
195   4 2)
196
197 (define_function_unit "imuldiv" 1 0
198   (and (eq_attr "type" "idiv")
199        (eq_attr "cpu" "ppc604,ppc620"))
200   20 19)
201
202 ; compare is done on integer unit, but feeds insns which
203 ; execute on the branch unit.
204 (define_function_unit "iu" 1 0   
205   (and (eq_attr "type" "compare")
206        (eq_attr "cpu" "rios1"))
207   4 1)
208
209 (define_function_unit "iu" 1 0   
210   (and (eq_attr "type" "delayed_compare")
211        (eq_attr "cpu" "rios1"))
212   5 1)
213
214 (define_function_unit "iu" 1 0
215   (and (eq_attr "type" "compare,delayed_compare")
216        (eq_attr "cpu" "mpccore,ppc403,ppc601,ppc603,ppc604,ppc620"))
217   3 1)
218
219 (define_function_unit "iu2" 2 0   
220   (and (eq_attr "type" "compare,delayed_compare")
221        (eq_attr "cpu" "rios2"))
222   3 1)
223
224 (define_function_unit "iu2" 2 0
225   (and (eq_attr "type" "compare,delayed_compare")
226        (eq_attr "cpu" "ppc604,ppc620"))
227   1 1)
228
229 ; fp compare uses fp unit
230 (define_function_unit "fpu" 1 0
231   (and (eq_attr "type" "fpcompare")
232        (eq_attr "cpu" "rios1"))
233   9 1)
234
235 ; rios1 and rios2 have different fpcompare delays
236 (define_function_unit "fpu2" 2 0
237   (and (eq_attr "type" "fpcompare")
238        (eq_attr "cpu" "rios2"))
239   5 1)
240
241 ; on ppc601 and ppc603, fpcompare takes also 2 cycles from
242 ; the integer unit
243 ; here we do not define delays, just occupy the unit. The dependencies
244 ; will be assigned by the fpcompare definition in the fpu.
245 (define_function_unit "iu" 1 0
246   (and (eq_attr "type" "fpcompare")
247        (eq_attr "cpu" "ppc601,ppc603"))
248   0 2)
249
250 ; fp compare uses fp unit
251 (define_function_unit "fpu" 1 0
252   (and (eq_attr "type" "fpcompare")
253        (eq_attr "cpu" "ppc601,ppc603,ppc604,ppc620"))
254   5 1)
255
256 (define_function_unit "fpu" 1 0
257   (and (eq_attr "type" "fpcompare")
258        (eq_attr "cpu" "mpccore"))
259   1 1)
260
261 (define_function_unit "bpu" 1 0
262   (and (eq_attr "type" "mtjmpr")
263        (eq_attr "cpu" "rios1,rios2"))
264   5 1)
265
266 (define_function_unit "bpu" 1 0
267   (and (eq_attr "type" "mtjmpr")
268        (eq_attr "cpu" "mpccore,ppc403,ppc601,ppc603,ppc604,ppc620"))
269   4 1)
270
271 ; all jumps/branches are executing on the bpu, in 1 cycle, for all machines.
272 (define_function_unit "bpu" 1 0
273   (eq_attr "type" "jmpreg")
274   1 1)
275
276 (define_function_unit "bpu" 1 0
277   (eq_attr "type" "branch")
278   1 1)
279
280 ; Floating Point Unit
281 (define_function_unit "fpu" 1 0
282   (and (eq_attr "type" "fp,dmul")
283        (eq_attr "cpu" "rios1"))
284   2 1)
285
286 (define_function_unit "fpu" 1 0
287   (and (eq_attr "type" "fp")
288        (eq_attr "cpu" "mpccore"))
289   4 4)
290
291 (define_function_unit "fpu" 1 0
292   (and (eq_attr "type" "fp")
293        (eq_attr "cpu" "ppc601"))
294   4 1)
295
296 (define_function_unit "fpu" 1 0
297   (and (eq_attr "type" "fp")
298        (eq_attr "cpu" "ppc603,ppc604,ppc620"))
299   3 1)
300
301 (define_function_unit "fpu" 1 0
302   (and (eq_attr "type" "dmul")
303        (eq_attr "cpu" "mpccore"))
304   5 5)
305
306 (define_function_unit "fpu" 1 0
307   (and (eq_attr "type" "dmul")
308        (eq_attr "cpu" "ppc601"))
309   5 2)
310
311 ; is this true?
312 (define_function_unit "fpu" 1 0
313   (and (eq_attr "type" "dmul")
314        (eq_attr "cpu" "ppc603"))
315   4 2)
316
317 (define_function_unit "fpu" 1 0
318   (and (eq_attr "type" "dmul")
319        (eq_attr "cpu" "ppc604,ppc620"))
320   3 1)
321
322 (define_function_unit "fpu" 1 0
323   (and (eq_attr "type" "sdiv,ddiv")
324        (eq_attr "cpu" "rios1"))
325   19 19)
326
327 (define_function_unit "fpu" 1 0
328   (and (eq_attr "type" "sdiv")
329        (eq_attr "cpu" "ppc601"))
330   17 17)
331
332 (define_function_unit "fpu" 1 0
333   (and (eq_attr "type" "sdiv")
334        (eq_attr "cpu" "mpccore"))
335   10 10)
336
337 (define_function_unit "fpu" 1 0
338   (and (eq_attr "type" "sdiv")
339        (eq_attr "cpu" "ppc603,ppc604,ppc620"))
340   18 18)
341
342 (define_function_unit "fpu" 1 0
343   (and (eq_attr "type" "ddiv")
344        (eq_attr "cpu" "mpccore"))
345   17 17)
346
347 (define_function_unit "fpu" 1 0
348   (and (eq_attr "type" "ddiv")
349        (eq_attr "cpu" "ppc601,ppc604,ppc620"))
350   31 31)
351
352 (define_function_unit "fpu" 1 0
353   (and (eq_attr "type" "ddiv")
354        (eq_attr "cpu" "ppc603"))
355   33 33)
356
357 (define_function_unit "fpu" 1 0
358   (and (eq_attr "type" "ssqrt")
359        (eq_attr "cpu" "ppc620"))
360   31 31)
361
362 (define_function_unit "fpu" 1 0
363   (and (eq_attr "type" "dsqrt")
364        (eq_attr "cpu" "ppc620"))
365   31 31)
366
367 ; RIOS2 has two symmetric FPUs.
368 (define_function_unit "fpu2" 2 0
369   (and (eq_attr "type" "fp")
370        (eq_attr "cpu" "rios2"))
371   2 1)
372
373 (define_function_unit "fpu2" 2 0
374   (and (eq_attr "type" "dmul")
375        (eq_attr "cpu" "rios2"))
376   2 1)
377
378 (define_function_unit "fpu2" 2 0
379   (and (eq_attr "type" "sdiv,ddiv")
380        (eq_attr "cpu" "rios2"))
381   17 17)
382
383 (define_function_unit "fpu2" 2 0
384   (and (eq_attr "type" "ssqrt,dsqrt")
385        (eq_attr "cpu" "rios2"))
386   26 26)
387
388 \f
389 ;; Start with fixed-point load and store insns.  Here we put only the more
390 ;; complex forms.  Basic data transfer is done later.
391
392 (define_expand "zero_extendqidi2"
393   [(set (match_operand:DI 0 "gpc_reg_operand" "")
394         (zero_extend:DI (match_operand:QI 1 "gpc_reg_operand" "")))]
395   "TARGET_POWERPC64"
396   "")
397
398 (define_insn ""
399   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
400         (zero_extend:DI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
401   "TARGET_POWERPC64"
402   "@
403    lbz%U1%X1 %0,%1
404    rldicl %0,%1,0,56"
405   [(set_attr "type" "load,*")])
406
407 (define_insn ""
408   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
409         (compare:CC (zero_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r"))
410                     (const_int 0)))
411    (clobber (match_scratch:DI 2 "=r"))]
412   "TARGET_POWERPC64"
413   "rldicl. %2,%1,0,56"
414   [(set_attr "type" "compare")])
415
416 (define_insn ""
417   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
418         (compare:CC (zero_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r"))
419                     (const_int 0)))
420    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
421         (zero_extend:DI (match_dup 1)))]
422   "TARGET_POWERPC64"
423   "rldicl. %0,%1,0,56"
424   [(set_attr "type" "compare")])
425
426 (define_insn "extendqidi2"
427   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
428         (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r")))]
429   "TARGET_POWERPC64"
430   "extsb %0,%1")
431
432 (define_insn ""
433   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
434         (compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r"))
435                     (const_int 0)))
436    (clobber (match_scratch:DI 2 "=r"))]
437   "TARGET_POWERPC64"
438   "extsb. %2,%1"
439   [(set_attr "type" "compare")])
440
441 (define_insn ""
442   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
443         (compare:CC (sign_extend:DI (match_operand:QI 1 "gpc_reg_operand" "r"))
444                     (const_int 0)))
445    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
446         (sign_extend:DI (match_dup 1)))]
447   "TARGET_POWERPC64"
448   "extsb. %0,%1"
449   [(set_attr "type" "compare")])
450
451 (define_expand "zero_extendhidi2"
452   [(set (match_operand:DI 0 "gpc_reg_operand" "")
453         (zero_extend:DI (match_operand:HI 1 "gpc_reg_operand" "")))]
454   "TARGET_POWERPC64"
455   "")
456
457 (define_insn ""
458   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
459         (zero_extend:DI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
460   "TARGET_POWERPC64"
461   "@
462    lhz%U1%X1 %0,%1
463    rldicl %0,%1,0,48"
464   [(set_attr "type" "load,*")])
465
466 (define_insn ""
467   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
468         (compare:CC (zero_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r"))
469                     (const_int 0)))
470    (clobber (match_scratch:DI 2 "=r"))]
471   "TARGET_POWERPC64"
472   "rldicl. %2,%1,0,48"
473   [(set_attr "type" "compare")])
474
475 (define_insn ""
476   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
477         (compare:CC (zero_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r"))
478                     (const_int 0)))
479    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
480         (zero_extend:DI (match_dup 1)))]
481   "TARGET_POWERPC64"
482   "rldicl. %0,%1,0,48"
483   [(set_attr "type" "compare")])
484
485 (define_expand "extendhidi2"
486   [(set (match_operand:DI 0 "gpc_reg_operand" "")
487         (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "")))]
488   "TARGET_POWERPC64"
489   "")
490
491 (define_insn ""
492   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
493         (sign_extend:DI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
494   "TARGET_POWERPC64"
495   "@
496    lha%U1%X1 %0,%1
497    extsh %0,%1"
498   [(set_attr "type" "load,*")])
499
500 (define_insn ""
501   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
502         (compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r"))
503                     (const_int 0)))
504    (clobber (match_scratch:DI 2 "=r"))]
505   "TARGET_POWERPC64"
506   "extsh. %2,%1"
507   [(set_attr "type" "compare")])
508
509 (define_insn ""
510   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
511         (compare:CC (sign_extend:DI (match_operand:HI 1 "gpc_reg_operand" "r"))
512                     (const_int 0)))
513    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
514         (sign_extend:DI (match_dup 1)))]
515   "TARGET_POWERPC64"
516   "extsh. %0,%1"
517   [(set_attr "type" "compare")])
518
519 (define_expand "zero_extendsidi2"
520   [(set (match_operand:DI 0 "gpc_reg_operand" "")
521         (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "")))]
522   "TARGET_POWERPC64"
523   "")
524
525 (define_insn ""
526   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
527         (zero_extend:DI (match_operand:SI 1 "reg_or_mem_operand" "m,r")))]
528   "TARGET_POWERPC64"
529   "@
530    lwz%U1%X1 %0,%1
531    rldicl %0,%1,0,32"
532   [(set_attr "type" "load,*")])
533
534 (define_insn ""
535   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
536         (compare:CC (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
537                     (const_int 0)))
538    (clobber (match_scratch:DI 2 "=r"))]
539   "TARGET_POWERPC64"
540   "rldicl. %2,%1,0,32"
541   [(set_attr "type" "compare")])
542
543 (define_insn ""
544   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
545         (compare:CC (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
546                     (const_int 0)))
547    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
548         (zero_extend:DI (match_dup 1)))]
549   "TARGET_POWERPC64"
550   "rldicl. %0,%1,0,32"
551   [(set_attr "type" "compare")])
552
553 (define_expand "extendsidi2"
554   [(set (match_operand:DI 0 "gpc_reg_operand" "")
555         (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "")))]
556   "TARGET_POWERPC64"
557   "")
558
559 (define_insn ""
560   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
561         (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))]
562   "TARGET_POWERPC64"
563   "@
564    lwa%U1%X1 %0,%1
565    extsw %0,%1"
566   [(set_attr "type" "load,*")])
567
568 (define_insn ""
569   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
570         (compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
571                     (const_int 0)))
572    (clobber (match_scratch:DI 2 "=r"))]
573   "TARGET_POWERPC64"
574   "extsw. %2,%1"
575   [(set_attr "type" "compare")])
576
577 (define_insn ""
578   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
579         (compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
580                     (const_int 0)))
581    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
582         (sign_extend:DI (match_dup 1)))]
583   "TARGET_POWERPC64"
584   "extsw. %0,%1"
585   [(set_attr "type" "compare")])
586
587 (define_expand "zero_extendqisi2"
588   [(set (match_operand:SI 0 "gpc_reg_operand" "")
589         (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "")))]
590   ""
591   "")
592
593 (define_insn ""
594   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
595         (zero_extend:SI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
596   ""
597   "@
598    lbz%U1%X1 %0,%1
599    {rlinm|rlwinm} %0,%1,0,0xff"
600   [(set_attr "type" "load,*")])
601
602 (define_insn ""
603   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
604         (compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r"))
605                     (const_int 0)))
606    (clobber (match_scratch:SI 2 "=r"))]
607   ""
608   "{andil.|andi.} %2,%1,0xff"
609   [(set_attr "type" "compare")])
610
611 (define_insn ""
612   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
613         (compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r"))
614                     (const_int 0)))
615    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
616         (zero_extend:SI (match_dup 1)))]
617   ""
618   "{andil.|andi.} %0,%1,0xff"
619   [(set_attr "type" "compare")])
620
621 (define_expand "extendqisi2"
622   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
623    (use (match_operand:QI 1 "gpc_reg_operand" ""))]
624   ""
625   "
626 {
627   if (TARGET_POWERPC)
628     emit_insn (gen_extendqisi2_ppc (operands[0], operands[1]));
629   else if (TARGET_POWER)
630     emit_insn (gen_extendqisi2_power (operands[0], operands[1]));
631   else
632     emit_insn (gen_extendqisi2_no_power (operands[0], operands[1]));
633   DONE;
634 }")
635
636 (define_insn "extendqisi2_ppc"
637   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
638         (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))]
639   "TARGET_POWERPC"
640   "extsb %0,%1")
641
642 (define_insn ""
643   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
644         (compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r"))
645                     (const_int 0)))
646    (clobber (match_scratch:SI 2 "=r"))]
647   "TARGET_POWERPC"
648   "extsb. %2,%1"
649   [(set_attr "type" "compare")])
650
651 (define_insn ""
652   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
653         (compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r"))
654                     (const_int 0)))
655    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
656         (sign_extend:SI (match_dup 1)))]
657   "TARGET_POWERPC"
658   "extsb. %0,%1"
659   [(set_attr "type" "compare")])
660
661 (define_expand "extendqisi2_power"
662   [(parallel [(set (match_dup 2)
663                    (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
664                               (const_int 24)))
665               (clobber (scratch:SI))])
666    (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
667                    (ashiftrt:SI (match_dup 2)
668                                 (const_int 24)))
669               (clobber (scratch:SI))])]
670   "TARGET_POWER"
671   "
672 { operands[1] = gen_lowpart (SImode, operands[1]);
673   operands[2] = gen_reg_rtx (SImode); }")
674
675 (define_expand "extendqisi2_no_power"
676   [(set (match_dup 2)
677         (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
678                    (const_int 24)))
679    (set (match_operand:SI 0 "gpc_reg_operand" "")
680         (ashiftrt:SI (match_dup 2)
681                      (const_int 24)))]
682   "! TARGET_POWER && ! TARGET_POWERPC"
683   "
684 { operands[1] = gen_lowpart (SImode, operands[1]);
685   operands[2] = gen_reg_rtx (SImode); }")
686
687 (define_expand "zero_extendqihi2"
688   [(set (match_operand:HI 0 "gpc_reg_operand" "")
689         (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "")))]
690   ""
691   "")
692
693 (define_insn ""
694   [(set (match_operand:HI 0 "gpc_reg_operand" "=r,r")
695         (zero_extend:HI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
696   ""
697   "@
698    lbz%U1%X1 %0,%1
699    {rlinm|rlwinm} %0,%1,0,0xff"
700   [(set_attr "type" "load,*")])
701
702 (define_insn ""
703   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
704         (compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r"))
705                     (const_int 0)))
706    (clobber (match_scratch:HI 2 "=r"))]
707   ""
708   "{andil.|andi.} %2,%1,0xff"
709   [(set_attr "type" "compare")])
710
711 (define_insn ""
712   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
713         (compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r"))
714                     (const_int 0)))
715    (set (match_operand:HI 0 "gpc_reg_operand" "=r")
716         (zero_extend:HI (match_dup 1)))]
717   ""
718   "{andil.|andi.} %0,%1,0xff"
719   [(set_attr "type" "compare")])
720
721 (define_expand "extendqihi2"
722   [(use (match_operand:HI 0 "gpc_reg_operand" ""))
723    (use (match_operand:QI 1 "gpc_reg_operand" ""))]
724   ""
725   "
726 {
727   if (TARGET_POWERPC)
728     emit_insn (gen_extendqihi2_ppc (operands[0], operands[1]));
729   else if (TARGET_POWER)
730     emit_insn (gen_extendqihi2_power (operands[0], operands[1]));
731   else
732     emit_insn (gen_extendqihi2_no_power (operands[0], operands[1]));
733   DONE;
734 }")
735
736 (define_insn "extendqihi2_ppc"
737   [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
738         (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))]
739   "TARGET_POWERPC"
740   "extsb %0,%1")
741
742 (define_insn ""
743   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
744         (compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r"))
745                     (const_int 0)))
746    (clobber (match_scratch:HI 2 "=r"))]
747   "TARGET_POWERPC"
748   "extsb. %2,%1"
749   [(set_attr "type" "compare")])
750
751 (define_insn ""
752   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
753         (compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r"))
754                     (const_int 0)))
755    (set (match_operand:HI 0 "gpc_reg_operand" "=r")
756         (sign_extend:HI (match_dup 1)))]
757   "TARGET_POWERPC"
758   "extsb. %0,%1"
759   [(set_attr "type" "compare")])
760
761 (define_expand "extendqihi2_power"
762   [(parallel [(set (match_dup 2)
763                    (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
764                               (const_int 24)))
765               (clobber (scratch:SI))])
766    (parallel [(set (match_operand:HI 0 "gpc_reg_operand" "")
767                    (ashiftrt:SI (match_dup 2)
768                                 (const_int 24)))
769               (clobber (scratch:SI))])]
770   "TARGET_POWER"
771   "
772 { operands[0] = gen_lowpart (SImode, operands[0]);
773   operands[1] = gen_lowpart (SImode, operands[1]);
774   operands[2] = gen_reg_rtx (SImode); }")
775
776 (define_expand "extendqihi2_no_power"
777   [(set (match_dup 2)
778         (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
779                    (const_int 24)))
780    (set (match_operand:HI 0 "gpc_reg_operand" "")
781         (ashiftrt:SI (match_dup 2)
782                      (const_int 24)))]
783   "! TARGET_POWER && ! TARGET_POWERPC"
784   "
785 { operands[0] = gen_lowpart (SImode, operands[0]);
786   operands[1] = gen_lowpart (SImode, operands[1]);
787   operands[2] = gen_reg_rtx (SImode); }")
788
789 (define_expand "zero_extendhisi2"
790   [(set (match_operand:SI 0 "gpc_reg_operand" "")
791         (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))]
792   ""
793   "")
794
795 (define_insn ""
796   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
797         (zero_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
798   ""
799   "@
800    lhz%U1%X1 %0,%1
801    {rlinm|rlwinm} %0,%1,0,0xffff"
802   [(set_attr "type" "load,*")])
803
804 (define_insn ""
805   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
806         (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r"))
807                     (const_int 0)))
808    (clobber (match_scratch:SI 2 "=r"))]
809   ""
810   "{andil.|andi.} %2,%1,0xffff"
811   [(set_attr "type" "compare")])
812
813 (define_insn ""
814   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
815         (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r"))
816                     (const_int 0)))
817    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
818         (zero_extend:SI (match_dup 1)))]
819   ""
820   "{andil.|andi.} %0,%1,0xffff"
821   [(set_attr "type" "compare")])
822
823 (define_expand "extendhisi2"
824   [(set (match_operand:SI 0 "gpc_reg_operand" "")
825         (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))]
826   ""
827   "")
828
829 (define_insn ""
830   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
831         (sign_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
832   ""
833   "@
834    lha%U1%X1 %0,%1
835    {exts|extsh} %0,%1"
836   [(set_attr "type" "load,*")])
837
838 (define_insn ""
839   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
840         (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r"))
841                     (const_int 0)))
842    (clobber (match_scratch:SI 2 "=r"))]
843   ""
844   "{exts.|extsh.} %2,%1"
845   [(set_attr "type" "compare")])
846
847 (define_insn ""
848   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
849         (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r"))
850                     (const_int 0)))
851    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
852         (sign_extend:SI (match_dup 1)))]
853   ""
854   "{exts.|extsh.} %0,%1"
855   [(set_attr "type" "compare")])
856 \f
857 ;; Fixed-point arithmetic insns.
858
859 ;; Discourage ai/addic because of carry but provide it in an alternative
860 ;; allowing register zero as source.
861 (define_insn "addsi3"
862   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,?r,r")
863         (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,b,r,b")
864                  (match_operand:SI 2 "add_operand" "r,I,I,J")))]
865   ""
866   "@
867    {cax|add} %0,%1,%2
868    {cal %0,%2(%1)|addi %0,%1,%2}
869    {ai|addic} %0,%1,%2
870    {cau|addis} %0,%1,%v2")
871
872 (define_insn ""
873   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
874         (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
875                              (match_operand:SI 2 "reg_or_short_operand" "r,I"))
876                     (const_int 0)))
877    (clobber (match_scratch:SI 3 "=r,r"))]
878   ""
879   "@
880    {cax.|add.} %3,%1,%2
881    {ai.|addic.} %3,%1,%2"
882   [(set_attr "type" "compare")])
883
884 (define_insn ""
885   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
886         (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
887                              (match_operand:SI 2 "reg_or_short_operand" "r,I"))
888                     (const_int 0)))
889    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
890         (plus:SI (match_dup 1) (match_dup 2)))]
891   ""
892   "@
893    {cax.|add.} %0,%1,%2
894    {ai.|addic.} %0,%1,%2"
895   [(set_attr "type" "compare")])
896
897 ;; Split an add that we can't do in one insn into two insns, each of which
898 ;; does one 16-bit part.  This is used by combine.  Note that the low-order
899 ;; add should be last in case the result gets used in an address.
900
901 (define_split
902   [(set (match_operand:SI 0 "gpc_reg_operand" "")
903         (plus:SI (match_operand:SI 1 "gpc_reg_operand" "")
904                  (match_operand:SI 2 "non_add_cint_operand" "")))]
905   ""
906   [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
907    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
908 "
909 {
910   HOST_WIDE_INT low = INTVAL (operands[2]) & 0xffff;
911   HOST_WIDE_INT high = INTVAL (operands[2]) & (~ (HOST_WIDE_INT) 0xffff);
912
913   if (low & 0x8000)
914     high += 0x10000, low |= ((HOST_WIDE_INT) -1) << 16;
915
916   operands[3] = GEN_INT (high);
917   operands[4] = GEN_INT (low);
918 }")
919
920 (define_insn "one_cmplsi2"
921   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
922         (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
923   ""
924   "nor %0,%1,%1")
925
926 (define_insn ""
927   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
928         (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
929                     (const_int 0)))
930    (clobber (match_scratch:SI 2 "=r"))]
931   ""
932   "nor. %2,%1,%1"
933   [(set_attr "type" "compare")])
934
935 (define_insn ""
936   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
937         (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
938                     (const_int 0)))
939    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
940         (not:SI (match_dup 1)))]
941   ""
942   "nor. %0,%1,%1"
943   [(set_attr "type" "compare")])
944
945 (define_insn ""
946   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
947         (minus:SI (match_operand:SI 1 "reg_or_short_operand" "rI")
948                   (match_operand:SI 2 "gpc_reg_operand" "r")))]
949   "! TARGET_POWERPC"
950   "{sf%I1|subf%I1c} %0,%2,%1")
951
952 (define_insn ""
953   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
954         (minus:SI (match_operand:SI 1 "reg_or_short_operand" "r,I")
955                   (match_operand:SI 2 "gpc_reg_operand" "r,r")))]
956   "TARGET_POWERPC"
957   "@
958    subf %0,%2,%1
959    subfic %0,%2,%1")
960
961 (define_insn ""
962   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
963         (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
964                               (match_operand:SI 2 "gpc_reg_operand" "r"))
965                     (const_int 0)))
966    (clobber (match_scratch:SI 3 "=r"))]
967   "! TARGET_POWERPC"
968   "{sf.|subfc.} %3,%2,%1"
969   [(set_attr "type" "compare")])
970
971 (define_insn ""
972   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
973         (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
974                               (match_operand:SI 2 "gpc_reg_operand" "r"))
975                     (const_int 0)))
976    (clobber (match_scratch:SI 3 "=r"))]
977   "TARGET_POWERPC"
978   "subf. %3,%2,%1"
979   [(set_attr "type" "compare")])
980
981 (define_insn ""
982   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
983         (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
984                               (match_operand:SI 2 "gpc_reg_operand" "r"))
985                     (const_int 0)))
986    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
987         (minus:SI (match_dup 1) (match_dup 2)))]
988   "! TARGET_POWERPC"
989   "{sf.|subfc.} %0,%2,%1"
990   [(set_attr "type" "compare")])
991
992 (define_insn ""
993   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
994         (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
995                               (match_operand:SI 2 "gpc_reg_operand" "r"))
996                     (const_int 0)))
997    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
998         (minus:SI (match_dup 1) (match_dup 2)))]
999   "TARGET_POWERPC"
1000   "subf. %0,%2,%1"
1001   [(set_attr "type" "compare")])
1002
1003 (define_expand "subsi3"
1004   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1005         (minus:SI (match_operand:SI 1 "reg_or_short_operand" "")
1006                   (match_operand:SI 2 "reg_or_cint_operand" "")))]
1007   ""
1008   "
1009 {
1010   if (GET_CODE (operands[2]) == CONST_INT)
1011     {
1012       emit_insn (gen_addsi3 (operands[0], operands[1],
1013                              negate_rtx (SImode, operands[2])));
1014       DONE;
1015     }
1016 }")
1017
1018 ;; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i]
1019 ;; instruction and some auxiliary computations.  Then we just have a single
1020 ;; DEFINE_INSN for doz[i] and the define_splits to make them if made by
1021 ;; combine.
1022
1023 (define_expand "sminsi3"
1024   [(set (match_dup 3)
1025         (if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
1026                                 (match_operand:SI 2 "reg_or_short_operand" ""))
1027                          (const_int 0)
1028                          (minus:SI (match_dup 2) (match_dup 1))))
1029    (set (match_operand:SI 0 "gpc_reg_operand" "")
1030         (minus:SI (match_dup 2) (match_dup 3)))]
1031   "TARGET_POWER"
1032   "
1033 { operands[3] = gen_reg_rtx (SImode); }")
1034
1035 (define_split
1036   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1037         (smin:SI (match_operand:SI 1 "gpc_reg_operand" "")
1038                  (match_operand:SI 2 "reg_or_short_operand" "")))
1039    (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
1040   "TARGET_POWER"
1041   [(set (match_dup 3)
1042         (if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
1043                          (const_int 0)
1044                          (minus:SI (match_dup 2) (match_dup 1))))
1045    (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 3)))]
1046   "")
1047
1048 (define_expand "smaxsi3"
1049   [(set (match_dup 3)
1050         (if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
1051                                 (match_operand:SI 2 "reg_or_short_operand" ""))
1052                          (const_int 0)
1053                          (minus:SI (match_dup 2) (match_dup 1))))
1054    (set (match_operand:SI 0 "gpc_reg_operand" "")
1055         (plus:SI (match_dup 3) (match_dup 1)))]
1056   "TARGET_POWER"
1057   "
1058 { operands[3] = gen_reg_rtx (SImode); }")
1059
1060 (define_split
1061   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1062         (smax:SI (match_operand:SI 1 "gpc_reg_operand" "")
1063                  (match_operand:SI 2 "reg_or_short_operand" "")))
1064    (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
1065   "TARGET_POWER"
1066   [(set (match_dup 3)
1067         (if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
1068                          (const_int 0)
1069                          (minus:SI (match_dup 2) (match_dup 1))))
1070    (set (match_dup 0) (plus:SI (match_dup 3) (match_dup 1)))]
1071   "")
1072
1073 (define_expand "uminsi3"
1074   [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
1075                               (match_dup 5)))
1076    (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
1077                               (match_dup 5)))
1078    (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
1079                                        (const_int 0)
1080                                        (minus:SI (match_dup 4) (match_dup 3))))
1081    (set (match_operand:SI 0 "gpc_reg_operand" "")
1082         (minus:SI (match_dup 2) (match_dup 3)))]
1083   "TARGET_POWER"
1084   "
1085 {
1086   operands[3] = gen_reg_rtx (SImode);
1087   operands[4] = gen_reg_rtx (SImode);
1088   operands[5] = GEN_INT (-2147483647 - 1);
1089 }")
1090
1091 (define_expand "umaxsi3"
1092   [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
1093                               (match_dup 5)))
1094    (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
1095                               (match_dup 5)))
1096    (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
1097                                        (const_int 0)
1098                                        (minus:SI (match_dup 4) (match_dup 3))))
1099    (set (match_operand:SI 0 "gpc_reg_operand" "")
1100         (plus:SI (match_dup 3) (match_dup 1)))]
1101   "TARGET_POWER"
1102   "
1103 {
1104   operands[3] = gen_reg_rtx (SImode);
1105   operands[4] = gen_reg_rtx (SImode);
1106   operands[5] = GEN_INT (-2147483647 - 1);
1107 }")
1108
1109 (define_insn ""
1110   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1111         (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r")
1112                              (match_operand:SI 2 "reg_or_short_operand" "rI"))
1113                          (const_int 0)
1114                          (minus:SI (match_dup 2) (match_dup 1))))]
1115   "TARGET_POWER"
1116   "doz%I2 %0,%1,%2")
1117
1118 (define_insn ""
1119   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1120         (compare:CC
1121          (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r")
1122                               (match_operand:SI 2 "reg_or_short_operand" "rI"))
1123                           (const_int 0)
1124                           (minus:SI (match_dup 2) (match_dup 1)))
1125          (const_int 0)))
1126    (clobber (match_scratch:SI 3 "=r"))]
1127   "TARGET_POWER"
1128   "doz%I2. %3,%1,%2"
1129   [(set_attr "type" "delayed_compare")])
1130
1131 (define_insn ""
1132   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1133         (compare:CC
1134          (if_then_else:SI (gt (match_operand:SI 1 "gpc_reg_operand" "r")
1135                               (match_operand:SI 2 "reg_or_short_operand" "rI"))
1136                           (const_int 0)
1137                           (minus:SI (match_dup 2) (match_dup 1)))
1138          (const_int 0)))
1139    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1140         (if_then_else:SI (gt (match_dup 1) (match_dup 2))
1141                          (const_int 0)
1142                          (minus:SI (match_dup 2) (match_dup 1))))]
1143   "TARGET_POWER"
1144   "doz%I2. %0,%1,%2"
1145   [(set_attr "type" "delayed_compare")])
1146
1147 ;; We don't need abs with condition code because such comparisons should
1148 ;; never be done.
1149 (define_expand "abssi2"
1150   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1151         (abs:SI (match_operand:SI 1 "gpc_reg_operand" "")))]
1152   ""
1153   "
1154 {
1155   if (!TARGET_POWER)
1156     {
1157       emit_insn (gen_abssi2_nopower (operands[0], operands[1]));
1158       DONE;
1159     }
1160 }")
1161
1162 (define_insn "abssi2_power"
1163   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1164         (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1165   "TARGET_POWER"
1166   "abs %0,%1")
1167
1168 (define_insn "abssi2_nopower"
1169   [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
1170         (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0")))
1171    (clobber (match_scratch:SI 2 "=&r,&r"))]
1172   "!TARGET_POWER"
1173   "*
1174 {
1175   return (TARGET_POWERPC)
1176     ? \"{srai|srawi} %2,%1,31\;xor %0,%2,%1\;subf %0,%2,%0\"
1177     : \"{srai|srawi} %2,%1,31\;xor %0,%2,%1\;{sf|subfc} %0,%2,%0\";
1178 }"
1179   [(set_attr "length" "12")])
1180
1181 (define_split
1182   [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
1183         (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0")))
1184    (clobber (match_scratch:SI 2 "=&r,&r"))]
1185   "!TARGET_POWER && reload_completed"
1186   [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
1187    (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
1188    (set (match_dup 0) (minus:SI (match_dup 0) (match_dup 2)))]
1189   "")
1190
1191 (define_insn ""
1192   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1193         (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r"))))]
1194   "TARGET_POWER"
1195   "nabs %0,%1")
1196
1197 (define_insn ""
1198   [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
1199         (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0"))))
1200    (clobber (match_scratch:SI 2 "=&r,&r"))]
1201   "!TARGET_POWER"
1202   "*
1203 {
1204   return (TARGET_POWERPC)
1205     ? \"{srai|srawi} %2,%1,31\;xor %0,%2,%1\;subf %0,%0,%2\"
1206     : \"{srai|srawi} %2,%1,31\;xor %0,%2,%1\;{sf|subfc} %0,%0,%2\";
1207 }"
1208   [(set_attr "length" "12")])
1209
1210 (define_split
1211   [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
1212         (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0"))))
1213    (clobber (match_scratch:SI 2 "=&r,&r"))]
1214   "!TARGET_POWER && reload_completed"
1215   [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
1216    (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
1217    (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 0)))]
1218   "")
1219
1220 (define_insn "negsi2"
1221   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1222         (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1223   ""
1224   "neg %0,%1")
1225
1226 (define_insn ""
1227   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1228         (compare:CC (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1229                     (const_int 0)))
1230    (clobber (match_scratch:SI 2 "=r"))]
1231   ""
1232   "neg. %2,%1"
1233   [(set_attr "type" "compare")])
1234
1235 (define_insn ""
1236   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
1237         (compare:CC (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1238                     (const_int 0)))
1239    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1240         (neg:SI (match_dup 1)))]
1241   ""
1242   "neg. %0,%1"
1243   [(set_attr "type" "compare")])
1244
1245 (define_insn "ffssi2"
1246   [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
1247         (ffs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1248   ""
1249   "neg %0,%1\;and %0,%0,%1\;{cntlz|cntlzw} %0,%0\;{sfi|subfic} %0,%0,32"
1250   [(set_attr "length" "16")])
1251
1252 (define_expand "mulsi3"
1253   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
1254    (use (match_operand:SI 1 "gpc_reg_operand" ""))
1255    (use (match_operand:SI 2 "reg_or_short_operand" ""))]
1256   ""
1257   "
1258 {
1259   if (TARGET_POWER)
1260     emit_insn (gen_mulsi3_mq (operands[0], operands[1], operands[2]));
1261   else
1262     emit_insn (gen_mulsi3_no_mq (operands[0], operands[1], operands[2]));
1263   DONE;
1264 }")
1265
1266 (define_insn "mulsi3_mq"
1267   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1268         (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
1269                  (match_operand:SI 2 "reg_or_short_operand" "r,I")))
1270    (clobber (match_scratch:SI 3 "=q,q"))]
1271   "TARGET_POWER"
1272   "@
1273    {muls|mullw} %0,%1,%2
1274    {muli|mulli} %0,%1,%2"
1275    [(set_attr "type" "imul")])
1276
1277 (define_insn "mulsi3_no_mq"
1278   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1279         (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
1280                  (match_operand:SI 2 "reg_or_short_operand" "r,I")))]
1281   "! TARGET_POWER"
1282   "@
1283    {muls|mullw} %0,%1,%2
1284    {muli|mulli} %0,%1,%2"
1285    [(set_attr "type" "imul")])
1286
1287 (define_insn ""
1288   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1289         (compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1290                              (match_operand:SI 2 "gpc_reg_operand" "r"))
1291                     (const_int 0)))
1292    (clobber (match_scratch:SI 3 "=r"))
1293    (clobber (match_scratch:SI 4 "=q"))]
1294   "TARGET_POWER"
1295   "{muls.|mullw.} %3,%1,%2"
1296   [(set_attr "type" "delayed_compare")])
1297
1298 (define_insn ""
1299   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1300         (compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1301                              (match_operand:SI 2 "gpc_reg_operand" "r"))
1302                     (const_int 0)))
1303    (clobber (match_scratch:SI 3 "=r"))]
1304   "! TARGET_POWER"
1305   "{muls.|mullw.} %3,%1,%2"
1306   [(set_attr "type" "delayed_compare")])
1307
1308 (define_insn ""
1309   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1310         (compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1311                              (match_operand:SI 2 "gpc_reg_operand" "r"))
1312                     (const_int 0)))
1313    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1314         (mult:SI (match_dup 1) (match_dup 2)))
1315    (clobber (match_scratch:SI 4 "=q"))]
1316   "TARGET_POWER"
1317   "{muls.|mullw.} %0,%1,%2"
1318   [(set_attr "type" "delayed_compare")])
1319
1320 (define_insn ""
1321   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1322         (compare:CC (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1323                              (match_operand:SI 2 "gpc_reg_operand" "r"))
1324                     (const_int 0)))
1325    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1326         (mult:SI (match_dup 1) (match_dup 2)))]
1327   "! TARGET_POWER"
1328   "{muls.|mullw.} %0,%1,%2"
1329   [(set_attr "type" "delayed_compare")])
1330
1331 ;; Operand 1 is divided by operand 2; quotient goes to operand
1332 ;; 0 and remainder to operand 3.
1333 ;; ??? At some point, see what, if anything, we can do about if (x % y == 0).
1334
1335 (define_expand "divmodsi4"
1336   [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
1337                    (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
1338                            (match_operand:SI 2 "gpc_reg_operand" "")))
1339               (set (match_operand:SI 3 "gpc_reg_operand" "")
1340                    (mod:SI (match_dup 1) (match_dup 2)))])]
1341   "TARGET_POWER || (! TARGET_POWER && ! TARGET_POWERPC)"
1342   "
1343 {
1344   if (! TARGET_POWER && ! TARGET_POWERPC)
1345     {
1346       emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
1347       emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
1348       emit_insn (gen_divss_call ());
1349       emit_move_insn (operands[0], gen_rtx (REG, SImode, 3));
1350       emit_move_insn (operands[3], gen_rtx (REG, SImode, 4));
1351       DONE;
1352     }
1353 }")
1354
1355 (define_insn ""
1356   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1357         (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1358                 (match_operand:SI 2 "gpc_reg_operand" "r")))
1359    (set (match_operand:SI 3 "gpc_reg_operand" "=q")
1360         (mod:SI (match_dup 1) (match_dup 2)))]
1361   "TARGET_POWER"
1362   "divs %0,%1,%2"
1363   [(set_attr "type" "idiv")])
1364
1365 (define_insn ""
1366   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1367         (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1368                 (match_operand:SI 2 "gpc_reg_operand" "r")))]
1369   "TARGET_POWERPC"
1370   "divw %0,%1,%2"
1371   [(set_attr "type" "idiv")])
1372
1373 (define_expand "udivsi3"
1374   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1375         (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
1376                  (match_operand:SI 2 "gpc_reg_operand" "")))]
1377   "TARGET_POWERPC || (! TARGET_POWER && ! TARGET_POWERPC)"
1378   "
1379 {
1380   if (! TARGET_POWER && ! TARGET_POWERPC)
1381     {
1382       emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
1383       emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
1384       emit_insn (gen_quous_call ());
1385       emit_move_insn (operands[0], gen_rtx (REG, SImode, 3));
1386       DONE;
1387     }
1388 }")
1389
1390 (define_insn ""
1391   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1392         (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1393                  (match_operand:SI 2 "gpc_reg_operand" "r")))]
1394   "TARGET_POWERPC"
1395   "divwu %0,%1,%2"
1396   [(set_attr "type" "idiv")])
1397
1398 ;; For powers of two we can do srai/aze for divide and then adjust for
1399 ;; modulus.  If it isn't a power of two, FAIL on POWER so divmodsi4 will be
1400 ;; used; for PowerPC, force operands into register and do a normal divide;
1401 ;; for AIX common-mode, use quoss call on register operands.
1402 (define_expand "divsi3"
1403   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1404         (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
1405                 (match_operand:SI 2 "reg_or_cint_operand" "")))]
1406   ""
1407   "
1408 {
1409   if (GET_CODE (operands[2]) == CONST_INT
1410       && exact_log2 (INTVAL (operands[2])) >= 0)
1411     ;
1412   else if (TARGET_POWERPC)
1413     operands[2] = force_reg (SImode, operands[2]);
1414   else if (TARGET_POWER)
1415     FAIL;
1416   else
1417     {
1418       emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
1419       emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
1420       emit_insn (gen_quoss_call ());
1421       emit_move_insn (operands[0], gen_rtx (REG, SImode, 3));
1422       DONE;
1423     }
1424 }")
1425
1426 (define_expand "modsi3"
1427   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
1428    (use (match_operand:SI 1 "gpc_reg_operand" ""))
1429    (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
1430   ""
1431   "
1432 {
1433   int i = exact_log2 (INTVAL (operands[2]));
1434   rtx temp1;
1435   rtx temp2;
1436
1437   if (GET_CODE (operands[2]) != CONST_INT || i < 0)
1438     FAIL;
1439
1440   temp1 = gen_reg_rtx (SImode);
1441   temp2 = gen_reg_rtx (SImode);
1442
1443   emit_insn (gen_divsi3 (temp1, operands[1], operands[2]));
1444   emit_insn (gen_ashlsi3 (temp2, temp1, GEN_INT (i)));
1445   emit_insn (gen_subsi3 (operands[0], operands[1], temp2));
1446   DONE;
1447 }")
1448
1449 (define_insn ""
1450   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1451         (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1452                 (match_operand:SI 2 "const_int_operand" "N")))]
1453   "exact_log2 (INTVAL (operands[2])) >= 0"
1454   "{srai|srawi} %0,%1,%p2\;{aze|addze} %0,%0"
1455   [(set_attr "length" "8")])
1456
1457 (define_insn ""
1458   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1459         (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1460                             (match_operand:SI 2 "const_int_operand" "N"))
1461                     (const_int 0)))
1462    (clobber (match_scratch:SI 3 "=r"))]
1463   "exact_log2 (INTVAL (operands[2])) >= 0"
1464   "{srai|srawi} %3,%1,%p2\;{aze.|addze.} %3,%3"
1465   [(set_attr "type" "compare")
1466    (set_attr "length" "8")])
1467
1468 (define_insn ""
1469   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1470         (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1471                             (match_operand:SI 2 "const_int_operand" "N"))
1472                     (const_int 0)))
1473    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1474         (div:SI (match_dup 1) (match_dup 2)))]
1475   "exact_log2 (INTVAL (operands[2])) >= 0"
1476   "{srai|srawi} %0,%1,%p2\;{aze.|addze.} %0,%0"
1477   [(set_attr "type" "compare")
1478    (set_attr "length" "8")])
1479
1480 (define_insn ""
1481   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1482         (udiv:SI
1483          (plus:DI (ashift:DI
1484                    (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
1485                    (const_int 32))
1486                   (zero_extend:DI (match_operand:SI 4 "register_operand" "2")))
1487          (match_operand:SI 3 "gpc_reg_operand" "r")))
1488    (set (match_operand:SI 2 "register_operand" "=*q")
1489         (umod:SI
1490          (plus:DI (ashift:DI
1491                    (zero_extend:DI (match_dup 1)) (const_int 32))
1492                   (zero_extend:DI (match_dup 4)))
1493          (match_dup 3)))]
1494   "TARGET_POWER"
1495   "div %0,%1,%3"
1496   [(set_attr "type" "idiv")])
1497
1498 ;; To do unsigned divide we handle the cases of the divisor looking like a
1499 ;; negative number.  If it is a constant that is less than 2**31, we don't
1500 ;; have to worry about the branches.  So make a few subroutines here.
1501 ;;
1502 ;; First comes the normal case.
1503 (define_expand "udivmodsi4_normal"
1504   [(set (match_dup 4) (const_int 0))
1505    (parallel [(set (match_operand:SI 0 "" "")
1506                    (udiv:SI (plus:DI (ashift:DI (zero_extend:DI (match_dup 4))
1507                                                 (const_int 32))
1508                                      (zero_extend:DI (match_operand:SI 1 "" "")))
1509                             (match_operand:SI 2 "" "")))
1510               (set (match_operand:SI 3 "" "")
1511                    (umod:SI (plus:DI (ashift:DI (zero_extend:DI (match_dup 4))
1512                                                 (const_int 32))
1513                                      (zero_extend:DI (match_dup 1)))
1514                             (match_dup 2)))])]
1515   "TARGET_POWER"
1516   "
1517 { operands[4] = gen_reg_rtx (SImode); }")
1518
1519 ;; This handles the branches.
1520 (define_expand "udivmodsi4_tests"
1521   [(set (match_operand:SI 0 "" "") (const_int 0))
1522    (set (match_operand:SI 3 "" "") (match_operand:SI 1 "" ""))
1523    (set (match_dup 5) (compare:CCUNS (match_dup 1) (match_operand:SI 2 "" "")))
1524    (set (pc) (if_then_else (ltu (match_dup 5) (const_int 0))
1525                            (label_ref (match_operand:SI 4 "" "")) (pc)))
1526    (set (match_dup 0) (const_int 1))
1527    (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2)))
1528    (set (match_dup 6) (compare:CC (match_dup 2) (const_int 0)))
1529    (set (pc) (if_then_else (lt (match_dup 6) (const_int 0))
1530                            (label_ref (match_dup 4)) (pc)))]
1531   "TARGET_POWER"
1532   "
1533 { operands[5] = gen_reg_rtx (CCUNSmode);
1534   operands[6] = gen_reg_rtx (CCmode);
1535 }")
1536
1537 (define_expand "udivmodsi4"
1538   [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
1539                    (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
1540                             (match_operand:SI 2 "reg_or_cint_operand" "")))
1541               (set (match_operand:SI 3 "gpc_reg_operand" "")
1542                    (umod:SI (match_dup 1) (match_dup 2)))])]
1543   ""
1544   "
1545 {
1546   rtx label = 0;
1547
1548   if (! TARGET_POWER)
1549     if (! TARGET_POWERPC)
1550       {
1551         emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
1552         emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
1553         emit_insn (gen_divus_call ());
1554         emit_move_insn (operands[0], gen_rtx (REG, SImode, 3));
1555         emit_move_insn (operands[3], gen_rtx (REG, SImode, 4));
1556         DONE;
1557       }
1558     else
1559       FAIL;
1560
1561   if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 0)
1562     {
1563       operands[2] = force_reg (SImode, operands[2]);
1564       label = gen_label_rtx ();
1565       emit (gen_udivmodsi4_tests (operands[0], operands[1], operands[2],
1566                                   operands[3], label));
1567     }
1568   else
1569     operands[2] = force_reg (SImode, operands[2]);
1570
1571   emit (gen_udivmodsi4_normal (operands[0], operands[1], operands[2],
1572                                operands[3]));
1573   if (label)
1574     emit_label (label);
1575
1576   DONE;
1577 }")
1578
1579 ;; AIX architecture-independent common-mode multiply (DImode),
1580 ;; divide/modulus, and quotient subroutine calls.  Input operands in R3 and
1581 ;; R4; results in R3 and sometimes R4; link register always clobbered by bla
1582 ;; instruction; R0 sometimes clobbered; also, MQ sometimes clobbered but
1583 ;; assumed unused if generating common-mode, so ignore.
1584 (define_insn "mulh_call"
1585   [(set (reg:SI 3)
1586         (truncate:SI
1587          (lshiftrt:DI (mult:DI (sign_extend:DI (reg:SI 3))
1588                                (sign_extend:DI (reg:SI 4)))
1589                       (const_int 32))))
1590    (clobber (match_scratch:SI 0 "=l"))]
1591   "! TARGET_POWER && ! TARGET_POWERPC"
1592   "bla __mulh"
1593   [(set_attr "type" "imul")])
1594
1595 (define_insn "mull_call"
1596   [(set (reg:DI 3)
1597         (mult:DI (sign_extend:DI (reg:SI 3))
1598                  (sign_extend:DI (reg:SI 4))))
1599    (clobber (match_scratch:SI 0 "=l"))
1600    (clobber (reg:SI 0))]
1601   "! TARGET_POWER && ! TARGET_POWERPC"
1602   "bla __mull"
1603   [(set_attr "type" "imul")])
1604
1605 (define_insn "divss_call"
1606   [(set (reg:SI 3)
1607         (div:SI (reg:SI 3) (reg:SI 4)))
1608    (set (reg:SI 4)
1609         (mod:SI (reg:SI 3) (reg:SI 4)))
1610    (clobber (match_scratch:SI 0 "=l"))
1611    (clobber (reg:SI 0))]
1612   "! TARGET_POWER && ! TARGET_POWERPC"
1613   "bla __divss"
1614   [(set_attr "type" "idiv")])
1615
1616 (define_insn "divus_call"
1617   [(set (reg:SI 3)
1618         (udiv:SI (reg:SI 3) (reg:SI 4)))
1619    (set (reg:SI 4)
1620         (umod:SI (reg:SI 3) (reg:SI 4)))
1621    (clobber (match_scratch:SI 0 "=l"))
1622    (clobber (reg:SI 0))
1623    (clobber (match_scratch:CC 1 "=x"))
1624    (clobber (reg:CC 69))]
1625   "! TARGET_POWER && ! TARGET_POWERPC"
1626   "bla __divus"
1627   [(set_attr "type" "idiv")])
1628
1629 (define_insn "quoss_call"
1630   [(set (reg:SI 3)
1631         (div:SI (reg:SI 3) (reg:SI 4)))
1632    (clobber (match_scratch:SI 0 "=l"))]
1633   "! TARGET_POWER && ! TARGET_POWERPC"
1634   "bla __quoss"
1635   [(set_attr "type" "idiv")])
1636
1637 (define_insn "quous_call"
1638   [(set (reg:SI 3)
1639         (udiv:SI (reg:SI 3) (reg:SI 4)))
1640    (clobber (match_scratch:SI 0 "=l"))
1641    (clobber (reg:SI 0))
1642    (clobber (match_scratch:CC 1 "=x"))
1643    (clobber (reg:CC 69))]
1644   "! TARGET_POWER && ! TARGET_POWERPC"
1645   "bla __quous"
1646   [(set_attr "type" "idiv")])
1647 \f
1648 (define_insn "andsi3"
1649   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
1650         (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r")
1651                 (match_operand:SI 2 "and_operand" "?r,L,K,J")))
1652    (clobber (match_scratch:CC 3 "=X,X,x,x"))]
1653   ""
1654   "@
1655    and %0,%1,%2
1656    {rlinm|rlwinm} %0,%1,0,%m2,%M2
1657    {andil.|andi.} %0,%1,%b2
1658    {andiu.|andis.} %0,%1,%u2")
1659
1660 (define_insn ""
1661   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x")
1662         (compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r")
1663                             (match_operand:SI 2 "and_operand" "r,K,J,L"))
1664                     (const_int 0)))
1665    (clobber (match_scratch:SI 3 "=r,r,r,r"))]
1666   ""
1667   "@
1668    and. %3,%1,%2
1669    {andil.|andi.} %3,%1,%b2
1670    {andiu.|andis.} %3,%1,%u2
1671    {rlinm.|rlwinm.} %3,%1,0,%m2,%M2"
1672   [(set_attr "type" "compare,compare,compare,delayed_compare")])
1673
1674 (define_insn ""
1675   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x")
1676         (compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r")
1677                             (match_operand:SI 2 "and_operand" "r,K,J,L"))
1678                     (const_int 0)))
1679    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
1680         (and:SI (match_dup 1) (match_dup 2)))]
1681   ""
1682   "@
1683    and. %0,%1,%2
1684    {andil.|andi.} %0,%1,%b2
1685    {andiu.|andis.} %0,%1,%u2
1686    {rlinm.|rlwinm.} %0,%1,0,%m2,%M2"
1687   [(set_attr "type" "compare,compare,compare,delayed_compare")])
1688
1689 ;; Take a AND with a constant that cannot be done in a single insn and try to
1690 ;; split it into two insns.  This does not verify that the insns are valid
1691 ;; since this need not be done as combine will do it.
1692
1693 (define_split
1694   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1695         (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
1696                 (match_operand:SI 2 "non_and_cint_operand" "")))]
1697   ""
1698   [(set (match_dup 0) (and:SI (match_dup 1) (match_dup 3)))
1699    (set (match_dup 0) (and:SI (match_dup 0) (match_dup 4)))]
1700   "
1701 {
1702   int maskval = INTVAL (operands[2]);
1703   int i, transitions, last_bit_value;
1704   int orig = maskval, first_c = maskval, second_c;
1705
1706   /* We know that MASKVAL must have more than 2 bit-transitions.  Start at
1707      the low-order bit and count for the third transition.  When we get there,
1708      make a first mask that has everything to the left of that position
1709      a one.  Then make the second mask to turn off whatever else is needed.  */
1710
1711   for (i = 1, transitions = 0, last_bit_value = maskval & 1; i < 32; i++)
1712     {
1713       if (((maskval >>= 1) & 1) != last_bit_value)
1714         last_bit_value ^= 1, transitions++;
1715
1716       if (transitions > 2)
1717         {
1718           first_c |= (~0) << i;
1719           break;
1720         }
1721     }
1722
1723   second_c = orig | ~ first_c;
1724
1725   operands[3] = gen_rtx (CONST_INT, VOIDmode, first_c);
1726   operands[4] = gen_rtx (CONST_INT, VOIDmode, second_c);
1727 }")
1728
1729 (define_insn "iorsi3"
1730   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
1731         (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r")
1732                 (match_operand:SI 2 "logical_operand" "r,K,J")))]
1733   ""
1734   "@
1735    or %0,%1,%2
1736    {oril|ori} %0,%1,%b2
1737    {oriu|oris} %0,%1,%u2")
1738
1739 (define_insn ""
1740   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1741         (compare:CC (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1742                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1743                     (const_int 0)))
1744    (clobber (match_scratch:SI 3 "=r"))]
1745   ""
1746   "or. %3,%1,%2"
1747   [(set_attr "type" "compare")])
1748
1749 (define_insn ""
1750   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1751         (compare:CC (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1752                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1753                     (const_int 0)))
1754    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1755         (ior:SI (match_dup 1) (match_dup 2)))]
1756   ""
1757   "or. %0,%1,%2"
1758   [(set_attr "type" "compare")])
1759
1760 ;; Split an IOR that we can't do in one insn into two insns, each of which
1761 ;; does one 16-bit part.  This is used by combine.
1762
1763 (define_split
1764   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1765         (ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
1766                 (match_operand:SI 2 "non_logical_cint_operand" "")))]
1767   ""
1768   [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 3)))
1769    (set (match_dup 0) (ior:SI (match_dup 0) (match_dup 4)))]
1770 "
1771 {
1772   operands[3] = gen_rtx (CONST_INT, VOIDmode,
1773                          INTVAL (operands[2]) & 0xffff0000);
1774   operands[4] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0xffff);
1775 }")
1776
1777 (define_insn "xorsi3"
1778   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
1779         (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r")
1780                 (match_operand:SI 2 "logical_operand" "r,K,J")))]
1781   ""
1782   "@
1783    xor %0,%1,%2
1784    {xoril|xori} %0,%1,%b2
1785    {xoriu|xoris} %0,%1,%u2")
1786
1787 (define_insn ""
1788   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1789         (compare:CC (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1790                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1791                     (const_int 0)))
1792    (clobber (match_scratch:SI 3 "=r"))]
1793   ""
1794   "xor. %3,%1,%2"
1795   [(set_attr "type" "compare")])
1796
1797 (define_insn ""
1798   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1799         (compare:CC (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1800                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1801                     (const_int 0)))
1802    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1803         (xor:SI (match_dup 1) (match_dup 2)))]
1804   ""
1805   "xor. %0,%1,%2"
1806   [(set_attr "type" "compare")])
1807
1808 ;; Split an XOR that we can't do in one insn into two insns, each of which
1809 ;; does one 16-bit part.  This is used by combine.
1810
1811 (define_split
1812   [(set (match_operand:SI 0 "gpc_reg_operand" "")
1813         (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
1814                 (match_operand:SI 2 "non_logical_cint_operand" "")))]
1815   ""
1816   [(set (match_dup 0) (xor:SI (match_dup 1) (match_dup 3)))
1817    (set (match_dup 0) (xor:SI (match_dup 0) (match_dup 4)))]
1818 "
1819 {
1820   operands[3] = gen_rtx (CONST_INT, VOIDmode,
1821                          INTVAL (operands[2]) & 0xffff0000);
1822   operands[4] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0xffff);
1823 }")
1824
1825 (define_insn ""
1826   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1827         (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1828                         (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1829    ""
1830    "eqv %0,%1,%2")
1831
1832 (define_insn ""
1833   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1834         (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1835                                     (match_operand:SI 2 "gpc_reg_operand" "r")))
1836                     (const_int 0)))
1837    (clobber (match_scratch:SI 3 "=r"))]
1838    ""
1839    "eqv. %3,%1,%2"
1840    [(set_attr "type" "compare")])
1841
1842 (define_insn ""
1843   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1844         (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1845                                     (match_operand:SI 2 "gpc_reg_operand" "r")))
1846                     (const_int 0)))
1847    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1848         (not:SI (xor:SI (match_dup 1) (match_dup 2))))]
1849    ""
1850    "eqv. %0,%1,%2"
1851    [(set_attr "type" "compare")])
1852
1853 (define_insn ""
1854   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1855         (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1856                 (match_operand:SI 2 "gpc_reg_operand" "r")))]
1857   ""
1858   "andc %0,%2,%1")
1859
1860 (define_insn ""
1861   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1862         (compare:CC (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1863                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1864                     (const_int 0)))
1865    (clobber (match_scratch:SI 3 "=r"))]
1866   ""
1867   "andc. %3,%2,%1"
1868   [(set_attr "type" "compare")])
1869
1870 (define_insn ""
1871   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1872         (compare:CC (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1873                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1874                     (const_int 0)))
1875    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1876         (and:SI (not:SI (match_dup 1)) (match_dup 2)))]
1877   ""
1878   "andc. %0,%2,%1"
1879   [(set_attr "type" "compare")])
1880
1881 (define_insn ""
1882   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1883         (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1884                 (match_operand:SI 2 "gpc_reg_operand" "r")))]
1885   ""
1886   "orc %0,%2,%1")
1887
1888 (define_insn ""
1889   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1890         (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1891                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1892                     (const_int 0)))
1893    (clobber (match_scratch:SI 3 "=r"))]
1894   ""
1895   "orc. %3,%2,%1"
1896   [(set_attr "type" "compare")])
1897
1898 (define_insn ""
1899   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1900         (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1901                             (match_operand:SI 2 "gpc_reg_operand" "r"))
1902                     (const_int 0)))
1903    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1904         (ior:SI (not:SI (match_dup 1)) (match_dup 2)))]
1905   ""
1906   "orc. %0,%2,%1"
1907   [(set_attr "type" "compare")])
1908
1909 (define_insn ""
1910   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1911         (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1912                 (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1913   ""
1914   "nand %0,%1,%2")
1915
1916 (define_insn ""
1917   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1918         (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1919                             (not:SI (match_operand:SI 2 "gpc_reg_operand" "r")))
1920                     (const_int 0)))
1921    (clobber (match_scratch:SI 3 "=r"))]
1922   ""
1923   "nand. %3,%1,%2"
1924   [(set_attr "type" "compare")])
1925
1926 (define_insn ""
1927   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1928         (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1929                             (not:SI (match_operand:SI 2 "gpc_reg_operand" "r")))
1930                     (const_int 0)))
1931    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1932         (ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]
1933   ""
1934   "nand. %0,%1,%2"
1935   [(set_attr "type" "compare")])
1936
1937 (define_insn ""
1938   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1939         (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1940                 (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1941   ""
1942   "nor %0,%1,%2")
1943
1944 (define_insn ""
1945   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1946         (compare:CC (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1947                             (not:SI (match_operand:SI 2 "gpc_reg_operand" "r")))
1948                     (const_int 0)))
1949    (clobber (match_scratch:SI 3 "=r"))]
1950   ""
1951   "nor. %3,%1,%2"
1952   [(set_attr "type" "compare")])
1953
1954 (define_insn ""
1955   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1956         (compare:CC (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1957                             (not:SI (match_operand:SI 2 "gpc_reg_operand" "r")))
1958                     (const_int 0)))
1959    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
1960         (and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]
1961   ""
1962   "nor. %0,%1,%2"
1963   [(set_attr "type" "compare")])
1964
1965 ;; maskir insn.  We need four forms because things might be in arbitrary
1966 ;; orders.  Don't define forms that only set CR fields because these
1967 ;; would modify an input register.
1968
1969 (define_insn ""
1970   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1971         (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
1972                         (match_operand:SI 1 "gpc_reg_operand" "0"))
1973                 (and:SI (match_dup 2)
1974                         (match_operand:SI 3 "gpc_reg_operand" "r"))))]
1975   "TARGET_POWER"
1976   "maskir %0,%3,%2")
1977
1978 (define_insn ""
1979   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1980         (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
1981                         (match_operand:SI 1 "gpc_reg_operand" "0"))
1982                 (and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
1983                         (match_dup 2))))]
1984   "TARGET_POWER"
1985   "maskir %0,%3,%2")
1986
1987 (define_insn ""
1988   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1989         (ior:SI (and:SI (match_operand:SI 2 "gpc_reg_operand" "r")
1990                         (match_operand:SI 3 "gpc_reg_operand" "r"))
1991                 (and:SI (not:SI (match_dup 2))
1992                         (match_operand:SI 1 "gpc_reg_operand" "0"))))]
1993   "TARGET_POWER"
1994   "maskir %0,%3,%2")
1995
1996 (define_insn ""
1997   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1998         (ior:SI (and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
1999                         (match_operand:SI 2 "gpc_reg_operand" "r"))
2000                 (and:SI (not:SI (match_dup 2))
2001                         (match_operand:SI 1 "gpc_reg_operand" "0"))))]
2002   "TARGET_POWER"
2003   "maskir %0,%3,%2")
2004
2005 (define_insn ""
2006   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2007         (compare:CC
2008          (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
2009                          (match_operand:SI 1 "gpc_reg_operand" "0"))
2010                  (and:SI (match_dup 2)
2011                          (match_operand:SI 3 "gpc_reg_operand" "r")))
2012          (const_int 0)))
2013    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2014         (ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
2015                 (and:SI (match_dup 2) (match_dup 3))))]
2016   "TARGET_POWER"
2017   "maskir. %0,%3,%2"
2018   [(set_attr "type" "compare")])
2019
2020 (define_insn ""
2021   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2022         (compare:CC
2023          (ior:SI (and:SI (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))
2024                          (match_operand:SI 1 "gpc_reg_operand" "0"))
2025                  (and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2026                          (match_dup 2)))
2027          (const_int 0)))
2028    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2029         (ior:SI (and:SI (not:SI (match_dup 2)) (match_dup 1))
2030                 (and:SI (match_dup 3) (match_dup 2))))]
2031   "TARGET_POWER"
2032   "maskir. %0,%3,%2"
2033   [(set_attr "type" "compare")])
2034
2035 (define_insn ""
2036   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2037         (compare:CC
2038          (ior:SI (and:SI (match_operand:SI 2 "gpc_reg_operand" "r")
2039                          (match_operand:SI 3 "gpc_reg_operand" "r"))
2040                  (and:SI (not:SI (match_dup 2))
2041                          (match_operand:SI 1 "gpc_reg_operand" "0")))
2042          (const_int 0)))
2043    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2044         (ior:SI (and:SI (match_dup 2) (match_dup 3))
2045                 (and:SI (not:SI (match_dup 2)) (match_dup 1))))]
2046   "TARGET_POWER"
2047   "maskir. %0,%3,%2"
2048   [(set_attr "type" "compare")])
2049
2050 (define_insn ""
2051   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2052         (compare:CC
2053          (ior:SI (and:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2054                          (match_operand:SI 2 "gpc_reg_operand" "r"))
2055                  (and:SI (not:SI (match_dup 2))
2056                          (match_operand:SI 1 "gpc_reg_operand" "0")))
2057          (const_int 0)))
2058    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2059         (ior:SI (and:SI (match_dup 3) (match_dup 2))
2060                 (and:SI (not:SI (match_dup 2)) (match_dup 1))))]
2061   "TARGET_POWER"
2062   "maskir. %0,%3,%2"
2063   [(set_attr "type" "compare")])
2064 \f
2065 ;; Rotate and shift insns, in all their variants.  These support shifts,
2066 ;; field inserts and extracts, and various combinations thereof.
2067 (define_expand "insv"
2068   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2069                          (match_operand:SI 1 "const_int_operand" "i")
2070                          (match_operand:SI 2 "const_int_operand" "i"))
2071         (match_operand:SI 3 "gpc_reg_operand" "r"))]
2072   ""
2073   "
2074 {
2075   /* Do not handle 16/8 bit structures that fit in HI/QI modes directly, since
2076      the (SUBREG:SI (REG:HI xxx)) that is otherwise generated can confuse the
2077      compiler if the address of the structure is taken later.  */
2078   if (GET_CODE (operands[0]) == SUBREG
2079       && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[0]))) < UNITS_PER_WORD))
2080     FAIL;
2081 }")
2082
2083 (define_insn ""
2084   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2085                          (match_operand:SI 1 "const_int_operand" "i")
2086                          (match_operand:SI 2 "const_int_operand" "i"))
2087         (match_operand:SI 3 "gpc_reg_operand" "r"))]
2088   ""
2089   "*
2090 {
2091   int start = INTVAL (operands[2]) & 31;
2092   int size = INTVAL (operands[1]) & 31;
2093
2094   operands[4] = gen_rtx (CONST_INT, VOIDmode, 32 - start - size);
2095   operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1);
2096   return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
2097 }")
2098
2099 (define_insn ""
2100   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2101                          (match_operand:SI 1 "const_int_operand" "i")
2102                          (match_operand:SI 2 "const_int_operand" "i"))
2103         (ashift:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2104                    (match_operand:SI 4 "const_int_operand" "i")))]
2105   ""
2106   "*
2107 {
2108   int shift = INTVAL (operands[4]) & 31;
2109   int start = INTVAL (operands[2]) & 31;
2110   int size = INTVAL (operands[1]) & 31;
2111
2112   operands[4] = gen_rtx (CONST_INT, VOIDmode, shift - start - size);
2113   operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1);
2114   return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
2115 }")
2116
2117 (define_insn ""
2118   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2119                          (match_operand:SI 1 "const_int_operand" "i")
2120                          (match_operand:SI 2 "const_int_operand" "i"))
2121         (ashiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2122                      (match_operand:SI 4 "const_int_operand" "i")))]
2123   ""
2124   "*
2125 {
2126   int shift = INTVAL (operands[4]) & 31;
2127   int start = INTVAL (operands[2]) & 31;
2128   int size = INTVAL (operands[1]) & 31;
2129
2130   operands[4] = gen_rtx (CONST_INT, VOIDmode, 32 - shift - start - size);
2131   operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1);
2132   return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
2133 }")
2134
2135 (define_insn ""
2136   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2137                          (match_operand:SI 1 "const_int_operand" "i")
2138                          (match_operand:SI 2 "const_int_operand" "i"))
2139         (lshiftrt:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2140                      (match_operand:SI 4 "const_int_operand" "i")))]
2141   ""
2142   "*
2143 {
2144   int shift = INTVAL (operands[4]) & 31;
2145   int start = INTVAL (operands[2]) & 31;
2146   int size = INTVAL (operands[1]) & 31;
2147
2148   operands[4] = gen_rtx (CONST_INT, VOIDmode, 32 - shift - start - size);
2149   operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1);
2150   return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
2151 }")
2152
2153 (define_insn ""
2154   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2155                          (match_operand:SI 1 "const_int_operand" "i")
2156                          (match_operand:SI 2 "const_int_operand" "i"))
2157         (zero_extract:SI (match_operand:SI 3 "gpc_reg_operand" "r")
2158                          (match_operand:SI 4 "const_int_operand" "i")
2159                          (match_operand:SI 5 "const_int_operand" "i")))]
2160   "INTVAL (operands[4]) >= INTVAL (operands[1])"
2161   "*
2162 {
2163   int extract_start = INTVAL (operands[5]) & 31;
2164   int extract_size = INTVAL (operands[4]) & 31;
2165   int insert_start = INTVAL (operands[2]) & 31;
2166   int insert_size = INTVAL (operands[1]) & 31;
2167
2168 /* Align extract field with insert field */
2169   operands[5] = gen_rtx (CONST_INT, VOIDmode,
2170                          extract_start + extract_size - insert_start - insert_size);
2171   operands[1] = gen_rtx (CONST_INT, VOIDmode, insert_start + insert_size - 1);
2172   return \"{rlimi|rlwimi} %0,%3,%h5,%h2,%h1\";
2173 }")
2174
2175 (define_insn ""
2176   [(set (zero_extract:DI (match_operand:DI 0 "gpc_reg_operand" "+r")
2177                          (match_operand:DI 1 "const_int_operand" "i")
2178                          (match_operand:DI 2 "const_int_operand" "i"))
2179         (match_operand:DI 3 "gpc_reg_operand" "r"))]
2180   "TARGET_POWERPC64"
2181   "*
2182 {
2183   int start = INTVAL (operands[2]) & 63;
2184   int size = INTVAL (operands[1]) & 63;
2185
2186   operands[2] = gen_rtx (CONST_INT, VOIDmode, 64 - start - size);
2187   return \"rldimi %0,%3,%H2,%H1\";
2188 }")
2189
2190 (define_expand "extzv"
2191   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2192         (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2193                          (match_operand:SI 2 "const_int_operand" "i")
2194                          (match_operand:SI 3 "const_int_operand" "i")))]
2195   ""
2196   "
2197 {
2198   /* Do not handle 16/8 bit structures that fit in HI/QI modes directly, since
2199      the (SUBREG:SI (REG:HI xxx)) that is otherwise generated can confuse the
2200      compiler if the address of the structure is taken later.  */
2201   if (GET_CODE (operands[0]) == SUBREG
2202       && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[0]))) < UNITS_PER_WORD))
2203     FAIL;
2204 }")
2205
2206 (define_insn ""
2207   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2208         (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2209                          (match_operand:SI 2 "const_int_operand" "i")
2210                          (match_operand:SI 3 "const_int_operand" "i")))]
2211   ""
2212   "*
2213 {
2214   int start = INTVAL (operands[3]) & 31;
2215   int size = INTVAL (operands[2]) & 31;
2216
2217   if (start + size >= 32)
2218     operands[3] = const0_rtx;
2219   else
2220     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2221   return \"{rlinm|rlwinm} %0,%1,%3,%s2,31\";
2222 }")
2223
2224 (define_insn ""
2225   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2226         (compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2227                          (match_operand:SI 2 "const_int_operand" "i")
2228                          (match_operand:SI 3 "const_int_operand" "i"))
2229                     (const_int 0)))
2230    (clobber (match_scratch:SI 4 "=r"))]
2231   ""
2232   "*
2233 {
2234   int start = INTVAL (operands[3]) & 31;
2235   int size = INTVAL (operands[2]) & 31;
2236
2237   /* If the bitfield being tested fits in the upper or lower half of a
2238      word, it is possible to use andiu. or andil. to test it.  This is
2239      useful because the condition register set-use delay is smaller for
2240      andi[ul]. than for rlinm.  This doesn't work when the starting bit
2241      position is 0 because the LT and GT bits may be set wrong.  */
2242
2243   if ((start > 0 && start + size <= 16) || start >= 16)
2244     {
2245       operands[3] = gen_rtx (CONST_INT, VOIDmode,
2246                              ((1 << (16 - (start & 15)))
2247                               - (1 << (16 - (start & 15) - size))));
2248       if (start < 16)
2249         return \"{andiu.|andis.} %4,%1,%3\";
2250       else
2251         return \"{andil.|andi.} %4,%1,%3\";
2252     }
2253
2254   if (start + size >= 32)
2255     operands[3] = const0_rtx;
2256   else
2257     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2258   return \"{rlinm.|rlwinm.} %4,%1,%3,%s2,31\";
2259 }"
2260   [(set_attr "type" "compare")])
2261
2262 (define_insn ""
2263   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2264         (compare:CC (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2265                          (match_operand:SI 2 "const_int_operand" "i")
2266                          (match_operand:SI 3 "const_int_operand" "i"))
2267                     (const_int 0)))
2268    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2269         (zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))]
2270   ""
2271   "*
2272 {
2273   int start = INTVAL (operands[3]) & 31;
2274   int size = INTVAL (operands[2]) & 31;
2275
2276   if (start >= 16 && start + size == 32)
2277     {
2278       operands[3] = gen_rtx (CONST_INT, VOIDmode, (1 << (32 - start)) - 1);
2279       return \"{andil.|andi.} %0,%1,%3\";
2280     }
2281
2282   if (start + size >= 32)
2283     operands[3] = const0_rtx;
2284   else
2285     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2286   return \"{rlinm.|rlwinm.} %0,%1,%3,%s2,31\";
2287 }"
2288   [(set_attr "type" "delayed_compare")])
2289
2290 (define_insn ""
2291   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
2292         (zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
2293                          (match_operand:DI 2 "const_int_operand" "i")
2294                          (match_operand:DI 3 "const_int_operand" "i")))]
2295   "TARGET_POWERPC64"
2296   "*
2297 {
2298   int start = INTVAL (operands[3]) & 63;
2299   int size = INTVAL (operands[2]) & 63;
2300
2301   if (start + size >= 64)
2302     operands[3] = const0_rtx;
2303   else
2304     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2305   operands[2] = gen_rtx (CONST_INT, VOIDmode, 64 - size);
2306   return \"rldicl %0,%1,%3,%2\";
2307 }")
2308
2309 (define_insn ""
2310   [(set (match_operand:CC 0 "gpc_reg_operand" "=x")
2311         (compare:CC (zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
2312                          (match_operand:DI 2 "const_int_operand" "i")
2313                          (match_operand:DI 3 "const_int_operand" "i"))
2314                     (const_int 0)))
2315    (clobber (match_scratch:DI 4 "=r"))]
2316   "TARGET_POWERPC64"
2317   "*
2318 {
2319   int start = INTVAL (operands[3]) & 63;
2320   int size = INTVAL (operands[2]) & 63;
2321
2322   if (start + size >= 64)
2323     operands[3] = const0_rtx;
2324   else
2325     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2326   operands[2] = gen_rtx (CONST_INT, VOIDmode, 64 - size);
2327   return \"rldicl. %4,%1,%3,%2\";
2328 }")
2329
2330 (define_insn ""
2331   [(set (match_operand:CC 4 "gpc_reg_operand" "=x")
2332         (compare:CC (zero_extract:DI (match_operand:DI 1 "gpc_reg_operand" "r")
2333                          (match_operand:DI 2 "const_int_operand" "i")
2334                          (match_operand:DI 3 "const_int_operand" "i"))
2335                     (const_int 0)))
2336    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
2337         (zero_extract:DI (match_dup 1) (match_dup 2) (match_dup 3)))]
2338   "TARGET_POWERPC64"
2339   "*
2340 {
2341   int start = INTVAL (operands[3]) & 63;
2342   int size = INTVAL (operands[2]) & 63;
2343
2344   if (start + size >= 64)
2345     operands[3] = const0_rtx;
2346   else
2347     operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
2348   operands[2] = gen_rtx (CONST_INT, VOIDmode, 64 - size);
2349   return \"rldicl. %0,%1,%3,%2\";
2350 }")
2351
2352 (define_insn "rotlsi3"
2353   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2354         (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2355                    (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
2356   ""
2357   "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xffffffff")
2358
2359 (define_insn ""
2360   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2361         (compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2362                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2363                     (const_int 0)))
2364    (clobber (match_scratch:SI 3 "=r"))]
2365   ""
2366   "{rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xffffffff"
2367   [(set_attr "type" "delayed_compare")])
2368
2369 (define_insn ""
2370   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2371         (compare:CC (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2372                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2373                     (const_int 0)))
2374    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2375         (rotate:SI (match_dup 1) (match_dup 2)))]
2376   ""
2377   "{rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xffffffff"
2378   [(set_attr "type" "delayed_compare")])
2379
2380 (define_insn ""
2381   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2382         (and:SI (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2383                            (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2384                 (match_operand:SI 3 "mask_operand" "L")))]
2385   ""
2386   "{rl%I2nm|rlw%I2nm} %0,%1,%h2,%m3,%M3")
2387
2388 (define_insn ""
2389   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2390         (compare:CC (and:SI
2391                      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2392                                 (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2393                      (match_operand:SI 3 "mask_operand" "L"))
2394                     (const_int 0)))
2395    (clobber (match_scratch:SI 4 "=r"))]
2396   ""
2397   "{rl%I2nm.|rlw%I2nm.} %4,%1,%h2,%m3,%M3"
2398   [(set_attr "type" "delayed_compare")])
2399
2400 (define_insn ""
2401   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2402         (compare:CC (and:SI
2403                      (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2404                                 (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2405                      (match_operand:SI 3 "mask_operand" "L"))
2406                     (const_int 0)))
2407    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2408         (and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
2409   ""
2410   "{rl%I2nm.|rlw%I2nm.} %0,%1,%h2,%m3,%M3"
2411   [(set_attr "type" "delayed_compare")])
2412
2413 (define_insn ""
2414   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2415         (zero_extend:SI
2416          (subreg:QI
2417           (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2418                      (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
2419   ""
2420   "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xff")
2421
2422 (define_insn ""
2423   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2424         (compare:CC (zero_extend:SI
2425                      (subreg:QI
2426                       (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2427                                  (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
2428                     (const_int 0)))
2429    (clobber (match_scratch:SI 3 "=r"))]
2430   ""
2431   "{rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xff"
2432   [(set_attr "type" "delayed_compare")])
2433
2434 (define_insn ""
2435   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2436         (compare:CC (zero_extend:SI
2437                      (subreg:QI
2438                       (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2439                                  (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
2440                     (const_int 0)))
2441    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2442         (zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
2443   ""
2444   "{rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xff"
2445   [(set_attr "type" "delayed_compare")])
2446
2447 (define_insn ""
2448   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2449         (zero_extend:SI
2450          (subreg:HI
2451           (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2452                      (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
2453   ""
2454   "{rl%I2nm|rlw%I2nm} %0,%1,%h2,0xffff")
2455
2456 (define_insn ""
2457   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2458         (compare:CC (zero_extend:SI
2459                      (subreg:HI
2460                       (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2461                                  (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
2462                     (const_int 0)))
2463    (clobber (match_scratch:SI 3 "=r"))]
2464   ""
2465   "{rl%I2nm.|rlw%I2nm.} %3,%1,%h2,0xffff"
2466   [(set_attr "type" "delayed_compare")])
2467
2468 (define_insn ""
2469   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2470         (compare:CC (zero_extend:SI
2471                      (subreg:HI
2472                       (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2473                                  (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
2474                     (const_int 0)))
2475    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2476         (zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
2477   ""
2478   "{rl%I2nm.|rlw%I2nm.} %0,%1,%h2,0xffff"
2479   [(set_attr "type" "delayed_compare")])
2480
2481 ;; Note that we use "sle." instead of "sl." so that we can set
2482 ;; SHIFT_COUNT_TRUNCATED.
2483
2484 (define_expand "ashlsi3"
2485   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
2486    (use (match_operand:SI 1 "gpc_reg_operand" ""))
2487    (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
2488   ""
2489   "
2490 {
2491   if (TARGET_POWER)
2492     emit_insn (gen_ashlsi3_power (operands[0], operands[1], operands[2]));
2493   else
2494     emit_insn (gen_ashlsi3_no_power (operands[0], operands[1], operands[2]));
2495   DONE;
2496 }")
2497
2498 (define_insn "ashlsi3_power"
2499   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2500         (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2501                    (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
2502    (clobber (match_scratch:SI 3 "=q,X"))]
2503   "TARGET_POWER"
2504   "@
2505    sle %0,%1,%2
2506    {sli|slwi} %0,%1,%h2"
2507   [(set_attr "length" "8")])
2508
2509 (define_insn "ashlsi3_no_power"
2510   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2511         (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2512                    (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
2513   "! TARGET_POWER"
2514   "{sl|slw}%I2 %0,%1,%h2"
2515   [(set_attr "length" "8")])
2516
2517 (define_insn ""
2518   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
2519         (compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2520                                (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
2521                     (const_int 0)))
2522    (clobber (match_scratch:SI 3 "=r,r"))
2523    (clobber (match_scratch:SI 4 "=q,X"))]
2524   "TARGET_POWER"
2525   "@
2526    sle. %3,%1,%2
2527    {sli.|slwi.} %3,%1,%h2"
2528   [(set_attr "type" "delayed_compare")])
2529
2530 (define_insn ""
2531   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2532         (compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2533                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2534                     (const_int 0)))
2535    (clobber (match_scratch:SI 3 "=r"))]
2536   "! TARGET_POWER"
2537   "{sl|slw}%I2. %3,%1,%h2"
2538   [(set_attr "type" "delayed_compare")])
2539
2540 (define_insn ""
2541   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
2542         (compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2543                                (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
2544                     (const_int 0)))
2545    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2546         (ashift:SI (match_dup 1) (match_dup 2)))
2547    (clobber (match_scratch:SI 4 "=q,X"))]
2548   "TARGET_POWER"
2549   "@
2550    sle. %0,%1,%2
2551    {sli.|slwi.} %0,%1,%h2"
2552   [(set_attr "type" "delayed_compare")])
2553
2554 (define_insn ""
2555   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2556         (compare:CC (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2557                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2558                     (const_int 0)))
2559    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2560         (ashift:SI (match_dup 1) (match_dup 2)))]
2561   "! TARGET_POWER"
2562   "{sl|slw}%I2. %0,%1,%h2"
2563   [(set_attr "type" "delayed_compare")])
2564
2565 (define_insn ""
2566   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2567         (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2568                            (match_operand:SI 2 "const_int_operand" "i"))
2569                 (match_operand:SI 3 "mask_operand" "L")))]
2570   "includes_lshift_p (operands[2], operands[3])"
2571   "{rlinm|rlwinm} %0,%1,%h2,%m3,%M3")
2572
2573 (define_insn ""
2574   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2575         (compare:CC
2576          (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2577                             (match_operand:SI 2 "const_int_operand" "i"))
2578                  (match_operand:SI 3 "mask_operand" "L"))
2579          (const_int 0)))
2580    (clobber (match_scratch:SI 4 "=r"))]
2581   "includes_lshift_p (operands[2], operands[3])"
2582   "{rlinm.|rlwinm.} %4,%1,%h2,%m3,%M3"
2583   [(set_attr "type" "delayed_compare")])
2584
2585 (define_insn ""
2586   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2587         (compare:CC
2588          (and:SI (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2589                             (match_operand:SI 2 "const_int_operand" "i"))
2590                  (match_operand:SI 3 "mask_operand" "L"))
2591          (const_int 0)))
2592    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2593         (and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
2594   "includes_lshift_p (operands[2], operands[3])"
2595   "{rlinm.|rlwinm.} %0,%1,%h2,%m3,%M3"
2596   [(set_attr "type" "delayed_compare")])
2597
2598 ;; The AIX assembler mis-handles "sri x,x,0", so write that case as
2599 ;; "sli x,x,0".
2600 (define_expand "lshrsi3"
2601   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
2602    (use (match_operand:SI 1 "gpc_reg_operand" ""))
2603    (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
2604   ""
2605   "
2606 {
2607   if (TARGET_POWER)
2608     emit_insn (gen_lshrsi3_power (operands[0], operands[1], operands[2]));
2609   else
2610     emit_insn (gen_lshrsi3_no_power (operands[0], operands[1], operands[2]));
2611   DONE;
2612 }")
2613
2614 (define_insn "lshrsi3_power"
2615   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
2616         (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r")
2617                      (match_operand:SI 2 "reg_or_cint_operand" "r,O,i")))
2618    (clobber (match_scratch:SI 3 "=q,X,X"))]
2619   "TARGET_POWER"
2620   "@
2621   sre %0,%1,%2
2622   mr %0,%1
2623   {s%A2i|s%A2wi} %0,%1,%h2")
2624
2625 (define_insn "lshrsi3_no_power"
2626   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2627         (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2628                      (match_operand:SI 2 "reg_or_cint_operand" "O,ri")))]
2629   "! TARGET_POWER"
2630   "@
2631   mr %0,%1
2632   {sr|srw}%I2 %0,%1,%h2")
2633
2634 (define_insn ""
2635   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x")
2636         (compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r")
2637                                  (match_operand:SI 2 "reg_or_cint_operand" "r,O,i"))
2638                     (const_int 0)))
2639    (clobber (match_scratch:SI 3 "=r,X,r"))
2640    (clobber (match_scratch:SI 4 "=q,X,X"))]
2641   "TARGET_POWER"
2642   "@
2643   sre. %3,%1,%2
2644   mr. %1,%1
2645   {s%A2i.|s%A2wi.} %3,%1,%h2"
2646   [(set_attr "type" "delayed_compare")])
2647
2648 (define_insn ""
2649   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
2650         (compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2651                                  (match_operand:SI 2 "reg_or_cint_operand" "O,ri"))
2652                     (const_int 0)))
2653    (clobber (match_scratch:SI 3 "=X,r"))]
2654   "! TARGET_POWER"
2655   "@
2656    mr. %1,%1
2657    {sr|srw}%I2. %3,%1,%h2"
2658   [(set_attr "type" "delayed_compare")])
2659
2660 (define_insn ""
2661   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x")
2662         (compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r")
2663                                  (match_operand:SI 2 "reg_or_cint_operand" "r,O,i"))
2664                     (const_int 0)))
2665    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
2666         (lshiftrt:SI (match_dup 1) (match_dup 2)))
2667    (clobber (match_scratch:SI 4 "=q,X,X"))]
2668   "TARGET_POWER"
2669   "@
2670   sre. %0,%1,%2
2671   mr. %0,%1
2672   {s%A2i.|s%A2wi.} %0,%1,%h2"
2673   [(set_attr "type" "delayed_compare")])
2674
2675 (define_insn ""
2676   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
2677         (compare:CC (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2678                                  (match_operand:SI 2 "reg_or_cint_operand" "O,ri"))
2679                     (const_int 0)))
2680    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2681         (lshiftrt:SI (match_dup 1) (match_dup 2)))]
2682   "! TARGET_POWER"
2683   "@
2684    mr. %0,%1
2685    {sr|srw}%I2. %0,%1,%h2"
2686   [(set_attr "type" "delayed_compare")])
2687
2688 (define_insn ""
2689   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2690         (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2691                              (match_operand:SI 2 "const_int_operand" "i"))
2692                 (match_operand:SI 3 "mask_operand" "L")))]
2693   "includes_rshift_p (operands[2], operands[3])"
2694   "{rlinm|rlwinm} %0,%1,%s2,%m3,%M3")
2695
2696 (define_insn ""
2697   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2698         (compare:CC
2699          (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2700                               (match_operand:SI 2 "const_int_operand" "i"))
2701                  (match_operand:SI 3 "mask_operand" "L"))
2702          (const_int 0)))
2703    (clobber (match_scratch:SI 4 "=r"))]
2704   "includes_rshift_p (operands[2], operands[3])"
2705   "{rlinm.|rlwinm.} %4,%1,%s2,%m3,%M3"
2706   [(set_attr "type" "delayed_compare")])
2707
2708 (define_insn ""
2709   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
2710         (compare:CC
2711          (and:SI (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2712                               (match_operand:SI 2 "const_int_operand" "i"))
2713                  (match_operand:SI 3 "mask_operand" "L"))
2714          (const_int 0)))
2715    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2716         (and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
2717   "includes_rshift_p (operands[2], operands[3])"
2718   "{rlinm.|rlwinm.} %0,%1,%s2,%m3,%M3"
2719   [(set_attr "type" "delayed_compare")])
2720
2721 (define_insn ""
2722   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2723         (zero_extend:SI
2724          (subreg:QI
2725           (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2726                        (match_operand:SI 2 "const_int_operand" "i")) 0)))]
2727   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
2728   "{rlinm|rlwinm} %0,%1,%s2,0xff")
2729
2730 (define_insn ""
2731   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2732         (compare:CC
2733          (zero_extend:SI
2734           (subreg:QI
2735            (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2736                         (match_operand:SI 2 "const_int_operand" "i")) 0))
2737          (const_int 0)))
2738    (clobber (match_scratch:SI 3 "=r"))]
2739   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
2740   "{rlinm.|rlwinm.} %3,%1,%s2,0xff"
2741   [(set_attr "type" "delayed_compare")])
2742
2743 (define_insn ""
2744   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2745         (compare:CC
2746          (zero_extend:SI
2747           (subreg:QI
2748            (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2749                         (match_operand:SI 2 "const_int_operand" "i")) 0))
2750          (const_int 0)))
2751    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2752         (zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
2753   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
2754   "{rlinm.|rlwinm.} %0,%1,%s2,0xff"
2755   [(set_attr "type" "delayed_compare")])
2756
2757 (define_insn ""
2758   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2759         (zero_extend:SI
2760          (subreg:HI
2761           (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2762                        (match_operand:SI 2 "const_int_operand" "i")) 0)))]
2763   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
2764   "{rlinm|rlwinm} %0,%1,%s2,0xffff")
2765
2766 (define_insn ""
2767   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2768         (compare:CC
2769          (zero_extend:SI
2770           (subreg:HI
2771            (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2772                         (match_operand:SI 2 "const_int_operand" "i")) 0))
2773          (const_int 0)))
2774    (clobber (match_scratch:SI 3 "=r"))]
2775   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
2776   "{rlinm.|rlwinm.} %3,%1,%s2,0xffff"
2777   [(set_attr "type" "delayed_compare")])
2778
2779 (define_insn ""
2780   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2781         (compare:CC
2782          (zero_extend:SI
2783           (subreg:HI
2784            (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2785                         (match_operand:SI 2 "const_int_operand" "i")) 0))
2786          (const_int 0)))
2787    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2788         (zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
2789   "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
2790   "{rlinm.|rlwinm.} %0,%1,%s2,0xffff"
2791   [(set_attr "type" "delayed_compare")])
2792
2793 (define_insn ""
2794   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2795                          (const_int 1)
2796                          (match_operand:SI 1 "gpc_reg_operand" "r"))
2797         (ashiftrt:SI (match_operand:SI 2 "gpc_reg_operand" "r")
2798                      (const_int 31)))]
2799   "TARGET_POWER"
2800   "rrib %0,%1,%2")
2801
2802 (define_insn ""
2803   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2804                          (const_int 1)
2805                          (match_operand:SI 1 "gpc_reg_operand" "r"))
2806         (lshiftrt:SI (match_operand:SI 2 "gpc_reg_operand" "r")
2807                      (const_int 31)))]
2808   "TARGET_POWER"
2809   "rrib %0,%1,%2")
2810
2811 (define_insn ""
2812   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
2813                          (const_int 1)
2814                          (match_operand:SI 1 "gpc_reg_operand" "r"))
2815         (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
2816                          (const_int 1)
2817                          (const_int 0)))]
2818   "TARGET_POWER"
2819   "rrib %0,%1,%2")
2820
2821 (define_expand "ashrsi3"
2822   [(set (match_operand:SI 0 "gpc_reg_operand" "")
2823         (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
2824                      (match_operand:SI 2 "reg_or_cint_operand" "")))]
2825   ""
2826   "
2827 {
2828   if (TARGET_POWER)
2829     emit_insn (gen_ashrsi3_power (operands[0], operands[1], operands[2]));
2830   else
2831     emit_insn (gen_ashrsi3_no_power (operands[0], operands[1], operands[2]));
2832   DONE;
2833 }")
2834
2835 (define_insn "ashrsi3_power"
2836   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2837         (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2838                      (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
2839    (clobber (match_scratch:SI 3 "=q,X"))]
2840   "TARGET_POWER"
2841   "@
2842    srea %0,%1,%2
2843    {srai|srawi} %0,%1,%h2")
2844
2845 (define_insn "ashrsi3_no_power"
2846   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
2847         (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2848                      (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
2849   "! TARGET_POWER"
2850   "{sra|sraw}%I2 %0,%1,%h2")
2851
2852 (define_insn ""
2853   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
2854         (compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2855                                  (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
2856                     (const_int 0)))
2857    (clobber (match_scratch:SI 3 "=r,r"))
2858    (clobber (match_scratch:SI 4 "=q,X"))]
2859   "TARGET_POWER"
2860   "@
2861    srea. %3,%1,%2
2862    {srai.|srawi.} %3,%1,%h2"
2863   [(set_attr "type" "delayed_compare")])
2864
2865 (define_insn ""
2866   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
2867         (compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2868                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2869                     (const_int 0)))
2870    (clobber (match_scratch:SI 3 "=r"))]
2871   "! TARGET_POWER"
2872   "{sra|sraw}%I2. %3,%1,%h2"
2873   [(set_attr "type" "delayed_compare")])
2874
2875 (define_insn ""
2876   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
2877         (compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
2878                                  (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
2879                     (const_int 0)))
2880    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
2881         (ashiftrt:SI (match_dup 1) (match_dup 2)))
2882    (clobber (match_scratch:SI 4 "=q,X"))]
2883   "TARGET_POWER"
2884   "@
2885    srea. %0,%1,%2
2886    {srai.|srawi.} %0,%1,%h2"
2887   [(set_attr "type" "delayed_compare")])
2888
2889 (define_insn ""
2890   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
2891         (compare:CC (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
2892                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
2893                     (const_int 0)))
2894    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
2895         (ashiftrt:SI (match_dup 1) (match_dup 2)))]
2896   "! TARGET_POWER"
2897   "{sra|sraw}%I2. %0,%1,%h2"
2898   [(set_attr "type" "delayed_compare")])
2899 \f
2900 ;; Floating-point insns, excluding normal data motion.
2901 ;;
2902 ;; PowerPC has a full set of single-precision floating point instructions.
2903 ;;
2904 ;; For the POWER architecture, we pretend that we have both SFmode and
2905 ;; DFmode insns, while, in fact, all fp insns are actually done in double.
2906 ;; The only conversions we will do will be when storing to memory.  In that
2907 ;; case, we will use the "frsp" instruction before storing.
2908 ;;
2909 ;; Note that when we store into a single-precision memory location, we need to
2910 ;; use the frsp insn first.  If the register being stored isn't dead, we
2911 ;; need a scratch register for the frsp.  But this is difficult when the store
2912 ;; is done by reload.  It is not incorrect to do the frsp on the register in
2913 ;; this case, we just lose precision that we would have otherwise gotten but
2914 ;; is not guaranteed.  Perhaps this should be tightened up at some point.
2915
2916 (define_insn "extendsfdf2"
2917   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
2918         (float_extend:DF (match_operand:SF 1 "gpc_reg_operand" "f")))]
2919   "TARGET_HARD_FLOAT"
2920   "*
2921 {
2922   if (REGNO (operands[0]) == REGNO (operands[1]))
2923     return \"\";
2924   else
2925     return \"fmr %0,%1\";
2926 }"
2927   [(set_attr "type" "fp")])
2928
2929 (define_insn "truncdfsf2"
2930   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2931         (float_truncate:SF (match_operand:DF 1 "gpc_reg_operand" "f")))]
2932   "TARGET_HARD_FLOAT"
2933   "frsp %0,%1"
2934   [(set_attr "type" "fp")])
2935
2936 (define_insn "aux_truncdfsf2"
2937   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2938         (unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] 0))]
2939   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
2940   "frsp %0,%1"
2941   [(set_attr "type" "fp")])
2942
2943 (define_insn "negsf2"
2944   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2945         (neg:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
2946   "TARGET_HARD_FLOAT"
2947   "fneg %0,%1"
2948   [(set_attr "type" "fp")])
2949
2950 (define_insn "abssf2"
2951   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2952         (abs:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
2953   "TARGET_HARD_FLOAT"
2954   "fabs %0,%1"
2955   [(set_attr "type" "fp")])
2956
2957 (define_insn ""
2958   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2959         (neg:SF (abs:SF (match_operand:SF 1 "gpc_reg_operand" "f"))))]
2960   "TARGET_HARD_FLOAT"
2961   "fnabs %0,%1"
2962   [(set_attr "type" "fp")])
2963
2964 (define_expand "addsf3"
2965   [(set (match_operand:SF 0 "gpc_reg_operand" "")
2966         (plus:SF (match_operand:SF 1 "gpc_reg_operand" "")
2967                  (match_operand:SF 2 "gpc_reg_operand" "")))]
2968   "TARGET_HARD_FLOAT"
2969   "")
2970
2971 (define_insn ""
2972   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2973         (plus:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
2974                  (match_operand:SF 2 "gpc_reg_operand" "f")))]
2975   "TARGET_POWERPC && TARGET_HARD_FLOAT"
2976   "fadds %0,%1,%2"
2977   [(set_attr "type" "fp")])
2978
2979 (define_insn ""
2980   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2981         (plus:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
2982                  (match_operand:SF 2 "gpc_reg_operand" "f")))]
2983   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
2984   "{fa|fadd} %0,%1,%2"
2985   [(set_attr "type" "fp")])
2986
2987 (define_expand "subsf3"
2988   [(set (match_operand:SF 0 "gpc_reg_operand" "")
2989         (minus:SF (match_operand:SF 1 "gpc_reg_operand" "")
2990                   (match_operand:SF 2 "gpc_reg_operand" "")))]
2991   "TARGET_HARD_FLOAT"
2992   "")
2993
2994 (define_insn ""
2995   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
2996         (minus:SF (match_operand:SF 1 "gpc_reg_operand" "f")
2997                   (match_operand:SF 2 "gpc_reg_operand" "f")))]
2998   "TARGET_POWERPC && TARGET_HARD_FLOAT"
2999   "fsubs %0,%1,%2"
3000   [(set_attr "type" "fp")])
3001
3002 (define_insn ""
3003   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3004         (minus:SF (match_operand:SF 1 "gpc_reg_operand" "f")
3005                   (match_operand:SF 2 "gpc_reg_operand" "f")))]
3006   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3007   "{fs|fsub} %0,%1,%2"
3008   [(set_attr "type" "fp")])
3009
3010 (define_expand "mulsf3"
3011   [(set (match_operand:SF 0 "gpc_reg_operand" "")
3012         (mult:SF (match_operand:SF 1 "gpc_reg_operand" "")
3013                  (match_operand:SF 2 "gpc_reg_operand" "")))]
3014   "TARGET_HARD_FLOAT"
3015   "")
3016
3017 (define_insn ""
3018   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3019         (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3020                  (match_operand:SF 2 "gpc_reg_operand" "f")))]
3021   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3022   "fmuls %0,%1,%2"
3023   [(set_attr "type" "fp")])
3024
3025 (define_insn ""
3026   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3027         (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3028                  (match_operand:SF 2 "gpc_reg_operand" "f")))]
3029   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3030   "{fm|fmul} %0,%1,%2"
3031   [(set_attr "type" "dmul")])
3032
3033 (define_expand "divsf3"
3034   [(set (match_operand:SF 0 "gpc_reg_operand" "")
3035         (div:SF (match_operand:SF 1 "gpc_reg_operand" "")
3036                 (match_operand:SF 2 "gpc_reg_operand" "")))]
3037   "TARGET_HARD_FLOAT"
3038   "")
3039
3040 (define_insn ""
3041   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3042         (div:SF (match_operand:SF 1 "gpc_reg_operand" "f")
3043                 (match_operand:SF 2 "gpc_reg_operand" "f")))]
3044   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3045   "fdivs %0,%1,%2"
3046   [(set_attr "type" "sdiv")])
3047
3048 (define_insn ""
3049   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3050         (div:SF (match_operand:SF 1 "gpc_reg_operand" "f")
3051                 (match_operand:SF 2 "gpc_reg_operand" "f")))]
3052   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3053   "{fd|fdiv} %0,%1,%2"
3054   [(set_attr "type" "ddiv")])
3055
3056 (define_insn ""
3057   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3058         (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3059                           (match_operand:SF 2 "gpc_reg_operand" "f"))
3060                  (match_operand:SF 3 "gpc_reg_operand" "f")))]
3061   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3062   "fmadds %0,%1,%2,%3"
3063   [(set_attr "type" "fp")])
3064
3065 (define_insn ""
3066   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3067         (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3068                           (match_operand:SF 2 "gpc_reg_operand" "f"))
3069                  (match_operand:SF 3 "gpc_reg_operand" "f")))]
3070   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3071   "{fma|fmadd} %0,%1,%2,%3"
3072   [(set_attr "type" "dmul")])
3073
3074 (define_insn ""
3075   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3076         (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3077                            (match_operand:SF 2 "gpc_reg_operand" "f"))
3078                   (match_operand:SF 3 "gpc_reg_operand" "f")))]
3079   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3080   "fmsubs %0,%1,%2,%3"
3081   [(set_attr "type" "fp")])
3082
3083 (define_insn ""
3084   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3085         (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3086                            (match_operand:SF 2 "gpc_reg_operand" "f"))
3087                   (match_operand:SF 3 "gpc_reg_operand" "f")))]
3088   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3089   "{fms|fmsub} %0,%1,%2,%3"
3090   [(set_attr "type" "dmul")])
3091
3092 (define_insn ""
3093   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3094         (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3095                                   (match_operand:SF 2 "gpc_reg_operand" "f"))
3096                          (match_operand:SF 3 "gpc_reg_operand" "f"))))]
3097   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3098   "fnmadds %0,%1,%2,%3"
3099   [(set_attr "type" "fp")])
3100
3101 (define_insn ""
3102   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3103         (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3104                                   (match_operand:SF 2 "gpc_reg_operand" "f"))
3105                          (match_operand:SF 3 "gpc_reg_operand" "f"))))]
3106   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3107   "{fnma|fnmadd} %0,%1,%2,%3"
3108   [(set_attr "type" "dmul")])
3109
3110 (define_insn ""
3111   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3112         (neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3113                                    (match_operand:SF 2 "gpc_reg_operand" "f"))
3114                           (match_operand:SF 3 "gpc_reg_operand" "f"))))]
3115   "TARGET_POWERPC && TARGET_HARD_FLOAT"
3116   "fnmsubs %0,%1,%2,%3"
3117   [(set_attr "type" "fp")])
3118
3119 (define_insn ""
3120   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3121         (neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gpc_reg_operand" "%f")
3122                                    (match_operand:SF 2 "gpc_reg_operand" "f"))
3123                           (match_operand:SF 3 "gpc_reg_operand" "f"))))]
3124   "! TARGET_POWERPC && TARGET_HARD_FLOAT"
3125   "{fnms|fnmsub} %0,%1,%2,%3"
3126   [(set_attr "type" "dmul")])
3127
3128 (define_expand "sqrtsf2"
3129   [(set (match_operand:SF 0 "gpc_reg_operand" "")
3130         (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "")))]
3131   "(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT"
3132   "")
3133
3134 (define_insn ""
3135   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3136         (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
3137   "TARGET_PPC_GPOPT && TARGET_HARD_FLOAT"
3138   "fsqrts %0,%1"
3139   [(set_attr "type" "ssqrt")])
3140
3141 (define_insn ""
3142   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3143         (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "f")))]
3144   "TARGET_POWER2 && TARGET_HARD_FLOAT"
3145   "fsqrt %0,%1"
3146   [(set_attr "type" "dsqrt")])
3147
3148 ;; For MIN, MAX, and conditional move, we use DEFINE_EXPAND's that involve a
3149 ;; fsel instruction and some auxiliary computations.  Then we just have a
3150 ;; single DEFINE_INSN for fsel and the define_splits to make them if made by
3151 ;; combine.
3152 (define_expand "maxsf3"
3153   [(set (match_dup 3)
3154         (minus:SF (match_operand:SF 1 "gpc_reg_operand" "")
3155                   (match_operand:SF 2 "gpc_reg_operand" "")))
3156    (set (match_operand:SF 0 "gpc_reg_operand" "")
3157         (if_then_else:SF (ge (match_dup 3)
3158                              (const_int 0))
3159                          (match_dup 1)
3160                          (match_dup 2)))]
3161   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3162   "
3163 { operands[3] = gen_reg_rtx (SFmode); }")
3164
3165 (define_split
3166   [(set (match_operand:SF 0 "gpc_reg_operand" "")
3167         (smax:SF (match_operand:SF 1 "gpc_reg_operand" "")
3168                  (match_operand:SF 2 "gpc_reg_operand" "")))
3169    (clobber (match_operand:SF 3 "gpc_reg_operand" ""))]
3170   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3171   [(set (match_dup 3)
3172         (minus:SF (match_dup 1) (match_dup 2)))
3173    (set (match_dup 0)
3174         (if_then_else:SF (ge (match_dup 3)
3175                              (const_int 0))
3176                          (match_dup 1)
3177                          (match_dup 2)))]
3178   "")
3179
3180 (define_expand "minsf3"
3181   [(set (match_dup 3)
3182         (minus:SF (match_operand:SF 2 "gpc_reg_operand" "")
3183                   (match_operand:SF 1 "gpc_reg_operand" "")))
3184    (set (match_operand:SF 0 "gpc_reg_operand" "")
3185         (if_then_else:SF (ge (match_dup 3)
3186                              (const_int 0))
3187                          (match_dup 1)
3188                          (match_dup 2)))]
3189   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3190   "
3191 { operands[3] = gen_reg_rtx (SFmode); }")
3192
3193 (define_split
3194   [(set (match_operand:SF 0 "gpc_reg_operand" "")
3195         (smin:SF (match_operand:SF 1 "gpc_reg_operand" "")
3196                  (match_operand:SF 2 "gpc_reg_operand" "")))
3197    (clobber (match_operand:SF 3 "gpc_reg_operand" ""))]
3198   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3199   [(set (match_dup 3)
3200         (minus:SF (match_dup 2) (match_dup 1)))
3201    (set (match_dup 0)
3202         (if_then_else:SF (ge (match_dup 3)
3203                              (const_int 0))
3204                          (match_dup 1)
3205                          (match_dup 2)))]
3206   "")
3207
3208 (define_expand "movsfcc"
3209    [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3210          (if_then_else:SF (match_operand 1 "comparison_operator" "")
3211                           (match_operand:SF 2 "gpc_reg_operand" "f")
3212                           (match_operand:SF 3 "gpc_reg_operand" "f")))]
3213   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3214   "
3215 {
3216   rtx temp, op0, op1;
3217   enum rtx_code code = GET_CODE (operands[1]);
3218   if (! rs6000_compare_fp_p)
3219     FAIL;
3220   switch (code)
3221     {
3222     case GE: case EQ: case NE:
3223       op0 = rs6000_compare_op0;
3224       op1 = rs6000_compare_op1;
3225       break;
3226     case GT:
3227       op0 = rs6000_compare_op1;
3228       op1 = rs6000_compare_op0;
3229       temp = operands[2]; operands[2] = operands[3]; operands[3] = temp;
3230       break;
3231     case LE:
3232       op0 = rs6000_compare_op1;
3233       op1 = rs6000_compare_op0;
3234       break;
3235     case LT:
3236       op0 = rs6000_compare_op0;
3237       op1 = rs6000_compare_op1;
3238       temp = operands[2]; operands[2] = operands[3]; operands[3] = temp;
3239       break;
3240     default:
3241       FAIL;
3242     }
3243   if (GET_MODE (rs6000_compare_op0) == DFmode)
3244     {
3245       temp = gen_reg_rtx (DFmode);
3246       emit_insn (gen_subdf3 (temp, op0, op1));
3247       emit_insn (gen_fseldfsf4 (operands[0], temp, operands[2], operands[3]));
3248       if (code == EQ)
3249         {
3250           emit_insn (gen_negdf2 (temp, temp));
3251           emit_insn (gen_fseldfsf4 (operands[0], temp, operands[0], operands[3]));
3252         }
3253       if (code == NE)
3254         {
3255           emit_insn (gen_negdf2 (temp, temp));
3256           emit_insn (gen_fseldfsf4 (operands[0], temp, operands[3], operands[0]));
3257         }
3258     }
3259   else
3260     {
3261       temp = gen_reg_rtx (SFmode);
3262       emit_insn (gen_subsf3 (temp, op0, op1));
3263       emit_insn (gen_fselsfsf4 (operands[0], temp, operands[2], operands[3]));
3264       if (code == EQ)
3265         {
3266           emit_insn (gen_negsf2 (temp, temp));
3267           emit_insn (gen_fselsfsf4 (operands[0], temp, operands[0], operands[3]));
3268         }
3269       if (code == NE)
3270         {
3271           emit_insn (gen_negsf2 (temp, temp));
3272           emit_insn (gen_fselsfsf4 (operands[0], temp, operands[3], operands[0]));
3273         }
3274     }
3275   DONE;
3276 }")
3277
3278 (define_insn "fselsfsf4"
3279   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3280         (if_then_else:SF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
3281                              (const_int 0))
3282                          (match_operand:SF 2 "gpc_reg_operand" "f")
3283                          (match_operand:SF 3 "gpc_reg_operand" "f")))]
3284   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3285   "fsel %0,%1,%2,%3"
3286   [(set_attr "type" "fp")])
3287
3288 (define_insn "fseldfsf4"
3289   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
3290         (if_then_else:SF (ge (match_operand:DF 1 "gpc_reg_operand" "f")
3291                              (const_int 0))
3292                          (match_operand:SF 2 "gpc_reg_operand" "f")
3293                          (match_operand:SF 3 "gpc_reg_operand" "f")))]
3294   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3295   "fsel %0,%1,%2,%3"
3296   [(set_attr "type" "fp")])
3297
3298 (define_insn "negdf2"
3299   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3300         (neg:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
3301   "TARGET_HARD_FLOAT"
3302   "fneg %0,%1"
3303   [(set_attr "type" "fp")])
3304
3305 (define_insn "absdf2"
3306   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3307         (abs:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
3308   "TARGET_HARD_FLOAT"
3309   "fabs %0,%1"
3310   [(set_attr "type" "fp")])
3311
3312 (define_insn ""
3313   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3314         (neg:DF (abs:DF (match_operand:DF 1 "gpc_reg_operand" "f"))))]
3315   "TARGET_HARD_FLOAT"
3316   "fnabs %0,%1"
3317   [(set_attr "type" "fp")])
3318
3319 (define_insn "adddf3"
3320   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3321         (plus:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3322                  (match_operand:DF 2 "gpc_reg_operand" "f")))]
3323   "TARGET_HARD_FLOAT"
3324   "{fa|fadd} %0,%1,%2"
3325   [(set_attr "type" "fp")])
3326
3327 (define_insn "subdf3"
3328   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3329         (minus:DF (match_operand:DF 1 "gpc_reg_operand" "f")
3330                   (match_operand:DF 2 "gpc_reg_operand" "f")))]
3331   "TARGET_HARD_FLOAT"
3332   "{fs|fsub} %0,%1,%2"
3333   [(set_attr "type" "fp")])
3334
3335 (define_insn "muldf3"
3336   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3337         (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3338                  (match_operand:DF 2 "gpc_reg_operand" "f")))]
3339   "TARGET_HARD_FLOAT"
3340   "{fm|fmul} %0,%1,%2"
3341   [(set_attr "type" "dmul")])
3342
3343 (define_insn "divdf3"
3344   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3345         (div:DF (match_operand:DF 1 "gpc_reg_operand" "f")
3346                 (match_operand:DF 2 "gpc_reg_operand" "f")))]
3347   "TARGET_HARD_FLOAT"
3348   "{fd|fdiv} %0,%1,%2"
3349   [(set_attr "type" "ddiv")])
3350
3351 (define_insn ""
3352   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3353         (plus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3354                           (match_operand:DF 2 "gpc_reg_operand" "f"))
3355                  (match_operand:DF 3 "gpc_reg_operand" "f")))]
3356   "TARGET_HARD_FLOAT"
3357   "{fma|fmadd} %0,%1,%2,%3"
3358   [(set_attr "type" "dmul")])
3359
3360 (define_insn ""
3361   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3362         (minus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3363                            (match_operand:DF 2 "gpc_reg_operand" "f"))
3364                   (match_operand:DF 3 "gpc_reg_operand" "f")))]
3365   "TARGET_HARD_FLOAT"
3366   "{fms|fmsub} %0,%1,%2,%3"
3367   [(set_attr "type" "dmul")])
3368
3369 (define_insn ""
3370   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3371         (neg:DF (plus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3372                                   (match_operand:DF 2 "gpc_reg_operand" "f"))
3373                          (match_operand:DF 3 "gpc_reg_operand" "f"))))]
3374   "TARGET_HARD_FLOAT"
3375   "{fnma|fnmadd} %0,%1,%2,%3"
3376   [(set_attr "type" "dmul")])
3377
3378 (define_insn ""
3379   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3380         (neg:DF (minus:DF (mult:DF (match_operand:DF 1 "gpc_reg_operand" "%f")
3381                                    (match_operand:DF 2 "gpc_reg_operand" "f"))
3382                           (match_operand:DF 3 "gpc_reg_operand" "f"))))]
3383   "TARGET_HARD_FLOAT"
3384   "{fnms|fnmsub} %0,%1,%2,%3"
3385   [(set_attr "type" "dmul")])
3386
3387 (define_insn "sqrtdf2"
3388   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3389         (sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "f")))]
3390   "(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT"
3391   "fsqrt %0,%1"
3392   [(set_attr "type" "dsqrt")])
3393
3394 ;; For MIN, MAX, and conditional move, we use DEFINE_EXPAND's that involve a
3395 ;; fsel instruction and some auxiliary computations.  Then we just have a
3396 ;; single DEFINE_INSN for fsel and the define_splits to make them if made by
3397 ;; combine.
3398
3399 (define_expand "maxdf3"
3400   [(set (match_dup 3)
3401         (minus:DF (match_operand:DF 1 "gpc_reg_operand" "")
3402                   (match_operand:DF 2 "gpc_reg_operand" "")))
3403    (set (match_operand:DF 0 "gpc_reg_operand" "")
3404         (if_then_else:DF (ge (match_dup 3)
3405                              (const_int 0))
3406                          (match_dup 1)
3407                          (match_dup 2)))]
3408   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3409   "
3410 { operands[3] = gen_reg_rtx (DFmode); }")
3411
3412 (define_split
3413   [(set (match_operand:DF 0 "gpc_reg_operand" "")
3414         (smax:DF (match_operand:DF 1 "gpc_reg_operand" "")
3415                  (match_operand:DF 2 "gpc_reg_operand" "")))
3416    (clobber (match_operand:DF 3 "gpc_reg_operand" ""))]
3417   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3418   [(set (match_dup 3)
3419         (minus:DF (match_dup 1) (match_dup 2)))
3420    (set (match_dup 0)
3421         (if_then_else:DF (ge (match_dup 3)
3422                              (const_int 0))
3423                          (match_dup 1)
3424                          (match_dup 2)))]
3425   "")
3426
3427 (define_expand "mindf3"
3428   [(set (match_dup 3)
3429         (minus:DF (match_operand:DF 2 "gpc_reg_operand" "")
3430                   (match_operand:DF 1 "gpc_reg_operand" "")))
3431    (set (match_operand:DF 0 "gpc_reg_operand" "")
3432         (if_then_else:DF (ge (match_dup 3)
3433                              (const_int 0))
3434                          (match_dup 1)
3435                          (match_dup 2)))]
3436   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3437   "
3438 { operands[3] = gen_reg_rtx (DFmode); }")
3439
3440 (define_split
3441   [(set (match_operand:DF 0 "gpc_reg_operand" "")
3442         (smin:DF (match_operand:DF 1 "gpc_reg_operand" "")
3443                  (match_operand:DF 2 "gpc_reg_operand" "")))
3444    (clobber (match_operand:DF 3 "gpc_reg_operand" ""))]
3445   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3446   [(set (match_dup 3)
3447         (minus:DF (match_dup 2) (match_dup 1)))
3448    (set (match_dup 0)
3449         (if_then_else:DF (ge (match_dup 3)
3450                              (const_int 0))
3451                          (match_dup 1)
3452                          (match_dup 2)))]
3453   "")
3454
3455 (define_expand "movdfcc"
3456    [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3457          (if_then_else:DF (match_operand 1 "comparison_operator" "")
3458                           (match_operand:DF 2 "gpc_reg_operand" "f")
3459                           (match_operand:DF 3 "gpc_reg_operand" "f")))]
3460   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3461   "
3462 {
3463   rtx temp, op0, op1;
3464   enum rtx_code code = GET_CODE (operands[1]);
3465   if (! rs6000_compare_fp_p)
3466     FAIL;
3467   switch (code)
3468     {
3469     case GE: case EQ: case NE:
3470       op0 = rs6000_compare_op0;
3471       op1 = rs6000_compare_op1;
3472       break;
3473     case GT:
3474       op0 = rs6000_compare_op1;
3475       op1 = rs6000_compare_op0;
3476       temp = operands[2]; operands[2] = operands[3]; operands[3] = temp;
3477       break;
3478     case LE:
3479       op0 = rs6000_compare_op1;
3480       op1 = rs6000_compare_op0;
3481       break;
3482     case LT:
3483       op0 = rs6000_compare_op0;
3484       op1 = rs6000_compare_op1;
3485       temp = operands[2]; operands[2] = operands[3]; operands[3] = temp;
3486       break;
3487     default:
3488       FAIL;
3489     }
3490   if (GET_MODE (rs6000_compare_op0) == DFmode)
3491     {
3492       temp = gen_reg_rtx (DFmode);
3493       emit_insn (gen_subdf3 (temp, op0, op1));
3494       emit_insn (gen_fseldfdf4 (operands[0], temp, operands[2], operands[3]));
3495       if (code == EQ)
3496         {
3497           emit_insn (gen_negdf2 (temp, temp));
3498           emit_insn (gen_fseldfdf4 (operands[0], temp, operands[0], operands[3]));
3499         }
3500       if (code == NE)
3501         {
3502           emit_insn (gen_negdf2 (temp, temp));
3503           emit_insn (gen_fseldfdf4 (operands[0], temp, operands[3], operands[0]));
3504         }
3505     }
3506   else
3507     {
3508       temp = gen_reg_rtx (SFmode);
3509       emit_insn (gen_subsf3 (temp, op0, op1));
3510       emit_insn (gen_fselsfdf4 (operands[0], temp, operands[2], operands[3]));
3511       if (code == EQ)
3512         {
3513           emit_insn (gen_negsf2 (temp, temp));
3514           emit_insn (gen_fselsfdf4 (operands[0], temp, operands[0], operands[3]));
3515         }
3516       if (code == NE)
3517         {
3518           emit_insn (gen_negsf2 (temp, temp));
3519           emit_insn (gen_fselsfdf4 (operands[0], temp, operands[3], operands[0]));
3520         }
3521     }
3522   DONE;
3523 }")
3524
3525 (define_insn "fseldfdf4"
3526   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3527         (if_then_else:DF (ge (match_operand:DF 1 "gpc_reg_operand" "f")
3528                              (const_int 0))
3529                          (match_operand:DF 2 "gpc_reg_operand" "f")
3530                          (match_operand:DF 3 "gpc_reg_operand" "f")))]
3531   "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT"
3532   "fsel %0,%1,%2,%3"
3533   [(set_attr "type" "fp")])
3534
3535 (define_insn "fselsfdf4"
3536   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3537         (if_then_else:DF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
3538                              (const_int 0))
3539                          (match_operand:DF 2 "gpc_reg_operand" "f")
3540                          (match_operand:DF 3 "gpc_reg_operand" "f")))]
3541   "TARGET_PPC_GFXOPT"
3542   "fsel %0,%1,%2,%3"
3543   [(set_attr "type" "fp")])
3544 \f
3545 ;; Conversions to and from floating-point.
3546
3547 (define_expand "floatsidf2"
3548   [(parallel [(set (match_operand:DF 0 "gpc_reg_operand" "")
3549                    (float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
3550               (use (match_dup 2))
3551               (use (match_dup 3))
3552               (clobber (match_dup 4))
3553               (clobber (match_dup 5))
3554               (clobber (reg:DF 76))])]
3555   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3556   "
3557 {
3558   operands[2] = force_reg (SImode, GEN_INT (0x43300000));
3559   operands[3] = force_reg (DFmode, rs6000_float_const (\"4503601774854144\", DFmode));
3560   operands[4] = gen_reg_rtx (SImode);
3561   operands[5] = gen_reg_rtx (Pmode);
3562 }")
3563
3564 (define_insn "*floatsidf2_internal"
3565   [(set (match_operand:DF 0 "gpc_reg_operand" "=&f")
3566         (float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
3567    (use (match_operand:SI 2 "gpc_reg_operand" "r"))
3568    (use (match_operand:DF 3 "gpc_reg_operand" "f"))
3569    (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
3570    (clobber (match_operand:SI 5 "gpc_reg_operand" "=b"))
3571    (clobber (reg:DF 76))]
3572   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3573   "#"
3574   [(set_attr "length" "24")])
3575
3576 (define_split
3577   [(set (match_operand:DF 0 "gpc_reg_operand" "")
3578         (float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
3579    (use (match_operand:SI 2 "gpc_reg_operand" ""))
3580    (use (match_operand:DF 3 "gpc_reg_operand" ""))
3581    (clobber (match_operand:SI 4 "gpc_reg_operand" ""))
3582    (clobber (match_operand:SI 5 "gpc_reg_operand" ""))
3583    (clobber (reg:DF 76))]
3584   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3585   [(set (match_dup 4)
3586         (xor:SI (match_dup 1)
3587                 (match_dup 6)))
3588    (set (match_dup 5)
3589         (unspec [(const_int 0)] 11))
3590    (set (match_dup 7)
3591         (unspec [(match_dup 4)
3592                  (match_dup 5)] 12))    ;; low word
3593    (set (match_dup 7)
3594         (unspec [(match_dup 2)
3595                  (match_dup 5)
3596                  (match_dup 7)] 13))    ;; high word
3597    (set (match_dup 0)
3598         (unspec [(match_dup 7)
3599                  (match_dup 5)] 14))
3600    (set (match_dup 0)
3601         (minus:DF (match_dup 0)
3602                   (match_dup 3)))]
3603   "
3604 {
3605   operands[6] = GEN_INT (0x80000000);
3606   operands[7] = gen_rtx (REG, DFmode, FPMEM_REGNUM);
3607 }")
3608
3609 (define_expand "floatunssidf2"
3610   [(parallel [(set (match_operand:DF 0 "gpc_reg_operand" "")
3611                    (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
3612               (use (match_dup 2))
3613               (use (match_dup 3))
3614               (clobber (match_dup 4))
3615               (clobber (reg:DF 76))])]
3616   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3617   "
3618 {
3619   operands[2] = force_reg (SImode, GEN_INT (0x43300000));
3620   operands[3] = force_reg (DFmode, rs6000_float_const (\"4503599627370496\", DFmode));
3621   operands[4] = gen_reg_rtx (Pmode);
3622 }")
3623
3624 (define_insn "*floatunssidf2_internal"
3625   [(set (match_operand:DF 0 "gpc_reg_operand" "=&f")
3626         (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))
3627    (use (match_operand:SI 2 "gpc_reg_operand" "r"))
3628    (use (match_operand:DF 3 "gpc_reg_operand" "f"))
3629    (clobber (match_operand:SI 4 "gpc_reg_operand" "=b"))
3630    (clobber (reg:DF 76))]
3631   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3632   "#"
3633   [(set_attr "length" "20")])
3634
3635 (define_split
3636   [(set (match_operand:DF 0 "gpc_reg_operand" "")
3637         (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
3638    (use (match_operand:SI 2 "gpc_reg_operand" ""))
3639    (use (match_operand:DF 3 "gpc_reg_operand" ""))
3640    (clobber (match_operand:SI 4 "gpc_reg_operand" "=b"))
3641    (clobber (reg:DF 76))]
3642   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3643   [(set (match_dup 4)
3644         (unspec [(const_int 0)] 11))
3645    (set (match_dup 5)
3646         (unspec [(match_dup 1)
3647                  (match_dup 4)] 12))    ;; low word
3648    (set (match_dup 5)
3649         (unspec [(match_dup 2)
3650                  (match_dup 4)
3651                  (match_dup 5)] 13))    ;; high word
3652    (set (match_dup 0)
3653         (unspec [(match_dup 5)
3654                  (reg:SI 1)] 14))
3655    (set (match_dup 0)
3656         (minus:DF (match_dup 0)
3657                   (match_dup 3)))]
3658   "operands[5] = gen_rtx (REG, DFmode, FPMEM_REGNUM);")
3659
3660 ;; Load up scratch register with base address + offset if needed
3661 (define_insn "*floatsidf2_loadaddr"
3662   [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
3663         (unspec [(const_int 0)] 11))]
3664   "TARGET_HARD_FLOAT"
3665   "*
3666 {
3667   if (rs6000_fpmem_offset > 32760)
3668     {
3669       rtx xop[3];
3670
3671       xop[0] = operands[0];
3672       xop[1] = (frame_pointer_needed) ? frame_pointer_rtx : stack_pointer_rtx;
3673       xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15));
3674       output_asm_insn (\"{cau|addis} %0,%1,%2\", xop);
3675     }
3676   else if (rs6000_fpmem_offset < 0)
3677     abort ();
3678
3679   return \"\";
3680 }"
3681   [(set_attr "length" "4")])
3682
3683 (define_insn "*floatsidf2_store1"
3684   [(set (reg:DF 76)
3685         (unspec [(match_operand:SI 0 "gpc_reg_operand" "r")
3686                  (match_operand:SI 1 "gpc_reg_operand" "r")] 12))]
3687   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3688   "*
3689 {
3690   rtx indx;
3691
3692   if (rs6000_fpmem_offset > 32760)
3693     indx = operands[1];
3694   else if (frame_pointer_needed)
3695     indx = frame_pointer_rtx;
3696   else
3697     indx = stack_pointer_rtx;
3698
3699   operands[2] = gen_rtx (MEM, SImode,
3700                          gen_rtx (PLUS, Pmode,
3701                                   indx,
3702                                   GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
3703                                            + ((WORDS_BIG_ENDIAN != 0) * 4))));
3704
3705   return \"{st|stw} %0,%2\";
3706 }"
3707   [(set_attr "type" "store")])
3708
3709 (define_insn "*floatsidf2_store2"
3710   [(set (reg:DF 76)
3711         (unspec [(match_operand:SI 0 "gpc_reg_operand" "r")
3712                  (match_operand:SI 1 "gpc_reg_operand" "r")
3713                  (reg:DF 76)] 13))]
3714   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3715   "*
3716 {
3717   rtx indx;
3718
3719   if (rs6000_fpmem_offset > 32760)
3720     indx = operands[1];
3721   else if (frame_pointer_needed)
3722     indx = frame_pointer_rtx;
3723   else
3724     indx = stack_pointer_rtx;
3725
3726   operands[2] = gen_rtx (MEM, SImode,
3727                          gen_rtx (PLUS, Pmode,
3728                                   indx,
3729                                   GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
3730                                            + ((WORDS_BIG_ENDIAN == 0) * 4))));
3731
3732   return \"{st|stw} %0,%2\";
3733 }"
3734   [(set_attr "type" "store")])
3735
3736 (define_insn "*floatsidf2_load"
3737   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3738         (unspec [(reg:DF 76)
3739                  (match_operand:SI 1 "gpc_reg_operand" "b")] 14))]
3740   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3741   "*
3742 {
3743   rtx indx;
3744   HOST_WIDE_INT offset = rs6000_fpmem_offset;
3745
3746   if (rs6000_fpmem_offset > 32760)
3747     {
3748       indx = operands[1];
3749       offset = (((offset & 0xffff) ^ 0x8000) - 0x8000);
3750     }
3751   else if (frame_pointer_needed)
3752     indx = frame_pointer_rtx;
3753   else
3754     indx = stack_pointer_rtx;
3755
3756   operands[2] = gen_rtx (MEM, SImode,
3757                          gen_rtx (PLUS, Pmode, indx, GEN_INT (offset)));
3758
3759   return \"lfd %0,%2\";
3760 }"
3761   [(set_attr "type" "fpload")])
3762
3763 (define_expand "fix_truncdfsi2"
3764   [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
3765                    (fix:SI (match_operand:DF 1 "gpc_reg_operand" "")))
3766               (clobber (match_dup 2))
3767               (clobber (match_dup 3))
3768               (clobber (match_dup 4))])]
3769   "TARGET_HARD_FLOAT"
3770   "
3771 {
3772   if (!TARGET_POWER2 && !TARGET_POWERPC)
3773     {
3774       emit_insn (gen_trunc_call (operands[0], operands[1],
3775                                  gen_rtx (SYMBOL_REF, Pmode, RS6000_ITRUNC)));
3776       DONE;
3777     }
3778
3779   operands[2] = gen_reg_rtx (DImode);
3780   operands[3] = gen_reg_rtx (Pmode);
3781   operands[4] = gen_rtx (REG, DImode, FPMEM_REGNUM);
3782 }")
3783
3784 (define_insn "*fix_truncdfsi2_internal"
3785   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3786         (fix:SI (match_operand:DF 1 "gpc_reg_operand" "f")))
3787    (clobber (match_operand:DI 2 "gpc_reg_operand" "=f"))
3788    (clobber (match_operand:SI 3 "gpc_reg_operand" "=b"))
3789    (clobber (reg:DI 76))]
3790   "TARGET_HARD_FLOAT"
3791   "#"
3792   [(set_attr "length" "12")])
3793
3794 (define_split
3795   [(set (match_operand:SI 0 "gpc_reg_operand" "")
3796         (fix:SI (match_operand:DF 1 "gpc_reg_operand" "f")))
3797    (clobber (match_operand:DI 2 "gpc_reg_operand" ""))
3798    (clobber (match_operand:SI 3 "gpc_reg_operand" ""))
3799    (clobber (reg:DI 76))]
3800   "TARGET_HARD_FLOAT"
3801   [(set (match_dup 2)
3802         (sign_extend:DI (fix:SI (match_operand:DF 1 "gpc_reg_operand" ""))))
3803    (set (match_dup 3)
3804         (unspec [(const_int 0)] 11))
3805    (set (match_dup 4)
3806         (unspec [(match_dup 2)
3807                  (match_dup 3)] 15))
3808    (set (match_operand:SI 0 "gpc_reg_operand" "")
3809         (unspec [(match_dup 4)
3810                  (match_dup 3)] 16))]
3811   "operands[4] = gen_rtx (REG, DImode, FPMEM_REGNUM);")
3812
3813 (define_insn "*fctiwz"
3814   [(set (match_operand:DI 0 "gpc_reg_operand" "=f")
3815         (sign_extend:DI (fix:SI (match_operand:DF 1 "gpc_reg_operand" "f"))))]
3816   "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT"
3817   "{fcirz|fctiwz} %0,%1"
3818   [(set_attr "type" "fp")])
3819
3820 (define_insn "*fix_truncdfsi2_store"
3821   [(set (reg:DI 76)
3822         (unspec [(match_operand:DI 0 "gpc_reg_operand" "f")
3823                  (match_operand:SI 1 "gpc_reg_operand" "b")] 15))]
3824   "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT"
3825   "*
3826 {
3827   rtx indx;
3828
3829   if (rs6000_fpmem_offset > 32760)
3830     indx = operands[1];
3831   else if (frame_pointer_needed)
3832     indx = frame_pointer_rtx;
3833   else
3834     indx = stack_pointer_rtx;
3835
3836   operands[2] = gen_rtx (MEM, DFmode,
3837                          gen_rtx (PLUS, Pmode,
3838                                   indx,
3839                                   GEN_INT ((((rs6000_fpmem_offset & 0xffff)
3840                                              ^ 0x8000) - 0x8000))));
3841
3842   return \"stfd %0,%w2\";
3843 }"
3844   [(set_attr "type" "fpstore")])
3845
3846 (define_insn "*fix_truncdfsi2_load"
3847   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
3848         (unspec [(reg:DI 76)
3849                  (match_operand:SI 1 "gpc_reg_operand" "b")] 16))]
3850   "(TARGET_POWER2 || TARGET_POWERPC) && TARGET_HARD_FLOAT"
3851   "*
3852 {
3853   rtx indx;
3854
3855   if (rs6000_fpmem_offset > 32760)
3856     indx = operands[1];
3857   else if (frame_pointer_needed)
3858     indx = frame_pointer_rtx;
3859   else
3860     indx = stack_pointer_rtx;
3861
3862   operands[2] = gen_rtx (MEM, DFmode,
3863                          gen_rtx (PLUS, Pmode,
3864                                   indx,
3865                                   GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000)
3866                                            + ((WORDS_BIG_ENDIAN) ? 4 : 0))));
3867
3868   return \"{l|lwz} %0,%2\";
3869 }"
3870   [(set_attr "type" "load")])
3871
3872 (define_expand "fixuns_truncdfsi2"
3873   [(set (match_operand:SI 0 "gpc_reg_operand" "")
3874         (unsigned_fix:SI (match_operand:DF 1 "gpc_reg_operand" "")))]
3875   "! TARGET_POWER2 && ! TARGET_POWERPC && TARGET_HARD_FLOAT"
3876   "
3877 {
3878   emit_insn (gen_trunc_call (operands[0], operands[1],
3879                              gen_rtx (SYMBOL_REF, Pmode, RS6000_UITRUNC)));
3880   DONE;
3881 }")
3882
3883 (define_expand "trunc_call"
3884   [(parallel [(set (match_operand:SI 0 "" "")
3885                    (fix:SI (match_operand:DF 1 "" "")))
3886               (use (match_operand:SI 2 "" ""))])]
3887   "TARGET_HARD_FLOAT"
3888   "
3889 {
3890   rtx insns = gen_trunc_call_rtl (operands[0], operands[1], operands[2]);
3891   rtx first = XVECEXP (insns, 0, 0);
3892   rtx last = XVECEXP (insns, 0, XVECLEN (insns, 0) - 1);
3893
3894   REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
3895                                REG_NOTES (first));
3896   REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
3897
3898   emit_insn (insns);
3899   DONE;
3900 }")
3901
3902 (define_expand "trunc_call_rtl"
3903   [(set (reg:DF 33) (match_operand:DF 1 "gpc_reg_operand" ""))
3904    (use (reg:DF 33))
3905    (parallel [(set (reg:SI 3)
3906                    (call (mem:SI (match_operand 2 "" "")) (const_int 0)))
3907               (use (const_int 0))
3908               (clobber (scratch:SI))])
3909    (set (match_operand:SI 0 "gpc_reg_operand" "")
3910         (reg:SI 3))]
3911   "TARGET_HARD_FLOAT"
3912   "
3913 {
3914   rs6000_trunc_used = 1;
3915 }")
3916
3917 (define_insn "floatdidf2"
3918   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
3919         (float:DF (match_operand:DI 1 "gpc_reg_operand" "f")))]
3920   "TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3921   "fcfid %0,%1"
3922   [(set_attr "type" "fp")])
3923
3924 (define_insn "fix_truncdfdi2"
3925   [(set (match_operand:DI 0 "gpc_reg_operand" "=f")
3926         (fix:DI (match_operand:DF 1 "gpc_reg_operand" "f")))]
3927   "TARGET_POWERPC64 && TARGET_HARD_FLOAT"
3928   "fctidz %0,%1"
3929   [(set_attr "type" "fp")])
3930 \f
3931 ;; Define the DImode operations that can be done in a small number
3932 ;; of instructions.  The & constraints are to prevent the register
3933 ;; allocator from allocating registers that overlap with the inputs
3934 ;; (for example, having an input in 7,8 and an output in 6,7).  We
3935 ;; also allow for the the output being the same as one of the inputs.
3936
3937 (define_insn "*adddi3_noppc64"
3938   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r,r,r")
3939         (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,0,0")
3940                  (match_operand:DI 2 "reg_or_short_operand" "r,I,r,I")))]
3941   "! TARGET_POWERPC64"
3942   "*
3943 {
3944   if (WORDS_BIG_ENDIAN)
3945     return (GET_CODE (operands[2])) != CONST_INT
3946             ? \"{a|addc} %L0,%L1,%L2\;{ae|adde} %0,%1,%2\"
3947             : \"{ai|addic} %L0,%L1,%2\;{a%G2e|add%G2e} %0,%1\";
3948   else
3949     return (GET_CODE (operands[2])) != CONST_INT
3950             ? \"{a|addc} %0,%1,%2\;{ae|adde} %L0,%L1,%L2\"
3951             : \"{ai|addic} %0,%1,%2\;{a%G2e|add%G2e} %L0,%L1\";
3952 }"
3953   [(set_attr "length" "8")])
3954
3955 (define_insn "*subdi3_noppc64"
3956   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r,r,r,r")
3957         (minus:DI (match_operand:DI 1 "reg_or_short_operand" "r,I,0,r,I")
3958                   (match_operand:DI 2 "gpc_reg_operand" "r,r,r,0,0")))]
3959   "! TARGET_POWERPC64"
3960   "*
3961 {
3962   if (WORDS_BIG_ENDIAN)
3963     return (GET_CODE (operands[1]) != CONST_INT)
3964             ? \"{sf|subfc} %L0,%L2,%L1\;{sfe|subfe} %0,%2,%1\"
3965             : \"{sfi|subfic} %L0,%L2,%1\;{sf%G1e|subf%G1e} %0,%2\";
3966   else
3967     return (GET_CODE (operands[1]) != CONST_INT)
3968             ? \"{sf|subfc} %0,%2,%1\;{sfe|subfe} %L0,%L2,%L1\"
3969             : \"{sfi|subfic} %0,%2,%1\;{sf%G1e|subf%G1e} %L0,%L2\";
3970 }"
3971   [(set_attr "length" "8")])
3972
3973 (define_insn "*negdi2_noppc64"
3974   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
3975         (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))]
3976   "! TARGET_POWERPC64"
3977   "*
3978 {
3979   return (WORDS_BIG_ENDIAN)
3980     ? \"{sfi|subfic} %L0,%L1,0\;{sfze|subfze} %0,%1\"
3981     : \"{sfi|subfic} %0,%1,0\;{sfze|subfze} %L0,%L1\";
3982 }"
3983   [(set_attr "length" "8")])
3984
3985 (define_expand "mulsidi3"
3986   [(set (match_operand:DI 0 "gpc_reg_operand" "")
3987         (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
3988                  (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
3989   ""
3990   "
3991 {
3992   if (! TARGET_POWER && ! TARGET_POWERPC)
3993     {
3994       emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
3995       emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
3996       emit_insn (gen_mull_call ());
3997       if (WORDS_BIG_ENDIAN)
3998         emit_move_insn (operands[0], gen_rtx (REG, DImode, 3));
3999       else
4000         {
4001           emit_move_insn (operand_subword (operands[0], 0, 0, DImode),
4002                           gen_rtx (REG, SImode, 3));
4003           emit_move_insn (operand_subword (operands[0], 1, 0, DImode),
4004                           gen_rtx (REG, SImode, 4));
4005         }
4006       DONE;
4007     }
4008   else if (TARGET_POWER)
4009     {
4010       emit_insn (gen_mulsidi3_mq (operands[0], operands[1], operands[2]));
4011       DONE;
4012     }
4013 }")
4014
4015 (define_insn "mulsidi3_mq"
4016   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4017         (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
4018                  (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
4019    (clobber (match_scratch:SI 3 "=q"))]
4020   "TARGET_POWER"
4021   "mul %0,%1,%2\;mfmq %L0"
4022   [(set_attr "type" "imul")
4023    (set_attr "length" "8")])
4024
4025 (define_insn "*mulsidi3_powerpc"
4026   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
4027         (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
4028                  (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
4029   "TARGET_POWERPC && ! TARGET_POWERPC64"
4030   "*
4031 {
4032   return (WORDS_BIG_ENDIAN)
4033     ? \"mulhw %0,%1,%2\;mullw %L0,%1,%2\"
4034     : \"mulhw %L0,%1,%2\;mullw %0,%1,%2\";
4035 }"
4036   [(set_attr "type" "imul")
4037    (set_attr "length" "8")])
4038
4039 (define_split
4040   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4041         (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
4042                  (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
4043   "TARGET_POWERPC && ! TARGET_POWERPC64 && reload_completed"
4044   [(set (match_dup 3)
4045         (truncate:SI
4046          (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
4047                                (sign_extend:DI (match_dup 2)))
4048                       (const_int 32))))
4049    (set (match_dup 4)
4050         (mult:SI (match_dup 1)
4051                  (match_dup 2)))]
4052   "
4053 {
4054   int endian = (WORDS_BIG_ENDIAN == 0);
4055   operands[3] = operand_subword (operands[0], endian, 0, DImode);
4056   operands[4] = operand_subword (operands[0], 1 - endian, 0, DImode);
4057 }")
4058
4059 (define_insn "umulsidi3"
4060   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
4061         (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
4062                  (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
4063   "TARGET_POWERPC && ! TARGET_POWERPC64"
4064   "*
4065 {
4066   return (WORDS_BIG_ENDIAN)
4067     ? \"mulhwu %0,%1,%2\;mullw %L0,%1,%2\"
4068     : \"mulhwu %L0,%1,%2\;mullw %0,%1,%2\";
4069 }"
4070   [(set_attr "type" "imul")
4071    (set_attr "length" "8")])
4072
4073 (define_split
4074   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4075         (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
4076                  (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))]
4077   "TARGET_POWERPC && ! TARGET_POWERPC64 && reload_completed"
4078   [(set (match_dup 3)
4079         (truncate:SI
4080          (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
4081                                (zero_extend:DI (match_dup 2)))
4082                       (const_int 32))))
4083    (set (match_dup 4)
4084         (mult:SI (match_dup 1)
4085                  (match_dup 2)))]
4086   "
4087 {
4088   int endian = (WORDS_BIG_ENDIAN == 0);
4089   operands[3] = operand_subword (operands[0], endian, 0, DImode);
4090   operands[4] = operand_subword (operands[0], 1 - endian, 0, DImode);
4091 }")
4092
4093 (define_expand "smulsi3_highpart"
4094   [(set (match_operand:SI 0 "gpc_reg_operand" "")
4095         (truncate:SI
4096          (lshiftrt:DI (mult:DI (sign_extend:DI
4097                                 (match_operand:SI 1 "gpc_reg_operand" "%r"))
4098                                (sign_extend:DI
4099                                 (match_operand:SI 2 "gpc_reg_operand" "r")))
4100                       (const_int 32))))]
4101   ""
4102   "
4103 {
4104   if (! TARGET_POWER && ! TARGET_POWERPC)
4105     {
4106       emit_move_insn (gen_rtx (REG, SImode, 3), operands[1]);
4107       emit_move_insn (gen_rtx (REG, SImode, 4), operands[2]);
4108       emit_insn (gen_mulh_call ());
4109       emit_move_insn (operands[0], gen_rtx (REG, SImode, 3));
4110       DONE;
4111     }
4112   else if (TARGET_POWER)
4113     {
4114       emit_insn (gen_smulsi3_highpart_mq (operands[0], operands[1], operands[2]));
4115       DONE;
4116     }
4117 }")
4118
4119 (define_insn "smulsi3_highpart_mq"
4120   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4121         (truncate:SI
4122          (lshiftrt:DI (mult:DI (sign_extend:DI
4123                                 (match_operand:SI 1 "gpc_reg_operand" "%r"))
4124                                (sign_extend:DI
4125                                 (match_operand:SI 2 "gpc_reg_operand" "r")))
4126                       (const_int 32))))
4127    (clobber (match_scratch:SI 3 "=q"))]
4128   "TARGET_POWER"
4129   "mul %0,%1,%2"
4130   [(set_attr "type" "imul")])
4131
4132 (define_insn ""
4133   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4134         (truncate:SI
4135          (lshiftrt:DI (mult:DI (sign_extend:DI
4136                                 (match_operand:SI 1 "gpc_reg_operand" "%r"))
4137                                (sign_extend:DI
4138                                 (match_operand:SI 2 "gpc_reg_operand" "r")))
4139                       (const_int 32))))]
4140   "TARGET_POWERPC"
4141   "mulhw %0,%1,%2"
4142   [(set_attr "type" "imul")])
4143
4144 (define_insn "umulsi3_highpart"
4145   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
4146         (truncate:SI
4147          (lshiftrt:DI (mult:DI (zero_extend:DI
4148                                 (match_operand:SI 1 "gpc_reg_operand" "%r"))
4149                                (zero_extend:DI
4150                                 (match_operand:SI 2 "gpc_reg_operand" "r")))
4151                       (const_int 32))))]
4152   "TARGET_POWERPC"
4153   "mulhwu %0,%1,%2"
4154   [(set_attr "type" "imul")])
4155
4156 ;; If operands 0 and 2 are in the same register, we have a problem.  But
4157 ;; operands 0 and 1 (the usual case) can be in the same register.  That's
4158 ;; why we have the strange constraints below.
4159 (define_insn "ashldi3_power"
4160   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,&r")
4161         (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r,0,r")
4162                    (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
4163    (clobber (match_scratch:SI 3 "=X,q,q,q"))]
4164   "TARGET_POWER"
4165   "@
4166    {sli|slwi} %0,%L1,%h2\;{cal %L0,0(0)|li %L0,0}
4167    sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
4168    sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
4169    sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2"
4170   [(set_attr "length" "8")])
4171
4172 (define_insn "lshrdi3_power"
4173   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r,r,&r")
4174         (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r,0,r")
4175                      (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
4176    (clobber (match_scratch:SI 3 "=X,q,q,q"))]
4177   "TARGET_POWER"
4178   "@
4179    {cal %0,0(0)|li %0,0}\;{s%A2i|s%A2wi} %L0,%1,%h2
4180    sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2
4181    sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2
4182    sr%I2q %0,%1,%h2\;srl%I2q %L0,%L1,%h2"
4183   [(set_attr "length" "8")])
4184
4185 ;; Shift by a variable amount is too complex to be worth open-coding.  We
4186 ;; just handle shifts by constants.
4187 (define_insn "ashrdi3_power"
4188   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
4189         (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
4190                      (match_operand:SI 2 "const_int_operand" "M,i")))
4191    (clobber (match_scratch:SI 3 "=X,q"))]
4192   "TARGET_POWER"
4193   "@
4194    {srai|srawi} %0,%1,31\;{srai|srawi} %L0,%1,%h2
4195    sraiq %0,%1,%h2\;srliq %L0,%L1,%h2"
4196   [(set_attr "length" "8")])
4197 \f
4198 ;; PowerPC64 DImode operations.
4199
4200 (define_expand "adddi3"
4201   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4202         (plus:DI (match_operand:DI 1 "gpc_reg_operand" "")
4203                  (match_operand:DI 2 "add_operand" "")))]
4204   ""
4205   "
4206 {
4207   if (! TARGET_POWERPC64 && non_short_cint_operand (operands[2], DImode))
4208     FAIL;
4209 }")
4210
4211 ;; Discourage ai/addic because of carry but provide it in an alternative
4212 ;; allowing register zero as source.
4213
4214 (define_insn ""
4215   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,?r,r")
4216         (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r,b,r,b")
4217                  (match_operand:DI 2 "add_operand" "r,I,I,J")))]
4218   "TARGET_POWERPC64"
4219   "@
4220    add %0,%1,%2
4221    addi %0,%1,%2
4222    addic %0,%1,%2
4223    addis %0,%1,%v2")
4224
4225 (define_insn ""
4226   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
4227         (compare:CC (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
4228                              (match_operand:DI 2 "reg_or_short_operand" "r,I"))
4229                     (const_int 0)))
4230    (clobber (match_scratch:DI 3 "=r,r"))]
4231   "TARGET_POWERPC64"
4232   "@
4233    add. %3,%1,%2
4234    addic. %3,%1,%2"
4235   [(set_attr "type" "compare")])
4236
4237 (define_insn ""
4238   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
4239         (compare:CC (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
4240                              (match_operand:DI 2 "reg_or_short_operand" "r,I"))
4241                     (const_int 0)))
4242    (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
4243         (plus:DI (match_dup 1) (match_dup 2)))]
4244   "TARGET_POWERPC64"
4245   "@
4246    add. %0,%1,%2
4247    addic. %0,%1,%2"
4248   [(set_attr "type" "compare")])
4249
4250 ;; Split an add that we can't do in one insn into two insns, each of which
4251 ;; does one 16-bit part.  This is used by combine.  Note that the low-order
4252 ;; add should be last in case the result gets used in an address.
4253
4254 (define_split
4255   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4256         (plus:DI (match_operand:DI 1 "gpc_reg_operand" "")
4257                  (match_operand:DI 2 "non_add_cint_operand" "")))]
4258   "TARGET_POWERPC64"
4259   [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 3)))
4260    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]
4261 "
4262 {
4263   HOST_WIDE_INT low = INTVAL (operands[2]) & 0xffff;
4264   HOST_WIDE_INT high = INTVAL (operands[2]) & (~ (HOST_WIDE_INT) 0xffff);
4265
4266   if (low & 0x8000)
4267     high+=0x10000, low |= ((HOST_WIDE_INT) -1) << 16;
4268
4269   operands[3] = GEN_INT (high);
4270   operands[4] = GEN_INT (low);
4271 }")
4272
4273 (define_insn "one_cmpldi2"
4274   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4275         (not:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
4276   "TARGET_POWERPC64"
4277   "nor %0,%1,%1")
4278
4279 (define_insn ""
4280   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4281         (compare:CC (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4282                     (const_int 0)))
4283    (clobber (match_scratch:DI 2 "=r"))]
4284   "TARGET_POWERPC64"
4285   "nor. %2,%1,%1"
4286   [(set_attr "type" "compare")])
4287
4288 (define_insn ""
4289   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
4290         (compare:CC (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4291                     (const_int 0)))
4292    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4293         (not:DI (match_dup 1)))]
4294   "TARGET_POWERPC64"
4295   "nor. %0,%1,%1"
4296   [(set_attr "type" "compare")])
4297
4298 (define_insn ""
4299   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
4300         (minus:DI (match_operand:DI 1 "reg_or_short_operand" "r,I")
4301                   (match_operand:DI 2 "gpc_reg_operand" "r,r")))]
4302   "TARGET_POWERPC64"
4303   "@
4304    subf %0,%2,%1
4305    subfic %0,%2,%1")
4306
4307 (define_insn ""
4308   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4309         (compare:CC (minus:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4310                               (match_operand:DI 2 "gpc_reg_operand" "r"))
4311                     (const_int 0)))
4312    (clobber (match_scratch:DI 3 "=r"))]
4313   "TARGET_POWERPC64"
4314   "subf. %3,%2,%1"
4315   [(set_attr "type" "compare")])
4316
4317 (define_insn ""
4318   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4319         (compare:CC (minus:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4320                               (match_operand:DI 2 "gpc_reg_operand" "r"))
4321                     (const_int 0)))
4322    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4323         (minus:DI (match_dup 1) (match_dup 2)))]
4324   "TARGET_POWERPC64"
4325   "subf. %0,%2,%1"
4326   [(set_attr "type" "compare")])
4327
4328 (define_expand "subdi3"
4329   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4330         (minus:DI (match_operand:DI 1 "reg_or_short_operand" "")
4331                   (match_operand:DI 2 "reg_or_cint_operand" "")))]
4332   ""
4333   "
4334 {
4335   if (GET_CODE (operands[2]) == CONST_INT)
4336     {
4337       emit_insn (gen_adddi3 (operands[0], operands[1],
4338                              negate_rtx (DImode, operands[2])));
4339       DONE;
4340     }
4341 }")
4342
4343 (define_insn "absdi2"
4344   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
4345         (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))
4346    (clobber (match_scratch:DI 2 "=&r,&r"))]
4347   "TARGET_POWERPC64"
4348   "sradi %2,%1,31\;xor %0,%2,%1\;subf %0,%2,%0"
4349   [(set_attr "length" "12")])
4350
4351 (define_split
4352   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
4353         (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))
4354    (clobber (match_scratch:DI 2 "=&r,&r"))]
4355   "TARGET_POWERPC64 && reload_completed"
4356   [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 31)))
4357    (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
4358    (set (match_dup 0) (minus:DI (match_dup 2) (match_dup 0)))]
4359   "")
4360
4361 (define_insn ""
4362   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
4363         (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0"))))
4364    (clobber (match_scratch:DI 2 "=&r,&r"))]
4365   "TARGET_POWERPC64"
4366   "sradi %2,%1,31\;xor %0,%2,%1\;subf %0,%0,%2"
4367   [(set_attr "length" "12")])
4368
4369 (define_split
4370   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
4371         (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0"))))
4372    (clobber (match_scratch:DI 2 "=&r,&r"))]
4373   "TARGET_POWERPC64 && reload_completed"
4374   [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 31)))
4375    (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
4376    (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 2)))]
4377   "")
4378
4379 (define_expand "negdi2"
4380   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4381         (neg:DI (match_operand:DI 1 "gpc_reg_operand" "")))]
4382   ""
4383   "")
4384
4385 (define_insn ""
4386   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4387         (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
4388   "TARGET_POWERPC64"
4389   "neg %0,%1")
4390
4391 (define_insn ""
4392   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4393         (compare:CC (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4394                     (const_int 0)))
4395    (clobber (match_scratch:DI 2 "=r"))]
4396   "TARGET_POWERPC64"
4397   "neg. %2,%1"
4398   [(set_attr "type" "compare")])
4399
4400 (define_insn ""
4401   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
4402         (compare:CC (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4403                     (const_int 0)))
4404    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4405         (neg:DI (match_dup 1)))]
4406   "TARGET_POWERPC64"
4407   "neg. %0,%1"
4408   [(set_attr "type" "compare")])
4409
4410 (define_insn "ffsdi2"
4411   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r")
4412         (ffs:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
4413   "TARGET_POWERPC64"
4414   "neg %0,%1\;and %0,%0,%1\;cntlzd %0,%0\;subfic %0,%0,64"
4415   [(set_attr "length" "16")])
4416
4417 (define_insn "muldi3"
4418   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4419         (mult:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4420                  (match_operand:DI 2 "gpc_reg_operand" "r")))]
4421   "TARGET_POWERPC64"
4422   "mulld %0,%1,%2"
4423    [(set_attr "type" "imul")])
4424
4425 (define_insn "smuldi3_highpart"
4426   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4427         (truncate:DI
4428          (lshiftrt:TI (mult:TI (sign_extend:TI
4429                                 (match_operand:DI 1 "gpc_reg_operand" "%r"))
4430                                (sign_extend:TI
4431                                 (match_operand:DI 2 "gpc_reg_operand" "r")))
4432                       (const_int 64))))]
4433   "TARGET_POWERPC64"
4434   "mulhd %0,%1,%2"
4435   [(set_attr "type" "imul")])
4436
4437 (define_insn "umuldi3_highpart"
4438   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4439         (truncate:DI
4440          (lshiftrt:TI (mult:TI (zero_extend:TI
4441                                 (match_operand:DI 1 "gpc_reg_operand" "%r"))
4442                                (zero_extend:TI
4443                                 (match_operand:DI 2 "gpc_reg_operand" "r")))
4444                       (const_int 64))))]
4445   "TARGET_POWERPC64"
4446   "mulhdu %0,%1,%2"
4447   [(set_attr "type" "imul")])
4448
4449 (define_expand "divdi3"
4450   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4451         (div:DI (match_operand:DI 1 "gpc_reg_operand" "")
4452                 (match_operand:DI 2 "reg_or_cint_operand" "")))]
4453   "TARGET_POWERPC64"
4454   "
4455 {
4456   if (GET_CODE (operands[2]) == CONST_INT
4457       && exact_log2 (INTVAL (operands[2])) >= 0)
4458     ;
4459   else
4460     operands[2] = force_reg (DImode, operands[2]);
4461 }")
4462
4463 (define_expand "moddi3"
4464   [(use (match_operand:DI 0 "gpc_reg_operand" ""))
4465    (use (match_operand:DI 1 "gpc_reg_operand" ""))
4466    (use (match_operand:DI 2 "reg_or_cint_operand" ""))]
4467   "TARGET_POWERPC64"
4468   "
4469 {
4470   int i = exact_log2 (INTVAL (operands[2]));
4471   rtx temp1;
4472   rtx temp2;
4473
4474   if (GET_CODE (operands[2]) != CONST_INT || i < 0)
4475     FAIL;
4476
4477   temp1 = gen_reg_rtx (DImode);
4478   temp2 = gen_reg_rtx (DImode);
4479
4480   emit_insn (gen_divdi3 (temp1, operands[1], operands[2]));
4481   emit_insn (gen_ashldi3 (temp2, temp1, GEN_INT (i)));
4482   emit_insn (gen_subdi3 (operands[0], operands[1], temp2));
4483   DONE;
4484 }")
4485
4486 (define_insn ""
4487   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4488         (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4489                 (match_operand:DI 2 "const_int_operand" "N")))]
4490   "TARGET_POWERPC64 && exact_log2 (INTVAL (operands[2])) >= 0"
4491   "sradi %0,%1,%p2\;addze %0,%0"
4492   [(set_attr "length" "8")])
4493
4494 (define_insn ""
4495   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4496         (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4497                             (match_operand:DI 2 "const_int_operand" "N"))
4498                     (const_int 0)))
4499    (clobber (match_scratch:DI 3 "=r"))]
4500   "TARGET_POWERPC64 && exact_log2 (INTVAL (operands[2])) >= 0"
4501   "sradi %3,%1,%p2\;addze. %3,%3"
4502   [(set_attr "type" "compare")
4503    (set_attr "length" "8")])
4504
4505 (define_insn ""
4506   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4507         (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4508                             (match_operand:DI 2 "const_int_operand" "N"))
4509                     (const_int 0)))
4510    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4511         (div:DI (match_dup 1) (match_dup 2)))]
4512   "TARGET_POWERPC64 && exact_log2 (INTVAL (operands[2])) >= 0"
4513   "sradi %0,%1,%p2\;addze. %0,%0"
4514   [(set_attr "type" "compare")
4515    (set_attr "length" "8")])
4516
4517 (define_insn ""
4518   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4519         (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4520                  (match_operand:DI 2 "gpc_reg_operand" "r")))]
4521   "TARGET_POWERPC64"
4522   "divd %0,%1,%2"
4523   [(set_attr "type" "idiv")])
4524
4525 (define_insn "udivdi3"
4526   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4527         (udiv:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4528                  (match_operand:DI 2 "gpc_reg_operand" "r")))]
4529   "TARGET_POWERPC64"
4530   "divdu %0,%1,%2"
4531   [(set_attr "type" "idiv")])
4532
4533 (define_insn "rotldi3"
4534   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4535         (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4536                    (match_operand:DI 2 "reg_or_cint_operand" "ri")))]
4537   "TARGET_POWERPC64"
4538   "rld%I2cl %0,%1,%H2,0")
4539
4540 (define_insn ""
4541   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4542         (compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4543                                (match_operand:DI 2 "reg_or_cint_operand" "ri"))
4544                     (const_int 0)))
4545    (clobber (match_scratch:DI 3 "=r"))]
4546   "TARGET_POWERPC64"
4547   "rld%I2cl. %3,%1,%H2,0"
4548   [(set_attr "type" "delayed_compare")])
4549
4550 (define_insn ""
4551   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4552         (compare:CC (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4553                                (match_operand:DI 2 "reg_or_cint_operand" "ri"))
4554                     (const_int 0)))
4555    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4556         (rotate:DI (match_dup 1) (match_dup 2)))]
4557   "TARGET_POWERPC64"
4558   "rld%I2cl. %0,%1,%H2,0"
4559   [(set_attr "type" "delayed_compare")])
4560
4561 (define_expand "ashldi3"
4562   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4563         (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
4564                    (match_operand:SI 2 "reg_or_cint_operand" "")))]
4565   "TARGET_POWERPC64 || TARGET_POWER"
4566   "
4567 {
4568   if (TARGET_POWERPC64)
4569     ;
4570   else if (TARGET_POWER)
4571     {
4572       emit_insn (gen_ashldi3_power (operands[0], operands[1], operands[2]));
4573       DONE;
4574     }
4575   else
4576     FAIL;
4577 }")
4578
4579 (define_insn ""
4580   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4581         (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4582                    (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
4583   "TARGET_POWERPC64"
4584   "sld%I2 %0,%1,%H2"
4585   [(set_attr "length" "8")])
4586   
4587 (define_insn ""
4588   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4589         (compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4590                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4591                     (const_int 0)))
4592    (clobber (match_scratch:DI 3 "=r"))]
4593   "TARGET_POWERPC64"
4594   "sld%I2. %3,%1,%H2"
4595   [(set_attr "type" "delayed_compare")])
4596   
4597 (define_insn ""
4598   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4599         (compare:CC (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4600                                (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4601                     (const_int 0)))
4602    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4603         (ashift:DI (match_dup 1) (match_dup 2)))]
4604   "TARGET_POWERPC64"
4605   "sld%I2. %0,%1,%H2"
4606   [(set_attr "type" "delayed_compare")])
4607
4608 (define_expand "lshrdi3"
4609   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4610         (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
4611                      (match_operand:SI 2 "reg_or_cint_operand" "")))]
4612   "TARGET_POWERPC64 || TARGET_POWER"
4613   "
4614 {
4615   if (TARGET_POWERPC64)
4616     ;
4617   else if (TARGET_POWER)
4618     {
4619       emit_insn (gen_lshrdi3_power (operands[0], operands[1], operands[2]));
4620       DONE;
4621     }
4622   else
4623     FAIL;
4624 }")
4625
4626 (define_insn ""
4627   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4628         (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4629                      (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
4630   "TARGET_POWERPC64"
4631   "srd%I2 %0,%1,%H2")
4632
4633 (define_insn ""
4634   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4635         (compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4636                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4637                     (const_int 0)))
4638    (clobber (match_scratch:DI 3 "=r"))]
4639   "TARGET_POWERPC64"
4640   "srd%I2. %3,%1,%H2"
4641   [(set_attr "type" "delayed_compare")])
4642
4643 (define_insn ""
4644   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4645         (compare:CC (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4646                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4647                     (const_int 0)))
4648    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4649         (lshiftrt:DI (match_dup 1) (match_dup 2)))]
4650   "TARGET_POWERPC64"
4651   "srd%I2. %0,%1,%H2"
4652   [(set_attr "type" "delayed_compare")])
4653
4654 (define_expand "ashrdi3"
4655   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4656         (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
4657                      (match_operand:SI 2 "reg_or_cint_operand" "")))]
4658   "TARGET_POWERPC64 || TARGET_POWER"
4659   "
4660 {
4661   if (TARGET_POWERPC64)
4662     ;
4663   else if (TARGET_POWER && GET_CODE (operands[2]) == CONST_INT)
4664     {
4665       emit_insn (gen_ashrdi3_power (operands[0], operands[1], operands[2]));
4666       DONE;
4667     }
4668   else
4669     FAIL;
4670 }")
4671
4672 (define_insn ""
4673   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4674         (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4675                      (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
4676   "TARGET_POWERPC64"
4677   "srad%I2 %0,%1,%H2")
4678
4679 (define_insn ""
4680   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4681         (compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4682                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4683                     (const_int 0)))
4684    (clobber (match_scratch:DI 3 "=r"))]
4685   "TARGET_POWERPC64"
4686   "srad%I2. %3,%1,%H2"
4687   [(set_attr "type" "delayed_compare")])
4688
4689 (define_insn ""
4690   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4691         (compare:CC (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r")
4692                                  (match_operand:SI 2 "reg_or_cint_operand" "ri"))
4693                     (const_int 0)))
4694    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4695         (ashiftrt:DI (match_dup 1) (match_dup 2)))]
4696   "TARGET_POWERPC64"
4697   "srad%I2. %0,%1,%H2"
4698   [(set_attr "type" "delayed_compare")])
4699
4700 (define_insn "anddi3"
4701   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r")
4702         (and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
4703                 (match_operand:DI 2 "and_operand" "?r,K,J")))
4704    (clobber (match_scratch:CC 3 "=X,x,x"))]
4705   "TARGET_POWERPC64"
4706   "@
4707    and %0,%1,%2
4708    andi. %0,%1,%b2
4709    andis. %0,%1,%u2")
4710
4711 (define_insn ""
4712   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x")
4713         (compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
4714                             (match_operand:DI 2 "and_operand" "r,K,J"))
4715                     (const_int 0)))
4716    (clobber (match_scratch:DI 3 "=r,r,r"))]
4717   "TARGET_POWERPC64"
4718   "@
4719    and. %3,%1,%2
4720    andi. %3,%1,%b2
4721    andis. %3,%1,%u2"
4722   [(set_attr "type" "compare,compare,compare")])
4723
4724 (define_insn ""
4725   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x")
4726         (compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
4727                             (match_operand:DI 2 "and_operand" "r,K,J"))
4728                     (const_int 0)))
4729    (set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r")
4730         (and:DI (match_dup 1) (match_dup 2)))]
4731   "TARGET_POWERPC64"
4732   "@
4733    and. %0,%1,%2
4734    andi. %0,%1,%b2
4735    andis. %0,%1,%u2"
4736   [(set_attr "type" "compare,compare,compare")])
4737
4738 ;; Take a AND with a constant that cannot be done in a single insn and try to
4739 ;; split it into two insns.  This does not verify that the insns are valid
4740 ;; since this need not be done as combine will do it.
4741
4742 (define_split
4743   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4744         (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
4745                 (match_operand:DI 2 "non_and_cint_operand" "")))]
4746   "TARGET_POWERPC64"
4747   [(set (match_dup 0) (and:DI (match_dup 1) (match_dup 3)))
4748    (set (match_dup 0) (and:DI (match_dup 0) (match_dup 4)))]
4749   "
4750 {
4751   int maskval = INTVAL (operands[2]);
4752   int i, transitions, last_bit_value;
4753   int orig = maskval, first_c = maskval, second_c;
4754
4755   /* We know that MASKVAL must have more than 2 bit-transitions.  Start at
4756      the low-order bit and count for the third transition.  When we get there,
4757      make a first mask that has everything to the left of that position
4758      a one.  Then make the second mask to turn off whatever else is needed.  */
4759
4760   for (i = 1, transitions = 0, last_bit_value = maskval & 1; i < 32; i++)
4761     {
4762       if (((maskval >>= 1) & 1) != last_bit_value)
4763         last_bit_value ^= 1, transitions++;
4764
4765       if (transitions > 2)
4766         {
4767           first_c |= (~0) << i;
4768           break;
4769         }
4770     }
4771
4772   second_c = orig | ~ first_c;
4773
4774   operands[3] = gen_rtx (CONST_INT, VOIDmode, first_c);
4775   operands[4] = gen_rtx (CONST_INT, VOIDmode, second_c);
4776 }")
4777
4778 (define_insn "iordi3"
4779   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r")
4780         (ior:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
4781                 (match_operand:DI 2 "logical_operand" "r,K,J")))]
4782   "TARGET_POWERPC64"
4783   "@
4784    or %0,%1,%2
4785    ori %0,%1,%b2
4786    oris %0,%1,%u2")
4787
4788 (define_insn ""
4789   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4790         (compare:CC (ior:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4791                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4792                     (const_int 0)))
4793    (clobber (match_scratch:DI 3 "=r"))]
4794   "TARGET_POWERPC64"
4795   "or. %3,%1,%2"
4796   [(set_attr "type" "compare")])
4797
4798 (define_insn ""
4799   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4800         (compare:CC (ior:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4801                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4802                     (const_int 0)))
4803    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4804         (ior:DI (match_dup 1) (match_dup 2)))]
4805   "TARGET_POWERPC64"
4806   "or. %0,%1,%2"
4807   [(set_attr "type" "compare")])
4808
4809 ;; Split an IOR that we can't do in one insn into two insns, each of which
4810 ;; does one 16-bit part.  This is used by combine.
4811
4812 (define_split
4813   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4814         (ior:DI (match_operand:DI 1 "gpc_reg_operand" "")
4815                 (match_operand:DI 2 "non_logical_cint_operand" "")))]
4816   "TARGET_POWERPC64"
4817   [(set (match_dup 0) (ior:DI (match_dup 1) (match_dup 3)))
4818    (set (match_dup 0) (ior:DI (match_dup 0) (match_dup 4)))]
4819 "
4820 {
4821   operands[3] = gen_rtx (CONST_INT, VOIDmode,
4822                          INTVAL (operands[2]) & (~ (HOST_WIDE_INT) 0xffff));
4823   operands[4] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0xffff);
4824 }")
4825
4826 (define_insn "xordi3"
4827   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r")
4828         (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r")
4829                 (match_operand:DI 2 "logical_operand" "r,K,J")))]
4830   "TARGET_POWERPC64"
4831   "@
4832    xor %0,%1,%2
4833    xori %0,%1,%b2
4834    xoris %0,%1,%u2")
4835
4836 (define_insn ""
4837   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4838         (compare:CC (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4839                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4840                     (const_int 0)))
4841    (clobber (match_scratch:DI 3 "=r"))]
4842   "TARGET_POWERPC64"
4843   "xor. %3,%1,%2"
4844   [(set_attr "type" "compare")])
4845
4846 (define_insn ""
4847   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4848         (compare:CC (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4849                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4850                     (const_int 0)))
4851    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4852         (xor:DI (match_dup 1) (match_dup 2)))]
4853   "TARGET_POWERPC64"
4854   "xor. %0,%1,%2"
4855   [(set_attr "type" "compare")])
4856
4857 ;; Split an XOR that we can't do in one insn into two insns, each of which
4858 ;; does one 16-bit part.  This is used by combine.
4859
4860 (define_split
4861   [(set (match_operand:DI 0 "gpc_reg_operand" "")
4862         (xor:DI (match_operand:DI 1 "gpc_reg_operand" "")
4863                 (match_operand:DI 2 "non_logical_cint_operand" "")))]
4864   "TARGET_POWERPC64"
4865   [(set (match_dup 0) (xor:DI (match_dup 1) (match_dup 3)))
4866    (set (match_dup 0) (xor:DI (match_dup 0) (match_dup 4)))]
4867 "
4868 {
4869   operands[3] = gen_rtx (CONST_INT, VOIDmode,
4870                          INTVAL (operands[2]) & 0xffff0000);
4871   operands[4] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0xffff);
4872 }")
4873
4874 (define_insn ""
4875   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4876         (not:DI (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4877                         (match_operand:DI 2 "gpc_reg_operand" "r"))))]
4878    "TARGET_POWERPC64"
4879    "eqv %0,%1,%2")
4880
4881 (define_insn ""
4882   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4883         (compare:CC (not:DI (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4884                                     (match_operand:DI 2 "gpc_reg_operand" "r")))
4885                     (const_int 0)))
4886    (clobber (match_scratch:DI 3 "=r"))]
4887    "TARGET_POWERPC64"
4888    "eqv. %3,%1,%2"
4889    [(set_attr "type" "compare")])
4890
4891 (define_insn ""
4892   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4893         (compare:CC (not:DI (xor:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
4894                                     (match_operand:DI 2 "gpc_reg_operand" "r")))
4895                     (const_int 0)))
4896    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4897         (not:DI (xor:DI (match_dup 1) (match_dup 2))))]
4898    "TARGET_POWERPC64"
4899    "eqv. %0,%1,%2"
4900    [(set_attr "type" "compare")])
4901
4902 (define_insn ""
4903   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4904         (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4905                 (match_operand:DI 2 "gpc_reg_operand" "r")))]
4906   "TARGET_POWERPC64"
4907   "andc %0,%2,%1")
4908
4909 (define_insn ""
4910   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4911         (compare:CC (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4912                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4913                     (const_int 0)))
4914    (clobber (match_scratch:DI 3 "=r"))]
4915   "TARGET_POWERPC64"
4916   "andc. %3,%2,%1"
4917   [(set_attr "type" "compare")])
4918
4919 (define_insn ""
4920   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4921         (compare:CC (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4922                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4923                     (const_int 0)))
4924    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4925         (and:DI (not:DI (match_dup 1)) (match_dup 2)))]
4926   "TARGET_POWERPC64"
4927   "andc. %0,%2,%1"
4928   [(set_attr "type" "compare")])
4929
4930 (define_insn ""
4931   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4932         (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4933                 (match_operand:DI 2 "gpc_reg_operand" "r")))]
4934   "TARGET_POWERPC64"
4935   "orc %0,%2,%1")
4936
4937 (define_insn ""
4938   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4939         (compare:CC (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4940                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4941                     (const_int 0)))
4942    (clobber (match_scratch:DI 3 "=r"))]
4943   "TARGET_POWERPC64"
4944   "orc. %3,%2,%1"
4945   [(set_attr "type" "compare")])
4946
4947 (define_insn ""
4948   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4949         (compare:CC (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "r"))
4950                             (match_operand:DI 2 "gpc_reg_operand" "r"))
4951                     (const_int 0)))
4952    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4953         (ior:DI (not:DI (match_dup 1)) (match_dup 2)))]
4954   "TARGET_POWERPC64"
4955   "orc. %0,%2,%1"
4956   [(set_attr "type" "compare")])
4957
4958 (define_insn ""
4959   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4960         (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
4961                 (not:DI (match_operand:DI 2 "gpc_reg_operand" "r"))))]
4962   "TARGET_POWERPC64"
4963   "nand %0,%1,%2")
4964
4965 (define_insn ""
4966   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4967         (compare:CC (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
4968                             (not:DI (match_operand:DI 2 "gpc_reg_operand" "r")))
4969                     (const_int 0)))
4970    (clobber (match_scratch:DI 3 "=r"))]
4971   "TARGET_POWERPC64"
4972   "nand. %3,%1,%2"
4973   [(set_attr "type" "compare")])
4974
4975 (define_insn ""
4976   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4977         (compare:CC (ior:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
4978                             (not:DI (match_operand:DI 2 "gpc_reg_operand" "r")))
4979                     (const_int 0)))
4980    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
4981         (ior:DI (not:DI (match_dup 1)) (not:DI (match_dup 2))))]
4982   "TARGET_POWERPC64"
4983   "nand. %0,%1,%2"
4984   [(set_attr "type" "compare")])
4985
4986 (define_insn ""
4987   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
4988         (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
4989                 (not:DI (match_operand:DI 2 "gpc_reg_operand" "r"))))]
4990   "TARGET_POWERPC64"
4991   "nor %0,%1,%2")
4992
4993 (define_insn ""
4994   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4995         (compare:CC (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
4996                             (not:DI (match_operand:DI 2 "gpc_reg_operand" "r")))
4997                     (const_int 0)))
4998    (clobber (match_scratch:DI 3 "=r"))]
4999   "TARGET_POWERPC64"
5000   "nor. %3,%1,%2"
5001   [(set_attr "type" "compare")])
5002
5003 (define_insn ""
5004   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
5005         (compare:CC (and:DI (not:DI (match_operand:DI 1 "gpc_reg_operand" "%r"))
5006                             (not:DI (match_operand:DI 2 "gpc_reg_operand" "r")))
5007                     (const_int 0)))
5008    (set (match_operand:DI 0 "gpc_reg_operand" "=r")
5009         (and:DI (not:DI (match_dup 1)) (not:DI (match_dup 2))))]
5010   "TARGET_POWERPC64"
5011   "nor. %0,%1,%2"
5012   [(set_attr "type" "compare")])
5013 \f
5014 ;; Now define ways of moving data around.
5015
5016 ;; Elf specific ways of loading addresses for non-PIC code.
5017 ;; The output of this could be r0, but we limit it to base
5018 ;; registers, since almost all uses of this will need it
5019 ;; in a base register shortly.
5020 (define_insn "elf_high"
5021   [(set (match_operand:SI 0 "register_operand" "=b")
5022         (high:SI (match_operand 1 "" "")))]
5023   "TARGET_ELF && !TARGET_64BIT"
5024   "{cau|addis} %0,0,%1@ha")
5025
5026 (define_insn "elf_low"
5027   [(set (match_operand:SI 0 "register_operand" "=r")
5028         (lo_sum:SI (match_operand:SI 1 "register_operand" "b")
5029                    (match_operand 2 "" "")))]
5030    "TARGET_ELF && !TARGET_64BIT"
5031    "{cal %0,%a2@l(%1)|addi %0,%1,%2@l}")
5032
5033 ;; Set up a register with a value from the GOT table
5034
5035 (define_expand "movsi_got"
5036   [(set (match_operand:SI 0 "register_operand" "")
5037         (unspec [(match_operand:SI 1 "got_operand" "")
5038                  (match_dup 2)] 8))]
5039   "(DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS) && flag_pic == 1"
5040   "
5041 {
5042   operands[2] = rs6000_got_register (operands[1]);
5043 }")
5044
5045 (define_insn "*movsi_got_internal"
5046   [(set (match_operand:SI 0 "register_operand" "=r")
5047         (unspec [(match_operand:SI 1 "got_operand" "")
5048                  (match_operand:SI 2 "register_operand" "b")] 8))]
5049   "(DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS) && flag_pic == 1"
5050   "{l|lwz} %0,%a1@got(%2)"
5051   [(set_attr "type" "load")])
5052
5053 ;; For SI, we special-case integers that can't be loaded in one insn.  We
5054 ;; do the load 16-bits at a time.  We could do this by loading from memory,
5055 ;; and this is even supposed to be faster, but it is simpler not to get
5056 ;; integers in the TOC.
5057 (define_expand "movsi"
5058   [(set (match_operand:SI 0 "general_operand" "")
5059         (match_operand:SI 1 "any_operand" ""))]
5060   ""
5061   "
5062 {
5063   if (GET_CODE (operands[0]) != REG)
5064     operands[1] = force_reg (SImode, operands[1]);
5065
5066   /* Convert a move of a CONST_DOUBLE into a CONST_INT */
5067   if (GET_CODE (operands[1]) == CONST_DOUBLE)
5068     operands[1] = GEN_INT (CONST_DOUBLE_LOW (operands[1]));
5069
5070   /* Use default pattern for address of ELF small data */
5071   if (TARGET_ELF
5072       && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
5073       && (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
5074       && small_data_operand (operands[1], SImode))
5075     {
5076       emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
5077       DONE;
5078     }
5079
5080   if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
5081       && flag_pic == 1 && got_operand (operands[1], SImode))
5082     {
5083       emit_insn (gen_movsi_got (operands[0], operands[1]));
5084       DONE;
5085     }
5086
5087   if (TARGET_ELF && TARGET_NO_TOC && !TARGET_64BIT
5088       && !flag_pic
5089       && CONSTANT_P (operands[1])
5090       && GET_CODE (operands[1]) != HIGH
5091       && GET_CODE (operands[1]) != CONST_INT)
5092     {
5093       rtx target = (reload_completed || reload_in_progress)
5094                         ? operands[0] : gen_reg_rtx (SImode);
5095
5096       /* If this is a function address on -mcall-aixdesc or -mcall-nt,
5097          convert it to the address of the descriptor.  */
5098       if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_NT)
5099           && GET_CODE (operands[1]) == SYMBOL_REF
5100           && XSTR (operands[1], 0)[0] == '.')
5101         {
5102           char *name = XSTR (operands[1], 0);
5103           rtx new_ref;
5104           while (*name == '.')
5105             name++;
5106           new_ref = gen_rtx (SYMBOL_REF, Pmode, name);
5107           CONSTANT_POOL_ADDRESS_P (new_ref) = CONSTANT_POOL_ADDRESS_P (operands[1]);
5108           SYMBOL_REF_FLAG (new_ref) = SYMBOL_REF_FLAG (operands[1]);
5109           SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
5110           operands[1] = new_ref;
5111         }
5112
5113       emit_insn (gen_elf_high (target, operands[1]));
5114       emit_insn (gen_elf_low (operands[0], target, operands[1]));
5115       DONE;
5116     }
5117
5118   if (GET_CODE (operands[1]) == CONST
5119       && DEFAULT_ABI == ABI_NT
5120       && !side_effects_p (operands[0]))
5121     {
5122       rtx const_term = const0_rtx;
5123       rtx sym = eliminate_constant_term (XEXP (operands[1], 0), &const_term);
5124       if (sym && GET_CODE (const_term) == CONST_INT
5125           && (GET_CODE (sym) == SYMBOL_REF || GET_CODE (sym) == LABEL_REF))
5126         {
5127           unsigned HOST_WIDE_INT value = INTVAL (const_term);
5128           int new_reg_p = (flag_expensive_optimizations
5129                            && !reload_completed
5130                            && !reload_in_progress);
5131           rtx tmp1 = (new_reg_p && value != 0) ? gen_reg_rtx (SImode) : operands[0];
5132
5133           emit_insn (gen_movsi (tmp1, sym));
5134           if (INTVAL (const_term) != 0)
5135             {
5136               if (value + 0x8000 < 0x10000)
5137                 emit_insn (gen_addsi3 (operands[0], tmp1, GEN_INT (value)));
5138
5139               else
5140                 {
5141                   HOST_WIDE_INT high_int = value & (~ (HOST_WIDE_INT) 0xffff);
5142                   HOST_WIDE_INT low_int = value & 0xffff;
5143                   rtx tmp2 = (!new_reg_p || !low_int) ? operands[0] : gen_reg_rtx (Pmode);
5144
5145                   if (low_int & 0x8000)
5146                     high_int += 0x10000, low_int |= ((HOST_WIDE_INT) -1) << 16;
5147
5148                   emit_insn (gen_addsi3 (tmp2, tmp1, GEN_INT (high_int)));
5149                   if (low_int)
5150                     emit_insn (gen_addsi3 (operands[0], tmp2, GEN_INT (low_int)));
5151                 }
5152             }
5153           DONE;
5154         }
5155       else
5156         fatal_insn (\"bad address\", operands[1]);
5157     }
5158
5159   if ((!TARGET_WINDOWS_NT || DEFAULT_ABI != ABI_NT)
5160       && CONSTANT_P (operands[1])
5161       && GET_CODE (operands[1]) != CONST_INT
5162       && GET_CODE (operands[1]) != HIGH
5163       && ! LEGITIMATE_CONSTANT_POOL_ADDRESS_P (operands[1]))
5164     {
5165       /* Emit a USE operation so that the constant isn't deleted if
5166          expensive optimizations are turned on because nobody
5167          references it.  This should only be done for operands that
5168          contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
5169          This should not be done for operands that contain LABEL_REFs.
5170          For now, we just handle the obvious case.  */
5171       if (GET_CODE (operands[1]) != LABEL_REF)
5172         emit_insn (gen_rtx (USE, VOIDmode, operands[1]));
5173
5174       /* If we are to limit the number of things we put in the TOC and
5175          this is a symbol plus a constant we can add in one insn,
5176          just put the symbol in the TOC and add the constant.  Don't do
5177          this if reload is in progress.  */
5178       if (GET_CODE (operands[1]) == CONST
5179           && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
5180           && GET_CODE (XEXP (operands[1], 0)) == PLUS
5181           && add_operand (XEXP (XEXP (operands[1], 0), 1), SImode)
5182           && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
5183               || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
5184           && ! side_effects_p (operands[0]))
5185         {
5186           rtx sym = force_const_mem (SImode, XEXP (XEXP (operands[1], 0), 0));
5187           rtx other = XEXP (XEXP (operands[1], 0), 1);
5188
5189           emit_insn (gen_addsi3 (operands[0], force_reg (SImode, sym), other));
5190           DONE;
5191         }
5192
5193       operands[1] = force_const_mem (SImode, operands[1]);
5194       if (! memory_address_p (SImode, XEXP (operands[1], 0))
5195           && ! reload_in_progress)
5196         operands[1] = change_address (operands[1], SImode,
5197                                       XEXP (operands[1], 0));
5198     }
5199 }")
5200
5201 (define_insn ""
5202   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,m,r,r,r,r,r,*q,*c*l,*h")
5203         (match_operand:SI 1 "input_operand" "r,S,T,U,m,r,I,J,n,R,*h,r,r,0"))]
5204   "gpc_reg_operand (operands[0], SImode)
5205    || gpc_reg_operand (operands[1], SImode)"
5206   "@
5207    mr %0,%1
5208    {l|lwz} %0,[toc]%1(2)
5209    {l|lwz} %0,[toc]%l1(2)
5210    {cal|la} %0,%a1
5211    {l%U1%X1|lwz%U1%X1} %0,%1
5212    {st%U0%X0|stw%U0%X0} %1,%0
5213    {lil|li} %0,%1
5214    {liu|lis} %0,%v1
5215    #
5216    {cal|la} %0,%1(%*)
5217    mf%1 %0
5218    mt%0 %1
5219    mt%0 %1
5220    cror 0,0,0"
5221   [(set_attr "type" "*,load,load,*,load,store,*,*,*,*,*,*,mtjmpr,*")
5222    (set_attr "length" "4,4,4,4,4,4,4,4,8,4,4,4,4,4")])
5223
5224 ;; Split a load of a large constant into the appropriate two-insn
5225 ;; sequence.
5226
5227 (define_split
5228   [(set (match_operand:SI 0 "gpc_reg_operand" "")
5229         (match_operand:SI 1 "const_int_operand" ""))]
5230   "(unsigned) (INTVAL (operands[1]) + 0x8000) >= 0x10000
5231    && (INTVAL (operands[1]) & 0xffff) != 0"
5232   [(set (match_dup 0)
5233         (match_dup 2))
5234    (set (match_dup 0)
5235         (ior:SI (match_dup 0)
5236                 (match_dup 3)))]
5237   "
5238 {
5239   operands[2] = gen_rtx (CONST_INT, VOIDmode,
5240                          INTVAL (operands[1]) & 0xffff0000);
5241   operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff);
5242 }")
5243
5244 (define_insn ""
5245   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
5246         (compare:CC (match_operand:SI 1 "gpc_reg_operand" "r")
5247                     (const_int 0)))
5248    (set (match_operand:SI 0 "gpc_reg_operand" "=r") (match_dup 1))]
5249   ""
5250   "mr. %0,%1"
5251   [(set_attr "type" "compare")])
5252 \f
5253 (define_expand "movhi"
5254   [(set (match_operand:HI 0 "general_operand" "")
5255         (match_operand:HI 1 "any_operand" ""))]
5256   ""
5257   "
5258 {
5259   if (GET_CODE (operands[0]) != REG)
5260     operands[1] = force_reg (HImode, operands[1]);
5261
5262   if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT)
5263     {
5264       operands[1] = force_const_mem (HImode, operands[1]);
5265       if (! memory_address_p (HImode, XEXP (operands[1], 0))
5266           && ! reload_in_progress)
5267         operands[1] = change_address (operands[1], HImode,
5268                                       XEXP (operands[1], 0));
5269     }
5270 }")
5271
5272 (define_insn ""
5273   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
5274         (match_operand:HI 1 "input_operand" "r,m,r,i,*h,r,r,0"))]
5275   "gpc_reg_operand (operands[0], HImode)
5276    || gpc_reg_operand (operands[1], HImode)"
5277   "@
5278    mr %0,%1
5279    lhz%U1%X1 %0,%1
5280    sth%U0%X0 %1,%0
5281    {lil|li} %0,%w1
5282    mf%1 %0
5283    mt%0 %1
5284    mt%0 %1
5285    cror 0,0,0"
5286   [(set_attr "type" "*,load,store,*,*,*,mtjmpr,*")])
5287
5288 (define_expand "movqi"
5289   [(set (match_operand:QI 0 "general_operand" "")
5290         (match_operand:QI 1 "any_operand" ""))]
5291   ""
5292   "
5293 {
5294   if (GET_CODE (operands[0]) != REG)
5295     operands[1] = force_reg (QImode, operands[1]);
5296
5297   if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT)
5298     {
5299       operands[1] = force_const_mem (QImode, operands[1]);
5300       if (! memory_address_p (QImode, XEXP (operands[1], 0))
5301           && ! reload_in_progress)
5302         operands[1] = change_address (operands[1], QImode,
5303                                       XEXP (operands[1], 0));
5304     }
5305 }")
5306
5307 (define_insn ""
5308   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
5309         (match_operand:QI 1 "input_operand" "r,m,r,i,*h,r,r,0"))]
5310   "gpc_reg_operand (operands[0], QImode)
5311    || gpc_reg_operand (operands[1], QImode)"
5312   "@
5313    mr %0,%1
5314    lbz%U1%X1 %0,%1
5315    stb%U0%X0 %1,%0
5316    {lil|li} %0,%1
5317    mf%1 %0
5318    mt%0 %1
5319    mt%0 %1
5320    cror 0,0,0"
5321   [(set_attr "type" "*,load,store,*,*,*,mtjmpr,*")])
5322 \f
5323 ;; Here is how to move condition codes around.  When we store CC data in
5324 ;; an integer register or memory, we store just the high-order 4 bits.
5325 ;; This lets us not shift in the most common case of CR0.
5326 (define_expand "movcc"
5327   [(set (match_operand:CC 0 "nonimmediate_operand" "")
5328         (match_operand:CC 1 "nonimmediate_operand" ""))]
5329   ""
5330   "")
5331
5332 (define_insn ""
5333   [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,y,r,r,r,r,m")
5334         (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,m,r"))]
5335   "register_operand (operands[0], CCmode)
5336    || register_operand (operands[1], CCmode)"
5337   "@
5338    mcrf %0,%1
5339    mtcrf 128,%1
5340    {rlinm|rlwinm} %1,%1,%F0,0xffffffff\;mtcrf %R0,%1\;{rlinm|rlwinm} %1,%1,%f0,0xffffffff
5341    mfcr %0
5342    mfcr %0\;{rlinm|rlwinm} %0,%0,%f1,0xf0000000
5343    mr %0,%1
5344    {l%U1%X1|lwz%U1%X1} %0,%1
5345    {st%U0%U1|stw%U0%U1} %1,%0"
5346   [(set_attr "type" "*,*,*,compare,*,*,load,store")
5347    (set_attr "length" "*,*,12,*,8,*,*,*")])
5348 \f
5349 ;; For floating-point, we normally deal with the floating-point registers
5350 ;; unless -msoft-float is used.  The sole exception is that parameter passing
5351 ;; can produce floating-point values in fixed-point registers.  Unless the
5352 ;; value is a simple constant or already in memory, we deal with this by
5353 ;; allocating memory and copying the value explicitly via that memory location.
5354 (define_expand "movsf"
5355   [(set (match_operand:SF 0 "nonimmediate_operand" "")
5356         (match_operand:SF 1 "any_operand" ""))]
5357   ""
5358   "
5359 {
5360   /* If we are called from reload, we might be getting a SUBREG of a hard
5361      reg.  So expand it.  */
5362   if (GET_CODE (operands[0]) == SUBREG
5363       && GET_CODE (SUBREG_REG (operands[0])) == REG
5364       && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER)
5365     operands[0] = alter_subreg (operands[0]);
5366   if (GET_CODE (operands[1]) == SUBREG
5367       && GET_CODE (SUBREG_REG (operands[1])) == REG
5368       && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER)
5369     operands[1] = alter_subreg (operands[1]);
5370
5371   if (TARGET_SOFT_FLOAT && GET_CODE (operands[0]) == MEM)
5372     operands[1] = force_reg (SFmode, operands[1]);
5373
5374   else if (TARGET_HARD_FLOAT)
5375     {
5376       if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32)
5377         {
5378           /* If this is a store to memory or another integer register do the
5379              move directly.  Otherwise store to a temporary stack slot and
5380              load from there into a floating point register.  */
5381
5382           if (GET_CODE (operands[0]) == MEM
5383               || (GET_CODE (operands[0]) == REG
5384                   && (REGNO (operands[0]) < 32
5385                       || (reload_in_progress
5386                           && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))))
5387             {
5388               emit_move_insn (operand_subword (operands[0], 0, 0, SFmode),
5389                               operand_subword (operands[1], 0, 0, SFmode));
5390               DONE;
5391             }
5392           else
5393             {
5394               rtx stack_slot = assign_stack_temp (SFmode, 4, 0);
5395
5396               emit_move_insn (stack_slot, operands[1]);
5397               emit_move_insn (operands[0], stack_slot);
5398               DONE;
5399             }
5400         }
5401
5402       if (GET_CODE (operands[0]) == MEM)
5403         {
5404           /* If operands[1] is a register, it may have double-precision data
5405              in it, so truncate it to single precision.  We need not do
5406              this for POWERPC.  */
5407           if (! TARGET_POWERPC && TARGET_HARD_FLOAT
5408               && GET_CODE (operands[1]) == REG)
5409             {
5410               rtx newreg
5411                 = reload_in_progress ? operands[1] : gen_reg_rtx (SFmode);
5412               emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
5413               operands[1] = newreg;
5414             }
5415
5416           operands[1] = force_reg (SFmode, operands[1]);
5417         }
5418
5419       if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32)
5420         {
5421           if (GET_CODE (operands[1]) == MEM
5422 #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && ! defined(REAL_IS_NOT_DOUBLE)
5423               || GET_CODE (operands[1]) == CONST_DOUBLE
5424 #endif
5425               || (GET_CODE (operands[1]) == REG
5426                   && (REGNO (operands[1]) < 32
5427                       || (reload_in_progress
5428                           && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER))))
5429             {
5430               emit_move_insn (operand_subword (operands[0], 0, 0, SFmode),
5431                               operand_subword (operands[1], 0, 0, SFmode));
5432               DONE;
5433             }
5434           else
5435             {
5436               rtx stack_slot = assign_stack_temp (SFmode, 4, 0);
5437
5438               emit_move_insn (stack_slot, operands[1]);
5439               emit_move_insn (operands[0], stack_slot);
5440               DONE;
5441             }
5442         }
5443     }
5444
5445   if (CONSTANT_P (operands[1]) && TARGET_HARD_FLOAT)
5446     {
5447       operands[1] = force_const_mem (SFmode, operands[1]);
5448       if (! memory_address_p (SFmode, XEXP (operands[1], 0))
5449           && ! reload_in_progress)
5450         operands[1] = change_address (operands[1], SFmode,
5451                                       XEXP (operands[1], 0));
5452     }
5453 }")
5454
5455 (define_split
5456   [(set (match_operand:SF 0 "gpc_reg_operand" "")
5457         (match_operand:SF 1 "const_double_operand" ""))]
5458   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], SFmode) <= 1
5459    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5460        || (GET_CODE (operands[0]) == SUBREG
5461            && GET_CODE (SUBREG_REG (operands[0])) == REG
5462            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5463   [(set (match_dup 2) (match_dup 3))]
5464   "
5465 {
5466   long l;
5467   REAL_VALUE_TYPE rv;
5468
5469   REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
5470   REAL_VALUE_TO_TARGET_SINGLE (rv, l);
5471
5472   operands[2] = operand_subword (operands[0], 0, 0, SFmode);
5473   operands[3] = GEN_INT(l);
5474 }")
5475
5476 (define_split
5477   [(set (match_operand:SF 0 "gpc_reg_operand" "")
5478         (match_operand:SF 1 "const_double_operand" ""))]
5479   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], SFmode) == 2
5480    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5481        || (GET_CODE (operands[0]) == SUBREG
5482            && GET_CODE (SUBREG_REG (operands[0])) == REG
5483            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5484   [(set (match_dup 2) (match_dup 3))
5485    (set (match_dup 2) (ior:SI (match_dup 2) (match_dup 4)))]
5486   "
5487 {
5488   long l;
5489   REAL_VALUE_TYPE rv;
5490
5491   REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
5492   REAL_VALUE_TO_TARGET_SINGLE (rv, l);
5493
5494   operands[2] = operand_subword (operands[0], 0, 0, SFmode);
5495   operands[3] = GEN_INT(l & 0xffff0000);
5496   operands[4] = GEN_INT(l & 0x0000ffff);
5497 }")
5498
5499 (define_insn "*movsf_hardfloat"
5500   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,!r,!r")
5501         (match_operand:SF 1 "input_operand" "f,m,f,G,Fn"))]
5502   "(gpc_reg_operand (operands[0], SFmode)
5503    || gpc_reg_operand (operands[1], SFmode)) && TARGET_HARD_FLOAT"
5504   "@
5505    fmr %0,%1
5506    lfs%U1%X1 %0,%1
5507    stfs%U0%X0 %1,%0
5508    #
5509    #"
5510   [(set_attr "type" "fp,fpload,fpstore,*,*")
5511    (set_attr "length" "4,4,4,4,8")])
5512
5513 (define_insn "*movsf_softfloat"
5514   [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,r")
5515         (match_operand:SF 1 "input_operand" "r,m,r,I,J,R,G,Fn"))]
5516   "(gpc_reg_operand (operands[0], SFmode)
5517    || gpc_reg_operand (operands[1], SFmode)) && TARGET_SOFT_FLOAT"
5518   "@
5519    mr %0,%1
5520    {l%U1%X1|lwz%U1%X1} %0,%1
5521    {st%U0%X0|stw%U0%X0} %1,%0
5522    {lil|li} %0,%1
5523    {liu|lis} %0,%v1
5524    {cal|la} %0,%1(%*)
5525    #
5526    #"
5527   [(set_attr "type" "*,load,store,*,*,*,*,*")
5528    (set_attr "length" "4,4,4,4,4,4,4,8")])
5529
5530 \f
5531 (define_expand "movdf"
5532   [(set (match_operand:DF 0 "nonimmediate_operand" "")
5533         (match_operand:DF 1 "any_operand" ""))]
5534   ""
5535   "
5536 {
5537   if (GET_CODE (operands[0]) != REG)
5538     operands[1] = force_reg (DFmode, operands[1]);
5539
5540       /* Stores between FPR and any non-FPR registers must go through a
5541          temporary stack slot.  */
5542
5543   if (TARGET_POWERPC64
5544       && GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
5545       && ((FP_REGNO_P (REGNO (operands[0]))
5546            && ! FP_REGNO_P (REGNO (operands[1])))
5547           || (FP_REGNO_P (REGNO (operands[1]))
5548               && ! FP_REGNO_P (REGNO (operands[0])))))
5549     {
5550       rtx stack_slot = assign_stack_temp (DFmode, 8, 0);
5551
5552       emit_move_insn (stack_slot, operands[1]);
5553       emit_move_insn (operands[0], stack_slot);
5554       DONE;
5555     }
5556
5557   if (CONSTANT_P (operands[1]) && ! easy_fp_constant (operands[1], DFmode))
5558     {
5559       operands[1] = force_const_mem (DFmode, operands[1]);
5560       if (! memory_address_p (DFmode, XEXP (operands[1], 0))
5561           && ! reload_in_progress)
5562         operands[1] = change_address (operands[1], DFmode,
5563                                       XEXP (operands[1], 0));
5564     }
5565 }")
5566
5567 (define_split
5568   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5569         (match_operand:DF 1 "const_int_operand" ""))]
5570   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DFmode) <= 1
5571    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5572        || (GET_CODE (operands[0]) == SUBREG
5573            && GET_CODE (SUBREG_REG (operands[0])) == REG
5574            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5575   [(set (match_dup 2) (match_dup 4))
5576    (set (match_dup 3) (match_dup 1))]
5577   "
5578 {
5579   int endian = (WORDS_BIG_ENDIAN == 0);
5580   operands[2] = operand_subword (operands[0], endian, 0, DFmode);
5581   operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
5582   operands[4] = (INTVAL (operands[1]) & 0x80000000) ? constm1_rtx : const0_rtx;
5583 }")
5584
5585 (define_split
5586   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5587         (match_operand:DF 1 "const_int_operand" ""))]
5588   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DFmode) >= 2
5589    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5590        || (GET_CODE (operands[0]) == SUBREG
5591            && GET_CODE (SUBREG_REG (operands[0])) == REG
5592            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5593   [(set (match_dup 3) (match_dup 5))
5594    (set (match_dup 2) (match_dup 4))
5595    (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 6)))]
5596   "
5597 {
5598   HOST_WIDE_INT value = INTVAL (operands[1]);
5599   int endian = (WORDS_BIG_ENDIAN == 0);
5600   operands[2] = operand_subword (operands[0], endian, 0, DFmode);
5601   operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
5602   operands[4] = (value & 0x80000000) ? constm1_rtx : const0_rtx;
5603   operands[5] = GEN_INT (value & 0xffff0000);
5604   operands[6] = GEN_INT (value & 0x0000ffff);
5605 }")
5606
5607 (define_split
5608   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5609         (match_operand:DF 1 "const_double_operand" ""))]
5610   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DFmode) <= 2
5611    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5612        || (GET_CODE (operands[0]) == SUBREG
5613            && GET_CODE (SUBREG_REG (operands[0])) == REG
5614            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5615   [(set (match_dup 2) (match_dup 4))
5616    (set (match_dup 3) (match_dup 5))]
5617   "
5618 {
5619   int endian = (WORDS_BIG_ENDIAN == 0);
5620   operands[2] = operand_subword (operands[0], endian, 0, DFmode);
5621   operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
5622
5623 #ifdef HOST_WORDS_BIG_ENDIAN
5624   operands[4] = GEN_INT (CONST_DOUBLE_LOW  (operands[1]));
5625   operands[5] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
5626 #else
5627   operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
5628   operands[5] = GEN_INT (CONST_DOUBLE_LOW  (operands[1]));
5629 #endif
5630 }")
5631
5632 (define_split
5633   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5634         (match_operand:DF 1 "const_double_operand" ""))]
5635   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DFmode) == 3
5636    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5637        || (GET_CODE (operands[0]) == SUBREG
5638            && GET_CODE (SUBREG_REG (operands[0])) == REG
5639            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5640   [(set (match_dup 2) (match_dup 4))
5641    (set (match_dup 3) (match_dup 5))
5642    (set (match_dup 2) (ior:SI (match_dup 2) (match_dup 6)))]
5643   "
5644 {
5645   HOST_WIDE_INT high;
5646   HOST_WIDE_INT low;
5647   int endian = (WORDS_BIG_ENDIAN == 0);
5648   rtx high_reg = operand_subword (operands[0], endian, 0, DFmode);
5649   rtx low_reg  = operand_subword (operands[0], 1 - endian, 0, DFmode);
5650
5651 #ifdef HOST_WORDS_BIG_ENDIAN
5652   high = CONST_DOUBLE_LOW  (operands[1]);
5653   low  = CONST_DOUBLE_HIGH (operands[1]);
5654 #else
5655   high = CONST_DOUBLE_HIGH (operands[1]);
5656   low  = CONST_DOUBLE_LOW  (operands[1]);
5657 #endif
5658
5659   if (((unsigned HOST_WIDE_INT) (low + 0x8000) < 0x10000)
5660       || (low & 0xffff) == 0)
5661     {
5662       operands[2] = high_reg;
5663       operands[3] = low_reg;
5664       operands[4] = GEN_INT (high & 0xffff0000);
5665       operands[5] = GEN_INT (low);
5666       operands[6] = GEN_INT (high & 0x0000ffff);
5667     }
5668   else
5669     {
5670       operands[2] = low_reg;
5671       operands[3] = high_reg;
5672       operands[4] = GEN_INT (low & 0xffff0000);
5673       operands[5] = GEN_INT (high);
5674       operands[6] = GEN_INT (low & 0x0000ffff);
5675     }
5676 }")
5677
5678 (define_split
5679   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5680         (match_operand:DF 1 "const_double_operand" ""))]
5681   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DFmode) >= 4
5682    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5683        || (GET_CODE (operands[0]) == SUBREG
5684            && GET_CODE (SUBREG_REG (operands[0])) == REG
5685            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5686   [(set (match_dup 2) (match_dup 4))
5687    (set (match_dup 3) (match_dup 5))
5688    (set (match_dup 2) (ior:SI (match_dup 2) (match_dup 6)))
5689    (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 7)))]
5690   "
5691 {
5692   HOST_WIDE_INT high = CONST_DOUBLE_HIGH (operands[1]);
5693   HOST_WIDE_INT low  = CONST_DOUBLE_LOW  (operands[1]);
5694   int endian = (WORDS_BIG_ENDIAN == 0);
5695
5696   operands[2] = operand_subword (operands[0], endian, 0, DFmode);
5697   operands[3] = operand_subword (operands[0], 1 - endian, 0, DFmode);
5698   operands[4] = GEN_INT (high & 0xffff0000);
5699   operands[5] = GEN_INT (low  & 0xffff0000);
5700   operands[6] = GEN_INT (high & 0x0000ffff);
5701   operands[7] = GEN_INT (low  & 0x0000ffff);
5702 }")
5703
5704 (define_split
5705   [(set (match_operand:DF 0 "gpc_reg_operand" "")
5706         (match_operand:DF 1 "easy_fp_constant" ""))]
5707   "TARGET_64BIT && reload_completed
5708    && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
5709        || (GET_CODE (operands[0]) == SUBREG
5710            && GET_CODE (SUBREG_REG (operands[0])) == REG
5711            && REGNO (SUBREG_REG (operands[0])) <= 31))"
5712   [(set (match_dup 2) (subreg:DI (match_dup 1) 0))]
5713   "
5714 { operands[2] = gen_lowpart (DImode, operands[0]); }")
5715
5716 ;; Don't have reload use general registers to load a constant.  First,
5717 ;; it might not work if the output operand has is the equivalent of
5718 ;; a non-offsettable memref, but also it is less efficient than loading
5719 ;; the constant into an FP register, since it will probably be used there.
5720 ;; The "??" is a kludge until we can figure out a more reasonable way
5721 ;; of handling these non-offsettable values.
5722 (define_insn "*movdf_hardfloat32"
5723   [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,o,!r,!r,!r,f,f,m")
5724         (match_operand:DF 1 "input_operand" "r,o,r,G,H,F,f,m,f"))]
5725   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT
5726    && (register_operand (operands[0], DFmode)
5727        || register_operand (operands[1], DFmode))"
5728   "*
5729 {
5730   switch (which_alternative)
5731     {
5732     case 0:
5733       /* We normally copy the low-numbered register first.  However, if
5734          the first register operand 0 is the same as the second register of
5735          operand 1, we must copy in the opposite order.  */
5736       if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
5737         return \"mr %L0,%L1\;mr %0,%1\";
5738       else
5739         return \"mr %0,%1\;mr %L0,%L1\";
5740     case 1:
5741       /* If the low-address word is used in the address, we must load it
5742          last.  Otherwise, load it first.  Note that we cannot have
5743          auto-increment in that case since the address register is known to be
5744          dead.  */
5745       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
5746                              operands [1], 0))
5747         return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
5748       else
5749         return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\";
5750     case 2:
5751       return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
5752     case 3:
5753     case 4:
5754     case 5:
5755       return \"#\";
5756     case 6:
5757       return \"fmr %0,%1\";
5758     case 7:
5759       return \"lfd%U1%X1 %0,%1\";
5760     case 8:
5761       return \"stfd%U0%X0 %1,%0\";
5762     }
5763 }"
5764   [(set_attr "type" "*,load,store,*,*,*,fp,fpload,fpstore")
5765    (set_attr "length" "8,8,8,8,12,16,*,*,*")])
5766
5767 (define_insn "*movdf_softfloat32"
5768   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,o,r,r,r")
5769         (match_operand:DF 1 "input_operand" "r,o,r,G,H,F"))]
5770   "! TARGET_POWERPC64 && TARGET_SOFT_FLOAT
5771    && (register_operand (operands[0], DFmode)
5772        || register_operand (operands[1], DFmode))"
5773   "*
5774 {
5775   switch (which_alternative)
5776     {
5777     case 0:
5778       /* We normally copy the low-numbered register first.  However, if
5779          the first register operand 0 is the same as the second register of
5780          operand 1, we must copy in the opposite order.  */
5781       if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
5782         return \"mr %L0,%L1\;mr %0,%1\";
5783       else
5784         return \"mr %0,%1\;mr %L0,%L1\";
5785     case 1:
5786       /* If the low-address word is used in the address, we must load it
5787          last.  Otherwise, load it first.  Note that we cannot have
5788          auto-increment in that case since the address register is known to be
5789          dead.  */
5790       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
5791                              operands [1], 0))
5792         return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
5793       else
5794         return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\";
5795     case 2:
5796       return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
5797     case 3:
5798     case 4:
5799     case 5:
5800       return \"#\";
5801     }
5802 }"
5803   [(set_attr "type" "*,load,store,*,*,*")
5804    (set_attr "length" "8,8,8,8,12,16")])
5805
5806 (define_insn "*movdf_hardfloat64"
5807   [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,o,!r,!r,!r,f,f,m")
5808         (match_operand:DF 1 "input_operand" "r,o,r,G,H,F,f,m,f"))]
5809   "TARGET_POWERPC64 && TARGET_HARD_FLOAT
5810    && (register_operand (operands[0], DFmode)
5811        || register_operand (operands[1], DFmode))"
5812   "@
5813    mr %0,%1
5814    ld%U1%X1 %0,%1
5815    std%U0%X0 %1,%0
5816    #
5817    #
5818    #
5819    fmr %0,%1
5820    lfd%U1%X1 %0,%1
5821    stfd%U0%X0 %1,%0"
5822   [(set_attr "type" "*,load,store,*,*,*,fp,fpload,fpstore")
5823    (set_attr "length" "4,4,4,8,12,16,4,4,4")])
5824
5825 (define_insn "*movdf_softfloat64"
5826   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,o,r,r,r")
5827         (match_operand:DF 1 "input_operand" "r,o,r,G,H,F"))]
5828   "TARGET_POWERPC64 && TARGET_SOFT_FLOAT
5829    && (register_operand (operands[0], DFmode)
5830        || register_operand (operands[1], DFmode))"
5831   "@
5832    mr %0,%1
5833    ld%U1%X1 %0,%1
5834    std%U0%X0 %1,%0
5835    #
5836    #
5837    #"
5838   [(set_attr "type" "*,load,store,*,*,*")
5839    (set_attr "length" "*,*,*,8,12,16")])
5840 \f
5841 ;; Next come the multi-word integer load and store and the load and store
5842 ;; multiple insns.
5843 (define_expand "movdi"
5844   [(set (match_operand:DI 0 "general_operand" "")
5845         (match_operand:DI 1 "any_operand" ""))]
5846   ""
5847   "
5848 {
5849   if (GET_CODE (operands[0]) != REG)
5850     operands[1] = force_reg (DImode, operands[1]);
5851
5852   if (TARGET_64BIT
5853       && (GET_CODE (operands[1]) == CONST_DOUBLE
5854           || GET_CODE (operands[1]) == CONST_INT))
5855     {
5856       HOST_WIDE_INT low;
5857       HOST_WIDE_INT high;
5858
5859       if (GET_CODE (operands[1]) == CONST_DOUBLE)
5860         {
5861           low = CONST_DOUBLE_LOW (operands[1]);
5862           high = CONST_DOUBLE_HIGH (operands[1]);
5863         }
5864       else
5865 #if HOST_BITS_PER_WIDE_INT == 32
5866         {
5867           low = INTVAL (operands[1]);
5868           high = (low < 0) ? ~0 : 0;
5869         }
5870 #else
5871         {
5872           low = INTVAL (operands[1]) & 0xffffffff;
5873           high = (HOST_WIDE_INT) INTVAL (operands[1]) >> 32;
5874         }
5875 #endif
5876
5877         if (high)
5878           {
5879             emit_move_insn (operands[0], GEN_INT (high));
5880             emit_insn (gen_ashldi3 (operands[0], operands[0], GEN_INT(32)));
5881             if (low)
5882               {
5883                 HOST_WIDE_INT low_low = low & 0xffff;
5884                 HOST_WIDE_INT low_high = low & (~ (HOST_WIDE_INT) 0xffff);
5885                 if (low_high)
5886                   emit_insn (gen_iordi3 (operands[0], operands[0],
5887                                          GEN_INT (low_high)));
5888                 if (low_low)
5889                   emit_insn (gen_iordi3 (operands[0], operands[0],
5890                                          GEN_INT (low_low)));
5891               }
5892               DONE;
5893           }
5894     }
5895
5896       /* Stores between FPR and any non-FPR registers must go through a
5897          temporary stack slot.  */
5898
5899   if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
5900       && ((FP_REGNO_P (REGNO (operands[0]))
5901            && ! FP_REGNO_P (REGNO (operands[1])))
5902           || (FP_REGNO_P (REGNO (operands[1]))
5903               && ! FP_REGNO_P (REGNO (operands[0])))))
5904     {
5905       rtx stack_slot = assign_stack_temp (DImode, 8, 0);
5906
5907       emit_move_insn (stack_slot, operands[1]);
5908       emit_move_insn (operands[0], stack_slot);
5909       DONE;
5910     }
5911 }")
5912
5913 (define_insn "*movdi_32"
5914   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m,f,f,m,r,r,r,r,r")
5915         (match_operand:DI 1 "input_operand" "r,m,r,f,m,f,IJK,n,G,H,F"))]
5916   "TARGET_32BIT
5917    && (gpc_reg_operand (operands[0], DImode)
5918        || gpc_reg_operand (operands[1], DImode))"
5919   "*
5920 {
5921   switch (which_alternative)
5922     {
5923     case 0:
5924       /* We normally copy the low-numbered register first.  However, if
5925          the first register operand 0 is the same as the second register of
5926          operand 1, we must copy in the opposite order.  */
5927       if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
5928         return \"mr %L0,%L1\;mr %0,%1\";
5929       else
5930         return \"mr %0,%1\;mr %L0,%L1\";
5931     case 1:
5932       /* If the low-address word is used in the address, we must load it
5933          last.  Otherwise, load it first.  Note that we cannot have
5934          auto-increment in that case since the address register is known to be
5935          dead.  */
5936       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
5937                              operands [1], 0))
5938         return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\";
5939       else
5940         return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\";
5941     case 2:
5942       return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
5943     case 3:
5944       return \"fmr %0,%1\";
5945     case 4:
5946       return \"lfd%U1%X1 %0,%1\";
5947     case 5:
5948       return \"stfd%U0%X0 %1,%0\";
5949     case 6:
5950     case 7:
5951     case 8:
5952     case 9:
5953     case 10:
5954       return \"#\";
5955     }
5956 }"
5957   [(set_attr "type" "*,load,store,fp,fpload,fpstore,*,*,*,*,*")
5958    (set_attr "length" "8,8,8,*,*,*,8,12,8,12,16")])
5959
5960 (define_split
5961   [(set (match_operand:DI 0 "gpc_reg_operand" "")
5962         (match_operand:DI 1 "const_int_operand" ""))]
5963   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DImode) <= 1"
5964   [(set (match_dup 2) (match_dup 4))
5965    (set (match_dup 3) (match_dup 1))]
5966   "
5967 {
5968   operands[2] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN == 0);
5969   operands[3] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN != 0);
5970   operands[4] = (INTVAL (operands[1]) & 0x80000000) ? constm1_rtx : const0_rtx;
5971 }")
5972
5973 (define_split
5974   [(set (match_operand:DI 0 "gpc_reg_operand" "")
5975         (match_operand:DI 1 "const_int_operand" ""))]
5976   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DImode) >= 2"
5977   [(set (match_dup 3) (match_dup 5))
5978    (set (match_dup 2) (match_dup 4))
5979    (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 6)))]
5980   "
5981 {
5982   HOST_WIDE_INT value = INTVAL (operands[1]);
5983   operands[2] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN == 0);
5984   operands[3] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN != 0);
5985   operands[4] = (value & 0x80000000) ? constm1_rtx : const0_rtx;
5986   operands[5] = GEN_INT (value & 0xffff0000);
5987   operands[6] = GEN_INT (value & 0x0000ffff);
5988 }")
5989
5990 (define_split
5991   [(set (match_operand:DI 0 "gpc_reg_operand" "")
5992         (match_operand:DI 1 "const_double_operand" ""))]
5993   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DImode) <= 2"
5994   [(set (match_dup 2) (match_dup 4))
5995    (set (match_dup 3) (match_dup 5))]
5996   "
5997 {
5998   operands[2] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN == 0);
5999   operands[3] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN != 0);
6000   operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]));
6001   operands[5] = GEN_INT (CONST_DOUBLE_LOW  (operands[1]));
6002 }")
6003
6004 (define_split
6005   [(set (match_operand:DI 0 "gpc_reg_operand" "")
6006         (match_operand:DI 1 "const_double_operand" ""))]
6007   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DImode) == 3"
6008   [(set (match_dup 2) (match_dup 4))
6009    (set (match_dup 3) (match_dup 5))
6010    (set (match_dup 2) (ior:SI (match_dup 2) (match_dup 6)))]
6011   "
6012 {
6013   HOST_WIDE_INT high = CONST_DOUBLE_HIGH (operands[1]);
6014   HOST_WIDE_INT low  = CONST_DOUBLE_LOW  (operands[1]);
6015   rtx high_reg = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN == 0);
6016   rtx low_reg  = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN != 0);
6017
6018   if (((unsigned HOST_WIDE_INT) (low + 0x8000) < 0x10000)
6019       || (low & 0xffff) == 0)
6020     {
6021       operands[2] = high_reg;
6022       operands[3] = low_reg;
6023       operands[4] = GEN_INT (high & 0xffff0000);
6024       operands[5] = GEN_INT (low);
6025       operands[6] = GEN_INT (high & 0x0000ffff);
6026     }
6027   else
6028     {
6029       operands[2] = low_reg;
6030       operands[3] = high_reg;
6031       operands[4] = GEN_INT (low & 0xffff0000);
6032       operands[5] = GEN_INT (high);
6033       operands[6] = GEN_INT (low & 0x0000ffff);
6034     }
6035 }")
6036
6037 (define_split
6038   [(set (match_operand:DI 0 "gpc_reg_operand" "")
6039         (match_operand:DI 1 "const_double_operand" ""))]
6040   "TARGET_32BIT && reload_completed && num_insns_constant (operands[1], DImode) >= 4"
6041   [(set (match_dup 2) (match_dup 4))
6042    (set (match_dup 3) (match_dup 5))
6043    (set (match_dup 2) (ior:SI (match_dup 2) (match_dup 6)))
6044    (set (match_dup 3) (ior:SI (match_dup 3) (match_dup 7)))]
6045   "
6046 {
6047   HOST_WIDE_INT high = CONST_DOUBLE_HIGH (operands[1]);
6048   HOST_WIDE_INT low  = CONST_DOUBLE_LOW  (operands[1]);
6049
6050   operands[2] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN == 0);
6051   operands[3] = gen_rtx (SUBREG, SImode, operands[0], WORDS_BIG_ENDIAN != 0);
6052   operands[4] = GEN_INT (high & 0xffff0000);
6053   operands[5] = GEN_INT (low  & 0xffff0000);
6054   operands[6] = GEN_INT (high & 0x0000ffff);
6055   operands[7] = GEN_INT (low  & 0x0000ffff);
6056 }")
6057
6058 (define_insn "*movdi_64"
6059   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,f,f,m,r,*h,*h")
6060         (match_operand:DI 1 "input_operand" "r,m,r,I,J,nF,R,f,m,f,*h,r,0"))]
6061   "TARGET_64BIT
6062    && (gpc_reg_operand (operands[0], DImode)
6063        || gpc_reg_operand (operands[1], DImode))"
6064   "@
6065    mr %0,%1
6066    ld%U1%X1 %0,%1
6067    std%U0%X0 %1,%0
6068    li %0,%1
6069    lis %0,%v1
6070    #
6071    {cal|la} %0,%1(%*)
6072    fmr %0,%1
6073    lfd%U1%X1 %0,%1
6074    stfd%U0%X0 %1,%0
6075    mf%1 %0
6076    mt%0 %1
6077    cror 0,0,0"
6078   [(set_attr "type" "*,load,store,*,*,*,*,fp,fpload,fpstore,*,mtjmpr,*")
6079    (set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4")])
6080
6081 ;; Split a load of a large constant into the appropriate five-instruction
6082 ;; sequence.  The expansion in movdi tries to perform the minimum number of
6083 ;; steps, but here we have to handle anything in a constant number of insns.
6084
6085 (define_split
6086   [(set (match_operand:DI 0 "gpc_reg_operand" "")
6087         (match_operand:DI 1 "const_double_operand" ""))]
6088   "TARGET_64BIT && num_insns_constant (operands[1], DImode) > 1"
6089   [(set (match_dup 0)
6090         (match_dup 2))
6091    (set (match_dup 0)
6092         (ior:DI (match_dup 0)
6093                 (match_dup 3)))
6094    (set (match_dup 0)
6095         (ashift:DI (match_dup 0)
6096                    (const_int 32)))
6097    (set (match_dup 0)
6098         (ior:DI (match_dup 0)
6099                 (match_dup 4)))
6100    (set (match_dup 0)
6101         (ior:DI (match_dup 0)
6102                 (match_dup 5)))]
6103   "
6104 {
6105   HOST_WIDE_INT low;
6106   HOST_WIDE_INT high;
6107
6108   if (GET_CODE (operands[1]) == CONST_DOUBLE)
6109     {
6110       low = CONST_DOUBLE_LOW (operands[1]);
6111       high = CONST_DOUBLE_HIGH (operands[1]);
6112     }
6113   else
6114 #if HOST_BITS_PER_WIDE_INT == 32
6115     {
6116       low = INTVAL (operands[1]);
6117       high = (low < 0) ? ~0 : 0;
6118     }
6119 #else
6120     {
6121       low = INTVAL (operands[1]) & 0xffffffff;
6122       high = (HOST_WIDE_INT) INTVAL (operands[1]) >> 32;
6123     }
6124 #endif
6125
6126   if ((high + 0x8000) < 0x10000
6127       && ((low & 0xffff) == 0 || (low & (~ (HOST_WIDE_INT) 0xffff)) == 0))
6128     FAIL;
6129
6130   operands[2] = GEN_INT (high & (~ (HOST_WIDE_INT) 0xffff));
6131   operands[3] = GEN_INT (high & 0xffff);
6132   operands[4] = GEN_INT (low & (~ (HOST_WIDE_INT) 0xffff));
6133   operands[5] = GEN_INT (low & 0xffff);
6134 }")
6135
6136 (define_insn ""
6137   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
6138         (compare:CC (match_operand:DI 1 "gpc_reg_operand" "r")
6139                     (const_int 0)))
6140    (set (match_operand:DI 0 "gpc_reg_operand" "=r") (match_dup 1))]
6141   "TARGET_POWERPC64"
6142   "mr. %0,%1"
6143   [(set_attr "type" "compare")])
6144 \f
6145 ;; TImode is similar, except that we usually want to compute the address into
6146 ;; a register and use lsi/stsi (the exception is during reload).  MQ is also
6147 ;; clobbered in stsi for POWER, so we need a SCRATCH for it.
6148 (define_expand "movti"
6149   [(parallel [(set (match_operand:TI 0 "general_operand" "")
6150                    (match_operand:TI 1 "general_operand" ""))
6151               (clobber (scratch:SI))])]
6152   "TARGET_STRING || TARGET_POWERPC64"
6153   "
6154 {
6155   if (GET_CODE (operands[0]) == MEM)
6156     operands[1] = force_reg (TImode, operands[1]);
6157
6158   if (GET_CODE (operands[0]) == MEM
6159       && GET_CODE (XEXP (operands[0], 0)) != REG
6160       && ! reload_in_progress)
6161     operands[0] = change_address (operands[0], TImode,
6162                                   copy_addr_to_reg (XEXP (operands[0], 0)));
6163
6164   if (GET_CODE (operands[1]) == MEM
6165       && GET_CODE (XEXP (operands[1], 0)) != REG
6166       && ! reload_in_progress)
6167     operands[1] = change_address (operands[1], TImode,
6168                                   copy_addr_to_reg (XEXP (operands[1], 0)));
6169 }")
6170
6171 ;; We say that MQ is clobbered in the last alternative because the first
6172 ;; alternative would never get used otherwise since it would need a reload
6173 ;; while the 2nd alternative would not.  We put memory cases first so they
6174 ;; are preferred.  Otherwise, we'd try to reload the output instead of
6175 ;; giving the SCRATCH mq.
6176 (define_insn ""
6177   [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,????r,????r,????r")
6178         (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m"))
6179    (clobber (match_scratch:SI 2 "=q,q#X,X,X,X"))]
6180   "TARGET_STRING && TARGET_POWER && ! TARGET_POWERPC64
6181    && (gpc_reg_operand (operands[0], TImode) || gpc_reg_operand (operands[1], TImode))"
6182   "*
6183 {
6184   switch (which_alternative)
6185     {
6186     default:
6187       abort ();
6188
6189     case 0:
6190       return \"{stsi|stswi} %1,%P0,16\";
6191
6192     case 1:
6193       return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\;{st|stw} %Y1,%Y0\;{st|stw} %Z1,%Z0\";
6194
6195     case 2:
6196       /* Normally copy registers with lowest numbered register copied first.
6197          But copy in the other order if the first register of the output
6198          is the second, third, or fourth register in the input.  */
6199       if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
6200           && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
6201         return \"mr %Z0,%Z1\;mr %Y0,%Y1\;mr %L0,%L1\;mr %0,%1\";
6202       else
6203         return \"mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1\";
6204     case 3:
6205       /* If the address is not used in the output, we can use lsi.  Otherwise,
6206          fall through to generating four loads.  */
6207       if (! reg_overlap_mentioned_p (operands[0], operands[1]))
6208         return \"{lsi|lswi} %0,%P1,16\";
6209       /* ... fall through ... */
6210     case 4:
6211       /* If the address register is the same as the register for the lowest-
6212          addressed word, load it last.  Similarly for the next two words.
6213          Otherwise load lowest address to highest.  */
6214       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
6215                              operands[1], 0))
6216         return \"{l|lwz} %L0,%L1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\;{l|lwz} %0,%1\";
6217       else if (refers_to_regno_p (REGNO (operands[0]) + 1,
6218                                   REGNO (operands[0]) + 2, operands[1], 0))
6219         return \"{l|lwz} %0,%1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\;{l|lwz} %L0,%L1\";
6220       else if (refers_to_regno_p (REGNO (operands[0]) + 2,
6221                                   REGNO (operands[0]) + 3, operands[1], 0))
6222         return \"{l|lwz} %0,%1\;{l|lwz} %L0,%L1\;{l|lwz} %Z0,%Z1\;{l|lwz} %Y0,%Y1\";
6223       else
6224         return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\";
6225     }
6226 }"
6227   [(set_attr "type" "store,store,*,load,load")
6228    (set_attr "length" "*,16,16,*,16")])
6229
6230 (define_insn ""
6231   [(set (match_operand:TI 0 "reg_or_mem_operand" "=m,????r,????r")
6232         (match_operand:TI 1 "reg_or_mem_operand" "r,r,m"))
6233    (clobber (match_scratch:SI 2 "=X,X,X"))]
6234   "TARGET_STRING && !TARGET_POWER && ! TARGET_POWERPC64
6235    && (gpc_reg_operand (operands[0], TImode) || gpc_reg_operand (operands[1], TImode))"
6236   "*
6237 {
6238   switch (which_alternative)
6239     {
6240     default:
6241       abort ();
6242
6243     case 0:
6244       return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\;{st|stw} %Y1,%Y0\;{st|stw} %Z1,%Z0\";
6245
6246     case 1:
6247       /* Normally copy registers with lowest numbered register copied first.
6248          But copy in the other order if the first register of the output
6249          is the second, third, or fourth register in the input.  */
6250       if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
6251           && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
6252         return \"mr %Z0,%Z1\;mr %Y0,%Y1\;mr %L0,%L1\;mr %0,%1\";
6253       else
6254         return \"mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1\";
6255     case 2:
6256       /* If the address register is the same as the register for the lowest-
6257          addressed word, load it last.  Similarly for the next two words.
6258          Otherwise load lowest address to highest.  */
6259       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
6260                              operands[1], 0))
6261         return \"{l|lwz} %L0,%L1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\;{l|lwz} %0,%1\";
6262       else if (refers_to_regno_p (REGNO (operands[0]) + 1,
6263                                   REGNO (operands[0]) + 2, operands[1], 0))
6264         return \"{l|lwz} %0,%1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\;{l|lwz} %L0,%L1\";
6265       else if (refers_to_regno_p (REGNO (operands[0]) + 2,
6266                                   REGNO (operands[0]) + 3, operands[1], 0))
6267         return \"{l|lwz} %0,%1\;{l|lwz} %L0,%L1\;{l|lwz} %Z0,%Z1\;{l|lwz} %Y0,%Y1\";
6268       else
6269         return \"{l%U1|lwz%U1} %0,%1\;{l|lwz} %L0,%L1\;{l|lwz} %Y0,%Y1\;{l|lwz} %Z0,%Z1\";
6270     }
6271 }"
6272   [(set_attr "type" "store,*,load")
6273    (set_attr "length" "16,16,16")])
6274
6275 (define_insn ""
6276   [(set (match_operand:TI 0 "nonimmediate_operand" "=r,r,m")
6277         (match_operand:TI 1 "input_operand" "r,m,r"))]
6278   "TARGET_POWERPC64 && (gpc_reg_operand (operands[0], TImode)
6279    || gpc_reg_operand (operands[1], TImode))"
6280   "*
6281 {
6282   switch (which_alternative)
6283     {
6284     case 0:
6285       /* We normally copy the low-numbered register first.  However, if
6286          the first register operand 0 is the same as the second register of
6287          operand 1, we must copy in the opposite order.  */
6288       if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
6289         return \"mr %L0,%L1\;mr %0,%1\";
6290       else
6291         return \"mr %0,%1\;mr %L0,%L1\";
6292     case 1:
6293       /* If the low-address word is used in the address, we must load it
6294          last.  Otherwise, load it first.  Note that we cannot have
6295          auto-increment in that case since the address register is known to be
6296          dead.  */
6297       if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
6298                              operands [1], 0))
6299         return \"ld %L0,%L1\;ld %0,%1\";
6300       else
6301         return \"ld%U1 %0,%1\;ld %L0,%L1\";
6302     case 2:
6303       return \"std%U0 %1,%0\;std %L1,%L0\";
6304     }
6305 }"
6306   [(set_attr "type" "*,load,store")
6307    (set_attr "length" "8,8,8")])
6308 \f
6309 (define_expand "load_multiple"
6310   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
6311                           (match_operand:SI 1 "" ""))
6312                      (use (match_operand:SI 2 "" ""))])]
6313   "TARGET_STRING"
6314   "
6315 {
6316   int regno;
6317   int count;
6318   rtx from;
6319   int i;
6320
6321   /* Support only loading a constant number of fixed-point registers from
6322      memory and only bother with this if more than two; the machine
6323      doesn't support more than eight.  */
6324   if (GET_CODE (operands[2]) != CONST_INT
6325       || INTVAL (operands[2]) <= 2
6326       || INTVAL (operands[2]) > 8
6327       || GET_CODE (operands[1]) != MEM
6328       || GET_CODE (operands[0]) != REG
6329       || REGNO (operands[0]) >= 32)
6330     FAIL;
6331
6332   count = INTVAL (operands[2]);
6333   regno = REGNO (operands[0]);
6334
6335   operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count));
6336   from = force_reg (SImode, XEXP (operands[1], 0));
6337
6338   for (i = 0; i < count; i++)
6339     XVECEXP (operands[3], 0, i)
6340       = gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, regno + i),
6341                  change_address (operands[1], SImode,
6342                                  plus_constant (from, i * 4)));
6343 }")
6344
6345 (define_insn ""
6346   [(match_parallel 0 "load_multiple_operation"
6347                    [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
6348                          (mem:SI (match_operand:SI 2 "register_operand" "b")))])]
6349   "TARGET_STRING"
6350   "*
6351 {
6352   /* We have to handle the case where the pseudo used to contain the address
6353      is assigned to one of the output registers.  */
6354   int i, j;
6355   int words = XVECLEN (operands[0], 0);
6356   rtx xop[10];
6357
6358   if (XVECLEN (operands[0], 0) == 1)
6359     return \"{l|lwz} %1,0(%2)\";
6360
6361   for (i = 0; i < words; i++)
6362     if (refers_to_regno_p (REGNO (operands[1]) + i,
6363                            REGNO (operands[1]) + i + 1, operands[2], 0))
6364       {
6365         if (i == words-1)
6366           {
6367             xop[0] = operands[1];
6368             xop[1] = operands[2];
6369             xop[2] = GEN_INT (4 * (words-1));
6370             output_asm_insn (\"{lsi|lswi} %0,%1,%2\;{l|lwz} %1,%2(%1)\", xop);
6371             return \"\";
6372           }
6373         else if (i == 0)
6374           {
6375             xop[0] = operands[1];
6376             xop[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
6377             xop[2] = GEN_INT (4 * (words-1));
6378             output_asm_insn (\"{cal %0,4(%0)|addi %0,%0,4}\;{lsi|lswi} %1,%0,%2\;{l|lwz} %0,-4(%0)\", xop);
6379             return \"\";
6380           }
6381         else
6382           {
6383             for (j = 0; j < words; j++)
6384               if (j != i)
6385                 {
6386                   xop[0] = gen_rtx (REG, SImode, REGNO (operands[1]) + j);
6387                   xop[1] = operands[2];
6388                   xop[2] = GEN_INT (j * 4);
6389                   output_asm_insn (\"{l|lwz} %0,%2(%1)\", xop);
6390                 }
6391             xop[0] = operands[2];
6392             xop[1] = GEN_INT (i * 4);
6393             output_asm_insn (\"{l|lwz} %0,%1(%0)\", xop);
6394             return \"\";
6395           }
6396       }
6397
6398   return \"{lsi|lswi} %1,%2,%N0\";
6399 }"
6400   [(set_attr "type" "load")
6401    (set_attr "length" "32")])
6402
6403 \f
6404 (define_expand "store_multiple"
6405   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
6406                           (match_operand:SI 1 "" ""))
6407                      (clobber (scratch:SI))
6408                      (use (match_operand:SI 2 "" ""))])]
6409   "TARGET_STRING"
6410   "
6411 {
6412   int regno;
6413   int count;
6414   rtx to;
6415   int i;
6416
6417   /* Support only storing a constant number of fixed-point registers to
6418      memory and only bother with this if more than two; the machine
6419      doesn't support more than eight.  */
6420   if (GET_CODE (operands[2]) != CONST_INT
6421       || INTVAL (operands[2]) <= 2
6422       || INTVAL (operands[2]) > 8
6423       || GET_CODE (operands[0]) != MEM
6424       || GET_CODE (operands[1]) != REG
6425       || REGNO (operands[1]) >= 32)
6426     FAIL;
6427
6428   count = INTVAL (operands[2]);
6429   regno = REGNO (operands[1]);
6430
6431   operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 1));
6432   to = force_reg (SImode, XEXP (operands[0], 0));
6433
6434   XVECEXP (operands[3], 0, 0)
6435     = gen_rtx (SET, VOIDmode, change_address (operands[0], SImode, to),
6436                operands[1]);
6437   XVECEXP (operands[3], 0, 1) = gen_rtx (CLOBBER, VOIDmode,
6438                                                   gen_rtx (SCRATCH, SImode));
6439
6440   for (i = 1; i < count; i++)
6441     XVECEXP (operands[3], 0, i + 1)
6442       = gen_rtx (SET, VOIDmode,
6443                  change_address (operands[0], SImode,
6444                                  plus_constant (to, i * 4)),
6445                  gen_rtx (REG, SImode, regno + i));
6446 }")
6447
6448 (define_insn ""
6449   [(match_parallel 0 "store_multiple_operation"
6450                    [(set (match_operand:SI 1 "indirect_operand" "=Q")
6451                          (match_operand:SI 2 "gpc_reg_operand" "r"))
6452                     (clobber (match_scratch:SI 3 "=q"))])]
6453   "TARGET_STRING && TARGET_POWER"
6454   "{stsi|stswi} %2,%P1,%O0"
6455   [(set_attr "type" "store")])
6456
6457 (define_insn ""
6458   [(match_parallel 0 "store_multiple_operation"
6459                    [(set (mem:SI (match_operand:SI 1 "register_operand" "b"))
6460                          (match_operand:SI 2 "gpc_reg_operand" "r"))
6461                     (clobber (match_scratch:SI 3 "X"))])]
6462   "TARGET_STRING && !TARGET_POWER"
6463   "{stsi|stswi} %2,%1,%O0"
6464   [(set_attr "type" "store")])
6465
6466 \f
6467 ;; String/block move insn.
6468 ;; Argument 0 is the destination
6469 ;; Argument 1 is the source
6470 ;; Argument 2 is the length
6471 ;; Argument 3 is the alignment
6472
6473 (define_expand "movstrsi"
6474   [(parallel [(set (match_operand:BLK 0 "" "")
6475                    (match_operand:BLK 1 "" ""))
6476               (use (match_operand:SI 2 "" ""))
6477               (use (match_operand:SI 3 "" ""))])]
6478   ""
6479   "
6480 {
6481   if (expand_block_move (operands))
6482     DONE;
6483   else
6484     FAIL;
6485 }")
6486
6487 ;; Move up to 32 bytes at a time.  The fixed registers are needed because the
6488 ;; register allocator doesn't have a clue about allocating 8 word registers
6489 (define_expand "movstrsi_8reg"
6490   [(parallel [(set (match_operand 0 "" "")
6491                    (match_operand 1 "" ""))
6492               (use (match_operand 2 "" ""))
6493               (use (match_operand 3 "" ""))
6494               (clobber (reg:SI  5))
6495               (clobber (reg:SI  6))
6496               (clobber (reg:SI  7))
6497               (clobber (reg:SI  8))
6498               (clobber (reg:SI  9))
6499               (clobber (reg:SI 10))
6500               (clobber (reg:SI 11))
6501               (clobber (reg:SI 12))
6502               (clobber (match_scratch:SI 4 ""))])]
6503   "TARGET_STRING"
6504   "")
6505
6506 (define_insn ""
6507   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6508         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6509    (use (match_operand:SI 2 "immediate_operand" "i"))
6510    (use (match_operand:SI 3 "immediate_operand" "i"))
6511    (clobber (match_operand:SI 4 "register_operand" "=r"))
6512    (clobber (reg:SI  6))
6513    (clobber (reg:SI  7))
6514    (clobber (reg:SI  8))
6515    (clobber (reg:SI  9))
6516    (clobber (reg:SI 10))
6517    (clobber (reg:SI 11))
6518    (clobber (reg:SI 12))
6519    (clobber (match_scratch:SI 5 "=q"))]
6520   "TARGET_STRING && TARGET_POWER
6521    && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32) || INTVAL (operands[2]) == 0)
6522    && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
6523    && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
6524    && REGNO (operands[4]) == 5"
6525   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6526   [(set_attr "type" "load")
6527    (set_attr "length" "8")])
6528
6529 (define_insn ""
6530   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6531         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6532    (use (match_operand:SI 2 "immediate_operand" "i"))
6533    (use (match_operand:SI 3 "immediate_operand" "i"))
6534    (clobber (match_operand:SI 4 "register_operand" "=r"))
6535    (clobber (reg:SI  6))
6536    (clobber (reg:SI  7))
6537    (clobber (reg:SI  8))
6538    (clobber (reg:SI  9))
6539    (clobber (reg:SI 10))
6540    (clobber (reg:SI 11))
6541    (clobber (reg:SI 12))
6542    (clobber (match_scratch:SI 5 "X"))]
6543   "TARGET_STRING && !TARGET_POWER
6544    && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32) || INTVAL (operands[2]) == 0)
6545    && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
6546    && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
6547    && REGNO (operands[4]) == 5"
6548   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6549   [(set_attr "type" "load")
6550    (set_attr "length" "8")])
6551
6552 ;; Move up to 24 bytes at a time.  The fixed registers are needed because the
6553 ;; register allocator doesn't have a clue about allocating 6 word registers
6554 (define_expand "movstrsi_6reg"
6555   [(parallel [(set (match_operand 0 "" "")
6556                    (match_operand 1 "" ""))
6557               (use (match_operand 2 "" ""))
6558               (use (match_operand 3 "" ""))
6559               (clobber (reg:SI  7))
6560               (clobber (reg:SI  8))
6561               (clobber (reg:SI  9))
6562               (clobber (reg:SI 10))
6563               (clobber (reg:SI 11))
6564               (clobber (reg:SI 12))
6565               (clobber (match_scratch:SI 4 ""))])]
6566   "TARGET_STRING"
6567   "")
6568
6569 (define_insn ""
6570   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6571         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6572    (use (match_operand:SI 2 "immediate_operand" "i"))
6573    (use (match_operand:SI 3 "immediate_operand" "i"))
6574    (clobber (match_operand:SI 4 "register_operand" "=r"))
6575    (clobber (reg:SI  8))
6576    (clobber (reg:SI  9))
6577    (clobber (reg:SI 10))
6578    (clobber (reg:SI 11))
6579    (clobber (reg:SI 12))
6580    (clobber (match_scratch:SI 5 "=q"))]
6581   "TARGET_STRING && TARGET_POWER
6582    && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24
6583    && (REGNO (operands[0]) < 7 || REGNO (operands[0]) > 12)
6584    && (REGNO (operands[1]) < 7 || REGNO (operands[1]) > 12)
6585    && REGNO (operands[4]) == 7"
6586   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6587   [(set_attr "type" "load")
6588    (set_attr "length" "8")])
6589
6590 (define_insn ""
6591   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6592         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6593    (use (match_operand:SI 2 "immediate_operand" "i"))
6594    (use (match_operand:SI 3 "immediate_operand" "i"))
6595    (clobber (match_operand:SI 4 "register_operand" "=r"))
6596    (clobber (reg:SI  8))
6597    (clobber (reg:SI  9))
6598    (clobber (reg:SI 10))
6599    (clobber (reg:SI 11))
6600    (clobber (reg:SI 12))
6601    (clobber (match_scratch:SI 5 "X"))]
6602   "TARGET_STRING && !TARGET_POWER
6603    && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 32
6604    && (REGNO (operands[0]) < 7 || REGNO (operands[0]) > 12)
6605    && (REGNO (operands[1]) < 7 || REGNO (operands[1]) > 12)
6606    && REGNO (operands[4]) == 7"
6607   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6608   [(set_attr "type" "load")
6609    (set_attr "length" "8")])
6610
6611 ;; Move up to 16 bytes at a time, using 4 fixed registers to avoid spill problems
6612 ;; with TImode
6613 (define_expand "movstrsi_4reg"
6614   [(parallel [(set (match_operand 0 "" "")
6615                    (match_operand 1 "" ""))
6616               (use (match_operand 2 "" ""))
6617               (use (match_operand 3 "" ""))
6618               (clobber (reg:SI  9))
6619               (clobber (reg:SI 10))
6620               (clobber (reg:SI 11))
6621               (clobber (reg:SI 12))
6622               (clobber (match_scratch:SI 4 ""))])]
6623   "TARGET_STRING"
6624   "")
6625
6626 (define_insn ""
6627   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6628         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6629    (use (match_operand:SI 2 "immediate_operand" "i"))
6630    (use (match_operand:SI 3 "immediate_operand" "i"))
6631    (clobber (match_operand:SI 4 "register_operand" "=r"))
6632    (clobber (reg:SI 10))
6633    (clobber (reg:SI 11))
6634    (clobber (reg:SI 12))
6635    (clobber (match_scratch:SI 5 "=q"))]
6636   "TARGET_STRING && TARGET_POWER
6637    && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
6638    && (REGNO (operands[0]) < 9 || REGNO (operands[0]) > 12)
6639    && (REGNO (operands[1]) < 9 || REGNO (operands[1]) > 12)
6640    && REGNO (operands[4]) == 9"
6641   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6642   [(set_attr "type" "load")
6643    (set_attr "length" "8")])
6644
6645 (define_insn ""
6646   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6647         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6648    (use (match_operand:SI 2 "immediate_operand" "i"))
6649    (use (match_operand:SI 3 "immediate_operand" "i"))
6650    (clobber (match_operand:SI 4 "register_operand" "=r"))
6651    (clobber (reg:SI 10))
6652    (clobber (reg:SI 11))
6653    (clobber (reg:SI 12))
6654    (clobber (match_scratch:SI 5 "X"))]
6655   "TARGET_STRING && !TARGET_POWER
6656    && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
6657    && (REGNO (operands[0]) < 9 || REGNO (operands[0]) > 12)
6658    && (REGNO (operands[1]) < 9 || REGNO (operands[1]) > 12)
6659    && REGNO (operands[4]) == 9"
6660   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6661   [(set_attr "type" "load")
6662    (set_attr "length" "8")])
6663
6664 ;; Move up to 8 bytes at a time.
6665 (define_expand "movstrsi_2reg"
6666   [(parallel [(set (match_operand 0 "" "")
6667                    (match_operand 1 "" ""))
6668               (use (match_operand 2 "" ""))
6669               (use (match_operand 3 "" ""))
6670               (clobber (match_scratch:DI 4 ""))
6671               (clobber (match_scratch:SI 5 ""))])]
6672   "TARGET_STRING && !TARGET_64BIT"
6673   "")
6674
6675 (define_insn ""
6676   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6677         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6678    (use (match_operand:SI 2 "immediate_operand" "i"))
6679    (use (match_operand:SI 3 "immediate_operand" "i"))
6680    (clobber (match_scratch:DI 4 "=&r"))
6681    (clobber (match_scratch:SI 5 "=q"))]
6682   "TARGET_STRING && TARGET_POWER && !TARGET_64BIT
6683    && INTVAL (operands[2]) > 4 && INTVAL (operands[2]) <= 8"
6684   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6685   [(set_attr "type" "load")
6686    (set_attr "length" "8")])
6687
6688 (define_insn ""
6689   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6690         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6691    (use (match_operand:SI 2 "immediate_operand" "i"))
6692    (use (match_operand:SI 3 "immediate_operand" "i"))
6693    (clobber (match_scratch:DI 4 "=&r"))
6694    (clobber (match_scratch:SI 5 "X"))]
6695   "TARGET_STRING && !TARGET_POWER && !TARGET_64BIT
6696    && INTVAL (operands[2]) > 4 && INTVAL (operands[2]) <= 8"
6697   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6698   [(set_attr "type" "load")
6699    (set_attr "length" "8")])
6700
6701 ;; Move up to 4 bytes at a time.
6702 (define_expand "movstrsi_1reg"
6703   [(parallel [(set (match_operand 0 "" "")
6704                    (match_operand 1 "" ""))
6705               (use (match_operand 2 "" ""))
6706               (use (match_operand 3 "" ""))
6707               (clobber (match_scratch:SI 4 ""))
6708               (clobber (match_scratch:SI 5 ""))])]
6709   "TARGET_STRING"
6710   "")
6711
6712 (define_insn ""
6713   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6714         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6715    (use (match_operand:SI 2 "immediate_operand" "i"))
6716    (use (match_operand:SI 3 "immediate_operand" "i"))
6717    (clobber (match_scratch:SI 4 "=&r"))
6718    (clobber (match_scratch:SI 5 "=q"))]
6719   "TARGET_STRING && TARGET_POWER
6720    && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
6721   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6722   [(set_attr "type" "load")
6723    (set_attr "length" "8")])
6724
6725 (define_insn ""
6726   [(set (mem:BLK (match_operand:SI 0 "register_operand" "b"))
6727         (mem:BLK (match_operand:SI 1 "register_operand" "b")))
6728    (use (match_operand:SI 2 "immediate_operand" "i"))
6729    (use (match_operand:SI 3 "immediate_operand" "i"))
6730    (clobber (match_scratch:SI 4 "=&r"))
6731    (clobber (match_scratch:SI 5 "X"))]
6732   "TARGET_STRING && !TARGET_POWER
6733    && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
6734   "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
6735   [(set_attr "type" "load")
6736    (set_attr "length" "8")])
6737
6738 \f
6739 ;; Define insns that do load or store with update.  Some of these we can
6740 ;; get by using pre-decrement or pre-increment, but the hardware can also
6741 ;; do cases where the increment is not the size of the object.
6742 ;;
6743 ;; In all these cases, we use operands 0 and 1 for the register being
6744 ;; incremented because those are the operands that local-alloc will
6745 ;; tie and these are the pair most likely to be tieable (and the ones
6746 ;; that will benefit the most).
6747
6748 (define_insn ""
6749   [(set (match_operand:DI 3 "gpc_reg_operand" "=r,r")
6750         (mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
6751                          (match_operand:DI 2 "reg_or_short_operand" "r,I"))))
6752    (set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
6753         (plus:DI (match_dup 1) (match_dup 2)))]
6754   "TARGET_POWERPC64"
6755   "@
6756    ldux %3,%0,%2
6757    ldu %3,%2(%0)"
6758   [(set_attr "type" "load")])
6759
6760 (define_insn ""
6761   [(set (match_operand:DI 3 "gpc_reg_operand" "=r")
6762         (sign_extend:DI
6763          (mem:SI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0")
6764                           (match_operand:DI 2 "gpc_reg_operand" "r")))))
6765    (set (match_operand:DI 0 "gpc_reg_operand" "=b")
6766         (plus:DI (match_dup 1) (match_dup 2)))]
6767   "TARGET_POWERPC64"
6768   "lwaux %3,%0,%2"
6769   [(set_attr "type" "load")])
6770
6771 (define_insn "movdi_update"
6772   [(set (mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
6773                          (match_operand:DI 2 "reg_or_short_operand" "r,I")))
6774         (match_operand:DI 3 "gpc_reg_operand" "r,r"))
6775    (set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
6776         (plus:DI (match_dup 1) (match_dup 2)))]
6777   "TARGET_POWERPC64"
6778   "@
6779    stdux %3,%0,%2
6780    stdu %3,%2(%0)"
6781   [(set_attr "type" "store")])
6782
6783 (define_insn ""
6784   [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
6785         (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6786                          (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
6787    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6788         (plus:SI (match_dup 1) (match_dup 2)))]
6789   ""
6790   "@
6791    {lux|lwzux} %3,%0,%2
6792    {lu|lwzu} %3,%2(%0)"
6793   [(set_attr "type" "load")])
6794
6795 (define_insn "movsi_update"
6796   [(set (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6797                          (match_operand:SI 2 "reg_or_short_operand" "r,I")))
6798         (match_operand:SI 3 "gpc_reg_operand" "r,r"))
6799    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6800         (plus:SI (match_dup 1) (match_dup 2)))]
6801   ""
6802   "@
6803    {stux|stwux} %3,%0,%2
6804    {stu|stwu} %3,%2(%0)"
6805   [(set_attr "type" "store")])
6806
6807 (define_insn ""
6808   [(set (match_operand:HI 3 "gpc_reg_operand" "=r,r")
6809         (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6810                          (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
6811    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6812         (plus:SI (match_dup 1) (match_dup 2)))]
6813   ""
6814   "@
6815    lhzux %3,%0,%2
6816    lhzu %3,%2(%0)"
6817   [(set_attr "type" "load")])
6818
6819 (define_insn ""
6820   [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
6821         (zero_extend:SI
6822          (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6823                           (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
6824    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6825         (plus:SI (match_dup 1) (match_dup 2)))]
6826   ""
6827   "@
6828    lhzux %3,%0,%2
6829    lhzu %3,%2(%0)"
6830   [(set_attr "type" "load")])
6831
6832 (define_insn ""
6833   [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
6834         (sign_extend:SI
6835          (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6836                           (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
6837    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6838         (plus:SI (match_dup 1) (match_dup 2)))]
6839   ""
6840   "@
6841    lhaux %3,%0,%2
6842    lhau %3,%2(%0)"
6843   [(set_attr "type" "load")])
6844
6845 (define_insn ""
6846   [(set (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6847                          (match_operand:SI 2 "reg_or_short_operand" "r,I")))
6848         (match_operand:HI 3 "gpc_reg_operand" "r,r"))
6849    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6850         (plus:SI (match_dup 1) (match_dup 2)))]
6851   ""
6852   "@
6853    sthux %3,%0,%2
6854    sthu %3,%2(%0)"
6855   [(set_attr "type" "store")])
6856
6857 (define_insn ""
6858   [(set (match_operand:QI 3 "gpc_reg_operand" "=r,r")
6859         (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6860                          (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
6861    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6862         (plus:SI (match_dup 1) (match_dup 2)))]
6863   ""
6864   "@
6865    lbzux %3,%0,%2
6866    lbzu %3,%2(%0)"
6867   [(set_attr "type" "load")])
6868
6869 (define_insn ""
6870   [(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
6871         (zero_extend:SI
6872          (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6873                           (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
6874    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6875         (plus:SI (match_dup 1) (match_dup 2)))]
6876   ""
6877   "@
6878    lbzux %3,%0,%2
6879    lbzu %3,%2(%0)"
6880   [(set_attr "type" "load")])
6881
6882 (define_insn ""
6883   [(set (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6884                          (match_operand:SI 2 "reg_or_short_operand" "r,I")))
6885         (match_operand:QI 3 "gpc_reg_operand" "r,r"))
6886    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6887         (plus:SI (match_dup 1) (match_dup 2)))]
6888   ""
6889   "@
6890    stbux %3,%0,%2
6891    stbu %3,%2(%0)"
6892   [(set_attr "type" "store")])
6893
6894 (define_insn ""
6895   [(set (match_operand:SF 3 "gpc_reg_operand" "=f,f")
6896         (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6897                          (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
6898    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6899         (plus:SI (match_dup 1) (match_dup 2)))]
6900   "TARGET_HARD_FLOAT"
6901   "@
6902    lfsux %3,%0,%2
6903    lfsu %3,%2(%0)"
6904   [(set_attr "type" "fpload")])
6905
6906 (define_insn ""
6907   [(set (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6908                          (match_operand:SI 2 "reg_or_short_operand" "r,I")))
6909         (match_operand:SF 3 "gpc_reg_operand" "f,f"))
6910    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6911         (plus:SI (match_dup 1) (match_dup 2)))]
6912   "TARGET_HARD_FLOAT"
6913   "@
6914    stfsux %3,%0,%2
6915    stfsu %3,%2(%0)"
6916   [(set_attr "type" "fpstore")])
6917
6918 (define_insn ""
6919   [(set (match_operand:DF 3 "gpc_reg_operand" "=f,f")
6920         (mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6921                          (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
6922    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6923         (plus:SI (match_dup 1) (match_dup 2)))]
6924   "TARGET_HARD_FLOAT"
6925   "@
6926    lfdux %3,%0,%2
6927    lfdu %3,%2(%0)"
6928   [(set_attr "type" "fpload")])
6929
6930 (define_insn ""
6931   [(set (mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
6932                          (match_operand:SI 2 "reg_or_short_operand" "r,I")))
6933         (match_operand:DF 3 "gpc_reg_operand" "f,f"))
6934    (set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
6935         (plus:SI (match_dup 1) (match_dup 2)))]
6936   "TARGET_HARD_FLOAT"
6937   "@
6938    stfdux %3,%0,%2
6939    stfdu %3,%2(%0)"
6940   [(set_attr "type" "fpstore")])
6941
6942 ;; Peephole to convert two consecutive FP loads or stores into lfq/stfq.
6943
6944 (define_peephole
6945   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
6946         (match_operand:DF 1 "memory_operand" ""))
6947    (set (match_operand:DF 2 "gpc_reg_operand" "=f")
6948         (match_operand:DF 3 "memory_operand" ""))]
6949   "TARGET_POWER2
6950    && TARGET_HARD_FLOAT
6951    && registers_ok_for_quad_peep (operands[0], operands[2])
6952    && ! MEM_VOLATILE_P (operands[1]) && ! MEM_VOLATILE_P (operands[3])
6953    && addrs_ok_for_quad_peep (XEXP (operands[1], 0), XEXP (operands[3], 0))"
6954   "lfq%U1%X1 %0,%1")
6955
6956 (define_peephole
6957   [(set (match_operand:DF 0 "memory_operand" "")
6958         (match_operand:DF 1 "gpc_reg_operand" "f"))
6959    (set (match_operand:DF 2 "memory_operand" "")
6960         (match_operand:DF 3 "gpc_reg_operand" "f"))]
6961   "TARGET_POWER2
6962    && TARGET_HARD_FLOAT
6963    && registers_ok_for_quad_peep (operands[1], operands[3])
6964    && ! MEM_VOLATILE_P (operands[0]) && ! MEM_VOLATILE_P (operands[2])
6965    && addrs_ok_for_quad_peep (XEXP (operands[0], 0), XEXP (operands[2], 0))"
6966   "stfq%U0%X0 %1,%0")
6967 \f
6968 ;; Next come insns related to the calling sequence.
6969 ;;
6970 ;; First, an insn to allocate new stack space for dynamic use (e.g., alloca).
6971 ;; We move the back-chain and decrement the stack pointer.
6972
6973 (define_expand "allocate_stack"
6974   [(set (reg:SI 1)
6975         (minus:SI (reg:SI 1) (match_operand:SI 0 "reg_or_short_operand" "")))]
6976   ""
6977   "
6978 { rtx chain = gen_reg_rtx (Pmode);
6979   rtx stack_bot = gen_rtx (MEM, Pmode, stack_pointer_rtx);
6980   rtx neg_op0;
6981
6982   emit_move_insn (chain, stack_bot);
6983
6984   /* Under Windows NT, we need to add stack probes for large/variable allocations,
6985      so do it via a call to the external function alloca, instead of doing it
6986      inline.  */
6987   if (DEFAULT_ABI == ABI_NT
6988       && (GET_CODE (operands[0]) != CONST_INT || INTVAL (operands[0]) > 4096))
6989     {
6990       rtx tmp = gen_reg_rtx (SImode);
6991       emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"__allocate_stack\"),
6992                                tmp, 0, SImode, 1, operands[0], Pmode);
6993       emit_insn (gen_set_sp (tmp));
6994       DONE;
6995     }
6996
6997   if (GET_CODE (operands[0]) != CONST_INT
6998       || INTVAL (operands[0]) < -32767
6999       || INTVAL (operands[0]) > 32768)
7000     {
7001       neg_op0 = gen_reg_rtx (Pmode);
7002       if (TARGET_32BIT)
7003         emit_insn (gen_negsi2 (neg_op0, operands[0]));
7004       else
7005         emit_insn (gen_negdi2 (neg_op0, operands[0]));
7006     }
7007   else
7008     neg_op0 = GEN_INT (- INTVAL (operands[0]));
7009
7010   if (TARGET_32BIT)
7011     emit_insn (gen_movsi_update (stack_pointer_rtx, stack_pointer_rtx, neg_op0, chain));
7012   else
7013     emit_insn (gen_movdi_update (stack_pointer_rtx, stack_pointer_rtx, neg_op0, chain));
7014
7015   DONE;
7016 }")
7017
7018 ;; Marker to indicate that the stack pointer was changed under NT in
7019 ;; ways not known to the compiler
7020
7021 (define_insn "set_sp"
7022   [(set (reg:SI 1)
7023         (unspec [(match_operand:SI 0 "register_operand" "r")] 7))]
7024   ""
7025   ""
7026   [(set_attr "length" "0")])
7027
7028 ;; These patterns say how to save and restore the stack pointer.  We need not
7029 ;; save the stack pointer at function level since we are careful to
7030 ;; preserve the backchain.  At block level, we have to restore the backchain
7031 ;; when we restore the stack pointer.
7032 ;;
7033 ;; For nonlocal gotos, we must save both the stack pointer and its
7034 ;; backchain and restore both.  Note that in the nonlocal case, the
7035 ;; save area is a memory location.
7036
7037 (define_expand "save_stack_function"
7038   [(use (const_int 0))]
7039   ""
7040   "")
7041
7042 (define_expand "restore_stack_function"
7043   [(use (const_int 0))]
7044   ""
7045   "")
7046
7047 (define_expand "restore_stack_block"
7048   [(set (match_dup 2) (mem:SI (match_operand:SI 0 "register_operand" "")))
7049    (set (match_dup 0) (match_operand:SI 1 "register_operand" ""))
7050    (set (mem:SI (match_dup 0)) (match_dup 2))]
7051   ""
7052   "
7053 { operands[2] = gen_reg_rtx (SImode); }")
7054
7055 (define_expand "save_stack_nonlocal"
7056   [(match_operand:DI 0 "memory_operand" "")
7057    (match_operand:SI 1 "register_operand" "")]
7058   ""
7059   "
7060 {
7061   rtx temp = gen_reg_rtx (SImode);
7062
7063   /* Copy the backchain to the first word, sp to the second.  */
7064   emit_move_insn (temp, gen_rtx (MEM, SImode, operands[1]));
7065   emit_move_insn (operand_subword (operands[0], 0, 0, DImode), temp);
7066   emit_move_insn (operand_subword (operands[0], 1, 0, DImode), operands[1]);
7067   DONE;
7068 }")
7069
7070 (define_expand "restore_stack_nonlocal"
7071   [(match_operand:SI 0 "register_operand" "")
7072    (match_operand:DI 1 "memory_operand" "")]
7073   ""
7074   "
7075 {
7076   rtx temp = gen_reg_rtx (SImode);
7077
7078   /* Restore the backchain from the first word, sp from the second.  */
7079   emit_move_insn (temp, operand_subword (operands[1], 0, 0, DImode));
7080   emit_move_insn (operands[0], operand_subword (operands[1], 1, 0, DImode));
7081   emit_move_insn (gen_rtx (MEM, SImode, operands[0]), temp);
7082   DONE;
7083 }")
7084
7085 ;; If we have -mmiminal-toc, we need to reload r30 after a nonlocal goto.
7086
7087 (define_insn "nonlocal_goto_receiver"
7088   [(unspec_volatile [(const_int 0)] 1)]
7089   "TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0"
7090   "*
7091 {
7092   rs6000_output_load_toc_table (asm_out_file);
7093   return \"\";
7094 }"
7095   [(set_attr "type" "load")])
7096 \f
7097 ;; A function pointer under AIX is a pointer to a data area whose first word
7098 ;; contains the actual address of the function, whose second word contains a
7099 ;; pointer to its TOC, and whose third word contains a value to place in the
7100 ;; static chain register (r11).  Note that if we load the static chain, our
7101 ;; "trampoline" need not have any executable code.
7102 ;;
7103 ;; operands[0] is a register pointing to the 3 word descriptor (aka, the function address)
7104 ;; operands[1] is the stack size to clean up
7105 ;; operands[2] is the value FUNCTION_ARG returns for the VOID argument (must be 0 for AIX)
7106 ;; operands[3] is location to store the TOC
7107 ;; operands[4] is the TOC register
7108 ;; operands[5] is the static chain register
7109 ;;
7110 ;; We do not break this into separate insns, so that the scheduler will not try
7111 ;; to move the load of the new TOC before any loads from the TOC.
7112
7113 (define_insn "call_indirect_aix"
7114   [(call (mem:SI (match_operand:SI 0 "register_operand" "b"))
7115          (match_operand 1 "const_int_operand" "n"))
7116    (use (match_operand 2 "const_int_operand" "n"))
7117    (use (match_operand 3 "offsettable_addr_operand" "p"))
7118    (use (match_operand 4 "register_operand" "r"))
7119    (clobber (match_operand 5 "register_operand" "=r"))
7120    (clobber (match_scratch:SI 6 "=&r"))
7121    (clobber (match_scratch:SI 7 "=l"))]
7122   "DEFAULT_ABI == ABI_AIX
7123    && (INTVAL (operands[2]) == CALL_NORMAL || (INTVAL (operands[2]) & CALL_LONG) != 0)"
7124   "{st|stw} %4,%a3\;{l|lwz} %6,0(%0)\;{l|lwz} %4,4(%0)\;mt%7 %6\;{l|lwz} %5,8(%0)\;{brl|blrl}\;{l|lwz} %4,%a3"
7125   [(set_attr "type" "load")
7126    (set_attr "length" "28")])
7127
7128 (define_insn "call_value_indirect_aix"
7129   [(set (match_operand 0 "register_operand" "fg")
7130         (call (mem:SI (match_operand:SI 1 "register_operand" "b"))
7131               (match_operand 2 "const_int_operand" "n")))
7132    (use (match_operand 3 "const_int_operand" "n"))
7133    (use (match_operand 4 "offsettable_addr_operand" "p"))
7134    (use (match_operand 5 "register_operand" "r"))
7135    (clobber (match_operand 6 "register_operand" "=r"))
7136    (clobber (match_scratch:SI 7 "=&r"))
7137    (clobber (match_scratch:SI 8 "=l"))]
7138   "DEFAULT_ABI == ABI_AIX
7139    && (INTVAL (operands[3]) == CALL_NORMAL || (INTVAL (operands[3]) & CALL_LONG) != 0)"
7140   "{st|stw} %5,%a4\;{l|lwz} %7,0(%1)\;{l|lwz} %5,4(%1);\;mt%8 %7\;{l|lwz} %6,8(%1)\;{brl|blrl}\;{l|lwz} %5,%a4"
7141   [(set_attr "type" "load")
7142    (set_attr "length" "28")])
7143
7144 ;; A function pointer undef NT is a pointer to a data area whose first word
7145 ;; contains the actual address of the function, whose second word contains a
7146 ;; pointer to its TOC.  The static chain is not stored under NT, which means
7147 ;; that we need a trampoline.
7148 ;;
7149 ;; operands[0] is an SImode pseudo in which we place the address of the function.
7150 ;; operands[1] is the stack size to clean up
7151 ;; operands[2] is the value FUNCTION_ARG returns for the VOID argument (must be 0 for NT)
7152 ;; operands[3] is location to store the TOC
7153 ;; operands[4] is the TOC register
7154 ;;
7155 ;; We do not break this into separate insns, so that the scheduler will not try
7156 ;; to move the load of the new TOC before any loads from the TOC.
7157
7158 (define_insn "call_indirect_nt"
7159   [(call (mem:SI (match_operand:SI 0 "register_operand" "b"))
7160          (match_operand 1 "const_int_operand" "n"))
7161    (use (match_operand 2 "const_int_operand" "n"))
7162    (use (match_operand 3 "offsettable_addr_operand" "p"))
7163    (use (match_operand 4 "register_operand" "r"))
7164    (clobber (match_scratch:SI 5 "=&r"))
7165    (clobber (match_scratch:SI 6 "=l"))]
7166   "DEFAULT_ABI == ABI_NT
7167    && (INTVAL (operands[2]) == CALL_NORMAL || (INTVAL (operands[2]) & CALL_LONG) != 0)"
7168   "{st|stw} %4,%a3\;{l|lwz} %5,0(%0)\;{l|lwz} %4,4(%0)\;mt%6 %5\;{brl|blrl}\;{l|lwz} %4,%a3"
7169   [(set_attr "type" "load")
7170    (set_attr "length" "24")])
7171
7172 (define_insn "call_value_indirect_nt"
7173   [(set (match_operand 0 "register_operand" "fg")
7174         (call (mem:SI (match_operand:SI 1 "register_operand" "b"))
7175               (match_operand 2 "const_int_operand" "n")))
7176    (use (match_operand 3 "const_int_operand" "n"))
7177    (use (match_operand 4 "offsettable_addr_operand" "p"))
7178    (use (match_operand 5 "register_operand" "r"))
7179    (clobber (match_scratch:SI 6 "=&r"))
7180    (clobber (match_scratch:SI 7 "=l"))]
7181   "DEFAULT_ABI == ABI_NT
7182    && (INTVAL (operands[3]) == CALL_NORMAL || (INTVAL (operands[3]) & CALL_LONG) != 0)"
7183   "{st|stw} %5,%a4\;{l|lwz} %6,0(%1)\;{l|lwz} %5,4(%1)\;mt%7 %6\;{brl|blrl}\;{l|lwz} %5,%a4"
7184   [(set_attr "type" "load")
7185    (set_attr "length" "24")])
7186
7187 ;; A function pointer under System V is just a normal pointer
7188 ;; operands[0] is the function pointer
7189 ;; operands[1] is the stack size to clean up
7190 ;; operands[2] is the value FUNCTION_ARG returns for the VOID argument which indicates how to set cr1
7191
7192 (define_insn "call_indirect_sysv"
7193   [(call (mem:SI (match_operand:SI 0 "register_operand" "l,l"))
7194          (match_operand 1 "const_int_operand" "n,n"))
7195    (use (match_operand 2 "const_int_operand" "O,n"))
7196    (clobber (match_scratch:SI 3 "=l,l"))]
7197   "DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS || DEFAULT_ABI == ABI_AIX_NODESC"
7198   "*
7199 {
7200   if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
7201     output_asm_insn (\"crxor 6,6,6\", operands);
7202
7203   else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
7204     output_asm_insn (\"creqv 6,6,6\", operands);
7205
7206   return \"{brl|blrl}\";
7207 }"
7208   [(set_attr "type" "jmpreg")
7209    (set_attr "length" "4,8")])
7210
7211 (define_insn "call_value_indirect_sysv"
7212   [(set (match_operand 0 "register_operand" "=fg,fg")
7213         (call (mem:SI (match_operand:SI 1 "register_operand" "l,l"))
7214               (match_operand 2 "const_int_operand" "n,n")))
7215    (use (match_operand 3 "const_int_operand" "O,n"))
7216    (clobber (match_scratch:SI 4 "=l,l"))]
7217   "DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS || DEFAULT_ABI == ABI_AIX_NODESC"
7218   "*
7219 {
7220   if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
7221     output_asm_insn (\"crxor 6,6,6\", operands);
7222
7223   else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
7224     output_asm_insn (\"creqv 6,6,6\", operands);
7225
7226   return \"{brl|blrl}\";
7227 }"
7228   [(set_attr "type" "jmpreg")
7229    (set_attr "length" "4,8")])
7230
7231 ;; Now the definitions for the call and call_value insns
7232 (define_expand "call"
7233   [(parallel [(call (mem:SI (match_operand:SI 0 "address_operand" ""))
7234                     (match_operand 1 "" ""))
7235               (use (match_operand 2 "" ""))
7236               (clobber (scratch:SI))])]
7237   ""
7238   "
7239 {
7240   if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != CONST_INT)
7241     abort ();
7242
7243   operands[0] = XEXP (operands[0], 0);
7244
7245   /* Convert NT DLL imports into an indirect call.  */
7246   if (GET_CODE (operands[0]) == SYMBOL_REF
7247       && (INTVAL (operands[2]) & CALL_NT_DLLIMPORT) != 0)
7248     {
7249       operands[0] = rs6000_dll_import_ref (operands[0]);
7250       operands[2] = GEN_INT ((int)CALL_NORMAL);
7251     }
7252
7253   if (GET_CODE (operands[0]) != SYMBOL_REF
7254       || (INTVAL (operands[2]) & CALL_LONG) != 0)
7255     {
7256       if (INTVAL (operands[2]) & CALL_LONG)
7257         operands[0] = rs6000_longcall_ref (operands[0]);
7258
7259       if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_AIX_NODESC || DEFAULT_ABI == ABI_SOLARIS)
7260         emit_call_insn (gen_call_indirect_sysv (force_reg (Pmode, operands[0]),
7261                                                 operands[1], operands[2]));
7262       else
7263         {
7264           rtx toc_reg = gen_rtx (REG, Pmode, 2);
7265           rtx toc_addr = RS6000_SAVE_TOC;
7266
7267           if (DEFAULT_ABI == ABI_AIX)
7268             {
7269               /* AIX function pointers are really pointers to a three word area */
7270               rtx static_chain = gen_rtx (REG, Pmode, STATIC_CHAIN_REGNUM);
7271               emit_call_insn (gen_call_indirect_aix (force_reg (Pmode, operands[0]),
7272                                                      operands[1], operands[2],
7273                                                      toc_addr, toc_reg, static_chain));
7274             }
7275           else if (DEFAULT_ABI == ABI_NT)
7276             {
7277               /* NT function pointers are really pointers to a two word area */
7278               emit_call_insn (gen_call_indirect_nt (force_reg (Pmode, operands[0]),
7279                                                     operands[1], operands[2],
7280                                                     toc_addr, toc_reg));
7281             }
7282           else
7283             abort ();
7284         }
7285       DONE;
7286     }
7287 }")
7288
7289 (define_expand "call_value"
7290   [(parallel [(set (match_operand 0 "" "")
7291                    (call (mem:SI (match_operand:SI 1 "address_operand" ""))
7292                          (match_operand 2 "" "")))
7293               (use (match_operand 3 "" ""))
7294               (clobber (scratch:SI))])]
7295   ""
7296   "
7297 {
7298   if (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != CONST_INT)
7299     abort ();
7300
7301   operands[1] = XEXP (operands[1], 0);
7302
7303   /* Convert NT DLL imports into an indirect call.  */
7304   if (GET_CODE (operands[1]) == SYMBOL_REF
7305       && (INTVAL (operands[3]) & CALL_NT_DLLIMPORT) != 0)
7306     {
7307       operands[1] = rs6000_dll_import_ref (operands[1]);
7308       operands[3] = GEN_INT ((int)CALL_NORMAL);
7309     }
7310
7311   if (GET_CODE (operands[1]) != SYMBOL_REF
7312       || (INTVAL (operands[3]) & CALL_LONG) != 0)
7313     {
7314       if (INTVAL (operands[2]) & CALL_LONG)
7315         operands[1] = rs6000_longcall_ref (operands[1]);
7316
7317       if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_AIX_NODESC || DEFAULT_ABI == ABI_SOLARIS)
7318         emit_call_insn (gen_call_value_indirect_sysv (operands[0], operands[1],
7319                                                       operands[2], operands[3]));
7320       else
7321         {
7322           rtx toc_reg = gen_rtx (REG, Pmode, 2);
7323           rtx toc_addr = RS6000_SAVE_TOC;
7324
7325           if (DEFAULT_ABI == ABI_AIX)
7326             {
7327               /* AIX function pointers are really pointers to a three word area */
7328               rtx static_chain = gen_rtx (REG, Pmode, STATIC_CHAIN_REGNUM);
7329               emit_call_insn (gen_call_value_indirect_aix (operands[0],
7330                                                            force_reg (Pmode, operands[1]),
7331                                                            operands[2], operands[3],
7332                                                            toc_addr, toc_reg, static_chain));
7333             }
7334           else if (DEFAULT_ABI == ABI_NT)
7335             {
7336               /* NT function pointers are really pointers to a two word area */
7337               emit_call_insn (gen_call_value_indirect_nt (operands[0],
7338                                                           force_reg (Pmode, operands[1]),
7339                                                           operands[2], operands[3],
7340                                                           toc_addr, toc_reg));
7341             }
7342           else
7343             abort ();
7344         }
7345       DONE;
7346     }
7347 }")
7348
7349 ;; Call to function in current module.  No TOC pointer reload needed.
7350 ;; Operand2 is non-zero if we are using the V.4 calling sequence and
7351 ;; either the function was not prototyped, or it was prototyped as a
7352 ;; variable argument function.  It is > 0 if FP registers were passed
7353 ;; and < 0 if they were not.
7354
7355 (define_insn ""
7356   [(call (mem:SI (match_operand:SI 0 "current_file_function_operand" "s,s"))
7357          (match_operand 1 "" "g,g"))
7358    (use (match_operand:SI 2 "immediate_operand" "O,n"))
7359    (clobber (match_scratch:SI 3 "=l,l"))]
7360   "(INTVAL (operands[2]) & CALL_LONG) == 0"
7361   "*
7362 {
7363   if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
7364     output_asm_insn (\"crxor 6,6,6\", operands);
7365
7366   else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
7367     output_asm_insn (\"creqv 6,6,6\", operands);
7368
7369   return \"bl %z0\";
7370 }"
7371   [(set_attr "type" "branch")
7372    (set_attr "length" "4,8")])
7373
7374 ;; Call to function which may be in another module.  Restore the TOC
7375 ;; pointer (r2) after the call unless this is System V.
7376 ;; Operand2 is non-zero if we are using the V.4 calling sequence and
7377 ;; either the function was not prototyped, or it was prototyped as a
7378 ;; variable argument function.  It is > 0 if FP registers were passed
7379 ;; and < 0 if they were not.
7380
7381 (define_insn ""
7382   [(call (mem:SI (match_operand:SI 0 "call_operand" "s,s"))
7383          (match_operand 1 "" "fg,fg"))
7384    (use (match_operand:SI 2 "immediate_operand" "O,n"))
7385    (clobber (match_scratch:SI 3 "=l,l"))]
7386   "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_NT)
7387    && (INTVAL (operands[2]) & CALL_LONG) == 0"
7388   "*
7389 {
7390   /* Indirect calls should go through call_indirect */
7391   if (GET_CODE (operands[0]) == REG)
7392     abort ();
7393
7394   if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
7395     output_asm_insn (\"crxor 6,6,6\", operands);
7396
7397   else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
7398     output_asm_insn (\"creqv 6,6,6\", operands);
7399
7400   return (TARGET_WINDOWS_NT) ? \"bl %z0\;.znop %z0\" : \"bl %z0\;%.\";
7401 }"
7402   [(set_attr "type" "branch")
7403    (set_attr "length" "8,12")])
7404
7405 (define_insn ""
7406   [(call (mem:SI (match_operand:SI 0 "call_operand" "s,s"))
7407          (match_operand 1 "" "fg,fg"))
7408    (use (match_operand:SI 2 "immediate_operand" "O,n"))
7409    (clobber (match_scratch:SI 3 "=l,l"))]
7410   "(DEFAULT_ABI == ABI_AIX_NODESC || DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
7411    && (INTVAL (operands[2]) & CALL_LONG) == 0"
7412   "*
7413 {
7414   /* Indirect calls should go through call_indirect */
7415   if (GET_CODE (operands[0]) == REG)
7416     abort ();
7417
7418   if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
7419     output_asm_insn (\"crxor 6,6,6\", operands);
7420
7421   else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
7422     output_asm_insn (\"creqv 6,6,6\", operands);
7423
7424   return (flag_pic == 1) ? \"bl %z0@plt\" : \"bl %z0\";
7425 }"
7426   [(set_attr "type" "branch")
7427    (set_attr "length" "4,8")])
7428
7429 (define_insn ""
7430   [(set (match_operand 0 "" "=fg,fg")
7431         (call (mem:SI (match_operand:SI 1 "current_file_function_operand" "s,s"))
7432               (match_operand 2 "" "g,g")))
7433    (use (match_operand:SI 3 "immediate_operand" "O,n"))
7434    (clobber (match_scratch:SI 4 "=l,l"))]
7435   "(INTVAL (operands[3]) & CALL_LONG) == 0"
7436   "*
7437 {
7438   if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
7439     output_asm_insn (\"crxor 6,6,6\", operands);
7440
7441   else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
7442     output_asm_insn (\"creqv 6,6,6\", operands);
7443
7444   return \"bl %z1\";
7445 }"
7446   [(set_attr "type" "branch")
7447    (set_attr "length" "4,8")])
7448
7449 (define_insn ""
7450   [(set (match_operand 0 "" "=fg,fg")
7451         (call (mem:SI (match_operand:SI 1 "call_operand" "s,s"))
7452               (match_operand 2 "" "fg,fg")))
7453    (use (match_operand:SI 3 "immediate_operand" "O,n"))
7454    (clobber (match_scratch:SI 4 "=l,l"))]
7455   "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_NT)
7456    && (INTVAL (operands[3]) & CALL_LONG) == 0"
7457   "*
7458 {
7459   /* This should be handled by call_value_indirect */
7460   if (GET_CODE (operands[1]) == REG)
7461     abort ();
7462
7463   if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
7464     output_asm_insn (\"crxor 6,6,6\", operands);
7465
7466   else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
7467     output_asm_insn (\"creqv 6,6,6\", operands);
7468
7469   return (TARGET_WINDOWS_NT) ? \"bl %z1\;.znop %z1\" : \"bl %z1\;%.\";
7470 }"
7471   [(set_attr "type" "branch")
7472    (set_attr "length" "8,12")])
7473
7474 (define_insn ""
7475   [(set (match_operand 0 "" "=fg,fg")
7476         (call (mem:SI (match_operand:SI 1 "call_operand" "s,s"))
7477               (match_operand 2 "" "fg,fg")))
7478    (use (match_operand:SI 3 "immediate_operand" "O,n"))
7479    (clobber (match_scratch:SI 4 "=l,l"))]
7480   "(DEFAULT_ABI == ABI_AIX_NODESC || DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
7481    && (INTVAL (operands[3]) & CALL_LONG) == 0"
7482   "*
7483 {
7484   /* This should be handled by call_value_indirect */
7485   if (GET_CODE (operands[1]) == REG)
7486     abort ();
7487
7488   if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
7489     output_asm_insn (\"crxor 6,6,6\", operands);
7490
7491   else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
7492     output_asm_insn (\"creqv 6,6,6\", operands);
7493
7494   return (flag_pic == 1) ? \"bl %z1@plt\" : \"bl %z1\";
7495 }"
7496   [(set_attr "type" "branch")
7497    (set_attr "length" "4,8")])
7498
7499 ;; Call subroutine returning any type.
7500 (define_expand "untyped_call"
7501   [(parallel [(call (match_operand 0 "" "")
7502                     (const_int 0))
7503               (match_operand 1 "" "")
7504               (match_operand 2 "" "")])]
7505   ""
7506   "
7507 {
7508   int i;
7509
7510   emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx, const0_rtx));
7511
7512   for (i = 0; i < XVECLEN (operands[2], 0); i++)
7513     {
7514       rtx set = XVECEXP (operands[2], 0, i);
7515       emit_move_insn (SET_DEST (set), SET_SRC (set));
7516     }
7517
7518   /* The optimizer does not know that the call sets the function value
7519      registers we stored in the result block.  We avoid problems by
7520      claiming that all hard registers are used and clobbered at this
7521      point.  */
7522   emit_insn (gen_blockage ());
7523
7524   DONE;
7525 }")
7526
7527 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
7528 ;; all of memory.  This blocks insns from being moved across this point.
7529
7530 (define_insn "blockage"
7531   [(unspec_volatile [(const_int 0)] 0)]
7532   ""
7533   "")
7534
7535 ;; V.4 specific code to initialize the PIC register
7536
7537 (define_insn "init_v4_pic"
7538   [(set (match_operand:SI 0 "register_operand" "=l")
7539         (unspec [(const_int 0)] 7))]
7540   "DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS"
7541   "bl _GLOBAL_OFFSET_TABLE_@local-4"
7542   [(set_attr "type" "branch")
7543    (set_attr "length" "4")])
7544
7545 \f
7546 ;; Compare insns are next.  Note that the RS/6000 has two types of compares,
7547 ;; signed & unsigned, and one type of branch.
7548 ;;
7549 ;; Start with the DEFINE_EXPANDs to generate the rtl for compares, scc
7550 ;; insns, and branches.  We store the operands of compares until we see
7551 ;; how it is used.
7552 (define_expand "cmpsi"
7553   [(set (cc0)
7554         (compare (match_operand:SI 0 "gpc_reg_operand" "")
7555                  (match_operand:SI 1 "reg_or_short_operand" "")))]
7556   ""
7557   "
7558 {
7559   /* Take care of the possibility that operands[1] might be negative but
7560      this might be a logical operation.  That insn doesn't exist.  */
7561   if (GET_CODE (operands[1]) == CONST_INT
7562       && INTVAL (operands[1]) < 0)
7563     operands[1] = force_reg (SImode, operands[1]);
7564
7565   rs6000_compare_op0 = operands[0];
7566   rs6000_compare_op1 = operands[1];
7567   rs6000_compare_fp_p = 0;
7568   DONE;
7569 }")
7570
7571 (define_expand "cmpdi"
7572   [(set (cc0)
7573         (compare (match_operand:DI 0 "gpc_reg_operand" "")
7574                  (match_operand:DI 1 "reg_or_short_operand" "")))]
7575   "TARGET_POWERPC64"
7576   "
7577 {
7578   /* Take care of the possibility that operands[1] might be negative but
7579      this might be a logical operation.  That insn doesn't exist.  */
7580   if (GET_CODE (operands[1]) == CONST_INT
7581       && INTVAL (operands[1]) < 0)
7582     operands[1] = force_reg (DImode, operands[1]);
7583
7584   rs6000_compare_op0 = operands[0];
7585   rs6000_compare_op1 = operands[1];
7586   rs6000_compare_fp_p = 0;
7587   DONE;
7588 }")
7589
7590 (define_expand "cmpsf"
7591   [(set (cc0) (compare (match_operand:SF 0 "gpc_reg_operand" "")
7592                        (match_operand:SF 1 "gpc_reg_operand" "")))]
7593   "TARGET_HARD_FLOAT"
7594   "
7595 {
7596   rs6000_compare_op0 = operands[0];
7597   rs6000_compare_op1 = operands[1];
7598   rs6000_compare_fp_p = 1;
7599   DONE;
7600 }")
7601
7602 (define_expand "cmpdf"
7603   [(set (cc0) (compare (match_operand:DF 0 "gpc_reg_operand" "")
7604                        (match_operand:DF 1 "gpc_reg_operand" "")))]
7605   "TARGET_HARD_FLOAT"
7606   "
7607 {
7608   rs6000_compare_op0 = operands[0];
7609   rs6000_compare_op1 = operands[1];
7610   rs6000_compare_fp_p = 1;
7611   DONE;
7612 }")
7613
7614 (define_expand "beq"
7615   [(set (match_dup 2) (match_dup 1))
7616    (set (pc)
7617         (if_then_else (eq (match_dup 2)
7618                           (const_int 0))
7619                       (label_ref (match_operand 0 "" ""))
7620                       (pc)))]
7621   ""
7622   "
7623 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7624   operands[1] = gen_rtx (COMPARE, mode,
7625                          rs6000_compare_op0, rs6000_compare_op1);
7626   operands[2] = gen_reg_rtx (mode);
7627 }")
7628
7629 (define_expand "bne"
7630   [(set (match_dup 2) (match_dup 1))
7631    (set (pc)
7632         (if_then_else (ne (match_dup 2)
7633                           (const_int 0))
7634                       (label_ref (match_operand 0 "" ""))
7635                       (pc)))]
7636   ""
7637   "
7638 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7639   operands[1] = gen_rtx (COMPARE, mode,
7640                          rs6000_compare_op0, rs6000_compare_op1);
7641   operands[2] = gen_reg_rtx (mode);
7642 }")
7643
7644 (define_expand "blt"
7645   [(set (match_dup 2) (match_dup 1))
7646    (set (pc)
7647         (if_then_else (lt (match_dup 2)
7648                           (const_int 0))
7649                       (label_ref (match_operand 0 "" ""))
7650                       (pc)))]
7651   ""
7652   "
7653 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7654   operands[1] = gen_rtx (COMPARE, mode,
7655                          rs6000_compare_op0, rs6000_compare_op1);
7656   operands[2] = gen_reg_rtx (mode);
7657 }")
7658
7659 (define_expand "bgt"
7660   [(set (match_dup 2) (match_dup 1))
7661    (set (pc)
7662         (if_then_else (gt (match_dup 2)
7663                           (const_int 0))
7664                       (label_ref (match_operand 0 "" ""))
7665                       (pc)))]
7666   ""
7667   "
7668 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7669   operands[1] = gen_rtx (COMPARE, mode,
7670                          rs6000_compare_op0, rs6000_compare_op1);
7671   operands[2] = gen_reg_rtx (mode);
7672 }")
7673
7674 (define_expand "ble"
7675   [(set (match_dup 2) (match_dup 1))
7676    (set (pc)
7677         (if_then_else (le (match_dup 2)
7678                           (const_int 0))
7679                       (label_ref (match_operand 0 "" ""))
7680                       (pc)))]
7681   ""
7682   "
7683 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7684   operands[1] = gen_rtx (COMPARE, mode,
7685                          rs6000_compare_op0, rs6000_compare_op1);
7686   operands[2] = gen_reg_rtx (mode);
7687 }")
7688
7689 (define_expand "bge"
7690   [(set (match_dup 2) (match_dup 1))
7691    (set (pc)
7692         (if_then_else (ge (match_dup 2)
7693                           (const_int 0))
7694                       (label_ref (match_operand 0 "" ""))
7695                       (pc)))]
7696   ""
7697   "
7698 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7699   operands[1] = gen_rtx (COMPARE, mode,
7700                          rs6000_compare_op0, rs6000_compare_op1);
7701   operands[2] = gen_reg_rtx (mode);
7702 }")
7703
7704 (define_expand "bgtu"
7705   [(set (match_dup 2) (match_dup 1))
7706    (set (pc)
7707         (if_then_else (gtu (match_dup 2)
7708                            (const_int 0))
7709                       (label_ref (match_operand 0 "" ""))
7710                       (pc)))]
7711   ""
7712   "
7713 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7714                          rs6000_compare_op0, rs6000_compare_op1);
7715   operands[2] = gen_reg_rtx (CCUNSmode);
7716 }")
7717
7718 (define_expand "bltu"
7719   [(set (match_dup 2) (match_dup 1))
7720    (set (pc)
7721         (if_then_else (ltu (match_dup 2)
7722                            (const_int 0))
7723                       (label_ref (match_operand 0 "" ""))
7724                       (pc)))]
7725   ""
7726   "
7727 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7728                          rs6000_compare_op0, rs6000_compare_op1);
7729   operands[2] = gen_reg_rtx (CCUNSmode);
7730 }")
7731
7732 (define_expand "bgeu"
7733   [(set (match_dup 2) (match_dup 1))
7734    (set (pc)
7735         (if_then_else (geu (match_dup 2)
7736                            (const_int 0))
7737                       (label_ref (match_operand 0 "" ""))
7738                       (pc)))]
7739   ""
7740   "
7741 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7742                          rs6000_compare_op0, rs6000_compare_op1);
7743   operands[2] = gen_reg_rtx (CCUNSmode);
7744 }")
7745
7746 (define_expand "bleu"
7747   [(set (match_dup 2) (match_dup 1))
7748    (set (pc)
7749         (if_then_else (leu (match_dup 2)
7750                            (const_int 0))
7751                       (label_ref (match_operand 0 "" ""))
7752                       (pc)))]
7753   ""
7754   "
7755 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7756                          rs6000_compare_op0, rs6000_compare_op1);
7757   operands[2] = gen_reg_rtx (CCUNSmode);
7758 }")
7759
7760 ;; For SNE, we would prefer that the xor/abs sequence be used for integers.
7761 ;; For SEQ, likewise, except that comparisons with zero should be done
7762 ;; with an scc insns.  However, due to the order that combine see the
7763 ;; resulting insns, we must, in fact, allow SEQ for integers.  Fail in
7764 ;; the cases we don't want to handle.
7765 (define_expand "seq"
7766   [(set (match_dup 2) (match_dup 1))
7767    (set (match_operand:SI 0 "gpc_reg_operand" "")
7768         (eq:SI (match_dup 2) (const_int 0)))]
7769   ""
7770   "
7771 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7772   operands[1] = gen_rtx (COMPARE, mode,
7773                          rs6000_compare_op0, rs6000_compare_op1);
7774   operands[2] = gen_reg_rtx (mode);
7775 }")
7776
7777 (define_expand "sne"
7778   [(set (match_dup 2) (match_dup 1))
7779    (set (match_operand:SI 0 "gpc_reg_operand" "")
7780         (ne:SI (match_dup 2) (const_int 0)))]
7781   ""
7782   "
7783 { if (! rs6000_compare_fp_p)
7784     FAIL;
7785
7786   operands[1] = gen_rtx (COMPARE, CCFPmode,
7787                          rs6000_compare_op0, rs6000_compare_op1);
7788   operands[2] = gen_reg_rtx (CCFPmode);
7789 }")
7790
7791 ;; A > 0 is best done using the portable sequence, so fail in that case.
7792 (define_expand "sgt"
7793   [(set (match_dup 2) (match_dup 1))
7794    (set (match_operand:SI 0 "gpc_reg_operand" "")
7795         (gt:SI (match_dup 2) (const_int 0)))]
7796   ""
7797   "
7798 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7799
7800   if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
7801     FAIL;
7802
7803   operands[1] = gen_rtx (COMPARE, mode,
7804                          rs6000_compare_op0, rs6000_compare_op1);
7805   operands[2] = gen_reg_rtx (mode);
7806 }")
7807
7808 ;; A < 0 is best done in the portable way for A an integer.
7809 (define_expand "slt"
7810   [(set (match_dup 2) (match_dup 1))
7811    (set (match_operand:SI 0 "gpc_reg_operand" "")
7812         (lt:SI (match_dup 2) (const_int 0)))]
7813   ""
7814   "
7815 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7816
7817   if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
7818     FAIL;
7819
7820   operands[1] = gen_rtx (COMPARE, mode,
7821                          rs6000_compare_op0, rs6000_compare_op1);
7822   operands[2] = gen_reg_rtx (mode);
7823 }")
7824
7825 (define_expand "sge"
7826   [(set (match_dup 2) (match_dup 1))
7827    (set (match_operand:SI 0 "gpc_reg_operand" "")
7828         (ge:SI (match_dup 2) (const_int 0)))]
7829   ""
7830   "
7831 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7832   operands[1] = gen_rtx (COMPARE, mode,
7833                          rs6000_compare_op0, rs6000_compare_op1);
7834   operands[2] = gen_reg_rtx (mode);
7835 }")
7836
7837 ;; A <= 0 is best done the portable way for A an integer.
7838 (define_expand "sle"
7839   [(set (match_dup 2) (match_dup 1))
7840    (set (match_operand:SI 0 "gpc_reg_operand" "")
7841         (le:SI (match_dup 2) (const_int 0)))]
7842   ""
7843   "
7844 { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
7845
7846   if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
7847     FAIL;
7848
7849   operands[1] = gen_rtx (COMPARE, mode,
7850                          rs6000_compare_op0, rs6000_compare_op1);
7851   operands[2] = gen_reg_rtx (mode);
7852 }")
7853
7854 (define_expand "sgtu"
7855   [(set (match_dup 2) (match_dup 1))
7856    (set (match_operand:SI 0 "gpc_reg_operand" "")
7857         (gtu:SI (match_dup 2) (const_int 0)))]
7858   ""
7859   "
7860 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7861                          rs6000_compare_op0, rs6000_compare_op1);
7862   operands[2] = gen_reg_rtx (CCUNSmode);
7863 }")
7864
7865 (define_expand "sltu"
7866   [(set (match_dup 2) (match_dup 1))
7867    (set (match_operand:SI 0 "gpc_reg_operand" "")
7868         (ltu:SI (match_dup 2) (const_int 0)))]
7869   ""
7870   "
7871 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7872                          rs6000_compare_op0, rs6000_compare_op1);
7873   operands[2] = gen_reg_rtx (CCUNSmode);
7874 }")
7875
7876 (define_expand "sgeu"
7877   [(set (match_dup 2) (match_dup 1))
7878    (set (match_operand:SI 0 "gpc_reg_operand" "")
7879         (geu:SI (match_dup 2) (const_int 0)))]
7880   ""
7881   "
7882 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7883                          rs6000_compare_op0, rs6000_compare_op1);
7884   operands[2] = gen_reg_rtx (CCUNSmode);
7885 }")
7886
7887 (define_expand "sleu"
7888   [(set (match_dup 2) (match_dup 1))
7889    (set (match_operand:SI 0 "gpc_reg_operand" "")
7890         (leu:SI (match_dup 2) (const_int 0)))]
7891   ""
7892   "
7893 { operands[1] = gen_rtx (COMPARE, CCUNSmode,
7894                          rs6000_compare_op0, rs6000_compare_op1);
7895   operands[2] = gen_reg_rtx (CCUNSmode);
7896 }")
7897 \f
7898 ;; Here are the actual compare insns.
7899 (define_insn ""
7900   [(set (match_operand:CC 0 "cc_reg_operand" "=y")
7901         (compare:CC (match_operand:SI 1 "gpc_reg_operand" "r")
7902                     (match_operand:SI 2 "reg_or_short_operand" "rI")))]
7903   ""
7904   "{cmp%I2|cmpw%I2} %0,%1,%2"
7905   [(set_attr "type" "compare")])
7906
7907 (define_insn ""
7908   [(set (match_operand:CC 0 "cc_reg_operand" "=y")
7909         (compare:CC (match_operand:DI 1 "gpc_reg_operand" "r")
7910                     (match_operand:DI 2 "reg_or_short_operand" "rI")))]
7911   "TARGET_POWERPC64"
7912   "cmpd%I2 %0,%1,%2"
7913   [(set_attr "type" "compare")])
7914
7915 ;; If we are comparing a register for equality with a large constant,
7916 ;; we can do this with an XOR followed by a compare.  But we need a scratch
7917 ;; register for the result of the XOR.
7918
7919 (define_split
7920   [(set (match_operand:CC 0 "cc_reg_operand" "")
7921         (compare:CC (match_operand:SI 1 "gpc_reg_operand" "")
7922                     (match_operand:SI 2 "non_short_cint_operand" "")))
7923    (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
7924   "find_single_use (operands[0], insn, 0)
7925    && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
7926        || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
7927   [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
7928    (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
7929   "
7930 {
7931   /* Get the constant we are comparing against, C,  and see what it looks like
7932      sign-extended to 16 bits.  Then see what constant could be XOR'ed
7933      with C to get the sign-extended value.  */
7934
7935   int c = INTVAL (operands[2]);
7936   int sextc = (c << 16) >> 16;
7937   int xorv = c ^ sextc;
7938
7939   operands[4] = gen_rtx (CONST_INT, VOIDmode, xorv);
7940   operands[5] = gen_rtx (CONST_INT, VOIDmode, sextc);
7941 }")
7942
7943 (define_insn ""
7944   [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y")
7945         (compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "r")
7946                        (match_operand:SI 2 "reg_or_u_short_operand" "rI")))]
7947   ""
7948   "{cmpl%I2|cmplw%I2} %0,%1,%W2"
7949   [(set_attr "type" "compare")])
7950
7951 (define_insn ""
7952   [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y")
7953         (compare:CCUNS (match_operand:DI 1 "gpc_reg_operand" "r")
7954                        (match_operand:DI 2 "reg_or_u_short_operand" "rI")))]
7955   ""
7956   "cmpld%I2 %0,%1,%W2"
7957   [(set_attr "type" "compare")])
7958
7959 ;; The following two insns don't exist as single insns, but if we provide
7960 ;; them, we can swap an add and compare, which will enable us to overlap more
7961 ;; of the required delay between a compare and branch.  We generate code for
7962 ;; them by splitting.
7963
7964 (define_insn ""
7965   [(set (match_operand:CC 3 "cc_reg_operand" "=y")
7966         (compare:CC (match_operand:SI 1 "gpc_reg_operand" "r")
7967                     (match_operand:SI 2 "short_cint_operand" "i")))
7968    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
7969         (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
7970   ""
7971   "#"
7972   [(set_attr "length" "8")])
7973
7974 (define_insn ""
7975   [(set (match_operand:CCUNS 3 "cc_reg_operand" "=y")
7976         (compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "r")
7977                        (match_operand:SI 2 "u_short_cint_operand" "i")))
7978    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
7979         (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
7980   ""
7981   "#"
7982   [(set_attr "length" "8")])
7983
7984 (define_split
7985   [(set (match_operand:CC 3 "cc_reg_operand" "")
7986         (compare:CC (match_operand:SI 1 "gpc_reg_operand" "")
7987                     (match_operand:SI 2 "short_cint_operand" "")))
7988    (set (match_operand:SI 0 "gpc_reg_operand" "")
7989         (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
7990   ""
7991   [(set (match_dup 3) (compare:CC (match_dup 1) (match_dup 2)))
7992    (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
7993
7994 (define_split
7995   [(set (match_operand:CCUNS 3 "cc_reg_operand" "")
7996         (compare:CCUNS (match_operand:SI 1 "gpc_reg_operand" "")
7997                        (match_operand:SI 2 "u_short_cint_operand" "")))
7998    (set (match_operand:SI 0 "gpc_reg_operand" "")
7999         (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
8000   ""
8001   [(set (match_dup 3) (compare:CCUNS (match_dup 1) (match_dup 2)))
8002    (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
8003
8004 (define_insn ""
8005   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
8006         (compare:CCFP (match_operand:SF 1 "gpc_reg_operand" "f")
8007                       (match_operand:SF 2 "gpc_reg_operand" "f")))]
8008   "TARGET_HARD_FLOAT"
8009   "fcmpu %0,%1,%2"
8010   [(set_attr "type" "fpcompare")])
8011
8012 (define_insn ""
8013   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
8014         (compare:CCFP (match_operand:DF 1 "gpc_reg_operand" "f")
8015                       (match_operand:DF 2 "gpc_reg_operand" "f")))]
8016   "TARGET_HARD_FLOAT"
8017   "fcmpu %0,%1,%2"
8018   [(set_attr "type" "fpcompare")])
8019 \f
8020 ;; Now we have the scc insns.  We can do some combinations because of the
8021 ;; way the machine works.
8022 ;;
8023 ;; Note that this is probably faster if we can put an insn between the
8024 ;; mfcr and rlinm, but this is tricky.  Let's leave it for now.  In most
8025 ;; cases the insns below which don't use an intermediate CR field will
8026 ;; be used instead.
8027 (define_insn ""
8028   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8029         (match_operator:SI 1 "scc_comparison_operator"
8030                            [(match_operand 2 "cc_reg_operand" "y")
8031                             (const_int 0)]))]
8032   ""
8033   "%D1mfcr %0\;{rlinm|rlwinm} %0,%0,%J1,1"
8034   [(set_attr "length" "12")])
8035
8036 (define_insn ""
8037   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8038         (compare:CC (match_operator:SI 1 "scc_comparison_operator"
8039                                        [(match_operand 2 "cc_reg_operand" "y")
8040                                         (const_int 0)])
8041                     (const_int 0)))
8042    (set (match_operand:SI 3 "gpc_reg_operand" "=r")
8043         (match_op_dup 1 [(match_dup 2) (const_int 0)]))]
8044   ""
8045   "%D1mfcr %3\;{rlinm.|rlwinm.} %3,%3,%J1,1"
8046   [(set_attr "type" "delayed_compare")
8047    (set_attr "length" "12")])
8048
8049 (define_insn ""
8050   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8051         (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
8052                                       [(match_operand 2 "cc_reg_operand" "y")
8053                                        (const_int 0)])
8054                    (match_operand:SI 3 "const_int_operand" "n")))]
8055   ""
8056   "*
8057 {
8058   int is_bit = ccr_bit (operands[1], 1);
8059   int put_bit = 31 - (INTVAL (operands[3]) & 31);
8060   int count;
8061
8062   if (is_bit >= put_bit)
8063     count = is_bit - put_bit;
8064   else
8065     count = 32 - (put_bit - is_bit);
8066
8067   operands[4] = gen_rtx (CONST_INT, VOIDmode, count);
8068   operands[5] = gen_rtx (CONST_INT, VOIDmode, put_bit);
8069
8070   return \"%D1mfcr %0\;{rlinm|rlwinm} %0,%0,%4,%5,%5\";
8071 }"
8072  [(set_attr "length" "12")])
8073
8074 (define_insn ""
8075   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8076         (compare:CC
8077          (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
8078                                        [(match_operand 2 "cc_reg_operand" "y")
8079                                         (const_int 0)])
8080                     (match_operand:SI 3 "const_int_operand" "n"))
8081          (const_int 0)))
8082    (set (match_operand:SI 4 "gpc_reg_operand" "=r")
8083         (ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)])
8084                    (match_dup 3)))]
8085   ""
8086   "*
8087 {
8088   int is_bit = ccr_bit (operands[1], 1);
8089   int put_bit = 31 - (INTVAL (operands[3]) & 31);
8090   int count;
8091
8092   if (is_bit >= put_bit)
8093     count = is_bit - put_bit;
8094   else
8095     count = 32 - (put_bit - is_bit);
8096
8097   operands[5] = gen_rtx (CONST_INT, VOIDmode, count);
8098   operands[6] = gen_rtx (CONST_INT, VOIDmode, put_bit);
8099
8100   return \"%D1mfcr %4\;{rlinm.|rlwinm.} %4,%4,%5,%6,%6\";
8101 }"
8102   [(set_attr "type" "delayed_compare")
8103    (set_attr "length" "12")])
8104
8105 ;; If we are comparing the result of two comparisons, this can be done
8106 ;; using creqv or crxor.
8107
8108 (define_insn ""
8109   [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y")
8110         (compare:CCEQ (match_operator 1 "scc_comparison_operator"
8111                               [(match_operand 2 "cc_reg_operand" "y")
8112                                (const_int 0)])
8113                       (match_operator 3 "scc_comparison_operator"
8114                               [(match_operand 4 "cc_reg_operand" "y")
8115                                (const_int 0)])))]
8116   "REGNO (operands[2]) != REGNO (operands[4])"
8117   "*
8118 {
8119   enum rtx_code code1, code2;
8120
8121   code1 = GET_CODE (operands[1]);
8122   code2 = GET_CODE (operands[3]);
8123
8124   if ((code1 == EQ || code1 == LT || code1 == GT
8125        || code1 == LTU || code1 == GTU
8126        || (code1 != NE && GET_MODE (operands[2]) == CCFPmode))
8127       !=
8128       (code2 == EQ || code2 == LT || code2 == GT
8129        || code2 == LTU || code2 == GTU
8130        || (code2 != NE && GET_MODE (operands[4]) == CCFPmode)))
8131     return \"%C1%C3crxor %E0,%j1,%j3\";
8132   else
8133     return \"%C1%C3creqv %E0,%j1,%j3\";
8134 }"
8135   [(set_attr "length" "12")])
8136
8137 ;; There is a 3 cycle delay between consecutive mfcr instructions
8138 ;; so it is useful to combine 2 scc instructions to use only one mfcr.
8139
8140 (define_peephole
8141   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8142         (match_operator:SI 1 "scc_comparison_operator"
8143                            [(match_operand 2 "cc_reg_operand" "y")
8144                             (const_int 0)]))
8145    (set (match_operand:SI 3 "gpc_reg_operand" "=r")
8146         (match_operator:SI 4 "scc_comparison_operator"
8147                            [(match_operand 5 "cc_reg_operand" "y")
8148                             (const_int 0)]))]
8149    "REGNO (operands[2]) != REGNO (operands[5])"
8150    "%D1%D4mfcr %3\;{rlinm|rlwinm} %0,%3,%J1,1\;{rlinm|rlwinm} %3,%3,%J4,1"
8151    [(set_attr "length" "20")])
8152
8153 ;; There are some scc insns that can be done directly, without a compare.
8154 ;; These are faster because they don't involve the communications between
8155 ;; the FXU and branch units.   In fact, we will be replacing all of the
8156 ;; integer scc insns here or in the portable methods in emit_store_flag.
8157 ;;
8158 ;; Also support (neg (scc ..)) since that construct is used to replace
8159 ;; branches, (plus (scc ..) ..) since that construct is common and
8160 ;; takes no more insns than scc, and (and (neg (scc ..)) ..) in the
8161 ;; cases where it is no more expensive than (neg (scc ..)).
8162
8163 ;; Have reload force a constant into a register for the simple insns that
8164 ;; otherwise won't accept constants.  We do this because it is faster than
8165 ;; the cmp/mfcr sequence we would otherwise generate.
8166
8167 (define_insn ""
8168   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
8169         (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8170                (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")))
8171    (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
8172   ""
8173   "@
8174    xor %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
8175    {sfi|subfic} %3,%1,0\;{ae|adde} %0,%3,%1
8176    {xoril|xori} %0,%1,%b2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
8177    {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
8178    {sfi|subfic} %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0"
8179   [(set_attr "length" "12,8,12,12,12")])
8180
8181 (define_insn ""
8182   [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x")
8183         (compare:CC
8184          (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8185                 (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
8186          (const_int 0)))
8187    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
8188         (eq:SI (match_dup 1) (match_dup 2)))
8189    (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
8190   ""
8191   "@
8192    xor %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
8193    {sfi|subfic} %3,%1,0\;{ae.|adde.} %0,%3,%1
8194    {xoril|xori} %0,%1,%b2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
8195    {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
8196    {sfi|subfic} %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0"
8197   [(set_attr "type" "compare")
8198    (set_attr "length" "12,8,12,12,12")])
8199
8200 ;; We have insns of the form shown by the first define_insn below.  If
8201 ;; there is something inside the comparison operation, we must split it.
8202 (define_split
8203   [(set (match_operand:SI 0 "gpc_reg_operand" "")
8204         (plus:SI (match_operator 1 "comparison_operator"
8205                                  [(match_operand:SI 2 "" "")
8206                                   (match_operand:SI 3
8207                                                     "reg_or_cint_operand" "")])
8208                  (match_operand:SI 4 "gpc_reg_operand" "")))
8209    (clobber (match_operand:SI 5 "register_operand" ""))]
8210   "! gpc_reg_operand (operands[2], SImode)"
8211   [(set (match_dup 5) (match_dup 2))
8212    (set (match_dup 2) (plus:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)])
8213                                (match_dup 4)))])
8214
8215 (define_insn ""
8216   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
8217         (plus:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8218                         (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
8219                  (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r")))
8220    (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
8221   ""
8222   "@
8223    xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
8224    {sfi|subfic} %4,%1,0\;{aze|addze} %0,%3
8225    {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
8226    {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
8227    {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3"
8228   [(set_attr "length" "12,8,12,12,12")])
8229
8230 (define_insn ""
8231   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,x")
8232         (compare:CC
8233          (plus:SI
8234           (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8235                  (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
8236           (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r"))
8237          (const_int 0)))
8238    (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
8239   ""
8240   "@
8241    xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
8242    {sfi|subfic} %4,%1,0\;{aze.|addze.} %0,%3
8243    {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
8244    {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
8245    {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3"
8246   [(set_attr "type" "compare")
8247    (set_attr "length" "12,8,12,12,12")])
8248
8249 (define_insn ""
8250   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x,x")
8251         (compare:CC
8252          (plus:SI
8253           (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8254                  (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
8255           (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r"))
8256          (const_int 0)))
8257    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
8258         (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8259    (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
8260   ""
8261   "@
8262    xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
8263    {sfi|subfic} %4,%1,0\;{aze.|addze.} %4,%3
8264    {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
8265    {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
8266    {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3"
8267   [(set_attr "type" "compare")
8268    (set_attr "length" "12,8,12,12,12")])
8269
8270 (define_insn ""
8271   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
8272         (neg:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
8273                        (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))))]
8274   ""
8275   "@
8276    xor %0,%1,%2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
8277    {ai|addic} %0,%1,-1\;{sfe|subfe} %0,%0,%0
8278    {xoril|xori} %0,%1,%b2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
8279    {xoriu|xoris} %0,%1,%u2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
8280    {sfi|subfic} %0,%1,%2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0"
8281    [(set_attr "length" "12,8,12,12,12")])
8282
8283 ;; Simplify (ne X (const_int 0)) on the PowerPC.  No need to on the Power,
8284 ;; since it nabs/sr is just as fast.
8285 (define_insn ""
8286   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8287         (lshiftrt:SI (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
8288                      (const_int 31)))
8289    (clobber (match_scratch:SI 2 "=&r"))]
8290   "!TARGET_POWER"
8291   "{ai|addic} %2,%1,-1\;{sfe|subfe} %0,%2,%1"
8292   [(set_attr "length" "8")])
8293
8294 ;; This is what (plus (ne X (const_int 0)) Y) looks like.
8295 (define_insn ""
8296   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8297         (plus:SI (lshiftrt:SI
8298                   (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
8299                   (const_int 31))
8300                  (match_operand:SI 2 "gpc_reg_operand" "r")))
8301    (clobber (match_scratch:SI 3 "=&r"))]
8302   ""
8303   "{ai|addic} %3,%1,-1\;{aze|addze} %0,%2"
8304   [(set_attr "length" "8")])
8305
8306 (define_insn ""
8307   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8308         (compare:CC
8309          (plus:SI (lshiftrt:SI
8310                    (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
8311                    (const_int 31))
8312                   (match_operand:SI 2 "gpc_reg_operand" "r"))
8313          (const_int 0)))
8314    (clobber (match_scratch:SI 3 "=&r"))]
8315   ""
8316   "{ai|addic} %3,%1,-1\;{aze.|addze.} %3,%2"
8317   [(set_attr "type" "compare")
8318    (set_attr "length" "8")])
8319
8320 (define_insn ""
8321   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
8322         (compare:CC
8323          (plus:SI (lshiftrt:SI
8324                    (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r")))
8325                    (const_int 31))
8326                   (match_operand:SI 2 "gpc_reg_operand" "r"))
8327          (const_int 0)))
8328    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8329         (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31))
8330                  (match_dup 2)))
8331    (clobber (match_scratch:SI 3 "=&r"))]
8332   ""
8333   "{ai|addic} %3,%1,-1\;{aze.|addze.} %0,%2"
8334   [(set_attr "type" "compare")
8335    (set_attr "length" "8")])
8336
8337 (define_insn ""
8338   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8339         (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8340                (match_operand:SI 2 "reg_or_short_operand" "r,O")))
8341    (clobber (match_scratch:SI 3 "=r,X"))]
8342   "TARGET_POWER"
8343   "@
8344    doz %3,%2,%1\;{sfi|subfic} %0,%3,0\;{ae|adde} %0,%0,%3
8345    {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{sri|srwi} %0,%0,31"
8346   [(set_attr "length" "12")])
8347
8348 (define_insn ""
8349   [(set (match_operand:CC 4 "cc_reg_operand" "=x,x")
8350         (compare:CC
8351          (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8352                 (match_operand:SI 2 "reg_or_short_operand" "r,O"))
8353          (const_int 0)))
8354    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8355         (le:SI (match_dup 1) (match_dup 2)))
8356    (clobber (match_scratch:SI 3 "=r,X"))]
8357   "TARGET_POWER"
8358   "@
8359    doz %3,%2,%1\;{sfi|subfic} %0,%3,0\;{ae.|adde.} %0,%0,%3
8360    {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{sri.|srwi.} %0,%0,31"
8361   [(set_attr "type" "compare,delayed_compare")
8362    (set_attr "length" "12")])
8363
8364 (define_insn ""
8365   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8366         (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8367                         (match_operand:SI 2 "reg_or_short_operand" "r,O"))
8368                  (match_operand:SI 3 "gpc_reg_operand" "r,r")))
8369    (clobber (match_scratch:SI 4 "=&r,&r"))]
8370   "TARGET_POWER"
8371   "@
8372    doz %4,%2,%1\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
8373    {srai|srawi} %4,%1,31\;{sf|subfc} %4,%1,%4\;{aze|addze} %0,%3"
8374   [(set_attr "length" "12")])
8375
8376 (define_insn ""
8377   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
8378         (compare:CC
8379          (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8380                          (match_operand:SI 2 "reg_or_short_operand" "r,O"))
8381                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8382          (const_int 0)))
8383    (clobber (match_scratch:SI 4 "=&r,&r"))]
8384   "TARGET_POWER"
8385   "@
8386    doz %4,%2,%1\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3
8387    {srai|srawi} %4,%1,31\;{sf|subfc} %4,%1,%4\;{aze.|addze.} %4,%3"
8388   [(set_attr "type" "compare")
8389    (set_attr "length" "12")])
8390
8391 (define_insn ""
8392   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
8393         (compare:CC
8394          (plus:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8395                          (match_operand:SI 2 "reg_or_short_operand" "r,O"))
8396                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8397          (const_int 0)))
8398    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8399         (plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8400    (clobber (match_scratch:SI 4 "=&r,&r"))]
8401   "TARGET_POWER"
8402   "@
8403    doz %4,%2,%1\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
8404    {srai|srawi} %4,%1,31\;{sf|subfc} %4,%1,%4\;{aze.|addze.} %0,%3"
8405   [(set_attr "type" "compare")
8406    (set_attr "length" "12")])
8407
8408 (define_insn ""
8409   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8410         (neg:SI (le:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8411                        (match_operand:SI 2 "reg_or_short_operand" "r,O"))))]
8412   "TARGET_POWER"
8413   "@
8414    doz %0,%2,%1\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
8415    {ai|addic} %0,%1,-1\;{aze|addze} %0,%0\;{srai|srawi} %0,%0,31"
8416   [(set_attr "length" "12")])
8417
8418 (define_insn ""
8419   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8420         (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8421                 (match_operand:SI 2 "reg_or_short_operand" "rI")))]
8422   ""
8423   "{sf%I2|subf%I2c} %0,%1,%2\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0"
8424   [(set_attr "length" "12")])
8425
8426 (define_insn ""
8427   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
8428         (compare:CC
8429          (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8430                  (match_operand:SI 2 "reg_or_short_operand" "rI"))
8431          (const_int 0)))
8432    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8433         (leu:SI (match_dup 1) (match_dup 2)))]
8434    ""
8435   "{sf%I2|subf%I2c} %0,%1,%2\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0"
8436   [(set_attr "type" "compare")
8437    (set_attr "length" "12")])
8438
8439 (define_insn ""
8440   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8441         (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8442                          (match_operand:SI 2 "reg_or_short_operand" "rI"))
8443                  (match_operand:SI 3 "gpc_reg_operand" "r")))
8444    (clobber (match_scratch:SI 4 "=&r"))]
8445   ""
8446   "{sf%I2|subf%I2c} %4,%1,%2\;{aze|addze} %0,%3"
8447   [(set_attr "length" "8")])
8448
8449 (define_insn ""
8450   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8451         (compare:CC
8452          (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8453                           (match_operand:SI 2 "reg_or_short_operand" "rI"))
8454                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8455          (const_int 0)))
8456    (clobber (match_scratch:SI 4 "=&r"))]
8457   ""
8458   "{sf%I2|subf%I2c} %4,%1,%2\;{aze.|addze.} %4,%3"
8459   [(set_attr "type" "compare")
8460    (set_attr "length" "8")])
8461
8462 (define_insn ""
8463   [(set (match_operand:CC 5 "cc_reg_operand" "=x")
8464         (compare:CC
8465          (plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8466                           (match_operand:SI 2 "reg_or_short_operand" "rI"))
8467                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8468          (const_int 0)))
8469    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8470         (plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8471    (clobber (match_scratch:SI 4 "=&r"))]
8472   ""
8473   "{sf%I2|subf%I2c} %4,%1,%2\;{aze.|addze.} %0,%3"
8474   [(set_attr "type" "compare")
8475    (set_attr "length" "8")])
8476
8477 (define_insn ""
8478   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8479         (neg:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8480                         (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
8481   ""
8482   "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;nand %0,%0,%0"
8483    [(set_attr "length" "12")])
8484
8485 (define_insn ""
8486   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8487         (and:SI (neg:SI
8488                  (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8489                          (match_operand:SI 2 "reg_or_short_operand" "rI")))
8490                 (match_operand:SI 3 "gpc_reg_operand" "r")))
8491    (clobber (match_scratch:SI 4 "=&r"))]
8492   ""
8493   "{sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;andc %0,%3,%4"
8494   [(set_attr "length" "12")])
8495
8496 (define_insn ""
8497   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8498         (compare:CC
8499          (and:SI (neg:SI
8500                   (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8501                           (match_operand:SI 2 "reg_or_short_operand" "rI")))
8502                  (match_operand:SI 3 "gpc_reg_operand" "r"))
8503          (const_int 0)))
8504    (clobber (match_scratch:SI 4 "=&r"))]
8505   ""
8506   "{sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4"
8507   [(set_attr "type" "compare")
8508    (set_attr "length" "12")])
8509
8510 (define_insn ""
8511   [(set (match_operand:CC 5 "cc_reg_operand" "=x")
8512         (compare:CC
8513          (and:SI (neg:SI
8514                   (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8515                           (match_operand:SI 2 "reg_or_short_operand" "rI")))
8516                  (match_operand:SI 3 "gpc_reg_operand" "r"))
8517          (const_int 0)))
8518    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8519         (and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))
8520    (clobber (match_scratch:SI 4 "=&r"))]
8521   ""
8522   "{sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;andc. %0,%3,%4"
8523   [(set_attr "type" "compare")
8524    (set_attr "length" "12")])
8525
8526 (define_insn ""
8527   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8528         (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8529                (match_operand:SI 2 "reg_or_short_operand" "rI")))]
8530   "TARGET_POWER"
8531   "doz%I2 %0,%1,%2\;nabs %0,%0\;{sri|srwi} %0,%0,31"
8532    [(set_attr "length" "12")])
8533
8534 (define_insn ""
8535   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
8536         (compare:CC
8537          (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8538                 (match_operand:SI 2 "reg_or_short_operand" "rI"))
8539          (const_int 0)))
8540    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8541         (lt:SI (match_dup 1) (match_dup 2)))]
8542   "TARGET_POWER"
8543   "doz%I2 %0,%1,%2\;nabs %0,%0\;{sri.|srwi.} %0,%0,31"
8544   [(set_attr "type" "delayed_compare")
8545    (set_attr "length" "12")])
8546
8547 (define_insn ""
8548   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8549         (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8550                         (match_operand:SI 2 "reg_or_short_operand" "rI"))
8551                  (match_operand:SI 3 "gpc_reg_operand" "r")))
8552    (clobber (match_scratch:SI 4 "=&r"))]
8553   "TARGET_POWER"
8554   "doz%I2 %4,%1,%2\;{ai|addic} %4,%4,-1\;{aze|addze} %0,%3"
8555   [(set_attr "length" "12")])
8556
8557 (define_insn ""
8558   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8559         (compare:CC
8560          (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8561                          (match_operand:SI 2 "reg_or_short_operand" "rI"))
8562                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8563          (const_int 0)))
8564    (clobber (match_scratch:SI 4 "=&r"))]
8565   "TARGET_POWER"
8566   "doz%I2 %4,%1,%2\;{ai|addic} %4,%4,-1\;{aze.|addze.} %4,%3"
8567   [(set_attr "type" "compare")
8568    (set_attr "length" "12")])
8569
8570 (define_insn ""
8571   [(set (match_operand:CC 5 "cc_reg_operand" "=x")
8572         (compare:CC
8573          (plus:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8574                          (match_operand:SI 2 "reg_or_short_operand" "rI"))
8575                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8576          (const_int 0)))
8577    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8578         (plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8579    (clobber (match_scratch:SI 4 "=&r"))]
8580   "TARGET_POWER"
8581   "doz%I2 %4,%1,%2\;{ai|addic} %4,%4,-1\;{aze.|addze.} %0,%3"
8582   [(set_attr "type" "compare")
8583    (set_attr "length" "12")])
8584
8585 (define_insn ""
8586   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8587         (neg:SI (lt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8588                        (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
8589   "TARGET_POWER"
8590   "doz%I2 %0,%1,%2\;nabs %0,%0\;{srai|srawi} %0,%0,31"
8591   [(set_attr "length" "12")])
8592
8593 (define_insn ""
8594   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8595         (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8596                 (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))]
8597   ""
8598   "@
8599    {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;neg %0,%0
8600    {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0\;neg %0,%0"
8601   [(set_attr "length" "12")])
8602
8603 (define_insn ""
8604   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
8605         (compare:CC
8606          (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8607                  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8608          (const_int 0)))
8609    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8610         (ltu:SI (match_dup 1) (match_dup 2)))]
8611   ""
8612   "@
8613    {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;neg. %0,%0
8614    {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0\;neg. %0,%0"
8615   [(set_attr "type" "compare")
8616    (set_attr "length" "12")])
8617
8618 (define_insn ""
8619   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r")
8620         (plus:SI (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r,r")
8621                          (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P"))
8622                  (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I")))
8623    (clobber (match_scratch:SI 4 "=&r,r,&r,r"))]
8624   ""
8625   "@
8626   {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3
8627   {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3
8628   {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3
8629   {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3"
8630  [(set_attr "length" "12")])
8631
8632 (define_insn ""
8633   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
8634         (compare:CC
8635          (plus:SI (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8636                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8637                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8638          (const_int 0)))
8639    (clobber (match_scratch:SI 4 "=&r,&r"))]
8640   ""
8641   "@
8642    {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %4,%4,%3
8643    {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %4,%4,%3"
8644   [(set_attr "type" "compare")
8645    (set_attr "length" "12")])
8646
8647 (define_insn ""
8648   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
8649         (compare:CC
8650          (plus:SI (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8651                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8652                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8653          (const_int 0)))
8654    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8655         (plus:SI (ltu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8656    (clobber (match_scratch:SI 4 "=&r,&r"))]
8657   ""
8658   "@
8659    {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %0,%4,%3
8660    {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %0,%4,%3"
8661   [(set_attr "type" "compare")
8662    (set_attr "length" "12")])
8663
8664 (define_insn ""
8665   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8666         (neg:SI (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8667                         (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))))]
8668   ""
8669   "@
8670    {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0
8671    {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0"
8672   [(set_attr "length" "8")])
8673
8674 (define_insn ""
8675   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8676         (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8677                (match_operand:SI 2 "reg_or_short_operand" "rI")))
8678    (clobber (match_scratch:SI 3 "=r"))]
8679   "TARGET_POWER"
8680   "doz%I2 %3,%1,%2\;{sfi|subfic} %0,%3,0\;{ae|adde} %0,%0,%3"
8681    [(set_attr "length" "12")])
8682
8683 (define_insn ""
8684   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
8685         (compare:CC
8686          (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8687                 (match_operand:SI 2 "reg_or_short_operand" "rI"))
8688          (const_int 0)))
8689    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8690         (ge:SI (match_dup 1) (match_dup 2)))
8691    (clobber (match_scratch:SI 3 "=r"))]
8692   "TARGET_POWER"
8693   "doz%I2 %3,%1,%2\;{sfi|subfic} %0,%3,0\;{ae.|adde.} %0,%0,%3"
8694   [(set_attr "type" "compare")
8695    (set_attr "length" "12")])
8696
8697 (define_insn ""
8698   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8699         (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8700                         (match_operand:SI 2 "reg_or_short_operand" "rI"))
8701                  (match_operand:SI 3 "gpc_reg_operand" "r")))
8702    (clobber (match_scratch:SI 4 "=&r"))]
8703   "TARGET_POWER"
8704   "doz%I2 %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3"
8705   [(set_attr "length" "12")])
8706
8707 (define_insn ""
8708   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8709         (compare:CC
8710          (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8711                          (match_operand:SI 2 "reg_or_short_operand" "rI"))
8712                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8713          (const_int 0)))
8714    (clobber (match_scratch:SI 4 "=&r"))]
8715   "TARGET_POWER"
8716   "doz%I2 %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %4,%3"
8717   [(set_attr "type" "compare")
8718    (set_attr "length" "12")])
8719
8720 (define_insn ""
8721   [(set (match_operand:CC 5 "cc_reg_operand" "=x")
8722         (compare:CC
8723          (plus:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8724                          (match_operand:SI 2 "reg_or_short_operand" "rI"))
8725                   (match_operand:SI 3 "gpc_reg_operand" "r"))
8726          (const_int 0)))
8727    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8728         (plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8729    (clobber (match_scratch:SI 4 "=&r"))]
8730   "TARGET_POWER"
8731   "doz%I2 %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3"
8732   [(set_attr "type" "compare")
8733    (set_attr "length" "12")])
8734
8735 (define_insn ""
8736   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8737         (neg:SI (ge:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8738                        (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
8739   "TARGET_POWER"
8740   "doz%I2 %0,%1,%2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0"
8741   [(set_attr "length" "12")])
8742
8743 ;; This is (and (neg (ge X (const_int 0))) Y).
8744 (define_insn ""
8745   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8746         (and:SI (neg:SI
8747                  (lshiftrt:SI
8748                   (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
8749                   (const_int 31)))
8750                 (match_operand:SI 2 "gpc_reg_operand" "r")))
8751    (clobber (match_scratch:SI 3 "=&r"))]
8752   ""
8753   "{srai|srawi} %3,%1,31\;andc %0,%2,%3"
8754   [(set_attr "length" "8")])
8755
8756 (define_insn ""
8757   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8758         (compare:CC
8759          (and:SI (neg:SI
8760                   (lshiftrt:SI
8761                    (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
8762                    (const_int 31)))
8763                  (match_operand:SI 2 "gpc_reg_operand" "r"))
8764          (const_int 0)))
8765    (clobber (match_scratch:SI 3 "=&r"))]
8766   ""
8767   "{srai|srawi} %3,%1,31\;andc. %3,%2,%3"
8768   [(set_attr "type" "compare")
8769    (set_attr "length" "8")])
8770
8771 (define_insn ""
8772   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
8773         (compare:CC
8774          (and:SI (neg:SI
8775                   (lshiftrt:SI
8776                    (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
8777                    (const_int 31)))
8778                  (match_operand:SI 2 "gpc_reg_operand" "r"))
8779          (const_int 0)))
8780    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8781         (and:SI (neg:SI (lshiftrt:SI (not:SI (match_dup 1))
8782                                      (const_int 31)))
8783                 (match_dup 2)))
8784    (clobber (match_scratch:SI 3 "=&r"))]
8785   ""
8786   "{srai|srawi} %3,%1,31\;andc. %0,%2,%3"
8787   [(set_attr "type" "compare")
8788    (set_attr "length" "8")])
8789
8790 (define_insn ""
8791   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8792         (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8793                 (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))]
8794   ""
8795   "@
8796    {sf|subfc} %0,%2,%1\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0
8797    {ai|addic} %0,%1,%n2\;{cal %0,0(0)|li %0,0}\;{ae|adde} %0,%0,%0"
8798   [(set_attr "length" "12")])
8799
8800 (define_insn ""
8801   [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
8802         (compare:CC
8803          (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8804                  (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8805          (const_int 0)))
8806    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8807         (geu:SI (match_dup 1) (match_dup 2)))]
8808   ""
8809   "@
8810    {sf|subfc} %0,%2,%1\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0
8811    {ai|addic} %0,%1,%n2\;{cal %0,0(0)|li %0,0}\;{ae.|adde.} %0,%0,%0"
8812   [(set_attr "type" "compare")
8813    (set_attr "length" "12")])
8814
8815 (define_insn ""
8816   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8817         (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8818                          (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8819                  (match_operand:SI 3 "gpc_reg_operand" "r,r")))
8820    (clobber (match_scratch:SI 4 "=&r,&r"))]
8821   ""
8822   "@
8823    {sf|subfc} %4,%2,%1\;{aze|addze} %0,%3
8824    {ai|addic} %4,%1,%n2\;{aze|addze} %0,%3"
8825   [(set_attr "length" "8")])
8826
8827 (define_insn ""
8828   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
8829         (compare:CC
8830          (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8831                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8832                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8833          (const_int 0)))
8834    (clobber (match_scratch:SI 4 "=&r,&r"))]
8835   ""
8836   "@
8837    {sf|subfc} %4,%2,%1\;{aze.|addze.} %4,%3
8838    {ai|addic} %4,%1,%n2\;{aze.|addze.} %4,%3"
8839   [(set_attr "type" "compare")
8840    (set_attr "length" "8")])
8841
8842 (define_insn ""
8843   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
8844         (compare:CC
8845          (plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8846                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
8847                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8848          (const_int 0)))
8849    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8850         (plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
8851    (clobber (match_scratch:SI 4 "=&r,&r"))]
8852   ""
8853   "@
8854    {sf|subfc} %4,%2,%1\;{aze.|addze.} %0,%3
8855    {ai|addic} %4,%1,%n2\;{aze.|addze.} %4,%3"
8856   [(set_attr "type" "compare")
8857    (set_attr "length" "8")])
8858
8859 (define_insn ""
8860   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8861         (neg:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8862                         (match_operand:SI 2 "reg_or_short_operand" "r,I"))))]
8863   ""
8864   "@
8865    {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;nand %0,%0,%0
8866    {sfi|subfic} %0,%1,-1\;{a%I2|add%I2c} %0,%0,%2\;{sfe|subfe} %0,%0,%0"
8867   [(set_attr "length" "12")])
8868
8869 (define_insn ""
8870   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8871         (and:SI (neg:SI
8872                  (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8873                          (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
8874                 (match_operand:SI 3 "gpc_reg_operand" "r,r")))
8875    (clobber (match_scratch:SI 4 "=&r,&r"))]
8876   ""
8877   "@
8878    {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;andc %0,%3,%4
8879    {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;andc %0,%3,%4"
8880   [(set_attr "length" "12")])
8881
8882 (define_insn ""
8883   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
8884         (compare:CC
8885          (and:SI (neg:SI
8886                   (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8887                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
8888                  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8889          (const_int 0)))
8890    (clobber (match_scratch:SI 4 "=&r,&r"))]
8891   ""
8892   "@
8893    {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4
8894    {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;andc. %4,%3,%4"
8895   [(set_attr "type" "compare")
8896    (set_attr "length" "12")])
8897
8898 (define_insn ""
8899   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
8900         (compare:CC
8901          (and:SI (neg:SI
8902                   (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
8903                           (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
8904                  (match_operand:SI 3 "gpc_reg_operand" "r,r"))
8905          (const_int 0)))
8906    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
8907         (and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))
8908    (clobber (match_scratch:SI 4 "=&r,&r"))]
8909   ""
8910   "@
8911    {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;andc. %0,%3,%4
8912    {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;andc. %0,%3,%4"
8913   [(set_attr "type" "compare")
8914    (set_attr "length" "12")])
8915
8916 (define_insn ""
8917   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8918         (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8919                (const_int 0)))]
8920   ""
8921   "{sfi|subfic} %0,%1,0\;{ame|addme} %0,%0\;{sri|srwi} %0,%0,31"
8922   [(set_attr "length" "12")])
8923
8924 (define_insn ""
8925   [(set (match_operand:CC 2 "cc_reg_operand" "=x")
8926         (compare:CC
8927          (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8928                 (const_int 0))
8929          (const_int 0)))
8930    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8931         (gt:SI (match_dup 1) (const_int 0)))]
8932   ""
8933   "{sfi|subfic} %0,%1,0\;{ame|addme} %0,%0\;{sri.|srwi.} %0,%0,31"
8934   [(set_attr "type" "delayed_compare")
8935    (set_attr "length" "12")])
8936
8937 (define_insn ""
8938   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8939         (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8940                (match_operand:SI 2 "reg_or_short_operand" "r")))]
8941   "TARGET_POWER"
8942   "doz %0,%2,%1\;nabs %0,%0\;{sri|srwi} %0,%0,31"
8943   [(set_attr "length" "12")])
8944
8945 (define_insn ""
8946   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
8947         (compare:CC
8948          (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8949                 (match_operand:SI 2 "reg_or_short_operand" "r"))
8950          (const_int 0)))
8951    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8952         (gt:SI (match_dup 1) (match_dup 2)))]
8953   "TARGET_POWER"
8954   "doz %0,%2,%1\;nabs %0,%0\;{sri.|srwi.} %0,%0,31"
8955   [(set_attr "type" "delayed_compare")
8956    (set_attr "length" "12")])
8957
8958 (define_insn ""
8959   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8960         (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8961                         (const_int 0))
8962                  (match_operand:SI 2 "gpc_reg_operand" "r")))
8963    (clobber (match_scratch:SI 3 "=&r"))]
8964   ""
8965   "{a|addc} %3,%1,%1\;{sfe|subfe} %3,%1,%3\;{aze|addze} %0,%2"
8966   [(set_attr "length" "12")])
8967
8968 (define_insn ""
8969   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
8970         (compare:CC
8971          (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8972                          (const_int 0))
8973                   (match_operand:SI 2 "gpc_reg_operand" "r"))
8974          (const_int 0)))
8975    (clobber (match_scratch:SI 3 "=&r"))]
8976   ""
8977   "{a|addc} %3,%1,%1\;{sfe|subfe} %3,%1,%3\;{aze.|addze.} %0,%2"
8978   [(set_attr "type" "compare")
8979    (set_attr "length" "12")])
8980
8981 (define_insn ""
8982   [(set (match_operand:CC 4 "cc_reg_operand" "=x")
8983         (compare:CC
8984          (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8985                          (const_int 0))
8986                   (match_operand:SI 2 "gpc_reg_operand" "r"))
8987          (const_int 0)))
8988    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
8989         (plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2)))
8990    (clobber (match_scratch:SI 3 "=&r"))]
8991   ""
8992   "{a|addc} %3,%1,%1\;{sfe|subfe} %3,%1,%3\;{aze.|addze.} %3,%2"
8993   [(set_attr "type" "compare")
8994    (set_attr "length" "12")])
8995
8996 (define_insn ""
8997   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
8998         (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
8999                         (match_operand:SI 2 "reg_or_short_operand" "r"))
9000                  (match_operand:SI 3 "gpc_reg_operand" "r")))
9001    (clobber (match_scratch:SI 4 "=&r"))]
9002   "TARGET_POWER"
9003   "doz %4,%2,%1\;{ai|addic} %4,%4,-1\;{aze|addze} %0,%3"
9004   [(set_attr "length" "12")])
9005
9006 (define_insn ""
9007   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
9008         (compare:CC
9009          (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9010                          (match_operand:SI 2 "reg_or_short_operand" "r"))
9011                   (match_operand:SI 3 "gpc_reg_operand" "r"))
9012          (const_int 0)))
9013    (clobber (match_scratch:SI 4 "=&r"))]
9014   "TARGET_POWER"
9015   "doz %4,%2,%1\;{ai|addic} %4,%4,-1\;{aze.|addze.} %4,%3"
9016   [(set_attr "type" "compare")
9017    (set_attr "length" "12")])
9018
9019 (define_insn ""
9020   [(set (match_operand:CC 5 "cc_reg_operand" "=x")
9021         (compare:CC
9022          (plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9023                          (match_operand:SI 2 "reg_or_short_operand" "r"))
9024                   (match_operand:SI 3 "gpc_reg_operand" "r"))
9025          (const_int 0)))
9026    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
9027         (plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
9028    (clobber (match_scratch:SI 4 "=&r"))]
9029   "TARGET_POWER"
9030   "doz %4,%2,%1\;{ai|addic} %4,%4,-1\;{aze.|addze.} %0,%3"
9031   [(set_attr "type" "compare")
9032    (set_attr "length" "12")])
9033
9034 (define_insn ""
9035   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9036         (neg:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9037                        (const_int 0))))]
9038   ""
9039   "{sfi|subfic} %0,%1,0\;{ame|addme} %0,%0\;{srai|srawi} %0,%0,31"
9040   [(set_attr "length" "12")])
9041
9042 (define_insn ""
9043   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9044         (neg:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9045                        (match_operand:SI 2 "reg_or_short_operand" "r"))))]
9046   "TARGET_POWER"
9047   "doz %0,%2,%1\;nabs %0,%0\;{srai|srawi} %0,%0,31"
9048   [(set_attr "length" "12")])
9049
9050 (define_insn ""
9051   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9052         (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9053                 (match_operand:SI 2 "reg_or_short_operand" "rI")))]
9054   ""
9055   "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;neg %0,%0"
9056   [(set_attr "length" "12")])
9057
9058 (define_insn ""
9059   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
9060         (compare:CC
9061          (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9062                  (match_operand:SI 2 "reg_or_short_operand" "rI"))
9063          (const_int 0)))
9064    (set (match_operand:SI 0 "gpc_reg_operand" "=r")
9065         (gtu:SI (match_dup 1) (match_dup 2)))]
9066   ""
9067   "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;neg. %0,%0"
9068   [(set_attr "type" "compare")
9069    (set_attr "length" "12")])
9070
9071 (define_insn ""
9072   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
9073         (plus:SI (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r,r")
9074                          (match_operand:SI 2 "reg_or_short_operand" "I,r,rI"))
9075                  (match_operand:SI 3 "reg_or_short_operand" "r,r,I")))
9076    (clobber (match_scratch:SI 4 "=&r,&r,&r"))]
9077   ""
9078   "@
9079    {ai|addic} %4,%1,%k2\;{aze|addze} %0,%3
9080    {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3
9081    {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3"
9082   [(set_attr "length" "8,12,12")])
9083
9084 (define_insn ""
9085   [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
9086         (compare:CC
9087          (plus:SI (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
9088                           (match_operand:SI 2 "reg_or_short_operand" "I,r"))
9089                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
9090          (const_int 0)))
9091    (clobber (match_scratch:SI 4 "=&r,&r"))]
9092   ""
9093   "@
9094    {ai|addic} %4,%1,%k2\;{aze.|addze.} %0,%3
9095    {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %0,%4,%3"
9096   [(set_attr "type" "compare")
9097    (set_attr "length" "8,12")])
9098
9099 (define_insn ""
9100   [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
9101         (compare:CC
9102          (plus:SI (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
9103                           (match_operand:SI 2 "reg_or_short_operand" "I,r"))
9104                   (match_operand:SI 3 "gpc_reg_operand" "r,r"))
9105          (const_int 0)))
9106    (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
9107         (plus:SI (gtu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
9108    (clobber (match_scratch:SI 4 "=&r,&r"))]
9109   ""
9110   "@
9111    {ai|addic} %4,%1,%k2\;{aze.|addze.} %0,%3
9112    {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;{sf.|subfc.} %0,%4,%3"
9113   [(set_attr "type" "compare")
9114    (set_attr "length" "8,12")])
9115
9116 (define_insn ""
9117   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
9118         (neg:SI (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
9119                         (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
9120   ""
9121   "{sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0"
9122   [(set_attr "length" "8")])
9123 \f
9124 ;; Define both directions of branch and return.  If we need a reload
9125 ;; register, we'd rather use CR0 since it is much easier to copy a
9126 ;; register CC value to there.
9127
9128 (define_insn ""
9129   [(set (pc)
9130         (if_then_else (match_operator 1 "branch_comparison_operator"
9131                                       [(match_operand 2
9132                                                       "cc_reg_operand" "x,?y")
9133                                        (const_int 0)])
9134                       (label_ref (match_operand 0 "" ""))
9135                       (pc)))]
9136   ""
9137   "*
9138 {
9139   if (get_attr_length (insn) == 8)
9140     return \"%C1bc %t1,%j1,%l0\";
9141   else
9142     return \"%C1bc %T1,%j1,%$+8\;b %l0\";
9143
9144 }"
9145   [(set_attr "type" "branch")])
9146
9147 (define_insn ""
9148   [(set (pc)
9149         (if_then_else (match_operator 0 "branch_comparison_operator"
9150                                       [(match_operand 1
9151                                                       "cc_reg_operand" "x,?y")
9152                                        (const_int 0)])
9153                       (return)
9154                       (pc)))]
9155   "direct_return ()"
9156   "{%C0bcr|%C0bclr} %t0,%j0"
9157   [(set_attr "type" "branch")
9158    (set_attr "length" "8")])
9159
9160 (define_insn ""
9161   [(set (pc)
9162         (if_then_else (match_operator 1 "branch_comparison_operator"
9163                                       [(match_operand 2
9164                                                       "cc_reg_operand" "x,?y")
9165                                        (const_int 0)])
9166                       (pc)
9167                       (label_ref (match_operand 0 "" ""))))]
9168   ""
9169   "*
9170 {
9171   if (get_attr_length (insn) == 8)
9172     return \"%C1bc %T1,%j1,%l0\";
9173   else
9174     return \"%C1bc %t1,%j1,%$+8\;b %l0\";
9175 }"
9176   [(set_attr "type" "branch")])
9177
9178 (define_insn ""
9179   [(set (pc)
9180         (if_then_else (match_operator 0 "branch_comparison_operator"
9181                                       [(match_operand 1
9182                                                       "cc_reg_operand" "x,?y")
9183                                        (const_int 0)])
9184                       (pc)
9185                       (return)))]
9186   "direct_return ()"
9187   "{%C0bcr|%C0bclr} %T0,%j0"
9188   [(set_attr "type" "branch")
9189    (set_attr "length" "8")])
9190
9191 ;; Unconditional branch and return.
9192
9193 (define_insn "jump"
9194   [(set (pc)
9195         (label_ref (match_operand 0 "" "")))]
9196   ""
9197   "b %l0"
9198   [(set_attr "type" "branch")])
9199
9200 (define_insn "return"
9201   [(return)]
9202   "direct_return ()"
9203   "{br|blr}"
9204   [(set_attr "type" "jmpreg")])
9205
9206 (define_insn "indirect_jump"
9207   [(set (pc) (match_operand:SI 0 "register_operand" "c,l"))]
9208   ""
9209   "@
9210    bctr
9211    {br|blr}"
9212   [(set_attr "type" "jmpreg")])
9213
9214 (define_insn ""
9215   [(set (pc) (match_operand:DI 0 "register_operand" "c,l"))]
9216   "TARGET_POWERPC64"
9217   "@
9218    bctr
9219    {br|blr}"
9220   [(set_attr "type" "jmpreg")])
9221
9222 ;; Table jump for switch statements:
9223 (define_expand "tablejump"
9224   [(use (match_operand 0 "" ""))
9225    (use (label_ref (match_operand 1 "" "")))]
9226   ""
9227   "
9228 {
9229   if (TARGET_32BIT)
9230     emit_jump_insn (gen_tablejumpsi (operands[0], operands[1]));
9231   else
9232     emit_jump_insn (gen_tablejumpdi (operands[0], operands[1]));
9233   DONE;
9234 }")
9235
9236 (define_expand "tablejumpsi"
9237   [(set (match_dup 3)
9238         (plus:SI (match_operand:SI 0 "" "")
9239                  (match_dup 2)))
9240    (parallel [(set (pc) (match_dup 3))
9241               (use (label_ref (match_operand 1 "" "")))])]
9242   ""
9243   "
9244 { operands[0] = force_reg (SImode, operands[0]);
9245   operands[2] = force_reg (SImode, gen_rtx (LABEL_REF, VOIDmode, operands[1]));
9246   operands[3] = gen_reg_rtx (SImode);
9247 }")
9248
9249 (define_expand "tablejumpdi"
9250   [(set (match_dup 3)
9251         (plus:DI (match_operand:DI 0 "" "")
9252                  (match_dup 2)))
9253    (parallel [(set (pc) (match_dup 3))
9254               (use (label_ref (match_operand 1 "" "")))])]
9255   ""
9256   "
9257 { operands[0] = force_reg (DImode, operands[0]);
9258   operands[2] = force_reg (DImode, gen_rtx (LABEL_REF, VOIDmode, operands[1]));
9259   operands[3] = gen_reg_rtx (DImode);
9260 }")
9261
9262 (define_insn ""
9263   [(set (pc)
9264         (match_operand:SI 0 "register_operand" "c,l"))
9265    (use (label_ref (match_operand 1 "" "")))]
9266   ""
9267   "@
9268    bctr
9269    {br|blr}"
9270   [(set_attr "type" "jmpreg")])
9271
9272 (define_insn ""
9273   [(set (pc)
9274         (match_operand:DI 0 "register_operand" "c,l"))
9275    (use (label_ref (match_operand 1 "" "")))]
9276   "TARGET_POWERPC64"
9277   "@
9278    bctr
9279    {br|blr}"
9280   [(set_attr "type" "jmpreg")])
9281
9282 (define_insn "nop"
9283   [(const_int 0)]
9284   ""
9285   "{cror 0,0,0|nop}")
9286 \f
9287 ;; Define the subtract-one-and-jump insns, starting with the template
9288 ;; so loop.c knows what to generate.
9289
9290 (define_expand "decrement_and_branch_on_count"
9291   [(parallel [(set (pc) (if_then_else (ne (match_operand:SI 0 "register_operand" "")
9292                                           (const_int 1))
9293                                       (label_ref (match_operand 1 "" ""))
9294                                       (pc)))
9295               (set (match_dup 0)
9296                    (plus:SI (match_dup 0)
9297                             (const_int -1)))
9298               (clobber (match_scratch:CC 2 ""))
9299               (clobber (match_scratch:SI 3 ""))])]
9300   ""
9301   "")
9302
9303 ;; We need to be able to do this for any operand, including MEM, or we
9304 ;; will cause reload to blow up since we don't allow output reloads on
9305 ;; JUMP_INSNs.
9306 ;; In order that the length attribute is calculated correctly, the
9307 ;; label MUST be operand 0.
9308
9309 (define_insn ""
9310   [(set (pc)
9311         (if_then_else (ne (match_operand:SI 1 "register_operand" "c,*r,*r")
9312                           (const_int 1))
9313                       (label_ref (match_operand 0 "" ""))
9314                       (pc)))
9315    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9316         (plus:SI (match_dup 1)
9317                  (const_int -1)))
9318    (clobber (match_scratch:CC 3 "=X,&x,&x"))
9319    (clobber (match_scratch:SI 4 "=X,X,r"))]
9320   ""
9321   "*
9322 {
9323   if (which_alternative != 0)
9324     return \"#\";
9325   else if (get_attr_length (insn) == 8)
9326     return \"{bdn|bdnz} %l0\";
9327   else
9328     return \"bdz %$+8\;b %l0\";
9329 }"
9330   [(set_attr "type" "branch")
9331    (set_attr "length" "*,12,16")])
9332
9333 (define_insn ""
9334   [(set (pc)
9335         (if_then_else (ne (match_operand:SI 1 "register_operand" "c,*r,*r")
9336                           (const_int 1))
9337                       (pc)
9338                       (label_ref (match_operand 0 "" ""))))
9339    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9340         (plus:SI (match_dup 1)
9341                  (const_int -1)))
9342    (clobber (match_scratch:CC 3 "=X,&x,&x"))
9343    (clobber (match_scratch:SI 4 "=X,X,r"))]
9344   ""
9345   "*
9346 {
9347   if (which_alternative != 0)
9348     return \"#\";
9349   else if (get_attr_length (insn) == 8)
9350     return \"bdz %l0\";
9351   else
9352     return \"{bdn|bdnz} %$+8\;b %l0\";
9353 }"
9354   [(set_attr "type" "branch")
9355    (set_attr "length" "*,12,16")])
9356
9357 ;; Similar, but we can use GE since we have a REG_NONNEG.
9358 (define_insn ""
9359   [(set (pc)
9360         (if_then_else (ge (match_operand:SI 1 "register_operand" "c,*r,*r")
9361                           (const_int 0))
9362                       (label_ref (match_operand 0 "" ""))
9363                       (pc)))
9364    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9365         (plus:SI (match_dup 1)
9366                  (const_int -1)))
9367    (clobber (match_scratch:CC 3 "=X,&x,&X"))
9368    (clobber (match_scratch:SI 4 "=X,X,r"))]
9369   "find_reg_note (insn, REG_NONNEG, 0)"
9370   "*
9371 {
9372   if (which_alternative != 0)
9373     return \"#\";
9374   else if (get_attr_length (insn) == 8)
9375     return \"{bdn|bdnz} %l0\";
9376   else
9377     return \"bdz %$+8\;b %l0\";
9378 }"
9379   [(set_attr "type" "branch")
9380    (set_attr "length" "*,12,16")])
9381
9382 (define_insn ""
9383   [(set (pc)
9384         (if_then_else (ge (match_operand:SI 1 "register_operand" "c,*r,*r")
9385                           (const_int 0))
9386                       (pc)
9387                       (label_ref (match_operand 0 "" ""))))
9388    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9389         (plus:SI (match_dup 1)
9390                  (const_int -1)))
9391    (clobber (match_scratch:CC 3 "=X,&x,&X"))
9392    (clobber (match_scratch:SI 4 "=X,X,r"))]
9393   "find_reg_note (insn, REG_NONNEG, 0)"
9394   "*
9395 {
9396   if (which_alternative != 0)
9397     return \"#\";
9398   else if (get_attr_length (insn) == 8)
9399     return \"bdz %l0\";
9400   else
9401     return \"{bdn|bdnz} %$+8\;b %l0\";
9402 }"
9403   [(set_attr "type" "branch")
9404    (set_attr "length" "*,12,16")])
9405
9406 (define_insn ""
9407   [(set (pc)
9408         (if_then_else (eq (match_operand:SI 1 "register_operand" "c,*r,*r")
9409                           (const_int 1))
9410                       (label_ref (match_operand 0 "" ""))
9411                       (pc)))
9412    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9413         (plus:SI (match_dup 1)
9414                  (const_int -1)))
9415    (clobber (match_scratch:CC 3 "=X,&x,&x"))
9416    (clobber (match_scratch:SI 4 "=X,X,r"))]
9417   ""
9418   "*
9419 {
9420   if (which_alternative != 0)
9421     return \"#\";
9422   else if (get_attr_length (insn) == 8)
9423     return \"bdz %l0\";
9424   else
9425     return \"{bdn|bdnz} %$+8\;b %l0\";
9426 }"
9427   [(set_attr "type" "branch")
9428    (set_attr "length" "*,12,16")])
9429
9430 (define_insn ""
9431   [(set (pc)
9432         (if_then_else (eq (match_operand:SI 1 "register_operand" "c,*r,*r")
9433                           (const_int 1))
9434                       (pc)
9435                       (label_ref (match_operand 0 "" ""))))
9436    (set (match_operand:SI 2 "register_operand" "=1,*r,m*q*c*l")
9437         (plus:SI (match_dup 1)
9438                  (const_int -1)))
9439    (clobber (match_scratch:CC 3 "=X,&x,&x"))
9440    (clobber (match_scratch:SI 4 "=X,X,r"))]
9441   ""
9442   "*
9443 {
9444   if (which_alternative != 0)
9445     return \"#\";
9446   else if (get_attr_length (insn) == 8)
9447     return \"{bdn|bdnz} %l0\";
9448   else
9449     return \"bdz %$+8\;b %l0\";
9450 }"
9451   [(set_attr "type" "branch")
9452    (set_attr "length" "*,12,16")])
9453
9454 (define_split
9455   [(set (pc)
9456         (if_then_else (match_operator 2 "comparison_operator"
9457                                       [(match_operand:SI 1 "gpc_reg_operand" "")
9458                                        (const_int 1)])
9459                       (match_operand 5 "" "")
9460                       (match_operand 6 "" "")))
9461    (set (match_operand:SI 0 "gpc_reg_operand" "")
9462         (plus:SI (match_dup 1)
9463                  (const_int -1)))
9464    (clobber (match_scratch:CC 3 ""))
9465    (clobber (match_scratch:SI 4 ""))]
9466   "reload_completed"
9467   [(parallel [(set (match_dup 3)
9468                    (compare:CC (plus:SI (match_dup 1)
9469                                         (const_int -1))
9470                                (const_int 0)))
9471               (set (match_dup 0)
9472                    (plus:SI (match_dup 1)
9473                             (const_int -1)))])
9474    (set (pc) (if_then_else (match_dup 7)
9475                            (match_dup 5)
9476                            (match_dup 6)))]
9477   "
9478 { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
9479                          const0_rtx); }")
9480
9481 (define_split
9482   [(set (pc)
9483         (if_then_else (match_operator 2 "comparison_operator"
9484                                       [(match_operand:SI 1 "gpc_reg_operand" "")
9485                                        (const_int 1)])
9486                       (match_operand 5 "" "")
9487                       (match_operand 6 "" "")))
9488    (set (match_operand:SI 0 "general_operand" "")
9489         (plus:SI (match_dup 1) (const_int -1)))
9490    (clobber (match_scratch:CC 3 ""))
9491    (clobber (match_scratch:SI 4 ""))]
9492   "reload_completed && ! gpc_reg_operand (operands[0], SImode)"
9493   [(parallel [(set (match_dup 3)
9494                    (compare:CC (plus:SI (match_dup 1)
9495                                         (const_int -1))
9496                                (const_int 0)))
9497               (set (match_dup 4)
9498                    (plus:SI (match_dup 1)
9499                             (const_int -1)))])
9500    (set (match_dup 0)
9501         (match_dup 4))
9502    (set (pc) (if_then_else (match_dup 7)
9503                            (match_dup 5)
9504                            (match_dup 6)))]
9505   "
9506 { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
9507                          const0_rtx); }")