1 ;;- Machine description for AMD Am29000 for GNU C compiler
2 ;; Copyright (C) 1991, 1992, 1994, 1998, 1999, 2001
3 ;; Free Software Foundation, Inc.
4 ;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6 ;; This file is part of GNU CC.
8 ;; GNU CC is free software; you can redistribute it and/or modify
9 ;; it under the terms of the GNU General Public License as published by
10 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; GNU CC is distributed in the hope that it will be useful,
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;; GNU General Public License for more details.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GNU CC; see the file COPYING. If not, write to
20 ;; the Free Software Foundation, 59 Temple Place - Suite 330,
21 ;; Boston, MA 02111-1307, USA.
23 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
25 ;; The insns in this file are presented in the same order as the AMD 29000
26 ;; User's Manual (i.e., alphabetical by machine op-code).
28 ;; DEFINE_EXPAND's are located near the first occurrence of the major insn
29 ;; that they generate.
31 ;; The only attribute we have is the type. We only care about calls, branches,
32 ;; loads, stores, floating-point operations, and multi-word insns.
33 ;; Everything else is miscellaneous.
36 "call,branch,load,store,fadd,fmul,fam,fdiv,fsqrt,dmul,dam,ddiv,dsqrt,multi,misc"
37 (const_string "misc"))
39 ;; ASM insns cannot go into a delay slot, so call them "multi".
40 (define_asm_attributes [(set_attr "type" "multi")])
42 (define_attr "in_delay_slot" "yes,no"
43 (if_then_else (eq_attr "type" "call,branch,multi") (const_string "no")
44 (const_string "yes")))
46 ;; Branch and call insns require a single delay slot. Annulling is not
48 (define_delay (eq_attr "type" "call,branch")
49 [(eq_attr "in_delay_slot" "yes") (nil) (nil)])
51 ;; Define the function unit usages. We first define memory as a unit.
52 (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 5
53 [(eq_attr "type" "load")])
54 (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 6
55 [(eq_attr "type" "store")])
56 (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
58 ;; Now define the function units for the floating-point support. Most
59 ;; units are pipelined and can accept an input every cycle.
61 ;; Note that we have an inaccuracy here. If a fmac insn is issued, followed
62 ;; 2 cycles later by a fadd, there will be a conflict for the floating
63 ;; adder that we can't represent. Also, all insns will conflict for the
64 ;; floating-point rounder. It isn't clear how to represent this.
66 (define_function_unit "multiplier" 1 0 (eq_attr "type" "fmul") 3 0)
67 (define_function_unit "multiplier" 1 0 (eq_attr "type" "dmul") 6 4)
68 (define_function_unit "multiplier" 1 0 (eq_attr "type" "fam") 6 0)
69 (define_function_unit "multiplier" 1 0 (eq_attr "type" "dam") 9 4)
71 (define_function_unit "adder" 1 0 (eq_attr "type" "fadd,fam,dam") 3 0)
73 (define_function_unit "divider" 1 0 (eq_attr "type" "fdiv") 11 10)
74 (define_function_unit "divider" 1 0 (eq_attr "type" "fsqrt") 28 27)
75 (define_function_unit "divider" 1 0 (eq_attr "type" "ddiv") 18 17)
76 (define_function_unit "divider" 1 0 (eq_attr "type" "dsqrt") 57 56)
80 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
81 (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
82 (match_operand:SI 2 "add_operand" "rI,N")))]
89 [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
90 (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
91 (match_operand:DI 2 "gpc_reg_operand" "r")))]
93 "add %L0,%L1,%L2\;addc %0,%1,%2"
94 [(set_attr "type" "multi")])
98 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
99 (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
100 (match_operand:SI 2 "and_operand" "rI,K")))]
107 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
108 (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
109 (match_operand:SI 2 "cmplsrcb_operand" "r,K")))]
117 ;; Each call pattern is duplicated so that we can add CLOBBERs to the
120 ;; We indicate that LR0 is clobbered in the CALL_INSN itself. Otherwise,
121 ;; reorg will think it is just clobbered by the called function.
123 (define_expand "call"
124 [(use (match_operand:SI 0 "" ""))
125 (use (match_operand 1 "" ""))
126 (use (match_operand 2 "" ""))]
129 { rtx insn = emit_call_insn (gen_call_internal (operands[0], operands[1]));
130 a29k_clobbers_to (insn, operands[2]);
135 (define_expand "call_internal"
136 [(parallel [(call (match_operand:SI 0 "" "")
137 (match_operand 1 "" ""))
138 (clobber (scratch:SI))])]
142 if (GET_CODE (operands[0]) != MEM)
145 /* We tell here whether this is a recursive call, since this insn may
146 later be inlined into another function. */
147 if (! TARGET_SMALL_MEMORY
148 && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
149 operands[0] = gen_rtx_MEM (SImode,
150 force_reg (Pmode, XEXP (operands[0], 0)));
153 (define_expand "call_value"
154 [(use (match_operand:SI 0 "gpc_reg_operand" ""))
155 (use (match_operand:SI 1 "" ""))
156 (use (match_operand 2 "" ""))
157 (use (match_operand 3 "" ""))]
160 { rtx insn = emit_call_insn (gen_call_value_internal (operands[0], operands[1],
163 a29k_clobbers_to (insn, operands[3]);
167 (define_expand "call_value_internal"
168 [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
169 (call (match_operand:SI 1 "" "")
170 (match_operand 2 "" "")))
171 (clobber (scratch:SI))])]
175 if (GET_CODE (operands[1]) != MEM)
178 /* We tell here whether this is a recursive call, since this insn may
179 later be inlined into another function. */
180 if (! TARGET_SMALL_MEMORY
181 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
182 operands[1] = gen_rtx_MEM (SImode,
183 force_reg (Pmode, XEXP (operands[1], 0)));
187 [(call (match_operand:SI 0 "memory_operand" "m")
188 (match_operand 1 "" ""))
189 (clobber (match_scratch:SI 2 "=&l"))]
190 "GET_CODE (XEXP (operands[0], 0)) != CONST_INT"
192 [(set_attr "type" "call")])
195 [(call (mem:SI (match_operand:SI 0 "call_operand" "i"))
196 (match_operand:SI 1 "general_operand" "g"))
197 (clobber (match_scratch:SI 2 "=&l"))]
200 [(set_attr "type" "call")])
203 [(set (match_operand 0 "gpc_reg_operand" "=r")
204 (call (match_operand:SI 1 "memory_operand" "m")
205 (match_operand 2 "" "")))
206 (clobber (match_scratch:SI 3 "=&l"))]
207 "GET_CODE (XEXP (operands[1], 0)) != CONST_INT"
209 [(set_attr "type" "call")])
212 [(set (match_operand 0 "gpc_reg_operand" "=r")
213 (call (mem:SI (match_operand:SI 1 "call_operand" "i"))
214 (match_operand:SI 2 "general_operand" "g")))
215 (clobber (match_scratch:SI 3 "=&l"))]
218 [(set_attr "type" "call")])
220 (define_expand "probe"
221 [(call (mem:SI (symbol_ref:SI "_msp_check"))
226 ;; This is used for internal routine calls via TPC. Currently used only
229 [(call (mem:SI (match_operand:SI 0 "immediate_operand" "s"))
233 [(set_attr "type" "call")])
235 ;; CONST, CONSTH, CONSTN
237 ;; Many of these are generated from move insns.
239 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
240 (and:SI (match_operand:SI 1 "immediate_operand" "i")
246 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
248 (match_operand:SI 1 "const_0_operand" ""))
249 (ashiftrt:SI (match_operand:SI 2 "immediate_operand" "i")
255 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
257 (match_operand:SI 1 "const_0_operand" ""))
258 (match_operand:SI 2 "cint_16_operand" "J"))]
263 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
264 (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
265 (match_operand:SI 2 "const_int_operand" "n")))]
266 "(INTVAL (operands[2]) & 0xffff) == 0"
270 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
271 (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
272 (and:SI (match_operand:SI 2 "immediate_operand" "i")
273 (const_int -65536))))]
278 (define_insn "fix_truncsfsi2"
279 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
280 (fix:SI (match_operand:SF 1 "register_operand" "r")))]
281 "! TARGET_SOFT_FLOAT"
282 "convert %0,%1,0,3,0,1")
284 (define_insn "fix_truncdfsi2"
285 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
286 (fix:SI (match_operand:DF 1 "register_operand" "r")))]
287 "! TARGET_SOFT_FLOAT"
288 "convert %0,%1,0,3,0,2")
290 (define_insn "fixuns_truncsfsi2"
291 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
292 (unsigned_fix:SI (match_operand:SF 1 "register_operand" "r")))]
293 "! TARGET_SOFT_FLOAT"
294 "convert %0,%1,1,3,0,1")
296 (define_insn "fixuns_truncdfsi2"
297 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
298 (unsigned_fix:SI (match_operand:DF 1 "register_operand" "r")))]
299 "! TARGET_SOFT_FLOAT"
300 "convert %0,%1,1,3,0,2")
302 (define_insn "truncdfsf2"
303 [(set (match_operand:SF 0 "register_operand" "=r")
304 (float_truncate:SF (match_operand:DF 1 "register_operand" "r")))]
305 "! TARGET_SOFT_FLOAT"
306 "convert %0,%1,0,4,1,2")
308 (define_insn "extendsfdf2"
309 [(set (match_operand:DF 0 "register_operand" "=r")
310 (float_extend:DF (match_operand:SF 1 "register_operand" "r")))]
311 "! TARGET_SOFT_FLOAT"
312 "convert %0,%1,0,4,2,1")
314 (define_insn "floatsisf2"
315 [(set (match_operand:SF 0 "register_operand" "=r")
316 (float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
317 "! TARGET_SOFT_FLOAT"
318 "convert %0,%1,0,4,1,0")
320 (define_insn "floatsidf2"
321 [(set (match_operand:DF 0 "register_operand" "=r")
322 (float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
323 "! TARGET_SOFT_FLOAT"
324 "convert %0,%1,0,4,2,0")
326 (define_insn "floatunssisf2"
327 [(set (match_operand:SF 0 "register_operand" "=r")
328 (unsigned_float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
329 "! TARGET_SOFT_FLOAT"
330 "convert %0,%1,1,4,1,0")
332 (define_insn "floatunssidf2"
333 [(set (match_operand:DF 0 "register_operand" "=r")
334 (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
335 "! TARGET_SOFT_FLOAT"
336 "convert %0,%1,1,4,2,0")
338 ;; CPxxx, DEQ, DGT, DGE, FEQ, FGT, FGE
340 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
341 (match_operator:SI 3 "comparison_operator"
342 [(match_operand:SI 1 "gpc_reg_operand" "r")
343 (match_operand:SI 2 "srcb_operand" "rI")]))]
348 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
349 (match_operator:SI 3 "fp_comparison_operator"
350 [(match_operand:SF 1 "register_operand" "r")
351 (match_operand:SF 2 "register_operand" "r")]))]
352 "! TARGET_SOFT_FLOAT"
354 [(set_attr "type" "fadd")])
357 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
358 (match_operator:SI 3 "fp_comparison_operator"
359 [(match_operand:DF 1 "register_operand" "r")
360 (match_operand:DF 2 "register_operand" "r")]))]
361 "! TARGET_SOFT_FLOAT"
363 [(set_attr "type" "fadd")])
366 (define_expand "adddf3"
367 [(set (match_operand:DF 0 "register_operand" "")
368 (plus:DF (match_operand:DF 1 "register_operand" "")
369 (match_operand:DF 2 "register_operand" "")))]
370 "! TARGET_SOFT_FLOAT"
374 [(set (match_operand:DF 0 "register_operand" "=r")
375 (plus:DF (match_operand:DF 1 "register_operand" "%r")
376 (match_operand:DF 2 "register_operand" "r")))]
379 [(set_attr "type" "fadd")])
382 [(set (match_operand:DF 0 "register_operand" "=r,a")
383 (plus:DF (match_operand:DF 1 "register_operand" "%r,r")
384 (match_operand:DF 2 "register_operand" "r,0")))]
389 [(set_attr "type" "fadd,dam")])
392 (define_insn "divdf3"
393 [(set (match_operand:DF 0 "register_operand" "=r")
394 (div:DF (match_operand:DF 1 "register_operand" "=r")
395 (match_operand:DF 2 "register_operand" "r")))]
396 "! TARGET_SOFT_FLOAT"
398 [(set_attr "type" "ddiv")])
402 ;; We must set Q to the sign extension of the dividend first. For MOD, we
403 ;; must get the remainder from Q.
405 ;; For divmod: operand 1 is divided by operand 2; quotient goes to operand
406 ;; 0 and remainder to operand 3.
407 (define_expand "divmodsi4"
409 (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
411 (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
412 (div:SI (match_dup 1)
413 (match_operand:SI 2 "gpc_reg_operand" "")))
414 (set (match_operand:SI 3 "gpc_reg_operand" "")
415 (mod:SI (match_dup 1)
417 (use (match_dup 4))])]
421 operands[4] = gen_reg_rtx (SImode);
425 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
426 (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
427 (match_operand:SI 2 "gpc_reg_operand" "r")))
428 (set (match_operand:SI 3 "register_operand" "=q")
429 (mod:SI (match_dup 1)
431 (use (match_operand:SI 4 "register_operand" "3"))]
437 ;; Similar to DIVIDE.
438 (define_expand "udivmodsi4"
439 [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
440 (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
441 (match_operand:SI 2 "gpc_reg_operand" "")))
442 (set (match_operand:SI 3 "gpc_reg_operand" "")
443 (umod:SI (match_dup 1)
445 (use (const_int 0))])]
450 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
451 (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
452 (match_operand:SI 2 "gpc_reg_operand" "r")))
453 (set (match_operand:SI 3 "register_operand" "=q")
454 (umod:SI (match_dup 1)
456 (use (match_operand:SI 4 "const_int_operand" "3"))]
462 [(set (match_operand:DF 0 "register_operand" "=a,*r")
463 (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r,A")
464 (match_operand:DF 2 "register_operand" "r,r"))
465 (match_operand:DF 3 "register_operand" "0,*r")))]
470 [(set_attr "type" "dam")])
473 [(set (match_operand:DF 0 "register_operand" "=a")
474 (plus:DF (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
475 (match_operand:DF 2 "register_operand" "r"))
476 (match_operand:DF 3 "register_operand" "0")))]
479 [(set_attr "type" "dam")])
482 [(set (match_operand:DF 0 "register_operand" "=a")
483 (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r")
484 (match_operand:DF 2 "register_operand" "r"))
485 (match_operand:DF 3 "register_operand" "0")))]
488 [(set_attr "type" "dam")])
491 [(set (match_operand:DF 0 "register_operand" "=a")
492 (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "r")
493 (neg:DF (match_operand:DF 2 "register_operand" "r")))
494 (match_operand:DF 3 "register_operand" "0")))]
497 [(set_attr "type" "dam")])
500 [(set (match_operand:DF 0 "register_operand" "=a")
501 (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
502 (match_operand:DF 2 "register_operand" "r")))]
505 [(set_attr "type" "dam")])
508 [(set (match_operand:DF 0 "register_operand" "=a")
509 (minus:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
510 (match_operand:DF 2 "register_operand" "0")))]
513 [(set_attr "type" "dam")])
516 [(set (match_operand:DF 0 "register_operand" "=a")
517 (neg:DF (plus:DF (match_operand:DF 1 "register_operand" "%r")
518 (match_operand:DF 2 "register_operand" "0"))))]
521 [(set_attr "type" "dam")])
524 [(set (match_operand:DF 0 "register_operand" "=r,r,a")
525 (neg:DF (match_operand:DF 1 "register_operand" "0,r,r")))
526 (clobber (match_scratch:SI 2 "=&r,&r,X"))]
529 cpeq %2,gr1,gr1\;xor %0,%1,%2
530 cpeq %2,gr1,gr1\;xor %0,%1,%2\;sll %L0,%L1,0
532 [(set_attr "type" "multi,multi,dam")])
535 (define_expand "muldf3"
536 [(set (match_operand:DF 0 "register_operand" "")
537 (mult:DF (match_operand:DF 1 "register_operand" "")
538 (match_operand:DF 2 "register_operand" "")))]
539 "! TARGET_SOFT_FLOAT"
543 [(set (match_operand:DF 0 "register_operand" "=r")
544 (mult:DF (match_operand:DF 1 "register_operand" "%r")
545 (match_operand:DF 2 "register_operand" "r")))]
548 [(set_attr "type" "dmul")])
551 [(set (match_operand:DF 0 "register_operand" "=r,a")
552 (mult:DF (match_operand:DF 1 "register_operand" "%r,r")
553 (match_operand:DF 2 "register_operand" "r,r")))]
558 [(set_attr "type" "dmul,dam")])
561 (define_expand "subdf3"
562 [(set (match_operand:DF 0 "register_operand" "=r")
563 (minus:DF (match_operand:DF 1 "register_operand" "r")
564 (match_operand:DF 2 "register_operand" "r")))]
565 "! TARGET_SOFT_FLOAT"
569 [(set (match_operand:DF 0 "register_operand" "=r")
570 (minus:DF (match_operand:DF 1 "register_operand" "r")
571 (match_operand:DF 2 "register_operand" "r")))]
574 [(set_attr "type" "fadd")])
577 [(set (match_operand:DF 0 "register_operand" "=r,a,a")
578 (minus:DF (match_operand:DF 1 "register_operand" "r,0,r")
579 (match_operand:DF 2 "register_operand" "r,r,0")))]
585 [(set_attr "type" "fadd,dam,dam")])
589 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
590 (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
592 (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
595 (match_operand:PSI 3 "register_operand" "b")
601 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
602 (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
605 (match_operand:PSI 2 "register_operand" "b")
611 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
613 (match_operand:PSI 1 "const_24_operand" ""))
614 (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
617 (match_operand:PSI 3 "register_operand" "b")
622 (define_expand "extzv"
623 [(set (match_operand:SI 0 "gpc_reg_operand" "")
624 (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "")
625 (match_operand:SI 2 "general_operand" "")
626 (match_operand:SI 3 "general_operand" "")))]
632 if (GET_CODE (operands[2]) != CONST_INT
633 || GET_CODE (operands[3]) != CONST_INT)
636 size = INTVAL (operands[2]);
637 pos = INTVAL (operands[3]);
639 /* Can't do this unless a byte extraction. If extracting the high
640 or low byte, don't do this because a shift or AND is shorter.
641 Don't do 16-bit extracts, since the only two are the high and low
642 ends, and it is faster to do them with CONSTH and SRL. */
644 if (size != 8 || (pos != 8 && pos != 16))
647 operands[3] = gen_rtx_ASHIFT (PSImode,
648 force_reg (PSImode, GEN_INT (pos / 8)),
655 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
656 (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
658 (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
661 (match_operand:PSI 3 "register_operand" "b")
667 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
668 (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
671 (match_operand:PSI 2 "register_operand" "b")
677 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
679 (match_operand:PSI 1 "const_16_operand" ""))
680 (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
683 (match_operand:PSI 3 "register_operand" "b")
690 ;; This is probably unused. The high-order 16-bits are obtained with an SRA
691 ;; insn. The low-order 16 bits are a sign-extend, which is a pair of
692 ;; shifts. Setting BP followed by the insn is equivalent, so we don't
693 ;; bother going to any trouble to generate this insn.
696 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
697 (sign_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
700 (match_operand:PSI 2 "register_operand" "b")
707 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
708 (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
709 (match_operand:PSI 2 "register_operand" "f")))]
713 (define_expand "rotlsi3"
715 (match_operand:SI 2 "gpc_reg_or_immediate_operand" ""))
716 (set (match_operand:SI 0 "gpc_reg_operand" "")
717 (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
721 { operands[2] = gen_lowpart (PSImode, operands[2]);
722 operands[3] = gen_reg_rtx (PSImode);
725 ;; It would be nice to be able to have a define_split corresponding to the
726 ;; above, but there is no way to tell combine we need a PSImode temporary.
727 ;; If we put a (clobber (scratch:PSI)) there, combine would merge the above
728 ;; two insns. This is bad because it then thinks only one insn is needed.
731 (define_expand "addsf3"
732 [(set (match_operand:SF 0 "register_operand" "")
733 (plus:SF (match_operand:SF 1 "register_operand" "")
734 (match_operand:SF 2 "register_operand" "")))]
735 "! TARGET_SOFT_FLOAT"
739 [(set (match_operand:SF 0 "register_operand" "=r")
740 (plus:SF (match_operand:SF 1 "register_operand" "%r")
741 (match_operand:SF 2 "register_operand" "r")))]
744 [(set_attr "type" "fadd")])
747 [(set (match_operand:SF 0 "register_operand" "=r,a")
748 (plus:SF (match_operand:SF 1 "register_operand" "%r,r")
749 (match_operand:SF 2 "register_operand" "r,0")))]
754 [(set_attr "type" "fadd,fam")])
757 (define_insn "divsf3"
758 [(set (match_operand:SF 0 "register_operand" "=r")
759 (div:SF (match_operand:SF 1 "register_operand" "=r")
760 (match_operand:SF 2 "register_operand" "r")))]
761 "! TARGET_SOFT_FLOAT"
763 [(set_attr "type" "fdiv")])
767 [(set (match_operand:DF 0 "register_operand" "=r")
768 (mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "%r"))
769 (float_extend:DF (match_operand:SF 2 "register_operand" "r"))))]
770 "! TARGET_SOFT_FLOAT"
775 [(set (match_operand:SF 0 "register_operand" "=a,*r")
776 (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r,A")
777 (match_operand:SF 2 "register_operand" "r,r"))
778 (match_operand:SF 3 "register_operand" "0,*r")))]
783 [(set_attr "type" "fam")])
786 [(set (match_operand:SF 0 "register_operand" "=a")
787 (plus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
788 (match_operand:SF 2 "register_operand" "r"))
789 (match_operand:SF 3 "register_operand" "0")))]
792 [(set_attr "type" "fam")])
795 [(set (match_operand:SF 0 "register_operand" "=a")
796 (minus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r")
797 (match_operand:SF 2 "register_operand" "r"))
798 (match_operand:SF 3 "register_operand" "0")))]
801 [(set_attr "type" "fam")])
804 [(set (match_operand:SF 0 "register_operand" "=a")
805 (minus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
806 (match_operand:SF 2 "register_operand" "r"))
807 (match_operand:SF 3 "register_operand" "0")))]
810 [(set_attr "type" "fam")])
813 [(set (match_operand:SF 0 "register_operand" "=a")
814 (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
815 (match_operand:SF 2 "register_operand" "r")))]
818 [(set_attr "type" "fam")])
821 [(set (match_operand:SF 0 "register_operand" "=a")
822 (minus:SF (neg:SF (match_operand:SF 1 "register_operand" "%r"))
823 (match_operand:SF 2 "register_operand" "0")))]
826 [(set_attr "type" "fam")])
829 [(set (match_operand:SF 0 "register_operand" "=a")
830 (neg:SF (plus:SF (match_operand:SF 1 "register_operand" "%r")
831 (match_operand:SF 2 "register_operand" "0"))))]
834 [(set_attr "type" "fam")])
837 [(set (match_operand:SF 0 "register_operand" "=r,a")
838 (neg:SF (match_operand:SF 1 "register_operand" "r,r")))
839 (clobber (match_scratch:SI 2 "=&r,X"))]
842 cpeq %2,gr1,gr1\;xor %0,%1,%2
844 [(set_attr "type" "multi,fam")])
847 (define_expand "mulsf3"
848 [(set (match_operand:SF 0 "register_operand" "")
849 (mult:SF (match_operand:SF 1 "register_operand" "")
850 (match_operand:SF 2 "register_operand" "")))]
851 "! TARGET_SOFT_FLOAT"
855 [(set (match_operand:SF 0 "register_operand" "=r")
856 (mult:SF (match_operand:SF 1 "register_operand" "%r")
857 (match_operand:SF 2 "register_operand" "r")))]
860 [(set_attr "type" "fmul")])
863 [(set (match_operand:SF 0 "register_operand" "=r,a")
864 (mult:SF (match_operand:SF 1 "register_operand" "%r,r")
865 (match_operand:SF 2 "register_operand" "r,r")))]
870 [(set_attr "type" "fmul,fam")])
873 (define_expand "subsf3"
874 [(set (match_operand:SF 0 "register_operand" "")
875 (minus:SF (match_operand:SF 1 "register_operand" "")
876 (match_operand:SF 2 "register_operand" "")))]
877 "! TARGET_SOFT_FLOAT"
881 [(set (match_operand:SF 0 "register_operand" "=r")
882 (minus:SF (match_operand:SF 1 "register_operand" "r")
883 (match_operand:SF 2 "register_operand" "r")))]
886 [(set_attr "type" "fadd")])
889 [(set (match_operand:SF 0 "register_operand" "=r,a,a")
890 (minus:SF (match_operand:SF 1 "register_operand" "r,0,r")
891 (match_operand:SF 2 "register_operand" "r,r,0")))]
897 [(set_attr "type" "fadd,fam,fam")])
901 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
904 (match_operand:PSI 2 "register_operand" "b")
906 (match_operand:SI 1 "srcb_operand" "rI"))]
911 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
914 (ashift:SI (const_int 255)
916 (match_operand:PSI 3 "register_operand" "b")
918 (match_operand:SI 1 "gpc_reg_operand" "r"))
919 (ashift:SI (zero_extend:SI
920 (match_operand:QI 2 "srcb_operand" "rI"))
921 (ashift:PSI (match_dup 3) (const_int 3)))))]
927 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
930 (match_operand:PSI 2 "register_operand" "b")
932 (match_operand:SI 1 "srcb_operand" "rI"))]
937 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
940 (ashift:SI (const_int 65535)
942 (match_operand:PSI 3 "register_operand" "b")
944 (match_operand:SI 1 "gpc_reg_operand" "r"))
945 (ashift:SI (zero_extend:SI
946 (match_operand:HI 2 "srcb_operand" "rI"))
947 (ashift:PSI (match_dup 3) (const_int 3)))))]
951 (define_expand "insv"
952 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "")
953 (match_operand:SI 1 "general_operand" "")
954 (match_operand:SI 2 "general_operand" ""))
955 (match_operand:SI 3 "srcb_operand" ""))]
961 if (GET_CODE (operands[1]) != CONST_INT
962 || GET_CODE (operands[2]) != CONST_INT)
965 size = INTVAL (operands[1]);
966 pos = INTVAL (operands[2]);
967 if ((size != 8 && size != 16) || pos % size != 0)
970 operands[2] = gen_rtx_ASHIFT (PSImode,
971 force_reg (PSImode, GEN_INT (pos / 8)),
975 ;; LOAD (also used by move insn).
977 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
978 (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "r")
980 (set (match_operand:PSI 2 "register_operand" "=b")
981 (truncate:PSI (match_dup 1)))]
984 [(set_attr "type" "load")])
987 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
988 (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
991 [(set_attr "type" "load")])
994 [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
995 (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
998 [(set_attr "type" "load")])
1001 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1002 (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
1005 [(set_attr "type" "load")])
1008 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1009 (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))
1010 (clobber (match_scratch:PSI 2 "=&b"))]
1013 [(set_attr "type" "load")])
1016 [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
1017 (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))
1018 (clobber (match_scratch:PSI 2 "=&b"))]
1021 [(set_attr "type" "load")])
1024 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1025 (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))
1026 (clobber (match_scratch:PSI 2 "=&b"))]
1029 [(set_attr "type" "load")])
1032 (define_expand "load_multiple"
1034 (match_operand:PSI 2 "const_int_operand" ""))
1035 (match_par_dup 3 [(set (match_operand:SI 0 "" "")
1036 (match_operand:SI 1 "" ""))])]
1045 /* Support only loading a constant number of hard registers from memory. */
1046 if (GET_CODE (operands[2]) != CONST_INT
1047 || operands[2] == const1_rtx
1048 || GET_CODE (operands[1]) != MEM
1049 || GET_CODE (operands[0]) != REG
1050 || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)
1053 count = INTVAL (operands[2]);
1054 regno = REGNO (operands[0]);
1056 /* CR gets set to the number of registers minus one. */
1057 operands[2] = GEN_INT(count - 1);
1059 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + 2));
1060 from = memory_address (SImode, XEXP (operands[1], 0));
1061 XVECEXP (operands[3], 0, 0) = gen_rtx_SET (VOIDmode,
1062 gen_rtx_REG (SImode, regno),
1063 gen_rtx_MEM (SImode, from));
1064 operands[4] = gen_reg_rtx (PSImode);
1066 XVECEXP (operands[3], 0, 1) = gen_rtx_USE (VOIDmode, operands[4]);
1067 XVECEXP (operands[3], 0, 2) = gen_rtx_CLOBBER (VOIDmode, operands[4]);
1069 for (i = 1; i < count; i++)
1070 XVECEXP (operands[3], 0, i + 2)
1071 = gen_rtx_SET (VOIDmode, gen_rtx (REG, SImode, regno + i),
1072 gen_rtx_MEM (SImode, plus_constant (from, i * 4)));
1075 ;; Indicate that CR is used and is then clobbered.
1077 [(set (match_operand 0 "gpc_reg_operand" "=r")
1078 (match_operand 1 "memory_operand" "m"))
1079 (use (match_operand:PSI 2 "register_operand" "+c"))
1080 (clobber (match_dup 2))]
1081 "GET_MODE (operands[0]) == GET_MODE (operands[1])
1082 && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1084 [(set_attr "type" "load")])
1087 [(match_parallel 0 "load_multiple_operation"
1088 [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
1089 (match_operand:SI 2 "memory_operand" "m"))
1090 (use (match_operand:PSI 3 "register_operand" "+c"))
1091 (clobber (match_dup 3))])]
1094 [(set_attr "type" "load")])
1096 ;; MTSR (used also by move insn)
1098 [(set (match_operand:SI 0 "spec_reg_operand" "=*h,*h")
1099 (and:SI (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")
1100 (match_operand:SI 2 "const_int_operand" "n,n")))]
1101 "masks_bits_for_special (operands[0], operands[2])"
1107 [(set (match_operand:PSI 0 "register_operand" "=h,h")
1109 (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")))]
1115 ;; MULTIPLY, MULTM, MULTMU
1116 (define_insn "mulsi3"
1117 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1118 (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1119 (match_operand:SI 2 "gpc_reg_operand" "r")))
1120 (clobber (match_scratch:SI 3 "=&q"))]
1122 "multiply %0,%1,%2")
1124 (define_insn "mulsidi3"
1125 [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1126 (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
1127 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
1128 (clobber (match_scratch:SI 3 "=&q"))]
1130 "multiply %L0,%1,%2\;multm %0,%1,%2"
1131 [(set_attr "type" "multi")])
1134 [(set (match_operand:DI 0 "gpc_reg_operand" "")
1135 (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
1136 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
1137 (clobber (reg:SI 180))]
1139 [(parallel [(set (match_dup 3)
1140 (mult:SI (match_dup 1) (match_dup 2)))
1141 (clobber (reg:SI 180))])
1142 (parallel [(set (match_dup 4)
1145 (mult:DI (sign_extend:DI (match_dup 1))
1146 (sign_extend:DI (match_dup 2)))
1148 (clobber (reg:SI 180))])]
1150 { operands[3] = operand_subword (operands[0], 1, 1, DImode);
1151 operands[4] = operand_subword (operands[0], 0, 1, DImode); } ")
1153 (define_insn "umulsidi3"
1154 [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1155 (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
1156 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
1157 (clobber (match_scratch:SI 3 "=&q"))]
1159 "multiplu %L0,%1,%2\;multmu %0,%1,%2"
1160 [(set_attr "type" "multi")])
1163 [(set (match_operand:DI 0 "gpc_reg_operand" "")
1164 (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
1165 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
1166 (clobber (reg:SI 180))]
1168 [(parallel [(set (match_dup 3)
1169 (mult:SI (match_dup 1) (match_dup 2)))
1170 (clobber (reg:SI 180))])
1171 (parallel [(set (match_dup 4)
1174 (mult:DI (zero_extend:DI (match_dup 1))
1175 (zero_extend:DI (match_dup 2)))
1177 (clobber (reg:SI 180))])]
1179 { operands[3] = operand_subword (operands[0], 1, 1, DImode);
1180 operands[4] = operand_subword (operands[0], 0, 1, DImode); } ")
1182 (define_insn "smulsi3_highpart"
1183 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1186 (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1187 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r")))
1189 (clobber (match_scratch:SI 3 "=&q"))]
1193 (define_insn "umulsi3_highpart"
1194 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1197 (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1198 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r")))
1200 (clobber (match_scratch:SI 3 "=&q"))]
1206 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1207 (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1208 (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1213 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1214 (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1215 (match_operand:SI 2 "const_int_operand" "K")))]
1216 ; Match TARGET_29050 in "orn" pattern for slightly better reload.
1217 "! TARGET_29050 && ((unsigned) ~ INTVAL (operands[2])) < 256"
1222 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1223 (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1224 (not:SI (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1228 (define_insn "one_cmplsi2"
1229 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1230 (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1235 (define_expand "iorsi3"
1236 [(set (match_operand:SI 0 "gpc_reg_operand" "")
1237 (ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
1238 (match_operand:SI 2 "srcb_operand" "")))]
1243 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1244 (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1245 (match_operand:SI 2 "srcb_operand" "rI")))]
1250 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1251 (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
1252 (match_operand:SI 2 "and_operand" "rI,K")))]
1259 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1260 (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r"))
1261 (match_operand:SI 2 "cmplsrcb_operand" "r,K")))]
1268 ;; SLL (also used by move insn)
1272 "aseq 0x40,gr1,gr1")
1274 (define_insn "ashlsi3"
1275 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1276 (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1277 (match_operand:QI 2 "srcb_operand" "rn")))]
1282 (define_insn "sqrtsf2"
1283 [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
1284 (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
1287 [(set_attr "type" "fsqrt")])
1289 (define_insn "sqrtdf2"
1290 [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
1291 (sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "r")))]
1294 [(set_attr "type" "dsqrt")])
1297 (define_insn "ashrsi3"
1298 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1299 (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1300 (match_operand:QI 2 "srcb_operand" "rn")))]
1305 (define_insn "lshrsi3"
1306 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1307 (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1308 (match_operand:QI 2 "srcb_operand" "rn")))]
1314 ;; These somewhat bogus patterns exist to set OPT = 001/010 for partial-word
1315 ;; stores on systems with DW not set.
1317 [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
1319 (match_operand:SI 1 "gpc_reg_operand" "r"))]
1320 "! TARGET_DW_ENABLE"
1322 [(set_attr "type" "store")])
1325 [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
1327 (match_operand:SI 1 "gpc_reg_operand" "r"))]
1328 "! TARGET_DW_ENABLE"
1330 [(set_attr "type" "store")])
1333 (define_expand "store_multiple"
1334 [(use (match_operand 0 "" ""))
1335 (use (match_operand 1 "" ""))
1336 (use (match_operand 2 "" ""))]
1341 if (TARGET_NO_STOREM_BUG)
1342 pat = gen_store_multiple_no_bug (operands[0], operands[1], operands[2]);
1344 pat = gen_store_multiple_bug (operands[0], operands[1], operands[2]);
1354 (define_expand "store_multiple_no_bug"
1356 (match_operand:PSI 2 "const_int_operand" ""))
1357 (match_par_dup 3 [(set (match_operand:SI 0 "" "")
1358 (match_operand:SI 1 "" ""))])]
1367 /* Support only storing a constant number of hard registers to memory. */
1368 if (GET_CODE (operands[2]) != CONST_INT
1369 || operands[2] == const1_rtx
1370 || GET_CODE (operands[0]) != MEM
1371 || GET_CODE (operands[1]) != REG
1372 || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
1375 count = INTVAL (operands[2]);
1376 regno = REGNO (operands[1]);
1378 /* CR gets set to the number of registers minus one. */
1379 operands[2] = GEN_INT(count - 1);
1381 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + 2));
1382 from = memory_address (SImode, XEXP (operands[0], 0));
1383 XVECEXP (operands[3], 0, 0) = gen_rtx_SET (VOIDmode,
1384 gen_rtx_MEM (SImode, from),
1385 gen_rtx_REG (SImode, regno));
1386 operands[4] = gen_reg_rtx (PSImode);
1387 XVECEXP (operands[3], 0, 1) = gen_rtx_USE (VOIDmode, operands[4]);
1388 XVECEXP (operands[3], 0, 2) = gen_rtx_CLOBBER (VOIDmode, operands[4]);
1390 for (i = 1; i < count; i++)
1391 XVECEXP (operands[3], 0, i + 2)
1392 = gen_rtx_SET (VOIDmode,
1393 gen_rtx_MEM (SImode, plus_constant (from, i * 4)),
1394 gen_rtx_REG (SImode, regno + i));
1397 (define_expand "store_multiple_bug"
1398 [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
1399 (match_operand:SI 1 "" ""))
1400 (use (match_operand:SI 2 "" ""))])]
1409 /* Support only storing a constant number of hard registers to memory. */
1410 if (GET_CODE (operands[2]) != CONST_INT
1411 || operands[2] == const1_rtx
1412 || GET_CODE (operands[0]) != MEM
1413 || GET_CODE (operands[1]) != REG
1414 || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
1417 count = INTVAL (operands[2]);
1418 regno = REGNO (operands[1]);
1420 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + 1));
1421 from = memory_address (SImode, XEXP (operands[0], 0));
1422 XVECEXP (operands[3], 0, 0) = gen_rtx_SET (VOIDmode,
1423 gen_rtx_MEM (SImode, from),
1424 gen_rtx_REG (SImode, regno));
1425 XVECEXP (operands[3], 0, 1)
1426 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (PSImode));
1428 for (i = 1; i < count; i++)
1429 XVECEXP (operands[3], 0, i + 1)
1430 = gen_rtx_SET (VOIDmode,
1431 gen_rtx_MEM (SImode, plus_constant (from, i * 4)),
1432 gen_rtx_REG (SImode, regno + i));
1436 [(set (match_operand 0 "memory_operand" "=m")
1437 (match_operand 1 "gpc_reg_operand" "r"))
1438 (clobber (match_scratch:PSI 2 "=&c"))]
1439 "!TARGET_NO_STOREM_BUG
1440 && GET_MODE (operands[0]) == GET_MODE (operands[1])
1441 && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1442 "mtsrim cr,%S1\;storem 0,0,%1,%0"
1443 [(set_attr "type" "multi")])
1446 [(match_parallel 0 "store_multiple_operation"
1447 [(set (match_operand:SI 1 "memory_operand" "=m")
1448 (match_operand:SI 2 "gpc_reg_operand" "r"))
1449 (clobber (match_scratch:PSI 3 "=&c"))])]
1450 "!TARGET_NO_STOREM_BUG"
1451 "mtsrim cr,%V0\;storem 0,0,%2,%1"
1452 [(set_attr "type" "multi")])
1455 [(set (match_operand 0 "memory_operand" "=m")
1456 (match_operand 1 "gpc_reg_operand" "r"))
1457 (use (match_operand:PSI 2 "register_operand" "+c"))
1458 (clobber (match_dup 2))]
1459 "TARGET_NO_STOREM_BUG
1460 && GET_MODE (operands[0]) == GET_MODE (operands[1])
1461 && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1463 [(set_attr "type" "store")])
1466 [(match_parallel 0 "store_multiple_operation"
1467 [(set (match_operand:SI 1 "memory_operand" "=m")
1468 (match_operand:SI 2 "gpc_reg_operand" "r"))
1469 (use (match_operand:PSI 3 "register_operand" "+c"))
1470 (clobber (match_dup 3))])]
1471 "TARGET_NO_STOREM_BUG"
1473 [(set_attr "type" "store")])
1477 ;; Either operand can be a register or an 8-bit constant, but both cannot be
1478 ;; constants (can't usually occur anyway).
1479 (define_expand "subsi3"
1480 [(set (match_operand:SI 0 "gpc_reg_operand" "")
1481 (minus:SI (match_operand:SI 1 "srcb_operand" "")
1482 (match_operand:SI 2 "srcb_operand" "")))]
1486 if (GET_CODE (operands[0]) == CONST_INT
1487 && GET_CODE (operands[1]) == CONST_INT)
1488 operands[1] = force_reg (SImode, operands[1]);
1492 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1493 (minus:SI (match_operand:SI 1 "srcb_operand" "r,I")
1494 (match_operand:SI 2 "srcb_operand" "rI,r")))]
1495 "register_operand (operands[1], SImode)
1496 || register_operand (operands[2], SImode)"
1501 (define_insn "subdi3"
1502 [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1503 (minus:DI (match_operand:DI 1 "gpc_reg_operand" "r")
1504 (match_operand:DI 2 "gpc_reg_operand" "r")))]
1506 "sub %L0,%L1,%L2\;subc %0,%1,%2"
1507 [(set_attr "type" "multi")])
1509 ;; SUBR (also used above in SUB)
1510 (define_insn "negdi2"
1511 [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1512 (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
1514 "subr %L0,%L1,0\;subrc %0,%1,0"
1515 [(set_attr "type" "multi")])
1517 (define_insn "negsi2"
1518 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1519 (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1525 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1526 (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1527 (match_operand:SI 2 "gpc_reg_operand" "r"))))]
1533 (define_insn "xorsi3"
1534 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1535 (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
1536 (match_operand:SI 2 "and_operand" "rI,K")))]
1542 ;; Can use XOR to negate floating-point values, but we are better off not doing
1543 ;; it that way on the 29050 so it can combine with the fmac insns.
1544 (define_expand "negsf2"
1545 [(parallel [(set (match_operand:SF 0 "register_operand" "")
1546 (neg:SF (match_operand:SF 1 "register_operand" "")))
1547 (clobber (match_scratch:SI 2 ""))])]
1548 "! TARGET_SOFT_FLOAT"
1556 target = operand_subword_force (operands[0], 0, SFmode);
1557 result = expand_binop (SImode, xor_optab,
1558 operand_subword_force (operands[1], 0, SFmode),
1559 GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
1563 if (result != target)
1564 emit_move_insn (result, target);
1566 /* Make a place for REG_EQUAL. */
1567 emit_move_insn (operands[0], operands[0]);
1572 (define_expand "negdf2"
1573 [(parallel [(set (match_operand:DF 0 "register_operand" "")
1574 (neg:DF (match_operand:DF 1 "register_operand" "")))
1575 (clobber (match_scratch:SI 2 ""))])]
1576 "! TARGET_SOFT_FLOAT"
1586 target = operand_subword (operands[0], 0, 1, DFmode);
1587 result = expand_binop (SImode, xor_optab,
1588 operand_subword_force (operands[1], 0, DFmode),
1589 GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
1593 if (result != target)
1594 emit_move_insn (result, target);
1596 emit_move_insn (operand_subword (operands[0], 1, 1, DFmode),
1597 operand_subword_force (operands[1], 1, DFmode));
1599 insns = get_insns ();
1602 emit_no_conflict_block (insns, operands[0], operands[1], 0, 0);
1607 ;; Sign extend and truncation operations.
1608 (define_insn "zero_extendqihi2"
1609 [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
1610 (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))]
1614 (define_insn "zero_extendqisi2"
1615 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1616 (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))]
1620 (define_insn "zero_extendhisi2"
1621 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1622 (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0")))]
1626 (define_expand "extendqihi2"
1628 (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
1630 (set (match_operand:HI 0 "gpc_reg_operand" "")
1631 (ashiftrt:SI (match_dup 2)
1635 { operands[0] = gen_lowpart (SImode, operands[0]);
1636 operands[1] = gen_lowpart (SImode, operands[1]);
1637 operands[2] = gen_reg_rtx (SImode); }")
1639 (define_expand "extendqisi2"
1641 (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
1643 (set (match_operand:SI 0 "gpc_reg_operand" "")
1644 (ashiftrt:SI (match_dup 2)
1648 { operands[1] = gen_lowpart (SImode, operands[1]);
1649 operands[2] = gen_reg_rtx (SImode); }")
1651 (define_expand "extendhisi2"
1653 (ashift:SI (match_operand:HI 1 "gpc_reg_operand" "")
1655 (set (match_operand:SI 0 "gpc_reg_operand" "")
1656 (ashiftrt:SI (match_dup 2)
1660 { operands[1] = gen_lowpart (SImode, operands[1]);
1661 operands[2] = gen_reg_rtx (SImode); }")
1663 ;; Define the methods used to move data around.
1667 ;; If storing into memory, force source into register.
1668 (define_expand "movsi"
1669 [(set (match_operand:SI 0 "general_operand" "")
1670 (match_operand:SI 1 "general_operand" ""))]
1674 if (GET_CODE (operands[0]) == MEM && ! gpc_reg_operand (operands[1], SImode))
1675 operands[1] = copy_to_mode_reg (SImode, operands[1]);
1676 else if (spec_reg_operand (operands[0], SImode)
1677 && ! (register_operand (operands[1], SImode)
1678 || cint_16_operand (operands[1], SImode)))
1679 operands[1] = force_reg (SImode, operands[1]);
1682 (define_expand "movpsi"
1683 [(set (match_operand:PSI 0 "general_operand" "")
1684 (match_operand:PSI 1 "general_operand" ""))]
1688 if (GET_CODE (operands[0]) == MEM
1689 && ! gpc_reg_operand (operands[1], PSImode))
1690 operands[1] = copy_to_mode_reg (PSImode, operands[1]);
1691 else if (spec_reg_operand (operands[0], PSImode)
1692 && ! (register_operand (operands[1], PSImode)
1693 || cint_16_operand (operands[1], PSImode)))
1694 operands[1] = force_reg (PSImode, operands[1]);
1698 [(set (match_operand:SI 0 "gpc_reg_operand" "")
1699 (match_operand:SI 1 "long_const_operand" ""))]
1702 (and:SI (match_dup 1)
1705 (ior:SI (zero_extend:SI (match_dup 2))
1706 (and:SI (match_dup 1)
1707 (const_int -65536))))]
1708 " operands[2] = gen_lowpart (HImode, operands[0]); ")
1710 ;; Subroutines to load/store halfwords. Operands 0 and 1 are the output and
1711 ;; input, respectively, except that the address is passed for a MEM instead
1712 ;; of the MEM itself and the short item is passed in QImode.
1714 ;; Operand 2 is a scratch general register and operand 3 is a scratch register
1715 ;; used for BP. When called before reload, pseudos are passed for both
1716 ;; operands. During reload, R_TAV is used for the general register, and
1717 ;; a reload register of class BR_REGS (R_VP) for BP.
1719 ;; We have two versions of the store operations, for when halfword writes are
1720 ;; supported and when they are not.
1721 (define_expand "loadhi"
1722 [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1723 (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
1725 (set (match_operand:PSI 3 "register_operand" "")
1726 (truncate:PSI (match_dup 1)))])
1727 (set (match_operand:SI 0 "gpc_reg_operand" "")
1728 (zero_extract:SI (match_dup 2)
1730 (ashift:PSI (match_dup 3) (const_int 3))))]
1734 (define_expand "storehinhww"
1735 [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1736 (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
1738 (set (match_operand:PSI 3 "register_operand" "")
1739 (truncate:PSI (match_dup 0)))])
1740 (set (zero_extract:SI (match_dup 2)
1742 (ashift:PSI (match_dup 3) (const_int 3)))
1743 (match_operand:SI 1 "gpc_reg_operand" ""))
1744 (set (mem:SI (match_dup 0))
1749 (define_expand "storehihww"
1750 [(set (match_operand:PSI 3 "register_operand" "")
1751 (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
1752 (set (match_operand:SI 2 "gpc_reg_operand" "")
1753 (ior:SI (and:SI (not:SI (ashift:SI (const_int 65535)
1754 (ashift:PSI (match_dup 3)
1756 (match_operand:SI 1 "gpc_reg_operand" ""))
1757 (ashift:SI (zero_extend:SI (match_dup 4))
1758 (ashift:PSI (match_dup 3) (const_int 3)))))
1759 (set (mem:SI (and:SI (match_dup 0)
1764 { operands[4] = gen_lowpart (HImode, operands[1]); }")
1766 (define_expand "movhi"
1767 [(set (match_operand:HI 0 "general_operand" "")
1768 (match_operand:HI 1 "general_operand" ""))]
1771 { if (GET_CODE (operands[0]) == MEM)
1773 if (! gpc_reg_operand (operands[1], HImode))
1774 operands[1] = copy_to_mode_reg (HImode, operands[1]);
1775 if (! TARGET_DW_ENABLE)
1777 rtx general = gen_reg_rtx (SImode);
1778 rtx bp = gen_reg_rtx (PSImode);
1779 rtx (*fcn) PARAMS ((rtx, rtx, rtx, rtx))
1780 = TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
1781 rtx seq = (*fcn) (XEXP (operands[0], 0),
1782 gen_lowpart (SImode, operands[1]),
1785 a29k_set_memflags (seq, operands[0]);
1790 else if (GET_CODE (operands[1]) == MEM)
1792 if (! TARGET_DW_ENABLE)
1794 rtx general = gen_reg_rtx (SImode);
1795 rtx bp = gen_reg_rtx (PSImode);
1796 rtx seq = gen_loadhi (gen_lowpart (SImode, operands[0]),
1797 XEXP (operands[1], 0), general, bp);
1799 a29k_set_memflags (seq, operands[1]);
1806 (define_expand "reload_inhi"
1807 [(parallel [(match_operand:SI 0 "register_operand" "=r")
1808 (match_operand:SI 1 "reload_memory_operand" "m")
1809 (match_operand:PSI 2 "register_operand" "=b")])]
1810 "! TARGET_DW_ENABLE"
1812 { rtx seq = gen_loadhi (gen_lowpart (SImode, operands[0]),
1813 a29k_get_reloaded_address (operands[1]),
1814 gen_rtx_REG (SImode, R_TAV),
1817 a29k_set_memflags (seq, operands[1]);
1822 (define_expand "reload_outhi"
1823 [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
1824 (match_operand:SI 1 "register_operand" "m")
1825 (match_operand:PSI 2 "register_operand" "=b")])]
1826 "! TARGET_DW_ENABLE"
1828 { rtx (*fcn) PARAMS ((rtx, rtx, rtx, rtx)) =
1829 TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
1830 rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
1831 gen_lowpart (SImode, operands[1]),
1832 gen_rtx_REG (SImode, R_TAV), operands[2]);
1834 a29k_set_memflags (seq, operands[0]);
1839 ;; Subroutines to load/store bytes. Operands 0 and 1 are the output and
1840 ;; input, respectively, except that the address is passed for a MEM instead
1841 ;; of the MEM itself and the short item is passed in QImode.
1843 ;; Operand 2 is a scratch general register and operand 3 is a scratch register
1844 ;; used for BP. When called before reload, pseudos are passed for both
1845 ;; operands. During reload, R_TAV is used for the general register, and
1846 ;; a reload register of class BR_REGS (R_VP) for BP.
1848 ;; We have two versions of the store operations, for when byte writes are
1849 ;; supported and when they are not.
1850 (define_expand "loadqi"
1851 [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1852 (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
1854 (set (match_operand:PSI 3 "register_operand" "")
1855 (truncate:PSI (match_dup 1)))])
1856 (set (match_operand:SI 0 "gpc_reg_operand" "")
1857 (zero_extract:SI (match_dup 2)
1859 (ashift:PSI (match_dup 3) (const_int 3))))]
1863 (define_expand "storeqinhww"
1864 [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1865 (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
1867 (set (match_operand:PSI 3 "register_operand" "")
1868 (truncate:PSI (match_dup 0)))])
1869 (set (zero_extract:SI (match_dup 2)
1871 (ashift:PSI (match_dup 3)
1873 (match_operand:SI 1 "gpc_reg_operand" ""))
1874 (set (mem:SI (match_dup 0))
1879 (define_expand "storeqihww"
1880 [(set (match_operand:PSI 3 "register_operand" "")
1881 (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
1882 (set (match_operand:SI 2 "gpc_reg_operand" "")
1883 (ior:SI (and:SI (not:SI (ashift:SI (const_int 255)
1884 (ashift:PSI (match_dup 3)
1886 (match_operand:SI 1 "gpc_reg_operand" ""))
1887 (ashift:SI (zero_extend:SI (match_dup 4))
1888 (ashift:PSI (match_dup 3)
1890 (set (mem:SI (and:SI (match_dup 0)
1895 { operands[4] = gen_lowpart (QImode, operands[1]); }")
1897 (define_expand "movqi"
1898 [(set (match_operand:QI 0 "general_operand" "")
1899 (match_operand:QI 1 "general_operand" ""))]
1902 { if (GET_CODE (operands[0]) == MEM)
1904 if (! gpc_reg_operand (operands[1], QImode))
1905 operands[1] = copy_to_mode_reg (QImode, operands[1]);
1906 if (! TARGET_DW_ENABLE)
1908 rtx general = gen_reg_rtx (SImode);
1909 rtx bp = gen_reg_rtx (PSImode);
1910 rtx (*fcn) PARAMS ((rtx, rtx, rtx, rtx))
1911 = TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
1912 rtx seq = (*fcn) (XEXP (operands[0], 0),
1913 gen_lowpart (SImode, operands[1]),
1916 a29k_set_memflags (seq, operands[0]);
1921 else if (GET_CODE (operands[1]) == MEM)
1923 if (! TARGET_DW_ENABLE)
1925 rtx general = gen_reg_rtx (SImode);
1926 rtx bp = gen_reg_rtx (PSImode);
1927 rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
1928 XEXP (operands[1], 0), general, bp);
1930 a29k_set_memflags (seq, operands[1]);
1937 (define_expand "reload_inqi"
1938 [(parallel [(match_operand:SI 0 "register_operand" "=r")
1939 (match_operand:SI 1 "reload_memory_operand" "m")
1940 (match_operand:PSI 2 "register_operand" "=b")])]
1941 "! TARGET_DW_ENABLE"
1943 { rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
1944 a29k_get_reloaded_address (operands[1]),
1945 gen_rtx_REG (SImode, R_TAV),
1948 a29k_set_memflags (seq, operands[1]);
1953 (define_expand "reload_outqi"
1954 [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
1955 (match_operand:SI 1 "register_operand" "m")
1956 (match_operand:PSI 2 "register_operand" "=b")])]
1957 "! TARGET_DW_ENABLE"
1959 { rtx (*fcn) PARAMS ((rtx, rtx, rtx, rtx)) =
1960 TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
1961 rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
1962 gen_lowpart (SImode, operands[1]),
1963 gen_rtx_REG (SImode, R_TAV), operands[2]);
1965 a29k_set_memflags (seq, operands[0]);
1970 ;; Now the actual insns used to move data around. We include here the
1971 ;; DEFINE_SPLITs that may be needed. In some cases these will be
1972 ;; split again. For floating-point, if we can look inside the constant,
1973 ;; always split it. This can eliminate unnecessary insns.
1975 [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m")
1976 (match_operand:SF 1 "in_operand" "r,E,F,m,r"))]
1977 "(gpc_reg_operand (operands[0], SFmode)
1978 || gpc_reg_operand (operands[1], SFmode))
1983 const %0,%1\;consth %0,%1
1986 [(set_attr "type" "misc,multi,multi,load,store")])
1989 [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m,*a,r")
1990 (match_operand:SF 1 "in_operand" "r,E,F,m,r,r,*a"))]
1991 "(gpc_reg_operand (operands[0], SFmode)
1992 || gpc_reg_operand (operands[1], SFmode))
1997 const %0,%1\;consth %0,%1
2002 [(set_attr "type" "misc,multi,multi,load,store,fadd,fadd")])
2004 ;; Turn this into SImode. It will then be split up that way.
2006 [(set (match_operand:SF 0 "register_operand" "")
2007 (match_operand:SF 1 "float_const_operand" ""))]
2008 "HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT"
2012 { operands[0] = operand_subword (operands[0], 0, 0, SFmode);
2013 operands[1] = operand_subword (operands[1], 0, 0, SFmode);
2015 if (operands[0] == 0 || operands[1] == 0)
2020 [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m")
2021 (match_operand:DF 1 "in_operand" "rE,F,m,r"))
2022 (clobber (match_scratch:PSI 2 "=X,X,&c,&c"))]
2023 "(gpc_reg_operand (operands[0], DFmode)
2024 || gpc_reg_operand (operands[1], DFmode))
2028 const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
2029 mtsrim cr,1\;loadm 0,0,%0,%1
2030 mtsrim cr,1\;storem 0,0,%1,%0"
2031 [(set_attr "type" "multi")])
2034 [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m,?*a,?r")
2035 (match_operand:DF 1 "in_operand" "rE,F,m,r,r,*a"))
2036 (clobber (match_scratch:PSI 2 "=X,X,&c,&c,X,X"))]
2037 "(gpc_reg_operand (operands[0], DFmode)
2038 || gpc_reg_operand (operands[1], DFmode))
2042 const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
2043 mtsrim cr,1\;loadm 0,0,%0,%1
2044 mtsrim cr,1\;storem 0,0,%1,%0
2047 [(set_attr "type" "multi,multi,multi,multi,fadd,fadd")])
2049 ;; Split register-register copies and constant loads into two SImode loads,
2050 ;; one for each word. In the constant case, they will get further split.
2051 ;; Don't so this until register allocation, though, since it will
2052 ;; interfere with register allocation. Normally copy the lowest-addressed
2053 ;; word first; the exception is if we are copying register to register and
2054 ;; the lowest register of the first operand is the highest register of the
2057 [(set (match_operand:DF 0 "gpc_reg_operand" "")
2058 (match_operand:DF 1 "gpc_reg_or_float_constant_operand" ""))
2059 (clobber (match_scratch:PSI 2 ""))]
2061 [(set (match_dup 3) (match_dup 4))
2062 (set (match_dup 5) (match_dup 6))]
2064 { if (GET_CODE (operands[1]) == REG
2065 && REGNO (operands[0]) == REGNO (operands[1]) + 1)
2067 operands[3] = operand_subword (operands[0], 1, 1, DFmode);
2068 operands[4] = operand_subword (operands[1], 1, 1, DFmode);
2069 operands[5] = operand_subword (operands[0], 0, 1, DFmode);
2070 operands[6] = operand_subword (operands[1], 0, 1, DFmode);
2074 operands[3] = operand_subword (operands[0], 0, 1, DFmode);
2075 operands[4] = operand_subword (operands[1], 0, 1, DFmode);
2076 operands[5] = operand_subword (operands[0], 1, 1, DFmode);
2077 operands[6] = operand_subword (operands[1], 1, 1, DFmode);
2080 if (operands[3] == 0 || operands[4] == 0
2081 || operands[5] == 0 || operands[6] == 0)
2085 ;; Split memory loads and stores into the MTSR and LOADM/STOREM.
2087 [(set (match_operand:DF 0 "out_operand" "")
2088 (match_operand:DF 1 "in_operand" ""))
2089 (clobber (reg:PSI 179))]
2090 "TARGET_NO_STOREM_BUG
2091 && (memory_operand (operands[0], DFmode)
2092 || memory_operand (operands[1], DFmode))"
2093 [(set (reg:PSI 179) (const_int 1))
2094 (parallel [(set (match_dup 0) (match_dup 1))
2096 (clobber (reg:PSI 179))])]
2099 ;; DI move is similar to DF move.
2101 [(set (match_operand:DI 0 "out_operand" "=?r,r,m")
2102 (match_operand:DI 1 "in_operand" "rn,m,r"))
2103 (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
2104 "(gpc_reg_operand (operands[0], DImode)
2105 || gpc_reg_operand (operands[1], DImode))"
2108 mtsrim cr,1\;loadm 0,0,%0,%1
2109 mtsrim cr,1\;storem 0,0,%1,%0"
2110 [(set_attr "type" "multi")])
2113 [(set (match_operand:DI 0 "gpc_reg_operand" "")
2114 (match_operand:DI 1 "gpc_reg_or_integer_constant_operand" ""))
2115 (clobber (match_scratch:PSI 2 ""))]
2117 [(set (match_dup 3) (match_dup 4))
2118 (set (match_dup 5) (match_dup 6))]
2120 { if (GET_CODE (operands[1]) == REG
2121 && REGNO (operands[0]) == REGNO (operands[1]) + 1)
2123 operands[3] = operand_subword (operands[0], 1, 1, DImode);
2124 operands[4] = operand_subword (operands[1], 1, 1, DImode);
2125 operands[5] = operand_subword (operands[0], 0, 1, DImode);
2126 operands[6] = operand_subword (operands[1], 0, 1, DImode);
2130 operands[3] = operand_subword (operands[0], 0, 1, DImode);
2131 operands[4] = operand_subword (operands[1], 0, 1, DImode);
2132 operands[5] = operand_subword (operands[0], 1, 1, DImode);
2133 operands[6] = operand_subword (operands[1], 1, 1, DImode);
2138 [(set (match_operand:DI 0 "out_operand" "")
2139 (match_operand:DI 1 "in_operand" ""))
2140 (clobber (reg:PSI 179))]
2141 "TARGET_NO_STOREM_BUG
2142 && (memory_operand (operands[0], DImode)
2143 || memory_operand (operands[1], DImode))"
2144 [(set (reg:PSI 179) (const_int 1))
2145 (parallel [(set (match_dup 0) (match_dup 1))
2147 (clobber (reg:PSI 179))])]
2150 ;; TImode moves are very similar to DImode moves, except that we can't
2153 [(set (match_operand:TI 0 "out_operand" "=?r,r,m")
2154 (match_operand:TI 1 "in_operand" "r,m,r"))
2155 (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
2156 "(gpc_reg_operand (operands[0], TImode)
2157 || gpc_reg_operand (operands[1], TImode))"
2160 mtsrim cr,3\;loadm 0,0,%0,%1
2161 mtsrim cr,3\;storem 0,0,%1,%0"
2162 [(set_attr "type" "multi,multi,multi")])
2165 [(set (match_operand:TI 0 "gpc_reg_operand" "")
2166 (match_operand:TI 1 "gpc_reg_operand" ""))
2167 (clobber (match_scratch:PSI 2 ""))]
2169 [(set (match_dup 3) (match_dup 4))
2170 (set (match_dup 5) (match_dup 6))
2171 (set (match_dup 7) (match_dup 8))
2172 (set (match_dup 9) (match_dup 10))]
2175 if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
2176 && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
2178 operands[3] = gen_rtx_REG (SImode, REGNO (operands[0]) + 3);
2179 operands[4] = gen_rtx_REG (SImode, REGNO (operands[1]) + 3);
2180 operands[5] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
2181 operands[6] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
2182 operands[7] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2183 operands[8] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2184 operands[9] = gen_rtx_REG (SImode, REGNO (operands[0]));
2185 operands[10] = gen_rtx_REG (SImode, REGNO (operands[1]));
2189 operands[3] = gen_rtx_REG (SImode, REGNO (operands[0]));
2190 operands[4] = gen_rtx_REG (SImode, REGNO (operands[1]));
2191 operands[5] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2192 operands[6] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2193 operands[7] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
2194 operands[8] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
2195 operands[9] = gen_rtx_REG (SImode, REGNO (operands[0]) + 3);
2196 operands[10] = gen_rtx_REG (SImode, REGNO (operands[1]) + 3);
2201 [(set (match_operand:TI 0 "out_operand" "")
2202 (match_operand:TI 1 "in_operand" ""))
2203 (clobber (reg:PSI 179))]
2204 "TARGET_NO_STOREM_BUG
2205 && (memory_operand (operands[0], TImode)
2206 || memory_operand (operands[1], TImode))"
2207 [(set (reg:PSI 179) (const_int 3))
2208 (parallel [(set (match_dup 0) (match_dup 1))
2210 (clobber (reg:PSI 179))])]
2214 [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
2215 (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
2216 "(gpc_reg_operand (operands[0], SImode)
2217 || gpc_reg_operand (operands[1], SImode)
2218 || (spec_reg_operand (operands[0], SImode)
2219 && cint_16_operand (operands[1], SImode)))
2232 [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
2235 [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
2236 (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
2237 "(gpc_reg_operand (operands[0], SImode)
2238 || gpc_reg_operand (operands[1], SImode)
2239 || (spec_reg_operand (operands[0], SImode)
2240 && cint_16_operand (operands[1], SImode)))
2253 [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
2256 [(set (match_operand:PSI 0 "out_operand" "=*r,*r,*r,*r,m,h,h")
2257 (match_operand:PSI 1 "in_operand" "r,i,m,h,r,r,J"))]
2258 "(gpc_reg_operand (operands[0], PSImode)
2259 || gpc_reg_operand (operands[1], PSImode)
2260 || (spec_reg_operand (operands[0], PSImode)
2261 && cint_16_operand (operands[1], PSImode)))"
2270 [(set_attr "type" "misc,multi,load,misc,store,misc,misc")])
2273 [(set (match_operand:HI 0 "out_operand" "=r,r,r,m,r,*h,*h")
2274 (match_operand:HI 1 "in_operand" "r,i,m,r,*h,r,i"))]
2275 "gpc_reg_operand (operands[0], HImode)
2276 || gpc_reg_operand (operands[1], HImode)
2277 || (spec_reg_operand (operands[0], HImode)
2278 && cint_16_operand (operands[1], HImode))"
2287 [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
2290 [(set (match_operand:QI 0 "out_operand" "=r,r,r,m,r,*h,*h")
2291 (match_operand:QI 1 "in_operand" "r,i,m,r,*h,r,i"))]
2292 "gpc_reg_operand (operands[0], QImode)
2293 || gpc_reg_operand (operands[1], QImode)
2294 || (spec_reg_operand (operands[0], HImode)
2295 && cint_16_operand (operands[1], HImode))"
2304 [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
2306 ;; Define move insns for DI, TI, SF, and DF.
2308 ;; In no case do we support mem->mem directly.
2310 ;; For DI move of constant to register, split apart at this time since these
2311 ;; can require anywhere from 2 to 4 insns and determining which is complex.
2313 ;; In other cases, handle similarly to SImode moves.
2315 ;; However, indicate that DI, TI, and DF moves may clobber CR (reg 179).
2316 (define_expand "movdi"
2317 [(parallel [(set (match_operand:DI 0 "general_operand" "")
2318 (match_operand:DI 1 "general_operand" ""))
2319 (clobber (scratch:PSI))])]
2323 if (GET_CODE (operands[0]) == MEM)
2324 operands[1] = force_reg (DImode, operands[1]);
2327 (define_expand "movsf"
2328 [(set (match_operand:SF 0 "general_operand" "")
2329 (match_operand:SF 1 "general_operand" ""))]
2332 { if (GET_CODE (operands[0]) == MEM)
2333 operands[1] = force_reg (SFmode, operands[1]);
2336 (define_expand "movdf"
2337 [(parallel [(set (match_operand:DF 0 "general_operand" "")
2338 (match_operand:DF 1 "general_operand" ""))
2339 (clobber (scratch:PSI))])]
2342 { if (GET_CODE (operands[0]) == MEM)
2343 operands[1] = force_reg (DFmode, operands[1]);
2346 (define_expand "movti"
2347 [(parallel [(set (match_operand:TI 0 "general_operand" "")
2348 (match_operand:TI 1 "general_operand" ""))
2349 (clobber (scratch:PSI))])]
2353 if (GET_CODE (operands[0]) == MEM)
2354 operands[1] = force_reg (TImode, operands[1]);
2356 /* We can't handle constants in general because there is no rtl to represent
2357 128 bit constants. Splitting happens to work for CONST_INTs so we split
2358 them for good code. Other constants will get forced to memory. */
2360 if (GET_CODE (operands[1]) == CONST_INT)
2362 rtx part0, part1, part2, part3;
2364 part0 = operand_subword (operands[0], 0, 1, TImode);
2365 part1 = operand_subword (operands[0], 1, 1, TImode);
2366 part2 = operand_subword (operands[0], 2, 1, TImode);
2367 part3 = operand_subword (operands[0], 3, 1, TImode);
2369 emit_move_insn (part0, const0_rtx);
2370 emit_move_insn (part1, const0_rtx);
2371 emit_move_insn (part2, const0_rtx);
2372 emit_move_insn (part3, const0_rtx);
2376 else if (CONSTANT_P (operands[1]))
2378 operands[1] = force_const_mem (TImode, operands[1]);
2379 if (! memory_address_p (TImode, XEXP (operands[1], 0))
2380 && ! reload_in_progress)
2381 operands[1] = adjust_address (operands[1], TImode, 0);
2385 ;; Here are the variants of the above for use during reload.
2387 (define_expand "reload_indf"
2388 [(parallel [(set (match_operand:DF 0 "register_operand" "=r")
2389 (match_operand:DF 1 "reload_memory_operand" "m"))
2390 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2394 (define_expand "reload_outdf"
2395 [(parallel [(set (match_operand:DF 0 "reload_memory_operand" "=m")
2396 (match_operand:DF 1 "register_operand" "r"))
2397 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2401 (define_expand "reload_indi"
2402 [(parallel [(set (match_operand:DI 0 "register_operand" "=r")
2403 (match_operand:DI 1 "reload_memory_operand" "m"))
2404 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2408 (define_expand "reload_outdi"
2409 [(parallel [(set (match_operand:DI 0 "reload_memory_operand" "=m")
2410 (match_operand:DI 1 "register_operand" "r"))
2411 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2415 (define_expand "reload_inti"
2416 [(parallel [(set (match_operand:TI 0 "register_operand" "=r")
2417 (match_operand:TI 1 "reload_memory_operand" "m"))
2418 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2422 (define_expand "reload_outti"
2423 [(parallel [(set (match_operand:TI 0 "reload_memory_operand" "=m")
2424 (match_operand:TI 1 "register_operand" "r"))
2425 (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2429 ;; For compare operations, we simply store the comparison operands and
2430 ;; do nothing else. The following branch or scc insn will output whatever
2432 (define_expand "cmpsi"
2434 (compare (match_operand:SI 0 "gpc_reg_operand" "")
2435 (match_operand:SI 1 "srcb_operand" "")))]
2439 a29k_compare_op0 = operands[0];
2440 a29k_compare_op1 = operands[1];
2441 a29k_compare_fp_p = 0;
2445 (define_expand "cmpsf"
2447 (compare (match_operand:SF 0 "gpc_reg_operand" "")
2448 (match_operand:SF 1 "gpc_reg_operand" "")))]
2449 "! TARGET_SOFT_FLOAT"
2452 a29k_compare_op0 = operands[0];
2453 a29k_compare_op1 = operands[1];
2454 a29k_compare_fp_p = 1;
2458 (define_expand "cmpdf"
2460 (compare (match_operand:DF 0 "gpc_reg_operand" "")
2461 (match_operand:DF 1 "gpc_reg_operand" "")))]
2462 "! TARGET_SOFT_FLOAT"
2465 a29k_compare_op0 = operands[0];
2466 a29k_compare_op1 = operands[1];
2467 a29k_compare_fp_p = 1;
2471 ;; We can generate bit-tests better if we use NE instead of EQ, but we
2472 ;; don't have an NE for floating-point. So we have to have two patterns
2473 ;; for EQ and two for NE.
2475 (define_expand "beq"
2476 [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
2478 (if_then_else (ge (match_dup 1) (const_int 0))
2479 (label_ref (match_operand 0 "" ""))
2484 if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
2486 emit_insn (gen_beq_fp (operands[0]));
2490 operands[1] = gen_reg_rtx (SImode);
2491 operands[2] = a29k_compare_op0;
2492 operands[3] = a29k_compare_op1;
2495 (define_expand "beq_fp"
2496 [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
2498 (if_then_else (lt (match_dup 1) (const_int 0))
2499 (label_ref (match_operand 0 "" ""))
2504 operands[1] = gen_reg_rtx (SImode);
2505 operands[2] = a29k_compare_op0;
2506 operands[3] = a29k_compare_op1;
2509 (define_expand "bne"
2510 [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
2512 (if_then_else (lt (match_dup 1) (const_int 0))
2513 (label_ref (match_operand 0 "" ""))
2518 if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
2520 emit_insn (gen_bne_fp (operands[0]));
2524 operands[1] = gen_reg_rtx (SImode);
2525 operands[2] = a29k_compare_op0;
2526 operands[3] = a29k_compare_op1;
2529 (define_expand "bne_fp"
2530 [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
2532 (if_then_else (ge (match_dup 1) (const_int 0))
2533 (label_ref (match_operand 0 "" ""))
2538 operands[1] = gen_reg_rtx (SImode);
2539 operands[2] = a29k_compare_op0;
2540 operands[3] = a29k_compare_op1;
2543 ;; We don't have a floating-point "lt" insn, so we have to use "gt" in that
2544 ;; case with the operands swapped. The operands must both be registers in
2545 ;; the floating-point case, so we know that swapping them is OK.
2546 (define_expand "blt"
2547 [(set (match_dup 1) (match_dup 2))
2549 (if_then_else (lt (match_dup 1) (const_int 0))
2550 (label_ref (match_operand 0 "" ""))
2555 operands[1] = gen_reg_rtx (SImode);
2556 if (a29k_compare_fp_p)
2557 operands[2] = gen_rtx_GT (SImode, a29k_compare_op1, a29k_compare_op0);
2559 operands[2] = gen_rtx_LT (SImode, a29k_compare_op0, a29k_compare_op1);
2562 ;; Similarly for "le".
2563 (define_expand "ble"
2564 [(set (match_dup 1) (match_dup 2))
2566 (if_then_else (lt (match_dup 1) (const_int 0))
2567 (label_ref (match_operand 0 "" ""))
2572 operands[1] = gen_reg_rtx (SImode);
2573 if (a29k_compare_fp_p)
2574 operands[2] = gen_rtx_GE (SImode, a29k_compare_op1, a29k_compare_op0);
2576 operands[2] = gen_rtx_LE (SImode, a29k_compare_op0, a29k_compare_op1);
2579 (define_expand "bltu"
2580 [(set (match_dup 1) (ltu:SI (match_dup 2) (match_dup 3)))
2582 (if_then_else (lt (match_dup 1) (const_int 0))
2583 (label_ref (match_operand 0 "" ""))
2588 operands[1] = gen_reg_rtx (SImode);
2589 operands[2] = a29k_compare_op0;
2590 operands[3] = a29k_compare_op1;
2593 (define_expand "bleu"
2594 [(set (match_dup 1) (leu:SI (match_dup 2) (match_dup 3)))
2596 (if_then_else (lt (match_dup 1) (const_int 0))
2597 (label_ref (match_operand 0 "" ""))
2602 operands[1] = gen_reg_rtx (SImode);
2603 operands[2] = a29k_compare_op0;
2604 operands[3] = a29k_compare_op1;
2607 (define_expand "bgt"
2608 [(set (match_dup 1) (gt:SI (match_dup 2) (match_dup 3)))
2610 (if_then_else (lt (match_dup 1) (const_int 0))
2611 (label_ref (match_operand 0 "" ""))
2616 operands[1] = gen_reg_rtx (SImode);
2617 operands[2] = a29k_compare_op0;
2618 operands[3] = a29k_compare_op1;
2621 (define_expand "bge"
2622 [(set (match_dup 1) (ge:SI (match_dup 2) (match_dup 3)))
2624 (if_then_else (lt (match_dup 1) (const_int 0))
2625 (label_ref (match_operand 0 "" ""))
2630 operands[1] = gen_reg_rtx (SImode);
2631 operands[2] = a29k_compare_op0;
2632 operands[3] = a29k_compare_op1;
2635 (define_expand "bgtu"
2636 [(set (match_dup 1) (gtu:SI (match_dup 2) (match_dup 3)))
2638 (if_then_else (lt (match_dup 1) (const_int 0))
2639 (label_ref (match_operand 0 "" ""))
2644 operands[1] = gen_reg_rtx (SImode);
2645 operands[2] = a29k_compare_op0;
2646 operands[3] = a29k_compare_op1;
2649 (define_expand "bgeu"
2650 [(set (match_dup 1) (geu:SI (match_dup 2) (match_dup 3)))
2652 (if_then_else (lt (match_dup 1) (const_int 0))
2653 (label_ref (match_operand 0 "" ""))
2658 operands[1] = gen_reg_rtx (SImode);
2659 operands[2] = a29k_compare_op0;
2660 operands[3] = a29k_compare_op1;
2663 (define_expand "seq"
2664 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2665 (eq:SI (match_dup 1) (match_dup 2)))]
2669 operands[1] = a29k_compare_op0;
2670 operands[2] = a29k_compare_op1;
2673 ;; This is the most complicated case, because we don't have a floating-point
2674 ;; "ne" insn. If integer, handle normally. If floating-point, write the
2675 ;; compare and then write an insn to reverse the test.
2676 (define_expand "sne_fp"
2678 (eq:SI (match_operand 1 "gpc_reg_operand" "")
2679 (match_operand 2 "gpc_reg_operand" "")))
2680 (set (match_operand:SI 0 "gpc_reg_operand" "")
2681 (ge:SI (match_dup 3) (const_int 0)))]
2682 "! TARGET_SOFT_FLOAT"
2684 { operands[3] = gen_reg_rtx (SImode);
2687 (define_expand "sne"
2688 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2689 (ne:SI (match_dup 1) (match_dup 2)))]
2693 operands[1] = a29k_compare_op0;
2694 operands[2] = a29k_compare_op1;
2696 if (a29k_compare_fp_p)
2698 emit_insn (gen_sne_fp (operands[0], operands[1], operands[2]));
2703 ;; We don't have a floating-point "lt" insn, so use "gt" and swap the
2704 ;; operands, the same as we do "blt".
2705 (define_expand "slt"
2706 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2711 if (a29k_compare_fp_p)
2712 operands[1] = gen_rtx_GT (SImode, a29k_compare_op1, a29k_compare_op0);
2714 operands[1] = gen_rtx_LT (SImode, a29k_compare_op0, a29k_compare_op1);
2717 ;; Similarly for "le"
2718 (define_expand "sle"
2719 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2724 if (a29k_compare_fp_p)
2725 operands[1] = gen_rtx_GE (SImode, a29k_compare_op1, a29k_compare_op0);
2727 operands[1] = gen_rtx_LE (SImode, a29k_compare_op0, a29k_compare_op1);
2730 (define_expand "sltu"
2731 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2732 (ltu:SI (match_dup 1) (match_dup 2)))]
2736 operands[1] = a29k_compare_op0;
2737 operands[2] = a29k_compare_op1;
2740 (define_expand "sleu"
2741 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2742 (leu:SI (match_dup 1) (match_dup 2)))]
2746 operands[1] = a29k_compare_op0;
2747 operands[2] = a29k_compare_op1;
2750 (define_expand "sgt"
2751 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2752 (gt:SI (match_dup 1) (match_dup 2)))]
2756 operands[1] = a29k_compare_op0;
2757 operands[2] = a29k_compare_op1;
2760 (define_expand "sge"
2761 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2762 (ge:SI (match_dup 1) (match_dup 2)))]
2766 operands[1] = a29k_compare_op0;
2767 operands[2] = a29k_compare_op1;
2770 (define_expand "sgtu"
2771 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2772 (gtu:SI (match_dup 1) (match_dup 2)))]
2776 operands[1] = a29k_compare_op0;
2777 operands[2] = a29k_compare_op1;
2780 (define_expand "sgeu"
2781 [(set (match_operand:SI 0 "gpc_reg_operand" "")
2782 (geu:SI (match_dup 1) (match_dup 2)))]
2786 operands[1] = a29k_compare_op0;
2787 operands[2] = a29k_compare_op1;
2790 ;; Now define the actual jump insns.
2793 (if_then_else (match_operator 0 "branch_operator"
2794 [(match_operand:SI 1 "gpc_reg_operand" "r")
2796 (label_ref (match_operand 2 "" ""))
2800 [(set_attr "type" "branch")])
2804 (if_then_else (match_operator 0 "branch_operator"
2805 [(match_operand:SI 1 "gpc_reg_operand" "r")
2811 [(set_attr "type" "branch")])
2815 (if_then_else (match_operator 0 "branch_operator"
2816 [(match_operand:SI 1 "gpc_reg_operand" "r")
2819 (label_ref (match_operand 2 "" ""))))]
2822 [(set_attr "type" "branch")])
2826 (if_then_else (match_operator 0 "branch_operator"
2827 [(match_operand:SI 1 "gpc_reg_operand" "r")
2833 [(set_attr "type" "branch")])
2837 (label_ref (match_operand 0 "" "")))]
2840 [(set_attr "type" "branch")])
2842 (define_insn "return"
2846 [(set_attr "type" "branch")])
2848 (define_insn "indirect_jump"
2850 (match_operand:SI 0 "gpc_reg_operand" "r"))]
2853 [(set_attr "type" "branch")])
2855 (define_insn "tablejump"
2857 (match_operand:SI 0 "gpc_reg_operand" "r"))
2858 (use (label_ref (match_operand 1 "" "")))]
2861 [(set_attr "type" "branch")])
2866 (if_then_else (ge (match_operand:SI 0 "gpc_reg_operand" "+r")
2868 (label_ref (match_operand 1 "" ""))
2871 (plus:SI (match_dup 0)
2875 [(set_attr "type" "branch")])