pa.md (negdf2, negsf2): Use multiplication rather than subtraction to implement float...
[gcc.git] / gcc / config / pa / pa.md
1 ;;- Machine description for HP PA-RISC architecture for GNU C compiler
2 ;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 ;; Free Software Foundation, Inc.
4 ;; Contributed by the Center for Software Science at the University
5 ;; of Utah.
6
7 ;; This file is part of GNU CC.
8
9 ;; GNU CC is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
12 ;; any later version.
13
14 ;; GNU CC is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU CC; see the file COPYING. If not, write to
21 ;; the Free Software Foundation, 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
23
24 ;; This gcc Version 2 machine description is inspired by sparc.md and
25 ;; mips.md.
26
27 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
28
29 ;; Insn type. Used to default other attribute values.
30
31 ;; type "unary" insns have one input operand (1) and one output operand (0)
32 ;; type "binary" insns have two input operands (1,2) and one output (0)
33
34 (define_attr "type"
35 "move,unary,binary,shift,nullshift,compare,load,store,uncond_branch,branch,cbranch,fbranch,call,dyncall,fpload,fpstore,fpalu,fpcc,fpmulsgl,fpmuldbl,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,multi,milli,parallel_branch"
36 (const_string "binary"))
37
38 (define_attr "pa_combine_type"
39 "fmpy,faddsub,uncond_branch,addmove,none"
40 (const_string "none"))
41
42 ;; Processor type (for scheduling, not code generation) -- this attribute
43 ;; must exactly match the processor_type enumeration in pa.h.
44 ;;
45 ;; FIXME: Add 800 scheduling for completeness?
46
47 (define_attr "cpu" "700,7100,7100LC,7200,8000" (const (symbol_ref "pa_cpu_attr")))
48
49 ;; Length (in # of bytes).
50 (define_attr "length" ""
51 (cond [(eq_attr "type" "load,fpload")
52 (if_then_else (match_operand 1 "symbolic_memory_operand" "")
53 (const_int 8) (const_int 4))
54
55 (eq_attr "type" "store,fpstore")
56 (if_then_else (match_operand 0 "symbolic_memory_operand" "")
57 (const_int 8) (const_int 4))
58
59 (eq_attr "type" "binary,shift,nullshift")
60 (if_then_else (match_operand 2 "arith_operand" "")
61 (const_int 4) (const_int 12))
62
63 (eq_attr "type" "move,unary,shift,nullshift")
64 (if_then_else (match_operand 1 "arith_operand" "")
65 (const_int 4) (const_int 8))]
66
67 (const_int 4)))
68
69 (define_asm_attributes
70 [(set_attr "length" "4")
71 (set_attr "type" "multi")])
72
73 ;; Attributes for instruction and branch scheduling
74
75 ;; For conditional branches.
76 (define_attr "in_branch_delay" "false,true"
77 (if_then_else (and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli,parallel_branch")
78 (eq_attr "length" "4"))
79 (const_string "true")
80 (const_string "false")))
81
82 ;; Disallow instructions which use the FPU since they will tie up the FPU
83 ;; even if the instruction is nullified.
84 (define_attr "in_nullified_branch_delay" "false,true"
85 (if_then_else (and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli,fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,parallel_branch")
86 (eq_attr "length" "4"))
87 (const_string "true")
88 (const_string "false")))
89
90 ;; For calls and millicode calls. Allow unconditional branches in the
91 ;; delay slot.
92 (define_attr "in_call_delay" "false,true"
93 (cond [(and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli,parallel_branch")
94 (eq_attr "length" "4"))
95 (const_string "true")
96 (eq_attr "type" "uncond_branch")
97 (if_then_else (ne (symbol_ref "TARGET_JUMP_IN_DELAY")
98 (const_int 0))
99 (const_string "true")
100 (const_string "false"))]
101 (const_string "false")))
102
103
104 ;; Call delay slot description.
105 (define_delay (eq_attr "type" "call")
106 [(eq_attr "in_call_delay" "true") (nil) (nil)])
107
108 ;; millicode call delay slot description. Note it disallows delay slot
109 ;; when TARGET_PORTABLE_RUNTIME is true.
110 (define_delay (eq_attr "type" "milli")
111 [(and (eq_attr "in_call_delay" "true")
112 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME") (const_int 0)))
113 (nil) (nil)])
114
115 ;; Return and other similar instructions.
116 (define_delay (eq_attr "type" "branch,parallel_branch")
117 [(eq_attr "in_branch_delay" "true") (nil) (nil)])
118
119 ;; Floating point conditional branch delay slot description and
120 (define_delay (eq_attr "type" "fbranch")
121 [(eq_attr "in_branch_delay" "true")
122 (eq_attr "in_nullified_branch_delay" "true")
123 (nil)])
124
125 ;; Integer conditional branch delay slot description.
126 ;; Nullification of conditional branches on the PA is dependent on the
127 ;; direction of the branch. Forward branches nullify true and
128 ;; backward branches nullify false. If the direction is unknown
129 ;; then nullification is not allowed.
130 (define_delay (eq_attr "type" "cbranch")
131 [(eq_attr "in_branch_delay" "true")
132 (and (eq_attr "in_nullified_branch_delay" "true")
133 (attr_flag "forward"))
134 (and (eq_attr "in_nullified_branch_delay" "true")
135 (attr_flag "backward"))])
136
137 (define_delay (and (eq_attr "type" "uncond_branch")
138 (eq (symbol_ref "following_call (insn)")
139 (const_int 0)))
140 [(eq_attr "in_branch_delay" "true") (nil) (nil)])
141
142 ;; Function units of the HPPA. The following data is for the 700 CPUs
143 ;; (Mustang CPU + Timex FPU aka PA-89) because that's what I have the docs for.
144 ;; Scheduling instructions for PA-83 machines according to the Snake
145 ;; constraints shouldn't hurt.
146
147 ;; (define_function_unit {name} {num-units} {n-users} {test}
148 ;; {ready-delay} {issue-delay} [{conflict-list}])
149
150 ;; The integer ALU.
151 ;; (Noted only for documentation; units that take one cycle do not need to
152 ;; be specified.)
153
154 ;; (define_function_unit "alu" 1 0
155 ;; (and (eq_attr "type" "unary,shift,nullshift,binary,move,address")
156 ;; (eq_attr "cpu" "700"))
157 ;; 1 0)
158
159
160 ;; Memory. Disregarding Cache misses, the Mustang memory times are:
161 ;; load: 2, fpload: 3
162 ;; store, fpstore: 3, no D-cache operations should be scheduled.
163
164 (define_function_unit "pa700memory" 1 0
165 (and (eq_attr "type" "load,fpload")
166 (eq_attr "cpu" "700")) 2 0)
167 (define_function_unit "pa700memory" 1 0
168 (and (eq_attr "type" "store,fpstore")
169 (eq_attr "cpu" "700")) 3 3)
170
171 ;; The Timex (aka 700) has two floating-point units: ALU, and MUL/DIV/SQRT.
172 ;; Timings:
173 ;; Instruction Time Unit Minimum Distance (unit contention)
174 ;; fcpy 3 ALU 2
175 ;; fabs 3 ALU 2
176 ;; fadd 3 ALU 2
177 ;; fsub 3 ALU 2
178 ;; fcmp 3 ALU 2
179 ;; fcnv 3 ALU 2
180 ;; fmpyadd 3 ALU,MPY 2
181 ;; fmpysub 3 ALU,MPY 2
182 ;; fmpycfxt 3 ALU,MPY 2
183 ;; fmpy 3 MPY 2
184 ;; fmpyi 3 MPY 2
185 ;; fdiv,sgl 10 MPY 10
186 ;; fdiv,dbl 12 MPY 12
187 ;; fsqrt,sgl 14 MPY 14
188 ;; fsqrt,dbl 18 MPY 18
189
190 (define_function_unit "pa700fp_alu" 1 0
191 (and (eq_attr "type" "fpcc")
192 (eq_attr "cpu" "700")) 4 2)
193 (define_function_unit "pa700fp_alu" 1 0
194 (and (eq_attr "type" "fpalu")
195 (eq_attr "cpu" "700")) 3 2)
196 (define_function_unit "pa700fp_mpy" 1 0
197 (and (eq_attr "type" "fpmulsgl,fpmuldbl")
198 (eq_attr "cpu" "700")) 3 2)
199 (define_function_unit "pa700fp_mpy" 1 0
200 (and (eq_attr "type" "fpdivsgl")
201 (eq_attr "cpu" "700")) 10 10)
202 (define_function_unit "pa700fp_mpy" 1 0
203 (and (eq_attr "type" "fpdivdbl")
204 (eq_attr "cpu" "700")) 12 12)
205 (define_function_unit "pa700fp_mpy" 1 0
206 (and (eq_attr "type" "fpsqrtsgl")
207 (eq_attr "cpu" "700")) 14 14)
208 (define_function_unit "pa700fp_mpy" 1 0
209 (and (eq_attr "type" "fpsqrtdbl")
210 (eq_attr "cpu" "700")) 18 18)
211
212 ;; Function units for the 7100 and 7150. The 7100/7150 can dual-issue
213 ;; floating point computations with non-floating point computations (fp loads
214 ;; and stores are not fp computations).
215 ;;
216
217 ;; Memory. Disregarding Cache misses, memory loads take two cycles; stores also
218 ;; take two cycles, during which no Dcache operations should be scheduled.
219 ;; Any special cases are handled in pa_adjust_cost. The 7100, 7150 and 7100LC
220 ;; all have the same memory characteristics if one disregards cache misses.
221 (define_function_unit "pa7100memory" 1 0
222 (and (eq_attr "type" "load,fpload")
223 (eq_attr "cpu" "7100,7100LC")) 2 0)
224 (define_function_unit "pa7100memory" 1 0
225 (and (eq_attr "type" "store,fpstore")
226 (eq_attr "cpu" "7100,7100LC")) 2 2)
227
228 ;; The 7100/7150 has three floating-point units: ALU, MUL, and DIV.
229 ;; Timings:
230 ;; Instruction Time Unit Minimum Distance (unit contention)
231 ;; fcpy 2 ALU 1
232 ;; fabs 2 ALU 1
233 ;; fadd 2 ALU 1
234 ;; fsub 2 ALU 1
235 ;; fcmp 2 ALU 1
236 ;; fcnv 2 ALU 1
237 ;; fmpyadd 2 ALU,MPY 1
238 ;; fmpysub 2 ALU,MPY 1
239 ;; fmpycfxt 2 ALU,MPY 1
240 ;; fmpy 2 MPY 1
241 ;; fmpyi 2 MPY 1
242 ;; fdiv,sgl 8 DIV 8
243 ;; fdiv,dbl 15 DIV 15
244 ;; fsqrt,sgl 8 DIV 8
245 ;; fsqrt,dbl 15 DIV 15
246
247 (define_function_unit "pa7100fp_alu" 1 0
248 (and (eq_attr "type" "fpcc,fpalu")
249 (eq_attr "cpu" "7100")) 2 1)
250 (define_function_unit "pa7100fp_mpy" 1 0
251 (and (eq_attr "type" "fpmulsgl,fpmuldbl")
252 (eq_attr "cpu" "7100")) 2 1)
253 (define_function_unit "pa7100fp_div" 1 0
254 (and (eq_attr "type" "fpdivsgl,fpsqrtsgl")
255 (eq_attr "cpu" "7100")) 8 8)
256 (define_function_unit "pa7100fp_div" 1 0
257 (and (eq_attr "type" "fpdivdbl,fpsqrtdbl")
258 (eq_attr "cpu" "7100")) 15 15)
259
260 ;; To encourage dual issue we define function units corresponding to
261 ;; the instructions which can be dual issued. This is a rather crude
262 ;; approximation, the "pa7100nonflop" test in particular could be refined.
263 (define_function_unit "pa7100flop" 1 1
264 (and
265 (eq_attr "type" "fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
266 (eq_attr "cpu" "7100")) 1 1)
267
268 (define_function_unit "pa7100nonflop" 1 1
269 (and
270 (eq_attr "type" "!fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
271 (eq_attr "cpu" "7100")) 1 1)
272
273
274 ;; Memory subsystem works just like 7100/7150 (except for cache miss times which
275 ;; we don't model here).
276
277 ;; The 7100LC has three floating-point units: ALU, MUL, and DIV.
278 ;; Note divides and sqrt flops lock the cpu until the flop is
279 ;; finished. fmpy and xmpyu (fmpyi) lock the cpu for one cycle.
280 ;; There's no way to avoid the penalty.
281 ;; Timings:
282 ;; Instruction Time Unit Minimum Distance (unit contention)
283 ;; fcpy 2 ALU 1
284 ;; fabs 2 ALU 1
285 ;; fadd 2 ALU 1
286 ;; fsub 2 ALU 1
287 ;; fcmp 2 ALU 1
288 ;; fcnv 2 ALU 1
289 ;; fmpyadd,sgl 2 ALU,MPY 1
290 ;; fmpyadd,dbl 3 ALU,MPY 2
291 ;; fmpysub,sgl 2 ALU,MPY 1
292 ;; fmpysub,dbl 3 ALU,MPY 2
293 ;; fmpycfxt,sgl 2 ALU,MPY 1
294 ;; fmpycfxt,dbl 3 ALU,MPY 2
295 ;; fmpy,sgl 2 MPY 1
296 ;; fmpy,dbl 3 MPY 2
297 ;; fmpyi 3 MPY 2
298 ;; fdiv,sgl 8 DIV 8
299 ;; fdiv,dbl 15 DIV 15
300 ;; fsqrt,sgl 8 DIV 8
301 ;; fsqrt,dbl 15 DIV 15
302
303 (define_function_unit "pa7100LCfp_alu" 1 0
304 (and (eq_attr "type" "fpcc,fpalu")
305 (eq_attr "cpu" "7100LC,7200")) 2 1)
306 (define_function_unit "pa7100LCfp_mpy" 1 0
307 (and (eq_attr "type" "fpmulsgl")
308 (eq_attr "cpu" "7100LC,7200")) 2 1)
309 (define_function_unit "pa7100LCfp_mpy" 1 0
310 (and (eq_attr "type" "fpmuldbl")
311 (eq_attr "cpu" "7100LC,7200")) 3 2)
312 (define_function_unit "pa7100LCfp_div" 1 0
313 (and (eq_attr "type" "fpdivsgl,fpsqrtsgl")
314 (eq_attr "cpu" "7100LC,7200")) 8 8)
315 (define_function_unit "pa7100LCfp_div" 1 0
316 (and (eq_attr "type" "fpdivdbl,fpsqrtdbl")
317 (eq_attr "cpu" "7100LC,7200")) 15 15)
318
319 ;; Define the various functional units for dual-issue.
320
321 ;; There's only one floating point unit.
322 (define_function_unit "pa7100LCflop" 1 1
323 (and
324 (eq_attr "type" "fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
325 (eq_attr "cpu" "7100LC,7200")) 1 1)
326
327 ;; Shifts and memory ops execute in only one of the integer ALUs
328 (define_function_unit "pa7100LCshiftmem" 1 1
329 (and
330 (eq_attr "type" "shift,nullshift,load,fpload,store,fpstore")
331 (eq_attr "cpu" "7100LC,7200")) 1 1)
332
333 ;; We have two basic ALUs.
334 (define_function_unit "pa7100LCalu" 2 1
335 (and
336 (eq_attr "type" "!fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
337 (eq_attr "cpu" "7100LC,7200")) 1 1)
338
339 ;; I don't have complete information on the PA7200; however, most of
340 ;; what I've heard makes it look like a 7100LC without the store-store
341 ;; penalty. So that's how we'll model it.
342
343 ;; Memory. Disregarding Cache misses, memory loads and stores take
344 ;; two cycles. Any special cases are handled in pa_adjust_cost.
345 (define_function_unit "pa7200memory" 1 0
346 (and (eq_attr "type" "load,fpload,store,fpstore")
347 (eq_attr "cpu" "7200")) 2 0)
348
349 ;; I don't have detailed information on the PA7200 FP pipeline, so I
350 ;; treat it just like the 7100LC pipeline.
351 ;; Similarly for the multi-issue fake units.
352
353 ;;
354 ;; Scheduling for the PA8000 is somewhat different than scheduling for a
355 ;; traditional architecture.
356 ;;
357 ;; The PA8000 has a large (56) entry reorder buffer that is split between
358 ;; memory and non-memory operations.
359 ;;
360 ;; The PA800 can issue two memory and two non-memory operations per cycle to
361 ;; the function units. Similarly, the PA8000 can retire two memory and two
362 ;; non-memory operations per cycle.
363 ;;
364 ;; Given the large reorder buffer, the processor can hide most latencies.
365 ;; According to HP, they've got the best results by scheduling for retirement
366 ;; bandwidth with limited latency scheduling for floating point operations.
367 ;; Latency for integer operations and memory references is ignored.
368 ;;
369 ;; We claim floating point operations have a 2 cycle latency and are
370 ;; fully pipelined, except for div and sqrt which are not pipelined.
371 ;;
372 ;; It is not necessary to define the shifter and integer alu units.
373 ;;
374 ;; These first two define_unit_unit descriptions model retirement from
375 ;; the reorder buffer.
376 (define_function_unit "pa8000lsu" 2 1
377 (and
378 (eq_attr "type" "load,fpload,store,fpstore")
379 (eq_attr "cpu" "8000")) 1 1)
380
381 (define_function_unit "pa8000alu" 2 1
382 (and
383 (eq_attr "type" "!load,fpload,store,fpstore")
384 (eq_attr "cpu" "8000")) 1 1)
385
386 ;; Claim floating point ops have a 2 cycle latency, excluding div and
387 ;; sqrt, which are not pipelined and issue to different units.
388 (define_function_unit "pa8000fmac" 2 0
389 (and
390 (eq_attr "type" "fpcc,fpalu,fpmulsgl,fpmuldbl")
391 (eq_attr "cpu" "8000")) 2 1)
392
393 (define_function_unit "pa8000fdiv" 2 1
394 (and
395 (eq_attr "type" "fpdivsgl,fpsqrtsgl")
396 (eq_attr "cpu" "8000")) 17 17)
397
398 (define_function_unit "pa8000fdiv" 2 1
399 (and
400 (eq_attr "type" "fpdivdbl,fpsqrtdbl")
401 (eq_attr "cpu" "8000")) 31 31)
402
403 \f
404 ;; Compare instructions.
405 ;; This controls RTL generation and register allocation.
406
407 ;; We generate RTL for comparisons and branches by having the cmpxx
408 ;; patterns store away the operands. Then, the scc and bcc patterns
409 ;; emit RTL for both the compare and the branch.
410 ;;
411
412 (define_expand "cmpdi"
413 [(set (reg:CC 0)
414 (compare:CC (match_operand:DI 0 "reg_or_0_operand" "")
415 (match_operand:DI 1 "register_operand" "")))]
416 "TARGET_64BIT"
417
418 "
419 {
420 hppa_compare_op0 = operands[0];
421 hppa_compare_op1 = operands[1];
422 hppa_branch_type = CMP_SI;
423 DONE;
424 }")
425
426 (define_expand "cmpsi"
427 [(set (reg:CC 0)
428 (compare:CC (match_operand:SI 0 "reg_or_0_operand" "")
429 (match_operand:SI 1 "arith5_operand" "")))]
430 ""
431 "
432 {
433 hppa_compare_op0 = operands[0];
434 hppa_compare_op1 = operands[1];
435 hppa_branch_type = CMP_SI;
436 DONE;
437 }")
438
439 (define_expand "cmpsf"
440 [(set (reg:CCFP 0)
441 (compare:CCFP (match_operand:SF 0 "reg_or_0_operand" "")
442 (match_operand:SF 1 "reg_or_0_operand" "")))]
443 "! TARGET_SOFT_FLOAT"
444 "
445 {
446 hppa_compare_op0 = operands[0];
447 hppa_compare_op1 = operands[1];
448 hppa_branch_type = CMP_SF;
449 DONE;
450 }")
451
452 (define_expand "cmpdf"
453 [(set (reg:CCFP 0)
454 (compare:CCFP (match_operand:DF 0 "reg_or_0_operand" "")
455 (match_operand:DF 1 "reg_or_0_operand" "")))]
456 "! TARGET_SOFT_FLOAT"
457 "
458 {
459 hppa_compare_op0 = operands[0];
460 hppa_compare_op1 = operands[1];
461 hppa_branch_type = CMP_DF;
462 DONE;
463 }")
464
465 (define_insn ""
466 [(set (reg:CCFP 0)
467 (match_operator:CCFP 2 "comparison_operator"
468 [(match_operand:SF 0 "reg_or_0_operand" "fG")
469 (match_operand:SF 1 "reg_or_0_operand" "fG")]))]
470 "! TARGET_SOFT_FLOAT"
471 "fcmp,sgl,%Y2 %f0,%f1"
472 [(set_attr "length" "4")
473 (set_attr "type" "fpcc")])
474
475 (define_insn ""
476 [(set (reg:CCFP 0)
477 (match_operator:CCFP 2 "comparison_operator"
478 [(match_operand:DF 0 "reg_or_0_operand" "fG")
479 (match_operand:DF 1 "reg_or_0_operand" "fG")]))]
480 "! TARGET_SOFT_FLOAT"
481 "fcmp,dbl,%Y2 %f0,%f1"
482 [(set_attr "length" "4")
483 (set_attr "type" "fpcc")])
484
485 ;; scc insns.
486
487 (define_expand "seq"
488 [(set (match_operand:SI 0 "register_operand" "")
489 (eq:SI (match_dup 1)
490 (match_dup 2)))]
491 "!TARGET_64BIT"
492 "
493 {
494 /* fp scc patterns rarely match, and are not a win on the PA. */
495 if (hppa_branch_type != CMP_SI)
496 FAIL;
497 /* set up operands from compare. */
498 operands[1] = hppa_compare_op0;
499 operands[2] = hppa_compare_op1;
500 /* fall through and generate default code */
501 }")
502
503 (define_expand "sne"
504 [(set (match_operand:SI 0 "register_operand" "")
505 (ne:SI (match_dup 1)
506 (match_dup 2)))]
507 "!TARGET_64BIT"
508 "
509 {
510 /* fp scc patterns rarely match, and are not a win on the PA. */
511 if (hppa_branch_type != CMP_SI)
512 FAIL;
513 operands[1] = hppa_compare_op0;
514 operands[2] = hppa_compare_op1;
515 }")
516
517 (define_expand "slt"
518 [(set (match_operand:SI 0 "register_operand" "")
519 (lt:SI (match_dup 1)
520 (match_dup 2)))]
521 "!TARGET_64BIT"
522 "
523 {
524 /* fp scc patterns rarely match, and are not a win on the PA. */
525 if (hppa_branch_type != CMP_SI)
526 FAIL;
527 operands[1] = hppa_compare_op0;
528 operands[2] = hppa_compare_op1;
529 }")
530
531 (define_expand "sgt"
532 [(set (match_operand:SI 0 "register_operand" "")
533 (gt:SI (match_dup 1)
534 (match_dup 2)))]
535 "!TARGET_64BIT"
536 "
537 {
538 /* fp scc patterns rarely match, and are not a win on the PA. */
539 if (hppa_branch_type != CMP_SI)
540 FAIL;
541 operands[1] = hppa_compare_op0;
542 operands[2] = hppa_compare_op1;
543 }")
544
545 (define_expand "sle"
546 [(set (match_operand:SI 0 "register_operand" "")
547 (le:SI (match_dup 1)
548 (match_dup 2)))]
549 "!TARGET_64BIT"
550 "
551 {
552 /* fp scc patterns rarely match, and are not a win on the PA. */
553 if (hppa_branch_type != CMP_SI)
554 FAIL;
555 operands[1] = hppa_compare_op0;
556 operands[2] = hppa_compare_op1;
557 }")
558
559 (define_expand "sge"
560 [(set (match_operand:SI 0 "register_operand" "")
561 (ge:SI (match_dup 1)
562 (match_dup 2)))]
563 "!TARGET_64BIT"
564 "
565 {
566 /* fp scc patterns rarely match, and are not a win on the PA. */
567 if (hppa_branch_type != CMP_SI)
568 FAIL;
569 operands[1] = hppa_compare_op0;
570 operands[2] = hppa_compare_op1;
571 }")
572
573 (define_expand "sltu"
574 [(set (match_operand:SI 0 "register_operand" "")
575 (ltu:SI (match_dup 1)
576 (match_dup 2)))]
577 "!TARGET_64BIT"
578 "
579 {
580 if (hppa_branch_type != CMP_SI)
581 FAIL;
582 operands[1] = hppa_compare_op0;
583 operands[2] = hppa_compare_op1;
584 }")
585
586 (define_expand "sgtu"
587 [(set (match_operand:SI 0 "register_operand" "")
588 (gtu:SI (match_dup 1)
589 (match_dup 2)))]
590 "!TARGET_64BIT"
591 "
592 {
593 if (hppa_branch_type != CMP_SI)
594 FAIL;
595 operands[1] = hppa_compare_op0;
596 operands[2] = hppa_compare_op1;
597 }")
598
599 (define_expand "sleu"
600 [(set (match_operand:SI 0 "register_operand" "")
601 (leu:SI (match_dup 1)
602 (match_dup 2)))]
603 "!TARGET_64BIT"
604 "
605 {
606 if (hppa_branch_type != CMP_SI)
607 FAIL;
608 operands[1] = hppa_compare_op0;
609 operands[2] = hppa_compare_op1;
610 }")
611
612 (define_expand "sgeu"
613 [(set (match_operand:SI 0 "register_operand" "")
614 (geu:SI (match_dup 1)
615 (match_dup 2)))]
616 "!TARGET_64BIT"
617 "
618 {
619 if (hppa_branch_type != CMP_SI)
620 FAIL;
621 operands[1] = hppa_compare_op0;
622 operands[2] = hppa_compare_op1;
623 }")
624
625 ;; Instruction canonicalization puts immediate operands second, which
626 ;; is the reverse of what we want.
627
628 (define_insn "scc"
629 [(set (match_operand:SI 0 "register_operand" "=r")
630 (match_operator:SI 3 "comparison_operator"
631 [(match_operand:SI 1 "register_operand" "r")
632 (match_operand:SI 2 "arith11_operand" "rI")]))]
633 ""
634 "{com%I2clr|cmp%I2clr},%B3 %2,%1,%0\;ldi 1,%0"
635 [(set_attr "type" "binary")
636 (set_attr "length" "8")])
637
638 (define_insn ""
639 [(set (match_operand:DI 0 "register_operand" "=r")
640 (match_operator:DI 3 "comparison_operator"
641 [(match_operand:DI 1 "register_operand" "r")
642 (match_operand:DI 2 "arith11_operand" "rI")]))]
643 "TARGET_64BIT"
644 "cmp%I2clr,*%B3 %2,%1,%0\;ldi 1,%0"
645 [(set_attr "type" "binary")
646 (set_attr "length" "8")])
647
648 (define_insn "iorscc"
649 [(set (match_operand:SI 0 "register_operand" "=r")
650 (ior:SI (match_operator:SI 3 "comparison_operator"
651 [(match_operand:SI 1 "register_operand" "r")
652 (match_operand:SI 2 "arith11_operand" "rI")])
653 (match_operator:SI 6 "comparison_operator"
654 [(match_operand:SI 4 "register_operand" "r")
655 (match_operand:SI 5 "arith11_operand" "rI")])))]
656 ""
657 "{com%I2clr|cmp%I2clr},%S3 %2,%1,%%r0\;{com%I5clr|cmp%I5clr},%B6 %5,%4,%0\;ldi 1,%0"
658 [(set_attr "type" "binary")
659 (set_attr "length" "12")])
660
661 (define_insn ""
662 [(set (match_operand:DI 0 "register_operand" "=r")
663 (ior:DI (match_operator:DI 3 "comparison_operator"
664 [(match_operand:DI 1 "register_operand" "r")
665 (match_operand:DI 2 "arith11_operand" "rI")])
666 (match_operator:DI 6 "comparison_operator"
667 [(match_operand:DI 4 "register_operand" "r")
668 (match_operand:DI 5 "arith11_operand" "rI")])))]
669 "TARGET_64BIT"
670 "cmp%I2clr,*%S3 %2,%1,%%r0\;cmp%I5clr,*%B6 %5,%4,%0\;ldi 1,%0"
671 [(set_attr "type" "binary")
672 (set_attr "length" "12")])
673
674 ;; Combiner patterns for common operations performed with the output
675 ;; from an scc insn (negscc and incscc).
676 (define_insn "negscc"
677 [(set (match_operand:SI 0 "register_operand" "=r")
678 (neg:SI (match_operator:SI 3 "comparison_operator"
679 [(match_operand:SI 1 "register_operand" "r")
680 (match_operand:SI 2 "arith11_operand" "rI")])))]
681 ""
682 "{com%I2clr|cmp%I2clr},%B3 %2,%1,%0\;ldi -1,%0"
683 [(set_attr "type" "binary")
684 (set_attr "length" "8")])
685
686 (define_insn ""
687 [(set (match_operand:DI 0 "register_operand" "=r")
688 (neg:DI (match_operator:DI 3 "comparison_operator"
689 [(match_operand:DI 1 "register_operand" "r")
690 (match_operand:DI 2 "arith11_operand" "rI")])))]
691 "TARGET_64BIT"
692 "cmp%I2clr,*%B3 %2,%1,%0\;ldi -1,%0"
693 [(set_attr "type" "binary")
694 (set_attr "length" "8")])
695
696 ;; Patterns for adding/subtracting the result of a boolean expression from
697 ;; a register. First we have special patterns that make use of the carry
698 ;; bit, and output only two instructions. For the cases we can't in
699 ;; general do in two instructions, the incscc pattern at the end outputs
700 ;; two or three instructions.
701
702 (define_insn ""
703 [(set (match_operand:SI 0 "register_operand" "=r")
704 (plus:SI (leu:SI (match_operand:SI 2 "register_operand" "r")
705 (match_operand:SI 3 "arith11_operand" "rI"))
706 (match_operand:SI 1 "register_operand" "r")))]
707 ""
708 "sub%I3 %3,%2,%%r0\;{addc|add,c} %%r0,%1,%0"
709 [(set_attr "type" "binary")
710 (set_attr "length" "8")])
711
712 (define_insn ""
713 [(set (match_operand:DI 0 "register_operand" "=r")
714 (plus:DI (leu:DI (match_operand:DI 2 "register_operand" "r")
715 (match_operand:DI 3 "arith11_operand" "rI"))
716 (match_operand:DI 1 "register_operand" "r")))]
717 "TARGET_64BIT"
718 "sub%I3 %3,%2,%%r0\;add,dc %%r0,%1,%0"
719 [(set_attr "type" "binary")
720 (set_attr "length" "8")])
721
722 ; This need only accept registers for op3, since canonicalization
723 ; replaces geu with gtu when op3 is an integer.
724 (define_insn ""
725 [(set (match_operand:SI 0 "register_operand" "=r")
726 (plus:SI (geu:SI (match_operand:SI 2 "register_operand" "r")
727 (match_operand:SI 3 "register_operand" "r"))
728 (match_operand:SI 1 "register_operand" "r")))]
729 ""
730 "sub %2,%3,%%r0\;{addc|add,c} %%r0,%1,%0"
731 [(set_attr "type" "binary")
732 (set_attr "length" "8")])
733
734 (define_insn ""
735 [(set (match_operand:DI 0 "register_operand" "=r")
736 (plus:DI (geu:DI (match_operand:DI 2 "register_operand" "r")
737 (match_operand:DI 3 "register_operand" "r"))
738 (match_operand:DI 1 "register_operand" "r")))]
739 "TARGET_64BIT"
740 "sub %2,%3,%%r0\;add,dc %%r0,%1,%0"
741 [(set_attr "type" "binary")
742 (set_attr "length" "8")])
743
744 ; Match only integers for op3 here. This is used as canonical form of the
745 ; geu pattern when op3 is an integer. Don't match registers since we can't
746 ; make better code than the general incscc pattern.
747 (define_insn ""
748 [(set (match_operand:SI 0 "register_operand" "=r")
749 (plus:SI (gtu:SI (match_operand:SI 2 "register_operand" "r")
750 (match_operand:SI 3 "int11_operand" "I"))
751 (match_operand:SI 1 "register_operand" "r")))]
752 ""
753 "addi %k3,%2,%%r0\;{addc|add,c} %%r0,%1,%0"
754 [(set_attr "type" "binary")
755 (set_attr "length" "8")])
756
757 (define_insn ""
758 [(set (match_operand:DI 0 "register_operand" "=r")
759 (plus:DI (gtu:DI (match_operand:DI 2 "register_operand" "r")
760 (match_operand:DI 3 "int11_operand" "I"))
761 (match_operand:DI 1 "register_operand" "r")))]
762 "TARGET_64BIT"
763 "addi %k3,%2,%%r0\;add,dc %%r0,%1,%0"
764 [(set_attr "type" "binary")
765 (set_attr "length" "8")])
766
767 (define_insn "incscc"
768 [(set (match_operand:SI 0 "register_operand" "=r,r")
769 (plus:SI (match_operator:SI 4 "comparison_operator"
770 [(match_operand:SI 2 "register_operand" "r,r")
771 (match_operand:SI 3 "arith11_operand" "rI,rI")])
772 (match_operand:SI 1 "register_operand" "0,?r")))]
773 ""
774 "@
775 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi 1,%0,%0
776 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi,tr 1,%1,%0\;copy %1,%0"
777 [(set_attr "type" "binary,binary")
778 (set_attr "length" "8,12")])
779
780 (define_insn ""
781 [(set (match_operand:DI 0 "register_operand" "=r,r")
782 (plus:DI (match_operator:DI 4 "comparison_operator"
783 [(match_operand:DI 2 "register_operand" "r,r")
784 (match_operand:DI 3 "arith11_operand" "rI,rI")])
785 (match_operand:DI 1 "register_operand" "0,?r")))]
786 "TARGET_64BIT"
787 "@
788 cmp%I3clr,*%B4 %3,%2,%%r0\;addi 1,%0,%0
789 cmp%I3clr,*%B4 %3,%2,%%r0\;addi,tr 1,%1,%0\;copy %1,%0"
790 [(set_attr "type" "binary,binary")
791 (set_attr "length" "8,12")])
792
793 (define_insn ""
794 [(set (match_operand:SI 0 "register_operand" "=r")
795 (minus:SI (match_operand:SI 1 "register_operand" "r")
796 (gtu:SI (match_operand:SI 2 "register_operand" "r")
797 (match_operand:SI 3 "arith11_operand" "rI"))))]
798 ""
799 "sub%I3 %3,%2,%%r0\;{subb|sub,b} %1,%%r0,%0"
800 [(set_attr "type" "binary")
801 (set_attr "length" "8")])
802
803 (define_insn ""
804 [(set (match_operand:DI 0 "register_operand" "=r")
805 (minus:DI (match_operand:DI 1 "register_operand" "r")
806 (gtu:DI (match_operand:DI 2 "register_operand" "r")
807 (match_operand:DI 3 "arith11_operand" "rI"))))]
808 "TARGET_64BIT"
809 "sub%I3 %3,%2,%%r0\;sub,db %1,%%r0,%0"
810 [(set_attr "type" "binary")
811 (set_attr "length" "8")])
812
813 (define_insn ""
814 [(set (match_operand:SI 0 "register_operand" "=r")
815 (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
816 (gtu:SI (match_operand:SI 2 "register_operand" "r")
817 (match_operand:SI 3 "arith11_operand" "rI")))
818 (match_operand:SI 4 "register_operand" "r")))]
819 ""
820 "sub%I3 %3,%2,%%r0\;{subb|sub,b} %1,%4,%0"
821 [(set_attr "type" "binary")
822 (set_attr "length" "8")])
823
824 (define_insn ""
825 [(set (match_operand:DI 0 "register_operand" "=r")
826 (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r")
827 (gtu:DI (match_operand:DI 2 "register_operand" "r")
828 (match_operand:DI 3 "arith11_operand" "rI")))
829 (match_operand:DI 4 "register_operand" "r")))]
830 "TARGET_64BIT"
831 "sub%I3 %3,%2,%%r0\;sub,db %1,%4,%0"
832 [(set_attr "type" "binary")
833 (set_attr "length" "8")])
834
835 ; This need only accept registers for op3, since canonicalization
836 ; replaces ltu with leu when op3 is an integer.
837 (define_insn ""
838 [(set (match_operand:SI 0 "register_operand" "=r")
839 (minus:SI (match_operand:SI 1 "register_operand" "r")
840 (ltu:SI (match_operand:SI 2 "register_operand" "r")
841 (match_operand:SI 3 "register_operand" "r"))))]
842 ""
843 "sub %2,%3,%%r0\;{subb|sub,b} %1,%%r0,%0"
844 [(set_attr "type" "binary")
845 (set_attr "length" "8")])
846
847 (define_insn ""
848 [(set (match_operand:DI 0 "register_operand" "=r")
849 (minus:DI (match_operand:DI 1 "register_operand" "r")
850 (ltu:DI (match_operand:DI 2 "register_operand" "r")
851 (match_operand:DI 3 "register_operand" "r"))))]
852 "TARGET_64BIT"
853 "sub %2,%3,%%r0\;sub,db %1,%%r0,%0"
854 [(set_attr "type" "binary")
855 (set_attr "length" "8")])
856
857 (define_insn ""
858 [(set (match_operand:SI 0 "register_operand" "=r")
859 (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
860 (ltu:SI (match_operand:SI 2 "register_operand" "r")
861 (match_operand:SI 3 "register_operand" "r")))
862 (match_operand:SI 4 "register_operand" "r")))]
863 ""
864 "sub %2,%3,%%r0\;{subb|sub,b} %1,%4,%0"
865 [(set_attr "type" "binary")
866 (set_attr "length" "8")])
867
868 (define_insn ""
869 [(set (match_operand:DI 0 "register_operand" "=r")
870 (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r")
871 (ltu:DI (match_operand:DI 2 "register_operand" "r")
872 (match_operand:DI 3 "register_operand" "r")))
873 (match_operand:DI 4 "register_operand" "r")))]
874 "TARGET_64BIT"
875 "sub %2,%3,%%r0\;sub,db %1,%4,%0"
876 [(set_attr "type" "binary")
877 (set_attr "length" "8")])
878
879 ; Match only integers for op3 here. This is used as canonical form of the
880 ; ltu pattern when op3 is an integer. Don't match registers since we can't
881 ; make better code than the general incscc pattern.
882 (define_insn ""
883 [(set (match_operand:SI 0 "register_operand" "=r")
884 (minus:SI (match_operand:SI 1 "register_operand" "r")
885 (leu:SI (match_operand:SI 2 "register_operand" "r")
886 (match_operand:SI 3 "int11_operand" "I"))))]
887 ""
888 "addi %k3,%2,%%r0\;{subb|sub,b} %1,%%r0,%0"
889 [(set_attr "type" "binary")
890 (set_attr "length" "8")])
891
892 (define_insn ""
893 [(set (match_operand:DI 0 "register_operand" "=r")
894 (minus:DI (match_operand:DI 1 "register_operand" "r")
895 (leu:DI (match_operand:DI 2 "register_operand" "r")
896 (match_operand:DI 3 "int11_operand" "I"))))]
897 "TARGET_64BIT"
898 "addi %k3,%2,%%r0\;sub,db %1,%%r0,%0"
899 [(set_attr "type" "binary")
900 (set_attr "length" "8")])
901
902 (define_insn ""
903 [(set (match_operand:SI 0 "register_operand" "=r")
904 (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
905 (leu:SI (match_operand:SI 2 "register_operand" "r")
906 (match_operand:SI 3 "int11_operand" "I")))
907 (match_operand:SI 4 "register_operand" "r")))]
908 ""
909 "addi %k3,%2,%%r0\;{subb|sub,b} %1,%4,%0"
910 [(set_attr "type" "binary")
911 (set_attr "length" "8")])
912
913 (define_insn ""
914 [(set (match_operand:DI 0 "register_operand" "=r")
915 (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r")
916 (leu:DI (match_operand:DI 2 "register_operand" "r")
917 (match_operand:DI 3 "int11_operand" "I")))
918 (match_operand:DI 4 "register_operand" "r")))]
919 "TARGET_64BIT"
920 "addi %k3,%2,%%r0\;sub,db %1,%4,%0"
921 [(set_attr "type" "binary")
922 (set_attr "length" "8")])
923
924 (define_insn "decscc"
925 [(set (match_operand:SI 0 "register_operand" "=r,r")
926 (minus:SI (match_operand:SI 1 "register_operand" "0,?r")
927 (match_operator:SI 4 "comparison_operator"
928 [(match_operand:SI 2 "register_operand" "r,r")
929 (match_operand:SI 3 "arith11_operand" "rI,rI")])))]
930 ""
931 "@
932 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi -1,%0,%0
933 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi,tr -1,%1,%0\;copy %1,%0"
934 [(set_attr "type" "binary,binary")
935 (set_attr "length" "8,12")])
936
937 (define_insn ""
938 [(set (match_operand:DI 0 "register_operand" "=r,r")
939 (minus:DI (match_operand:DI 1 "register_operand" "0,?r")
940 (match_operator:DI 4 "comparison_operator"
941 [(match_operand:DI 2 "register_operand" "r,r")
942 (match_operand:DI 3 "arith11_operand" "rI,rI")])))]
943 "TARGET_64BIT"
944 "@
945 cmp%I3clr,*%B4 %3,%2,%%r0\;addi -1,%0,%0
946 cmp%I3clr,*%B4 %3,%2,%%r0\;addi,tr -1,%1,%0\;copy %1,%0"
947 [(set_attr "type" "binary,binary")
948 (set_attr "length" "8,12")])
949
950 ; Patterns for max and min. (There is no need for an earlyclobber in the
951 ; last alternative since the middle alternative will match if op0 == op1.)
952
953 (define_insn "sminsi3"
954 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
955 (smin:SI (match_operand:SI 1 "register_operand" "%0,0,r")
956 (match_operand:SI 2 "arith11_operand" "r,I,M")))]
957 ""
958 "@
959 {comclr|cmpclr},> %2,%0,%%r0\;copy %2,%0
960 {comiclr|cmpiclr},> %2,%0,%%r0\;ldi %2,%0
961 {comclr|cmpclr},> %1,%r2,%0\;copy %1,%0"
962 [(set_attr "type" "multi,multi,multi")
963 (set_attr "length" "8,8,8")])
964
965 (define_insn "smindi3"
966 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
967 (smin:DI (match_operand:DI 1 "register_operand" "%0,0,r")
968 (match_operand:DI 2 "arith11_operand" "r,I,M")))]
969 "TARGET_64BIT"
970 "@
971 cmpclr,*> %2,%0,%%r0\;copy %2,%0
972 cmpiclr,*> %2,%0,%%r0\;ldi %2,%0
973 cmpclr,*> %1,%r2,%0\;copy %1,%0"
974 [(set_attr "type" "multi,multi,multi")
975 (set_attr "length" "8,8,8")])
976
977 (define_insn "uminsi3"
978 [(set (match_operand:SI 0 "register_operand" "=r,r")
979 (umin:SI (match_operand:SI 1 "register_operand" "%0,0")
980 (match_operand:SI 2 "arith11_operand" "r,I")))]
981 ""
982 "@
983 {comclr|cmpclr},>> %2,%0,%%r0\;copy %2,%0
984 {comiclr|cmpiclr},>> %2,%0,%%r0\;ldi %2,%0"
985 [(set_attr "type" "multi,multi")
986 (set_attr "length" "8,8")])
987
988 (define_insn "umindi3"
989 [(set (match_operand:DI 0 "register_operand" "=r,r")
990 (umin:DI (match_operand:DI 1 "register_operand" "%0,0")
991 (match_operand:DI 2 "arith11_operand" "r,I")))]
992 "TARGET_64BIT"
993 "@
994 cmpclr,*>> %2,%0,%%r0\;copy %2,%0
995 cmpiclr,*>> %2,%0,%%r0\;ldi %2,%0"
996 [(set_attr "type" "multi,multi")
997 (set_attr "length" "8,8")])
998
999 (define_insn "smaxsi3"
1000 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1001 (smax:SI (match_operand:SI 1 "register_operand" "%0,0,r")
1002 (match_operand:SI 2 "arith11_operand" "r,I,M")))]
1003 ""
1004 "@
1005 {comclr|cmpclr},< %2,%0,%%r0\;copy %2,%0
1006 {comiclr|cmpiclr},< %2,%0,%%r0\;ldi %2,%0
1007 {comclr|cmpclr},< %1,%r2,%0\;copy %1,%0"
1008 [(set_attr "type" "multi,multi,multi")
1009 (set_attr "length" "8,8,8")])
1010
1011 (define_insn "smaxdi3"
1012 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1013 (smax:DI (match_operand:DI 1 "register_operand" "%0,0,r")
1014 (match_operand:DI 2 "arith11_operand" "r,I,M")))]
1015 "TARGET_64BIT"
1016 "@
1017 cmpclr,*< %2,%0,%%r0\;copy %2,%0
1018 cmpiclr,*< %2,%0,%%r0\;ldi %2,%0
1019 cmpclr,*< %1,%r2,%0\;copy %1,%0"
1020 [(set_attr "type" "multi,multi,multi")
1021 (set_attr "length" "8,8,8")])
1022
1023 (define_insn "umaxsi3"
1024 [(set (match_operand:SI 0 "register_operand" "=r,r")
1025 (umax:SI (match_operand:SI 1 "register_operand" "%0,0")
1026 (match_operand:SI 2 "arith11_operand" "r,I")))]
1027 ""
1028 "@
1029 {comclr|cmpclr},<< %2,%0,%%r0\;copy %2,%0
1030 {comiclr|cmpiclr},<< %2,%0,%%r0\;ldi %2,%0"
1031 [(set_attr "type" "multi,multi")
1032 (set_attr "length" "8,8")])
1033
1034 (define_insn "umaxdi3"
1035 [(set (match_operand:DI 0 "register_operand" "=r,r")
1036 (umax:DI (match_operand:DI 1 "register_operand" "%0,0")
1037 (match_operand:DI 2 "arith11_operand" "r,I")))]
1038 "TARGET_64BIT"
1039 "@
1040 cmpclr,*<< %2,%0,%%r0\;copy %2,%0
1041 cmpiclr,*<< %2,%0,%%r0\;ldi %2,%0"
1042 [(set_attr "type" "multi,multi")
1043 (set_attr "length" "8,8")])
1044
1045 (define_insn "abssi2"
1046 [(set (match_operand:SI 0 "register_operand" "=r")
1047 (abs:SI (match_operand:SI 1 "register_operand" "r")))]
1048 ""
1049 "or,>= %%r0,%1,%0\;subi 0,%0,%0"
1050 [(set_attr "type" "multi")
1051 (set_attr "length" "8")])
1052
1053 (define_insn "absdi2"
1054 [(set (match_operand:DI 0 "register_operand" "=r")
1055 (abs:DI (match_operand:DI 1 "register_operand" "r")))]
1056 "TARGET_64BIT"
1057 "or,*>= %%r0,%1,%0\;subi 0,%0,%0"
1058 [(set_attr "type" "multi")
1059 (set_attr "length" "8")])
1060
1061 ;;; Experimental conditional move patterns
1062
1063 (define_expand "movsicc"
1064 [(set (match_operand:SI 0 "register_operand" "")
1065 (if_then_else:SI
1066 (match_operator 1 "comparison_operator"
1067 [(match_dup 4)
1068 (match_dup 5)])
1069 (match_operand:SI 2 "reg_or_cint_move_operand" "")
1070 (match_operand:SI 3 "reg_or_cint_move_operand" "")))]
1071 ""
1072 "
1073 {
1074 enum rtx_code code = GET_CODE (operands[1]);
1075
1076 if (hppa_branch_type != CMP_SI)
1077 FAIL;
1078
1079 if (GET_MODE (hppa_compare_op0) != GET_MODE (hppa_compare_op1)
1080 || GET_MODE (hppa_compare_op0) != GET_MODE (operands[0]))
1081 FAIL;
1082
1083 /* operands[1] is currently the result of compare_from_rtx. We want to
1084 emit a compare of the original operands. */
1085 operands[1] = gen_rtx_fmt_ee (code, SImode, hppa_compare_op0, hppa_compare_op1);
1086 operands[4] = hppa_compare_op0;
1087 operands[5] = hppa_compare_op1;
1088 }")
1089
1090 ;; We used to accept any register for op1.
1091 ;;
1092 ;; However, it loses sometimes because the compiler will end up using
1093 ;; different registers for op0 and op1 in some critical cases. local-alloc
1094 ;; will not tie op0 and op1 because op0 is used in multiple basic blocks.
1095 ;;
1096 ;; If/when global register allocation supports tying we should allow any
1097 ;; register for op1 again.
1098 (define_insn ""
1099 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1100 (if_then_else:SI
1101 (match_operator 2 "comparison_operator"
1102 [(match_operand:SI 3 "register_operand" "r,r,r,r")
1103 (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI")])
1104 (match_operand:SI 1 "reg_or_cint_move_operand" "0,J,N,K")
1105 (const_int 0)))]
1106 ""
1107 "@
1108 {com%I4clr|cmp%I4clr},%S2 %4,%3,%%r0\;ldi 0,%0
1109 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;ldi %1,%0
1110 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;ldil L'%1,%0
1111 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;{zdepi|depwi,z} %Z1,%0"
1112 [(set_attr "type" "multi,multi,multi,nullshift")
1113 (set_attr "length" "8,8,8,8")])
1114
1115 (define_insn ""
1116 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r,r")
1117 (if_then_else:SI
1118 (match_operator 5 "comparison_operator"
1119 [(match_operand:SI 3 "register_operand" "r,r,r,r,r,r,r,r")
1120 (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI,rI,rI,rI,rI")])
1121 (match_operand:SI 1 "reg_or_cint_move_operand" "0,0,0,0,r,J,N,K")
1122 (match_operand:SI 2 "reg_or_cint_move_operand" "r,J,N,K,0,0,0,0")))]
1123 ""
1124 "@
1125 {com%I4clr|cmp%I4clr},%S5 %4,%3,%%r0\;copy %2,%0
1126 {com%I4clr|cmp%I4clr},%S5 %4,%3,%%r0\;ldi %2,%0
1127 {com%I4clr|cmp%I4clr},%S5 %4,%3,%%r0\;ldil L'%2,%0
1128 {com%I4clr|cmp%I4clr},%S5 %4,%3,%%r0\;{zdepi|depwi,z} %Z2,%0
1129 {com%I4clr|cmp%I4clr},%B5 %4,%3,%%r0\;copy %1,%0
1130 {com%I4clr|cmp%I4clr},%B5 %4,%3,%%r0\;ldi %1,%0
1131 {com%I4clr|cmp%I4clr},%B5 %4,%3,%%r0\;ldil L'%1,%0
1132 {com%I4clr|cmp%I4clr},%B5 %4,%3,%%r0\;{zdepi|depwi,z} %Z1,%0"
1133 [(set_attr "type" "multi,multi,multi,nullshift,multi,multi,multi,nullshift")
1134 (set_attr "length" "8,8,8,8,8,8,8,8")])
1135
1136 (define_expand "movdicc"
1137 [(set (match_operand:DI 0 "register_operand" "")
1138 (if_then_else:DI
1139 (match_operator 1 "comparison_operator"
1140 [(match_dup 4)
1141 (match_dup 5)])
1142 (match_operand:DI 2 "reg_or_cint_move_operand" "")
1143 (match_operand:DI 3 "reg_or_cint_move_operand" "")))]
1144 "TARGET_64BIT"
1145 "
1146 {
1147 enum rtx_code code = GET_CODE (operands[1]);
1148
1149 if (hppa_branch_type != CMP_SI)
1150 FAIL;
1151
1152 if (GET_MODE (hppa_compare_op0) != GET_MODE (hppa_compare_op1)
1153 || GET_MODE (hppa_compare_op0) != GET_MODE (operands[0]))
1154 FAIL;
1155
1156 /* operands[1] is currently the result of compare_from_rtx. We want to
1157 emit a compare of the original operands. */
1158 operands[1] = gen_rtx_fmt_ee (code, DImode, hppa_compare_op0, hppa_compare_op1);
1159 operands[4] = hppa_compare_op0;
1160 operands[5] = hppa_compare_op1;
1161 }")
1162
1163 ; We need the first constraint alternative in order to avoid
1164 ; earlyclobbers on all other alternatives.
1165 (define_insn ""
1166 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r")
1167 (if_then_else:DI
1168 (match_operator 2 "comparison_operator"
1169 [(match_operand:DI 3 "register_operand" "r,r,r,r,r")
1170 (match_operand:DI 4 "arith11_operand" "rI,rI,rI,rI,rI")])
1171 (match_operand:DI 1 "reg_or_cint_move_operand" "0,r,J,N,K")
1172 (const_int 0)))]
1173 "TARGET_64BIT"
1174 "@
1175 cmp%I4clr,*%S2 %4,%3,%%r0\;ldi 0,%0
1176 cmp%I4clr,*%B2 %4,%3,%0\;copy %1,%0
1177 cmp%I4clr,*%B2 %4,%3,%0\;ldi %1,%0
1178 cmp%I4clr,*%B2 %4,%3,%0\;ldil L'%1,%0
1179 cmp%I4clr,*%B2 %4,%3,%0\;depdi,z %z1,%0"
1180 [(set_attr "type" "multi,multi,multi,multi,nullshift")
1181 (set_attr "length" "8,8,8,8,8")])
1182
1183 (define_insn ""
1184 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r,r,r")
1185 (if_then_else:DI
1186 (match_operator 5 "comparison_operator"
1187 [(match_operand:DI 3 "register_operand" "r,r,r,r,r,r,r,r")
1188 (match_operand:DI 4 "arith11_operand" "rI,rI,rI,rI,rI,rI,rI,rI")])
1189 (match_operand:DI 1 "reg_or_cint_move_operand" "0,0,0,0,r,J,N,K")
1190 (match_operand:DI 2 "reg_or_cint_move_operand" "r,J,N,K,0,0,0,0")))]
1191 "TARGET_64BIT"
1192 "@
1193 cmp%I4clr,*%S5 %4,%3,%%r0\;copy %2,%0
1194 cmp%I4clr,*%S5 %4,%3,%%r0\;ldi %2,%0
1195 cmp%I4clr,*%S5 %4,%3,%%r0\;ldil L'%2,%0
1196 cmp%I4clr,*%S5 %4,%3,%%r0\;depdi,z %z2,%0
1197 cmp%I4clr,*%B5 %4,%3,%%r0\;copy %1,%0
1198 cmp%I4clr,*%B5 %4,%3,%%r0\;ldi %1,%0
1199 cmp%I4clr,*%B5 %4,%3,%%r0\;ldil L'%1,%0
1200 cmp%I4clr,*%B5 %4,%3,%%r0\;depdi,z %z1,%0"
1201 [(set_attr "type" "multi,multi,multi,nullshift,multi,multi,multi,nullshift")
1202 (set_attr "length" "8,8,8,8,8,8,8,8")])
1203
1204 ;; Conditional Branches
1205
1206 (define_expand "beq"
1207 [(set (pc)
1208 (if_then_else (eq (match_dup 1) (match_dup 2))
1209 (label_ref (match_operand 0 "" ""))
1210 (pc)))]
1211 ""
1212 "
1213 {
1214 if (hppa_branch_type != CMP_SI)
1215 {
1216 emit_insn (gen_cmp_fp (EQ, hppa_compare_op0, hppa_compare_op1));
1217 emit_bcond_fp (NE, operands[0]);
1218 DONE;
1219 }
1220 /* set up operands from compare. */
1221 operands[1] = hppa_compare_op0;
1222 operands[2] = hppa_compare_op1;
1223 /* fall through and generate default code */
1224 }")
1225
1226 (define_expand "bne"
1227 [(set (pc)
1228 (if_then_else (ne (match_dup 1) (match_dup 2))
1229 (label_ref (match_operand 0 "" ""))
1230 (pc)))]
1231 ""
1232 "
1233 {
1234 if (hppa_branch_type != CMP_SI)
1235 {
1236 emit_insn (gen_cmp_fp (NE, hppa_compare_op0, hppa_compare_op1));
1237 emit_bcond_fp (NE, operands[0]);
1238 DONE;
1239 }
1240 operands[1] = hppa_compare_op0;
1241 operands[2] = hppa_compare_op1;
1242 }")
1243
1244 (define_expand "bgt"
1245 [(set (pc)
1246 (if_then_else (gt (match_dup 1) (match_dup 2))
1247 (label_ref (match_operand 0 "" ""))
1248 (pc)))]
1249 ""
1250 "
1251 {
1252 if (hppa_branch_type != CMP_SI)
1253 {
1254 emit_insn (gen_cmp_fp (GT, hppa_compare_op0, hppa_compare_op1));
1255 emit_bcond_fp (NE, operands[0]);
1256 DONE;
1257 }
1258 operands[1] = hppa_compare_op0;
1259 operands[2] = hppa_compare_op1;
1260 }")
1261
1262 (define_expand "blt"
1263 [(set (pc)
1264 (if_then_else (lt (match_dup 1) (match_dup 2))
1265 (label_ref (match_operand 0 "" ""))
1266 (pc)))]
1267 ""
1268 "
1269 {
1270 if (hppa_branch_type != CMP_SI)
1271 {
1272 emit_insn (gen_cmp_fp (LT, hppa_compare_op0, hppa_compare_op1));
1273 emit_bcond_fp (NE, operands[0]);
1274 DONE;
1275 }
1276 operands[1] = hppa_compare_op0;
1277 operands[2] = hppa_compare_op1;
1278 }")
1279
1280 (define_expand "bge"
1281 [(set (pc)
1282 (if_then_else (ge (match_dup 1) (match_dup 2))
1283 (label_ref (match_operand 0 "" ""))
1284 (pc)))]
1285 ""
1286 "
1287 {
1288 if (hppa_branch_type != CMP_SI)
1289 {
1290 emit_insn (gen_cmp_fp (GE, hppa_compare_op0, hppa_compare_op1));
1291 emit_bcond_fp (NE, operands[0]);
1292 DONE;
1293 }
1294 operands[1] = hppa_compare_op0;
1295 operands[2] = hppa_compare_op1;
1296 }")
1297
1298 (define_expand "ble"
1299 [(set (pc)
1300 (if_then_else (le (match_dup 1) (match_dup 2))
1301 (label_ref (match_operand 0 "" ""))
1302 (pc)))]
1303 ""
1304 "
1305 {
1306 if (hppa_branch_type != CMP_SI)
1307 {
1308 emit_insn (gen_cmp_fp (LE, hppa_compare_op0, hppa_compare_op1));
1309 emit_bcond_fp (NE, operands[0]);
1310 DONE;
1311 }
1312 operands[1] = hppa_compare_op0;
1313 operands[2] = hppa_compare_op1;
1314 }")
1315
1316 (define_expand "bgtu"
1317 [(set (pc)
1318 (if_then_else (gtu (match_dup 1) (match_dup 2))
1319 (label_ref (match_operand 0 "" ""))
1320 (pc)))]
1321 ""
1322 "
1323 {
1324 if (hppa_branch_type != CMP_SI)
1325 FAIL;
1326 operands[1] = hppa_compare_op0;
1327 operands[2] = hppa_compare_op1;
1328 }")
1329
1330 (define_expand "bltu"
1331 [(set (pc)
1332 (if_then_else (ltu (match_dup 1) (match_dup 2))
1333 (label_ref (match_operand 0 "" ""))
1334 (pc)))]
1335 ""
1336 "
1337 {
1338 if (hppa_branch_type != CMP_SI)
1339 FAIL;
1340 operands[1] = hppa_compare_op0;
1341 operands[2] = hppa_compare_op1;
1342 }")
1343
1344 (define_expand "bgeu"
1345 [(set (pc)
1346 (if_then_else (geu (match_dup 1) (match_dup 2))
1347 (label_ref (match_operand 0 "" ""))
1348 (pc)))]
1349 ""
1350 "
1351 {
1352 if (hppa_branch_type != CMP_SI)
1353 FAIL;
1354 operands[1] = hppa_compare_op0;
1355 operands[2] = hppa_compare_op1;
1356 }")
1357
1358 (define_expand "bleu"
1359 [(set (pc)
1360 (if_then_else (leu (match_dup 1) (match_dup 2))
1361 (label_ref (match_operand 0 "" ""))
1362 (pc)))]
1363 ""
1364 "
1365 {
1366 if (hppa_branch_type != CMP_SI)
1367 FAIL;
1368 operands[1] = hppa_compare_op0;
1369 operands[2] = hppa_compare_op1;
1370 }")
1371
1372 (define_expand "bltgt"
1373 [(set (pc)
1374 (if_then_else (ltgt (match_dup 1) (match_dup 2))
1375 (label_ref (match_operand 0 "" ""))
1376 (pc)))]
1377 ""
1378 "
1379 {
1380 if (hppa_branch_type == CMP_SI)
1381 FAIL;
1382 emit_insn (gen_cmp_fp (LTGT, hppa_compare_op0, hppa_compare_op1));
1383 emit_bcond_fp (NE, operands[0]);
1384 DONE;
1385 }")
1386
1387 (define_expand "bunle"
1388 [(set (pc)
1389 (if_then_else (unle (match_dup 1) (match_dup 2))
1390 (label_ref (match_operand 0 "" ""))
1391 (pc)))]
1392 ""
1393 "
1394 {
1395 if (hppa_branch_type == CMP_SI)
1396 FAIL;
1397 emit_insn (gen_cmp_fp (UNLE, hppa_compare_op0, hppa_compare_op1));
1398 emit_bcond_fp (NE, operands[0]);
1399 DONE;
1400 }")
1401
1402 (define_expand "bunlt"
1403 [(set (pc)
1404 (if_then_else (unlt (match_dup 1) (match_dup 2))
1405 (label_ref (match_operand 0 "" ""))
1406 (pc)))]
1407 ""
1408 "
1409 {
1410 if (hppa_branch_type == CMP_SI)
1411 FAIL;
1412 emit_insn (gen_cmp_fp (UNLT, hppa_compare_op0, hppa_compare_op1));
1413 emit_bcond_fp (NE, operands[0]);
1414 DONE;
1415 }")
1416
1417 (define_expand "bunge"
1418 [(set (pc)
1419 (if_then_else (unge (match_dup 1) (match_dup 2))
1420 (label_ref (match_operand 0 "" ""))
1421 (pc)))]
1422 ""
1423 "
1424 {
1425 if (hppa_branch_type == CMP_SI)
1426 FAIL;
1427 emit_insn (gen_cmp_fp (UNGE, hppa_compare_op0, hppa_compare_op1));
1428 emit_bcond_fp (NE, operands[0]);
1429 DONE;
1430 }")
1431
1432 (define_expand "bungt"
1433 [(set (pc)
1434 (if_then_else (ungt (match_dup 1) (match_dup 2))
1435 (label_ref (match_operand 0 "" ""))
1436 (pc)))]
1437 ""
1438 "
1439 {
1440 if (hppa_branch_type == CMP_SI)
1441 FAIL;
1442 emit_insn (gen_cmp_fp (UNGT, hppa_compare_op0, hppa_compare_op1));
1443 emit_bcond_fp (NE, operands[0]);
1444 DONE;
1445 }")
1446
1447 (define_expand "buneq"
1448 [(set (pc)
1449 (if_then_else (uneq (match_dup 1) (match_dup 2))
1450 (label_ref (match_operand 0 "" ""))
1451 (pc)))]
1452 ""
1453 "
1454 {
1455 if (hppa_branch_type == CMP_SI)
1456 FAIL;
1457 emit_insn (gen_cmp_fp (UNEQ, hppa_compare_op0, hppa_compare_op1));
1458 emit_bcond_fp (NE, operands[0]);
1459 DONE;
1460 }")
1461
1462 (define_expand "bunordered"
1463 [(set (pc)
1464 (if_then_else (unordered (match_dup 1) (match_dup 2))
1465 (label_ref (match_operand 0 "" ""))
1466 (pc)))]
1467 ""
1468 "
1469 {
1470 if (hppa_branch_type == CMP_SI)
1471 FAIL;
1472 emit_insn (gen_cmp_fp (UNORDERED, hppa_compare_op0, hppa_compare_op1));
1473 emit_bcond_fp (NE, operands[0]);
1474 DONE;
1475 }")
1476
1477 (define_expand "bordered"
1478 [(set (pc)
1479 (if_then_else (ordered (match_dup 1) (match_dup 2))
1480 (label_ref (match_operand 0 "" ""))
1481 (pc)))]
1482 ""
1483 "
1484 {
1485 if (hppa_branch_type == CMP_SI)
1486 FAIL;
1487 emit_insn (gen_cmp_fp (ORDERED, hppa_compare_op0, hppa_compare_op1));
1488 emit_bcond_fp (NE, operands[0]);
1489 DONE;
1490 }")
1491
1492 ;; Match the branch patterns.
1493
1494
1495 ;; Note a long backward conditional branch with an annulled delay slot
1496 ;; has a length of 12.
1497 (define_insn ""
1498 [(set (pc)
1499 (if_then_else
1500 (match_operator 3 "comparison_operator"
1501 [(match_operand:SI 1 "reg_or_0_operand" "rM")
1502 (match_operand:SI 2 "arith5_operand" "rL")])
1503 (label_ref (match_operand 0 "" ""))
1504 (pc)))]
1505 ""
1506 "*
1507 {
1508 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1509 get_attr_length (insn), 0, insn);
1510 }"
1511 [(set_attr "type" "cbranch")
1512 (set (attr "length")
1513 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1514 (const_int 8184))
1515 (const_int 4)
1516 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1517 (const_int 262100))
1518 (const_int 8)
1519 (eq (symbol_ref "flag_pic") (const_int 0))
1520 (const_int 20)]
1521 (const_int 28)))])
1522
1523 ;; Match the negated branch.
1524
1525 (define_insn ""
1526 [(set (pc)
1527 (if_then_else
1528 (match_operator 3 "comparison_operator"
1529 [(match_operand:SI 1 "reg_or_0_operand" "rM")
1530 (match_operand:SI 2 "arith5_operand" "rL")])
1531 (pc)
1532 (label_ref (match_operand 0 "" ""))))]
1533 ""
1534 "*
1535 {
1536 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1537 get_attr_length (insn), 1, insn);
1538 }"
1539 [(set_attr "type" "cbranch")
1540 (set (attr "length")
1541 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1542 (const_int 8184))
1543 (const_int 4)
1544 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1545 (const_int 262100))
1546 (const_int 8)
1547 (eq (symbol_ref "flag_pic") (const_int 0))
1548 (const_int 20)]
1549 (const_int 28)))])
1550
1551 (define_insn ""
1552 [(set (pc)
1553 (if_then_else
1554 (match_operator 3 "comparison_operator"
1555 [(match_operand:DI 1 "reg_or_0_operand" "rM")
1556 (match_operand:DI 2 "reg_or_0_operand" "rM")])
1557 (label_ref (match_operand 0 "" ""))
1558 (pc)))]
1559 "TARGET_64BIT"
1560 "*
1561 {
1562 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1563 get_attr_length (insn), 0, insn);
1564 }"
1565 [(set_attr "type" "cbranch")
1566 (set (attr "length")
1567 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1568 (const_int 8184))
1569 (const_int 4)
1570 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1571 (const_int 262100))
1572 (const_int 8)
1573 (eq (symbol_ref "flag_pic") (const_int 0))
1574 (const_int 20)]
1575 (const_int 28)))])
1576
1577 ;; Match the negated branch.
1578
1579 (define_insn ""
1580 [(set (pc)
1581 (if_then_else
1582 (match_operator 3 "comparison_operator"
1583 [(match_operand:DI 1 "reg_or_0_operand" "rM")
1584 (match_operand:DI 2 "reg_or_0_operand" "rM")])
1585 (pc)
1586 (label_ref (match_operand 0 "" ""))))]
1587 "TARGET_64BIT"
1588 "*
1589 {
1590 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1591 get_attr_length (insn), 1, insn);
1592 }"
1593 [(set_attr "type" "cbranch")
1594 (set (attr "length")
1595 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1596 (const_int 8184))
1597 (const_int 4)
1598 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1599 (const_int 262100))
1600 (const_int 8)
1601 (eq (symbol_ref "flag_pic") (const_int 0))
1602 (const_int 20)]
1603 (const_int 28)))])
1604 (define_insn ""
1605 [(set (pc)
1606 (if_then_else
1607 (match_operator 3 "cmpib_comparison_operator"
1608 [(match_operand:DI 1 "reg_or_0_operand" "rM")
1609 (match_operand:DI 2 "arith5_operand" "rL")])
1610 (label_ref (match_operand 0 "" ""))
1611 (pc)))]
1612 "TARGET_64BIT"
1613 "*
1614 {
1615 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1616 get_attr_length (insn), 0, insn);
1617 }"
1618 [(set_attr "type" "cbranch")
1619 (set (attr "length")
1620 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1621 (const_int 8184))
1622 (const_int 4)
1623 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1624 (const_int 262100))
1625 (const_int 8)
1626 (eq (symbol_ref "flag_pic") (const_int 0))
1627 (const_int 20)]
1628 (const_int 28)))])
1629
1630 ;; Match the negated branch.
1631
1632 (define_insn ""
1633 [(set (pc)
1634 (if_then_else
1635 (match_operator 3 "cmpib_comparison_operator"
1636 [(match_operand:DI 1 "reg_or_0_operand" "rM")
1637 (match_operand:DI 2 "arith5_operand" "rL")])
1638 (pc)
1639 (label_ref (match_operand 0 "" ""))))]
1640 "TARGET_64BIT"
1641 "*
1642 {
1643 return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
1644 get_attr_length (insn), 1, insn);
1645 }"
1646 [(set_attr "type" "cbranch")
1647 (set (attr "length")
1648 (cond [(lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1649 (const_int 8184))
1650 (const_int 4)
1651 (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
1652 (const_int 262100))
1653 (const_int 8)
1654 (eq (symbol_ref "flag_pic") (const_int 0))
1655 (const_int 20)]
1656 (const_int 28)))])
1657
1658 ;; Branch on Bit patterns.
1659 (define_insn ""
1660 [(set (pc)
1661 (if_then_else
1662 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1663 (const_int 1)
1664 (match_operand:SI 1 "uint5_operand" ""))
1665 (const_int 0))
1666 (label_ref (match_operand 2 "" ""))
1667 (pc)))]
1668 ""
1669 "*
1670 {
1671 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1672 get_attr_length (insn), 0, insn, 0);
1673 }"
1674 [(set_attr "type" "cbranch")
1675 (set (attr "length")
1676 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1677 (const_int 8184))
1678 (const_int 4)
1679 (const_int 8)))])
1680
1681 (define_insn ""
1682 [(set (pc)
1683 (if_then_else
1684 (ne (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1685 (const_int 1)
1686 (match_operand:DI 1 "uint32_operand" ""))
1687 (const_int 0))
1688 (label_ref (match_operand 2 "" ""))
1689 (pc)))]
1690 "TARGET_64BIT"
1691 "*
1692 {
1693 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1694 get_attr_length (insn), 0, insn, 0);
1695 }"
1696 [(set_attr "type" "cbranch")
1697 (set (attr "length")
1698 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1699 (const_int 8184))
1700 (const_int 4)
1701 (const_int 8)))])
1702
1703 (define_insn ""
1704 [(set (pc)
1705 (if_then_else
1706 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1707 (const_int 1)
1708 (match_operand:SI 1 "uint5_operand" ""))
1709 (const_int 0))
1710 (pc)
1711 (label_ref (match_operand 2 "" ""))))]
1712 ""
1713 "*
1714 {
1715 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1716 get_attr_length (insn), 1, insn, 0);
1717 }"
1718 [(set_attr "type" "cbranch")
1719 (set (attr "length")
1720 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1721 (const_int 8184))
1722 (const_int 4)
1723 (const_int 8)))])
1724
1725 (define_insn ""
1726 [(set (pc)
1727 (if_then_else
1728 (ne (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1729 (const_int 1)
1730 (match_operand:DI 1 "uint32_operand" ""))
1731 (const_int 0))
1732 (pc)
1733 (label_ref (match_operand 2 "" ""))))]
1734 "TARGET_64BIT"
1735 "*
1736 {
1737 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1738 get_attr_length (insn), 1, insn, 0);
1739 }"
1740 [(set_attr "type" "cbranch")
1741 (set (attr "length")
1742 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1743 (const_int 8184))
1744 (const_int 4)
1745 (const_int 8)))])
1746
1747 (define_insn ""
1748 [(set (pc)
1749 (if_then_else
1750 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1751 (const_int 1)
1752 (match_operand:SI 1 "uint5_operand" ""))
1753 (const_int 0))
1754 (label_ref (match_operand 2 "" ""))
1755 (pc)))]
1756 ""
1757 "*
1758 {
1759 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1760 get_attr_length (insn), 0, insn, 1);
1761 }"
1762 [(set_attr "type" "cbranch")
1763 (set (attr "length")
1764 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1765 (const_int 8184))
1766 (const_int 4)
1767 (const_int 8)))])
1768
1769 (define_insn ""
1770 [(set (pc)
1771 (if_then_else
1772 (eq (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1773 (const_int 1)
1774 (match_operand:DI 1 "uint32_operand" ""))
1775 (const_int 0))
1776 (label_ref (match_operand 2 "" ""))
1777 (pc)))]
1778 "TARGET_64BIT"
1779 "*
1780 {
1781 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1782 get_attr_length (insn), 0, insn, 1);
1783 }"
1784 [(set_attr "type" "cbranch")
1785 (set (attr "length")
1786 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1787 (const_int 8184))
1788 (const_int 4)
1789 (const_int 8)))])
1790
1791 (define_insn ""
1792 [(set (pc)
1793 (if_then_else
1794 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1795 (const_int 1)
1796 (match_operand:SI 1 "uint5_operand" ""))
1797 (const_int 0))
1798 (pc)
1799 (label_ref (match_operand 2 "" ""))))]
1800 ""
1801 "*
1802 {
1803 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1804 get_attr_length (insn), 1, insn, 1);
1805 }"
1806 [(set_attr "type" "cbranch")
1807 (set (attr "length")
1808 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1809 (const_int 8184))
1810 (const_int 4)
1811 (const_int 8)))])
1812
1813 (define_insn ""
1814 [(set (pc)
1815 (if_then_else
1816 (eq (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1817 (const_int 1)
1818 (match_operand:DI 1 "uint32_operand" ""))
1819 (const_int 0))
1820 (pc)
1821 (label_ref (match_operand 2 "" ""))))]
1822 "TARGET_64BIT"
1823 "*
1824 {
1825 return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
1826 get_attr_length (insn), 1, insn, 1);
1827 }"
1828 [(set_attr "type" "cbranch")
1829 (set (attr "length")
1830 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1831 (const_int 8184))
1832 (const_int 4)
1833 (const_int 8)))])
1834
1835 ;; Branch on Variable Bit patterns.
1836 (define_insn ""
1837 [(set (pc)
1838 (if_then_else
1839 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1840 (const_int 1)
1841 (match_operand:SI 1 "register_operand" "q"))
1842 (const_int 0))
1843 (label_ref (match_operand 2 "" ""))
1844 (pc)))]
1845 ""
1846 "*
1847 {
1848 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1849 get_attr_length (insn), 0, insn, 0);
1850 }"
1851 [(set_attr "type" "cbranch")
1852 (set (attr "length")
1853 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1854 (const_int 8184))
1855 (const_int 4)
1856 (const_int 8)))])
1857
1858 (define_insn ""
1859 [(set (pc)
1860 (if_then_else
1861 (ne (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1862 (const_int 1)
1863 (match_operand:DI 1 "register_operand" "q"))
1864 (const_int 0))
1865 (label_ref (match_operand 2 "" ""))
1866 (pc)))]
1867 "TARGET_64BIT"
1868 "*
1869 {
1870 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1871 get_attr_length (insn), 0, insn, 0);
1872 }"
1873 [(set_attr "type" "cbranch")
1874 (set (attr "length")
1875 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1876 (const_int 8184))
1877 (const_int 4)
1878 (const_int 8)))])
1879
1880 (define_insn ""
1881 [(set (pc)
1882 (if_then_else
1883 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1884 (const_int 1)
1885 (match_operand:SI 1 "register_operand" "q"))
1886 (const_int 0))
1887 (pc)
1888 (label_ref (match_operand 2 "" ""))))]
1889 ""
1890 "*
1891 {
1892 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1893 get_attr_length (insn), 1, insn, 0);
1894 }"
1895 [(set_attr "type" "cbranch")
1896 (set (attr "length")
1897 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1898 (const_int 8184))
1899 (const_int 4)
1900 (const_int 8)))])
1901
1902 (define_insn ""
1903 [(set (pc)
1904 (if_then_else
1905 (ne (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1906 (const_int 1)
1907 (match_operand:DI 1 "register_operand" "q"))
1908 (const_int 0))
1909 (pc)
1910 (label_ref (match_operand 2 "" ""))))]
1911 "TARGET_64BIT"
1912 "*
1913 {
1914 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1915 get_attr_length (insn), 1, insn, 0);
1916 }"
1917 [(set_attr "type" "cbranch")
1918 (set (attr "length")
1919 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1920 (const_int 8184))
1921 (const_int 4)
1922 (const_int 8)))])
1923
1924 (define_insn ""
1925 [(set (pc)
1926 (if_then_else
1927 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1928 (const_int 1)
1929 (match_operand:SI 1 "register_operand" "q"))
1930 (const_int 0))
1931 (label_ref (match_operand 2 "" ""))
1932 (pc)))]
1933 ""
1934 "*
1935 {
1936 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1937 get_attr_length (insn), 0, insn, 1);
1938 }"
1939 [(set_attr "type" "cbranch")
1940 (set (attr "length")
1941 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1942 (const_int 8184))
1943 (const_int 4)
1944 (const_int 8)))])
1945
1946 (define_insn ""
1947 [(set (pc)
1948 (if_then_else
1949 (eq (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1950 (const_int 1)
1951 (match_operand:DI 1 "register_operand" "q"))
1952 (const_int 0))
1953 (label_ref (match_operand 2 "" ""))
1954 (pc)))]
1955 "TARGET_64BIT"
1956 "*
1957 {
1958 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1959 get_attr_length (insn), 0, insn, 1);
1960 }"
1961 [(set_attr "type" "cbranch")
1962 (set (attr "length")
1963 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1964 (const_int 8184))
1965 (const_int 4)
1966 (const_int 8)))])
1967
1968 (define_insn ""
1969 [(set (pc)
1970 (if_then_else
1971 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
1972 (const_int 1)
1973 (match_operand:SI 1 "register_operand" "q"))
1974 (const_int 0))
1975 (pc)
1976 (label_ref (match_operand 2 "" ""))))]
1977 ""
1978 "*
1979 {
1980 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
1981 get_attr_length (insn), 1, insn, 1);
1982 }"
1983 [(set_attr "type" "cbranch")
1984 (set (attr "length")
1985 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
1986 (const_int 8184))
1987 (const_int 4)
1988 (const_int 8)))])
1989
1990 (define_insn ""
1991 [(set (pc)
1992 (if_then_else
1993 (eq (zero_extract:DI (match_operand:DI 0 "register_operand" "r")
1994 (const_int 1)
1995 (match_operand:DI 1 "register_operand" "q"))
1996 (const_int 0))
1997 (pc)
1998 (label_ref (match_operand 2 "" ""))))]
1999 "TARGET_64BIT"
2000 "*
2001 {
2002 return output_bvb (operands, INSN_ANNULLED_BRANCH_P (insn),
2003 get_attr_length (insn), 1, insn, 1);
2004 }"
2005 [(set_attr "type" "cbranch")
2006 (set (attr "length")
2007 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
2008 (const_int 8184))
2009 (const_int 4)
2010 (const_int 8)))])
2011
2012 ;; Floating point branches
2013 (define_insn ""
2014 [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
2015 (label_ref (match_operand 0 "" ""))
2016 (pc)))]
2017 "! TARGET_SOFT_FLOAT"
2018 "*
2019 {
2020 if (INSN_ANNULLED_BRANCH_P (insn))
2021 return \"ftest\;b,n %0\";
2022 else
2023 return \"ftest\;b%* %0\";
2024 }"
2025 [(set_attr "type" "fbranch")
2026 (set_attr "length" "8")])
2027
2028 (define_insn ""
2029 [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
2030 (pc)
2031 (label_ref (match_operand 0 "" ""))))]
2032 "! TARGET_SOFT_FLOAT"
2033 "*
2034 {
2035 if (INSN_ANNULLED_BRANCH_P (insn))
2036 return \"ftest\;add,tr %%r0,%%r0,%%r0\;b,n %0\";
2037 else
2038 return \"ftest\;add,tr %%r0,%%r0,%%r0\;b%* %0\";
2039 }"
2040 [(set_attr "type" "fbranch")
2041 (set_attr "length" "12")])
2042
2043 ;; Move instructions
2044
2045 (define_expand "movsi"
2046 [(set (match_operand:SI 0 "general_operand" "")
2047 (match_operand:SI 1 "general_operand" ""))]
2048 ""
2049 "
2050 {
2051 if (emit_move_sequence (operands, SImode, 0))
2052 DONE;
2053 }")
2054
2055 ;; Reloading an SImode or DImode value requires a scratch register if
2056 ;; going in to or out of float point registers.
2057
2058 (define_expand "reload_insi"
2059 [(set (match_operand:SI 0 "register_operand" "=Z")
2060 (match_operand:SI 1 "non_hard_reg_operand" ""))
2061 (clobber (match_operand:SI 2 "register_operand" "=&r"))]
2062 ""
2063 "
2064 {
2065 if (emit_move_sequence (operands, SImode, operands[2]))
2066 DONE;
2067
2068 /* We don't want the clobber emitted, so handle this ourselves. */
2069 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2070 DONE;
2071 }")
2072
2073 (define_expand "reload_outsi"
2074 [(set (match_operand:SI 0 "non_hard_reg_operand" "")
2075 (match_operand:SI 1 "register_operand" "Z"))
2076 (clobber (match_operand:SI 2 "register_operand" "=&r"))]
2077 ""
2078 "
2079 {
2080 if (emit_move_sequence (operands, SImode, operands[2]))
2081 DONE;
2082
2083 /* We don't want the clobber emitted, so handle this ourselves. */
2084 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2085 DONE;
2086 }")
2087
2088 (define_insn ""
2089 [(set (match_operand:SI 0 "reg_or_nonsymb_mem_operand"
2090 "=r,r,r,r,r,r,Q,*q,!f,f,*TR")
2091 (match_operand:SI 1 "move_operand"
2092 "A,r,J,N,K,RQ,rM,rM,!fM,*RT,f"))]
2093 "(register_operand (operands[0], SImode)
2094 || reg_or_0_operand (operands[1], SImode))
2095 && ! TARGET_SOFT_FLOAT"
2096 "@
2097 ldw RT'%A1,%0
2098 copy %1,%0
2099 ldi %1,%0
2100 ldil L'%1,%0
2101 {zdepi|depwi,z} %Z1,%0
2102 ldw%M1 %1,%0
2103 stw%M0 %r1,%0
2104 mtsar %r1
2105 fcpy,sgl %f1,%0
2106 fldw%F1 %1,%0
2107 fstw%F0 %1,%0"
2108 [(set_attr "type" "load,move,move,move,shift,load,store,move,fpalu,fpload,fpstore")
2109 (set_attr "pa_combine_type" "addmove")
2110 (set_attr "length" "4,4,4,4,4,4,4,4,4,4,4")])
2111
2112 (define_insn ""
2113 [(set (match_operand:SI 0 "reg_or_nonsymb_mem_operand"
2114 "=r,r,r,r,r,r,Q,*q")
2115 (match_operand:SI 1 "move_operand"
2116 "A,r,J,N,K,RQ,rM,rM"))]
2117 "(register_operand (operands[0], SImode)
2118 || reg_or_0_operand (operands[1], SImode))
2119 && TARGET_SOFT_FLOAT"
2120 "@
2121 ldw RT'%A1,%0
2122 copy %1,%0
2123 ldi %1,%0
2124 ldil L'%1,%0
2125 {zdepi|depwi,z} %Z1,%0
2126 ldw%M1 %1,%0
2127 stw%M0 %r1,%0
2128 mtsar %r1"
2129 [(set_attr "type" "load,move,move,move,move,load,store,move")
2130 (set_attr "pa_combine_type" "addmove")
2131 (set_attr "length" "4,4,4,4,4,4,4,4")])
2132
2133 (define_insn ""
2134 [(set (match_operand:SI 0 "register_operand" "=r")
2135 (mem:SI (plus:SI (match_operand:SI 1 "basereg_operand" "r")
2136 (match_operand:SI 2 "register_operand" "r"))))]
2137 "! TARGET_DISABLE_INDEXING"
2138 "{ldwx|ldw} %2(%1),%0"
2139 [(set_attr "type" "load")
2140 (set_attr "length" "4")])
2141
2142 (define_insn ""
2143 [(set (match_operand:SI 0 "register_operand" "=r")
2144 (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
2145 (match_operand:SI 2 "basereg_operand" "r"))))]
2146 "! TARGET_DISABLE_INDEXING"
2147 "{ldwx|ldw} %1(%2),%0"
2148 [(set_attr "type" "load")
2149 (set_attr "length" "4")])
2150
2151 ;; Load or store with base-register modification.
2152
2153 (define_expand "pre_load"
2154 [(parallel [(set (match_operand:SI 0 "register_operand" "")
2155 (mem (plus (match_operand 1 "register_operand" "")
2156 (match_operand 2 "pre_cint_operand" ""))))
2157 (set (match_dup 1)
2158 (plus (match_dup 1) (match_dup 2)))])]
2159 ""
2160 "
2161 {
2162 if (TARGET_64BIT)
2163 {
2164 emit_insn (gen_pre_ldd (operands[0], operands[1], operands[2]));
2165 DONE;
2166 }
2167 emit_insn (gen_pre_ldw (operands[0], operands[1], operands[2]));
2168 DONE;
2169 }")
2170
2171 (define_insn "pre_ldw"
2172 [(set (match_operand:SI 0 "register_operand" "=r")
2173 (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "+r")
2174 (match_operand:SI 2 "pre_cint_operand" ""))))
2175 (set (match_dup 1)
2176 (plus:SI (match_dup 1) (match_dup 2)))]
2177 ""
2178 "*
2179 {
2180 if (INTVAL (operands[2]) < 0)
2181 return \"{ldwm|ldw,mb} %2(%1),%0\";
2182 return \"{ldws|ldw},mb %2(%1),%0\";
2183 }"
2184 [(set_attr "type" "load")
2185 (set_attr "length" "4")])
2186
2187 (define_insn "pre_ldd"
2188 [(set (match_operand:DI 0 "register_operand" "=r")
2189 (mem:DI (plus:DI (match_operand:DI 1 "register_operand" "+r")
2190 (match_operand:DI 2 "pre_cint_operand" ""))))
2191 (set (match_dup 1)
2192 (plus:DI (match_dup 1) (match_dup 2)))]
2193 "TARGET_64BIT"
2194 "ldd,mb %2(%1),%0"
2195 [(set_attr "type" "load")
2196 (set_attr "length" "4")])
2197
2198 (define_insn ""
2199 [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "+r")
2200 (match_operand:SI 1 "pre_cint_operand" "")))
2201 (match_operand:SI 2 "reg_or_0_operand" "rM"))
2202 (set (match_dup 0)
2203 (plus:SI (match_dup 0) (match_dup 1)))]
2204 ""
2205 "*
2206 {
2207 if (INTVAL (operands[1]) < 0)
2208 return \"{stwm|stw,mb} %r2,%1(%0)\";
2209 return \"{stws|stw},mb %r2,%1(%0)\";
2210 }"
2211 [(set_attr "type" "store")
2212 (set_attr "length" "4")])
2213
2214 (define_insn ""
2215 [(set (match_operand:SI 0 "register_operand" "=r")
2216 (mem:SI (match_operand:SI 1 "register_operand" "+r")))
2217 (set (match_dup 1)
2218 (plus:SI (match_dup 1)
2219 (match_operand:SI 2 "post_cint_operand" "")))]
2220 ""
2221 "*
2222 {
2223 if (INTVAL (operands[2]) > 0)
2224 return \"{ldwm|ldw,ma} %2(%1),%0\";
2225 return \"{ldws|ldw},ma %2(%1),%0\";
2226 }"
2227 [(set_attr "type" "load")
2228 (set_attr "length" "4")])
2229
2230 (define_expand "post_store"
2231 [(parallel [(set (mem (match_operand 0 "register_operand" ""))
2232 (match_operand 1 "reg_or_0_operand" ""))
2233 (set (match_dup 0)
2234 (plus (match_dup 0)
2235 (match_operand 2 "post_cint_operand" "")))])]
2236 ""
2237 "
2238 {
2239 if (TARGET_64BIT)
2240 {
2241 emit_insn (gen_post_std (operands[0], operands[1], operands[2]));
2242 DONE;
2243 }
2244 emit_insn (gen_post_stw (operands[0], operands[1], operands[2]));
2245 DONE;
2246 }")
2247
2248 (define_insn "post_stw"
2249 [(set (mem:SI (match_operand:SI 0 "register_operand" "+r"))
2250 (match_operand:SI 1 "reg_or_0_operand" "rM"))
2251 (set (match_dup 0)
2252 (plus:SI (match_dup 0)
2253 (match_operand:SI 2 "post_cint_operand" "")))]
2254 ""
2255 "*
2256 {
2257 if (INTVAL (operands[2]) > 0)
2258 return \"{stwm|stw,ma} %r1,%2(%0)\";
2259 return \"{stws|stw},ma %r1,%2(%0)\";
2260 }"
2261 [(set_attr "type" "store")
2262 (set_attr "length" "4")])
2263
2264 (define_insn "post_std"
2265 [(set (mem:DI (match_operand:DI 0 "register_operand" "+r"))
2266 (match_operand:DI 1 "reg_or_0_operand" "rM"))
2267 (set (match_dup 0)
2268 (plus:DI (match_dup 0)
2269 (match_operand:DI 2 "post_cint_operand" "")))]
2270 "TARGET_64BIT"
2271 "std,ma %r1,%2(%0)"
2272 [(set_attr "type" "store")
2273 (set_attr "length" "4")])
2274
2275 ;; For loading the address of a label while generating PIC code.
2276 ;; Note since this pattern can be created at reload time (via movsi), all
2277 ;; the same rules for movsi apply here. (no new pseudos, no temporaries).
2278 (define_insn ""
2279 [(set (match_operand 0 "pmode_register_operand" "=a")
2280 (match_operand 1 "pic_label_operand" ""))]
2281 ""
2282 "*
2283 {
2284 rtx label_rtx = gen_label_rtx ();
2285 rtx xoperands[3];
2286 extern FILE *asm_out_file;
2287
2288 xoperands[0] = operands[0];
2289 xoperands[1] = operands[1];
2290 xoperands[2] = label_rtx;
2291 output_asm_insn (\"{bl|b,l} .+8,%0\", xoperands);
2292 output_asm_insn (\"{depi|depwi} 0,31,2,%0\", xoperands);
2293 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
2294 CODE_LABEL_NUMBER (label_rtx));
2295
2296 /* If we're trying to load the address of a label that happens to be
2297 close, then we can use a shorter sequence. */
2298 if (GET_CODE (operands[1]) == LABEL_REF
2299 && INSN_ADDRESSES_SET_P ()
2300 && abs (INSN_ADDRESSES (INSN_UID (XEXP (operands[1], 0)))
2301 - INSN_ADDRESSES (INSN_UID (insn))) < 8100)
2302 {
2303 /* Prefixing with R% here is wrong, it extracts just 11 bits and is
2304 always non-negative. */
2305 output_asm_insn (\"ldo %1-%2(%0),%0\", xoperands);
2306 }
2307 else
2308 {
2309 output_asm_insn (\"addil L%%%1-%2,%0\", xoperands);
2310 output_asm_insn (\"ldo R%%%1-%2(%0),%0\", xoperands);
2311 }
2312 return \"\";
2313 }"
2314 [(set_attr "type" "multi")
2315 (set_attr "length" "16")]) ; 12 or 16
2316
2317 (define_insn ""
2318 [(set (match_operand:SI 0 "register_operand" "=a")
2319 (plus:SI (match_operand:SI 1 "register_operand" "r")
2320 (high:SI (match_operand 2 "" ""))))]
2321 "symbolic_operand (operands[2], Pmode)
2322 && ! function_label_operand (operands[2], Pmode)
2323 && flag_pic"
2324 "addil LT'%G2,%1"
2325 [(set_attr "type" "binary")
2326 (set_attr "length" "4")])
2327
2328 (define_insn ""
2329 [(set (match_operand:DI 0 "register_operand" "=a")
2330 (plus:DI (match_operand:DI 1 "register_operand" "r")
2331 (high:DI (match_operand 2 "" ""))))]
2332 "symbolic_operand (operands[2], Pmode)
2333 && ! function_label_operand (operands[2], Pmode)
2334 && TARGET_64BIT
2335 && flag_pic"
2336 "addil LT'%G2,%1"
2337 [(set_attr "type" "binary")
2338 (set_attr "length" "4")])
2339
2340 ;; Always use addil rather than ldil;add sequences. This allows the
2341 ;; HP linker to eliminate the dp relocation if the symbolic operand
2342 ;; lives in the TEXT space.
2343 (define_insn ""
2344 [(set (match_operand:SI 0 "register_operand" "=a")
2345 (high:SI (match_operand 1 "" "")))]
2346 "symbolic_operand (operands[1], Pmode)
2347 && ! function_label_operand (operands[1], Pmode)
2348 && ! read_only_operand (operands[1], Pmode)
2349 && ! flag_pic"
2350 "*
2351 {
2352 if (TARGET_LONG_LOAD_STORE)
2353 return \"addil NLR'%H1,%%r27\;ldo N'%H1(%%r1),%%r1\";
2354 else
2355 return \"addil LR'%H1,%%r27\";
2356 }"
2357 [(set_attr "type" "binary")
2358 (set (attr "length")
2359 (if_then_else (eq (symbol_ref "TARGET_LONG_LOAD_STORE") (const_int 0))
2360 (const_int 4)
2361 (const_int 8)))])
2362
2363
2364 ;; This is for use in the prologue/epilogue code. We need it
2365 ;; to add large constants to a stack pointer or frame pointer.
2366 ;; Because of the additional %r1 pressure, we probably do not
2367 ;; want to use this in general code, so make it available
2368 ;; only after reload.
2369 (define_insn ""
2370 [(set (match_operand:SI 0 "register_operand" "=!a,*r")
2371 (plus:SI (match_operand:SI 1 "register_operand" "r,r")
2372 (high:SI (match_operand 2 "const_int_operand" ""))))]
2373 "reload_completed"
2374 "@
2375 addil L'%G2,%1
2376 ldil L'%G2,%0\;{addl|add,l} %0,%1,%0"
2377 [(set_attr "type" "binary,binary")
2378 (set_attr "length" "4,8")])
2379
2380 (define_insn ""
2381 [(set (match_operand:DI 0 "register_operand" "=!a,*r")
2382 (plus:DI (match_operand:DI 1 "register_operand" "r,r")
2383 (high:DI (match_operand 2 "const_int_operand" ""))))]
2384 "reload_completed && TARGET_64BIT"
2385 "@
2386 addil L'%G2,%1
2387 ldil L'%G2,%0\;{addl|add,l} %0,%1,%0"
2388 [(set_attr "type" "binary,binary")
2389 (set_attr "length" "4,8")])
2390
2391 (define_insn ""
2392 [(set (match_operand:SI 0 "register_operand" "=r")
2393 (high:SI (match_operand 1 "" "")))]
2394 "(!flag_pic || !symbolic_operand (operands[1], Pmode))
2395 && !is_function_label_plus_const (operands[1])"
2396 "*
2397 {
2398 if (symbolic_operand (operands[1], Pmode))
2399 return \"ldil LR'%H1,%0\";
2400 else
2401 return \"ldil L'%G1,%0\";
2402 }"
2403 [(set_attr "type" "move")
2404 (set_attr "length" "4")])
2405
2406 (define_insn ""
2407 [(set (match_operand:DI 0 "register_operand" "=r")
2408 (high:DI (match_operand 1 "const_int_operand" "")))]
2409 "TARGET_64BIT"
2410 "ldil L'%G1,%0";
2411 [(set_attr "type" "move")
2412 (set_attr "length" "4")])
2413
2414 (define_insn ""
2415 [(set (match_operand:DI 0 "register_operand" "=r")
2416 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
2417 (match_operand:DI 2 "const_int_operand" "i")))]
2418 "TARGET_64BIT"
2419 "ldo R'%G2(%1),%0";
2420 [(set_attr "type" "move")
2421 (set_attr "length" "4")])
2422
2423 (define_insn ""
2424 [(set (match_operand:SI 0 "register_operand" "=r")
2425 (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
2426 (match_operand:SI 2 "immediate_operand" "i")))]
2427 "!is_function_label_plus_const (operands[2])"
2428 "*
2429 {
2430 if (flag_pic && symbolic_operand (operands[2], Pmode))
2431 abort ();
2432 else if (symbolic_operand (operands[2], Pmode))
2433 return \"ldo RR'%G2(%1),%0\";
2434 else
2435 return \"ldo R'%G2(%1),%0\";
2436 }"
2437 [(set_attr "type" "move")
2438 (set_attr "length" "4")])
2439
2440 ;; Now that a symbolic_address plus a constant is broken up early
2441 ;; in the compilation phase (for better CSE) we need a special
2442 ;; combiner pattern to load the symbolic address plus the constant
2443 ;; in only 2 instructions. (For cases where the symbolic address
2444 ;; was not a common subexpression.)
2445 (define_split
2446 [(set (match_operand:SI 0 "register_operand" "")
2447 (match_operand:SI 1 "symbolic_operand" ""))
2448 (clobber (match_operand:SI 2 "register_operand" ""))]
2449 "! (flag_pic && pic_label_operand (operands[1], SImode))"
2450 [(set (match_dup 2) (high:SI (match_dup 1)))
2451 (set (match_dup 0) (lo_sum:SI (match_dup 2) (match_dup 1)))]
2452 "")
2453
2454 ;; hppa_legitimize_address goes to a great deal of trouble to
2455 ;; create addresses which use indexing. In some cases, this
2456 ;; is a lose because there isn't any store instructions which
2457 ;; allow indexed addresses (with integer register source).
2458 ;;
2459 ;; These define_splits try to turn a 3 insn store into
2460 ;; a 2 insn store with some creative RTL rewriting.
2461 (define_split
2462 [(set (mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "")
2463 (match_operand:SI 1 "shadd_operand" ""))
2464 (plus:SI (match_operand:SI 2 "register_operand" "")
2465 (match_operand:SI 3 "const_int_operand" ""))))
2466 (match_operand:SI 4 "register_operand" ""))
2467 (clobber (match_operand:SI 5 "register_operand" ""))]
2468 ""
2469 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 0) (match_dup 1))
2470 (match_dup 2)))
2471 (set (mem:SI (plus:SI (match_dup 5) (match_dup 3))) (match_dup 4))]
2472 "")
2473
2474 (define_split
2475 [(set (mem:HI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "")
2476 (match_operand:SI 1 "shadd_operand" ""))
2477 (plus:SI (match_operand:SI 2 "register_operand" "")
2478 (match_operand:SI 3 "const_int_operand" ""))))
2479 (match_operand:HI 4 "register_operand" ""))
2480 (clobber (match_operand:SI 5 "register_operand" ""))]
2481 ""
2482 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 0) (match_dup 1))
2483 (match_dup 2)))
2484 (set (mem:HI (plus:SI (match_dup 5) (match_dup 3))) (match_dup 4))]
2485 "")
2486
2487 (define_split
2488 [(set (mem:QI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "")
2489 (match_operand:SI 1 "shadd_operand" ""))
2490 (plus:SI (match_operand:SI 2 "register_operand" "")
2491 (match_operand:SI 3 "const_int_operand" ""))))
2492 (match_operand:QI 4 "register_operand" ""))
2493 (clobber (match_operand:SI 5 "register_operand" ""))]
2494 ""
2495 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 0) (match_dup 1))
2496 (match_dup 2)))
2497 (set (mem:QI (plus:SI (match_dup 5) (match_dup 3))) (match_dup 4))]
2498 "")
2499
2500 (define_expand "movhi"
2501 [(set (match_operand:HI 0 "general_operand" "")
2502 (match_operand:HI 1 "general_operand" ""))]
2503 ""
2504 "
2505 {
2506 if (emit_move_sequence (operands, HImode, 0))
2507 DONE;
2508 }")
2509
2510 (define_insn ""
2511 [(set (match_operand:HI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,r,r,Q,*q,!*f")
2512 (match_operand:HI 1 "move_operand" "r,J,N,K,RQ,rM,rM,!*fM"))]
2513 "register_operand (operands[0], HImode)
2514 || reg_or_0_operand (operands[1], HImode)"
2515 "@
2516 copy %1,%0
2517 ldi %1,%0
2518 ldil L'%1,%0
2519 {zdepi|depwi,z} %Z1,%0
2520 ldh%M1 %1,%0
2521 sth%M0 %r1,%0
2522 mtsar %r1
2523 fcpy,sgl %f1,%0"
2524 [(set_attr "type" "move,move,move,shift,load,store,move,fpalu")
2525 (set_attr "pa_combine_type" "addmove")
2526 (set_attr "length" "4,4,4,4,4,4,4,4")])
2527
2528 (define_insn ""
2529 [(set (match_operand:HI 0 "register_operand" "=r")
2530 (mem:HI (plus:SI (match_operand:SI 1 "basereg_operand" "r")
2531 (match_operand:SI 2 "register_operand" "r"))))]
2532 "! TARGET_DISABLE_INDEXING"
2533 "{ldhx|ldh} %2(%1),%0"
2534 [(set_attr "type" "load")
2535 (set_attr "length" "4")])
2536
2537 (define_insn ""
2538 [(set (match_operand:HI 0 "register_operand" "=r")
2539 (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r")
2540 (match_operand:SI 2 "basereg_operand" "r"))))]
2541 "! TARGET_DISABLE_INDEXING"
2542 "{ldhx|ldh} %1(%2),%0"
2543 [(set_attr "type" "load")
2544 (set_attr "length" "4")])
2545
2546 ; Now zero extended variants.
2547 (define_insn ""
2548 [(set (match_operand:SI 0 "register_operand" "=r")
2549 (zero_extend:SI (mem:HI
2550 (plus:SI
2551 (match_operand:SI 1 "basereg_operand" "r")
2552 (match_operand:SI 2 "register_operand" "r")))))]
2553 "! TARGET_DISABLE_INDEXING"
2554 "{ldhx|ldh} %2(%1),%0"
2555 [(set_attr "type" "load")
2556 (set_attr "length" "4")])
2557
2558 (define_insn ""
2559 [(set (match_operand:SI 0 "register_operand" "=r")
2560 (zero_extend:SI (mem:HI
2561 (plus:SI
2562 (match_operand:SI 1 "register_operand" "r")
2563 (match_operand:SI 2 "basereg_operand" "r")))))]
2564 "! TARGET_DISABLE_INDEXING"
2565 "{ldhx|ldh} %1(%2),%0"
2566 [(set_attr "type" "load")
2567 (set_attr "length" "4")])
2568
2569 (define_insn ""
2570 [(set (match_operand:HI 0 "register_operand" "=r")
2571 (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "+r")
2572 (match_operand:SI 2 "int5_operand" "L"))))
2573 (set (match_dup 1)
2574 (plus:SI (match_dup 1) (match_dup 2)))]
2575 ""
2576 "{ldhs|ldh},mb %2(%1),%0"
2577 [(set_attr "type" "load")
2578 (set_attr "length" "4")])
2579
2580 ; And a zero extended variant.
2581 (define_insn ""
2582 [(set (match_operand:SI 0 "register_operand" "=r")
2583 (zero_extend:SI (mem:HI
2584 (plus:SI
2585 (match_operand:SI 1 "register_operand" "+r")
2586 (match_operand:SI 2 "int5_operand" "L")))))
2587 (set (match_dup 1)
2588 (plus:SI (match_dup 1) (match_dup 2)))]
2589 ""
2590 "{ldhs|ldh},mb %2(%1),%0"
2591 [(set_attr "type" "load")
2592 (set_attr "length" "4")])
2593
2594 (define_insn ""
2595 [(set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "+r")
2596 (match_operand:SI 1 "int5_operand" "L")))
2597 (match_operand:HI 2 "reg_or_0_operand" "rM"))
2598 (set (match_dup 0)
2599 (plus:SI (match_dup 0) (match_dup 1)))]
2600 ""
2601 "{sths|sth},mb %r2,%1(%0)"
2602 [(set_attr "type" "store")
2603 (set_attr "length" "4")])
2604
2605 (define_insn ""
2606 [(set (match_operand:HI 0 "register_operand" "=r")
2607 (high:HI (match_operand 1 "const_int_operand" "")))]
2608 ""
2609 "ldil L'%G1,%0"
2610 [(set_attr "type" "move")
2611 (set_attr "length" "4")])
2612
2613 (define_insn ""
2614 [(set (match_operand:HI 0 "register_operand" "=r")
2615 (lo_sum:HI (match_operand:HI 1 "register_operand" "r")
2616 (match_operand 2 "const_int_operand" "")))]
2617 ""
2618 "ldo R'%G2(%1),%0"
2619 [(set_attr "type" "move")
2620 (set_attr "length" "4")])
2621
2622 (define_expand "movqi"
2623 [(set (match_operand:QI 0 "general_operand" "")
2624 (match_operand:QI 1 "general_operand" ""))]
2625 ""
2626 "
2627 {
2628 if (emit_move_sequence (operands, QImode, 0))
2629 DONE;
2630 }")
2631
2632 (define_insn ""
2633 [(set (match_operand:QI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,r,r,Q,*q,!*f")
2634 (match_operand:QI 1 "move_operand" "r,J,N,K,RQ,rM,rM,!*fM"))]
2635 "register_operand (operands[0], QImode)
2636 || reg_or_0_operand (operands[1], QImode)"
2637 "@
2638 copy %1,%0
2639 ldi %1,%0
2640 ldil L'%1,%0
2641 {zdepi|depwi,z} %Z1,%0
2642 ldb%M1 %1,%0
2643 stb%M0 %r1,%0
2644 mtsar %r1
2645 fcpy,sgl %f1,%0"
2646 [(set_attr "type" "move,move,move,shift,load,store,move,fpalu")
2647 (set_attr "pa_combine_type" "addmove")
2648 (set_attr "length" "4,4,4,4,4,4,4,4")])
2649
2650 (define_insn ""
2651 [(set (match_operand:QI 0 "register_operand" "=r")
2652 (mem:QI (plus:SI (match_operand:SI 1 "basereg_operand" "r")
2653 (match_operand:SI 2 "register_operand" "r"))))]
2654 "! TARGET_DISABLE_INDEXING"
2655 "{ldbx|ldb} %2(%1),%0"
2656 [(set_attr "type" "load")
2657 (set_attr "length" "4")])
2658
2659 (define_insn ""
2660 [(set (match_operand:QI 0 "register_operand" "=r")
2661 (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r")
2662 (match_operand:SI 2 "basereg_operand" "r"))))]
2663 "! TARGET_DISABLE_INDEXING"
2664 "{ldbx|ldb} %1(%2),%0"
2665 [(set_attr "type" "load")
2666 (set_attr "length" "4")])
2667
2668 ; Indexed byte load with zero extension to SImode or HImode.
2669 (define_insn ""
2670 [(set (match_operand:SI 0 "register_operand" "=r")
2671 (zero_extend:SI (mem:QI
2672 (plus:SI
2673 (match_operand:SI 1 "basereg_operand" "r")
2674 (match_operand:SI 2 "register_operand" "r")))))]
2675 "! TARGET_DISABLE_INDEXING"
2676 "{ldbx|ldb} %2(%1),%0"
2677 [(set_attr "type" "load")
2678 (set_attr "length" "4")])
2679
2680 (define_insn ""
2681 [(set (match_operand:SI 0 "register_operand" "=r")
2682 (zero_extend:SI (mem:QI
2683 (plus:SI
2684 (match_operand:SI 1 "register_operand" "r")
2685 (match_operand:SI 2 "basereg_operand" "r")))))]
2686 "! TARGET_DISABLE_INDEXING"
2687 "{ldbx|ldb} %1(%2),%0"
2688 [(set_attr "type" "load")
2689 (set_attr "length" "4")])
2690
2691 (define_insn ""
2692 [(set (match_operand:HI 0 "register_operand" "=r")
2693 (zero_extend:HI (mem:QI
2694 (plus:SI
2695 (match_operand:SI 1 "basereg_operand" "r")
2696 (match_operand:SI 2 "register_operand" "r")))))]
2697 "! TARGET_DISABLE_INDEXING"
2698 "{ldbx|ldb} %2(%1),%0"
2699 [(set_attr "type" "load")
2700 (set_attr "length" "4")])
2701
2702 (define_insn ""
2703 [(set (match_operand:HI 0 "register_operand" "=r")
2704 (zero_extend:HI (mem:QI
2705 (plus:SI
2706 (match_operand:SI 1 "register_operand" "r")
2707 (match_operand:SI 2 "basereg_operand" "r")))))]
2708 "! TARGET_DISABLE_INDEXING"
2709 "{ldbx|ldb} %1(%2),%0"
2710 [(set_attr "type" "load")
2711 (set_attr "length" "4")])
2712
2713 (define_insn ""
2714 [(set (match_operand:QI 0 "register_operand" "=r")
2715 (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "+r")
2716 (match_operand:SI 2 "int5_operand" "L"))))
2717 (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))]
2718 ""
2719 "{ldbs|ldb},mb %2(%1),%0"
2720 [(set_attr "type" "load")
2721 (set_attr "length" "4")])
2722
2723 ; Now the same thing with zero extensions.
2724 (define_insn ""
2725 [(set (match_operand:SI 0 "register_operand" "=r")
2726 (zero_extend:SI (mem:QI (plus:SI
2727 (match_operand:SI 1 "register_operand" "+r")
2728 (match_operand:SI 2 "int5_operand" "L")))))
2729 (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))]
2730 ""
2731 "{ldbs|ldb},mb %2(%1),%0"
2732 [(set_attr "type" "load")
2733 (set_attr "length" "4")])
2734
2735 (define_insn ""
2736 [(set (match_operand:HI 0 "register_operand" "=r")
2737 (zero_extend:HI (mem:QI (plus:SI
2738 (match_operand:SI 1 "register_operand" "+r")
2739 (match_operand:SI 2 "int5_operand" "L")))))
2740 (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))]
2741 ""
2742 "{ldbs|ldb},mb %2(%1),%0"
2743 [(set_attr "type" "load")
2744 (set_attr "length" "4")])
2745
2746 (define_insn ""
2747 [(set (mem:QI (plus:SI (match_operand:SI 0 "register_operand" "+r")
2748 (match_operand:SI 1 "int5_operand" "L")))
2749 (match_operand:QI 2 "reg_or_0_operand" "rM"))
2750 (set (match_dup 0)
2751 (plus:SI (match_dup 0) (match_dup 1)))]
2752 ""
2753 "{stbs|stb},mb %r2,%1(%0)"
2754 [(set_attr "type" "store")
2755 (set_attr "length" "4")])
2756
2757 ;; The definition of this insn does not really explain what it does,
2758 ;; but it should suffice
2759 ;; that anything generated as this insn will be recognized as one
2760 ;; and that it will not successfully combine with anything.
2761 (define_expand "movstrsi"
2762 [(parallel [(set (match_operand:BLK 0 "" "")
2763 (match_operand:BLK 1 "" ""))
2764 (clobber (match_dup 7))
2765 (clobber (match_dup 8))
2766 (clobber (match_dup 4))
2767 (clobber (match_dup 5))
2768 (clobber (match_dup 6))
2769 (use (match_operand:SI 2 "arith_operand" ""))
2770 (use (match_operand:SI 3 "const_int_operand" ""))])]
2771 "!TARGET_64BIT"
2772 "
2773 {
2774 int size, align;
2775
2776 /* HP provides very fast block move library routine for the PA;
2777 this routine includes:
2778
2779 4x4 byte at a time block moves,
2780 1x4 byte at a time with alignment checked at runtime with
2781 attempts to align the source and destination as needed
2782 1x1 byte loop
2783
2784 With that in mind, here's the heuristics to try and guess when
2785 the inlined block move will be better than the library block
2786 move:
2787
2788 If the size isn't constant, then always use the library routines.
2789
2790 If the size is large in respect to the known alignment, then use
2791 the library routines.
2792
2793 If the size is small in repsect to the known alignment, then open
2794 code the copy (since that will lead to better scheduling).
2795
2796 Else use the block move pattern. */
2797
2798 /* Undetermined size, use the library routine. */
2799 if (GET_CODE (operands[2]) != CONST_INT)
2800 FAIL;
2801
2802 size = INTVAL (operands[2]);
2803 align = INTVAL (operands[3]);
2804 align = align > 4 ? 4 : align;
2805
2806 /* If size/alignment > 8 (eg size is large in respect to alignment),
2807 then use the library routines. */
2808 if (size / align > 16)
2809 FAIL;
2810
2811 /* This does happen, but not often enough to worry much about. */
2812 if (size / align < MOVE_RATIO)
2813 FAIL;
2814
2815 /* Fall through means we're going to use our block move pattern. */
2816 operands[0]
2817 = replace_equiv_address (operands[0],
2818 copy_to_mode_reg (SImode, XEXP (operands[0], 0)));
2819 operands[1]
2820 = replace_equiv_address (operands[1],
2821 copy_to_mode_reg (SImode, XEXP (operands[1], 0)));
2822 operands[4] = gen_reg_rtx (SImode);
2823 operands[5] = gen_reg_rtx (SImode);
2824 operands[6] = gen_reg_rtx (SImode);
2825 operands[7] = XEXP (operands[0], 0);
2826 operands[8] = XEXP (operands[1], 0);
2827 }")
2828
2829 ;; The operand constraints are written like this to support both compile-time
2830 ;; and run-time determined byte count. If the count is run-time determined,
2831 ;; the register with the byte count is clobbered by the copying code, and
2832 ;; therefore it is forced to operand 2. If the count is compile-time
2833 ;; determined, we need two scratch registers for the unrolled code.
2834 (define_insn "movstrsi_internal"
2835 [(set (mem:BLK (match_operand:SI 0 "register_operand" "+r,r"))
2836 (mem:BLK (match_operand:SI 1 "register_operand" "+r,r")))
2837 (clobber (match_dup 0))
2838 (clobber (match_dup 1))
2839 (clobber (match_operand:SI 2 "register_operand" "=r,r")) ;loop cnt/tmp
2840 (clobber (match_operand:SI 3 "register_operand" "=&r,&r")) ;item tmp
2841 (clobber (match_operand:SI 6 "register_operand" "=&r,&r")) ;item tmp2
2842 (use (match_operand:SI 4 "arith_operand" "J,2")) ;byte count
2843 (use (match_operand:SI 5 "const_int_operand" "n,n"))] ;alignment
2844 "!TARGET_64BIT"
2845 "* return output_block_move (operands, !which_alternative);"
2846 [(set_attr "type" "multi,multi")])
2847 \f
2848 ;; Floating point move insns
2849
2850 ;; This pattern forces (set (reg:DF ...) (const_double ...))
2851 ;; to be reloaded by putting the constant into memory when
2852 ;; reg is a floating point register.
2853 ;;
2854 ;; For integer registers we use ldil;ldo to set the appropriate
2855 ;; value.
2856 ;;
2857 ;; This must come before the movdf pattern, and it must be present
2858 ;; to handle obscure reloading cases.
2859 (define_insn ""
2860 [(set (match_operand:DF 0 "register_operand" "=?r,f")
2861 (match_operand:DF 1 "" "?F,m"))]
2862 "GET_CODE (operands[1]) == CONST_DOUBLE
2863 && operands[1] != CONST0_RTX (DFmode)
2864 && !TARGET_64BIT
2865 && ! TARGET_SOFT_FLOAT"
2866 "* return (which_alternative == 0 ? output_move_double (operands)
2867 : \"fldd%F1 %1,%0\");"
2868 [(set_attr "type" "move,fpload")
2869 (set_attr "length" "16,4")])
2870
2871 (define_expand "movdf"
2872 [(set (match_operand:DF 0 "general_operand" "")
2873 (match_operand:DF 1 "general_operand" ""))]
2874 ""
2875 "
2876 {
2877 if (GET_CODE (operands[1]) == CONST_DOUBLE && TARGET_64BIT)
2878 operands[1] = force_const_mem (DFmode, operands[1]);
2879
2880 if (emit_move_sequence (operands, DFmode, 0))
2881 DONE;
2882 }")
2883
2884 ;; Reloading an SImode or DImode value requires a scratch register if
2885 ;; going in to or out of float point registers.
2886
2887 (define_expand "reload_indf"
2888 [(set (match_operand:DF 0 "register_operand" "=Z")
2889 (match_operand:DF 1 "non_hard_reg_operand" ""))
2890 (clobber (match_operand:DF 2 "register_operand" "=&r"))]
2891 ""
2892 "
2893 {
2894 if (emit_move_sequence (operands, DFmode, operands[2]))
2895 DONE;
2896
2897 /* We don't want the clobber emitted, so handle this ourselves. */
2898 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2899 DONE;
2900 }")
2901
2902 (define_expand "reload_outdf"
2903 [(set (match_operand:DF 0 "non_hard_reg_operand" "")
2904 (match_operand:DF 1 "register_operand" "Z"))
2905 (clobber (match_operand:DF 2 "register_operand" "=&r"))]
2906 ""
2907 "
2908 {
2909 if (emit_move_sequence (operands, DFmode, operands[2]))
2910 DONE;
2911
2912 /* We don't want the clobber emitted, so handle this ourselves. */
2913 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2914 DONE;
2915 }")
2916
2917 (define_insn ""
2918 [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
2919 "=f,*r,RQ,?o,?Q,f,*r,*r")
2920 (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
2921 "fG,*rG,f,*r,*r,RQ,o,RQ"))]
2922 "(register_operand (operands[0], DFmode)
2923 || reg_or_0_operand (operands[1], DFmode))
2924 && ! (GET_CODE (operands[1]) == CONST_DOUBLE
2925 && GET_CODE (operands[0]) == MEM)
2926 && ! TARGET_64BIT
2927 && ! TARGET_SOFT_FLOAT"
2928 "*
2929 {
2930 if (FP_REG_P (operands[0]) || FP_REG_P (operands[1])
2931 || operands[1] == CONST0_RTX (DFmode))
2932 return output_fp_move_double (operands);
2933 return output_move_double (operands);
2934 }"
2935 [(set_attr "type" "fpalu,move,fpstore,store,store,fpload,load,load")
2936 (set_attr "length" "4,8,4,8,16,4,8,16")])
2937
2938 (define_insn ""
2939 [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
2940 "=r,?o,?Q,r,r")
2941 (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
2942 "rG,r,r,o,Q"))]
2943 "(register_operand (operands[0], DFmode)
2944 || reg_or_0_operand (operands[1], DFmode))
2945 && ! TARGET_64BIT
2946 && TARGET_SOFT_FLOAT"
2947 "*
2948 {
2949 return output_move_double (operands);
2950 }"
2951 [(set_attr "type" "move,store,store,load,load")
2952 (set_attr "length" "8,8,16,8,16")])
2953
2954 (define_insn ""
2955 [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
2956 "=r,r,r,r,r,Q,*q,!f,f,*TR")
2957 (match_operand:DF 1 "move_operand"
2958 "r,J,N,K,RQ,rM,rM,!fM,*RT,f"))]
2959 "(register_operand (operands[0], DFmode)
2960 || reg_or_0_operand (operands[1], DFmode))
2961 && ! TARGET_SOFT_FLOAT && TARGET_64BIT"
2962 "@
2963 copy %1,%0
2964 ldi %1,%0
2965 ldil L'%1,%0
2966 depdi,z %z1,%0
2967 ldd%M1 %1,%0
2968 std%M0 %r1,%0
2969 mtsar %r1
2970 fcpy,dbl %f1,%0
2971 fldd%F1 %1,%0
2972 fstd%F0 %1,%0"
2973 [(set_attr "type" "move,move,move,shift,load,store,move,fpalu,fpload,fpstore")
2974 (set_attr "pa_combine_type" "addmove")
2975 (set_attr "length" "4,4,4,4,4,4,4,4,4,4")])
2976
2977 (define_insn ""
2978 [(set (match_operand:DF 0 "register_operand" "=fx")
2979 (mem:DF (plus:SI (match_operand:SI 1 "basereg_operand" "r")
2980 (match_operand:SI 2 "register_operand" "r"))))]
2981 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
2982 "{flddx|fldd} %2(%1),%0"
2983 [(set_attr "type" "fpload")
2984 (set_attr "length" "4")])
2985
2986 (define_insn ""
2987 [(set (match_operand:DF 0 "register_operand" "=fx")
2988 (mem:DF (plus:SI (match_operand:SI 1 "register_operand" "r")
2989 (match_operand:SI 2 "basereg_operand" "r"))))]
2990 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
2991 "{flddx|fldd} %1(%2),%0"
2992 [(set_attr "type" "fpload")
2993 (set_attr "length" "4")])
2994
2995 (define_insn ""
2996 [(set (mem:DF (plus:SI (match_operand:SI 1 "basereg_operand" "r")
2997 (match_operand:SI 2 "register_operand" "r")))
2998 (match_operand:DF 0 "register_operand" "fx"))]
2999 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3000 "{fstdx|fstd} %0,%2(%1)"
3001 [(set_attr "type" "fpstore")
3002 (set_attr "length" "4")])
3003
3004 (define_insn ""
3005 [(set (mem:DF (plus:SI (match_operand:SI 1 "register_operand" "r")
3006 (match_operand:SI 2 "basereg_operand" "r")))
3007 (match_operand:DF 0 "register_operand" "fx"))]
3008 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3009 "{fstdx|fstd} %0,%1(%2)"
3010 [(set_attr "type" "fpstore")
3011 (set_attr "length" "4")])
3012
3013 (define_expand "movdi"
3014 [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "")
3015 (match_operand:DI 1 "general_operand" ""))]
3016 ""
3017 "
3018 {
3019 if (GET_CODE (operands[1]) == CONST_DOUBLE && TARGET_64BIT)
3020 operands[1] = force_const_mem (DImode, operands[1]);
3021
3022 if (emit_move_sequence (operands, DImode, 0))
3023 DONE;
3024 }")
3025
3026 (define_expand "reload_indi"
3027 [(set (match_operand:DI 0 "register_operand" "=Z")
3028 (match_operand:DI 1 "non_hard_reg_operand" ""))
3029 (clobber (match_operand:SI 2 "register_operand" "=&r"))]
3030 ""
3031 "
3032 {
3033 if (emit_move_sequence (operands, DImode, operands[2]))
3034 DONE;
3035
3036 /* We don't want the clobber emitted, so handle this ourselves. */
3037 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3038 DONE;
3039 }")
3040
3041 (define_expand "reload_outdi"
3042 [(set (match_operand:DI 0 "non_hard_reg_operand" "")
3043 (match_operand:DI 1 "register_operand" "Z"))
3044 (clobber (match_operand:SI 2 "register_operand" "=&r"))]
3045 ""
3046 "
3047 {
3048 if (emit_move_sequence (operands, DImode, operands[2]))
3049 DONE;
3050
3051 /* We don't want the clobber emitted, so handle this ourselves. */
3052 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3053 DONE;
3054 }")
3055
3056 (define_insn ""
3057 [(set (match_operand:DI 0 "register_operand" "=r")
3058 (high:DI (match_operand 1 "" "")))]
3059 "!TARGET_64BIT"
3060 "*
3061 {
3062 rtx op0 = operands[0];
3063 rtx op1 = operands[1];
3064
3065 if (GET_CODE (op1) == CONST_INT)
3066 {
3067 operands[0] = operand_subword (op0, 1, 0, DImode);
3068 output_asm_insn (\"ldil L'%1,%0\", operands);
3069
3070 operands[0] = operand_subword (op0, 0, 0, DImode);
3071 if (INTVAL (op1) < 0)
3072 output_asm_insn (\"ldi -1,%0\", operands);
3073 else
3074 output_asm_insn (\"ldi 0,%0\", operands);
3075 return \"\";
3076 }
3077 else if (GET_CODE (op1) == CONST_DOUBLE)
3078 {
3079 operands[0] = operand_subword (op0, 1, 0, DImode);
3080 operands[1] = GEN_INT (CONST_DOUBLE_LOW (op1));
3081 output_asm_insn (\"ldil L'%1,%0\", operands);
3082
3083 operands[0] = operand_subword (op0, 0, 0, DImode);
3084 operands[1] = GEN_INT (CONST_DOUBLE_HIGH (op1));
3085 output_asm_insn (singlemove_string (operands), operands);
3086 return \"\";
3087 }
3088 else
3089 abort ();
3090 }"
3091 [(set_attr "type" "move")
3092 (set_attr "length" "8")])
3093
3094 (define_insn ""
3095 [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
3096 "=r,o,Q,r,r,r,f,f,*TR")
3097 (match_operand:DI 1 "general_operand"
3098 "rM,r,r,o*R,Q,i,fM,*TR,f"))]
3099 "(register_operand (operands[0], DImode)
3100 || reg_or_0_operand (operands[1], DImode))
3101 && ! TARGET_64BIT
3102 && ! TARGET_SOFT_FLOAT"
3103 "*
3104 {
3105 if (FP_REG_P (operands[0]) || FP_REG_P (operands[1])
3106 || (operands[1] == CONST0_RTX (DImode)))
3107 return output_fp_move_double (operands);
3108 return output_move_double (operands);
3109 }"
3110 [(set_attr "type" "move,store,store,load,load,multi,fpalu,fpload,fpstore")
3111 (set_attr "length" "8,8,16,8,16,16,4,4,4")])
3112
3113 (define_insn ""
3114 [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
3115 "=r,r,r,r,r,r,Q,*q,!f,f,*TR")
3116 (match_operand:DI 1 "move_operand"
3117 "A,r,J,N,K,RQ,rM,rM,!fM,*RT,f"))]
3118 "(register_operand (operands[0], DImode)
3119 || reg_or_0_operand (operands[1], DImode))
3120 && ! TARGET_SOFT_FLOAT && TARGET_64BIT"
3121 "@
3122 ldd RT'%A1,%0
3123 copy %1,%0
3124 ldi %1,%0
3125 ldil L'%1,%0
3126 depdi,z %z1,%0
3127 ldd%M1 %1,%0
3128 std%M0 %r1,%0
3129 mtsar %r1
3130 fcpy,dbl %f1,%0
3131 fldd%F1 %1,%0
3132 fstd%F0 %1,%0"
3133 [(set_attr "type" "load,move,move,move,shift,load,store,move,fpalu,fpload,fpstore")
3134 (set_attr "pa_combine_type" "addmove")
3135 (set_attr "length" "4,4,4,4,4,4,4,4,4,4,4")])
3136
3137 (define_insn ""
3138 [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
3139 "=r,o,Q,r,r,r")
3140 (match_operand:DI 1 "general_operand"
3141 "rM,r,r,o,Q,i"))]
3142 "(register_operand (operands[0], DImode)
3143 || reg_or_0_operand (operands[1], DImode))
3144 && ! TARGET_64BIT
3145 && TARGET_SOFT_FLOAT"
3146 "*
3147 {
3148 return output_move_double (operands);
3149 }"
3150 [(set_attr "type" "move,store,store,load,load,multi")
3151 (set_attr "length" "8,8,16,8,16,16")])
3152
3153 (define_insn ""
3154 [(set (match_operand:DI 0 "register_operand" "=r,&r")
3155 (lo_sum:DI (match_operand:DI 1 "register_operand" "0,r")
3156 (match_operand:DI 2 "immediate_operand" "i,i")))]
3157 "!TARGET_64BIT"
3158 "*
3159 {
3160 /* Don't output a 64 bit constant, since we can't trust the assembler to
3161 handle it correctly. */
3162 if (GET_CODE (operands[2]) == CONST_DOUBLE)
3163 operands[2] = GEN_INT (CONST_DOUBLE_LOW (operands[2]));
3164 if (which_alternative == 1)
3165 output_asm_insn (\"copy %1,%0\", operands);
3166 return \"ldo R'%G2(%R1),%R0\";
3167 }"
3168 [(set_attr "type" "move,move")
3169 (set_attr "length" "4,8")])
3170
3171 ;; This pattern forces (set (reg:SF ...) (const_double ...))
3172 ;; to be reloaded by putting the constant into memory when
3173 ;; reg is a floating point register.
3174 ;;
3175 ;; For integer registers we use ldil;ldo to set the appropriate
3176 ;; value.
3177 ;;
3178 ;; This must come before the movsf pattern, and it must be present
3179 ;; to handle obscure reloading cases.
3180 (define_insn ""
3181 [(set (match_operand:SF 0 "register_operand" "=?r,f")
3182 (match_operand:SF 1 "" "?F,m"))]
3183 "GET_CODE (operands[1]) == CONST_DOUBLE
3184 && operands[1] != CONST0_RTX (SFmode)
3185 && ! TARGET_SOFT_FLOAT"
3186 "* return (which_alternative == 0 ? singlemove_string (operands)
3187 : \" fldw%F1 %1,%0\");"
3188 [(set_attr "type" "move,fpload")
3189 (set_attr "length" "8,4")])
3190
3191 (define_expand "movsf"
3192 [(set (match_operand:SF 0 "general_operand" "")
3193 (match_operand:SF 1 "general_operand" ""))]
3194 ""
3195 "
3196 {
3197 if (emit_move_sequence (operands, SFmode, 0))
3198 DONE;
3199 }")
3200
3201 ;; Reloading an SImode or DImode value requires a scratch register if
3202 ;; going in to or out of float point registers.
3203
3204 (define_expand "reload_insf"
3205 [(set (match_operand:SF 0 "register_operand" "=Z")
3206 (match_operand:SF 1 "non_hard_reg_operand" ""))
3207 (clobber (match_operand:SF 2 "register_operand" "=&r"))]
3208 ""
3209 "
3210 {
3211 if (emit_move_sequence (operands, SFmode, operands[2]))
3212 DONE;
3213
3214 /* We don't want the clobber emitted, so handle this ourselves. */
3215 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3216 DONE;
3217 }")
3218
3219 (define_expand "reload_outsf"
3220 [(set (match_operand:SF 0 "non_hard_reg_operand" "")
3221 (match_operand:SF 1 "register_operand" "Z"))
3222 (clobber (match_operand:SF 2 "register_operand" "=&r"))]
3223 ""
3224 "
3225 {
3226 if (emit_move_sequence (operands, SFmode, operands[2]))
3227 DONE;
3228
3229 /* We don't want the clobber emitted, so handle this ourselves. */
3230 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3231 DONE;
3232 }")
3233
3234 (define_insn ""
3235 [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand"
3236 "=f,r,f,r,RQ,Q")
3237 (match_operand:SF 1 "reg_or_0_or_nonsymb_mem_operand"
3238 "fG,rG,RQ,RQ,f,rG"))]
3239 "(register_operand (operands[0], SFmode)
3240 || reg_or_0_operand (operands[1], SFmode))
3241 && ! TARGET_SOFT_FLOAT"
3242 "@
3243 fcpy,sgl %f1,%0
3244 copy %r1,%0
3245 fldw%F1 %1,%0
3246 ldw%M1 %1,%0
3247 fstw%F0 %r1,%0
3248 stw%M0 %r1,%0"
3249 [(set_attr "type" "fpalu,move,fpload,load,fpstore,store")
3250 (set_attr "pa_combine_type" "addmove")
3251 (set_attr "length" "4,4,4,4,4,4")])
3252
3253 (define_insn ""
3254 [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand"
3255 "=r,r,Q")
3256 (match_operand:SF 1 "reg_or_0_or_nonsymb_mem_operand"
3257 "rG,RQ,rG"))]
3258 "(register_operand (operands[0], SFmode)
3259 || reg_or_0_operand (operands[1], SFmode))
3260 && TARGET_SOFT_FLOAT"
3261 "@
3262 copy %r1,%0
3263 ldw%M1 %1,%0
3264 stw%M0 %r1,%0"
3265 [(set_attr "type" "move,load,store")
3266 (set_attr "pa_combine_type" "addmove")
3267 (set_attr "length" "4,4,4")])
3268
3269 (define_insn ""
3270 [(set (match_operand:SF 0 "register_operand" "=fx")
3271 (mem:SF (plus:SI (match_operand:SI 1 "basereg_operand" "r")
3272 (match_operand:SI 2 "register_operand" "r"))))]
3273 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3274 "{fldwx|fldw} %2(%1),%0"
3275 [(set_attr "type" "fpload")
3276 (set_attr "length" "4")])
3277
3278 (define_insn ""
3279 [(set (match_operand:SF 0 "register_operand" "=fx")
3280 (mem:SF (plus:SI (match_operand:SI 1 "register_operand" "r")
3281 (match_operand:SI 2 "basereg_operand" "r"))))]
3282 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3283 "{fldwx|fldw} %1(%2),%0"
3284 [(set_attr "type" "fpload")
3285 (set_attr "length" "4")])
3286
3287 (define_insn ""
3288 [(set (mem:SF (plus:SI (match_operand:SI 1 "basereg_operand" "r")
3289 (match_operand:SI 2 "register_operand" "r")))
3290 (match_operand:SF 0 "register_operand" "fx"))]
3291 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3292 "{fstwx|fstw} %0,%2(%1)"
3293 [(set_attr "type" "fpstore")
3294 (set_attr "length" "4")])
3295 \f
3296 (define_insn ""
3297 [(set (mem:SF (plus:SI (match_operand:SI 1 "register_operand" "r")
3298 (match_operand:SI 2 "basereg_operand" "r")))
3299 (match_operand:SF 0 "register_operand" "fx"))]
3300 "! TARGET_DISABLE_INDEXING && ! TARGET_SOFT_FLOAT"
3301 "{fstwx|fstw} %0,%1(%2)"
3302 [(set_attr "type" "fpstore")
3303 (set_attr "length" "4")])
3304 \f
3305
3306 ;;- zero extension instructions
3307 ;; We have define_expand for zero extension patterns to make sure the
3308 ;; operands get loaded into registers. The define_insns accept
3309 ;; memory operands. This gives us better overall code than just
3310 ;; having a pattern that does or does not accept memory operands.
3311
3312 (define_expand "zero_extendhisi2"
3313 [(set (match_operand:SI 0 "register_operand" "")
3314 (zero_extend:SI
3315 (match_operand:HI 1 "register_operand" "")))]
3316 ""
3317 "")
3318
3319 (define_insn ""
3320 [(set (match_operand:SI 0 "register_operand" "=r,r")
3321 (zero_extend:SI
3322 (match_operand:HI 1 "move_operand" "r,RQ")))]
3323 "GET_CODE (operands[1]) != CONST_INT"
3324 "@
3325 {extru|extrw,u} %1,31,16,%0
3326 ldh%M1 %1,%0"
3327 [(set_attr "type" "shift,load")
3328 (set_attr "length" "4,4")])
3329
3330 (define_expand "zero_extendqihi2"
3331 [(set (match_operand:HI 0 "register_operand" "")
3332 (zero_extend:HI
3333 (match_operand:QI 1 "register_operand" "")))]
3334 ""
3335 "")
3336
3337 (define_insn ""
3338 [(set (match_operand:HI 0 "register_operand" "=r,r")
3339 (zero_extend:HI
3340 (match_operand:QI 1 "move_operand" "r,RQ")))]
3341 "GET_CODE (operands[1]) != CONST_INT"
3342 "@
3343 {extru|extrw,u} %1,31,8,%0
3344 ldb%M1 %1,%0"
3345 [(set_attr "type" "shift,load")
3346 (set_attr "length" "4,4")])
3347
3348 (define_expand "zero_extendqisi2"
3349 [(set (match_operand:SI 0 "register_operand" "")
3350 (zero_extend:SI
3351 (match_operand:QI 1 "register_operand" "")))]
3352 ""
3353 "")
3354
3355 (define_insn ""
3356 [(set (match_operand:SI 0 "register_operand" "=r,r")
3357 (zero_extend:SI
3358 (match_operand:QI 1 "move_operand" "r,RQ")))]
3359 "GET_CODE (operands[1]) != CONST_INT"
3360 "@
3361 {extru|extrw,u} %1,31,8,%0
3362 ldb%M1 %1,%0"
3363 [(set_attr "type" "shift,load")
3364 (set_attr "length" "4,4")])
3365
3366 (define_insn "zero_extendqidi2"
3367 [(set (match_operand:DI 0 "register_operand" "=r")
3368 (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
3369 "TARGET_64BIT"
3370 "extrd,u %1,63,8,%0"
3371 [(set_attr "type" "shift")
3372 (set_attr "length" "4")])
3373
3374 (define_insn "zero_extendhidi2"
3375 [(set (match_operand:DI 0 "register_operand" "=r")
3376 (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
3377 "TARGET_64BIT"
3378 "extrd,u %1,63,16,%0"
3379 [(set_attr "type" "shift")
3380 (set_attr "length" "4")])
3381
3382 (define_insn "zero_extendsidi2"
3383 [(set (match_operand:DI 0 "register_operand" "=r")
3384 (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
3385 "TARGET_64BIT"
3386 "extrd,u %1,63,32,%0"
3387 [(set_attr "type" "shift")
3388 (set_attr "length" "4")])
3389
3390 ;;- sign extension instructions
3391
3392 (define_insn "extendhisi2"
3393 [(set (match_operand:SI 0 "register_operand" "=r")
3394 (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
3395 ""
3396 "{extrs|extrw,s} %1,31,16,%0"
3397 [(set_attr "type" "shift")
3398 (set_attr "length" "4")])
3399
3400 (define_insn "extendqihi2"
3401 [(set (match_operand:HI 0 "register_operand" "=r")
3402 (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]
3403 ""
3404 "{extrs|extrw,s} %1,31,8,%0"
3405 [(set_attr "type" "shift")
3406 (set_attr "length" "4")])
3407
3408 (define_insn "extendqisi2"
3409 [(set (match_operand:SI 0 "register_operand" "=r")
3410 (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]
3411 ""
3412 "{extrs|extrw,s} %1,31,8,%0"
3413 [(set_attr "type" "shift")
3414 (set_attr "length" "4")])
3415
3416 (define_insn "extendqidi2"
3417 [(set (match_operand:DI 0 "register_operand" "=r")
3418 (sign_extend:DI (match_operand:QI 1 "register_operand" "r")))]
3419 "TARGET_64BIT"
3420 "extrd,s %1,63,8,%0"
3421 [(set_attr "type" "shift")
3422 (set_attr "length" "4")])
3423
3424 (define_insn "extendhidi2"
3425 [(set (match_operand:DI 0 "register_operand" "=r")
3426 (sign_extend:DI (match_operand:HI 1 "register_operand" "r")))]
3427 "TARGET_64BIT"
3428 "extrd,s %1,63,16,%0"
3429 [(set_attr "type" "shift")
3430 (set_attr "length" "4")])
3431
3432 (define_insn "extendsidi2"
3433 [(set (match_operand:DI 0 "register_operand" "=r")
3434 (sign_extend:DI (match_operand:SI 1 "register_operand" "r")))]
3435 "TARGET_64BIT"
3436 "extrd,s %1,63,32,%0"
3437 [(set_attr "type" "shift")
3438 (set_attr "length" "4")])
3439
3440 \f
3441 ;; Conversions between float and double.
3442
3443 (define_insn "extendsfdf2"
3444 [(set (match_operand:DF 0 "register_operand" "=f")
3445 (float_extend:DF
3446 (match_operand:SF 1 "register_operand" "f")))]
3447 "! TARGET_SOFT_FLOAT"
3448 "{fcnvff|fcnv},sgl,dbl %1,%0"
3449 [(set_attr "type" "fpalu")
3450 (set_attr "length" "4")])
3451
3452 (define_insn "truncdfsf2"
3453 [(set (match_operand:SF 0 "register_operand" "=f")
3454 (float_truncate:SF
3455 (match_operand:DF 1 "register_operand" "f")))]
3456 "! TARGET_SOFT_FLOAT"
3457 "{fcnvff|fcnv},dbl,sgl %1,%0"
3458 [(set_attr "type" "fpalu")
3459 (set_attr "length" "4")])
3460
3461 ;; Conversion between fixed point and floating point.
3462 ;; Note that among the fix-to-float insns
3463 ;; the ones that start with SImode come first.
3464 ;; That is so that an operand that is a CONST_INT
3465 ;; (and therefore lacks a specific machine mode).
3466 ;; will be recognized as SImode (which is always valid)
3467 ;; rather than as QImode or HImode.
3468
3469 ;; This pattern forces (set (reg:SF ...) (float:SF (const_int ...)))
3470 ;; to be reloaded by putting the constant into memory.
3471 ;; It must come before the more general floatsisf2 pattern.
3472 (define_insn ""
3473 [(set (match_operand:SF 0 "register_operand" "=f")
3474 (float:SF (match_operand:SI 1 "const_int_operand" "m")))]
3475 "! TARGET_SOFT_FLOAT"
3476 "fldw%F1 %1,%0\;{fcnvxf,sgl,sgl|fcnv,w,sgl} %0,%0"
3477 [(set_attr "type" "fpalu")
3478 (set_attr "length" "8")])
3479
3480 (define_insn "floatsisf2"
3481 [(set (match_operand:SF 0 "register_operand" "=f")
3482 (float:SF (match_operand:SI 1 "register_operand" "f")))]
3483 "! TARGET_SOFT_FLOAT"
3484 "{fcnvxf,sgl,sgl|fcnv,w,sgl} %1,%0"
3485 [(set_attr "type" "fpalu")
3486 (set_attr "length" "4")])
3487
3488 ;; This pattern forces (set (reg:DF ...) (float:DF (const_int ...)))
3489 ;; to be reloaded by putting the constant into memory.
3490 ;; It must come before the more general floatsidf2 pattern.
3491 (define_insn ""
3492 [(set (match_operand:DF 0 "register_operand" "=f")
3493 (float:DF (match_operand:SI 1 "const_int_operand" "m")))]
3494 "! TARGET_SOFT_FLOAT"
3495 "fldw%F1 %1,%0\;{fcnvxf,sgl,dbl|fcnv,w,dbl} %0,%0"
3496 [(set_attr "type" "fpalu")
3497 (set_attr "length" "8")])
3498
3499 (define_insn "floatsidf2"
3500 [(set (match_operand:DF 0 "register_operand" "=f")
3501 (float:DF (match_operand:SI 1 "register_operand" "f")))]
3502 "! TARGET_SOFT_FLOAT"
3503 "{fcnvxf,sgl,dbl|fcnv,w,dbl} %1,%0"
3504 [(set_attr "type" "fpalu")
3505 (set_attr "length" "4")])
3506
3507 (define_expand "floatunssisf2"
3508 [(set (subreg:SI (match_dup 2) 4)
3509 (match_operand:SI 1 "register_operand" ""))
3510 (set (subreg:SI (match_dup 2) 0)
3511 (const_int 0))
3512 (set (match_operand:SF 0 "register_operand" "")
3513 (float:SF (match_dup 2)))]
3514 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3515 "
3516 {
3517 if (TARGET_PA_20)
3518 {
3519 emit_insn (gen_floatunssisf2_pa20 (operands[0], operands[1]));
3520 DONE;
3521 }
3522 operands[2] = gen_reg_rtx (DImode);
3523 }")
3524
3525 (define_expand "floatunssidf2"
3526 [(set (subreg:SI (match_dup 2) 4)
3527 (match_operand:SI 1 "register_operand" ""))
3528 (set (subreg:SI (match_dup 2) 0)
3529 (const_int 0))
3530 (set (match_operand:DF 0 "register_operand" "")
3531 (float:DF (match_dup 2)))]
3532 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3533 "
3534 {
3535 if (TARGET_PA_20)
3536 {
3537 emit_insn (gen_floatunssidf2_pa20 (operands[0], operands[1]));
3538 DONE;
3539 }
3540 operands[2] = gen_reg_rtx (DImode);
3541 }")
3542
3543 (define_insn "floatdisf2"
3544 [(set (match_operand:SF 0 "register_operand" "=f")
3545 (float:SF (match_operand:DI 1 "register_operand" "f")))]
3546 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3547 "{fcnvxf,dbl,sgl|fcnv,dw,sgl} %1,%0"
3548 [(set_attr "type" "fpalu")
3549 (set_attr "length" "4")])
3550
3551 (define_insn "floatdidf2"
3552 [(set (match_operand:DF 0 "register_operand" "=f")
3553 (float:DF (match_operand:DI 1 "register_operand" "f")))]
3554 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3555 "{fcnvxf,dbl,dbl|fcnv,dw,dbl} %1,%0"
3556 [(set_attr "type" "fpalu")
3557 (set_attr "length" "4")])
3558
3559 ;; Convert a float to an actual integer.
3560 ;; Truncation is performed as part of the conversion.
3561
3562 (define_insn "fix_truncsfsi2"
3563 [(set (match_operand:SI 0 "register_operand" "=f")
3564 (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
3565 "! TARGET_SOFT_FLOAT"
3566 "{fcnvfxt,sgl,sgl|fcnv,t,sgl,w} %1,%0"
3567 [(set_attr "type" "fpalu")
3568 (set_attr "length" "4")])
3569
3570 (define_insn "fix_truncdfsi2"
3571 [(set (match_operand:SI 0 "register_operand" "=f")
3572 (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
3573 "! TARGET_SOFT_FLOAT"
3574 "{fcnvfxt,dbl,sgl|fcnv,t,dbl,w} %1,%0"
3575 [(set_attr "type" "fpalu")
3576 (set_attr "length" "4")])
3577
3578 (define_insn "fix_truncsfdi2"
3579 [(set (match_operand:DI 0 "register_operand" "=f")
3580 (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
3581 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3582 "{fcnvfxt,sgl,dbl|fcnv,t,sgl,dw} %1,%0"
3583 [(set_attr "type" "fpalu")
3584 (set_attr "length" "4")])
3585
3586 (define_insn "fix_truncdfdi2"
3587 [(set (match_operand:DI 0 "register_operand" "=f")
3588 (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
3589 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT"
3590 "{fcnvfxt,dbl,dbl|fcnv,t,dbl,dw} %1,%0"
3591 [(set_attr "type" "fpalu")
3592 (set_attr "length" "4")])
3593
3594 (define_insn "floatunssidf2_pa20"
3595 [(set (match_operand:DF 0 "register_operand" "=f")
3596 (unsigned_float:DF (match_operand:SI 1 "register_operand" "f")))]
3597 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3598 "fcnv,uw,dbl %1,%0"
3599 [(set_attr "type" "fpalu")
3600 (set_attr "length" "4")])
3601
3602 (define_insn "floatunssisf2_pa20"
3603 [(set (match_operand:SF 0 "register_operand" "=f")
3604 (unsigned_float:SF (match_operand:SI 1 "register_operand" "f")))]
3605 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3606 "fcnv,uw,sgl %1,%0"
3607 [(set_attr "type" "fpalu")
3608 (set_attr "length" "4")])
3609
3610 (define_insn "floatunsdisf2"
3611 [(set (match_operand:SF 0 "register_operand" "=f")
3612 (unsigned_float:SF (match_operand:DI 1 "register_operand" "f")))]
3613 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3614 "fcnv,udw,sgl %1,%0"
3615 [(set_attr "type" "fpalu")
3616 (set_attr "length" "4")])
3617
3618 (define_insn "floatunsdidf2"
3619 [(set (match_operand:DF 0 "register_operand" "=f")
3620 (unsigned_float:DF (match_operand:DI 1 "register_operand" "f")))]
3621 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3622 "fcnv,udw,dbl %1,%0"
3623 [(set_attr "type" "fpalu")
3624 (set_attr "length" "4")])
3625
3626 (define_insn "fixuns_truncsfsi2"
3627 [(set (match_operand:SI 0 "register_operand" "=f")
3628 (unsigned_fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
3629 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3630 "fcnv,t,sgl,uw %1,%0"
3631 [(set_attr "type" "fpalu")
3632 (set_attr "length" "4")])
3633
3634 (define_insn "fixuns_truncdfsi2"
3635 [(set (match_operand:SI 0 "register_operand" "=f")
3636 (unsigned_fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
3637 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3638 "fcnv,t,dbl,uw %1,%0"
3639 [(set_attr "type" "fpalu")
3640 (set_attr "length" "4")])
3641
3642 (define_insn "fixuns_truncsfdi2"
3643 [(set (match_operand:DI 0 "register_operand" "=f")
3644 (unsigned_fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
3645 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3646 "fcnv,t,sgl,udw %1,%0"
3647 [(set_attr "type" "fpalu")
3648 (set_attr "length" "4")])
3649
3650 (define_insn "fixuns_truncdfdi2"
3651 [(set (match_operand:DI 0 "register_operand" "=f")
3652 (unsigned_fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
3653 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
3654 "fcnv,t,dbl,udw %1,%0"
3655 [(set_attr "type" "fpalu")
3656 (set_attr "length" "4")])
3657 \f
3658 ;;- arithmetic instructions
3659
3660 (define_expand "adddi3"
3661 [(set (match_operand:DI 0 "register_operand" "")
3662 (plus:DI (match_operand:DI 1 "register_operand" "")
3663 (match_operand:DI 2 "arith_operand" "")))]
3664 ""
3665 "")
3666
3667 ;; We allow arith_operand for operands2, even though strictly speaking it
3668 ;; we would prefer to us arith11_operand since that's what the hardware
3669 ;; can actually support.
3670 ;;
3671 ;; But the price of the extra reload in that case is worth the simplicity
3672 ;; we get by allowing a trivial adddi3 expander to be used for both
3673 ;; PA64 and PA32.
3674
3675 (define_insn ""
3676 [(set (match_operand:DI 0 "register_operand" "=r")
3677 (plus:DI (match_operand:DI 1 "register_operand" "%r")
3678 (match_operand:DI 2 "arith_operand" "rI")))]
3679 "!TARGET_64BIT"
3680 "*
3681 {
3682 if (GET_CODE (operands[2]) == CONST_INT)
3683 {
3684 if (INTVAL (operands[2]) >= 0)
3685 return \"addi %2,%R1,%R0\;{addc|add,c} %1,%%r0,%0\";
3686 else
3687 return \"addi %2,%R1,%R0\;{subb|sub,b} %1,%%r0,%0\";
3688 }
3689 else
3690 return \"add %R2,%R1,%R0\;{addc|add,c} %2,%1,%0\";
3691 }"
3692 [(set_attr "type" "binary")
3693 (set_attr "length" "8")])
3694
3695 (define_insn ""
3696 [(set (match_operand:DI 0 "register_operand" "=r,r")
3697 (plus:DI (match_operand:DI 1 "register_operand" "%r,r")
3698 (match_operand:DI 2 "arith_operand" "r,J")))]
3699 "TARGET_64BIT"
3700 "@
3701 {addl|add,l} %1,%2,%0
3702 ldo %2(%1),%0"
3703 [(set_attr "type" "binary,binary")
3704 (set_attr "pa_combine_type" "addmove")
3705 (set_attr "length" "4,4")])
3706
3707 (define_insn ""
3708 [(set (match_operand:DI 0 "register_operand" "=r")
3709 (plus:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
3710 (match_operand:DI 2 "register_operand" "r")))]
3711 "TARGET_64BIT"
3712 "uaddcm %2,%1,%0"
3713 [(set_attr "type" "binary")
3714 (set_attr "length" "4")])
3715
3716 (define_insn ""
3717 [(set (match_operand:SI 0 "register_operand" "=r")
3718 (plus:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
3719 (match_operand:SI 2 "register_operand" "r")))]
3720 ""
3721 "uaddcm %2,%1,%0"
3722 [(set_attr "type" "binary")
3723 (set_attr "length" "4")])
3724
3725 ;; define_splits to optimize cases of adding a constant integer
3726 ;; to a register when the constant does not fit in 14 bits. */
3727 (define_split
3728 [(set (match_operand:SI 0 "register_operand" "")
3729 (plus:SI (match_operand:SI 1 "register_operand" "")
3730 (match_operand:SI 2 "const_int_operand" "")))
3731 (clobber (match_operand:SI 4 "register_operand" ""))]
3732 "! cint_ok_for_move (INTVAL (operands[2]))
3733 && VAL_14_BITS_P (INTVAL (operands[2]) >> 1)"
3734 [(set (match_dup 4) (plus:SI (match_dup 1) (match_dup 2)))
3735 (set (match_dup 0) (plus:SI (match_dup 4) (match_dup 3)))]
3736 "
3737 {
3738 int val = INTVAL (operands[2]);
3739 int low = (val < 0) ? -0x2000 : 0x1fff;
3740 int rest = val - low;
3741
3742 operands[2] = GEN_INT (rest);
3743 operands[3] = GEN_INT (low);
3744 }")
3745
3746 (define_split
3747 [(set (match_operand:SI 0 "register_operand" "")
3748 (plus:SI (match_operand:SI 1 "register_operand" "")
3749 (match_operand:SI 2 "const_int_operand" "")))
3750 (clobber (match_operand:SI 4 "register_operand" ""))]
3751 "! cint_ok_for_move (INTVAL (operands[2]))"
3752 [(set (match_dup 4) (match_dup 2))
3753 (set (match_dup 0) (plus:SI (mult:SI (match_dup 4) (match_dup 3))
3754 (match_dup 1)))]
3755 "
3756 {
3757 HOST_WIDE_INT intval = INTVAL (operands[2]);
3758
3759 /* Try dividing the constant by 2, then 4, and finally 8 to see
3760 if we can get a constant which can be loaded into a register
3761 in a single instruction (cint_ok_for_move).
3762
3763 If that fails, try to negate the constant and subtract it
3764 from our input operand. */
3765 if (intval % 2 == 0 && cint_ok_for_move (intval / 2))
3766 {
3767 operands[2] = GEN_INT (intval / 2);
3768 operands[3] = GEN_INT (2);
3769 }
3770 else if (intval % 4 == 0 && cint_ok_for_move (intval / 4))
3771 {
3772 operands[2] = GEN_INT (intval / 4);
3773 operands[3] = GEN_INT (4);
3774 }
3775 else if (intval % 8 == 0 && cint_ok_for_move (intval / 8))
3776 {
3777 operands[2] = GEN_INT (intval / 8);
3778 operands[3] = GEN_INT (8);
3779 }
3780 else if (cint_ok_for_move (-intval))
3781 {
3782 emit_insn (gen_rtx_SET (VOIDmode, operands[4], GEN_INT (-intval)));
3783 emit_insn (gen_subsi3 (operands[0], operands[1], operands[4]));
3784 DONE;
3785 }
3786 else
3787 FAIL;
3788 }")
3789
3790 (define_insn "addsi3"
3791 [(set (match_operand:SI 0 "register_operand" "=r,r")
3792 (plus:SI (match_operand:SI 1 "register_operand" "%r,r")
3793 (match_operand:SI 2 "arith_operand" "r,J")))]
3794 ""
3795 "@
3796 {addl|add,l} %1,%2,%0
3797 ldo %2(%1),%0"
3798 [(set_attr "type" "binary,binary")
3799 (set_attr "pa_combine_type" "addmove")
3800 (set_attr "length" "4,4")])
3801
3802 (define_expand "subdi3"
3803 [(set (match_operand:DI 0 "register_operand" "")
3804 (minus:DI (match_operand:DI 1 "register_operand" "")
3805 (match_operand:DI 2 "register_operand" "")))]
3806 ""
3807 "")
3808
3809 (define_insn ""
3810 [(set (match_operand:DI 0 "register_operand" "=r")
3811 (minus:DI (match_operand:DI 1 "register_operand" "r")
3812 (match_operand:DI 2 "register_operand" "r")))]
3813 "!TARGET_64BIT"
3814 "sub %R1,%R2,%R0\;{subb|sub,b} %1,%2,%0"
3815 [(set_attr "type" "binary")
3816 (set_attr "length" "8")])
3817
3818 (define_insn ""
3819 [(set (match_operand:DI 0 "register_operand" "=r,r,q")
3820 (minus:DI (match_operand:DI 1 "arith11_operand" "r,I,U")
3821 (match_operand:DI 2 "register_operand" "r,r,r")))]
3822 "TARGET_64BIT"
3823 "@
3824 sub %1,%2,%0
3825 subi %1,%2,%0
3826 mtsarcm %2"
3827 [(set_attr "type" "binary,binary,move")
3828 (set_attr "length" "4,4,4")])
3829
3830 (define_expand "subsi3"
3831 [(set (match_operand:SI 0 "register_operand" "")
3832 (minus:SI (match_operand:SI 1 "arith11_operand" "")
3833 (match_operand:SI 2 "register_operand" "")))]
3834 ""
3835 "")
3836
3837 (define_insn ""
3838 [(set (match_operand:SI 0 "register_operand" "=r,r")
3839 (minus:SI (match_operand:SI 1 "arith11_operand" "r,I")
3840 (match_operand:SI 2 "register_operand" "r,r")))]
3841 "!TARGET_PA_20"
3842 "@
3843 sub %1,%2,%0
3844 subi %1,%2,%0"
3845 [(set_attr "type" "binary,binary")
3846 (set_attr "length" "4,4")])
3847
3848 (define_insn ""
3849 [(set (match_operand:SI 0 "register_operand" "=r,r,q")
3850 (minus:SI (match_operand:SI 1 "arith11_operand" "r,I,S")
3851 (match_operand:SI 2 "register_operand" "r,r,r")))]
3852 "TARGET_PA_20"
3853 "@
3854 sub %1,%2,%0
3855 subi %1,%2,%0
3856 mtsarcm %2"
3857 [(set_attr "type" "binary,binary,move")
3858 (set_attr "length" "4,4,4")])
3859
3860 ;; Clobbering a "register_operand" instead of a match_scratch
3861 ;; in operand3 of millicode calls avoids spilling %r1 and
3862 ;; produces better code.
3863
3864 ;; The mulsi3 insns set up registers for the millicode call.
3865 (define_expand "mulsi3"
3866 [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
3867 (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
3868 (parallel [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
3869 (clobber (match_dup 3))
3870 (clobber (reg:SI 26))
3871 (clobber (reg:SI 25))
3872 (clobber (match_dup 4))])
3873 (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
3874 ""
3875 "
3876 {
3877 operands[4] = gen_rtx_REG (SImode, TARGET_64BIT ? 2 : 31);
3878 if (TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT)
3879 {
3880 rtx scratch = gen_reg_rtx (DImode);
3881 operands[1] = force_reg (SImode, operands[1]);
3882 operands[2] = force_reg (SImode, operands[2]);
3883 emit_insn (gen_umulsidi3 (scratch, operands[1], operands[2]));
3884 /* We do not want (subreg:SI (XX:DI) 1)) for TARGET_64BIT since
3885 that has no real meaning. */
3886 if (TARGET_64BIT)
3887 {
3888 emit_insn (gen_rtx_SET (VOIDmode,
3889 operands[0],
3890 gen_rtx_SUBREG (SImode, scratch, 0)));
3891 DONE;
3892
3893 }
3894 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3895 gen_rtx_SUBREG (SImode, scratch, GET_MODE_SIZE (SImode))));
3896 DONE;
3897 }
3898 operands[3] = gen_reg_rtx (SImode);
3899 }")
3900
3901 (define_insn "umulsidi3"
3902 [(set (match_operand:DI 0 "nonimmediate_operand" "=f")
3903 (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
3904 (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "f"))))]
3905 "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT"
3906 "xmpyu %1,%2,%0"
3907 [(set_attr "type" "fpmuldbl")
3908 (set_attr "length" "4")])
3909
3910 (define_insn ""
3911 [(set (match_operand:DI 0 "nonimmediate_operand" "=f")
3912 (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
3913 (match_operand:DI 2 "uint32_operand" "f")))]
3914 "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && !TARGET_64BIT"
3915 "xmpyu %1,%R2,%0"
3916 [(set_attr "type" "fpmuldbl")
3917 (set_attr "length" "4")])
3918
3919 (define_insn ""
3920 [(set (match_operand:DI 0 "nonimmediate_operand" "=f")
3921 (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
3922 (match_operand:DI 2 "uint32_operand" "f")))]
3923 "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && TARGET_64BIT"
3924 "xmpyu %1,%2R,%0"
3925 [(set_attr "type" "fpmuldbl")
3926 (set_attr "length" "4")])
3927
3928 (define_insn ""
3929 [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
3930 (clobber (match_operand:SI 0 "register_operand" "=a"))
3931 (clobber (reg:SI 26))
3932 (clobber (reg:SI 25))
3933 (clobber (reg:SI 31))]
3934 "!TARGET_64BIT"
3935 "* return output_mul_insn (0, insn);"
3936 [(set_attr "type" "milli")
3937 (set (attr "length")
3938 (cond [
3939 ;; Target (or stub) within reach
3940 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
3941 (const_int 240000))
3942 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
3943 (const_int 0)))
3944 (const_int 4)
3945
3946 ;; Out of reach PIC
3947 (ne (symbol_ref "flag_pic")
3948 (const_int 0))
3949 (const_int 24)
3950
3951 ;; Out of reach PORTABLE_RUNTIME
3952 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
3953 (const_int 0))
3954 (const_int 20)]
3955
3956 ;; Out of reach, can use ble
3957 (const_int 12)))])
3958
3959 (define_insn ""
3960 [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
3961 (clobber (match_operand:SI 0 "register_operand" "=a"))
3962 (clobber (reg:SI 26))
3963 (clobber (reg:SI 25))
3964 (clobber (reg:SI 2))]
3965 "TARGET_64BIT"
3966 "* return output_mul_insn (0, insn);"
3967 [(set_attr "type" "milli")
3968 (set (attr "length") (const_int 4))])
3969
3970 (define_expand "muldi3"
3971 [(set (match_operand:DI 0 "register_operand" "")
3972 (mult:DI (match_operand:DI 1 "register_operand" "")
3973 (match_operand:DI 2 "register_operand" "")))]
3974 "TARGET_64BIT && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT"
3975 "
3976 {
3977 rtx low_product = gen_reg_rtx (DImode);
3978 rtx cross_product1 = gen_reg_rtx (DImode);
3979 rtx cross_product2 = gen_reg_rtx (DImode);
3980 rtx cross_scratch = gen_reg_rtx (DImode);
3981 rtx cross_product = gen_reg_rtx (DImode);
3982 rtx op1l, op1r, op2l, op2r;
3983 rtx op1shifted, op2shifted;
3984
3985 op1shifted = gen_reg_rtx (DImode);
3986 op2shifted = gen_reg_rtx (DImode);
3987 op1l = gen_reg_rtx (SImode);
3988 op1r = gen_reg_rtx (SImode);
3989 op2l = gen_reg_rtx (SImode);
3990 op2r = gen_reg_rtx (SImode);
3991
3992 emit_move_insn (op1shifted, gen_rtx_LSHIFTRT (DImode, operands[1],
3993 GEN_INT (32)));
3994 emit_move_insn (op2shifted, gen_rtx_LSHIFTRT (DImode, operands[2],
3995 GEN_INT (32)));
3996 op1r = gen_rtx_SUBREG (SImode, operands[1], 0);
3997 op2r = gen_rtx_SUBREG (SImode, operands[2], 0);
3998 op1l = gen_rtx_SUBREG (SImode, op1shifted, 0);
3999 op2l = gen_rtx_SUBREG (SImode, op2shifted, 0);
4000
4001 /* Emit multiplies for the cross products. */
4002 emit_insn (gen_umulsidi3 (cross_product1, op2r, op1l));
4003 emit_insn (gen_umulsidi3 (cross_product2, op2l, op1r));
4004
4005 /* Emit a multiply for the low sub-word. */
4006 emit_insn (gen_umulsidi3 (low_product, op2r, op1r));
4007
4008 /* Sum the cross products and shift them into proper position. */
4009 emit_insn (gen_adddi3 (cross_scratch, cross_product1, cross_product2));
4010 emit_insn (gen_ashldi3 (cross_product, cross_scratch, GEN_INT (32)));
4011
4012 /* Add the cross product to the low product and store the result
4013 into the output operand . */
4014 emit_insn (gen_adddi3 (operands[0], cross_product, low_product));
4015 DONE;
4016 }")
4017
4018 ;;; Division and mod.
4019 (define_expand "divsi3"
4020 [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
4021 (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
4022 (parallel [(set (reg:SI 29) (div:SI (reg:SI 26) (reg:SI 25)))
4023 (clobber (match_dup 3))
4024 (clobber (match_dup 4))
4025 (clobber (reg:SI 26))
4026 (clobber (reg:SI 25))
4027 (clobber (match_dup 5))])
4028 (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
4029 ""
4030 "
4031 {
4032 operands[3] = gen_reg_rtx (SImode);
4033 if (TARGET_64BIT)
4034 {
4035 operands[5] = gen_rtx_REG (SImode, 2);
4036 operands[4] = operands[5];
4037 }
4038 else
4039 {
4040 operands[5] = gen_rtx_REG (SImode, 31);
4041 operands[4] = gen_reg_rtx (SImode);
4042 }
4043 if (GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const (operands, 0))
4044 DONE;
4045 }")
4046
4047 (define_insn ""
4048 [(set (reg:SI 29)
4049 (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
4050 (clobber (match_operand:SI 1 "register_operand" "=a"))
4051 (clobber (match_operand:SI 2 "register_operand" "=&r"))
4052 (clobber (reg:SI 26))
4053 (clobber (reg:SI 25))
4054 (clobber (reg:SI 31))]
4055 "!TARGET_64BIT"
4056 "*
4057 return output_div_insn (operands, 0, insn);"
4058 [(set_attr "type" "milli")
4059 (set (attr "length")
4060 (cond [
4061 ;; Target (or stub) within reach
4062 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
4063 (const_int 240000))
4064 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
4065 (const_int 0)))
4066 (const_int 4)
4067
4068 ;; Out of reach PIC
4069 (ne (symbol_ref "flag_pic")
4070 (const_int 0))
4071 (const_int 24)
4072
4073 ;; Out of reach PORTABLE_RUNTIME
4074 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
4075 (const_int 0))
4076 (const_int 20)]
4077
4078 ;; Out of reach, can use ble
4079 (const_int 12)))])
4080
4081 (define_insn ""
4082 [(set (reg:SI 29)
4083 (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
4084 (clobber (match_operand:SI 1 "register_operand" "=a"))
4085 (clobber (match_operand:SI 2 "register_operand" "=&r"))
4086 (clobber (reg:SI 26))
4087 (clobber (reg:SI 25))
4088 (clobber (reg:SI 2))]
4089 "TARGET_64BIT"
4090 "*
4091 return output_div_insn (operands, 0, insn);"
4092 [(set_attr "type" "milli")
4093 (set (attr "length") (const_int 4))])
4094
4095 (define_expand "udivsi3"
4096 [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
4097 (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
4098 (parallel [(set (reg:SI 29) (udiv:SI (reg:SI 26) (reg:SI 25)))
4099 (clobber (match_dup 3))
4100 (clobber (match_dup 4))
4101 (clobber (reg:SI 26))
4102 (clobber (reg:SI 25))
4103 (clobber (match_dup 5))])
4104 (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
4105 ""
4106 "
4107 {
4108 operands[3] = gen_reg_rtx (SImode);
4109 if (TARGET_64BIT)
4110 {
4111 operands[5] = gen_rtx_REG (SImode, 2);
4112 operands[4] = operands[5];
4113 }
4114 else
4115 {
4116 operands[5] = gen_rtx_REG (SImode, 31);
4117 operands[4] = gen_reg_rtx (SImode);
4118 }
4119 if (GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const (operands, 1))
4120 DONE;
4121 }")
4122
4123 (define_insn ""
4124 [(set (reg:SI 29)
4125 (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
4126 (clobber (match_operand:SI 1 "register_operand" "=a"))
4127 (clobber (match_operand:SI 2 "register_operand" "=&r"))
4128 (clobber (reg:SI 26))
4129 (clobber (reg:SI 25))
4130 (clobber (reg:SI 31))]
4131 "!TARGET_64BIT"
4132 "*
4133 return output_div_insn (operands, 1, insn);"
4134 [(set_attr "type" "milli")
4135 (set (attr "length")
4136 (cond [
4137 ;; Target (or stub) within reach
4138 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
4139 (const_int 240000))
4140 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
4141 (const_int 0)))
4142 (const_int 4)
4143
4144 ;; Out of reach PIC
4145 (ne (symbol_ref "flag_pic")
4146 (const_int 0))
4147 (const_int 24)
4148
4149 ;; Out of reach PORTABLE_RUNTIME
4150 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
4151 (const_int 0))
4152 (const_int 20)]
4153
4154 ;; Out of reach, can use ble
4155 (const_int 12)))])
4156
4157 (define_insn ""
4158 [(set (reg:SI 29)
4159 (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
4160 (clobber (match_operand:SI 1 "register_operand" "=a"))
4161 (clobber (match_operand:SI 2 "register_operand" "=&r"))
4162 (clobber (reg:SI 26))
4163 (clobber (reg:SI 25))
4164 (clobber (reg:SI 2))]
4165 "TARGET_64BIT"
4166 "*
4167 return output_div_insn (operands, 1, insn);"
4168 [(set_attr "type" "milli")
4169 (set (attr "length") (const_int 4))])
4170
4171 (define_expand "modsi3"
4172 [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
4173 (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
4174 (parallel [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
4175 (clobber (match_dup 3))
4176 (clobber (match_dup 4))
4177 (clobber (reg:SI 26))
4178 (clobber (reg:SI 25))
4179 (clobber (match_dup 5))])
4180 (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
4181 ""
4182 "
4183 {
4184 if (TARGET_64BIT)
4185 {
4186 operands[5] = gen_rtx_REG (SImode, 2);
4187 operands[4] = operands[5];
4188 }
4189 else
4190 {
4191 operands[5] = gen_rtx_REG (SImode, 31);
4192 operands[4] = gen_reg_rtx (SImode);
4193 }
4194 operands[3] = gen_reg_rtx (SImode);
4195 }")
4196
4197 (define_insn ""
4198 [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
4199 (clobber (match_operand:SI 0 "register_operand" "=a"))
4200 (clobber (match_operand:SI 1 "register_operand" "=&r"))
4201 (clobber (reg:SI 26))
4202 (clobber (reg:SI 25))
4203 (clobber (reg:SI 31))]
4204 "!TARGET_64BIT"
4205 "*
4206 return output_mod_insn (0, insn);"
4207 [(set_attr "type" "milli")
4208 (set (attr "length")
4209 (cond [
4210 ;; Target (or stub) within reach
4211 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
4212 (const_int 240000))
4213 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
4214 (const_int 0)))
4215 (const_int 4)
4216
4217 ;; Out of reach PIC
4218 (ne (symbol_ref "flag_pic")
4219 (const_int 0))
4220 (const_int 24)
4221
4222 ;; Out of reach PORTABLE_RUNTIME
4223 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
4224 (const_int 0))
4225 (const_int 20)]
4226
4227 ;; Out of reach, can use ble
4228 (const_int 12)))])
4229
4230 (define_insn ""
4231 [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
4232 (clobber (match_operand:SI 0 "register_operand" "=a"))
4233 (clobber (match_operand:SI 1 "register_operand" "=&r"))
4234 (clobber (reg:SI 26))
4235 (clobber (reg:SI 25))
4236 (clobber (reg:SI 2))]
4237 "TARGET_64BIT"
4238 "*
4239 return output_mod_insn (0, insn);"
4240 [(set_attr "type" "milli")
4241 (set (attr "length") (const_int 4))])
4242
4243 (define_expand "umodsi3"
4244 [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
4245 (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
4246 (parallel [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
4247 (clobber (match_dup 3))
4248 (clobber (match_dup 4))
4249 (clobber (reg:SI 26))
4250 (clobber (reg:SI 25))
4251 (clobber (match_dup 5))])
4252 (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
4253 ""
4254 "
4255 {
4256 if (TARGET_64BIT)
4257 {
4258 operands[5] = gen_rtx_REG (SImode, 2);
4259 operands[4] = operands[5];
4260 }
4261 else
4262 {
4263 operands[5] = gen_rtx_REG (SImode, 31);
4264 operands[4] = gen_reg_rtx (SImode);
4265 }
4266 operands[3] = gen_reg_rtx (SImode);
4267 }")
4268
4269 (define_insn ""
4270 [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
4271 (clobber (match_operand:SI 0 "register_operand" "=a"))
4272 (clobber (match_operand:SI 1 "register_operand" "=&r"))
4273 (clobber (reg:SI 26))
4274 (clobber (reg:SI 25))
4275 (clobber (reg:SI 31))]
4276 "!TARGET_64BIT"
4277 "*
4278 return output_mod_insn (1, insn);"
4279 [(set_attr "type" "milli")
4280 (set (attr "length")
4281 (cond [
4282 ;; Target (or stub) within reach
4283 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
4284 (const_int 240000))
4285 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
4286 (const_int 0)))
4287 (const_int 4)
4288
4289 ;; Out of reach PIC
4290 (ne (symbol_ref "flag_pic")
4291 (const_int 0))
4292 (const_int 24)
4293
4294 ;; Out of reach PORTABLE_RUNTIME
4295 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
4296 (const_int 0))
4297 (const_int 20)]
4298
4299 ;; Out of reach, can use ble
4300 (const_int 12)))])
4301
4302 (define_insn ""
4303 [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
4304 (clobber (match_operand:SI 0 "register_operand" "=a"))
4305 (clobber (match_operand:SI 1 "register_operand" "=&r"))
4306 (clobber (reg:SI 26))
4307 (clobber (reg:SI 25))
4308 (clobber (reg:SI 2))]
4309 "TARGET_64BIT"
4310 "*
4311 return output_mod_insn (1, insn);"
4312 [(set_attr "type" "milli")
4313 (set (attr "length") (const_int 4))])
4314
4315 ;;- and instructions
4316 ;; We define DImode `and` so with DImode `not` we can get
4317 ;; DImode `andn`. Other combinations are possible.
4318
4319 (define_expand "anddi3"
4320 [(set (match_operand:DI 0 "register_operand" "")
4321 (and:DI (match_operand:DI 1 "arith_double_operand" "")
4322 (match_operand:DI 2 "arith_double_operand" "")))]
4323 ""
4324 "
4325 {
4326 if (! register_operand (operands[1], DImode)
4327 || ! register_operand (operands[2], DImode))
4328 /* Let GCC break this into word-at-a-time operations. */
4329 FAIL;
4330 }")
4331
4332 (define_insn ""
4333 [(set (match_operand:DI 0 "register_operand" "=r")
4334 (and:DI (match_operand:DI 1 "register_operand" "%r")
4335 (match_operand:DI 2 "register_operand" "r")))]
4336 "!TARGET_64BIT"
4337 "and %1,%2,%0\;and %R1,%R2,%R0"
4338 [(set_attr "type" "binary")
4339 (set_attr "length" "8")])
4340
4341 (define_insn ""
4342 [(set (match_operand:DI 0 "register_operand" "=r,r")
4343 (and:DI (match_operand:DI 1 "register_operand" "%?r,0")
4344 (match_operand:DI 2 "and_operand" "rO,P")))]
4345 "TARGET_64BIT"
4346 "* return output_64bit_and (operands); "
4347 [(set_attr "type" "binary")
4348 (set_attr "length" "4")])
4349
4350 ; The ? for op1 makes reload prefer zdepi instead of loading a huge
4351 ; constant with ldil;ldo.
4352 (define_insn "andsi3"
4353 [(set (match_operand:SI 0 "register_operand" "=r,r")
4354 (and:SI (match_operand:SI 1 "register_operand" "%?r,0")
4355 (match_operand:SI 2 "and_operand" "rO,P")))]
4356 ""
4357 "* return output_and (operands); "
4358 [(set_attr "type" "binary,shift")
4359 (set_attr "length" "4,4")])
4360
4361 (define_insn ""
4362 [(set (match_operand:DI 0 "register_operand" "=r")
4363 (and:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
4364 (match_operand:DI 2 "register_operand" "r")))]
4365 "!TARGET_64BIT"
4366 "andcm %2,%1,%0\;andcm %R2,%R1,%R0"
4367 [(set_attr "type" "binary")
4368 (set_attr "length" "8")])
4369
4370 (define_insn ""
4371 [(set (match_operand:DI 0 "register_operand" "=r")
4372 (and:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
4373 (match_operand:DI 2 "register_operand" "r")))]
4374 "TARGET_64BIT"
4375 "andcm %2,%1,%0"
4376 [(set_attr "type" "binary")
4377 (set_attr "length" "4")])
4378
4379 (define_insn ""
4380 [(set (match_operand:SI 0 "register_operand" "=r")
4381 (and:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
4382 (match_operand:SI 2 "register_operand" "r")))]
4383 ""
4384 "andcm %2,%1,%0"
4385 [(set_attr "type" "binary")
4386 (set_attr "length" "4")])
4387
4388 (define_expand "iordi3"
4389 [(set (match_operand:DI 0 "register_operand" "")
4390 (ior:DI (match_operand:DI 1 "arith_double_operand" "")
4391 (match_operand:DI 2 "arith_double_operand" "")))]
4392 ""
4393 "
4394 {
4395 if (! register_operand (operands[1], DImode)
4396 || ! register_operand (operands[2], DImode))
4397 /* Let GCC break this into word-at-a-time operations. */
4398 FAIL;
4399 }")
4400
4401 (define_insn ""
4402 [(set (match_operand:DI 0 "register_operand" "=r")
4403 (ior:DI (match_operand:DI 1 "register_operand" "%r")
4404 (match_operand:DI 2 "register_operand" "r")))]
4405 "!TARGET_64BIT"
4406 "or %1,%2,%0\;or %R1,%R2,%R0"
4407 [(set_attr "type" "binary")
4408 (set_attr "length" "8")])
4409
4410 (define_insn ""
4411 [(set (match_operand:DI 0 "register_operand" "=r,r")
4412 (ior:DI (match_operand:DI 1 "register_operand" "0,0")
4413 (match_operand:DI 2 "ior_operand" "M,i")))]
4414 "TARGET_64BIT"
4415 "* return output_64bit_ior (operands); "
4416 [(set_attr "type" "binary,shift")
4417 (set_attr "length" "4,4")])
4418
4419 (define_insn ""
4420 [(set (match_operand:DI 0 "register_operand" "=r")
4421 (ior:DI (match_operand:DI 1 "register_operand" "%r")
4422 (match_operand:DI 2 "register_operand" "r")))]
4423 "TARGET_64BIT"
4424 "or %1,%2,%0"
4425 [(set_attr "type" "binary")
4426 (set_attr "length" "4")])
4427
4428 ;; Need a define_expand because we've run out of CONST_OK... characters.
4429 (define_expand "iorsi3"
4430 [(set (match_operand:SI 0 "register_operand" "")
4431 (ior:SI (match_operand:SI 1 "register_operand" "")
4432 (match_operand:SI 2 "arith32_operand" "")))]
4433 ""
4434 "
4435 {
4436 if (! (ior_operand (operands[2], SImode)
4437 || register_operand (operands[2], SImode)))
4438 operands[2] = force_reg (SImode, operands[2]);
4439 }")
4440
4441 (define_insn ""
4442 [(set (match_operand:SI 0 "register_operand" "=r,r")
4443 (ior:SI (match_operand:SI 1 "register_operand" "0,0")
4444 (match_operand:SI 2 "ior_operand" "M,i")))]
4445 ""
4446 "* return output_ior (operands); "
4447 [(set_attr "type" "binary,shift")
4448 (set_attr "length" "4,4")])
4449
4450 (define_insn ""
4451 [(set (match_operand:SI 0 "register_operand" "=r")
4452 (ior:SI (match_operand:SI 1 "register_operand" "%r")
4453 (match_operand:SI 2 "register_operand" "r")))]
4454 ""
4455 "or %1,%2,%0"
4456 [(set_attr "type" "binary")
4457 (set_attr "length" "4")])
4458
4459 (define_expand "xordi3"
4460 [(set (match_operand:DI 0 "register_operand" "")
4461 (xor:DI (match_operand:DI 1 "arith_double_operand" "")
4462 (match_operand:DI 2 "arith_double_operand" "")))]
4463 ""
4464 "
4465 {
4466 if (! register_operand (operands[1], DImode)
4467 || ! register_operand (operands[2], DImode))
4468 /* Let GCC break this into word-at-a-time operations. */
4469 FAIL;
4470 }")
4471
4472 (define_insn ""
4473 [(set (match_operand:DI 0 "register_operand" "=r")
4474 (xor:DI (match_operand:DI 1 "register_operand" "%r")
4475 (match_operand:DI 2 "register_operand" "r")))]
4476 "!TARGET_64BIT"
4477 "xor %1,%2,%0\;xor %R1,%R2,%R0"
4478 [(set_attr "type" "binary")
4479 (set_attr "length" "8")])
4480
4481 (define_insn ""
4482 [(set (match_operand:DI 0 "register_operand" "=r")
4483 (xor:DI (match_operand:DI 1 "register_operand" "%r")
4484 (match_operand:DI 2 "register_operand" "r")))]
4485 "TARGET_64BIT"
4486 "xor %1,%2,%0"
4487 [(set_attr "type" "binary")
4488 (set_attr "length" "4")])
4489
4490 (define_insn "xorsi3"
4491 [(set (match_operand:SI 0 "register_operand" "=r")
4492 (xor:SI (match_operand:SI 1 "register_operand" "%r")
4493 (match_operand:SI 2 "register_operand" "r")))]
4494 ""
4495 "xor %1,%2,%0"
4496 [(set_attr "type" "binary")
4497 (set_attr "length" "4")])
4498
4499 (define_expand "negdi2"
4500 [(set (match_operand:DI 0 "register_operand" "")
4501 (neg:DI (match_operand:DI 1 "register_operand" "")))]
4502 ""
4503 "")
4504
4505 (define_insn ""
4506 [(set (match_operand:DI 0 "register_operand" "=r")
4507 (neg:DI (match_operand:DI 1 "register_operand" "r")))]
4508 "!TARGET_64BIT"
4509 "sub %%r0,%R1,%R0\;{subb|sub,b} %%r0,%1,%0"
4510 [(set_attr "type" "unary")
4511 (set_attr "length" "8")])
4512
4513 (define_insn ""
4514 [(set (match_operand:DI 0 "register_operand" "=r")
4515 (neg:DI (match_operand:DI 1 "register_operand" "r")))]
4516 "TARGET_64BIT"
4517 "sub %%r0,%1,%0"
4518 [(set_attr "type" "unary")
4519 (set_attr "length" "4")])
4520
4521 (define_insn "negsi2"
4522 [(set (match_operand:SI 0 "register_operand" "=r")
4523 (neg:SI (match_operand:SI 1 "register_operand" "r")))]
4524 ""
4525 "sub %%r0,%1,%0"
4526 [(set_attr "type" "unary")
4527 (set_attr "length" "4")])
4528
4529 (define_expand "one_cmpldi2"
4530 [(set (match_operand:DI 0 "register_operand" "")
4531 (not:DI (match_operand:DI 1 "arith_double_operand" "")))]
4532 ""
4533 "
4534 {
4535 if (! register_operand (operands[1], DImode))
4536 FAIL;
4537 }")
4538
4539 (define_insn ""
4540 [(set (match_operand:DI 0 "register_operand" "=r")
4541 (not:DI (match_operand:DI 1 "register_operand" "r")))]
4542 "!TARGET_64BIT"
4543 "uaddcm %%r0,%1,%0\;uaddcm %%r0,%R1,%R0"
4544 [(set_attr "type" "unary")
4545 (set_attr "length" "8")])
4546
4547 (define_insn ""
4548 [(set (match_operand:DI 0 "register_operand" "=r")
4549 (not:DI (match_operand:DI 1 "register_operand" "r")))]
4550 "TARGET_64BIT"
4551 "uaddcm %%r0,%1,%0"
4552 [(set_attr "type" "unary")
4553 (set_attr "length" "4")])
4554
4555 (define_insn "one_cmplsi2"
4556 [(set (match_operand:SI 0 "register_operand" "=r")
4557 (not:SI (match_operand:SI 1 "register_operand" "r")))]
4558 ""
4559 "uaddcm %%r0,%1,%0"
4560 [(set_attr "type" "unary")
4561 (set_attr "length" "4")])
4562 \f
4563 ;; Floating point arithmetic instructions.
4564
4565 (define_insn "adddf3"
4566 [(set (match_operand:DF 0 "register_operand" "=f")
4567 (plus:DF (match_operand:DF 1 "register_operand" "f")
4568 (match_operand:DF 2 "register_operand" "f")))]
4569 "! TARGET_SOFT_FLOAT"
4570 "fadd,dbl %1,%2,%0"
4571 [(set_attr "type" "fpalu")
4572 (set_attr "pa_combine_type" "faddsub")
4573 (set_attr "length" "4")])
4574
4575 (define_insn "addsf3"
4576 [(set (match_operand:SF 0 "register_operand" "=f")
4577 (plus:SF (match_operand:SF 1 "register_operand" "f")
4578 (match_operand:SF 2 "register_operand" "f")))]
4579 "! TARGET_SOFT_FLOAT"
4580 "fadd,sgl %1,%2,%0"
4581 [(set_attr "type" "fpalu")
4582 (set_attr "pa_combine_type" "faddsub")
4583 (set_attr "length" "4")])
4584
4585 (define_insn "subdf3"
4586 [(set (match_operand:DF 0 "register_operand" "=f")
4587 (minus:DF (match_operand:DF 1 "register_operand" "f")
4588 (match_operand:DF 2 "register_operand" "f")))]
4589 "! TARGET_SOFT_FLOAT"
4590 "fsub,dbl %1,%2,%0"
4591 [(set_attr "type" "fpalu")
4592 (set_attr "pa_combine_type" "faddsub")
4593 (set_attr "length" "4")])
4594
4595 (define_insn "subsf3"
4596 [(set (match_operand:SF 0 "register_operand" "=f")
4597 (minus:SF (match_operand:SF 1 "register_operand" "f")
4598 (match_operand:SF 2 "register_operand" "f")))]
4599 "! TARGET_SOFT_FLOAT"
4600 "fsub,sgl %1,%2,%0"
4601 [(set_attr "type" "fpalu")
4602 (set_attr "pa_combine_type" "faddsub")
4603 (set_attr "length" "4")])
4604
4605 (define_insn "muldf3"
4606 [(set (match_operand:DF 0 "register_operand" "=f")
4607 (mult:DF (match_operand:DF 1 "register_operand" "f")
4608 (match_operand:DF 2 "register_operand" "f")))]
4609 "! TARGET_SOFT_FLOAT"
4610 "fmpy,dbl %1,%2,%0"
4611 [(set_attr "type" "fpmuldbl")
4612 (set_attr "pa_combine_type" "fmpy")
4613 (set_attr "length" "4")])
4614
4615 (define_insn "mulsf3"
4616 [(set (match_operand:SF 0 "register_operand" "=f")
4617 (mult:SF (match_operand:SF 1 "register_operand" "f")
4618 (match_operand:SF 2 "register_operand" "f")))]
4619 "! TARGET_SOFT_FLOAT"
4620 "fmpy,sgl %1,%2,%0"
4621 [(set_attr "type" "fpmulsgl")
4622 (set_attr "pa_combine_type" "fmpy")
4623 (set_attr "length" "4")])
4624
4625 (define_insn "divdf3"
4626 [(set (match_operand:DF 0 "register_operand" "=f")
4627 (div:DF (match_operand:DF 1 "register_operand" "f")
4628 (match_operand:DF 2 "register_operand" "f")))]
4629 "! TARGET_SOFT_FLOAT"
4630 "fdiv,dbl %1,%2,%0"
4631 [(set_attr "type" "fpdivdbl")
4632 (set_attr "length" "4")])
4633
4634 (define_insn "divsf3"
4635 [(set (match_operand:SF 0 "register_operand" "=f")
4636 (div:SF (match_operand:SF 1 "register_operand" "f")
4637 (match_operand:SF 2 "register_operand" "f")))]
4638 "! TARGET_SOFT_FLOAT"
4639 "fdiv,sgl %1,%2,%0"
4640 [(set_attr "type" "fpdivsgl")
4641 (set_attr "length" "4")])
4642
4643 ;; Processors prior to PA 2.0 don't have a fneg instruction. Fast
4644 ;; negation can be done by subtracting from plus zero. However, this
4645 ;; violates the IEEE standard when negating plus and minus zero.
4646 (define_expand "negdf2"
4647 [(parallel [(set (match_operand:DF 0 "register_operand" "")
4648 (neg:DF (match_operand:DF 1 "register_operand" "")))
4649 (use (match_dup 2))])]
4650 "! TARGET_SOFT_FLOAT"
4651 {
4652 if (TARGET_PA_20 || flag_unsafe_math_optimizations)
4653 emit_insn (gen_negdf2_fast (operands[0], operands[1]));
4654 else
4655 {
4656 operands[2] = force_reg (DFmode, immed_real_const_1 (dconstm1, DFmode));
4657 emit_insn (gen_muldf3 (operands[0], operands[1], operands[2]));
4658 }
4659 DONE;
4660 })
4661
4662 (define_insn "negdf2_fast"
4663 [(set (match_operand:DF 0 "register_operand" "=f")
4664 (neg:DF (match_operand:DF 1 "register_operand" "f")))]
4665 "! TARGET_SOFT_FLOAT && (TARGET_PA_20 || flag_unsafe_math_optimizations)"
4666 "*
4667 {
4668 if (TARGET_PA_20)
4669 return \"fneg,dbl %1,%0\";
4670 else
4671 return \"fsub,dbl %%fr0,%1,%0\";
4672 }"
4673 [(set_attr "type" "fpalu")
4674 (set_attr "length" "4")])
4675
4676 (define_expand "negsf2"
4677 [(parallel [(set (match_operand:SF 0 "register_operand" "")
4678 (neg:SF (match_operand:SF 1 "register_operand" "")))
4679 (use (match_dup 2))])]
4680 "! TARGET_SOFT_FLOAT"
4681 {
4682 if (TARGET_PA_20 || flag_unsafe_math_optimizations)
4683 emit_insn (gen_negsf2_fast (operands[0], operands[1]));
4684 else
4685 {
4686 operands[2] = force_reg (SFmode, immed_real_const_1 (dconstm1, SFmode));
4687 emit_insn (gen_mulsf3 (operands[0], operands[1], operands[2]));
4688 }
4689 DONE;
4690 })
4691
4692 (define_insn "negsf2_fast"
4693 [(set (match_operand:SF 0 "register_operand" "=f")
4694 (neg:SF (match_operand:SF 1 "register_operand" "f")))]
4695 "! TARGET_SOFT_FLOAT && (TARGET_PA_20 || flag_unsafe_math_optimizations)"
4696 "*
4697 {
4698 if (TARGET_PA_20)
4699 return \"fneg,sgl %1,%0\";
4700 else
4701 return \"fsub,sgl %%fr0,%1,%0\";
4702 }"
4703 [(set_attr "type" "fpalu")
4704 (set_attr "length" "4")])
4705
4706 (define_insn "absdf2"
4707 [(set (match_operand:DF 0 "register_operand" "=f")
4708 (abs:DF (match_operand:DF 1 "register_operand" "f")))]
4709 "! TARGET_SOFT_FLOAT"
4710 "fabs,dbl %1,%0"
4711 [(set_attr "type" "fpalu")
4712 (set_attr "length" "4")])
4713
4714 (define_insn "abssf2"
4715 [(set (match_operand:SF 0 "register_operand" "=f")
4716 (abs:SF (match_operand:SF 1 "register_operand" "f")))]
4717 "! TARGET_SOFT_FLOAT"
4718 "fabs,sgl %1,%0"
4719 [(set_attr "type" "fpalu")
4720 (set_attr "length" "4")])
4721
4722 (define_insn "sqrtdf2"
4723 [(set (match_operand:DF 0 "register_operand" "=f")
4724 (sqrt:DF (match_operand:DF 1 "register_operand" "f")))]
4725 "! TARGET_SOFT_FLOAT"
4726 "fsqrt,dbl %1,%0"
4727 [(set_attr "type" "fpsqrtdbl")
4728 (set_attr "length" "4")])
4729
4730 (define_insn "sqrtsf2"
4731 [(set (match_operand:SF 0 "register_operand" "=f")
4732 (sqrt:SF (match_operand:SF 1 "register_operand" "f")))]
4733 "! TARGET_SOFT_FLOAT"
4734 "fsqrt,sgl %1,%0"
4735 [(set_attr "type" "fpsqrtsgl")
4736 (set_attr "length" "4")])
4737
4738 ;; PA 2.0 floating point instructions
4739
4740 ; fmpyfadd patterns
4741 (define_insn ""
4742 [(set (match_operand:DF 0 "register_operand" "=f")
4743 (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4744 (match_operand:DF 2 "register_operand" "f"))
4745 (match_operand:DF 3 "register_operand" "f")))]
4746 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4747 "fmpyfadd,dbl %1,%2,%3,%0"
4748 [(set_attr "type" "fpmuldbl")
4749 (set_attr "length" "4")])
4750
4751 (define_insn ""
4752 [(set (match_operand:DF 0 "register_operand" "=f")
4753 (plus:DF (match_operand:DF 1 "register_operand" "f")
4754 (mult:DF (match_operand:DF 2 "register_operand" "f")
4755 (match_operand:DF 3 "register_operand" "f"))))]
4756 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4757 "fmpyfadd,dbl %2,%3,%1,%0"
4758 [(set_attr "type" "fpmuldbl")
4759 (set_attr "length" "4")])
4760
4761 (define_insn ""
4762 [(set (match_operand:SF 0 "register_operand" "=f")
4763 (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
4764 (match_operand:SF 2 "register_operand" "f"))
4765 (match_operand:SF 3 "register_operand" "f")))]
4766 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4767 "fmpyfadd,sgl %1,%2,%3,%0"
4768 [(set_attr "type" "fpmulsgl")
4769 (set_attr "length" "4")])
4770
4771 (define_insn ""
4772 [(set (match_operand:SF 0 "register_operand" "=f")
4773 (plus:SF (match_operand:SF 1 "register_operand" "f")
4774 (mult:SF (match_operand:SF 2 "register_operand" "f")
4775 (match_operand:SF 3 "register_operand" "f"))))]
4776 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4777 "fmpyfadd,sgl %2,%3,%1,%0"
4778 [(set_attr "type" "fpmulsgl")
4779 (set_attr "length" "4")])
4780
4781 ; fmpynfadd patterns
4782 (define_insn ""
4783 [(set (match_operand:DF 0 "register_operand" "=f")
4784 (minus:DF (match_operand:DF 1 "register_operand" "f")
4785 (mult:DF (match_operand:DF 2 "register_operand" "f")
4786 (match_operand:DF 3 "register_operand" "f"))))]
4787 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4788 "fmpynfadd,dbl %2,%3,%1,%0"
4789 [(set_attr "type" "fpmuldbl")
4790 (set_attr "length" "4")])
4791
4792 (define_insn ""
4793 [(set (match_operand:SF 0 "register_operand" "=f")
4794 (minus:SF (match_operand:SF 1 "register_operand" "f")
4795 (mult:SF (match_operand:SF 2 "register_operand" "f")
4796 (match_operand:SF 3 "register_operand" "f"))))]
4797 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4798 "fmpynfadd,sgl %2,%3,%1,%0"
4799 [(set_attr "type" "fpmulsgl")
4800 (set_attr "length" "4")])
4801
4802 ; fnegabs patterns
4803 (define_insn ""
4804 [(set (match_operand:DF 0 "register_operand" "=f")
4805 (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f"))))]
4806 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4807 "fnegabs,dbl %1,%0"
4808 [(set_attr "type" "fpalu")
4809 (set_attr "length" "4")])
4810
4811 (define_insn ""
4812 [(set (match_operand:SF 0 "register_operand" "=f")
4813 (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))]
4814 "TARGET_PA_20 && ! TARGET_SOFT_FLOAT"
4815 "fnegabs,sgl %1,%0"
4816 [(set_attr "type" "fpalu")
4817 (set_attr "length" "4")])
4818
4819 ;; Generating a fused multiply sequence is a win for this case as it will
4820 ;; reduce the latency for the fused case without impacting the plain
4821 ;; multiply case.
4822 ;;
4823 ;; Similar possibilities exist for fnegabs, shadd and other insns which
4824 ;; perform two operations with the result of the first feeding the second.
4825 (define_insn ""
4826 [(set (match_operand:DF 0 "register_operand" "=f")
4827 (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4828 (match_operand:DF 2 "register_operand" "f"))
4829 (match_operand:DF 3 "register_operand" "f")))
4830 (set (match_operand:DF 4 "register_operand" "=&f")
4831 (mult:DF (match_dup 1) (match_dup 2)))]
4832 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
4833 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
4834 || reg_overlap_mentioned_p (operands[4], operands[2])))"
4835 "#"
4836 [(set_attr "type" "fpmuldbl")
4837 (set_attr "length" "8")])
4838
4839 ;; We want to split this up during scheduling since we want both insns
4840 ;; to schedule independently.
4841 (define_split
4842 [(set (match_operand:DF 0 "register_operand" "")
4843 (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "")
4844 (match_operand:DF 2 "register_operand" ""))
4845 (match_operand:DF 3 "register_operand" "")))
4846 (set (match_operand:DF 4 "register_operand" "")
4847 (mult:DF (match_dup 1) (match_dup 2)))]
4848 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4849 [(set (match_dup 4) (mult:DF (match_dup 1) (match_dup 2)))
4850 (set (match_dup 0) (plus:DF (mult:DF (match_dup 1) (match_dup 2))
4851 (match_dup 3)))]
4852 "")
4853
4854 (define_insn ""
4855 [(set (match_operand:SF 0 "register_operand" "=f")
4856 (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
4857 (match_operand:SF 2 "register_operand" "f"))
4858 (match_operand:SF 3 "register_operand" "f")))
4859 (set (match_operand:SF 4 "register_operand" "=&f")
4860 (mult:SF (match_dup 1) (match_dup 2)))]
4861 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
4862 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
4863 || reg_overlap_mentioned_p (operands[4], operands[2])))"
4864 "#"
4865 [(set_attr "type" "fpmuldbl")
4866 (set_attr "length" "8")])
4867
4868 ;; We want to split this up during scheduling since we want both insns
4869 ;; to schedule independently.
4870 (define_split
4871 [(set (match_operand:SF 0 "register_operand" "")
4872 (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "")
4873 (match_operand:SF 2 "register_operand" ""))
4874 (match_operand:SF 3 "register_operand" "")))
4875 (set (match_operand:SF 4 "register_operand" "")
4876 (mult:SF (match_dup 1) (match_dup 2)))]
4877 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4878 [(set (match_dup 4) (mult:SF (match_dup 1) (match_dup 2)))
4879 (set (match_dup 0) (plus:SF (mult:SF (match_dup 1) (match_dup 2))
4880 (match_dup 3)))]
4881 "")
4882
4883 ;; Negating a multiply can be faked by adding zero in a fused multiply-add
4884 ;; instruction.
4885 (define_insn ""
4886 [(set (match_operand:DF 0 "register_operand" "=f")
4887 (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4888 (match_operand:DF 2 "register_operand" "f"))))]
4889 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4890 "fmpynfadd,dbl %1,%2,%%fr0,%0"
4891 [(set_attr "type" "fpmuldbl")
4892 (set_attr "length" "4")])
4893
4894 (define_insn ""
4895 [(set (match_operand:SF 0 "register_operand" "=f")
4896 (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
4897 (match_operand:SF 2 "register_operand" "f"))))]
4898 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4899 "fmpynfadd,sgl %1,%2,%%fr0,%0"
4900 [(set_attr "type" "fpmuldbl")
4901 (set_attr "length" "4")])
4902
4903 (define_insn ""
4904 [(set (match_operand:DF 0 "register_operand" "=f")
4905 (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4906 (match_operand:DF 2 "register_operand" "f"))))
4907 (set (match_operand:DF 3 "register_operand" "=&f")
4908 (mult:DF (match_dup 1) (match_dup 2)))]
4909 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
4910 && ! (reg_overlap_mentioned_p (operands[3], operands[1])
4911 || reg_overlap_mentioned_p (operands[3], operands[2])))"
4912 "#"
4913 [(set_attr "type" "fpmuldbl")
4914 (set_attr "length" "8")])
4915
4916 (define_split
4917 [(set (match_operand:DF 0 "register_operand" "")
4918 (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "")
4919 (match_operand:DF 2 "register_operand" ""))))
4920 (set (match_operand:DF 3 "register_operand" "")
4921 (mult:DF (match_dup 1) (match_dup 2)))]
4922 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4923 [(set (match_dup 3) (mult:DF (match_dup 1) (match_dup 2)))
4924 (set (match_dup 0) (neg:DF (mult:DF (match_dup 1) (match_dup 2))))]
4925 "")
4926
4927 (define_insn ""
4928 [(set (match_operand:SF 0 "register_operand" "=f")
4929 (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
4930 (match_operand:SF 2 "register_operand" "f"))))
4931 (set (match_operand:SF 3 "register_operand" "=&f")
4932 (mult:SF (match_dup 1) (match_dup 2)))]
4933 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
4934 && ! (reg_overlap_mentioned_p (operands[3], operands[1])
4935 || reg_overlap_mentioned_p (operands[3], operands[2])))"
4936 "#"
4937 [(set_attr "type" "fpmuldbl")
4938 (set_attr "length" "8")])
4939
4940 (define_split
4941 [(set (match_operand:SF 0 "register_operand" "")
4942 (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "")
4943 (match_operand:SF 2 "register_operand" ""))))
4944 (set (match_operand:SF 3 "register_operand" "")
4945 (mult:SF (match_dup 1) (match_dup 2)))]
4946 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4947 [(set (match_dup 3) (mult:SF (match_dup 1) (match_dup 2)))
4948 (set (match_dup 0) (neg:SF (mult:SF (match_dup 1) (match_dup 2))))]
4949 "")
4950
4951 ;; Now fused multiplies with the result of the multiply negated.
4952 (define_insn ""
4953 [(set (match_operand:DF 0 "register_operand" "=f")
4954 (plus:DF (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4955 (match_operand:DF 2 "register_operand" "f")))
4956 (match_operand:DF 3 "register_operand" "f")))]
4957 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4958 "fmpynfadd,dbl %1,%2,%3,%0"
4959 [(set_attr "type" "fpmuldbl")
4960 (set_attr "length" "4")])
4961
4962 (define_insn ""
4963 [(set (match_operand:SF 0 "register_operand" "=f")
4964 (plus:SF (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
4965 (match_operand:SF 2 "register_operand" "f")))
4966 (match_operand:SF 3 "register_operand" "f")))]
4967 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4968 "fmpynfadd,sgl %1,%2,%3,%0"
4969 [(set_attr "type" "fpmuldbl")
4970 (set_attr "length" "4")])
4971
4972 (define_insn ""
4973 [(set (match_operand:DF 0 "register_operand" "=f")
4974 (plus:DF (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
4975 (match_operand:DF 2 "register_operand" "f")))
4976 (match_operand:DF 3 "register_operand" "f")))
4977 (set (match_operand:DF 4 "register_operand" "=&f")
4978 (mult:DF (match_dup 1) (match_dup 2)))]
4979 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
4980 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
4981 || reg_overlap_mentioned_p (operands[4], operands[2])))"
4982 "#"
4983 [(set_attr "type" "fpmuldbl")
4984 (set_attr "length" "8")])
4985
4986 (define_split
4987 [(set (match_operand:DF 0 "register_operand" "")
4988 (plus:DF (neg:DF (mult:DF (match_operand:DF 1 "register_operand" "")
4989 (match_operand:DF 2 "register_operand" "")))
4990 (match_operand:DF 3 "register_operand" "")))
4991 (set (match_operand:DF 4 "register_operand" "")
4992 (mult:DF (match_dup 1) (match_dup 2)))]
4993 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
4994 [(set (match_dup 4) (mult:DF (match_dup 1) (match_dup 2)))
4995 (set (match_dup 0) (plus:DF (neg:DF (mult:DF (match_dup 1) (match_dup 2)))
4996 (match_dup 3)))]
4997 "")
4998
4999 (define_insn ""
5000 [(set (match_operand:SF 0 "register_operand" "=f")
5001 (plus:SF (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
5002 (match_operand:SF 2 "register_operand" "f")))
5003 (match_operand:SF 3 "register_operand" "f")))
5004 (set (match_operand:SF 4 "register_operand" "=&f")
5005 (mult:SF (match_dup 1) (match_dup 2)))]
5006 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
5007 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
5008 || reg_overlap_mentioned_p (operands[4], operands[2])))"
5009 "#"
5010 [(set_attr "type" "fpmuldbl")
5011 (set_attr "length" "8")])
5012
5013 (define_split
5014 [(set (match_operand:SF 0 "register_operand" "")
5015 (plus:SF (neg:SF (mult:SF (match_operand:SF 1 "register_operand" "")
5016 (match_operand:SF 2 "register_operand" "")))
5017 (match_operand:SF 3 "register_operand" "")))
5018 (set (match_operand:SF 4 "register_operand" "")
5019 (mult:SF (match_dup 1) (match_dup 2)))]
5020 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
5021 [(set (match_dup 4) (mult:SF (match_dup 1) (match_dup 2)))
5022 (set (match_dup 0) (plus:SF (neg:SF (mult:SF (match_dup 1) (match_dup 2)))
5023 (match_dup 3)))]
5024 "")
5025
5026 (define_insn ""
5027 [(set (match_operand:DF 0 "register_operand" "=f")
5028 (minus:DF (match_operand:DF 3 "register_operand" "f")
5029 (mult:DF (match_operand:DF 1 "register_operand" "f")
5030 (match_operand:DF 2 "register_operand" "f"))))
5031 (set (match_operand:DF 4 "register_operand" "=&f")
5032 (mult:DF (match_dup 1) (match_dup 2)))]
5033 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
5034 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
5035 || reg_overlap_mentioned_p (operands[4], operands[2])))"
5036 "#"
5037 [(set_attr "type" "fpmuldbl")
5038 (set_attr "length" "8")])
5039
5040 (define_split
5041 [(set (match_operand:DF 0 "register_operand" "")
5042 (minus:DF (match_operand:DF 3 "register_operand" "")
5043 (mult:DF (match_operand:DF 1 "register_operand" "")
5044 (match_operand:DF 2 "register_operand" ""))))
5045 (set (match_operand:DF 4 "register_operand" "")
5046 (mult:DF (match_dup 1) (match_dup 2)))]
5047 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
5048 [(set (match_dup 4) (mult:DF (match_dup 1) (match_dup 2)))
5049 (set (match_dup 0) (minus:DF (match_dup 3)
5050 (mult:DF (match_dup 1) (match_dup 2))))]
5051 "")
5052
5053 (define_insn ""
5054 [(set (match_operand:SF 0 "register_operand" "=f")
5055 (minus:SF (match_operand:SF 3 "register_operand" "f")
5056 (mult:SF (match_operand:SF 1 "register_operand" "f")
5057 (match_operand:SF 2 "register_operand" "f"))))
5058 (set (match_operand:SF 4 "register_operand" "=&f")
5059 (mult:SF (match_dup 1) (match_dup 2)))]
5060 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
5061 && ! (reg_overlap_mentioned_p (operands[4], operands[1])
5062 || reg_overlap_mentioned_p (operands[4], operands[2])))"
5063 "#"
5064 [(set_attr "type" "fpmuldbl")
5065 (set_attr "length" "8")])
5066
5067 (define_split
5068 [(set (match_operand:SF 0 "register_operand" "")
5069 (minus:SF (match_operand:SF 3 "register_operand" "")
5070 (mult:SF (match_operand:SF 1 "register_operand" "")
5071 (match_operand:SF 2 "register_operand" ""))))
5072 (set (match_operand:SF 4 "register_operand" "")
5073 (mult:SF (match_dup 1) (match_dup 2)))]
5074 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
5075 [(set (match_dup 4) (mult:SF (match_dup 1) (match_dup 2)))
5076 (set (match_dup 0) (minus:SF (match_dup 3)
5077 (mult:SF (match_dup 1) (match_dup 2))))]
5078 "")
5079
5080 (define_insn ""
5081 [(set (match_operand:DF 0 "register_operand" "=f")
5082 (neg:DF (abs:DF (match_operand:DF 1 "register_operand" "f"))))
5083 (set (match_operand:DF 2 "register_operand" "=&f") (abs:DF (match_dup 1)))]
5084 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
5085 && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
5086 "#"
5087 [(set_attr "type" "fpalu")
5088 (set_attr "length" "8")])
5089
5090 (define_split
5091 [(set (match_operand:DF 0 "register_operand" "")
5092 (neg:DF (abs:DF (match_operand:DF 1 "register_operand" ""))))
5093 (set (match_operand:DF 2 "register_operand" "") (abs:DF (match_dup 1)))]
5094 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
5095 [(set (match_dup 2) (abs:DF (match_dup 1)))
5096 (set (match_dup 0) (neg:DF (abs:DF (match_dup 1))))]
5097 "")
5098
5099 (define_insn ""
5100 [(set (match_operand:SF 0 "register_operand" "=f")
5101 (neg:SF (abs:SF (match_operand:SF 1 "register_operand" "f"))))
5102 (set (match_operand:SF 2 "register_operand" "=&f") (abs:SF (match_dup 1)))]
5103 "(! TARGET_SOFT_FLOAT && TARGET_PA_20
5104 && ! reg_overlap_mentioned_p (operands[2], operands[1]))"
5105 "#"
5106 [(set_attr "type" "fpalu")
5107 (set_attr "length" "8")])
5108
5109 (define_split
5110 [(set (match_operand:SF 0 "register_operand" "")
5111 (neg:SF (abs:SF (match_operand:SF 1 "register_operand" ""))))
5112 (set (match_operand:SF 2 "register_operand" "") (abs:SF (match_dup 1)))]
5113 "! TARGET_SOFT_FLOAT && TARGET_PA_20"
5114 [(set (match_dup 2) (abs:SF (match_dup 1)))
5115 (set (match_dup 0) (neg:SF (abs:SF (match_dup 1))))]
5116 "")
5117 \f
5118 ;;- Shift instructions
5119
5120 ;; Optimized special case of shifting.
5121
5122 (define_insn ""
5123 [(set (match_operand:SI 0 "register_operand" "=r")
5124 (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
5125 (const_int 24)))]
5126 ""
5127 "ldb%M1 %1,%0"
5128 [(set_attr "type" "load")
5129 (set_attr "length" "4")])
5130
5131 (define_insn ""
5132 [(set (match_operand:SI 0 "register_operand" "=r")
5133 (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
5134 (const_int 16)))]
5135 ""
5136 "ldh%M1 %1,%0"
5137 [(set_attr "type" "load")
5138 (set_attr "length" "4")])
5139
5140 (define_insn ""
5141 [(set (match_operand:SI 0 "register_operand" "=r")
5142 (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
5143 (match_operand:SI 3 "shadd_operand" ""))
5144 (match_operand:SI 1 "register_operand" "r")))]
5145 ""
5146 "{sh%O3addl %2,%1,%0|shladd,l %2,%O3,%1,%0} "
5147 [(set_attr "type" "binary")
5148 (set_attr "length" "4")])
5149
5150 (define_insn ""
5151 [(set (match_operand:DI 0 "register_operand" "=r")
5152 (plus:DI (mult:DI (match_operand:DI 2 "register_operand" "r")
5153 (match_operand:DI 3 "shadd_operand" ""))
5154 (match_operand:DI 1 "register_operand" "r")))]
5155 "TARGET_64BIT"
5156 "shladd,l %2,%O3,%1,%0"
5157 [(set_attr "type" "binary")
5158 (set_attr "length" "4")])
5159
5160 (define_expand "ashlsi3"
5161 [(set (match_operand:SI 0 "register_operand" "")
5162 (ashift:SI (match_operand:SI 1 "lhs_lshift_operand" "")
5163 (match_operand:SI 2 "arith32_operand" "")))]
5164 ""
5165 "
5166 {
5167 if (GET_CODE (operands[2]) != CONST_INT)
5168 {
5169 rtx temp = gen_reg_rtx (SImode);
5170 emit_insn (gen_subsi3 (temp, GEN_INT (31), operands[2]));
5171 if (GET_CODE (operands[1]) == CONST_INT)
5172 emit_insn (gen_zvdep_imm32 (operands[0], operands[1], temp));
5173 else
5174 emit_insn (gen_zvdep32 (operands[0], operands[1], temp));
5175 DONE;
5176 }
5177 /* Make sure both inputs are not constants,
5178 there are no patterns for that. */
5179 operands[1] = force_reg (SImode, operands[1]);
5180 }")
5181
5182 (define_insn ""
5183 [(set (match_operand:SI 0 "register_operand" "=r")
5184 (ashift:SI (match_operand:SI 1 "register_operand" "r")
5185 (match_operand:SI 2 "const_int_operand" "n")))]
5186 ""
5187 "{zdep|depw,z} %1,%P2,%L2,%0"
5188 [(set_attr "type" "shift")
5189 (set_attr "length" "4")])
5190
5191 ; Match cases of op1 a CONST_INT here that zvdep_imm32 doesn't handle.
5192 ; Doing it like this makes slightly better code since reload can
5193 ; replace a register with a known value in range -16..15 with a
5194 ; constant. Ideally, we would like to merge zvdep32 and zvdep_imm32,
5195 ; but since we have no more CONST_OK... characters, that is not
5196 ; possible.
5197 (define_insn "zvdep32"
5198 [(set (match_operand:SI 0 "register_operand" "=r,r")
5199 (ashift:SI (match_operand:SI 1 "arith5_operand" "r,L")
5200 (minus:SI (const_int 31)
5201 (match_operand:SI 2 "register_operand" "q,q"))))]
5202 ""
5203 "@
5204 {zvdep %1,32,%0|depw,z %1,%%sar,32,%0}
5205 {zvdepi %1,32,%0|depwi,z %1,%%sar,32,%0}"
5206 [(set_attr "type" "shift,shift")
5207 (set_attr "length" "4,4")])
5208
5209 (define_insn "zvdep_imm32"
5210 [(set (match_operand:SI 0 "register_operand" "=r")
5211 (ashift:SI (match_operand:SI 1 "lhs_lshift_cint_operand" "")
5212 (minus:SI (const_int 31)
5213 (match_operand:SI 2 "register_operand" "q"))))]
5214 ""
5215 "*
5216 {
5217 int x = INTVAL (operands[1]);
5218 operands[2] = GEN_INT (4 + exact_log2 ((x >> 4) + 1));
5219 operands[1] = GEN_INT ((x & 0xf) - 0x10);
5220 return \"{zvdepi %1,%2,%0|depwi,z %1,%%sar,%2,%0}\";
5221 }"
5222 [(set_attr "type" "shift")
5223 (set_attr "length" "4")])
5224
5225 (define_insn "vdepi_ior"
5226 [(set (match_operand:SI 0 "register_operand" "=r")
5227 (ior:SI (ashift:SI (match_operand:SI 1 "const_int_operand" "")
5228 (minus:SI (const_int 31)
5229 (match_operand:SI 2 "register_operand" "q")))
5230 (match_operand:SI 3 "register_operand" "0")))]
5231 ; accept ...0001...1, can this be generalized?
5232 "exact_log2 (INTVAL (operands[1]) + 1) >= 0"
5233 "*
5234 {
5235 int x = INTVAL (operands[1]);
5236 operands[2] = GEN_INT (exact_log2 (x + 1));
5237 return \"{vdepi -1,%2,%0|depwi -1,%%sar,%2,%0}\";
5238 }"
5239 [(set_attr "type" "shift")
5240 (set_attr "length" "4")])
5241
5242 (define_insn "vdepi_and"
5243 [(set (match_operand:SI 0 "register_operand" "=r")
5244 (and:SI (rotate:SI (match_operand:SI 1 "const_int_operand" "")
5245 (minus:SI (const_int 31)
5246 (match_operand:SI 2 "register_operand" "q")))
5247 (match_operand:SI 3 "register_operand" "0")))]
5248 ; this can be generalized...!
5249 "INTVAL (operands[1]) == -2"
5250 "*
5251 {
5252 int x = INTVAL (operands[1]);
5253 operands[2] = GEN_INT (exact_log2 ((~x) + 1));
5254 return \"{vdepi 0,%2,%0|depwi 0,%%sar,%2,%0}\";
5255 }"
5256 [(set_attr "type" "shift")
5257 (set_attr "length" "4")])
5258
5259 (define_expand "ashldi3"
5260 [(set (match_operand:DI 0 "register_operand" "")
5261 (ashift:DI (match_operand:DI 1 "lhs_lshift_operand" "")
5262 (match_operand:DI 2 "arith32_operand" "")))]
5263 "TARGET_64BIT"
5264 "
5265 {
5266 if (GET_CODE (operands[2]) != CONST_INT)
5267 {
5268 rtx temp = gen_reg_rtx (DImode);
5269 emit_insn (gen_subdi3 (temp, GEN_INT (63), operands[2]));
5270 if (GET_CODE (operands[1]) == CONST_INT)
5271 emit_insn (gen_zvdep_imm64 (operands[0], operands[1], temp));
5272 else
5273 emit_insn (gen_zvdep64 (operands[0], operands[1], temp));
5274 DONE;
5275 }
5276 /* Make sure both inputs are not constants,
5277 there are no patterns for that. */
5278 operands[1] = force_reg (DImode, operands[1]);
5279 }")
5280
5281 (define_insn ""
5282 [(set (match_operand:DI 0 "register_operand" "=r")
5283 (ashift:DI (match_operand:DI 1 "register_operand" "r")
5284 (match_operand:DI 2 "const_int_operand" "n")))]
5285 "TARGET_64BIT"
5286 "depd,z %1,%p2,%Q2,%0"
5287 [(set_attr "type" "shift")
5288 (set_attr "length" "4")])
5289
5290 ; Match cases of op1 a CONST_INT here that zvdep_imm64 doesn't handle.
5291 ; Doing it like this makes slightly better code since reload can
5292 ; replace a register with a known value in range -16..15 with a
5293 ; constant. Ideally, we would like to merge zvdep64 and zvdep_imm64,
5294 ; but since we have no more CONST_OK... characters, that is not
5295 ; possible.
5296 (define_insn "zvdep64"
5297 [(set (match_operand:DI 0 "register_operand" "=r,r")
5298 (ashift:DI (match_operand:DI 1 "arith5_operand" "r,L")
5299 (minus:DI (const_int 63)
5300 (match_operand:DI 2 "register_operand" "q,q"))))]
5301 "TARGET_64BIT"
5302 "@
5303 depd,z %1,%%sar,64,%0
5304 depdi,z %1,%%sar,64,%0"
5305 [(set_attr "type" "shift,shift")
5306 (set_attr "length" "4,4")])
5307
5308 (define_insn "zvdep_imm64"
5309 [(set (match_operand:DI 0 "register_operand" "=r")
5310 (ashift:DI (match_operand:DI 1 "lhs_lshift_cint_operand" "")
5311 (minus:DI (const_int 63)
5312 (match_operand:DI 2 "register_operand" "q"))))]
5313 "TARGET_64BIT"
5314 "*
5315 {
5316 int x = INTVAL (operands[1]);
5317 operands[2] = GEN_INT (4 + exact_log2 ((x >> 4) + 1));
5318 operands[1] = GEN_INT ((x & 0x1f) - 0x20);
5319 return \"depdi,z %1,%%sar,%2,%0\";
5320 }"
5321 [(set_attr "type" "shift")
5322 (set_attr "length" "4")])
5323
5324 (define_insn ""
5325 [(set (match_operand:DI 0 "register_operand" "=r")
5326 (ior:DI (ashift:DI (match_operand:DI 1 "const_int_operand" "")
5327 (minus:DI (const_int 63)
5328 (match_operand:DI 2 "register_operand" "q")))
5329 (match_operand:DI 3 "register_operand" "0")))]
5330 ; accept ...0001...1, can this be generalized?
5331 "TARGET_64BIT && exact_log2 (INTVAL (operands[1]) + 1) >= 0"
5332 "*
5333 {
5334 int x = INTVAL (operands[1]);
5335 operands[2] = GEN_INT (exact_log2 (x + 1));
5336 return \"depdi -1,%%sar,%2,%0\";
5337 }"
5338 [(set_attr "type" "shift")
5339 (set_attr "length" "4")])
5340
5341 (define_insn ""
5342 [(set (match_operand:DI 0 "register_operand" "=r")
5343 (and:DI (rotate:DI (match_operand:DI 1 "const_int_operand" "")
5344 (minus:DI (const_int 63)
5345 (match_operand:DI 2 "register_operand" "q")))
5346 (match_operand:DI 3 "register_operand" "0")))]
5347 ; this can be generalized...!
5348 "TARGET_64BIT && INTVAL (operands[1]) == -2"
5349 "*
5350 {
5351 int x = INTVAL (operands[1]);
5352 operands[2] = GEN_INT (exact_log2 ((~x) + 1));
5353 return \"depdi 0,%%sar,%2,%0\";
5354 }"
5355 [(set_attr "type" "shift")
5356 (set_attr "length" "4")])
5357
5358 (define_expand "ashrsi3"
5359 [(set (match_operand:SI 0 "register_operand" "")
5360 (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
5361 (match_operand:SI 2 "arith32_operand" "")))]
5362 ""
5363 "
5364 {
5365 if (GET_CODE (operands[2]) != CONST_INT)
5366 {
5367 rtx temp = gen_reg_rtx (SImode);
5368 emit_insn (gen_subsi3 (temp, GEN_INT (31), operands[2]));
5369 emit_insn (gen_vextrs32 (operands[0], operands[1], temp));
5370 DONE;
5371 }
5372 }")
5373
5374 (define_insn ""
5375 [(set (match_operand:SI 0 "register_operand" "=r")
5376 (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
5377 (match_operand:SI 2 "const_int_operand" "n")))]
5378 ""
5379 "{extrs|extrw,s} %1,%P2,%L2,%0"
5380 [(set_attr "type" "shift")
5381 (set_attr "length" "4")])
5382
5383 (define_insn "vextrs32"
5384 [(set (match_operand:SI 0 "register_operand" "=r")
5385 (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
5386 (minus:SI (const_int 31)
5387 (match_operand:SI 2 "register_operand" "q"))))]
5388 ""
5389 "{vextrs %1,32,%0|extrw,s %1,%%sar,32,%0}"
5390 [(set_attr "type" "shift")
5391 (set_attr "length" "4")])
5392
5393 (define_expand "ashrdi3"
5394 [(set (match_operand:DI 0 "register_operand" "")
5395 (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
5396 (match_operand:DI 2 "arith32_operand" "")))]
5397 "TARGET_64BIT"
5398 "
5399 {
5400 if (GET_CODE (operands[2]) != CONST_INT)
5401 {
5402 rtx temp = gen_reg_rtx (DImode);
5403 emit_insn (gen_subdi3 (temp, GEN_INT (63), operands[2]));
5404 emit_insn (gen_vextrs64 (operands[0], operands[1], temp));
5405 DONE;
5406 }
5407 }")
5408
5409 (define_insn ""
5410 [(set (match_operand:DI 0 "register_operand" "=r")
5411 (ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
5412 (match_operand:DI 2 "const_int_operand" "n")))]
5413 "TARGET_64BIT"
5414 "extrd,s %1,%p2,%Q2,%0"
5415 [(set_attr "type" "shift")
5416 (set_attr "length" "4")])
5417
5418 (define_insn "vextrs64"
5419 [(set (match_operand:DI 0 "register_operand" "=r")
5420 (ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
5421 (minus:DI (const_int 63)
5422 (match_operand:DI 2 "register_operand" "q"))))]
5423 "TARGET_64BIT"
5424 "extrd,s %1,%%sar,64,%0"
5425 [(set_attr "type" "shift")
5426 (set_attr "length" "4")])
5427
5428 (define_insn "lshrsi3"
5429 [(set (match_operand:SI 0 "register_operand" "=r,r")
5430 (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
5431 (match_operand:SI 2 "arith32_operand" "q,n")))]
5432 ""
5433 "@
5434 {vshd %%r0,%1,%0|shrpw %%r0,%1,%%sar,%0}
5435 {extru|extrw,u} %1,%P2,%L2,%0"
5436 [(set_attr "type" "shift")
5437 (set_attr "length" "4")])
5438
5439 (define_insn "lshrdi3"
5440 [(set (match_operand:DI 0 "register_operand" "=r,r")
5441 (lshiftrt:DI (match_operand:DI 1 "register_operand" "r,r")
5442 (match_operand:DI 2 "arith32_operand" "q,n")))]
5443 "TARGET_64BIT"
5444 "@
5445 shrpd %%r0,%1,%%sar,%0
5446 extrd,u %1,%p2,%Q2,%0"
5447 [(set_attr "type" "shift")
5448 (set_attr "length" "4")])
5449
5450 (define_insn "rotrsi3"
5451 [(set (match_operand:SI 0 "register_operand" "=r,r")
5452 (rotatert:SI (match_operand:SI 1 "register_operand" "r,r")
5453 (match_operand:SI 2 "arith32_operand" "q,n")))]
5454 ""
5455 "*
5456 {
5457 if (GET_CODE (operands[2]) == CONST_INT)
5458 {
5459 operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
5460 return \"{shd|shrpw} %1,%1,%2,%0\";
5461 }
5462 else
5463 return \"{vshd %1,%1,%0|shrpw %1,%1,%%sar,%0}\";
5464 }"
5465 [(set_attr "type" "shift")
5466 (set_attr "length" "4")])
5467
5468 (define_expand "rotlsi3"
5469 [(set (match_operand:SI 0 "register_operand" "")
5470 (rotate:SI (match_operand:SI 1 "register_operand" "")
5471 (match_operand:SI 2 "arith32_operand" "")))]
5472 ""
5473 "
5474 {
5475 if (GET_CODE (operands[2]) != CONST_INT)
5476 {
5477 rtx temp = gen_reg_rtx (SImode);
5478 emit_insn (gen_subsi3 (temp, GEN_INT (32), operands[2]));
5479 emit_insn (gen_rotrsi3 (operands[0], operands[1], temp));
5480 DONE;
5481 }
5482 /* Else expand normally. */
5483 }")
5484
5485 (define_insn ""
5486 [(set (match_operand:SI 0 "register_operand" "=r")
5487 (rotate:SI (match_operand:SI 1 "register_operand" "r")
5488 (match_operand:SI 2 "const_int_operand" "n")))]
5489 ""
5490 "*
5491 {
5492 operands[2] = GEN_INT ((32 - INTVAL (operands[2])) & 31);
5493 return \"{shd|shrpw} %1,%1,%2,%0\";
5494 }"
5495 [(set_attr "type" "shift")
5496 (set_attr "length" "4")])
5497
5498 (define_insn ""
5499 [(set (match_operand:SI 0 "register_operand" "=r")
5500 (match_operator:SI 5 "plus_xor_ior_operator"
5501 [(ashift:SI (match_operand:SI 1 "register_operand" "r")
5502 (match_operand:SI 3 "const_int_operand" "n"))
5503 (lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
5504 (match_operand:SI 4 "const_int_operand" "n"))]))]
5505 "INTVAL (operands[3]) + INTVAL (operands[4]) == 32"
5506 "{shd|shrpw} %1,%2,%4,%0"
5507 [(set_attr "type" "shift")
5508 (set_attr "length" "4")])
5509
5510 (define_insn ""
5511 [(set (match_operand:SI 0 "register_operand" "=r")
5512 (match_operator:SI 5 "plus_xor_ior_operator"
5513 [(lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
5514 (match_operand:SI 4 "const_int_operand" "n"))
5515 (ashift:SI (match_operand:SI 1 "register_operand" "r")
5516 (match_operand:SI 3 "const_int_operand" "n"))]))]
5517 "INTVAL (operands[3]) + INTVAL (operands[4]) == 32"
5518 "{shd|shrpw} %1,%2,%4,%0"
5519 [(set_attr "type" "shift")
5520 (set_attr "length" "4")])
5521
5522 (define_insn ""
5523 [(set (match_operand:SI 0 "register_operand" "=r")
5524 (and:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
5525 (match_operand:SI 2 "const_int_operand" ""))
5526 (match_operand:SI 3 "const_int_operand" "")))]
5527 "exact_log2 (1 + (INTVAL (operands[3]) >> (INTVAL (operands[2]) & 31))) >= 0"
5528 "*
5529 {
5530 int cnt = INTVAL (operands[2]) & 31;
5531 operands[3] = GEN_INT (exact_log2 (1 + (INTVAL (operands[3]) >> cnt)));
5532 operands[2] = GEN_INT (31 - cnt);
5533 return \"{zdep|depw,z} %1,%2,%3,%0\";
5534 }"
5535 [(set_attr "type" "shift")
5536 (set_attr "length" "4")])
5537 \f
5538 ;; Unconditional and other jump instructions.
5539
5540 ;; This can only be used in a leaf function, so we do
5541 ;; not need to use the PIC register when generating PIC code.
5542 (define_insn "return"
5543 [(return)
5544 (use (reg:SI 2))
5545 (const_int 0)]
5546 "hppa_can_use_return_insn_p ()"
5547 "*
5548 {
5549 if (TARGET_PA_20)
5550 return \"bve%* (%%r2)\";
5551 return \"bv%* %%r0(%%r2)\";
5552 }"
5553 [(set_attr "type" "branch")
5554 (set_attr "length" "4")])
5555
5556 ;; Emit a different pattern for functions which have non-trivial
5557 ;; epilogues so as not to confuse jump and reorg.
5558 (define_insn "return_internal"
5559 [(return)
5560 (use (reg:SI 2))
5561 (const_int 1)]
5562 "! flag_pic"
5563 "*
5564 {
5565 if (TARGET_PA_20)
5566 return \"bve%* (%%r2)\";
5567 return \"bv%* %%r0(%%r2)\";
5568 }"
5569 [(set_attr "type" "branch")
5570 (set_attr "length" "4")])
5571
5572 ;; Use the PIC register to ensure it's restored after a
5573 ;; call in PIC mode.
5574 (define_insn "return_internal_pic"
5575 [(return)
5576 (use (match_operand 0 "register_operand" "r"))
5577 (use (reg:SI 2))]
5578 "flag_pic && true_regnum (operands[0]) == PIC_OFFSET_TABLE_REGNUM"
5579 "*
5580 {
5581 if (TARGET_PA_20)
5582 return \"bve%* (%%r2)\";
5583 return \"bv%* %%r0(%%r2)\";
5584 }"
5585 [(set_attr "type" "branch")
5586 (set_attr "length" "4")])
5587
5588 (define_expand "prologue"
5589 [(const_int 0)]
5590 ""
5591 "hppa_expand_prologue ();DONE;")
5592
5593 (define_expand "sibcall_epilogue"
5594 [(return)]
5595 ""
5596 "
5597 {
5598 hppa_expand_epilogue ();
5599 DONE;
5600 }")
5601
5602 (define_expand "epilogue"
5603 [(return)]
5604 ""
5605 "
5606 {
5607 /* Try to use the trivial return first. Else use the full
5608 epilogue. */
5609 if (hppa_can_use_return_insn_p ())
5610 emit_jump_insn (gen_return ());
5611 else
5612 {
5613 rtx x;
5614
5615 hppa_expand_epilogue ();
5616 if (flag_pic)
5617 x = gen_return_internal_pic (gen_rtx_REG (word_mode,
5618 PIC_OFFSET_TABLE_REGNUM));
5619 else
5620 x = gen_return_internal ();
5621 emit_jump_insn (x);
5622 }
5623 DONE;
5624 }")
5625
5626 ;; Special because we use the value placed in %r2 by the bl instruction
5627 ;; from within its delay slot to set the value for the 2nd parameter to
5628 ;; the call.
5629 (define_insn "call_profiler"
5630 [(call (mem:SI (match_operand 0 "call_operand_address" ""))
5631 (match_operand 1 "" ""))
5632 (use (match_operand 2 "" ""))
5633 (use (reg:SI 25))
5634 (use (reg:SI 26))
5635 (clobber (reg:SI 2))]
5636 ""
5637 "*
5638 {
5639 rtx xoperands[3];
5640
5641 output_arg_descriptor (insn);
5642
5643 xoperands[0] = operands[0];
5644 xoperands[1] = operands[2];
5645 xoperands[2] = gen_label_rtx ();
5646 output_asm_insn (\"{bl|b,l} %0,%%r2\;ldo %1-%2(%%r2),%%r25\", xoperands);
5647
5648 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
5649 CODE_LABEL_NUMBER (xoperands[2]));
5650 return \"\";
5651 }"
5652 [(set_attr "type" "multi")
5653 (set_attr "length" "8")])
5654
5655 (define_insn "blockage"
5656 [(unspec_volatile [(const_int 2)] 0)]
5657 ""
5658 ""
5659 [(set_attr "length" "0")])
5660
5661 (define_insn "jump"
5662 [(set (pc) (label_ref (match_operand 0 "" "")))]
5663 ""
5664 "*
5665 {
5666 extern int optimize;
5667
5668 if (GET_MODE (insn) == SImode)
5669 return \"b %l0%#\";
5670
5671 /* An unconditional branch which can reach its target. */
5672 if (get_attr_length (insn) != 24
5673 && get_attr_length (insn) != 16)
5674 return \"b%* %l0\";
5675
5676 /* An unconditional branch which can not reach its target.
5677
5678 We need to be able to use %r1 as a scratch register; however,
5679 we can never be sure whether or not it's got a live value in
5680 it. Therefore, we must restore its original value after the
5681 jump.
5682
5683 To make matters worse, we don't have a stack slot which we
5684 can always clobber. sp-12/sp-16 shouldn't ever have a live
5685 value during a non-optimizing compilation, so we use those
5686 slots for now. We don't support very long branches when
5687 optimizing -- they should be quite rare when optimizing.
5688
5689 Really the way to go long term is a register scavenger; goto
5690 the target of the jump and find a register which we can use
5691 as a scratch to hold the value in %r1. */
5692
5693 /* We don't know how to register scavenge yet. */
5694 if (optimize)
5695 abort ();
5696
5697 /* First store %r1 into the stack. */
5698 output_asm_insn (\"stw %%r1,-16(%%r30)\", operands);
5699
5700 /* Now load the target address into %r1 and do an indirect jump
5701 to the value specified in %r1. Be careful to generate PIC
5702 code as needed. */
5703 if (flag_pic)
5704 {
5705 rtx xoperands[2];
5706 xoperands[0] = operands[0];
5707 xoperands[1] = gen_label_rtx ();
5708
5709 output_asm_insn (\"{bl|b,l} .+8,%%r1\\n\\taddil L'%l0-%l1,%%r1\",
5710 xoperands);
5711 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
5712 CODE_LABEL_NUMBER (xoperands[1]));
5713 output_asm_insn (\"ldo R'%l0-%l1(%%r1),%%r1\\n\\tbv %%r0(%%r1)\",
5714 xoperands);
5715 }
5716 else
5717 output_asm_insn (\"ldil L'%l0,%%r1\\n\\tbe R'%l0(%%sr4,%%r1)\", operands);;
5718
5719 /* And restore the value of %r1 in the delay slot. We're not optimizing,
5720 so we know nothing else can be in the delay slot. */
5721 return \"ldw -16(%%r30),%%r1\";
5722 }"
5723 [(set_attr "type" "uncond_branch")
5724 (set_attr "pa_combine_type" "uncond_branch")
5725 (set (attr "length")
5726 (cond [(eq (symbol_ref "jump_in_call_delay (insn)") (const_int 1))
5727 (if_then_else (lt (abs (minus (match_dup 0)
5728 (plus (pc) (const_int 8))))
5729 (const_int 8184))
5730 (const_int 4)
5731 (const_int 8))
5732 (ge (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
5733 (const_int 262100))
5734 (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
5735 (const_int 16)
5736 (const_int 24))]
5737 (const_int 4)))])
5738
5739 ;; Subroutines of "casesi".
5740 ;; operand 0 is index
5741 ;; operand 1 is the minimum bound
5742 ;; operand 2 is the maximum bound - minimum bound + 1
5743 ;; operand 3 is CODE_LABEL for the table;
5744 ;; operand 4 is the CODE_LABEL to go to if index out of range.
5745
5746 (define_expand "casesi"
5747 [(match_operand:SI 0 "general_operand" "")
5748 (match_operand:SI 1 "const_int_operand" "")
5749 (match_operand:SI 2 "const_int_operand" "")
5750 (match_operand 3 "" "")
5751 (match_operand 4 "" "")]
5752 ""
5753 "
5754 {
5755 if (GET_CODE (operands[0]) != REG)
5756 operands[0] = force_reg (SImode, operands[0]);
5757
5758 if (operands[1] != const0_rtx)
5759 {
5760 rtx reg = gen_reg_rtx (SImode);
5761
5762 operands[1] = GEN_INT (-INTVAL (operands[1]));
5763 if (!INT_14_BITS (operands[1]))
5764 operands[1] = force_reg (SImode, operands[1]);
5765 emit_insn (gen_addsi3 (reg, operands[0], operands[1]));
5766
5767 operands[0] = reg;
5768 }
5769
5770 /* In 64bit mode we must make sure to wipe the upper bits of the register
5771 just in case the addition overflowed or we had random bits in the
5772 high part of the register. */
5773 if (TARGET_64BIT)
5774 {
5775 rtx reg = gen_reg_rtx (DImode);
5776 emit_insn (gen_extendsidi2 (reg, operands[0]));
5777 operands[0] = gen_rtx_SUBREG (SImode, reg, 0);
5778 }
5779
5780 if (!INT_5_BITS (operands[2]))
5781 operands[2] = force_reg (SImode, operands[2]);
5782
5783 emit_insn (gen_cmpsi (operands[0], operands[2]));
5784 emit_jump_insn (gen_bgtu (operands[4]));
5785 if (TARGET_BIG_SWITCH)
5786 {
5787 rtx temp = gen_reg_rtx (SImode);
5788 emit_move_insn (temp, gen_rtx_PLUS (SImode, operands[0], operands[0]));
5789 operands[0] = temp;
5790 }
5791 emit_jump_insn (gen_casesi0 (operands[0], operands[3]));
5792 DONE;
5793 }")
5794
5795 (define_insn "casesi0"
5796 [(set (pc) (plus:SI
5797 (mem:SI (plus:SI (pc)
5798 (match_operand:SI 0 "register_operand" "r")))
5799 (label_ref (match_operand 1 "" ""))))]
5800 ""
5801 "blr %0,%%r0\;nop"
5802 [(set_attr "type" "multi")
5803 (set_attr "length" "8")])
5804
5805 ;; Need nops for the calls because execution is supposed to continue
5806 ;; past; we don't want to nullify an instruction that we need.
5807 ;;- jump to subroutine
5808
5809 (define_expand "call"
5810 [(parallel [(call (match_operand:SI 0 "" "")
5811 (match_operand 1 "" ""))
5812 (clobber (reg:SI 2))])]
5813 ""
5814 "
5815 {
5816 rtx op;
5817 rtx call_insn;
5818
5819 if (TARGET_PORTABLE_RUNTIME)
5820 op = force_reg (SImode, XEXP (operands[0], 0));
5821 else
5822 op = XEXP (operands[0], 0);
5823
5824 if (TARGET_64BIT)
5825 emit_move_insn (arg_pointer_rtx,
5826 gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
5827 GEN_INT (64)));
5828
5829 /* Use two different patterns for calls to explicitly named functions
5830 and calls through function pointers. This is necessary as these two
5831 types of calls use different calling conventions, and CSE might try
5832 to change the named call into an indirect call in some cases (using
5833 two patterns keeps CSE from performing this optimization). */
5834 if (GET_CODE (op) == SYMBOL_REF)
5835 call_insn = emit_call_insn (gen_call_internal_symref (op, operands[1]));
5836 else if (TARGET_64BIT)
5837 {
5838 rtx tmpreg = force_reg (word_mode, op);
5839 call_insn = emit_call_insn (gen_call_internal_reg_64bit (tmpreg,
5840 operands[1]));
5841 }
5842 else
5843 {
5844 rtx tmpreg = gen_rtx_REG (word_mode, 22);
5845 emit_move_insn (tmpreg, force_reg (word_mode, op));
5846 call_insn = emit_call_insn (gen_call_internal_reg (operands[1]));
5847 }
5848
5849 if (flag_pic)
5850 {
5851 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
5852 if (TARGET_64BIT)
5853 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
5854
5855 /* After each call we must restore the PIC register, even if it
5856 doesn't appear to be used. */
5857 emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
5858 }
5859 DONE;
5860 }")
5861
5862 (define_insn "call_internal_symref"
5863 [(call (mem:SI (match_operand 0 "call_operand_address" ""))
5864 (match_operand 1 "" "i"))
5865 (clobber (reg:SI 2))
5866 (use (const_int 0))]
5867 "! TARGET_PORTABLE_RUNTIME"
5868 "*
5869 {
5870 output_arg_descriptor (insn);
5871 return output_call (insn, operands[0], 0);
5872 }"
5873 [(set_attr "type" "call")
5874 (set (attr "length")
5875 ;; If we're sure that we can either reach the target or that the
5876 ;; linker can use a long-branch stub, then the length is 4 bytes.
5877 ;;
5878 ;; For long-calls the length will be either 52 bytes (non-pic)
5879 ;; or 68 bytes (pic). */
5880 ;; Else we have to use a long-call;
5881 (if_then_else (lt (plus (symbol_ref "total_code_bytes") (pc))
5882 (const_int 240000))
5883 (const_int 4)
5884 (if_then_else (eq (symbol_ref "flag_pic")
5885 (const_int 0))
5886 (const_int 52)
5887 (const_int 68))))])
5888
5889 (define_insn "call_internal_reg_64bit"
5890 [(call (mem:SI (match_operand:DI 0 "register_operand" "r"))
5891 (match_operand 1 "" "i"))
5892 (clobber (reg:SI 2))
5893 (use (const_int 1))]
5894 "TARGET_64BIT"
5895 "*
5896 {
5897 rtx xoperands[2];
5898
5899 /* ??? Needs more work. Length computation, split into multiple insns,
5900 do not use %r22 directly, expose delay slot. */
5901 return \"ldd 16(%0),%%r2\;ldd 24(%0),%%r27\;bve,l (%%r2),%%r2\;nop\";
5902 }"
5903 [(set_attr "type" "dyncall")
5904 (set (attr "length") (const_int 16))])
5905
5906 (define_insn "call_internal_reg"
5907 [(call (mem:SI (reg:SI 22))
5908 (match_operand 0 "" "i"))
5909 (clobber (reg:SI 2))
5910 (use (const_int 1))]
5911 ""
5912 "*
5913 {
5914 rtx xoperands[2];
5915
5916 /* First the special case for kernels, level 0 systems, etc. */
5917 if (TARGET_FAST_INDIRECT_CALLS)
5918 return \"ble 0(%%sr4,%%r22)\;copy %%r31,%%r2\";
5919
5920 /* Now the normal case -- we can reach $$dyncall directly or
5921 we're sure that we can get there via a long-branch stub.
5922
5923 No need to check target flags as the length uniquely identifies
5924 the remaining cases. */
5925 if (get_attr_length (insn) == 8)
5926 return \".CALL\\tARGW0=GR\;{bl|b,l} $$dyncall,%%r31\;copy %%r31,%%r2\";
5927
5928 /* Long millicode call, but we are not generating PIC or portable runtime
5929 code. */
5930 if (get_attr_length (insn) == 12)
5931 return \".CALL\\tARGW0=GR\;ldil L%%$$dyncall,%%r2\;ble R%%$$dyncall(%%sr4,%%r2)\;copy %%r31,%%r2\";
5932
5933 /* Long millicode call for portable runtime. */
5934 if (get_attr_length (insn) == 20)
5935 return \"ldil L%%$$dyncall,%%r31\;ldo R%%$$dyncall(%%r31),%%r31\;blr %%r0,%%r2\;bv,n %%r0(%%r31)\;nop\";
5936
5937 /* If we're generating PIC code. */
5938 xoperands[0] = operands[0];
5939 xoperands[1] = gen_label_rtx ();
5940 output_asm_insn (\"{bl|b,l} .+8,%%r1\", xoperands);
5941 output_asm_insn (\"addil L%%$$dyncall-%1,%%r1\", xoperands);
5942 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
5943 CODE_LABEL_NUMBER (xoperands[1]));
5944 output_asm_insn (\"ldo R%%$$dyncall-%1(%%r1),%%r1\", xoperands);
5945 output_asm_insn (\"blr %%r0,%%r2\", xoperands);
5946 output_asm_insn (\"bv,n %%r0(%%r1)\\n\\tnop\", xoperands);
5947 return \"\";
5948 }"
5949 [(set_attr "type" "dyncall")
5950 (set (attr "length")
5951 (cond [
5952 ;; First FAST_INDIRECT_CALLS
5953 (ne (symbol_ref "TARGET_FAST_INDIRECT_CALLS")
5954 (const_int 0))
5955 (const_int 8)
5956
5957 ;; Target (or stub) within reach
5958 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
5959 (const_int 240000))
5960 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
5961 (const_int 0)))
5962 (const_int 8)
5963
5964 ;; Out of reach PIC
5965 (ne (symbol_ref "flag_pic")
5966 (const_int 0))
5967 (const_int 24)
5968
5969 ;; Out of reach PORTABLE_RUNTIME
5970 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
5971 (const_int 0))
5972 (const_int 20)]
5973
5974 ;; Out of reach, can use ble
5975 (const_int 12)))])
5976
5977 (define_expand "call_value"
5978 [(parallel [(set (match_operand 0 "" "")
5979 (call (match_operand:SI 1 "" "")
5980 (match_operand 2 "" "")))
5981 (clobber (reg:SI 2))])]
5982 ""
5983 "
5984 {
5985 rtx op;
5986 rtx call_insn;
5987
5988 if (TARGET_PORTABLE_RUNTIME)
5989 op = force_reg (word_mode, XEXP (operands[1], 0));
5990 else
5991 op = XEXP (operands[1], 0);
5992
5993 if (TARGET_64BIT)
5994 emit_move_insn (arg_pointer_rtx,
5995 gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
5996 GEN_INT (64)));
5997
5998 /* Use two different patterns for calls to explicitly named functions
5999 and calls through function pointers. This is necessary as these two
6000 types of calls use different calling conventions, and CSE might try
6001 to change the named call into an indirect call in some cases (using
6002 two patterns keeps CSE from performing this optimization). */
6003 if (GET_CODE (op) == SYMBOL_REF)
6004 call_insn = emit_call_insn (gen_call_value_internal_symref (operands[0],
6005 op,
6006 operands[2]));
6007 else if (TARGET_64BIT)
6008 {
6009 rtx tmpreg = force_reg (word_mode, op);
6010 call_insn
6011 = emit_call_insn (gen_call_value_internal_reg_64bit (operands[0],
6012 tmpreg,
6013 operands[2]));
6014 }
6015 else
6016 {
6017 rtx tmpreg = gen_rtx_REG (word_mode, 22);
6018 emit_move_insn (tmpreg, force_reg (word_mode, op));
6019 call_insn = emit_call_insn (gen_call_value_internal_reg (operands[0],
6020 operands[2]));
6021 }
6022 if (flag_pic)
6023 {
6024 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
6025 if (TARGET_64BIT)
6026 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
6027
6028 /* After each call we must restore the PIC register, even if it
6029 doesn't appear to be used. */
6030 emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
6031 }
6032 DONE;
6033 }")
6034
6035 (define_insn "call_value_internal_symref"
6036 [(set (match_operand 0 "" "=rf")
6037 (call (mem:SI (match_operand 1 "call_operand_address" ""))
6038 (match_operand 2 "" "i")))
6039 (clobber (reg:SI 2))
6040 (use (const_int 0))]
6041 ;;- Don't use operand 1 for most machines.
6042 "! TARGET_PORTABLE_RUNTIME"
6043 "*
6044 {
6045 output_arg_descriptor (insn);
6046 return output_call (insn, operands[1], 0);
6047 }"
6048 [(set_attr "type" "call")
6049 (set (attr "length")
6050 ;; If we're sure that we can either reach the target or that the
6051 ;; linker can use a long-branch stub, then the length is 4 bytes.
6052 ;;
6053 ;; For long-calls the length will be either 52 bytes (non-pic)
6054 ;; or 68 bytes (pic). */
6055 ;; Else we have to use a long-call;
6056 (if_then_else (lt (plus (symbol_ref "total_code_bytes") (pc))
6057 (const_int 240000))
6058 (const_int 4)
6059 (if_then_else (eq (symbol_ref "flag_pic")
6060 (const_int 0))
6061 (const_int 52)
6062 (const_int 68))))])
6063
6064 (define_insn "call_value_internal_reg_64bit"
6065 [(set (match_operand 0 "" "=rf")
6066 (call (mem:SI (match_operand:DI 1 "register_operand" "r"))
6067 (match_operand 2 "" "i")))
6068 (clobber (reg:SI 2))
6069 (use (const_int 1))]
6070 "TARGET_64BIT"
6071 "*
6072 {
6073 /* ??? Needs more work. Length computation, split into multiple insns,
6074 do not use %r22 directly, expose delay slot. */
6075 return \"ldd 16(%1),%%r2\;ldd 24(%1),%%r27\;bve,l (%%r2),%%r2\;nop\";
6076 }"
6077 [(set_attr "type" "dyncall")
6078 (set (attr "length") (const_int 16))])
6079
6080 (define_insn "call_value_internal_reg"
6081 [(set (match_operand 0 "" "=rf")
6082 (call (mem:SI (reg:SI 22))
6083 (match_operand 1 "" "i")))
6084 (clobber (reg:SI 2))
6085 (use (const_int 1))]
6086 ""
6087 "*
6088 {
6089 rtx xoperands[2];
6090
6091 /* First the special case for kernels, level 0 systems, etc. */
6092 if (TARGET_FAST_INDIRECT_CALLS)
6093 return \"ble 0(%%sr4,%%r22)\;copy %%r31,%%r2\";
6094
6095 /* Now the normal case -- we can reach $$dyncall directly or
6096 we're sure that we can get there via a long-branch stub.
6097
6098 No need to check target flags as the length uniquely identifies
6099 the remaining cases. */
6100 if (get_attr_length (insn) == 8)
6101 return \".CALL\\tARGW0=GR\;{bl|b,l} $$dyncall,%%r31\;copy %%r31,%%r2\";
6102
6103 /* Long millicode call, but we are not generating PIC or portable runtime
6104 code. */
6105 if (get_attr_length (insn) == 12)
6106 return \".CALL\\tARGW0=GR\;ldil L%%$$dyncall,%%r2\;ble R%%$$dyncall(%%sr4,%%r2)\;copy %%r31,%%r2\";
6107
6108 /* Long millicode call for portable runtime. */
6109 if (get_attr_length (insn) == 20)
6110 return \"ldil L%%$$dyncall,%%r31\;ldo R%%$$dyncall(%%r31),%%r31\;blr %%r0,%%r2\;bv,n %%r0(%%r31)\;nop\";
6111
6112 /* If we're generating PIC code. */
6113 xoperands[0] = operands[1];
6114 xoperands[1] = gen_label_rtx ();
6115 output_asm_insn (\"{bl|b,l} .+8,%%r1\", xoperands);
6116 output_asm_insn (\"addil L%%$$dyncall-%1,%%r1\", xoperands);
6117 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
6118 CODE_LABEL_NUMBER (xoperands[1]));
6119 output_asm_insn (\"ldo R%%$$dyncall-%1(%%r1),%%r1\", xoperands);
6120 output_asm_insn (\"blr %%r0,%%r2\", xoperands);
6121 output_asm_insn (\"bv,n %%r0(%%r1)\\n\\tnop\", xoperands);
6122 return \"\";
6123 }"
6124 [(set_attr "type" "dyncall")
6125 (set (attr "length")
6126 (cond [
6127 ;; First FAST_INDIRECT_CALLS
6128 (ne (symbol_ref "TARGET_FAST_INDIRECT_CALLS")
6129 (const_int 0))
6130 (const_int 8)
6131
6132 ;; Target (or stub) within reach
6133 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
6134 (const_int 240000))
6135 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
6136 (const_int 0)))
6137 (const_int 8)
6138
6139 ;; Out of reach PIC
6140 (ne (symbol_ref "flag_pic")
6141 (const_int 0))
6142 (const_int 24)
6143
6144 ;; Out of reach PORTABLE_RUNTIME
6145 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
6146 (const_int 0))
6147 (const_int 20)]
6148
6149 ;; Out of reach, can use ble
6150 (const_int 12)))])
6151
6152 ;; Call subroutine returning any type.
6153
6154 (define_expand "untyped_call"
6155 [(parallel [(call (match_operand 0 "" "")
6156 (const_int 0))
6157 (match_operand 1 "" "")
6158 (match_operand 2 "" "")])]
6159 ""
6160 "
6161 {
6162 int i;
6163
6164 emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
6165
6166 for (i = 0; i < XVECLEN (operands[2], 0); i++)
6167 {
6168 rtx set = XVECEXP (operands[2], 0, i);
6169 emit_move_insn (SET_DEST (set), SET_SRC (set));
6170 }
6171
6172 /* The optimizer does not know that the call sets the function value
6173 registers we stored in the result block. We avoid problems by
6174 claiming that all hard registers are used and clobbered at this
6175 point. */
6176 emit_insn (gen_blockage ());
6177
6178 DONE;
6179 }")
6180
6181 (define_expand "sibcall"
6182 [(parallel [(call (match_operand:SI 0 "" "")
6183 (match_operand 1 "" ""))
6184 (clobber (reg:SI 0))])]
6185 "! TARGET_PORTABLE_RUNTIME"
6186 "
6187 {
6188 rtx op;
6189 rtx call_insn;
6190
6191 op = XEXP (operands[0], 0);
6192
6193 /* We do not allow indirect sibling calls. */
6194 call_insn = emit_call_insn (gen_sibcall_internal_symref (op, operands[1]));
6195
6196 if (flag_pic)
6197 {
6198 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
6199
6200 /* After each call we must restore the PIC register, even if it
6201 doesn't appear to be used. */
6202 emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
6203 }
6204 DONE;
6205 }")
6206
6207 (define_insn "sibcall_internal_symref"
6208 [(call (mem:SI (match_operand 0 "call_operand_address" ""))
6209 (match_operand 1 "" "i"))
6210 (clobber (reg:SI 0))
6211 (use (reg:SI 2))
6212 (use (const_int 0))]
6213 "! TARGET_PORTABLE_RUNTIME"
6214 "*
6215 {
6216 output_arg_descriptor (insn);
6217 return output_call (insn, operands[0], 1);
6218 }"
6219 [(set_attr "type" "call")
6220 (set (attr "length")
6221 ;; If we're sure that we can either reach the target or that the
6222 ;; linker can use a long-branch stub, then the length is 4 bytes.
6223 ;;
6224 ;; For long-calls the length will be either 52 bytes (non-pic)
6225 ;; or 68 bytes (pic). */
6226 ;; Else we have to use a long-call;
6227 (if_then_else (lt (plus (symbol_ref "total_code_bytes") (pc))
6228 (const_int 240000))
6229 (const_int 4)
6230 (if_then_else (eq (symbol_ref "flag_pic")
6231 (const_int 0))
6232 (const_int 52)
6233 (const_int 68))))])
6234
6235 (define_expand "sibcall_value"
6236 [(parallel [(set (match_operand 0 "" "")
6237 (call (match_operand:SI 1 "" "")
6238 (match_operand 2 "" "")))
6239 (clobber (reg:SI 0))])]
6240 "! TARGET_PORTABLE_RUNTIME"
6241 "
6242 {
6243 rtx op;
6244 rtx call_insn;
6245
6246 op = XEXP (operands[1], 0);
6247
6248 /* We do not allow indirect sibling calls. */
6249 call_insn = emit_call_insn (gen_sibcall_value_internal_symref (operands[0],
6250 op,
6251 operands[2]));
6252 if (flag_pic)
6253 {
6254 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
6255
6256 /* After each call we must restore the PIC register, even if it
6257 doesn't appear to be used. */
6258 emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
6259 }
6260 DONE;
6261 }")
6262
6263 (define_insn "sibcall_value_internal_symref"
6264 [(set (match_operand 0 "" "=rf")
6265 (call (mem:SI (match_operand 1 "call_operand_address" ""))
6266 (match_operand 2 "" "i")))
6267 (clobber (reg:SI 0))
6268 (use (reg:SI 2))
6269 (use (const_int 0))]
6270 ;;- Don't use operand 1 for most machines.
6271 "! TARGET_PORTABLE_RUNTIME"
6272 "*
6273 {
6274 output_arg_descriptor (insn);
6275 return output_call (insn, operands[1], 1);
6276 }"
6277 [(set_attr "type" "call")
6278 (set (attr "length")
6279 ;; If we're sure that we can either reach the target or that the
6280 ;; linker can use a long-branch stub, then the length is 4 bytes.
6281 ;;
6282 ;; For long-calls the length will be either 52 bytes (non-pic)
6283 ;; or 68 bytes (pic). */
6284 ;; Else we have to use a long-call;
6285 (if_then_else (lt (plus (symbol_ref "total_code_bytes") (pc))
6286 (const_int 240000))
6287 (const_int 4)
6288 (if_then_else (eq (symbol_ref "flag_pic")
6289 (const_int 0))
6290 (const_int 52)
6291 (const_int 68))))])
6292
6293 (define_insn "nop"
6294 [(const_int 0)]
6295 ""
6296 "nop"
6297 [(set_attr "type" "move")
6298 (set_attr "length" "4")])
6299
6300 ;; These are just placeholders so we know where branch tables
6301 ;; begin and end.
6302 (define_insn "begin_brtab"
6303 [(const_int 1)]
6304 ""
6305 "*
6306 {
6307 /* Only GAS actually supports this pseudo-op. */
6308 if (TARGET_GAS)
6309 return \".begin_brtab\";
6310 else
6311 return \"\";
6312 }"
6313 [(set_attr "type" "move")
6314 (set_attr "length" "0")])
6315
6316 (define_insn "end_brtab"
6317 [(const_int 2)]
6318 ""
6319 "*
6320 {
6321 /* Only GAS actually supports this pseudo-op. */
6322 if (TARGET_GAS)
6323 return \".end_brtab\";
6324 else
6325 return \"\";
6326 }"
6327 [(set_attr "type" "move")
6328 (set_attr "length" "0")])
6329
6330 ;;; EH does longjmp's from and within the data section. Thus,
6331 ;;; an interspace branch is required for the longjmp implementation.
6332 ;;; Registers r1 and r2 are used as scratch registers for the jump.
6333 (define_expand "interspace_jump"
6334 [(parallel
6335 [(set (pc) (match_operand 0 "pmode_register_operand" "a"))
6336 (clobber (match_dup 1))])]
6337 ""
6338 "
6339 {
6340 operands[1] = gen_rtx_REG (word_mode, 2);
6341 }")
6342
6343 (define_insn ""
6344 [(set (pc) (match_operand 0 "pmode_register_operand" "a"))
6345 (clobber (reg:SI 2))]
6346 "!TARGET_64BIT"
6347 "ldsid (%%sr0,%0),%%r2\; mtsp %%r2,%%sr0\; be%* 0(%%sr0,%0)"
6348 [(set_attr "type" "branch")
6349 (set_attr "length" "12")])
6350
6351 (define_insn ""
6352 [(set (pc) (match_operand 0 "pmode_register_operand" "a"))
6353 (clobber (reg:DI 2))]
6354 "TARGET_64BIT"
6355 "ldsid (%%sr0,%0),%%r2\; mtsp %%r2,%%sr0\; be%* 0(%%sr0,%0)"
6356 [(set_attr "type" "branch")
6357 (set_attr "length" "12")])
6358
6359 (define_expand "builtin_longjmp"
6360 [(unspec_volatile [(match_operand 0 "register_operand" "r")] 3)]
6361 ""
6362 "
6363 {
6364 /* The elements of the buffer are, in order: */
6365 rtx fp = gen_rtx_MEM (Pmode, operands[0]);
6366 rtx lab = gen_rtx_MEM (Pmode, plus_constant (operands[0],
6367 POINTER_SIZE / BITS_PER_UNIT));
6368 rtx stack = gen_rtx_MEM (Pmode, plus_constant (operands[0],
6369 (POINTER_SIZE * 2) / BITS_PER_UNIT));
6370 rtx pv = gen_rtx_REG (Pmode, 1);
6371
6372 /* This bit is the same as expand_builtin_longjmp. */
6373 emit_move_insn (hard_frame_pointer_rtx, fp);
6374 emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
6375 emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
6376 emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
6377
6378 /* Load the label we are jumping through into r1 so that we know
6379 where to look for it when we get back to setjmp's function for
6380 restoring the gp. */
6381 emit_move_insn (pv, lab);
6382
6383 /* Prevent the insns above from being scheduled into the delay slot
6384 of the interspace jump because the space register could change. */
6385 emit_insn (gen_blockage ());
6386
6387 emit_jump_insn (gen_interspace_jump (pv));
6388 emit_barrier ();
6389 DONE;
6390 }")
6391
6392 ;;; Hope this is only within a function...
6393 (define_insn "indirect_jump"
6394 [(set (pc) (match_operand 0 "register_operand" "r"))]
6395 "GET_MODE (operands[0]) == word_mode"
6396 "bv%* %%r0(%0)"
6397 [(set_attr "type" "branch")
6398 (set_attr "length" "4")])
6399
6400 (define_expand "extzv"
6401 [(set (match_operand 0 "register_operand" "")
6402 (zero_extract (match_operand 1 "register_operand" "")
6403 (match_operand 2 "uint32_operand" "")
6404 (match_operand 3 "uint32_operand" "")))]
6405 ""
6406 "
6407 {
6408 if (TARGET_64BIT)
6409 emit_insn (gen_extzv_64 (operands[0], operands[1],
6410 operands[2], operands[3]));
6411 else
6412 emit_insn (gen_extzv_32 (operands[0], operands[1],
6413 operands[2], operands[3]));
6414 DONE;
6415 }")
6416
6417 (define_insn "extzv_32"
6418 [(set (match_operand:SI 0 "register_operand" "=r")
6419 (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
6420 (match_operand:SI 2 "uint5_operand" "")
6421 (match_operand:SI 3 "uint5_operand" "")))]
6422 ""
6423 "{extru|extrw,u} %1,%3+%2-1,%2,%0"
6424 [(set_attr "type" "shift")
6425 (set_attr "length" "4")])
6426
6427 (define_insn ""
6428 [(set (match_operand:SI 0 "register_operand" "=r")
6429 (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
6430 (const_int 1)
6431 (match_operand:SI 2 "register_operand" "q")))]
6432 ""
6433 "{vextru %1,1,%0|extrw,u %1,%%sar,1,%0}"
6434 [(set_attr "type" "shift")
6435 (set_attr "length" "4")])
6436
6437 (define_insn "extzv_64"
6438 [(set (match_operand:DI 0 "register_operand" "=r")
6439 (zero_extract:DI (match_operand:DI 1 "register_operand" "r")
6440 (match_operand:DI 2 "uint32_operand" "")
6441 (match_operand:DI 3 "uint32_operand" "")))]
6442 "TARGET_64BIT"
6443 "extrd,u %1,%3+%2-1,%2,%0"
6444 [(set_attr "type" "shift")
6445 (set_attr "length" "4")])
6446
6447 (define_insn ""
6448 [(set (match_operand:DI 0 "register_operand" "=r")
6449 (zero_extract:DI (match_operand:DI 1 "register_operand" "r")
6450 (const_int 1)
6451 (match_operand:DI 2 "register_operand" "q")))]
6452 "TARGET_64BIT"
6453 "extrd,u %1,%%sar,1,%0"
6454 [(set_attr "type" "shift")
6455 (set_attr "length" "4")])
6456
6457 (define_expand "extv"
6458 [(set (match_operand 0 "register_operand" "")
6459 (sign_extract (match_operand 1 "register_operand" "")
6460 (match_operand 2 "uint32_operand" "")
6461 (match_operand 3 "uint32_operand" "")))]
6462 ""
6463 "
6464 {
6465 if (TARGET_64BIT)
6466 emit_insn (gen_extv_64 (operands[0], operands[1],
6467 operands[2], operands[3]));
6468 else
6469 emit_insn (gen_extv_32 (operands[0], operands[1],
6470 operands[2], operands[3]));
6471 DONE;
6472 }")
6473
6474 (define_insn "extv_32"
6475 [(set (match_operand:SI 0 "register_operand" "=r")
6476 (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
6477 (match_operand:SI 2 "uint5_operand" "")
6478 (match_operand:SI 3 "uint5_operand" "")))]
6479 ""
6480 "{extrs|extrw,s} %1,%3+%2-1,%2,%0"
6481 [(set_attr "type" "shift")
6482 (set_attr "length" "4")])
6483
6484 (define_insn ""
6485 [(set (match_operand:SI 0 "register_operand" "=r")
6486 (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
6487 (const_int 1)
6488 (match_operand:SI 2 "register_operand" "q")))]
6489 "!TARGET_64BIT"
6490 "{vextrs %1,1,%0|extrw,s %1,%%sar,1,%0}"
6491 [(set_attr "type" "shift")
6492 (set_attr "length" "4")])
6493
6494 (define_insn "extv_64"
6495 [(set (match_operand:DI 0 "register_operand" "=r")
6496 (sign_extract:DI (match_operand:DI 1 "register_operand" "r")
6497 (match_operand:DI 2 "uint32_operand" "")
6498 (match_operand:DI 3 "uint32_operand" "")))]
6499 "TARGET_64BIT"
6500 "extrd,s %1,%3+%2-1,%2,%0"
6501 [(set_attr "type" "shift")
6502 (set_attr "length" "4")])
6503
6504 (define_insn ""
6505 [(set (match_operand:DI 0 "register_operand" "=r")
6506 (sign_extract:DI (match_operand:DI 1 "register_operand" "r")
6507 (const_int 1)
6508 (match_operand:DI 2 "register_operand" "q")))]
6509 "TARGET_64BIT"
6510 "extrd,s %1,%%sar,1,%0"
6511 [(set_attr "type" "shift")
6512 (set_attr "length" "4")])
6513
6514 ;; Only specify the mode operands 0, the rest are assumed to be word_mode.
6515 (define_expand "insv"
6516 [(set (zero_extract (match_operand 0 "register_operand" "")
6517 (match_operand 1 "uint32_operand" "")
6518 (match_operand 2 "uint32_operand" ""))
6519 (match_operand 3 "arith5_operand" ""))]
6520 ""
6521 "
6522 {
6523 if (TARGET_64BIT)
6524 emit_insn (gen_insv_64 (operands[0], operands[1],
6525 operands[2], operands[3]));
6526 else
6527 emit_insn (gen_insv_32 (operands[0], operands[1],
6528 operands[2], operands[3]));
6529 DONE;
6530 }")
6531
6532 (define_insn "insv_32"
6533 [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r,r")
6534 (match_operand:SI 1 "uint5_operand" "")
6535 (match_operand:SI 2 "uint5_operand" ""))
6536 (match_operand:SI 3 "arith5_operand" "r,L"))]
6537 ""
6538 "@
6539 {dep|depw} %3,%2+%1-1,%1,%0
6540 {depi|depwi} %3,%2+%1-1,%1,%0"
6541 [(set_attr "type" "shift,shift")
6542 (set_attr "length" "4,4")])
6543
6544 ;; Optimize insertion of const_int values of type 1...1xxxx.
6545 (define_insn ""
6546 [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
6547 (match_operand:SI 1 "uint5_operand" "")
6548 (match_operand:SI 2 "uint5_operand" ""))
6549 (match_operand:SI 3 "const_int_operand" ""))]
6550 "(INTVAL (operands[3]) & 0x10) != 0 &&
6551 (~INTVAL (operands[3]) & ((1L << INTVAL (operands[1])) - 1) & ~0xf) == 0"
6552 "*
6553 {
6554 operands[3] = GEN_INT ((INTVAL (operands[3]) & 0xf) - 0x10);
6555 return \"{depi|depwi} %3,%2+%1-1,%1,%0\";
6556 }"
6557 [(set_attr "type" "shift")
6558 (set_attr "length" "4")])
6559
6560 (define_insn "insv_64"
6561 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+r,r")
6562 (match_operand:DI 1 "uint32_operand" "")
6563 (match_operand:DI 2 "uint32_operand" ""))
6564 (match_operand:DI 3 "arith32_operand" "r,L"))]
6565 "TARGET_64BIT"
6566 "@
6567 depd %3,%2+%1-1,%1,%0
6568 depdi %3,%2+%1-1,%1,%0"
6569 [(set_attr "type" "shift,shift")
6570 (set_attr "length" "4,4")])
6571
6572 ;; Optimize insertion of const_int values of type 1...1xxxx.
6573 (define_insn ""
6574 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+r")
6575 (match_operand:DI 1 "uint32_operand" "")
6576 (match_operand:DI 2 "uint32_operand" ""))
6577 (match_operand:DI 3 "const_int_operand" ""))]
6578 "(INTVAL (operands[3]) & 0x10) != 0
6579 && TARGET_64BIT
6580 && (~INTVAL (operands[3]) & ((1L << INTVAL (operands[1])) - 1) & ~0xf) == 0"
6581 "*
6582 {
6583 operands[3] = GEN_INT ((INTVAL (operands[3]) & 0xf) - 0x10);
6584 return \"depdi %3,%2+%1-1,%1,%0\";
6585 }"
6586 [(set_attr "type" "shift")
6587 (set_attr "length" "4")])
6588
6589 (define_insn ""
6590 [(set (match_operand:DI 0 "register_operand" "=r")
6591 (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
6592 (const_int 32)))]
6593 "TARGET_64BIT"
6594 "depd,z %1,31,32,%0"
6595 [(set_attr "type" "shift")
6596 (set_attr "length" "4")])
6597
6598 ;; This insn is used for some loop tests, typically loops reversed when
6599 ;; strength reduction is used. It is actually created when the instruction
6600 ;; combination phase combines the special loop test. Since this insn
6601 ;; is both a jump insn and has an output, it must deal with its own
6602 ;; reloads, hence the `m' constraints. The `!' constraints direct reload
6603 ;; to not choose the register alternatives in the event a reload is needed.
6604 (define_insn "decrement_and_branch_until_zero"
6605 [(set (pc)
6606 (if_then_else
6607 (match_operator 2 "comparison_operator"
6608 [(plus:SI (match_operand:SI 0 "register_operand" "+!r,!*f,!*m")
6609 (match_operand:SI 1 "int5_operand" "L,L,L"))
6610 (const_int 0)])
6611 (label_ref (match_operand 3 "" ""))
6612 (pc)))
6613 (set (match_dup 0)
6614 (plus:SI (match_dup 0) (match_dup 1)))
6615 (clobber (match_scratch:SI 4 "=X,r,r"))]
6616 ""
6617 "* return output_dbra (operands, insn, which_alternative); "
6618 ;; Do not expect to understand this the first time through.
6619 [(set_attr "type" "cbranch,multi,multi")
6620 (set (attr "length")
6621 (if_then_else (eq_attr "alternative" "0")
6622 ;; Loop counter in register case
6623 ;; Short branch has length of 4
6624 ;; Long branch has length of 8
6625 (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6626 (const_int 8184))
6627 (const_int 4)
6628 (const_int 8))
6629
6630 ;; Loop counter in FP reg case.
6631 ;; Extra goo to deal with additional reload insns.
6632 (if_then_else (eq_attr "alternative" "1")
6633 (if_then_else (lt (match_dup 3) (pc))
6634 (if_then_else
6635 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 24))))
6636 (const_int 8184))
6637 (const_int 24)
6638 (const_int 28))
6639 (if_then_else
6640 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6641 (const_int 8184))
6642 (const_int 24)
6643 (const_int 28)))
6644 ;; Loop counter in memory case.
6645 ;; Extra goo to deal with additional reload insns.
6646 (if_then_else (lt (match_dup 3) (pc))
6647 (if_then_else
6648 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
6649 (const_int 8184))
6650 (const_int 12)
6651 (const_int 16))
6652 (if_then_else
6653 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6654 (const_int 8184))
6655 (const_int 12)
6656 (const_int 16))))))])
6657
6658 (define_insn ""
6659 [(set (pc)
6660 (if_then_else
6661 (match_operator 2 "movb_comparison_operator"
6662 [(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)])
6663 (label_ref (match_operand 3 "" ""))
6664 (pc)))
6665 (set (match_operand:SI 0 "register_operand" "=!r,!*f,!*m,!*q")
6666 (match_dup 1))]
6667 ""
6668 "* return output_movb (operands, insn, which_alternative, 0); "
6669 ;; Do not expect to understand this the first time through.
6670 [(set_attr "type" "cbranch,multi,multi,multi")
6671 (set (attr "length")
6672 (if_then_else (eq_attr "alternative" "0")
6673 ;; Loop counter in register case
6674 ;; Short branch has length of 4
6675 ;; Long branch has length of 8
6676 (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6677 (const_int 8184))
6678 (const_int 4)
6679 (const_int 8))
6680
6681 ;; Loop counter in FP reg case.
6682 ;; Extra goo to deal with additional reload insns.
6683 (if_then_else (eq_attr "alternative" "1")
6684 (if_then_else (lt (match_dup 3) (pc))
6685 (if_then_else
6686 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
6687 (const_int 8184))
6688 (const_int 12)
6689 (const_int 16))
6690 (if_then_else
6691 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6692 (const_int 8184))
6693 (const_int 12)
6694 (const_int 16)))
6695 ;; Loop counter in memory or sar case.
6696 ;; Extra goo to deal with additional reload insns.
6697 (if_then_else
6698 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6699 (const_int 8184))
6700 (const_int 8)
6701 (const_int 12)))))])
6702
6703 ;; Handle negated branch.
6704 (define_insn ""
6705 [(set (pc)
6706 (if_then_else
6707 (match_operator 2 "movb_comparison_operator"
6708 [(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)])
6709 (pc)
6710 (label_ref (match_operand 3 "" ""))))
6711 (set (match_operand:SI 0 "register_operand" "=!r,!*f,!*m,!*q")
6712 (match_dup 1))]
6713 ""
6714 "* return output_movb (operands, insn, which_alternative, 1); "
6715 ;; Do not expect to understand this the first time through.
6716 [(set_attr "type" "cbranch,multi,multi,multi")
6717 (set (attr "length")
6718 (if_then_else (eq_attr "alternative" "0")
6719 ;; Loop counter in register case
6720 ;; Short branch has length of 4
6721 ;; Long branch has length of 8
6722 (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6723 (const_int 8184))
6724 (const_int 4)
6725 (const_int 8))
6726
6727 ;; Loop counter in FP reg case.
6728 ;; Extra goo to deal with additional reload insns.
6729 (if_then_else (eq_attr "alternative" "1")
6730 (if_then_else (lt (match_dup 3) (pc))
6731 (if_then_else
6732 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
6733 (const_int 8184))
6734 (const_int 12)
6735 (const_int 16))
6736 (if_then_else
6737 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6738 (const_int 8184))
6739 (const_int 12)
6740 (const_int 16)))
6741 ;; Loop counter in memory or SAR case.
6742 ;; Extra goo to deal with additional reload insns.
6743 (if_then_else
6744 (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6745 (const_int 8184))
6746 (const_int 8)
6747 (const_int 12)))))])
6748
6749 (define_insn ""
6750 [(set (pc) (label_ref (match_operand 3 "" "" )))
6751 (set (match_operand:SI 0 "ireg_operand" "=r")
6752 (plus:SI (match_operand:SI 1 "ireg_operand" "r")
6753 (match_operand:SI 2 "ireg_or_int5_operand" "rL")))]
6754 "(reload_completed && operands[0] == operands[1]) || operands[0] == operands[2]"
6755 "*
6756 {
6757 return output_parallel_addb (operands, get_attr_length (insn));
6758 }"
6759 [(set_attr "type" "parallel_branch")
6760 (set (attr "length")
6761 (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
6762 (const_int 8184))
6763 (const_int 4)
6764 (const_int 8)))])
6765
6766 (define_insn ""
6767 [(set (pc) (label_ref (match_operand 2 "" "" )))
6768 (set (match_operand:SF 0 "ireg_operand" "=r")
6769 (match_operand:SF 1 "ireg_or_int5_operand" "rL"))]
6770 "reload_completed"
6771 "*
6772 {
6773 return output_parallel_movb (operands, get_attr_length (insn));
6774 }"
6775 [(set_attr "type" "parallel_branch")
6776 (set (attr "length")
6777 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
6778 (const_int 8184))
6779 (const_int 4)
6780 (const_int 8)))])
6781
6782 (define_insn ""
6783 [(set (pc) (label_ref (match_operand 2 "" "" )))
6784 (set (match_operand:SI 0 "ireg_operand" "=r")
6785 (match_operand:SI 1 "ireg_or_int5_operand" "rL"))]
6786 "reload_completed"
6787 "*
6788 {
6789 return output_parallel_movb (operands, get_attr_length (insn));
6790 }"
6791 [(set_attr "type" "parallel_branch")
6792 (set (attr "length")
6793 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
6794 (const_int 8184))
6795 (const_int 4)
6796 (const_int 8)))])
6797
6798 (define_insn ""
6799 [(set (pc) (label_ref (match_operand 2 "" "" )))
6800 (set (match_operand:HI 0 "ireg_operand" "=r")
6801 (match_operand:HI 1 "ireg_or_int5_operand" "rL"))]
6802 "reload_completed"
6803 "*
6804 {
6805 return output_parallel_movb (operands, get_attr_length (insn));
6806 }"
6807 [(set_attr "type" "parallel_branch")
6808 (set (attr "length")
6809 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
6810 (const_int 8184))
6811 (const_int 4)
6812 (const_int 8)))])
6813
6814 (define_insn ""
6815 [(set (pc) (label_ref (match_operand 2 "" "" )))
6816 (set (match_operand:QI 0 "ireg_operand" "=r")
6817 (match_operand:QI 1 "ireg_or_int5_operand" "rL"))]
6818 "reload_completed"
6819 "*
6820 {
6821 return output_parallel_movb (operands, get_attr_length (insn));
6822 }"
6823 [(set_attr "type" "parallel_branch")
6824 (set (attr "length")
6825 (if_then_else (lt (abs (minus (match_dup 2) (plus (pc) (const_int 8))))
6826 (const_int 8184))
6827 (const_int 4)
6828 (const_int 8)))])
6829
6830 (define_insn ""
6831 [(set (match_operand 0 "register_operand" "=f")
6832 (mult (match_operand 1 "register_operand" "f")
6833 (match_operand 2 "register_operand" "f")))
6834 (set (match_operand 3 "register_operand" "+f")
6835 (plus (match_operand 4 "register_operand" "f")
6836 (match_operand 5 "register_operand" "f")))]
6837 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT
6838 && reload_completed && fmpyaddoperands (operands)"
6839 "*
6840 {
6841 if (GET_MODE (operands[0]) == DFmode)
6842 {
6843 if (rtx_equal_p (operands[3], operands[5]))
6844 return \"fmpyadd,dbl %1,%2,%0,%4,%3\";
6845 else
6846 return \"fmpyadd,dbl %1,%2,%0,%5,%3\";
6847 }
6848 else
6849 {
6850 if (rtx_equal_p (operands[3], operands[5]))
6851 return \"fmpyadd,sgl %1,%2,%0,%4,%3\";
6852 else
6853 return \"fmpyadd,sgl %1,%2,%0,%5,%3\";
6854 }
6855 }"
6856 [(set_attr "type" "fpalu")
6857 (set_attr "length" "4")])
6858
6859 (define_insn ""
6860 [(set (match_operand 3 "register_operand" "+f")
6861 (plus (match_operand 4 "register_operand" "f")
6862 (match_operand 5 "register_operand" "f")))
6863 (set (match_operand 0 "register_operand" "=f")
6864 (mult (match_operand 1 "register_operand" "f")
6865 (match_operand 2 "register_operand" "f")))]
6866 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT
6867 && reload_completed && fmpyaddoperands (operands)"
6868 "*
6869 {
6870 if (GET_MODE (operands[0]) == DFmode)
6871 {
6872 if (rtx_equal_p (operands[3], operands[5]))
6873 return \"fmpyadd,dbl %1,%2,%0,%4,%3\";
6874 else
6875 return \"fmpyadd,dbl %1,%2,%0,%5,%3\";
6876 }
6877 else
6878 {
6879 if (rtx_equal_p (operands[3], operands[5]))
6880 return \"fmpyadd,sgl %1,%2,%0,%4,%3\";
6881 else
6882 return \"fmpyadd,sgl %1,%2,%0,%5,%3\";
6883 }
6884 }"
6885 [(set_attr "type" "fpalu")
6886 (set_attr "length" "4")])
6887
6888 (define_insn ""
6889 [(set (match_operand 0 "register_operand" "=f")
6890 (mult (match_operand 1 "register_operand" "f")
6891 (match_operand 2 "register_operand" "f")))
6892 (set (match_operand 3 "register_operand" "+f")
6893 (minus (match_operand 4 "register_operand" "f")
6894 (match_operand 5 "register_operand" "f")))]
6895 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT
6896 && reload_completed && fmpysuboperands (operands)"
6897 "*
6898 {
6899 if (GET_MODE (operands[0]) == DFmode)
6900 return \"fmpysub,dbl %1,%2,%0,%5,%3\";
6901 else
6902 return \"fmpysub,sgl %1,%2,%0,%5,%3\";
6903 }"
6904 [(set_attr "type" "fpalu")
6905 (set_attr "length" "4")])
6906
6907 (define_insn ""
6908 [(set (match_operand 3 "register_operand" "+f")
6909 (minus (match_operand 4 "register_operand" "f")
6910 (match_operand 5 "register_operand" "f")))
6911 (set (match_operand 0 "register_operand" "=f")
6912 (mult (match_operand 1 "register_operand" "f")
6913 (match_operand 2 "register_operand" "f")))]
6914 "TARGET_PA_11 && ! TARGET_SOFT_FLOAT
6915 && reload_completed && fmpysuboperands (operands)"
6916 "*
6917 {
6918 if (GET_MODE (operands[0]) == DFmode)
6919 return \"fmpysub,dbl %1,%2,%0,%5,%3\";
6920 else
6921 return \"fmpysub,sgl %1,%2,%0,%5,%3\";
6922 }"
6923 [(set_attr "type" "fpalu")
6924 (set_attr "length" "4")])
6925
6926 ;; Clean up turds left by reload.
6927 (define_peephole
6928 [(set (match_operand 0 "reg_or_nonsymb_mem_operand" "")
6929 (match_operand 1 "register_operand" "fr"))
6930 (set (match_operand 2 "register_operand" "fr")
6931 (match_dup 0))]
6932 "! TARGET_SOFT_FLOAT
6933 && GET_CODE (operands[0]) == MEM
6934 && ! MEM_VOLATILE_P (operands[0])
6935 && GET_MODE (operands[0]) == GET_MODE (operands[1])
6936 && GET_MODE (operands[0]) == GET_MODE (operands[2])
6937 && GET_MODE (operands[0]) == DFmode
6938 && GET_CODE (operands[1]) == REG
6939 && GET_CODE (operands[2]) == REG
6940 && ! side_effects_p (XEXP (operands[0], 0))
6941 && REGNO_REG_CLASS (REGNO (operands[1]))
6942 == REGNO_REG_CLASS (REGNO (operands[2]))"
6943 "*
6944 {
6945 rtx xoperands[2];
6946
6947 if (FP_REG_P (operands[1]))
6948 output_asm_insn (output_fp_move_double (operands), operands);
6949 else
6950 output_asm_insn (output_move_double (operands), operands);
6951
6952 if (rtx_equal_p (operands[1], operands[2]))
6953 return \"\";
6954
6955 xoperands[0] = operands[2];
6956 xoperands[1] = operands[1];
6957
6958 if (FP_REG_P (xoperands[1]))
6959 output_asm_insn (output_fp_move_double (xoperands), xoperands);
6960 else
6961 output_asm_insn (output_move_double (xoperands), xoperands);
6962
6963 return \"\";
6964 }")
6965
6966 (define_peephole
6967 [(set (match_operand 0 "register_operand" "fr")
6968 (match_operand 1 "reg_or_nonsymb_mem_operand" ""))
6969 (set (match_operand 2 "register_operand" "fr")
6970 (match_dup 1))]
6971 "! TARGET_SOFT_FLOAT
6972 && GET_CODE (operands[1]) == MEM
6973 && ! MEM_VOLATILE_P (operands[1])
6974 && GET_MODE (operands[0]) == GET_MODE (operands[1])
6975 && GET_MODE (operands[0]) == GET_MODE (operands[2])
6976 && GET_MODE (operands[0]) == DFmode
6977 && GET_CODE (operands[0]) == REG
6978 && GET_CODE (operands[2]) == REG
6979 && ! side_effects_p (XEXP (operands[1], 0))
6980 && REGNO_REG_CLASS (REGNO (operands[0]))
6981 == REGNO_REG_CLASS (REGNO (operands[2]))"
6982 "*
6983 {
6984 rtx xoperands[2];
6985
6986 if (FP_REG_P (operands[0]))
6987 output_asm_insn (output_fp_move_double (operands), operands);
6988 else
6989 output_asm_insn (output_move_double (operands), operands);
6990
6991 xoperands[0] = operands[2];
6992 xoperands[1] = operands[0];
6993
6994 if (FP_REG_P (xoperands[1]))
6995 output_asm_insn (output_fp_move_double (xoperands), xoperands);
6996 else
6997 output_asm_insn (output_move_double (xoperands), xoperands);
6998
6999 return \"\";
7000 }")
7001
7002 ;; Flush the I and D cache line found at the address in operand 0.
7003 ;; This is used by the trampoline code for nested functions.
7004 ;; So long as the trampoline itself is less than 32 bytes this
7005 ;; is sufficient.
7006
7007 (define_insn "dcacheflush"
7008 [(unspec_volatile [(const_int 1)] 0)
7009 (use (mem:SI (match_operand 0 "pmode_register_operand" "r")))
7010 (use (mem:SI (match_operand 1 "pmode_register_operand" "r")))]
7011 ""
7012 "fdc 0(%0)\;fdc 0(%1)\;sync"
7013 [(set_attr "type" "multi")
7014 (set_attr "length" "12")])
7015
7016 (define_insn "icacheflush"
7017 [(unspec_volatile [(const_int 2)] 0)
7018 (use (mem:SI (match_operand 0 "pmode_register_operand" "r")))
7019 (use (mem:SI (match_operand 1 "pmode_register_operand" "r")))
7020 (use (match_operand 2 "pmode_register_operand" "r"))
7021 (clobber (match_operand 3 "pmode_register_operand" "=&r"))
7022 (clobber (match_operand 4 "pmode_register_operand" "=&r"))]
7023 ""
7024 "mfsp %%sr0,%4\;ldsid (%2),%3\;mtsp %3,%%sr0\;fic 0(%%sr0,%0)\;fic 0(%%sr0,%1)\;sync\;mtsp %4,%%sr0\;nop\;nop\;nop\;nop\;nop\;nop"
7025 [(set_attr "type" "multi")
7026 (set_attr "length" "52")])
7027
7028 ;; An out-of-line prologue.
7029 (define_insn "outline_prologue_call"
7030 [(unspec_volatile [(const_int 0)] 0)
7031 (clobber (reg:SI 31))
7032 (clobber (reg:SI 22))
7033 (clobber (reg:SI 21))
7034 (clobber (reg:SI 20))
7035 (clobber (reg:SI 19))
7036 (clobber (reg:SI 1))]
7037 ""
7038 "*
7039 {
7040 extern int frame_pointer_needed;
7041
7042 /* We need two different versions depending on whether or not we
7043 need a frame pointer. Also note that we return to the instruction
7044 immediately after the branch rather than two instructions after the
7045 break as normally is the case. */
7046 if (frame_pointer_needed)
7047 {
7048 /* Must import the magic millicode routine(s). */
7049 output_asm_insn (\".IMPORT __outline_prologue_fp,MILLICODE\", NULL);
7050
7051 if (TARGET_PORTABLE_RUNTIME)
7052 {
7053 output_asm_insn (\"ldil L'__outline_prologue_fp,%%r31\", NULL);
7054 output_asm_insn (\"ble,n R'__outline_prologue_fp(%%sr0,%%r31)\",
7055 NULL);
7056 }
7057 else
7058 output_asm_insn (\"{bl|b,l},n __outline_prologue_fp,%%r31\", NULL);
7059 }
7060 else
7061 {
7062 /* Must import the magic millicode routine(s). */
7063 output_asm_insn (\".IMPORT __outline_prologue,MILLICODE\", NULL);
7064
7065 if (TARGET_PORTABLE_RUNTIME)
7066 {
7067 output_asm_insn (\"ldil L'__outline_prologue,%%r31\", NULL);
7068 output_asm_insn (\"ble,n R'__outline_prologue(%%sr0,%%r31)\", NULL);
7069 }
7070 else
7071 output_asm_insn (\"{bl|b,l},n __outline_prologue,%%r31\", NULL);
7072 }
7073 return \"\";
7074 }"
7075 [(set_attr "type" "multi")
7076 (set_attr "length" "8")])
7077
7078 ;; An out-of-line epilogue.
7079 (define_insn "outline_epilogue_call"
7080 [(unspec_volatile [(const_int 1)] 0)
7081 (use (reg:SI 29))
7082 (use (reg:SI 28))
7083 (clobber (reg:SI 31))
7084 (clobber (reg:SI 22))
7085 (clobber (reg:SI 21))
7086 (clobber (reg:SI 20))
7087 (clobber (reg:SI 19))
7088 (clobber (reg:SI 2))
7089 (clobber (reg:SI 1))]
7090 ""
7091 "*
7092 {
7093 extern int frame_pointer_needed;
7094
7095 /* We need two different versions depending on whether or not we
7096 need a frame pointer. Also note that we return to the instruction
7097 immediately after the branch rather than two instructions after the
7098 break as normally is the case. */
7099 if (frame_pointer_needed)
7100 {
7101 /* Must import the magic millicode routine. */
7102 output_asm_insn (\".IMPORT __outline_epilogue_fp,MILLICODE\", NULL);
7103
7104 /* The out-of-line prologue will make sure we return to the right
7105 instruction. */
7106 if (TARGET_PORTABLE_RUNTIME)
7107 {
7108 output_asm_insn (\"ldil L'__outline_epilogue_fp,%%r31\", NULL);
7109 output_asm_insn (\"ble,n R'__outline_epilogue_fp(%%sr0,%%r31)\",
7110 NULL);
7111 }
7112 else
7113 output_asm_insn (\"{bl|b,l},n __outline_epilogue_fp,%%r31\", NULL);
7114 }
7115 else
7116 {
7117 /* Must import the magic millicode routine. */
7118 output_asm_insn (\".IMPORT __outline_epilogue,MILLICODE\", NULL);
7119
7120 /* The out-of-line prologue will make sure we return to the right
7121 instruction. */
7122 if (TARGET_PORTABLE_RUNTIME)
7123 {
7124 output_asm_insn (\"ldil L'__outline_epilogue,%%r31\", NULL);
7125 output_asm_insn (\"ble,n R'__outline_epilogue(%%sr0,%%r31)\", NULL);
7126 }
7127 else
7128 output_asm_insn (\"{bl|b,l},n __outline_epilogue,%%r31\", NULL);
7129 }
7130 return \"\";
7131 }"
7132 [(set_attr "type" "multi")
7133 (set_attr "length" "8")])
7134
7135 ;; Given a function pointer, canonicalize it so it can be
7136 ;; reliably compared to another function pointer. */
7137 (define_expand "canonicalize_funcptr_for_compare"
7138 [(set (reg:SI 26) (match_operand:SI 1 "register_operand" ""))
7139 (parallel [(set (reg:SI 29) (unspec:SI [(reg:SI 26)] 0))
7140 (clobber (match_dup 2))
7141 (clobber (reg:SI 26))
7142 (clobber (reg:SI 22))
7143 (clobber (reg:SI 31))])
7144 (set (match_operand:SI 0 "register_operand" "")
7145 (reg:SI 29))]
7146 "! TARGET_PORTABLE_RUNTIME && !TARGET_64BIT && !TARGET_ELF32"
7147 "
7148 {
7149 operands[2] = gen_reg_rtx (SImode);
7150 if (GET_CODE (operands[1]) != REG)
7151 {
7152 rtx tmp = gen_reg_rtx (Pmode);
7153 emit_move_insn (tmp, operands[1]);
7154 operands[1] = tmp;
7155 }
7156 }")
7157
7158 (define_insn ""
7159 [(set (reg:SI 29) (unspec:SI [(reg:SI 26)] 0))
7160 (clobber (match_operand:SI 0 "register_operand" "=a"))
7161 (clobber (reg:SI 26))
7162 (clobber (reg:SI 22))
7163 (clobber (reg:SI 31))]
7164 "!TARGET_64BIT"
7165 "*
7166 {
7167 /* Must import the magic millicode routine. */
7168 output_asm_insn (\".IMPORT $$sh_func_adrs,MILLICODE\", NULL);
7169
7170 /* This is absolutely amazing.
7171
7172 First, copy our input parameter into %r29 just in case we don't
7173 need to call $$sh_func_adrs. */
7174 output_asm_insn (\"copy %%r26,%%r29\", NULL);
7175
7176 /* Next, examine the low two bits in %r26, if they aren't 0x2, then
7177 we use %r26 unchanged. */
7178 if (get_attr_length (insn) == 32)
7179 output_asm_insn (\"{extru|extrw,u} %%r26,31,2,%%r31\;{comib|cmpib},<>,n 2,%%r31,.+24\", NULL);
7180 else if (get_attr_length (insn) == 40)
7181 output_asm_insn (\"{extru|extrw,u} %%r26,31,2,%%r31\;{comib|cmpib},<>,n 2,%%r31,.+32\", NULL);
7182 else if (get_attr_length (insn) == 44)
7183 output_asm_insn (\"{extru|extrw,u} %%r26,31,2,%%r31\;{comib|cmpib},<>,n 2,%%r31,.+36\", NULL);
7184 else
7185 output_asm_insn (\"{extru|extrw,u} %%r26,31,2,%%r31\;{comib|cmpib},<>,n 2,%%r31,.+20\", NULL);
7186
7187 /* Next, compare %r26 with 4096, if %r26 is less than or equal to
7188 4096, then we use %r26 unchanged. */
7189 if (get_attr_length (insn) == 32)
7190 output_asm_insn (\"ldi 4096,%%r31\;{comb|cmpb},<<,n %%r26,%%r31,.+16\",
7191 NULL);
7192 else if (get_attr_length (insn) == 40)
7193 output_asm_insn (\"ldi 4096,%%r31\;{comb|cmpb},<<,n %%r26,%%r31,.+24\",
7194 NULL);
7195 else if (get_attr_length (insn) == 44)
7196 output_asm_insn (\"ldi 4096,%%r31\;{comb|cmpb},<<,n %%r26,%%r31,.+28\",
7197 NULL);
7198 else
7199 output_asm_insn (\"ldi 4096,%%r31\;{comb|cmpb},<<,n %%r26,%%r31,.+12\",
7200 NULL);
7201
7202 /* Else call $$sh_func_adrs to extract the function's real add24. */
7203 return output_millicode_call (insn,
7204 gen_rtx_SYMBOL_REF (SImode,
7205 \"$$sh_func_adrs\"));
7206 }"
7207 [(set_attr "type" "multi")
7208 (set (attr "length")
7209 (cond [
7210 ;; Target (or stub) within reach
7211 (and (lt (plus (symbol_ref "total_code_bytes") (pc))
7212 (const_int 240000))
7213 (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
7214 (const_int 0)))
7215 (const_int 28)
7216
7217 ;; Out of reach PIC
7218 (ne (symbol_ref "flag_pic")
7219 (const_int 0))
7220 (const_int 44)
7221
7222 ;; Out of reach PORTABLE_RUNTIME
7223 (ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
7224 (const_int 0))
7225 (const_int 40)]
7226
7227 ;; Out of reach, can use ble
7228 (const_int 32)))])
7229
7230 ;; On the PA, the PIC register is call clobbered, so it must
7231 ;; be saved & restored around calls by the caller. If the call
7232 ;; doesn't return normally (nonlocal goto, or an exception is
7233 ;; thrown), then the code at the exception handler label must
7234 ;; restore the PIC register.
7235 (define_expand "exception_receiver"
7236 [(const_int 4)]
7237 "!TARGET_PORTABLE_RUNTIME && flag_pic"
7238 "
7239 {
7240 /* Load the PIC register from the stack slot (in our caller's
7241 frame). */
7242 emit_move_insn (pic_offset_table_rtx,
7243 gen_rtx_MEM (SImode,
7244 plus_constant (stack_pointer_rtx, -32)));
7245 emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
7246 emit_insn (gen_blockage ());
7247 DONE;
7248 }")
7249
7250 (define_expand "builtin_setjmp_receiver"
7251 [(label_ref (match_operand 0 "" ""))]
7252 "flag_pic"
7253 "
7254 {
7255 /* Restore the PIC register. Hopefully, this will always be from
7256 a stack slot. The only registers that are valid after a
7257 builtin_longjmp are the stack and frame pointers. */
7258 emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
7259 DONE;
7260 }")