OSDN Git Service

8af8a06531d1b2468ba8ba707e3cf495b7eb4440
[pf3gnuchains/gcc-fork.git] / gcc / config / cris / cris.md
1 ;; GCC machine description for CRIS cpu cores.
2 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 ;; 2008, 2009, 2010  Free Software Foundation, Inc.
4 ;; Contributed by Axis Communications.
5
6 ;; This file is part of GCC.
7 ;;
8 ;; GCC 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 3, or (at your option)
11 ;; any later version.
12 ;;
13 ;; GCC 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.
17 ;;
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GCC; see the file COPYING3.  If not see
20 ;; <http://www.gnu.org/licenses/>.
21
22 ;; The original PO technology requires these to be ordered by speed,
23 ;; so that assigner will pick the fastest.
24
25 ;; See files "md.texi" and "rtl.def" for documentation on define_insn,
26 ;; match_*, et. al.
27 ;;
28 ;; The function cris_notice_update_cc in cris.c handles condition code
29 ;; updates for most instructions, helped by the "cc" attribute.
30
31 ;; There are several instructions that are orthogonal in size, and seems
32 ;; they could be matched by a single pattern without a specified size
33 ;; for the operand that is orthogonal.  However, this did not work on
34 ;; gcc-2.7.2 (and probably not on gcc-2.8.1), relating to that when a
35 ;; constant is substituted into an operand, the actual mode must be
36 ;; deduced from the pattern.  There is reasonable hope that that has been
37 ;; fixed, so FIXME: try again.
38
39 ;; You will notice that three-operand alternatives ("=r", "r", "!To")
40 ;; are marked with a "!" constraint modifier to avoid being reloaded
41 ;; into.  This is because gcc would otherwise prefer to use the constant
42 ;; pool and its offsettable address instead of reloading to an
43 ;; ("=r", "0", "i") alternative.  Also, the constant-pool support was not
44 ;; only suboptimal but also buggy in 2.7.2, ??? maybe only in 2.6.3.
45
46 ;; All insns that look like (set (...) (plus (...) (reg:SI 8)))
47 ;; get problems when reloading r8 (frame pointer) to r14 + offs (stack
48 ;; pointer).  Thus the instructions that get into trouble have specific
49 ;; checks against matching frame_pointer_rtx.
50 ;; ??? But it should be re-checked for gcc > 2.7.2
51 ;; FIXME: This changed some time ago (from 2000-03-16) for gcc-2.9x.
52
53 ;; FIXME: When PIC, all [rX=rY+S] could be enabled to match
54 ;; [rX=gotless_symbol].
55 ;; The movsi for a gotless symbol could be split (post reload).
56 \f
57
58 (define_constants
59   [
60    ;; PLT reference from call expansion: operand 0 is the address,
61    ;; the mode is VOIDmode.  Always wrapped in CONST.
62    ;; The value is relative to the GOT.
63    (CRIS_UNSPEC_PLT_GOTREL 0)
64
65    ;; PLT reference from call expansion: operand 0 is the address,
66    ;; the mode is VOIDmode.  Always wrapped in CONST.
67    ;; The value is relative to the PC.  It's arch-dependent whether
68    ;; the offset counts from the start or the end of the current item.
69    (CRIS_UNSPEC_PLT_PCREL 1)
70
71    ;; The address of the global offset table as a source operand.
72    (CRIS_UNSPEC_GOT 2)
73
74    ;; The offset from the global offset table to the operand.
75    (CRIS_UNSPEC_GOTREL 3)
76
77    ;; The PC-relative offset to the operand.  It's arch-dependent whether
78    ;; the offset counts from the start or the end of the current item.
79    (CRIS_UNSPEC_PCREL 4)
80
81    ;; The index into the global offset table of a symbol, while
82    ;; also generating a GOT entry for the symbol.
83    (CRIS_UNSPEC_GOTREAD 5)
84
85    ;; Similar to CRIS_UNSPEC_GOTREAD, but also generating a PLT entry.
86    (CRIS_UNSPEC_PLTGOTREAD 6)
87
88    ;; Condition for v32 casesi jump, since it needs to have if_then_else
89    ;; form with register as one branch and default label as other.
90    ;; Operand 0 is const_int 0.
91    (CRIS_UNSPEC_CASESI 7)
92
93    ;; Stack frame deallocation barrier.
94    (CRIS_UNSPEC_FRAME_DEALLOC 8)
95
96    ;; Swap all 32 bits of the operand; 31 <=> 0, 30 <=> 1...
97    (CRIS_UNSPEC_SWAP_BITS 9)
98   ])
99
100 ;; Register numbers.
101 (define_constants
102   [(CRIS_GOT_REGNUM 0)
103    (CRIS_STATIC_CHAIN_REGNUM 7)
104    (CRIS_FP_REGNUM 8)
105    (CRIS_SP_REGNUM 14)
106    (CRIS_ACR_REGNUM 15)
107    (CRIS_SRP_REGNUM 16)
108    (CRIS_MOF_REGNUM 17)
109    (CRIS_AP_REGNUM 18)
110    (CRIS_CC0_REGNUM 19)]
111 )
112
113 ;; We need an attribute to define whether an instruction can be put in
114 ;; a branch-delay slot or not, and whether it has a delay slot.
115 ;;
116 ;; Branches and return instructions have a delay slot, and cannot
117 ;; themselves be put in a delay slot.  This has changed *for short
118 ;; branches only* between architecture variants, but the possible win
119 ;; is presumed negligible compared to the added complexity of the machine
120 ;; description: one would have to add always-correct infrastructure to
121 ;; distinguish short branches.
122 ;;
123 ;; Whether an instruction can be put in a delay slot depends on the
124 ;; instruction (all short instructions except jumps and branches)
125 ;; and the addressing mode (must not be prefixed or referring to pc).
126 ;; In short, any "slottable" instruction must be 16 bit and not refer
127 ;; to pc, or alter it.
128 ;;
129 ;; The possible values are "yes", "no", "has_slot", "has_return_slot"
130 ;; and "has_call_slot".
131 ;; Yes/no tells whether the insn is slottable or not.  Has_call_slot means
132 ;; that the insn is a call insn, which for CRIS v32 has a delay-slot.
133 ;; Of special concern is that no RTX_FRAME_RELATED insn must go in that
134 ;; call delay slot, as it's located in the address *after* the call insn,
135 ;; and the unwind machinery doesn't know about delay slots.
136 ;; Has_slot means that the insn is a branch insn (which are
137 ;; not considered slottable since that is generally true).  Having the
138 ;; seemingly illogical value "has_slot" means we do not have to add
139 ;; another attribute just to say that an insn has a delay-slot, since it
140 ;; also infers that it is not slottable.  Better names for the attribute
141 ;; were found to be longer and not add readability to the machine
142 ;; description.
143 ;; Has_return_slot is similar, for the return insn.
144 ;;
145 ;; The default that is defined here for this attribute is "no", not
146 ;; slottable, not having a delay-slot, so there's no need to worry about
147 ;; it being wrong for non-branch and return instructions.
148 ;;  The default could depend on the kind of insn and the addressing
149 ;; mode, but that would need more attributes and hairier, more error
150 ;; prone code.
151 ;;
152 ;;  There is an extra memory constraint, 'Q', which recognizes an indirect
153 ;; register.  The constraints 'Q' and '>' together match all possible
154 ;; memory operands that are slottable.
155 ;;  For other operands, you need to check if it has a valid "slottable"
156 ;; quick-immediate operand, where the particular signedness-variation
157 ;; may match the constraints 'I' or 'J'.), and include it in the
158 ;; constraint pattern for the slottable pattern.  An alternative using
159 ;; only "r" constraints is most often slottable.
160
161 (define_attr "slottable" "no,yes,has_slot,has_return_slot,has_call_slot"
162   (const_string "no"))
163
164 ;; We also need attributes to sanely determine the condition code
165 ;; state.  See cris_notice_update_cc for how this is used.
166
167 (define_attr "cc" "none,clobber,normal,noov32,rev" (const_string "normal"))
168
169 ;; At the moment, this attribute is just used to help bb-reorder do its
170 ;; work; the default 0 doesn't help it.  Many insns have other lengths,
171 ;; though none are shorter.
172 (define_attr "length" "" (const_int 2))
173
174 ;; A branch has one delay-slot.  The instruction in the
175 ;; delay-slot is always executed, independent of whether the branch is
176 ;; taken or not.  Note that besides setting "slottable" to "has_slot",
177 ;; there also has to be a "%#" at the end of a "delayed" instruction
178 ;; output pattern (for "jump" this means "ba %l0%#"), so print_operand can
179 ;; catch it and print a "nop" if necessary.  This method was stolen from
180 ;; sparc.md.
181
182 (define_delay (eq_attr "slottable" "has_slot")
183   [(eq_attr "slottable" "yes") (nil) (nil)])
184
185 ;; We can't put prologue insns in call-insn delay-slots when
186 ;; DWARF2 unwind info is emitted, because the unwinder matches the
187 ;; address after the insn.  It must see the return address of a call at
188 ;; a position at least *one byte after* the insn, or it'll think that
189 ;; the insn hasn't been executed.  If the insn is in a delay-slot of a
190 ;; call, it's just *exactly* after the insn.
191
192 (define_delay (eq_attr "slottable" "has_call_slot")
193   [(and (eq_attr "slottable" "yes")
194         (ior (eq (symbol_ref "RTX_FRAME_RELATED_P (insn)")
195                  (const_int 0))
196              (eq (symbol_ref "flag_exceptions")
197                  (const_int 0))))
198    (nil) (nil)])
199
200 ;; The insn in the return insn slot must not be the
201 ;; return-address-register restore.  FIXME: Use has_slot and express
202 ;; as a parallel with a use of the return-address-register (currently
203 ;; only SRP).  However, this requires an amount of fixing tests for
204 ;; naked RETURN in middle-end.
205 (define_delay (eq_attr "slottable" "has_return_slot")
206   [(and (eq_attr "slottable" "yes")
207         (eq (symbol_ref "dead_or_set_regno_p (insn, CRIS_SRP_REGNUM)")
208             (const_int 0)))
209    (nil) (nil)])
210
211 \f
212 ;; Iterator definitions.
213
214 ;; For the "usual" pattern size alternatives.
215 (define_mode_iterator BWD [SI HI QI])
216 (define_mode_iterator WD [SI HI])
217 (define_mode_iterator BW [HI QI])
218 (define_mode_attr S [(SI "HI") (HI "QI")])
219 (define_mode_attr s [(SI "hi") (HI "qi")])
220 (define_mode_attr m [(SI ".d") (HI ".w") (QI ".b")])
221 (define_mode_attr mm [(SI ".w") (HI ".b")])
222 (define_mode_attr nbitsm1 [(SI "31") (HI "15") (QI "7")])
223
224 ;; For the sign_extend+zero_extend variants.
225 (define_code_iterator szext [sign_extend zero_extend])
226 (define_code_attr u [(sign_extend "") (zero_extend "u")])
227 (define_code_attr su [(sign_extend "s") (zero_extend "u")])
228
229 ;; For the shift variants.
230 (define_code_iterator shift [ashiftrt lshiftrt ashift])
231 (define_code_iterator shiftrt [ashiftrt lshiftrt])
232 (define_code_attr shlr [(ashiftrt "ashr") (lshiftrt "lshr") (ashift "ashl")])
233 (define_code_attr slr [(ashiftrt "asr") (lshiftrt "lsr") (ashift "lsl")])
234
235 (define_code_iterator ncond [eq ne gtu ltu geu leu])
236 (define_code_iterator ocond [gt le])
237 (define_code_iterator rcond [lt ge])
238 (define_code_attr CC [(eq "eq") (ne "ne") (gt "gt") (gtu "hi") (lt "lt")
239                       (ltu "lo") (ge "ge") (geu "hs") (le "le") (leu "ls")])
240 (define_code_attr rCC [(eq "ne") (ne "eq") (gt "le") (gtu "ls") (lt "ge")
241                        (ltu "hs") (ge "lt") (geu "lo") (le "gt") (leu "hi")])
242 (define_code_attr oCC [(lt "mi") (ge "pl")])
243 (define_code_attr roCC [(lt "pl") (ge "mi")])
244
245 ;; Operand and operator predicates.
246
247 (include "predicates.md")
248 \f
249 ;; Test insns.
250
251 ;; No test insns with side-effect on the mem addressing.
252 ;;
253 ;; See note on cmp-insns with side-effects (or lack of them)
254
255 ;; Normal named test patterns from SI on.
256
257 (define_insn "*tstsi"
258   [(set (cc0)
259         (compare (match_operand:SI 0 "nonimmediate_operand" "r,Q>,m")
260                  (const_int 0)))]
261   ""
262 {
263   if (which_alternative == 0 && TARGET_V32)
264     return "cmpq 0,%0";
265   return "test.d %0";
266 }
267   [(set_attr "slottable" "yes,yes,no")])
268
269 (define_insn "*tst<mode>_cmp"
270   [(set (cc0)
271         (compare (match_operand:BW 0 "nonimmediate_operand" "r,Q>,m")
272                  (const_int 0)))]
273   "cris_cc0_user_requires_cmp (insn)"
274   "@
275    cmp<m> 0,%0
276    test<m> %0
277    test<m> %0"
278   [(set_attr "slottable" "no,yes,no")])
279
280 (define_insn "*tst<mode>_non_cmp"
281   [(set (cc0)
282         (compare (match_operand:BW 0 "nonimmediate_operand" "r,Q>,m")
283                  (const_int 0)))]
284   "!cris_cc0_user_requires_cmp (insn)"
285   "@
286    move<m> %0,%0
287    test<m> %0
288    test<m> %0"
289   [(set_attr "slottable" "yes,yes,no")
290    (set_attr "cc" "noov32,*,*")])
291
292 ;; It seems that the position of the sign-bit and the fact that 0.0 is
293 ;; all 0-bits would make "tstsf" a straight-forward implementation;
294 ;; either "test.d" it for positive/negative or "btstq 30,r" it for
295 ;; zeroness.
296 ;;
297 ;; FIXME: Do that some time; check next_cc0_user to determine if
298 ;; zero or negative is tested for.
299 \f
300 ;; Compare insns.
301
302 ;; We could optimize the sizes of the immediate operands for various
303 ;; cases, but that is not worth it because of the very little usage of
304 ;; DImode for anything else but a structure/block-mode.  Just do the
305 ;; obvious stuff for the straight-forward constraint letters.
306
307 (define_insn "*cmpdi_non_v32"
308   [(set (cc0)
309         (compare (match_operand:DI 0 "nonimmediate_operand" "rm,r,r,r,r,r,r,o")
310                  (match_operand:DI 1 "general_operand" "M,Kc,I,P,n,r,o,r")))]
311   "!TARGET_V32"
312   "@
313    test.d %M0\;ax\;test.d %H0
314    cmpq %1,%M0\;ax\;cmpq 0,%H0
315    cmpq %1,%M0\;ax\;cmpq -1,%H0
316    cmp%e1.%z1 %1,%M0\;ax\;cmpq %H1,%H0
317    cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0
318    cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0
319    cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0
320    cmp.d %M0,%M1\;ax\;cmp.d %H0,%H1")
321
322 (define_insn "*cmpdi_v32"
323   [(set (cc0)
324         (compare (match_operand:DI 0 "register_operand"  "r,r,r,r,r")
325                  (match_operand:DI 1 "nonmemory_operand" "Kc,I,P,n,r")))]
326   "TARGET_V32"
327   "@
328    cmpq %1,%M0\;ax\;cmpq 0,%H0
329    cmpq %1,%M0\;ax\;cmpq -1,%H0
330    cmp%e1.%z1 %1,%M0\;ax\;cmpq %H1,%H0
331    cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0
332    cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0")
333
334 ;; Note that compare insns with side effect addressing mode (e.g.):
335 ;;
336 ;; cmp.S [rx=ry+i],rz;
337 ;; cmp.S [%3=%1+%2],%0
338 ;;
339 ;; are *not* usable for gcc since the reloader *does not accept*
340 ;; cc0-changing insns with side-effects other than setting the condition
341 ;; codes.  The reason is that the reload stage *may* cause another insn to
342 ;; be output after the main instruction, in turn invalidating cc0 for the
343 ;; insn using the test.  (This does not apply to the CRIS case, since a
344 ;; reload for output -- move to memory -- does not change the condition
345 ;; code.  Unfortunately we have no way to describe that at the moment.  I
346 ;; think code would improve being in the order of one percent faster.
347 \f
348 ;; We have cmps and cmpu (compare reg w. sign/zero extended mem).
349 ;; These are mostly useful for compares in SImode, using 8 or 16-bit
350 ;; constants, but sometimes gcc will find its way to use it for other
351 ;; (memory) operands.  Avoid side-effect patterns, though (see above).
352
353 (define_insn "*cmp_ext<mode>"
354   [(set (cc0)
355         (compare
356          (match_operand:SI 0 "register_operand" "r,r")
357          (match_operator:SI 2 "cris_extend_operator"
358                          [(match_operand:BW 1 "memory_operand" "Q>,m")])))]
359   ""
360   "cmp%e2<m> %1,%0"
361   [(set_attr "slottable" "yes,no")])
362
363 ;; Swap operands; it seems the canonical look (if any) is not enforced.
364 ;;
365 ;; FIXME: Investigate that.
366
367 (define_insn "*cmp_swapext<mode>"
368   [(set (cc0)
369         (compare
370          (match_operator:SI 2 "cris_extend_operator"
371                             [(match_operand:BW 0 "memory_operand" "Q>,m")])
372          (match_operand:SI 1 "register_operand" "r,r")))]
373   ""
374   "cmp%e2<m> %0,%1"
375   [(set_attr "slottable" "yes,no")
376    (set_attr "cc" "rev")])
377 \f
378 ;; The "normal" compare patterns, from SI on.  Special-cases with zero
379 ;; are covered above.
380
381 (define_insn "*cmpsi"
382   [(set (cc0)
383         (compare
384          (match_operand:SI 0 "nonimmediate_operand" "r,r,r, Q>,r,r,m")
385          (match_operand:SI 1 "general_operand"      "I,r,Q>,r, P,g,r")))]
386   ""
387   "@
388    cmpq %1,%0
389    cmp.d %1,%0
390    cmp.d %1,%0
391    cmp.d %0,%1
392    cmp%e1.%z1 %1,%0
393    cmp.d %1,%0
394    cmp.d %0,%1"
395   [(set_attr "slottable" "yes,yes,yes,yes,no,no,no")
396    (set_attr "cc" "normal,normal,normal,rev,normal,normal,rev")])
397
398 (define_insn "*cmp<mode>"
399   [(set (cc0)
400         (compare (match_operand:BW 0 "nonimmediate_operand" "r,r, Q>,r,m")
401                  (match_operand:BW 1 "general_operand"      "r,Q>,r, g,r")))]
402   ""
403   "@
404    cmp<m> %1,%0
405    cmp<m> %1,%0
406    cmp<m> %0,%1
407    cmp<m> %1,%0
408    cmp<m> %0,%1"
409   [(set_attr "slottable" "yes,yes,yes,no,no")
410    (set_attr "cc" "normal,normal,rev,normal,rev")])
411 \f
412 ;; Pattern matching the BTST insn.
413 ;; It is useful for "if (i & val)" constructs, where val is an exact
414 ;; power of 2, or if val + 1 is a power of two, where we check for a bunch
415 ;; of zeros starting at bit 0).
416
417 ;; SImode.  This mode is the only one needed, since gcc automatically
418 ;; extends subregs for lower-size modes.  FIXME: Add testcase.
419 (define_insn "*btst"
420   [(set (cc0)
421         (compare
422          (zero_extract:SI
423           (match_operand:SI 0 "nonmemory_operand" "r, r,r, r,r, r,Kp")
424           (match_operand:SI 1 "const_int_operand" "Kc,n,Kc,n,Kc,n,n")
425           (match_operand:SI 2 "nonmemory_operand" "M, M,Kc,n,r, r,r"))
426          (const_int 0)))]
427   ;; Either it is a single bit, or consecutive ones starting at 0.
428   ;; The btst ones depend on stuff in NOTICE_UPDATE_CC.
429   "CONST_INT_P (operands[1])
430    && (operands[1] == const1_rtx || operands[2] == const0_rtx)
431    && (REG_S_P (operands[0])
432        || (operands[1] == const1_rtx
433            && REG_S_P (operands[2])
434            && CONST_INT_P (operands[0])
435            && exact_log2 (INTVAL (operands[0])) >= 0))
436    && !TARGET_CCINIT"
437
438 ;; The next-to-last "&&" condition above should be caught by some kind of
439 ;; canonicalization in gcc, but we can easily help with it here.
440 ;;  It results from expressions of the type
441 ;; "power_of_2_value & (1 << y)".
442 ;;
443 ;; Since there may be codes with tests in on bits (in constant position)
444 ;; beyond the size of a word, handle that by assuming those bits are 0.
445 ;; GCC should handle that, but it's a matter of easily-added belts while
446 ;; having suspenders.
447
448   "@
449    btstq (%1-1),%0
450    cmpq 0,%0
451    btstq %2,%0
452    clearf nz
453    btst %2,%0
454    clearf nz
455    cmpq %p0,%2"
456  [(set_attr "slottable" "yes")
457   (set_attr "cc" "noov32")])
458 \f
459 ;; Move insns.
460
461 ;; The whole mandatory movdi family is here; expander, "anonymous"
462 ;; recognizer and splitter.  We're forced to have a movdi pattern,
463 ;; although GCC should be able to split it up itself.  Normally it can,
464 ;; but if other insns have DI operands (as is the case here), reload
465 ;; must be able to generate or match a movdi.  many testcases fail at
466 ;; -O3 or -fssa if we don't have this.  FIXME: Fix GCC...  See
467 ;; <URL:http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00104.html>.
468 ;; However, a patch from Richard Kenner (similar to the cause of
469 ;; discussion at the URL above), indicates otherwise.  See
470 ;; <URL:http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00554.html>.
471 ;; The truth has IMO is not been decided yet, so check from time to
472 ;; time by disabling the movdi patterns.
473
474 ;; To appease testcase gcc.c-torture/execute/920501-2.c (and others) at
475 ;; -O0, we need a movdi as a temporary measure.  Here's how things fail:
476 ;;  A cmpdi RTX needs reloading (global):
477 ;;    (insn 185 326 186 (set (cc0)
478 ;;          (compare (mem/f:DI (reg/v:SI 22) 0)
479 ;;              (const_int 1 [0x1]))) 4 {cmpdi} (nil)
480 ;;      (nil))
481 ;; Now, reg 22 is reloaded for input address, and the mem is also moved
482 ;; out of the instruction (into a register), since one of the operands
483 ;; must be a register.  Reg 22 is reloaded (into reg 10), and the mem is
484 ;; moved out and synthesized in SImode parts (reg 9, reg 10 - should be ok
485 ;; wrt. overlap).  The bad things happen with the synthesis in
486 ;; emit_move_insn_1; the location where to substitute reg 10 is lost into
487 ;; two new RTX:es, both still having reg 22.  Later on, the left-over reg
488 ;; 22 is recognized to have an equivalent in memory which is substituted
489 ;; straight in, and we end up with an unrecognizable insn:
490 ;;    (insn 325 324 326 (set (reg:SI 9 r9)
491 ;;            (mem/f:SI (mem:SI (plus:SI (reg:SI 8 r8)
492 ;;                        (const_int -84 [0xffffffac])) 0) 0)) -1 (nil)
493 ;;        (nil))
494 ;; which is the first part of the reloaded synthesized "movdi".
495 ;;  The right thing would be to add equivalent replacement locations for
496 ;; insn with pseudos that need more reloading.  The question is where.
497
498 (define_expand "movdi"
499   [(set (match_operand:DI 0 "nonimmediate_operand" "")
500         (match_operand:DI 1 "general_operand" ""))]
501   ""
502 {
503   if (MEM_P (operands[0])
504       && operands[1] != const0_rtx
505       && (!TARGET_V32 || (!REG_P (operands[1]) && can_create_pseudo_p ())))
506     operands[1] = copy_to_mode_reg (DImode, operands[1]);
507
508   /* Some other ports (as of 2001-09-10 for example mcore and romp) also
509      prefer to split up constants early, like this.  The testcase in
510      gcc.c-torture/execute/961213-1.c shows that CSE2 gets confused by the
511      resulting subreg sets when using the construct from mcore (as of FSF
512      CVS, version -r 1.5), and it believes that the high part (the last one
513      emitted) is the final value.  */
514   if ((CONST_INT_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE)
515       && ! reload_completed
516       && ! reload_in_progress)
517     {
518       rtx insns;
519       rtx op0 = operands[0];
520       rtx op1 = operands[1];
521
522       start_sequence ();
523       emit_move_insn (operand_subword (op0, 0, 1, DImode),
524                       operand_subword (op1, 0, 1, DImode));
525       emit_move_insn (operand_subword (op0, 1, 1, DImode),
526                       operand_subword (op1, 1, 1, DImode));
527       insns = get_insns ();
528       end_sequence ();
529
530       emit_insn (insns);
531       DONE;
532     }
533 })
534
535 (define_insn_and_split "*movdi_insn_non_v32"
536   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rx,m")
537         (match_operand:DI 1 "general_operand"      "rx,g,rxM"))]
538   "(register_operand (operands[0], DImode)
539     || register_operand (operands[1], DImode)
540     || operands[1] == const0_rtx)
541    && !TARGET_V32"
542   "#"
543   "&& reload_completed"
544   [(match_dup 2)]
545   "operands[2] = cris_split_movdx (operands);")
546
547 ;; Overlapping (but non-identical) source memory address and destination
548 ;; register would be a compiler bug, so we don't have to specify that.
549 (define_insn "*movdi_v32"
550   [(set
551     (match_operand:DI 0 "nonimmediate_operand" "=r,rx,&r,>, m,r,x,m")
552     (match_operand:DI 1 "general_operand"     "rxi,r>,m, rx,r,m,m,x"))]
553   "TARGET_V32"
554 {
555   switch (which_alternative)
556     {
557       /* FIXME: 1) Use autoincrement where possible.  2) Have peephole2,
558          particularly for cases where the address register is dead.  */
559     case 5:
560       if (REGNO (operands[0]) == REGNO (XEXP (operands[1], 0)))
561         return "addq 4,%L1\;move.d %1,%H0\;subq 4,%L1\;move.d %1,%M0";
562       gcc_assert (REGNO (operands[0]) + 1 == REGNO (XEXP (operands[1], 0)));
563       return "move.d [%L1+],%M0\;move.d [%L1],%H0";
564     case 2:
565       /* We could do away with the addq if we knew the address-register
566          isn't ACR.  If we knew the address-register is dead, we could do
567          away with the subq too.  */
568       return "move.d [%L1],%M0\;addq 4,%L1\;move.d [%L1],%H0\;subq 4,%L1";
569     case 4:
570       return "move.d %M1,[%L0]\;addq 4,%L0\;move.d %H1,[%L0]\;subq 4,%L0";
571     case 6:
572       return "move [%L1],%M0\;addq 4,%L1\;move [%L1],%H0\;subq 4,%L1";
573     case 7:
574       return "move %M1,[%L0]\;addq 4,%L0\;move %H1,[%L0]\;subq 4,%L0";
575
576     default:
577       return "#";
578     }
579 }
580   ;; The non-split cases clobber cc0 because of their adds and subs.
581   ;; Beware that NOTICE_UPDATE_CC is called before the forced split happens.
582   [(set_attr "cc" "*,*,clobber,*,clobber,clobber,*,*")])
583
584 ;; Much like "*movdi_insn_non_v32".  Overlapping registers and constants
585 ;; is handled so much better in cris_split_movdx.
586 (define_split
587   [(set (match_operand:DI 0 "nonimmediate_operand" "")
588         (match_operand:DI 1 "general_operand" ""))]
589   "TARGET_V32
590    && reload_completed
591    && (!MEM_P (operands[0]) || !REG_P (XEXP (operands[0], 0)))
592    && (!MEM_P (operands[1]) || !REG_P (XEXP (operands[1], 0)))"
593   [(match_dup 2)]
594   "operands[2] = cris_split_movdx (operands);")
595 \f
596 ;; Side-effect patterns for move.S1 [rx=ry+rx.S2],rw
597 ;; and move.S1 [rx=ry+i],rz
598 ;;  Then movs.S1 and movu.S1 for both modes.
599 ;;
600 ;; move.S1 [rx=ry+rz.S],rw avoiding when rx is ry, or rw is rx
601 ;; FIXME: These could have anonymous mode for operand 0.
602 ;; FIXME: Special registers' alternatives too.
603
604 (define_insn "*mov_side<mode>_biap"
605   [(set (match_operand:BW 0 "register_operand" "=r,r")
606         (mem:BW (plus:SI
607                  (mult:SI (match_operand:SI 1 "register_operand" "r,r")
608                           (match_operand:SI 2 "const_int_operand" "n,n"))
609                  (match_operand:SI 3 "register_operand" "r,r"))))
610    (set (match_operand:SI 4 "register_operand" "=*3,r")
611         (plus:SI (mult:SI (match_dup 1)
612                           (match_dup 2))
613                  (match_dup 3)))]
614   "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)"
615   "@
616    #
617    move<m> [%4=%3+%1%T2],%0")
618
619 (define_insn "*mov_sidesisf_biap"
620   [(set (match_operand 0 "register_operand" "=r,r,x,x")
621         (mem (plus:SI
622               (mult:SI (match_operand:SI 1 "register_operand" "r,r,r,r")
623                        (match_operand:SI 2 "const_int_operand" "n,n,n,n"))
624               (match_operand:SI 3 "register_operand" "r,r,r,r"))))
625    (set (match_operand:SI 4 "register_operand" "=*3,r,*3,r")
626         (plus:SI (mult:SI (match_dup 1)
627                           (match_dup 2))
628                  (match_dup 3)))]
629   "GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD
630    && cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)"
631   "@
632    #
633    move.%s0 [%4=%3+%1%T2],%0
634    #
635    move [%4=%3+%1%T2],%0")
636 \f
637 ;; move.S1 [rx=ry+i],rz
638 ;; avoiding move.S1 [ry=ry+i],rz
639 ;; and      move.S1 [rz=ry+i],rz
640 ;; Note that "i" is allowed to be a register.
641
642 (define_insn "*mov_side<mode>"
643   [(set (match_operand:BW 0 "register_operand" "=r,r,r,r,r")
644         (mem:BW
645          (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
646                   (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r"))))
647    (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
648         (plus:SI (match_dup 1)
649                  (match_dup 2)))]
650   "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
651 {
652   if ((which_alternative == 0 || which_alternative == 3)
653       && (!CONST_INT_P (operands[2])
654           || INTVAL (operands[2]) > 127
655           || INTVAL (operands[2]) < -128
656           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
657           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
658     return "#";
659   if (which_alternative == 4)
660     return "move<m> [%3=%2%S1],%0";
661   return "move<m> [%3=%1%S2],%0";
662 })
663
664 (define_insn "*mov_sidesisf"
665   [(set (match_operand 0 "register_operand" "=r,r,r,x,x,x,r,r,x,x")
666         (mem
667          (plus:SI
668           (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,r,r,r,R,R,R,R")
669           (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r>Rn,r,>Rn,r,r,r,r"))))
670    (set (match_operand:SI 3 "register_operand" "=*1,r,r,*1,r,r,*2,r,*2,r")
671         (plus:SI (match_dup 1)
672                  (match_dup 2)))]
673   "GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD
674    && cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
675 {
676   if ((which_alternative == 0
677        || which_alternative == 3
678        || which_alternative == 6
679        || which_alternative == 8)
680       && (!CONST_INT_P (operands[2])
681           || INTVAL (operands[2]) > 127
682           || INTVAL (operands[2]) < -128
683           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
684           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
685     return "#";
686   if (which_alternative < 3)
687     return "move.%s0 [%3=%1%S2],%0";
688   if (which_alternative == 7)
689     return "move.%s0 [%3=%2%S1],%0";
690   if (which_alternative == 9)
691     return "move [%3=%2%S1],%0";
692   return "move [%3=%1%S2],%0";
693 })
694 \f
695 ;; Other way around; move to memory.
696
697 ;; Note that the condition (which for side-effect patterns is usually a
698 ;; call to cris_side_effect_mode_ok), isn't consulted for register
699 ;; allocation preferences -- constraints is the method for that.  The
700 ;; drawback is that we can't exclude register allocation to cause
701 ;; "move.s rw,[rx=ry+rz.S]" when rw==rx without also excluding rx==ry or
702 ;; rx==rz if we use an earlyclobber modifier for the constraint for rx.
703 ;; Instead of that, we recognize and split the cases where dangerous
704 ;; register combinations are spotted: where a register is set in the
705 ;; side-effect, and used in the main insn.  We don't handle the case where
706 ;; the set in the main insn overlaps the set in the side-effect; that case
707 ;; must be handled in gcc.  We handle just the case where the set in the
708 ;; side-effect overlaps the input operand of the main insn (i.e. just
709 ;; moves to memory).
710
711 ;;
712 ;; move.s rz,[ry=rx+rw.S]
713
714 (define_insn "*mov_side<mode>_biap_mem"
715   [(set (mem:BW (plus:SI
716                  (mult:SI (match_operand:SI 0 "register_operand" "r,r,r")
717                           (match_operand:SI 1 "const_int_operand" "n,n,n"))
718                  (match_operand:SI 2 "register_operand" "r,r,r")))
719         (match_operand:BW 3 "register_operand" "r,r,r"))
720    (set (match_operand:SI 4 "register_operand" "=*2,!3,r")
721         (plus:SI (mult:SI (match_dup 0)
722                           (match_dup 1))
723                  (match_dup 2)))]
724   "cris_side_effect_mode_ok (MULT, operands, 4, 2, 0, 1, 3)"
725   "@
726    #
727    #
728    move<m> %3,[%4=%2+%0%T1]")
729
730 (define_insn "*mov_sidesisf_biap_mem"
731   [(set (mem (plus:SI
732               (mult:SI (match_operand:SI 0 "register_operand" "r,r,r,r,r,r")
733                        (match_operand:SI 1 "const_int_operand" "n,n,n,n,n,n"))
734               (match_operand:SI 2 "register_operand" "r,r,r,r,r,r")))
735         (match_operand 3 "register_operand" "r,r,r,x,x,x"))
736    (set (match_operand:SI 4 "register_operand" "=*2,!3,r,*2,!3,r")
737         (plus:SI (mult:SI (match_dup 0)
738                           (match_dup 1))
739                  (match_dup 2)))]
740   "GET_MODE_SIZE (GET_MODE (operands[3])) == UNITS_PER_WORD
741    && cris_side_effect_mode_ok (MULT, operands, 4, 2, 0, 1, 3)"
742   "@
743    #
744    #
745    move.%s3 %3,[%4=%2+%0%T1]
746    #
747    #
748    move %3,[%4=%2+%0%T1]")
749
750 ;; Split for the case above where we're out of luck with register
751 ;; allocation (again, the condition isn't checked for that), and we end up
752 ;; with the set in the side-effect getting the same register as the input
753 ;; register.
754
755 (define_split
756   [(parallel
757     [(set (match_operator
758            6 "cris_mem_op"
759            [(plus:SI
760              (mult:SI (match_operand:SI 0 "register_operand" "")
761                       (match_operand:SI 1 "const_int_operand" ""))
762              (match_operand:SI 2 "register_operand" ""))])
763           (match_operand 3 "register_operand" ""))
764      (set (match_operand:SI 4 "register_operand" "")
765           (plus:SI (mult:SI (match_dup 0)
766                             (match_dup 1))
767                    (match_dup 2)))])]
768   "reload_completed && reg_overlap_mentioned_p (operands[4], operands[3])"
769   [(set (match_dup 5) (match_dup 3))
770    (set (match_dup 4) (match_dup 2))
771    (set (match_dup 4)
772         (plus:SI (mult:SI (match_dup 0)
773                           (match_dup 1))
774                  (match_dup 4)))]
775   "operands[5]
776      = replace_equiv_address (operands[6],
777                               gen_rtx_PLUS (SImode,
778                                             gen_rtx_MULT (SImode,
779                                                           operands[0],
780                                                           operands[1]),
781                                             operands[2]));")
782 \f
783 ;; move.s rx,[ry=rz+i]
784 ;; FIXME: These could have anonymous mode for operand 2.
785
786 ;; QImode
787
788 (define_insn "*mov_side<mode>_mem"
789   [(set (mem:BW
790          (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,r,R,R,R")
791                   (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn,r,r,r")))
792         (match_operand:BW 2 "register_operand" "r,r,r,r,r,r,r"))
793    (set (match_operand:SI 3 "register_operand" "=*0,!*2,r,r,*1,!*2,r")
794         (plus:SI (match_dup 0)
795                  (match_dup 1)))]
796   "cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)"
797 {
798   if ((which_alternative == 0 || which_alternative == 4)
799       && (!CONST_INT_P (operands[1])
800           || INTVAL (operands[1]) > 127
801           || INTVAL (operands[1]) < -128
802           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
803           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
804     return "#";
805   if (which_alternative == 1 || which_alternative == 5)
806     return "#";
807   if (which_alternative == 6)
808     return "move.%s2 %2,[%3=%1%S0]";
809   return "move<m> %2,[%3=%0%S1]";
810 })
811
812 ;; SImode
813
814 (define_insn "*mov_sidesisf_mem"
815   [(set (mem
816          (plus:SI
817           (match_operand:SI
818            0 "cris_bdap_operand"
819                                 "%r,  r,   r,r,  r,   r,r,  R,R,  R,R, R")
820           (match_operand:SI
821            1 "cris_bdap_operand"
822                                 "r>Rn,r>Rn,r,>Rn,r>Rn,r,>Rn,r,r,  r,r, r")))
823         (match_operand 2 "register_operand"
824                                 "r,   r,   r,r,  x,   x,x,  r,r,  r,x, x"))
825    (set (match_operand:SI 3 "register_operand"
826                                 "=*0,!2,   r,r,  *0,  r,r, *1,!*2,r,*1,r")
827         (plus:SI (match_dup 0)
828                  (match_dup 1)))]
829   "GET_MODE_SIZE (GET_MODE (operands[2])) == UNITS_PER_WORD
830    && cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)"
831 {
832   if ((which_alternative == 0 || which_alternative == 4)
833       && (!CONST_INT_P (operands[1])
834           || INTVAL (operands[1]) > 127
835           || INTVAL (operands[1]) < -128
836           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
837           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
838     return "#";
839   if (which_alternative == 1
840       || which_alternative == 7
841       || which_alternative == 8
842       || which_alternative == 10)
843     return "#";
844   if (which_alternative < 4)
845     return "move.%s2 %2,[%3=%0%S1]";
846   if (which_alternative == 9)
847     return "move.%s2 %2,[%3=%1%S0]";
848   if (which_alternative == 11)
849     return "move %2,[%3=%1%S0]";
850   return "move %2,[%3=%0%S1]";
851 })
852
853 ;; Like the biap case, a split where the set in the side-effect gets the
854 ;; same register as the input register to the main insn, since the
855 ;; condition isn't checked at register allocation.
856
857 (define_split
858   [(parallel
859     [(set (match_operator
860            4 "cris_mem_op"
861            [(plus:SI
862              (match_operand:SI 0 "cris_bdap_operand" "")
863              (match_operand:SI 1 "cris_bdap_operand" ""))])
864           (match_operand 2 "register_operand" ""))
865      (set (match_operand:SI 3 "register_operand" "")
866           (plus:SI (match_dup 0) (match_dup 1)))])]
867   "reload_completed && reg_overlap_mentioned_p (operands[3], operands[2])"
868   [(set (match_dup 4) (match_dup 2))
869    (set (match_dup 3) (match_dup 0))
870    (set (match_dup 3) (plus:SI (match_dup 3) (match_dup 1)))]
871   "")
872 \f
873 ;; Clear memory side-effect patterns.  It is hard to get to the mode if
874 ;; the MEM was anonymous, so there will be one for each mode.
875
876 ;;  clear.[bwd] [ry=rx+rw.s2]
877
878 (define_insn "*clear_side<mode>_biap"
879   [(set (mem:BWD (plus:SI
880                   (mult:SI (match_operand:SI 0 "register_operand" "r,r")
881                            (match_operand:SI 1 "const_int_operand" "n,n"))
882                   (match_operand:SI 2 "register_operand" "r,r")))
883         (const_int 0))
884    (set (match_operand:SI 3 "register_operand" "=*2,r")
885         (plus:SI (mult:SI (match_dup 0)
886                           (match_dup 1))
887                  (match_dup 2)))]
888   "cris_side_effect_mode_ok (MULT, operands, 3, 2, 0, 1, -1)"
889   "@
890    #
891    clear<m> [%3=%2+%0%T1]")
892
893 ;; clear.[bwd] [ry=rz+i]
894
895 (define_insn "*clear_side<mode>"
896   [(set (mem:BWD
897          (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,R,R")
898                   (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))
899         (const_int 0))
900    (set (match_operand:SI 2 "register_operand" "=*0,r,r,*1,r")
901         (plus:SI (match_dup 0)
902                  (match_dup 1)))]
903   "cris_side_effect_mode_ok (PLUS, operands, 2, 0, 1, -1, -1)"
904 {
905   if ((which_alternative == 0 || which_alternative == 3)
906       && (!CONST_INT_P (operands[1])
907           || INTVAL (operands[1]) > 127
908           || INTVAL (operands[1]) < -128
909           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
910           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
911     return "#";
912   if (which_alternative == 4)
913     return "clear<m> [%2=%1%S0]";
914   return "clear<m> [%2=%0%S1]";
915 })
916 \f
917 ;; Normal move patterns from SI on.
918
919 (define_expand "movsi"
920   [(set
921     (match_operand:SI 0 "nonimmediate_operand" "")
922     (match_operand:SI 1 "cris_general_operand_or_symbol" ""))]
923   ""
924 {
925   /* If the output goes to a MEM, make sure we have zero or a register as
926      input.  */
927   if (MEM_P (operands[0])
928       && ! REG_S_P (operands[1])
929       && operands[1] != const0_rtx
930       && can_create_pseudo_p ())
931     operands[1] = force_reg (SImode, operands[1]);
932
933   /* If we're generating PIC and have an incoming symbol, validize it to a
934      general operand or something that will match a special pattern.
935
936      FIXME: Do we *have* to recognize anything that would normally be a
937      valid symbol?  Can we exclude global PIC addresses with an added
938      offset?  */
939     if (flag_pic
940         && CONSTANT_ADDRESS_P (operands[1])
941         && !cris_valid_pic_const (operands[1], false))
942       {
943         enum cris_pic_symbol_type t = cris_pic_symbol_type_of (operands[1]);
944
945         gcc_assert (t != cris_no_symbol);
946
947         if (! REG_S_P (operands[0]))
948           {
949             /* We must have a register as destination for what we're about to
950                do, and for the patterns we generate.  */
951             CRIS_ASSERT (can_create_pseudo_p ());
952             operands[1] = force_reg (SImode, operands[1]);
953           }
954         else
955           {
956             /* FIXME: add a REG_EQUAL (or is it REG_EQUIV) note to the
957                destination register for the symbol.  It might not be
958                worth it.  Measure.  */
959             crtl->uses_pic_offset_table = 1;
960             if (t == cris_rel_symbol)
961               {
962                 /* Change a "move.d sym(+offs),rN" into (allocate register rM)
963                    for pre-v32:
964                    "move.d (const (plus (unspec [sym]
965                     CRIS_UNSPEC_GOTREL) offs)),rM" "add.d rPIC,rM,rN"
966                    and for v32:
967                    "move.d (const (plus (unspec [sym]
968                     CRIS_UNSPEC_PCREL) offs)),rN".  */
969                 rtx tem, rm, rn = operands[0];
970                 rtx sym = GET_CODE (operands[1]) != CONST
971                   ? operands[1] : get_related_value (operands[1]);
972                 HOST_WIDE_INT offs = get_integer_term (operands[1]);
973
974                 gcc_assert (can_create_pseudo_p ());
975
976                 if (TARGET_V32)
977                   {
978                     tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, sym),
979                                           CRIS_UNSPEC_PCREL);
980                     if (offs != 0)
981                       tem = plus_constant (tem, offs);
982                     rm = rn;
983                     emit_move_insn (rm, gen_rtx_CONST (Pmode, tem));
984                   }
985                 else
986                   {
987                     /* We still uses GOT-relative addressing for
988                        pre-v32.  */
989                     crtl->uses_pic_offset_table = 1;
990                     tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, sym),
991                                           CRIS_UNSPEC_GOTREL);
992                     if (offs != 0)
993                       tem = plus_constant (tem, offs);
994                     rm = gen_reg_rtx (Pmode);
995                     emit_move_insn (rm, gen_rtx_CONST (Pmode, tem));
996                     if (expand_binop (Pmode, add_optab, rm, pic_offset_table_rtx,
997                                       rn, 0, OPTAB_LIB_WIDEN) != rn)
998                       internal_error ("expand_binop failed in movsi gotrel");
999                   }
1000                 DONE;
1001               }
1002             else if (t == cris_got_symbol)
1003               {
1004                 /* Change a "move.d sym,rN" into (allocate register rM, rO)
1005                    "move.d (const (unspec [sym] CRIS_UNSPEC_GOTREAD)),rM"
1006                    "add.d rPIC,rM,rO", "move.d [rO],rN" with
1007                    the memory access marked as read-only.  */
1008                 rtx tem, mem, rm, ro, rn = operands[0];
1009                 gcc_assert (can_create_pseudo_p ());
1010                 tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, operands[1]),
1011                                       CRIS_UNSPEC_GOTREAD);
1012                 rm = gen_reg_rtx (Pmode);
1013                 emit_move_insn (rm, gen_rtx_CONST (Pmode, tem));
1014                 ro = gen_reg_rtx (Pmode);
1015                 if (expand_binop (Pmode, add_optab, rm, pic_offset_table_rtx,
1016                                   ro, 0, OPTAB_LIB_WIDEN) != ro)
1017                   internal_error ("expand_binop failed in movsi got");
1018                 mem = gen_rtx_MEM (Pmode, ro);
1019
1020                 /* This MEM doesn't alias anything.  Whether it
1021                    aliases other same symbols is unimportant.  */
1022                 set_mem_alias_set (mem, new_alias_set ());
1023                 MEM_NOTRAP_P (mem) = 1;
1024
1025                 /* We can set the GOT memory read of a non-called symbol
1026                    to readonly, but not that of a call symbol, as those
1027                    are subject to lazy evaluation and usually have the value
1028                    changed from the first call to the second (but
1029                    constant thereafter).  */
1030                 MEM_READONLY_P (mem) = 1;
1031                 emit_move_insn (rn, mem);
1032                 DONE;
1033               }
1034             else
1035               {
1036                 /* We get here when we have to change something that would
1037                    be recognizable if it wasn't PIC.  A ``sym'' is ok for
1038                    PIC symbols both with and without a GOT entry.  And ``sym
1039                    + offset'' is ok for local symbols, so the only thing it
1040                    could be, is a global symbol with an offset.  Check and
1041                    abort if not.  */
1042                 rtx reg = gen_reg_rtx (Pmode);
1043                 rtx sym = get_related_value (operands[1]);
1044                 HOST_WIDE_INT offs = get_integer_term (operands[1]);
1045
1046                 gcc_assert (can_create_pseudo_p ()
1047                             && t == cris_got_symbol_needing_fixup
1048                             && sym != NULL_RTX && offs != 0);
1049
1050                 emit_move_insn (reg, sym);
1051                 if (expand_binop (SImode, add_optab, reg,
1052                                   GEN_INT (offs), operands[0], 0,
1053                                   OPTAB_LIB_WIDEN) != operands[0])
1054                   internal_error ("expand_binop failed in movsi got+offs");
1055                 DONE;
1056               }
1057           }
1058       }
1059 })
1060
1061 (define_insn "*movsi_got_load"
1062   [(set (reg:SI CRIS_GOT_REGNUM) (unspec:SI [(const_int 0)] CRIS_UNSPEC_GOT))]
1063   "flag_pic"
1064 {
1065   return TARGET_V32
1066     ? "lapc _GLOBAL_OFFSET_TABLE_,%:"
1067     : "move.d $pc,%:\;sub.d .:GOTOFF,%:";
1068 }
1069   [(set_attr "cc" "clobber")])
1070
1071 (define_insn "*movsi_internal"
1072   [(set
1073     (match_operand:SI 0 "nonimmediate_operand"
1074                       "=r,r, r,Q>,r,Q>,g,r,r, r,g,rQ>,x,  m,x")
1075     (match_operand:SI 1 "cris_general_operand_or_pic_source"
1076                        "r,Q>,M,M, I,r, M,n,!S,g,r,x,  rQ>,x,gi"))]
1077     ;; Note that we prefer not to use the S alternative (if for some reason
1078     ;; it competes with others) above, but g matches S.
1079   ""
1080 {
1081   /* Better to have c-switch here; it is worth it to optimize the size of
1082      move insns.  The alternative would be to try to find more constraint
1083      letters.  FIXME: Check again.  It seems this could shrink a bit.  */
1084   switch (which_alternative)
1085     {
1086     case 9:
1087       if (TARGET_V32)
1088        {
1089          if (!flag_pic
1090              && (GET_CODE (operands[1]) == SYMBOL_REF
1091                  || GET_CODE (operands[1]) == LABEL_REF
1092                  || GET_CODE (operands[1]) == CONST))
1093            {
1094              /* FIXME: Express this through (set_attr cc none) instead,
1095                 since we can't express the ``none'' at this point.  FIXME:
1096                 Use lapc for everything except const_int and when next cc0
1097                 user would want the flag setting.  */
1098              CC_STATUS_INIT;
1099              return "lapc %1,%0";
1100            }
1101          if (flag_pic == 1
1102              && GET_CODE (operands[1]) == CONST
1103              && GET_CODE (XEXP (operands[1], 0)) == UNSPEC
1104              && XINT (XEXP (operands[1], 0), 1) == CRIS_UNSPEC_GOTREAD)
1105            return "movu.w %1,%0";
1106        }
1107        /* FALLTHROUGH */
1108     case 0:
1109     case 1:
1110     case 5:
1111     case 10:
1112       return "move.d %1,%0";
1113
1114     case 11:
1115     case 12:
1116     case 13:
1117     case 14:
1118       return "move %d1,%0";
1119
1120     case 2:
1121     case 3:
1122     case 6:
1123       return "clear.d %0";
1124
1125       /* Constants -32..31 except 0.  */
1126     case 4:
1127       return "moveq %1,%0";
1128
1129       /* We can win a little on constants -32768..-33, 32..65535.  */
1130     case 7:
1131       if (INTVAL (operands[1]) > 0 && INTVAL (operands[1]) < 65536)
1132         {
1133           if (INTVAL (operands[1]) < 256)
1134             return "movu.b %1,%0";
1135           return "movu.w %1,%0";
1136         }
1137       else if (INTVAL (operands[1]) >= -32768 && INTVAL (operands[1]) < 32768)
1138         {
1139           if (INTVAL (operands[1]) >= -128 && INTVAL (operands[1]) < 128)
1140             return "movs.b %1,%0";
1141           return "movs.w %1,%0";
1142         }
1143       return "move.d %1,%0";
1144
1145     case 8:
1146       {
1147         rtx tem = operands[1];
1148         gcc_assert (GET_CODE (tem) == CONST);
1149         tem = XEXP (tem, 0);
1150         if (GET_CODE (tem) == PLUS
1151             && GET_CODE (XEXP (tem, 0)) == UNSPEC
1152             && (XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_GOTREL
1153                 || XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_PCREL)
1154             && CONST_INT_P (XEXP (tem, 1)))
1155           tem = XEXP (tem, 0);
1156         gcc_assert (GET_CODE (tem) == UNSPEC);
1157         switch (XINT (tem, 1))
1158           {
1159           case CRIS_UNSPEC_GOTREAD:
1160           case CRIS_UNSPEC_PLTGOTREAD:
1161             /* Using sign-extend mostly to be consistent with the
1162                indexed addressing mode.  */
1163             if (flag_pic == 1)
1164               return "movs.w %1,%0";
1165             return "move.d %1,%0";
1166
1167           case CRIS_UNSPEC_GOTREL:
1168           case CRIS_UNSPEC_PLT_GOTREL:
1169             gcc_assert (!TARGET_V32);
1170             return "move.d %1,%0";
1171
1172           case CRIS_UNSPEC_PCREL:
1173           case CRIS_UNSPEC_PLT_PCREL:
1174             gcc_assert (TARGET_V32);
1175             return "lapc %1,%0";
1176
1177           default:
1178             gcc_unreachable ();
1179           }
1180       }
1181     default:
1182       return "BOGUS: %1 to %0";
1183     }
1184 }
1185   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,no,no,no,no,yes,yes,no,no")
1186    (set_attr "cc" "*,*,*,*,*,*,*,*,*,*,*,none,none,none,none")])
1187 \f
1188 ;; Extend operations with side-effect from mem to register, using
1189 ;; MOVS/MOVU.  These are from mem to register only.
1190 ;;
1191 ;; [rx=ry+rz.S]
1192 ;;
1193 ;; QImode to HImode
1194 ;;
1195 ;; FIXME: Can we omit extend to HImode, since GCC should truncate for
1196 ;; HImode by itself?  Perhaps use only anonymous modes?
1197
1198 (define_insn "*ext_sideqihi_biap"
1199   [(set (match_operand:HI 0 "register_operand" "=r,r")
1200         (match_operator:HI
1201          5 "cris_extend_operator"
1202          [(mem:QI (plus:SI
1203                    (mult:SI (match_operand:SI 1 "register_operand" "r,r")
1204                             (match_operand:SI 2 "const_int_operand" "n,n"))
1205                    (match_operand:SI 3 "register_operand" "r,r")))]))
1206    (set (match_operand:SI 4 "register_operand" "=*3,r")
1207         (plus:SI (mult:SI (match_dup 1)
1208                           (match_dup 2))
1209                  (match_dup 3)))]
1210   "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)"
1211   "@
1212    #
1213    mov%e5.%m5 [%4=%3+%1%T2],%0")
1214
1215 (define_insn "*ext_side<mode>si_biap"
1216   [(set (match_operand:SI 0 "register_operand" "=r,r")
1217         (match_operator:SI
1218          5 "cris_extend_operator"
1219          [(mem:BW (plus:SI
1220                    (mult:SI (match_operand:SI 1 "register_operand" "r,r")
1221                             (match_operand:SI 2 "const_int_operand" "n,n"))
1222                    (match_operand:SI 3 "register_operand" "r,r")))]))
1223    (set (match_operand:SI 4 "register_operand" "=*3,r")
1224         (plus:SI (mult:SI (match_dup 1)
1225                           (match_dup 2))
1226                  (match_dup 3)))]
1227   "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)"
1228   "@
1229    #
1230    mov%e5<m> [%4=%3+%1%T2],%0")
1231 \f
1232 ;; Same but [rx=ry+i]
1233
1234 ;; QImode to HImode
1235
1236 (define_insn "*ext_sideqihi"
1237   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
1238         (match_operator:HI
1239          4 "cris_extend_operator"
1240          [(mem:QI (plus:SI
1241                    (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
1242                    (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
1243    (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
1244         (plus:SI (match_dup 1)
1245                  (match_dup 2)))]
1246   "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
1247 {
1248   if ((which_alternative == 0 || which_alternative == 3)
1249       && (!CONST_INT_P (operands[2])
1250           || INTVAL (operands[2]) > 127
1251           || INTVAL (operands[2]) < -128
1252           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
1253           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
1254     return "#";
1255   if (which_alternative == 4)
1256     return "mov%e4.%m4 [%3=%2%S1],%0";
1257   return "mov%e4.%m4 [%3=%1%S2],%0";
1258 })
1259
1260 (define_insn "*ext_side<mode>si"
1261   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
1262         (match_operator:SI
1263          4 "cris_extend_operator"
1264          [(mem:BW (plus:SI
1265                    (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
1266                    (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
1267    (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
1268         (plus:SI (match_dup 1)
1269                  (match_dup 2)))]
1270   "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
1271 {
1272   if ((which_alternative == 0 || which_alternative == 3)
1273       && (!CONST_INT_P (operands[2])
1274           || INTVAL (operands[2]) > 127
1275           || INTVAL (operands[2]) < -128
1276           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
1277           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
1278     return "#";
1279   if (which_alternative == 4)
1280     return "mov%e4<m> [%3=%2%S1],%0";
1281   return "mov%e4<m> [%3=%1%S2],%0";
1282 })
1283 \f
1284 ;; FIXME: See movsi.
1285
1286 (define_insn "movhi"
1287   [(set
1288     (match_operand:HI 0 "nonimmediate_operand" "=r,r, r,Q>,r,Q>,r,r,r,g,g,r,r,x")
1289     (match_operand:HI 1 "general_operand"       "r,Q>,M,M, I,r, L,O,n,M,r,g,x,r"))]
1290   ""
1291 {
1292   switch (which_alternative)
1293     {
1294     case 0:
1295     case 1:
1296     case 5:
1297     case 10:
1298     case 11:
1299       return "move.w %1,%0";
1300     case 12:
1301     case 13:
1302       return "move %1,%0";
1303     case 2:
1304     case 3:
1305     case 9:
1306       return "clear.w %0";
1307     case 4:
1308       return "moveq %1,%0";
1309     case 6:
1310     case 8:
1311       if (INTVAL (operands[1]) < 256 && INTVAL (operands[1]) >= -128)
1312         {
1313           if (INTVAL (operands[1]) > 0)
1314             return "movu.b %1,%0";
1315           return "movs.b %1,%0";
1316         }
1317       return "move.w %1,%0";
1318     case 7:
1319       return "movEq %b1,%0";
1320     default:
1321       return "BOGUS: %1 to %0";
1322   }
1323 }
1324   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,yes,no,no,no,no,yes,yes")
1325    (set_attr "cc" "*,*,none,none,*,none,*,clobber,*,none,none,*,none,none")])
1326
1327 (define_insn "movstricthi"
1328   [(set
1329     (strict_low_part
1330      (match_operand:HI 0 "nonimmediate_operand" "+r,r, r,Q>,Q>,g,r,g"))
1331     (match_operand:HI 1 "general_operand"        "r,Q>,M,M, r, M,g,r"))]
1332   ""
1333   "@
1334    move.w %1,%0
1335    move.w %1,%0
1336    clear.w %0
1337    clear.w %0
1338    move.w %1,%0
1339    clear.w %0
1340    move.w %1,%0
1341    move.w %1,%0"
1342   [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no")])
1343
1344 (define_expand "reload_in<mode>"
1345   [(set (match_operand:BW 2 "register_operand" "=r")
1346         (match_operand:BW 1 "memory_operand" "m"))
1347    (set (match_operand:BW 0 "register_operand" "=x")
1348         (match_dup 2))]
1349   ""
1350   "")
1351
1352 (define_expand "reload_out<mode>"
1353   [(set (match_operand:BW 2 "register_operand" "=&r")
1354         (match_operand:BW 1 "register_operand" "x"))
1355    (set (match_operand:BW 0 "memory_operand" "=m")
1356         (match_dup 2))]
1357   ""
1358   "")
1359 \f
1360 (define_insn "movqi"
1361   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,Q>,r, r,Q>,r,g,g,r,r,r,x")
1362         (match_operand:QI 1 "general_operand"       "r,r, Q>,M,M, I,M,r,O,g,x,r"))]
1363   ""
1364   "@
1365    move.b %1,%0
1366    move.b %1,%0
1367    move.b %1,%0
1368    clear.b %0
1369    clear.b %0
1370    moveq %1,%0
1371    clear.b %0
1372    move.b %1,%0
1373    moveq %b1,%0
1374    move.b %1,%0
1375    move %1,%0
1376    move %1,%0"
1377   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,no,yes,no,yes,yes")
1378    (set_attr "cc" "*,*,*,*,*,*,*,*,clobber,*,none,none")])
1379
1380 (define_insn "movstrictqi"
1381   [(set (strict_low_part
1382          (match_operand:QI 0 "nonimmediate_operand" "+r,Q>,r, r,Q>,g,g,r"))
1383         (match_operand:QI 1 "general_operand"        "r,r, Q>,M,M, M,r,g"))]
1384   ""
1385   "@
1386    move.b %1,%0
1387    move.b %1,%0
1388    move.b %1,%0
1389    clear.b %0
1390    clear.b %0
1391    clear.b %0
1392    move.b %1,%0
1393    move.b %1,%0"
1394   [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no")])
1395
1396 ;; The valid "quick" bit-patterns are, except for 0.0, denormalized
1397 ;; values REALLY close to 0, and some NaN:s (I think; their exponent is
1398 ;; all ones); the worthwhile one is "0.0".
1399 ;; It will use clear, so we know ALL types of immediate 0 never change cc.
1400
1401 (define_insn "movsf"
1402   [(set (match_operand:SF 0 "nonimmediate_operand" "=r,Q>,r, r,Q>,g,g,r,r,x,Q>,m,x, x")
1403         (match_operand:SF 1 "general_operand"       "r,r, Q>,G,G, G,r,g,x,r,x, x,Q>,g"))]
1404   ""
1405   "@
1406    move.d %1,%0
1407    move.d %1,%0
1408    move.d %1,%0
1409    clear.d %0
1410    clear.d %0
1411    clear.d %0
1412    move.d %1,%0
1413    move.d %1,%0
1414    move %1,%0
1415    move %1,%0
1416    move %1,%0
1417    move %1,%0
1418    move %1,%0
1419    move %1,%0"
1420   [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no,yes,yes,yes,no,yes,no")])
1421 \f
1422 ;; Movem patterns.  Primarily for use in function prologue and epilogue.
1423 ;; The V32 variants have an ordering matching the expectations of the
1424 ;; standard names "load_multiple" and "store_multiple"; pre-v32 movem
1425 ;; store R0 in the highest memory location.
1426
1427 (define_expand "load_multiple"
1428   [(match_operand:SI 0 "register_operand" "")
1429    (match_operand:SI 1 "memory_operand" "")
1430    (match_operand:SI 2 "const_int_operand" "")]
1431   "TARGET_V32"
1432 {
1433   rtx indreg;
1434
1435   /* Apparently the predicate isn't checked, so we need to do so
1436      manually.  Once happened for libstdc++-v3 locale_facets.tcc.  */
1437   if (!MEM_P (operands[1]))
1438     FAIL;
1439
1440   indreg = XEXP (operands[1], 0);
1441
1442   if (GET_CODE (indreg) == POST_INC)
1443     indreg = XEXP (indreg, 0);
1444   if (!REG_P (indreg)
1445       || GET_CODE (operands[2]) != CONST_INT
1446       || !REG_P (operands[0])
1447       || REGNO (operands[0]) != 0
1448       || INTVAL (operands[2]) > CRIS_SP_REGNUM
1449       || (int) REGNO (indreg) < INTVAL (operands[2]))
1450     FAIL;
1451   gcc_unreachable ();
1452   emit_insn (cris_gen_movem_load (operands[1], operands[2], 0));
1453   DONE;
1454 })
1455
1456 (define_expand "store_multiple"
1457   [(match_operand:SI 0 "memory_operand" "")
1458    (match_operand:SI 1 "register_operand" "")
1459    (match_operand:SI 2 "const_int_operand" "")]
1460   "TARGET_V32"
1461 {
1462   rtx indreg;
1463
1464   /* See load_multiple.  */
1465   if (!MEM_P (operands[0]))
1466     FAIL;
1467
1468   indreg = XEXP (operands[0], 0);
1469
1470   if (GET_CODE (indreg) == POST_INC)
1471     indreg = XEXP (indreg, 0);
1472   if (!REG_P (indreg)
1473       || GET_CODE (operands[2]) != CONST_INT
1474       || !REG_P (operands[1])
1475       || REGNO (operands[1]) != 0
1476       || INTVAL (operands[2]) > CRIS_SP_REGNUM
1477       || (int) REGNO (indreg) < INTVAL (operands[2]))
1478     FAIL;
1479   gcc_unreachable ();
1480   cris_emit_movem_store (operands[0], operands[2], 0, false);
1481   DONE;
1482 })
1483
1484 (define_insn "*cris_load_multiple"
1485   [(match_parallel 0 "cris_load_multiple_op"
1486                    [(set (match_operand:SI 1 "register_operand" "=r,r")
1487                          (match_operand:SI 2 "memory_operand" "Q,m"))])]
1488   ""
1489   "movem %O0,%o0"
1490   [(set_attr "cc" "none")
1491    (set_attr "slottable" "yes,no")
1492    ;; Not true, but setting the length to 0 causes return sequences (ret
1493    ;; movem) to have the cost they had when (return) included the movem
1494    ;; and reduces the performance penalty taken for needing to emit an
1495    ;; epilogue (in turn copied by bb-reorder) instead of return patterns.
1496    ;; FIXME: temporary change until all insn lengths are correctly
1497    ;; described.  FIXME: have better target control over bb-reorder.
1498    (set_attr "length" "0")])
1499
1500 (define_insn "*cris_store_multiple"
1501   [(match_parallel 0 "cris_store_multiple_op"
1502                    [(set (match_operand:SI 2 "memory_operand" "=Q,m")
1503                          (match_operand:SI 1 "register_operand" "r,r"))])]
1504   ""
1505   "movem %o0,%O0"
1506   [(set_attr "cc" "none")
1507    (set_attr "slottable" "yes,no")])
1508 \f
1509
1510 ;; Sign- and zero-extend insns with standard names.
1511 ;;  Those for integer source operand are ordered with the widest source
1512 ;; type first.
1513
1514 ;; Sign-extend.
1515
1516 (define_insn "extendsidi2"
1517   [(set (match_operand:DI 0 "register_operand" "=r")
1518         (sign_extend:DI (match_operand:SI 1 "general_operand" "g")))]
1519   ""
1520   "move.d %1,%M0\;smi %H0\;neg.d %H0,%H0")
1521
1522 (define_insn "extend<mode>di2"
1523   [(set (match_operand:DI 0 "register_operand" "=r")
1524         (sign_extend:DI (match_operand:BW 1 "general_operand" "g")))]
1525   ""
1526   "movs<m> %1,%M0\;smi %H0\;neg.d %H0,%H0")
1527
1528 (define_insn "extend<mode>si2"
1529   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1530         (sign_extend:SI (match_operand:BW 1 "general_operand" "r,Q>,g")))]
1531   ""
1532   "movs<m> %1,%0"
1533   [(set_attr "slottable" "yes,yes,no")])
1534
1535 ;; To do a byte->word extension, extend to dword, exept that the top half
1536 ;; of the register will be clobbered.  FIXME: Perhaps this is not needed.
1537
1538 (define_insn "extendqihi2"
1539   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
1540         (sign_extend:HI (match_operand:QI 1 "general_operand" "r,Q>,g")))]
1541   ""
1542   "movs.b %1,%0"
1543   [(set_attr "slottable" "yes,yes,no")])
1544 \f
1545
1546 ;; Zero-extend.  The DImode ones are synthesized by gcc, so we don't
1547 ;; specify them here.
1548
1549 (define_insn "zero_extend<mode>si2"
1550   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1551         (zero_extend:SI
1552          (match_operand:BW 1 "nonimmediate_operand" "r,Q>,m")))]
1553   ""
1554   "movu<m> %1,%0"
1555   [(set_attr "slottable" "yes,yes,no")])
1556
1557 ;; Same comment as sign-extend QImode to HImode above applies.
1558
1559 (define_insn "zero_extendqihi2"
1560   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
1561         (zero_extend:HI
1562          (match_operand:QI 1 "nonimmediate_operand" "r,Q>,m")))]
1563   ""
1564   "movu.b %1,%0"
1565   [(set_attr "slottable" "yes,yes,no")])
1566 \f
1567 ;; All kinds of arithmetic and logical instructions.
1568 ;;
1569 ;; First, anonymous patterns to match addressing modes with
1570 ;; side-effects.
1571 ;;
1572 ;; op.S [rx=ry+I],rz; (add, sub, or, and, bound).
1573 ;;
1574 ;; [rx=ry+rz.S]
1575
1576 (define_insn "*op_side<mode>_biap"
1577   [(set (match_operand:BWD 0 "register_operand" "=r,r")
1578         (match_operator:BWD
1579          6 "cris_orthogonal_operator"
1580          [(match_operand:BWD 1 "register_operand" "0,0")
1581           (mem:BWD (plus:SI
1582                     (mult:SI (match_operand:SI 2 "register_operand" "r,r")
1583                              (match_operand:SI 3 "const_int_operand" "n,n"))
1584                     (match_operand:SI 4 "register_operand" "r,r")))]))
1585    (set (match_operand:SI 5 "register_operand" "=*4,r")
1586         (plus:SI (mult:SI (match_dup 2)
1587                           (match_dup 3))
1588                  (match_dup 4)))]
1589   "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
1590   "@
1591    #
1592    %x6<m> [%5=%4+%2%T3],%0")
1593 \f
1594 ;; [rx=ry+i] ([%4=%2+%3])
1595
1596 (define_insn "*op_side<mode>"
1597   [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r")
1598         (match_operator:BWD
1599          5 "cris_orthogonal_operator"
1600          [(match_operand:BWD 1 "register_operand" "0,0,0,0,0")
1601           (mem:BWD (plus:SI
1602                    (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
1603                    (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
1604    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
1605         (plus:SI (match_dup 2)
1606                  (match_dup 3)))]
1607   "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
1608 {
1609   if ((which_alternative == 0 || which_alternative == 3)
1610       && (!CONST_INT_P (operands[3])
1611           || INTVAL (operands[3]) > 127
1612           || INTVAL (operands[3]) < -128
1613           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
1614           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
1615     return "#";
1616   if (which_alternative == 4)
1617     return "%x5.%s0 [%4=%3%S2],%0";
1618   return "%x5<m> [%4=%2%S3],%0";
1619 })
1620 \f
1621 ;; To match all cases for commutative operations we may have to have the
1622 ;; following pattern for add, or & and.  I do not know really, but it does
1623 ;; not break anything.
1624 ;;
1625 ;; FIXME: This really ought to be checked.
1626 ;;
1627 ;; op.S [rx=ry+I],rz;
1628 ;;
1629 ;; [rx=ry+rz.S]
1630
1631 (define_insn "*op_swap_side<mode>_biap"
1632   [(set (match_operand:BWD 0 "register_operand" "=r,r")
1633         (match_operator:BWD
1634          6 "cris_commutative_orth_op"
1635          [(mem:BWD (plus:SI
1636                    (mult:SI (match_operand:SI 2 "register_operand" "r,r")
1637                             (match_operand:SI 3 "const_int_operand" "n,n"))
1638                    (match_operand:SI 4 "register_operand" "r,r")))
1639           (match_operand:BWD 1 "register_operand" "0,0")]))
1640    (set (match_operand:SI 5 "register_operand" "=*4,r")
1641         (plus:SI (mult:SI (match_dup 2)
1642                           (match_dup 3))
1643                  (match_dup 4)))]
1644   "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
1645   "@
1646    #
1647    %x6<m> [%5=%4+%2%T3],%0")
1648 \f
1649 ;; [rx=ry+i] ([%4=%2+%3])
1650 ;; FIXME: These could have anonymous mode for operand 0.
1651
1652 ;; QImode
1653
1654 (define_insn "*op_swap_side<mode>"
1655   [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r")
1656         (match_operator:BWD
1657          5 "cris_commutative_orth_op"
1658          [(mem:BWD
1659            (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
1660                     (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))
1661           (match_operand:BWD 1 "register_operand" "0,0,0,0,0")]))
1662    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
1663         (plus:SI (match_dup 2)
1664                  (match_dup 3)))]
1665   "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
1666 {
1667   if ((which_alternative == 0 || which_alternative == 3)
1668       && (!CONST_INT_P (operands[3])
1669           || INTVAL (operands[3]) > 127
1670           || INTVAL (operands[3]) < -128
1671           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
1672           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
1673     return "#";
1674   if (which_alternative == 4)
1675     return "%x5<m> [%4=%3%S2],%0";
1676   return "%x5<m> [%4=%2%S3],%0";
1677 })
1678 \f
1679 ;; Add operations, standard names.
1680
1681 ;; Note that for the 'P' constraint, the high part can be -1 or 0.  We
1682 ;; output the insn through the 'A' output modifier as "adds.w" and "addq",
1683 ;; respectively.
1684 (define_expand "adddi3"
1685   [(set (match_operand:DI 0 "register_operand")
1686         (plus:DI (match_operand:DI 1 "register_operand")
1687                  (match_operand:DI 2 "general_operand")))]
1688   ""
1689 {
1690   if (MEM_P (operands[2]) && TARGET_V32)
1691     operands[2] = force_reg (DImode, operands[2]);
1692 })
1693
1694 (define_insn "*adddi3_non_v32"
1695   [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r,&r")
1696         (plus:DI (match_operand:DI 1 "register_operand" "%0,0,0,0,r")
1697                  (match_operand:DI 2 "general_operand" "J,N,P,g,!To")))]
1698   "!TARGET_V32"
1699   "@
1700    addq %2,%M0\;ax\;addq 0,%H0
1701    subq %n2,%M0\;ax\;subq 0,%H0
1702    add%e2.%z2 %2,%M0\;ax\;%A2 %H2,%H0
1703    add.d %M2,%M0\;ax\;add.d %H2,%H0
1704    add.d %M2,%M1,%M0\;ax\;add.d %H2,%H1,%H0")
1705
1706 ; It seems no use allowing a memory operand for this one, because we'd
1707 ; need a scratch register for incrementing the address.
1708 (define_insn "*adddi3_v32"
1709   [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r")
1710        (plus:DI (match_operand:DI 1 "register_operand" "%0,0,0,0,0")
1711                 (match_operand:DI 2 "nonmemory_operand" "J,N,P,r,n")))]
1712   "TARGET_V32"
1713   "@
1714    addq %2,%M0\;addc 0,%H0
1715    subq %n2,%M0\;ax\;subq 0,%H0
1716    add%e2.%z2 %2,%M0\;addc %H2,%H0
1717    add.d %M2,%M0\;addc %H2,%H0
1718    add.d %M2,%M0\;addc %H2,%H0")
1719
1720 (define_expand "add<mode>3"
1721   [(set (match_operand:BWD 0 "register_operand")
1722         (plus:BWD
1723          (match_operand:BWD 1 "register_operand")
1724          (match_operand:BWD 2 "general_operand")))]
1725   ""
1726   "")
1727
1728 (define_insn "*addsi3_non_v32"
1729   [(set (match_operand:SI 0 "register_operand"  "=r,r, r,r,r,r, r,r,  r")
1730         (plus:SI
1731          (match_operand:SI 1 "register_operand" "%0,0, 0,0,0,0, 0,r,  r")
1732          (match_operand:SI 2 "general_operand"   "r,Q>,J,N,n,!S,g,!To,0")))]
1733
1734 ;; The last constraint is due to that after reload, the '%' is not
1735 ;; honored, and canonicalization doesn't care about keeping the same
1736 ;; register as in destination.  This will happen after insn splitting.
1737 ;; gcc <= 2.7.2.  FIXME: Check for gcc-2.9x
1738
1739  "!TARGET_V32"
1740 {
1741   switch (which_alternative)
1742     {
1743     case 0:
1744     case 1:
1745       return "add.d %2,%0";
1746     case 2:
1747       return "addq %2,%0";
1748     case 3:
1749       return "subq %n2,%0";
1750     case 4:
1751       /* 'Known value', but not in -63..63.
1752          Check if addu/subu may be used.  */
1753       if (INTVAL (operands[2]) > 0)
1754         {
1755           if (INTVAL (operands[2]) < 256)
1756             return "addu.b %2,%0";
1757           if (INTVAL (operands[2]) < 65536)
1758             return "addu.w %2,%0";
1759         }
1760       else
1761         {
1762           if (INTVAL (operands[2]) >= -255)
1763             return "subu.b %n2,%0";
1764           if (INTVAL (operands[2]) >= -65535)
1765             return "subu.w %n2,%0";
1766         }
1767       return "add.d %2,%0";
1768     case 5:
1769       {
1770         rtx tem = operands[2];
1771         gcc_assert (GET_CODE (tem) == CONST);
1772         tem = XEXP (tem, 0);
1773         if (GET_CODE (tem) == PLUS
1774             && GET_CODE (XEXP (tem, 0)) == UNSPEC
1775             /* We don't allow CRIS_UNSPEC_PCREL here; we can't have a
1776                pc-relative operand in an add insn.  */
1777             && XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_GOTREL
1778             && CONST_INT_P (XEXP (tem, 1)))
1779           tem = XEXP (tem, 0);
1780         gcc_assert (GET_CODE (tem) == UNSPEC);
1781         switch (XINT (tem, 1))
1782           {
1783           case CRIS_UNSPEC_GOTREAD:
1784           case CRIS_UNSPEC_PLTGOTREAD:
1785             /* Using sign-extend mostly to be consistent with the
1786                indexed addressing mode.  */
1787             if (flag_pic == 1)
1788               return "adds.w %2,%0";
1789             return "add.d %2,%0";
1790
1791           case CRIS_UNSPEC_PLT_GOTREL:
1792           case CRIS_UNSPEC_GOTREL:
1793             return "add.d %2,%0";
1794           default:
1795             gcc_unreachable ();
1796           }
1797       }
1798     case 6:
1799       return "add%u2 %2,%0";
1800     case 7:
1801       return "add.d %2,%1,%0";
1802     case 8:
1803       return "add.d %1,%0";
1804     default:
1805       return "BOGUS addsi %2+%1 to %0";
1806     }
1807 }
1808  [(set_attr "slottable" "yes,yes,yes,yes,no,no,no,no,yes")])
1809
1810 ; FIXME: Check what's best: having the three-operand ACR alternative
1811 ; before or after the corresponding-operand2 alternative.  Check for
1812 ; *all* insns.  FIXME: constant constraint letter for -128..127.
1813 (define_insn "*addsi3_v32"
1814   [(set (match_operand:SI 0 "register_operand"  "=r,!a,r,!a, r,r,!a,r,!a,r,r,r,!a")
1815         (plus:SI
1816          (match_operand:SI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,r, 0,0,0,r")
1817          (match_operand:SI 2 "general_operand"  "r, r, Q>,Q>,J,N,NJ,L,L, P,n,g,g")))]
1818   "TARGET_V32"
1819   "@
1820    add.d %2,%0
1821    addi %2.b,%1,%0
1822    add.d %2,%0
1823    addo.d %2,%1,%0
1824    addq %2,%0
1825    subq %n2,%0
1826    addoq %2,%1,%0
1827    adds.w %2,%0
1828    addo %2,%1,%0
1829    addu.w %2,%0
1830    add.d %2,%0
1831    add%u2 %2,%0
1832    addo.%Z2 %2,%1,%0"
1833   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,no,no,no,no,no,no")
1834    (set_attr "cc" "*,none,*,none,*,*,none,*,none,*,*,*,none")])
1835 \f
1836 (define_insn "*addhi3_non_v32"
1837   [(set (match_operand:HI 0 "register_operand"          "=r,r, r,r,r,r")
1838         (plus:HI (match_operand:HI 1 "register_operand" "%0,0, 0,0,0,r")
1839                  (match_operand:HI 2 "general_operand"   "r,Q>,J,N,g,!To")))]
1840   "!TARGET_V32"
1841   "@
1842    add.w %2,%0
1843    add.w %2,%0
1844    addq %2,%0
1845    subq %n2,%0
1846    add.w %2,%0
1847    add.w %2,%1,%0"
1848   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
1849    (set_attr "cc" "normal,normal,clobber,clobber,normal,normal")])
1850
1851 (define_insn "*addhi3_v32"
1852   [(set (match_operand:HI 0 "register_operand" "=r, !a,r,!a, r,r,!a,r,!a")
1853         (plus:HI
1854          (match_operand:HI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,r")
1855          (match_operand:HI 2 "general_operand"  "r, r, Q>,Q>,J,N,NJ,g,g")))]
1856   "TARGET_V32"
1857   "@
1858    add.w %2,%0
1859    addi %2.b,%1,%0
1860    add.w %2,%0
1861    addo.w %2,%1,%0
1862    addq %2,%0
1863    subq %n2,%0
1864    addoq %2,%1,%0
1865    add.w %2,%0
1866    addo.w %2,%1,%0"
1867   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,no,no")
1868    (set_attr "cc" "*,none,*,none,clobber,clobber,none,*,none")])
1869
1870 (define_insn "*addqi3_non_v32"
1871   [(set (match_operand:QI 0 "register_operand"          "=r,r, r,r,r,r,r")
1872         (plus:QI (match_operand:QI 1 "register_operand" "%0,0, 0,0,0,0,r")
1873                  (match_operand:QI 2 "general_operand"   "r,Q>,J,N,O,g,!To")))]
1874   "!TARGET_V32"
1875   "@
1876    add.b %2,%0
1877    add.b %2,%0
1878    addq %2,%0
1879    subq %n2,%0
1880    subQ -%b2,%0
1881    add.b %2,%0
1882    add.b %2,%1,%0"
1883   [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no")
1884    (set_attr "cc" "normal,normal,clobber,clobber,clobber,normal,normal")])
1885
1886 (define_insn "*addqi3_v32"
1887   [(set (match_operand:QI 0 "register_operand"  "=r,!a,r,!a, r,r,!a,r,r,!a")
1888         (plus:QI
1889          (match_operand:QI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,0,r")
1890          (match_operand:QI 2 "general_operand"   "r,r, Q>,Q>,J,N,NJ,O,g,g")))]
1891   "TARGET_V32"
1892   "@
1893    add.b %2,%0
1894    addi %2.b,%1,%0
1895    add.b %2,%0
1896    addo.b %2,%1,%0
1897    addq %2,%0
1898    subq %n2,%0
1899    addoq %2,%1,%0
1900    subQ -%b2,%0
1901    add.b %2,%0
1902    addo.b %2,%1,%0"
1903   [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,yes,no,no")
1904    (set_attr "cc" "*,none,*,none,clobber,clobber,none,clobber,*,none")])
1905 \f
1906 ;; Subtract.
1907 ;;
1908 ;; Note that because of insn canonicalization these will *seldom* but
1909 ;; rarely be used with a known constant as an operand.
1910
1911 ;; Note that for the 'P' constraint, the high part can be -1 or 0.  We
1912 ;; output the insn through the 'D' output modifier as "subs.w" and "subq",
1913 ;; respectively.
1914 (define_expand "subdi3"
1915   [(set (match_operand:DI 0 "register_operand")
1916         (minus:DI (match_operand:DI 1 "register_operand")
1917                   (match_operand:DI 2 "general_operand")))]
1918   ""
1919 {
1920   if (TARGET_V32 && MEM_P (operands[2]))
1921     operands[2] = force_reg (DImode, operands[2]);
1922 })
1923
1924 (define_insn "*subdi3_non_v32"
1925   [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r,&r")
1926         (minus:DI (match_operand:DI 1 "register_operand" "0,0,0,0,r")
1927                   (match_operand:DI 2 "general_operand" "J,N,P,g,!To")))]
1928   "!TARGET_V32"
1929   "@
1930    subq %2,%M0\;ax\;subq 0,%H0
1931    addq %n2,%M0\;ax\;addq 0,%H0
1932    sub%e2.%z2 %2,%M0\;ax\;%D2 %H2,%H0
1933    sub.d %M2,%M0\;ax\;sub.d %H2,%H0
1934    sub.d %M2,%M1,%M0\;ax\;sub.d %H2,%H1,%H0")
1935
1936 (define_insn "*subdi3_v32"
1937   [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r")
1938         (minus:DI (match_operand:DI 1 "register_operand" "0,0,0,0")
1939                   (match_operand:DI 2 "nonmemory_operand" "J,N,P,r")))]
1940   "TARGET_V32"
1941   "@
1942    subq %2,%M0\;ax\;subq 0,%H0
1943    addq %n2,%M0\;ax\;addq 0,%H0
1944    sub%e2.%z2 %2,%M0\;ax\;%D2 %H2,%H0
1945    sub.d %M2,%M0\;ax\;sub.d %H2,%H0")
1946
1947 (define_expand "sub<mode>3"
1948   [(set (match_operand:BWD 0 "register_operand")
1949         (minus:BWD
1950          (match_operand:BWD 1 "register_operand")
1951          (match_operand:BWD 2 "general_operand")))]
1952   ""
1953   "")
1954
1955 (define_insn "*subsi3_non_v32"
1956   [(set (match_operand:SI 0 "register_operand" "=r,r, r,r,r,r,r,r")
1957         (minus:SI
1958          (match_operand:SI 1 "register_operand" "0,0, 0,0,0,0,0,r")
1959          (match_operand:SI 2 "general_operand"  "r,Q>,J,N,P,n,g,!To")))]
1960   "!TARGET_V32"
1961
1962 ;; This does not do the optimal: "addu.w 65535,r0" when %2 is negative.
1963 ;; But then again, %2 should not be negative.
1964
1965   "@
1966    sub.d %2,%0
1967    sub.d %2,%0
1968    subq %2,%0
1969    addq %n2,%0
1970    sub%e2.%z2 %2,%0
1971    sub.d %2,%0
1972    sub.d %2,%0
1973    sub.d %2,%1,%0"
1974   [(set_attr "slottable" "yes,yes,yes,yes,no,no,no,no")])
1975
1976 (define_insn "*subsi3_v32"
1977   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r")
1978        (minus:SI
1979         (match_operand:SI 1 "register_operand" "0,0,0,0,0,0,0")
1980         (match_operand:SI 2 "general_operand" "r,Q>,J,N,P,n,g")))]
1981   "TARGET_V32"
1982   "@
1983    sub.d %2,%0
1984    sub.d %2,%0
1985    subq %2,%0
1986    addq %n2,%0
1987    sub%e2.%z2 %2,%0
1988    sub.d %2,%0
1989    sub.d %2,%0"
1990   [(set_attr "slottable" "yes,yes,yes,yes,no,no,no")])
1991 \f
1992 (define_insn "*sub<mode>3_nonv32"
1993   [(set (match_operand:BW 0 "register_operand"          "=r,r, r,r,r,r")
1994         (minus:BW (match_operand:BW 1 "register_operand" "0,0, 0,0,0,r")
1995                   (match_operand:BW 2 "general_operand"  "r,Q>,J,N,g,!To")))]
1996   "!TARGET_V32"
1997   "@
1998    sub<m> %2,%0
1999    sub<m> %2,%0
2000    subq %2,%0
2001    addq %n2,%0
2002    sub<m> %2,%0
2003    sub<m> %2,%1,%0"
2004   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
2005    (set_attr "cc" "normal,normal,clobber,clobber,normal,normal")])
2006
2007 (define_insn "*sub<mode>3_v32"
2008   [(set (match_operand:BW 0 "register_operand" "=r,r,r,r,r")
2009         (minus:BW (match_operand:BW 1 "register_operand" "0,0,0,0,0")
2010                   (match_operand:BW 2 "general_operand" "r,Q>,J,N,g")))]
2011   "TARGET_V32"
2012   "@
2013    sub<m> %2,%0
2014    sub<m> %2,%0
2015    subq %2,%0
2016    addq %n2,%0
2017    sub<m> %2,%0"
2018   [(set_attr "slottable" "yes,yes,yes,yes,no")
2019    (set_attr "cc" "normal,normal,clobber,clobber,normal")])
2020 \f
2021 ;; CRIS has some add/sub-with-sign/zero-extend instructions.
2022 ;;  Although these perform sign/zero-extension to SImode, they are
2023 ;; equally applicable for the HImode case.
2024 ;; FIXME: Check; GCC should handle the widening.
2025 ;;  Note that these must be located after the normal add/sub patterns,
2026 ;; so not to get constants into any less specific operands.
2027 ;;
2028 ;; Extend with add/sub and side-effect.
2029 ;;
2030 ;; ADDS/SUBS/ADDU/SUBU and BOUND, which needs a check for zero_extend
2031 ;;
2032 ;; adds/subs/addu/subu bound [rx=ry+rz.S]
2033
2034 ;; QImode to HImode
2035 ;; FIXME: GCC should widen.
2036
2037 (define_insn "*extopqihi_side_biap"
2038   [(set (match_operand:HI 0 "register_operand" "=r,r")
2039         (match_operator:HI
2040          6 "cris_additive_operand_extend_operator"
2041          [(match_operand:HI 1 "register_operand" "0,0")
2042           (match_operator:HI
2043            7 "cris_extend_operator"
2044            [(mem:QI (plus:SI
2045                      (mult:SI (match_operand:SI 2 "register_operand" "r,r")
2046                               (match_operand:SI 3 "const_int_operand" "n,n"))
2047                      (match_operand:SI 4 "register_operand" "r,r")))])]))
2048    (set (match_operand:SI 5 "register_operand" "=*4,r")
2049         (plus:SI (mult:SI (match_dup 2)
2050                           (match_dup 3))
2051                  (match_dup 4)))]
2052   "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
2053   "@
2054    #
2055    %x6%e7.%m7 [%5=%4+%2%T3],%0")
2056
2057 (define_insn "*extop<mode>si_side_biap"
2058   [(set (match_operand:SI 0 "register_operand" "=r,r")
2059         (match_operator:SI
2060          6 "cris_operand_extend_operator"
2061          [(match_operand:SI 1 "register_operand" "0,0")
2062           (match_operator:SI
2063            7 "cris_extend_operator"
2064            [(mem:BW (plus:SI
2065                      (mult:SI (match_operand:SI 2 "register_operand" "r,r")
2066                               (match_operand:SI 3 "const_int_operand" "n,n"))
2067                      (match_operand:SI 4 "register_operand" "r,r")))])]))
2068    (set (match_operand:SI 5 "register_operand" "=*4,r")
2069         (plus:SI (mult:SI (match_dup 2)
2070                           (match_dup 3))
2071                  (match_dup 4)))]
2072   "(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[7]) == ZERO_EXTEND)
2073    && cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
2074   "@
2075    #
2076    %x6%e7<m> [%5=%4+%2%T3],%0")
2077 \f
2078
2079 ;; [rx=ry+i]
2080
2081 ;; QImode to HImode
2082
2083 (define_insn "*extopqihi_side"
2084   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
2085         (match_operator:HI
2086          5 "cris_additive_operand_extend_operator"
2087          [(match_operand:HI 1 "register_operand" "0,0,0,0,0")
2088           (match_operator:HI
2089            6 "cris_extend_operator"
2090            [(mem:QI
2091              (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
2092                       (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")
2093                       ))])]))
2094    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
2095         (plus:SI (match_dup 2)
2096                  (match_dup 3)))]
2097   "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
2098 {
2099   if ((which_alternative == 0 || which_alternative == 3)
2100       && (!CONST_INT_P (operands[3])
2101           || INTVAL (operands[3]) > 127
2102           || INTVAL (operands[3]) < -128
2103           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
2104           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
2105     return "#";
2106   if (which_alternative == 4)
2107     return "%x5%E6.%m6 [%4=%3%S2],%0";
2108   return "%x5%E6.%m6 [%4=%2%S3],%0";
2109 })
2110
2111 (define_insn "*extop<mode>si_side"
2112   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
2113         (match_operator:SI
2114          5 "cris_operand_extend_operator"
2115          [(match_operand:SI 1 "register_operand" "0,0,0,0,0")
2116           (match_operator:SI
2117            6 "cris_extend_operator"
2118            [(mem:BW
2119              (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
2120                       (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")
2121                       ))])]))
2122    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
2123         (plus:SI (match_dup 2)
2124                  (match_dup 3)))]
2125   "(GET_CODE (operands[5]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND)
2126    && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
2127 {
2128   if ((which_alternative == 0 || which_alternative == 3)
2129       && (!CONST_INT_P (operands[3])
2130           || INTVAL (operands[3]) > 127
2131           || INTVAL (operands[3]) < -128
2132           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
2133           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
2134     return "#";
2135   if (which_alternative == 4)
2136     return "%x5%E6<m> [%4=%3%S2],%0";
2137   return "%x5%E6<m> [%4=%2%S3],%0";
2138 })
2139 \f
2140
2141 ;; As with op.S we may have to add special pattern to match commuted
2142 ;; operands to adds/addu and bound
2143 ;;
2144 ;; adds/addu/bound [rx=ry+rz.S]
2145
2146 ;; QImode to HImode
2147 ;; FIXME: GCC should widen.
2148
2149 (define_insn "*extopqihi_swap_side_biap"
2150   [(set (match_operand:HI 0 "register_operand" "=r,r")
2151         (plus:HI
2152          (match_operator:HI
2153           6 "cris_extend_operator"
2154           [(mem:QI (plus:SI
2155                     (mult:SI (match_operand:SI 2 "register_operand" "r,r")
2156                              (match_operand:SI 3 "const_int_operand" "n,n"))
2157                     (match_operand:SI 4 "register_operand" "r,r")))])
2158          (match_operand:HI 1 "register_operand" "0,0")))
2159    (set (match_operand:SI 5 "register_operand" "=*4,r")
2160         (plus:SI (mult:SI (match_dup 2)
2161                           (match_dup 3))
2162                  (match_dup 4)))]
2163   "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
2164   "@
2165    #
2166    add%e6.b [%5=%4+%2%T3],%0")
2167
2168 (define_insn "*extop<mode>si_swap_side_biap"
2169   [(set (match_operand:SI 0 "register_operand" "=r,r")
2170         (match_operator:SI
2171          7 "cris_plus_or_bound_operator"
2172          [(match_operator:SI
2173            6 "cris_extend_operator"
2174            [(mem:BW (plus:SI
2175                      (mult:SI (match_operand:SI 2 "register_operand" "r,r")
2176                               (match_operand:SI 3 "const_int_operand" "n,n"))
2177                      (match_operand:SI 4 "register_operand" "r,r")))])
2178           (match_operand:SI 1 "register_operand" "0,0")]))
2179    (set (match_operand:SI 5 "register_operand" "=*4,r")
2180         (plus:SI (mult:SI (match_dup 2)
2181                           (match_dup 3))
2182                  (match_dup 4)))]
2183   "(GET_CODE (operands[7]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND)
2184    && cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)"
2185   "@
2186    #
2187    %x7%E6<m> [%5=%4+%2%T3],%0")
2188 \f
2189 ;; [rx=ry+i]
2190 ;; FIXME: GCC should widen.
2191
2192 ;; QImode to HImode
2193
2194 (define_insn "*extopqihi_swap_side"
2195   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
2196         (plus:HI
2197          (match_operator:HI
2198           5 "cris_extend_operator"
2199           [(mem:QI (plus:SI
2200                     (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
2201                     (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])
2202          (match_operand:HI 1 "register_operand" "0,0,0,0,0")))
2203    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
2204         (plus:SI (match_dup 2)
2205                  (match_dup 3)))]
2206   "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
2207 {
2208   if ((which_alternative == 0 || which_alternative == 3)
2209       && (!CONST_INT_P (operands[3])
2210           || INTVAL (operands[3]) > 127
2211           || INTVAL (operands[3]) < -128
2212           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
2213           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
2214     return "#";
2215   if (which_alternative == 4)
2216     return "add%e5.b [%4=%3%S2],%0";
2217   return "add%e5.b [%4=%2%S3],%0";
2218 })
2219
2220 (define_insn "*extop<mode>si_swap_side"
2221   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
2222         (match_operator:SI
2223          6 "cris_plus_or_bound_operator"
2224          [(match_operator:SI
2225            5 "cris_extend_operator"
2226            [(mem:BW (plus:SI
2227                      (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
2228                      (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])
2229           (match_operand:SI 1 "register_operand" "0,0,0,0,0")]))
2230    (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
2231         (plus:SI (match_dup 2)
2232                  (match_dup 3)))]
2233   "(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[5]) == ZERO_EXTEND)
2234    && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
2235 {
2236   if ((which_alternative == 0 || which_alternative == 3)
2237       && (!CONST_INT_P (operands[3])
2238           || INTVAL (operands[3]) > 127
2239           || INTVAL (operands[3]) < -128
2240           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
2241           || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
2242     return "#";
2243   if (which_alternative == 4)
2244     return \"%x6%E5.%m5 [%4=%3%S2],%0\";
2245   return "%x6%E5<m> [%4=%2%S3],%0";
2246 })
2247 \f
2248 ;; Extend versions (zero/sign) of normal add/sub (no side-effects).
2249
2250 ;; QImode to HImode
2251 ;; FIXME: GCC should widen.
2252
2253 (define_insn "*extopqihi_non_v32"
2254   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r")
2255         (match_operator:HI
2256          3 "cris_additive_operand_extend_operator"
2257          [(match_operand:HI 1 "register_operand" "0,0,0,r")
2258           (match_operator:HI
2259            4 "cris_extend_operator"
2260            [(match_operand:QI 2 "nonimmediate_operand" "r,Q>,m,!To")])]))]
2261   "!TARGET_V32 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
2262    && (operands[1] != frame_pointer_rtx || GET_CODE (operands[3]) != PLUS)"
2263   "@
2264    %x3%E4.%m4 %2,%0
2265    %x3%E4.%m4 %2,%0
2266    %x3%E4.%m4 %2,%0
2267    %x3%E4.%m4 %2,%1,%0"
2268   [(set_attr "slottable" "yes,yes,no,no")
2269    (set_attr "cc" "clobber")])
2270
2271 (define_insn "*extopqihi_v32"
2272   [(set (match_operand:HI 0 "register_operand" "=r,r")
2273         (match_operator:HI
2274          3 "cris_additive_operand_extend_operator"
2275          [(match_operand:HI 1 "register_operand" "0,0")
2276           (match_operator:HI
2277            4 "cris_extend_operator"
2278            [(match_operand:QI 2 "nonimmediate_operand" "r,m")])]))]
2279   "TARGET_V32"
2280   "%x3%e4.%m4 %2,%0"
2281   [(set_attr "slottable" "yes")
2282    (set_attr "cc" "clobber")])
2283
2284 ;; QImode to SImode
2285
2286 (define_insn "*extop<mode>si_non_v32"
2287   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
2288         (match_operator:SI
2289          3 "cris_operand_extend_operator"
2290          [(match_operand:SI 1 "register_operand" "0,0,0,r")
2291           (match_operator:SI
2292            4 "cris_extend_operator"
2293            [(match_operand:BW 2 "nonimmediate_operand" "r,Q>,m,!To")])]))]
2294   "!TARGET_V32
2295    && (GET_CODE (operands[3]) != UMIN || GET_CODE (operands[4]) == ZERO_EXTEND)
2296    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
2297    && (operands[1] != frame_pointer_rtx || GET_CODE (operands[3]) != PLUS)"
2298   "@
2299    %x3%E4<m> %2,%0
2300    %x3%E4<m> %2,%0
2301    %x3%E4<m> %2,%0
2302    %x3%E4<m> %2,%1,%0"
2303   [(set_attr "slottable" "yes,yes,no,no")])
2304
2305 (define_insn "*extop<mode>si_v32"
2306   [(set (match_operand:SI 0 "register_operand" "=r,r")
2307         (match_operator:SI
2308          3 "cris_additive_operand_extend_operator"
2309          [(match_operand:SI 1 "register_operand" "0,0")
2310           (match_operator:SI
2311            4 "cris_extend_operator"
2312            [(match_operand:BW 2 "nonimmediate_operand" "r,m")])]))]
2313   "TARGET_V32"
2314   "%x3%e4.%m4 %2,%0"
2315   [(set_attr "slottable" "yes")])
2316 \f
2317 ;; As with the side-effect patterns, may have to have swapped operands for add.
2318 ;; For commutative operands, these are the canonical forms.
2319
2320 ;; QImode to HImode
2321
2322 (define_insn "*addxqihi_swap_non_v32"
2323   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r")
2324         (plus:HI
2325          (match_operator:HI
2326           3 "cris_extend_operator"
2327           [(match_operand:QI 2 "nonimmediate_operand" "r,Q>,m,!To")])
2328          (match_operand:HI 1 "register_operand" "0,0,0,r")))]
2329   "!TARGET_V32 && operands[1] != frame_pointer_rtx"
2330   "@
2331    add%e3.b %2,%0
2332    add%e3.b %2,%0
2333    add%e3.b %2,%0
2334    add%e3.b %2,%1,%0"
2335   [(set_attr "slottable" "yes,yes,no,no")
2336    (set_attr "cc" "clobber")])
2337
2338 ;; A case for v32, to catch the "addo" insn in addition to "adds".  We
2339 ;; only care to match the canonical form; there should be no other.
2340
2341 (define_insn "*addsbw_v32"
2342   [(set (match_operand:HI 0 "register_operand" "=r,r,!a")
2343         (plus:HI
2344          (sign_extend:HI
2345           (match_operand:QI 2 "nonimmediate_operand" "r,m,m"))
2346          (match_operand:HI 1 "register_operand" "0,0,r")))]
2347   "TARGET_V32"
2348   "@
2349    adds.b %2,%0
2350    adds.b %2,%0
2351    addo.b %2,%1,%0"
2352   [(set_attr "slottable" "yes")
2353    (set_attr "cc" "clobber,clobber,none")])
2354
2355 (define_insn "*addubw_v32"
2356   [(set (match_operand:HI 0 "register_operand" "=r,r")
2357         (plus:HI
2358          (zero_extend:HI
2359           (match_operand:QI 2 "nonimmediate_operand" "r,m"))
2360          (match_operand:HI 1 "register_operand" "0,0")))]
2361   "TARGET_V32"
2362   "addu.b %2,%0"
2363   [(set_attr "slottable" "yes")
2364    (set_attr "cc" "clobber")])
2365
2366 (define_insn "*extop<mode>si_swap_non_v32"
2367   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
2368         (match_operator:SI
2369          4 "cris_plus_or_bound_operator"
2370          [(match_operator:SI
2371            3 "cris_extend_operator"
2372            [(match_operand:BW 2 "nonimmediate_operand" "r,Q>,m,!To")])
2373           (match_operand:SI 1 "register_operand" "0,0,0,r")]))]
2374   "!TARGET_V32
2375    && (GET_CODE (operands[4]) != UMIN || GET_CODE (operands[3]) == ZERO_EXTEND)
2376    && operands[1] != frame_pointer_rtx"
2377   "@
2378    %x4%E3<m> %2,%0
2379    %x4%E3<m> %2,%0
2380    %x4%E3<m> %2,%0
2381    %x4%E3<m> %2,%1,%0"
2382   [(set_attr "slottable" "yes,yes,no,no")])
2383
2384 (define_insn "*adds<mode>_v32"
2385   [(set (match_operand:SI 0 "register_operand" "=r,r,!a")
2386         (plus:SI
2387          (sign_extend:SI
2388           (match_operand:BW 2 "nonimmediate_operand" "r,m,m"))
2389          (match_operand:SI 1 "register_operand" "0,0,r")))]
2390   "TARGET_V32"
2391   "@
2392    adds<m> %2,%0
2393    adds<m> %2,%0
2394    addo<m> %2,%1,%0"
2395   [(set_attr "slottable" "yes")
2396    (set_attr "cc" "*,*,none")])
2397
2398 (define_insn "*addu<mode>_v32"
2399   [(set (match_operand:SI 0 "register_operand" "=r,r")
2400        (plus:SI
2401         (zero_extend:SI
2402           (match_operand:BW 2 "nonimmediate_operand" "r,m"))
2403         (match_operand:SI 1 "register_operand" "0,0")))]
2404   "TARGET_V32 && operands[1] != frame_pointer_rtx"
2405   "addu<m> %2,%0"
2406   [(set_attr "slottable" "yes")])
2407
2408 (define_insn "*bound<mode>_v32"
2409   [(set (match_operand:SI 0 "register_operand" "=r")
2410        (umin:SI
2411         (zero_extend:SI
2412          (match_operand:BW 2 "register_operand" "r"))
2413         (match_operand:SI 1 "register_operand" "0")))]
2414   "TARGET_V32 && operands[1] != frame_pointer_rtx"
2415   "bound<m> %2,%0"
2416   [(set_attr "slottable" "yes")])
2417 \f
2418 ;; This is the special case when we use what corresponds to the
2419 ;; instruction above in "casesi".  Do *not* change it to use the generic
2420 ;; pattern and "REG 15" as pc; I did that and it led to madness and
2421 ;; maintenance problems: Instead of (as imagined) recognizing and removing
2422 ;; or replacing this pattern with something simpler, other variant
2423 ;; patterns were recognized or combined, including some prefix variants
2424 ;; where the value in pc is not that of the next instruction (which means
2425 ;; this instruction actually *is* special and *should* be marked as such).
2426 ;; When switching from the "generic pattern match" approach to this simpler
2427 ;; approach, there were insignificant differences in gcc, ipps and
2428 ;; product code, somehow due to scratching reload behind the ear or
2429 ;; something.  Testcase "gcc" looked .01% slower and 4 bytes bigger;
2430 ;; product code became .001% smaller but "looked better".  The testcase
2431 ;; "ipps" was just different at register allocation).
2432 ;;
2433 ;; Assumptions in the jump optimizer forces us to use IF_THEN_ELSE in this
2434 ;; pattern with the default-label as the else, with the "if" being
2435 ;; index-is-less-than the max number of cases plus one.  The default-label
2436 ;; is attached to the end of the case-table at time of output.
2437
2438 (define_insn "*casesi_adds_w"
2439   [(set (pc)
2440         (if_then_else
2441          (ltu (match_operand:SI 0 "register_operand" "r")
2442               (match_operand:SI 1 "const_int_operand" "n"))
2443          (plus:SI (sign_extend:SI
2444                    (mem:HI
2445                     (plus:SI (mult:SI (match_dup 0) (const_int 2))
2446                              (pc))))
2447                   (pc))
2448          (label_ref (match_operand 2 "" ""))))
2449    (use (label_ref (match_operand 3 "" "")))]
2450   "!TARGET_V32 && operands[0] != frame_pointer_rtx"
2451   "adds.w [$pc+%0.w],$pc"
2452   [(set_attr "cc" "clobber")])
2453
2454 ;; For V32, we just have a jump, but we need to mark the table as used,
2455 ;; and the jump insn must have the if_then_else form expected by core
2456 ;; GCC.  Since we don't want to prolong the lifetime of the original
2457 ;; index value, we compare against "unspec 0".  It's a pity we have to
2458 ;; jump through to get the default label in place and to keep the jump
2459 ;; table around.  FIXME: Look into it some time.
2460
2461 (define_insn "*casesi_jump_v32"
2462   [(set (pc)
2463         (if_then_else
2464          (ltu (unspec [(const_int 0)] CRIS_UNSPEC_CASESI)
2465               (match_operand:SI 0 "const_int_operand" "n"))
2466          (match_operand:SI 1 "register_operand" "r")
2467          (label_ref (match_operand 2 "" ""))))
2468    (use (label_ref (match_operand 3 "" "")))]
2469   "TARGET_V32"
2470   "jump %1%#"
2471   [(set_attr "cc" "clobber")
2472    (set_attr "slottable" "has_slot")])
2473 \f
2474 ;; Multiply instructions.
2475
2476 ;; Sometimes powers of 2 (which are normally canonicalized to a
2477 ;; left-shift) appear here, as a result of address reloading.
2478 ;; As a special, for values 3 and 5, we can match with an addi, so add those.
2479 ;;
2480 ;; FIXME: This may be unnecessary now.
2481 ;; Explicitly named for convenience of having a gen_... function.
2482
2483 (define_insn "addi_mul"
2484   [(set (match_operand:SI 0 "register_operand" "=r")
2485         (mult:SI
2486          (match_operand:SI 1 "register_operand" "%0")
2487          (match_operand:SI 2 "const_int_operand" "n")))]
2488   "operands[0] != frame_pointer_rtx
2489    && operands[1] != frame_pointer_rtx
2490    && CONST_INT_P (operands[2])
2491    && (INTVAL (operands[2]) == 2
2492        || INTVAL (operands[2]) == 4 || INTVAL (operands[2]) == 3
2493        || INTVAL (operands[2]) == 5)"
2494 {
2495   if (INTVAL (operands[2]) == 2)
2496     return "lslq 1,%0";
2497   else if (INTVAL (operands[2]) == 4)
2498     return "lslq 2,%0";
2499   else if (INTVAL (operands[2]) == 3)
2500     return "addi %0.w,%0";
2501   else if (INTVAL (operands[2]) == 5)
2502     return "addi %0.d,%0";
2503   return "BAD: adr_mulsi: %0=%1*%2";
2504 }
2505 [(set_attr "slottable" "yes")
2506  ;; No flags are changed if this insn is "addi", but it does not seem
2507  ;; worth the trouble to distinguish that to the lslq cases.
2508  (set_attr "cc" "clobber")])
2509
2510 ;; The addi insn as it is normally used.
2511
2512 ;; Make the ACR alternative taste bad enough to not choose it as a
2513 ;; preference to avoid spilling problems (unwind-dw2-fde.c at build).
2514 ;; FIXME: Revisit for new register allocator.
2515
2516 (define_insn "*addi"
2517   [(set (match_operand:SI 0 "register_operand" "=r,!a")
2518         (plus:SI
2519          (mult:SI (match_operand:SI 2 "register_operand" "r,r")
2520                   (match_operand:SI 3 "const_int_operand" "n,n"))
2521          (match_operand:SI 1 "register_operand" "0,r")))]
2522   "operands[0] != frame_pointer_rtx
2523    && operands[1] != frame_pointer_rtx
2524    && CONST_INT_P (operands[3])
2525    && (INTVAL (operands[3]) == 1
2526        || INTVAL (operands[3]) == 2 || INTVAL (operands[3]) == 4)"
2527   "@
2528    addi %2%T3,%0
2529    addi %2%T3,%1,%0"
2530   [(set_attr "slottable" "yes")
2531    (set_attr "cc" "none")])
2532
2533 ;; The mstep instruction.  Probably not useful by itself; it's to
2534 ;; non-linear wrt. the other insns.  We used to expand to it, so at least
2535 ;; it's correct.
2536
2537 (define_insn "mstep_shift"
2538   [(set (match_operand:SI 0 "register_operand" "=r")
2539         (if_then_else:SI
2540          (lt:SI (cc0) (const_int 0))
2541          (plus:SI (ashift:SI (match_operand:SI 1 "register_operand" "0")
2542                              (const_int 1))
2543                   (match_operand:SI 2 "register_operand" "r"))
2544          (ashift:SI (match_operand:SI 3 "register_operand" "0")
2545                     (const_int 1))))]
2546   "!TARGET_V32"
2547   "mstep %2,%0"
2548   [(set_attr "slottable" "yes")])
2549
2550 ;; When illegitimate addresses are legitimized, sometimes gcc forgets
2551 ;; to canonicalize the multiplications.
2552 ;;
2553 ;; FIXME: Check gcc > 2.7.2, remove and possibly fix in gcc.
2554
2555 (define_insn "mstep_mul"
2556   [(set (match_operand:SI 0 "register_operand" "=r")
2557         (if_then_else:SI
2558          (lt:SI (cc0) (const_int 0))
2559          (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "0")
2560                            (const_int 2))
2561                   (match_operand:SI 2 "register_operand" "r"))
2562          (mult:SI (match_operand:SI 3 "register_operand" "0")
2563                   (const_int 2))))]
2564   "!TARGET_V32
2565    && operands[0] != frame_pointer_rtx
2566    && operands[1] != frame_pointer_rtx
2567    && operands[2] != frame_pointer_rtx
2568    && operands[3] != frame_pointer_rtx"
2569   "mstep %2,%0"
2570   [(set_attr "slottable" "yes")])
2571
2572 (define_insn "<u>mul<s><mode>3"
2573   [(set (match_operand:WD 0 "register_operand" "=r")
2574         (mult:WD
2575          (szext:WD (match_operand:<S> 1 "register_operand" "%0"))
2576          (szext:WD (match_operand:<S> 2 "register_operand" "r"))))
2577    (clobber (match_scratch:SI 3 "=h"))]
2578   "TARGET_HAS_MUL_INSNS"
2579   "%!mul<su><mm> %2,%0"
2580   [(set (attr "slottable")
2581         (if_then_else (ne (symbol_ref "TARGET_MUL_BUG") (const_int 0))
2582                       (const_string "no")
2583                       (const_string "yes")))
2584    ;; For umuls.[bwd] it's just N unusable here, but let's be safe.
2585    ;; For muls.b, this really extends to SImode, so cc should be
2586    ;; considered clobbered.
2587    ;; For muls.w, it's just N unusable here, but let's be safe.
2588    (set_attr "cc" "clobber")])
2589
2590 ;; Note that gcc does not make use of such a thing as umulqisi3.  It gets
2591 ;; confused and will erroneously use it instead of umulhisi3, failing (at
2592 ;; least) gcc.c-torture/execute/arith-rand.c at all optimization levels.
2593 ;; Inspection of optab code shows that there must be only one widening
2594 ;; multiplication per mode widened to.
2595
2596 (define_insn "mulsi3"
2597   [(set (match_operand:SI 0 "register_operand" "=r")
2598         (mult:SI (match_operand:SI 1 "register_operand" "%0")
2599                  (match_operand:SI 2 "register_operand" "r")))
2600    (clobber (match_scratch:SI 3 "=h"))]
2601   "TARGET_HAS_MUL_INSNS"
2602   "%!muls.d %2,%0"
2603   [(set (attr "slottable")
2604         (if_then_else (ne (symbol_ref "TARGET_MUL_BUG") (const_int 0))
2605                       (const_string "no")
2606                       (const_string "yes")))
2607    ;; Just N unusable here, but let's be safe.
2608    (set_attr "cc" "clobber")])
2609 \f
2610 ;; A few multiply variations.
2611
2612 ;; When needed, we can get the high 32 bits from the overflow
2613 ;; register.  We don't care to split and optimize these.
2614 ;;
2615 ;; Note that cc0 is still valid after the move-from-overflow-register
2616 ;; insn; no special precaution need to be taken in cris_notice_update_cc.
2617
2618 (define_insn "<u>mulsidi3"
2619   [(set (match_operand:DI 0 "register_operand" "=r")
2620         (mult:DI
2621          (szext:DI (match_operand:SI 1 "register_operand" "%0"))
2622          (szext:DI (match_operand:SI 2 "register_operand" "r"))))
2623    (clobber (match_scratch:SI 3 "=h"))]
2624   "TARGET_HAS_MUL_INSNS"
2625   "%!mul<su>.d %2,%M0\;move $mof,%H0")
2626
2627 ;; These two patterns may be expressible by other means, perhaps by making
2628 ;; [u]?mulsidi3 a define_expand.
2629
2630 ;; Due to register allocation braindamage, the clobber 1,2 alternatives
2631 ;; cause a move into the clobbered register *before* the insn, then
2632 ;; after the insn, mof is moved too, rather than the clobber assigned
2633 ;; the last mof target.  This became apparent when making MOF and SRP
2634 ;; visible registers, with the necessary tweak to smulsi3_highpart.
2635 ;; Because these patterns are used in division by constants, that damage
2636 ;; is visible (ipps regression tests).  Therefore the last two
2637 ;; alternatives, "helping" reload to avoid an unnecessary move, but
2638 ;; punished by force of one "?".  Check code from "int d (int a) {return
2639 ;; a / 1000;}" and unsigned.  FIXME: Comment above was for 3.2, revisit.
2640
2641 (define_insn "<su>mulsi3_highpart"
2642   [(set (match_operand:SI 0 "register_operand" "=h,h,?r,?r")
2643         (truncate:SI
2644          (lshiftrt:DI
2645           (mult:DI
2646            (szext:DI (match_operand:SI 1 "register_operand" "r,r,0,r"))
2647            (szext:DI (match_operand:SI 2 "register_operand" "r,r,r,0")))
2648           (const_int 32))))
2649    (clobber (match_scratch:SI 3 "=1,2,h,h"))]
2650   "TARGET_HAS_MUL_INSNS"
2651   "@
2652    %!mul<su>.d %2,%1
2653    %!mul<su>.d %1,%2
2654    %!mul<su>.d %2,%1\;move $mof,%0
2655    %!mul<su>.d %1,%2\;move $mof,%0"
2656   [(set_attr "slottable" "yes,yes,no,no")
2657    (set_attr "cc" "clobber")])
2658 \f
2659 ;; Divide and modulus instructions.  CRIS only has a step instruction.
2660
2661 (define_insn "dstep_shift"
2662   [(set (match_operand:SI 0 "register_operand" "=r")
2663         (if_then_else:SI
2664          (geu:SI (ashift:SI (match_operand:SI 1 "register_operand" "0")
2665                             (const_int 1))
2666               (match_operand:SI 2 "register_operand" "r"))
2667          (minus:SI (ashift:SI (match_operand:SI 3 "register_operand" "0")
2668                         (const_int 1))
2669                    (match_operand:SI 4 "register_operand" "2"))
2670          (ashift:SI (match_operand:SI 5 "register_operand" "0")
2671                         (const_int 1))))]
2672   ""
2673   "dstep %2,%0"
2674   [(set_attr "slottable" "yes")
2675    (set_attr "cc" "noov32")])
2676
2677 ;; Here's a variant with mult instead of ashift.
2678 ;;
2679 ;; FIXME: This should be investigated.  Which one matches through combination?
2680
2681 (define_insn "dstep_mul"
2682   [(set (match_operand:SI 0 "register_operand" "=r")
2683         (if_then_else:SI
2684          (geu:SI (mult:SI (match_operand:SI 1 "register_operand" "0")
2685                           (const_int 2))
2686               (match_operand:SI 2 "register_operand" "r"))
2687          (minus:SI (mult:SI (match_operand:SI 3 "register_operand" "0")
2688                             (const_int 2))
2689                    (match_operand:SI 4 "register_operand" "2"))
2690          (mult:SI (match_operand:SI 5 "register_operand" "0")
2691                   (const_int 2))))]
2692   "operands[0] != frame_pointer_rtx
2693    && operands[1] != frame_pointer_rtx
2694    && operands[2] != frame_pointer_rtx
2695    && operands[3] != frame_pointer_rtx"
2696   "dstep %2,%0"
2697   [(set_attr "slottable" "yes")
2698    (set_attr "cc" "noov32")])
2699 \f
2700 ;; Logical operators.
2701
2702 ;; Bitwise "and".
2703
2704 ;; There is no use in defining "anddi3", because gcc can expand this by
2705 ;; itself, and make reasonable code without interference.
2706
2707 ;; If the first operand is memory or a register and is the same as the
2708 ;; second operand, and the third operand is -256 or -65536, we can use
2709 ;; CLEAR instead.  Or, if the first operand is a register, and the third
2710 ;; operand is 255 or 65535, we can zero_extend.
2711 ;; GCC isn't smart enough to recognize these cases (yet), and they seem
2712 ;; to be common enough to be worthwhile.
2713 ;; FIXME: This should be made obsolete.
2714
2715 (define_expand "andsi3"
2716   [(set (match_operand:SI 0 "nonimmediate_operand"         "")
2717         (and:SI (match_operand:SI 1 "nonimmediate_operand" "")
2718                 (match_operand:SI 2 "general_operand"    "")))]
2719   ""
2720 {
2721   if (! (CONST_INT_P (operands[2])
2722          && (((INTVAL (operands[2]) == -256
2723                || INTVAL (operands[2]) == -65536)
2724               && rtx_equal_p (operands[1], operands[0]))
2725              || ((INTVAL (operands[2]) == 255
2726                   || INTVAL (operands[2]) == 65535)
2727                  && REG_P (operands[0])))))
2728     {
2729       /* Make intermediate steps if operand0 is not a register or
2730          operand1 is not a register, and hope that the reload pass will
2731          make something useful out of it.  Note that the operands are
2732          *not* canonicalized.  For the moment, I chicken out on this,
2733          because all or most ports do not describe 'and' with
2734          canonicalized operands, and I seem to remember magic in reload,
2735          checking that operand1 has constraint '%0', in which case
2736          operand0 and operand1 must have similar predicates.
2737          FIXME: Investigate.  */
2738       rtx reg0 = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SImode);
2739       rtx reg1 = operands[1];
2740
2741       if (! REG_P (reg1))
2742         {
2743           emit_move_insn (reg0, reg1);
2744           reg1 = reg0;
2745         }
2746
2747       emit_insn (gen_rtx_SET (SImode, reg0,
2748                           gen_rtx_AND (SImode, reg1, operands[2])));
2749
2750       /* Make sure we get the right *final* destination.  */
2751       if (! REG_P (operands[0]))
2752         emit_move_insn (operands[0], reg0);
2753
2754       DONE;
2755     }
2756 })
2757
2758 ;; Some special cases of andsi3.
2759
2760 (define_insn "*andsi_movu"
2761   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
2762         (and:SI (match_operand:SI 1 "nonimmediate_operand" "%r,Q,To")
2763                 (match_operand:SI 2 "const_int_operand" "n,n,n")))]
2764   "(INTVAL (operands[2]) == 255 || INTVAL (operands[2]) == 65535)
2765    && !side_effects_p (operands[1])"
2766   "movu.%z2 %1,%0"
2767   [(set_attr "slottable" "yes,yes,no")])
2768
2769 (define_insn "*andsi_clear"
2770   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,Q,Q,To,To")
2771         (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0,0")
2772                 (match_operand:SI 2 "const_int_operand" "P,n,P,n,P,n")))]
2773   "(INTVAL (operands[2]) == -65536 || INTVAL (operands[2]) == -256)
2774    && !side_effects_p (operands[0])"
2775   "@
2776    cLear.b %0
2777    cLear.w %0
2778    cLear.b %0
2779    cLear.w %0
2780    cLear.b %0
2781    cLear.w %0"
2782   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
2783    (set_attr "cc" "none")])
2784
2785 ;; This is a catch-all pattern, taking care of everything that was not
2786 ;; matched in the insns above.
2787 ;;
2788 ;; Sidenote: the tightening from "nonimmediate_operand" to
2789 ;; "register_operand" for operand 1 actually increased the register
2790 ;; pressure (worse code).  That will hopefully change with an
2791 ;; improved reload pass.
2792
2793 (define_insn "*expanded_andsi_non_v32"
2794   [(set (match_operand:SI 0 "register_operand"         "=r,r,r, r,r")
2795         (and:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,r")
2796                 (match_operand:SI 2 "general_operand"   "I,r,Q>,g,!To")))]
2797   "!TARGET_V32"
2798   "@
2799    andq %2,%0
2800    and.d %2,%0
2801    and.d %2,%0
2802    and.d %2,%0
2803    and.d %2,%1,%0"
2804   [(set_attr "slottable" "yes,yes,yes,no,no")])
2805
2806 (define_insn "*expanded_andsi_v32"
2807   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
2808         (and:SI (match_operand:SI 1 "register_operand" "%0,0,0,0")
2809                 (match_operand:SI 2 "general_operand" "I,r,Q>,g")))]
2810   "TARGET_V32"
2811   "@
2812    andq %2,%0
2813    and.d %2,%0
2814    and.d %2,%0
2815    and.d %2,%0"
2816   [(set_attr "slottable" "yes,yes,yes,no")
2817    (set_attr "cc" "noov32")])
2818 \f
2819 ;; For both QI and HI we may use the quick patterns.  This results in
2820 ;; useless condition codes, but that is used rarely enough for it to
2821 ;; normally be a win (could check ahead for use of cc0, but seems to be
2822 ;; more pain than win).
2823
2824 ;; FIXME: See note for andsi3
2825
2826 (define_expand "andhi3"
2827   [(set (match_operand:HI 0 "nonimmediate_operand" "")
2828         (and:HI (match_operand:HI 1 "nonimmediate_operand" "")
2829                 (match_operand:HI 2 "general_operand"  "")))]
2830   ""
2831 {
2832   if (! (CONST_INT_P (operands[2])
2833          && (((INTVAL (operands[2]) == -256
2834                || INTVAL (operands[2]) == 65280)
2835               && rtx_equal_p (operands[1], operands[0]))
2836              || (INTVAL (operands[2]) == 255
2837                  && REG_P (operands[0])))))
2838     {
2839       /* See comment for andsi3.  */
2840       rtx reg0 = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (HImode);
2841       rtx reg1 = operands[1];
2842
2843       if (! REG_P (reg1))
2844         {
2845           emit_move_insn (reg0, reg1);
2846           reg1 = reg0;
2847         }
2848
2849       emit_insn (gen_rtx_SET (HImode, reg0,
2850                           gen_rtx_AND (HImode, reg1, operands[2])));
2851
2852       /* Make sure we get the right destination.  */
2853       if (! REG_P (operands[0]))
2854         emit_move_insn (operands[0], reg0);
2855
2856       DONE;
2857     }
2858 })
2859
2860 ;; Some fast andhi3 special cases.
2861
2862 (define_insn "*andhi_movu"
2863   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
2864         (and:HI (match_operand:HI 1 "nonimmediate_operand" "r,Q,To")
2865                 (const_int 255)))]
2866   "!side_effects_p (operands[1])"
2867   "mOvu.b %1,%0"
2868   [(set_attr "slottable" "yes,yes,no")])
2869
2870 (define_insn "*andhi_clear"
2871   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,Q,To")
2872         (and:HI (match_operand:HI 1 "nonimmediate_operand" "0,0,0")
2873                 (const_int -256)))]
2874   "!side_effects_p (operands[0])"
2875   "cLear.b %0"
2876   [(set_attr "slottable" "yes,yes,no")
2877    (set_attr "cc" "none")])
2878
2879 ;; Catch-all andhi3 pattern.
2880
2881 (define_insn "*expanded_andhi_non_v32"
2882   [(set (match_operand:HI 0 "register_operand"         "=r,r,r, r,r,r,r")
2883         (and:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r")
2884                 (match_operand:HI 2 "general_operand"   "I,r,Q>,L,O,g,!To")))]
2885
2886 ;; Sidenote: the tightening from "general_operand" to
2887 ;; "register_operand" for operand 1 actually increased the register
2888 ;; pressure (worse code).  That will hopefully change with an
2889 ;; improved reload pass.
2890
2891   "!TARGET_V32"
2892   "@
2893    andq %2,%0
2894    and.w %2,%0
2895    and.w %2,%0
2896    and.w %2,%0
2897    anDq %b2,%0
2898    and.w %2,%0
2899    and.w %2,%1,%0"
2900   [(set_attr "slottable" "yes,yes,yes,no,yes,no,no")
2901    (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")])
2902
2903 (define_insn "*expanded_andhi_v32"
2904   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r")
2905        (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0")
2906                (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g")))]
2907   "TARGET_V32"
2908   "@
2909    andq %2,%0
2910    and.w %2,%0
2911    and.w %2,%0
2912    and.w %2,%0
2913    anDq %b2,%0
2914    and.w %2,%0"
2915   [(set_attr "slottable" "yes,yes,yes,no,yes,no")
2916    (set_attr "cc" "clobber,noov32,noov32,noov32,clobber,noov32")])
2917
2918 ;; A strict_low_part pattern.
2919
2920 (define_insn "*andhi_lowpart_non_v32"
2921   [(set (strict_low_part
2922          (match_operand:HI 0 "register_operand"        "+r,r, r,r,r,r"))
2923         (and:HI (match_operand:HI 1 "register_operand" "%0,0, 0,0,0,r")
2924                 (match_operand:HI 2 "general_operand"   "r,Q>,L,O,g,!To")))]
2925   "!TARGET_V32"
2926   "@
2927    and.w %2,%0
2928    and.w %2,%0
2929    and.w %2,%0
2930    anDq %b2,%0
2931    and.w %2,%0
2932    and.w %2,%1,%0"
2933   [(set_attr "slottable" "yes,yes,no,yes,no,no")
2934    (set_attr "cc" "normal,normal,normal,clobber,normal,normal")])
2935
2936 (define_insn "*andhi_lowpart_v32"
2937   [(set (strict_low_part
2938          (match_operand:HI 0 "register_operand" "+r,r,r,r,r"))
2939         (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0")
2940                 (match_operand:HI 2 "general_operand" "r,Q>,L,O,g")))]
2941   "TARGET_V32"
2942   "@
2943    and.w %2,%0
2944    and.w %2,%0
2945    and.w %2,%0
2946    anDq %b2,%0
2947    and.w %2,%0"
2948   [(set_attr "slottable" "yes,yes,no,yes,no")
2949    (set_attr "cc" "noov32,noov32,noov32,clobber,noov32")])
2950 \f
2951 (define_expand "andqi3"
2952   [(set (match_operand:QI 0 "register_operand")
2953         (and:QI (match_operand:QI 1 "register_operand")
2954                (match_operand:QI 2 "general_operand")))]
2955   ""
2956   "")
2957
2958 (define_insn "*andqi3_non_v32"
2959   [(set (match_operand:QI 0 "register_operand"         "=r,r,r, r,r,r")
2960         (and:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r")
2961                 (match_operand:QI 2 "general_operand"   "I,r,Q>,O,g,!To")))]
2962   "!TARGET_V32"
2963   "@
2964    andq %2,%0
2965    and.b %2,%0
2966    and.b %2,%0
2967    andQ %b2,%0
2968    and.b %2,%0
2969    and.b %2,%1,%0"
2970   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
2971    (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")])
2972
2973 (define_insn "*andqi3_v32"
2974   [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r")
2975         (and:QI (match_operand:QI 1 "register_operand" "%0,0,0,0,0")
2976                 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g")))]
2977   "TARGET_V32"
2978   "@
2979    andq %2,%0
2980    and.b %2,%0
2981    and.b %2,%0
2982    andQ %b2,%0
2983    and.b %2,%0"
2984   [(set_attr "slottable" "yes,yes,yes,yes,no")
2985    (set_attr "cc" "clobber,noov32,noov32,clobber,noov32")])
2986
2987 (define_insn "*andqi_lowpart_non_v32"
2988   [(set (strict_low_part
2989          (match_operand:QI 0 "register_operand"        "+r,r, r,r,r"))
2990         (and:QI (match_operand:QI 1 "register_operand" "%0,0, 0,0,r")
2991                 (match_operand:QI 2 "general_operand"   "r,Q>,O,g,!To")))]
2992   "!TARGET_V32"
2993   "@
2994    and.b %2,%0
2995    and.b %2,%0
2996    andQ %b2,%0
2997    and.b %2,%0
2998    and.b %2,%1,%0"
2999   [(set_attr "slottable" "yes,yes,yes,no,no")
3000    (set_attr "cc" "normal,normal,clobber,normal,normal")])
3001
3002 (define_insn "*andqi_lowpart_v32"
3003   [(set (strict_low_part
3004          (match_operand:QI 0 "register_operand" "+r,r,r,r"))
3005         (and:QI (match_operand:QI 1 "register_operand" "%0,0,0,0")
3006                 (match_operand:QI 2 "general_operand" "r,Q>,O,g")))]
3007   "TARGET_V32"
3008   "@
3009    and.b %2,%0
3010    and.b %2,%0
3011    andQ %b2,%0
3012    and.b %2,%0"
3013   [(set_attr "slottable" "yes,yes,yes,no")
3014    (set_attr "cc" "noov32,noov32,clobber,noov32")])
3015 \f
3016 ;; Bitwise or.
3017
3018 ;; Same comment as anddi3 applies here - no need for such a pattern.
3019
3020 ;; It seems there's no need to jump through hoops to get good code such as
3021 ;; with andsi3.
3022
3023 (define_expand "ior<mode>3"
3024   [(set (match_operand:BWD 0 "register_operand")
3025         (ior:BWD (match_operand:BWD 1 "register_operand")
3026                  (match_operand:BWD 2 "general_operand")))]
3027   ""
3028   "")
3029
3030 (define_insn "*iorsi3_non_v32"
3031   [(set (match_operand:SI 0 "register_operand"         "=r,r,r, r,r,r")
3032         (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,0,r")
3033                 (match_operand:SI 2 "general_operand"  "I, r,Q>,n,g,!To")))]
3034   "!TARGET_V32"
3035   "@
3036    orq %2,%0
3037    or.d %2,%0
3038    or.d %2,%0
3039    oR.%s2 %2,%0
3040    or.d %2,%0
3041    or.d %2,%1,%0"
3042   [(set_attr "slottable" "yes,yes,yes,no,no,no")
3043    (set_attr "cc" "normal,normal,normal,clobber,normal,normal")])
3044
3045 (define_insn "*iorsi3_v32"
3046   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
3047         (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,0")
3048                 (match_operand:SI 2 "general_operand" "I,r,Q>,n,g")))]
3049   "TARGET_V32"
3050   "@
3051    orq %2,%0
3052    or.d %2,%0
3053    or.d %2,%0
3054    oR.%s2 %2,%0
3055    or.d %2,%0"
3056   [(set_attr "slottable" "yes,yes,yes,no,no")
3057    (set_attr "cc" "noov32,noov32,noov32,clobber,noov32")])
3058
3059 (define_insn "*iorhi3_non_v32"
3060   [(set (match_operand:HI 0 "register_operand"         "=r,r,r, r,r,r,r")
3061         (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r")
3062                 (match_operand:HI 2 "general_operand"   "I,r,Q>,L,O,g,!To")))]
3063   "!TARGET_V32"
3064   "@
3065    orq %2,%0
3066    or.w %2,%0
3067    or.w %2,%0
3068    or.w %2,%0
3069    oRq %b2,%0
3070    or.w %2,%0
3071    or.w %2,%1,%0"
3072   [(set_attr "slottable" "yes,yes,yes,no,yes,no,no")
3073    (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")])
3074
3075 (define_insn "*iorhi3_v32"
3076   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r")
3077         (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0")
3078                 (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g")))]
3079   "TARGET_V32"
3080   "@
3081    orq %2,%0
3082    or.w %2,%0
3083    or.w %2,%0
3084    or.w %2,%0
3085    oRq %b2,%0
3086    or.w %2,%0"
3087   [(set_attr "slottable" "yes,yes,yes,no,yes,no")
3088    (set_attr "cc" "clobber,noov32,noov32,noov32,clobber,noov32")])
3089
3090 (define_insn "*iorqi3_non_v32"
3091   [(set (match_operand:QI 0 "register_operand"         "=r,r,r, r,r,r")
3092         (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r")
3093                 (match_operand:QI 2 "general_operand"   "I,r,Q>,O,g,!To")))]
3094   "!TARGET_V32"
3095   "@
3096    orq %2,%0
3097    or.b %2,%0
3098    or.b %2,%0
3099    orQ %b2,%0
3100    or.b %2,%0
3101    or.b %2,%1,%0"
3102   [(set_attr "slottable" "yes,yes,yes,yes,no,no")
3103    (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")])
3104
3105 (define_insn "*iorqi3_v32"
3106   [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r")
3107         (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0,0,0")
3108                 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g")))]
3109   "TARGET_V32"
3110   "@
3111    orq %2,%0
3112    or.b %2,%0
3113    or.b %2,%0
3114    orQ %b2,%0
3115    or.b %2,%0"
3116   [(set_attr "slottable" "yes,yes,yes,yes,no")
3117    (set_attr "cc" "clobber,noov32,noov32,clobber,noov32")])
3118 \f
3119 ;; Exclusive-or
3120
3121 ;; See comment about "anddi3" for xordi3 - no need for such a pattern.
3122 ;; FIXME: Do we really need the shorter variants?
3123
3124 (define_insn "xorsi3"
3125   [(set (match_operand:SI 0 "register_operand" "=r")
3126         (xor:SI (match_operand:SI 1 "register_operand" "%0")
3127                 (match_operand:SI 2 "register_operand" "r")))]
3128   ""
3129   "xor %2,%0"
3130   [(set_attr "slottable" "yes")
3131    (set_attr "cc" "noov32")])
3132
3133 (define_insn "xor<mode>3"
3134   [(set (match_operand:BW 0 "register_operand" "=r")
3135         (xor:BW (match_operand:BW 1 "register_operand" "%0")
3136                 (match_operand:BW 2 "register_operand" "r")))]
3137   ""
3138   "xor %2,%0"
3139   [(set_attr "slottable" "yes")
3140    (set_attr "cc" "clobber")])
3141 \f
3142 ;; Negation insns.
3143
3144 ;; Questionable use, here mostly as a (slightly usable) define_expand
3145 ;; example.
3146
3147 (define_expand "negsf2"
3148   [(set (match_dup 2)
3149         (match_dup 3))
3150    (parallel [(set (match_operand:SF 0 "register_operand" "=r")
3151                    (neg:SF (match_operand:SF 1
3152                             "register_operand" "0")))
3153               (use (match_dup 2))])]
3154   ""
3155 {
3156   operands[2] = gen_reg_rtx (SImode);
3157   operands[3] = GEN_INT (1 << 31);
3158 })
3159
3160 (define_insn "*expanded_negsf2"
3161   [(set (match_operand:SF 0 "register_operand" "=r")
3162         (neg:SF (match_operand:SF 1 "register_operand" "0")))
3163    (use (match_operand:SI 2 "register_operand" "r"))]
3164   ""
3165   "xor %2,%0"
3166   [(set_attr "slottable" "yes")])
3167
3168 ;; No "negdi2" although we could make one up that may be faster than
3169 ;; the one in libgcc.
3170
3171 (define_insn "neg<mode>2"
3172   [(set (match_operand:BWD 0 "register_operand" "=r")
3173         (neg:BWD (match_operand:BWD 1 "register_operand" "r")))]
3174   ""
3175   "neg<m> %1,%0"
3176   [(set_attr "slottable" "yes")])
3177 \f
3178 ;; One-complements.
3179
3180 ;; See comment on anddi3 - no need for a DImode pattern.
3181 ;; See also xor comment.
3182
3183 (define_insn "one_cmplsi2"
3184   [(set (match_operand:SI 0 "register_operand" "=r")
3185         (not:SI (match_operand:SI 1 "register_operand" "0")))]
3186   ""
3187   "not %0"
3188   [(set_attr "slottable" "yes")
3189    (set_attr "cc" "noov32")])
3190
3191 (define_insn "one_cmpl<mode>2"
3192   [(set (match_operand:BW 0 "register_operand" "=r")
3193         (not:BW (match_operand:BW 1 "register_operand" "0")))]
3194   ""
3195   "not %0"
3196   [(set_attr "slottable" "yes")
3197    (set_attr "cc" "clobber")])
3198 \f
3199 ;; Arithmetic/Logical shift right (and SI left).
3200
3201 (define_insn "<shlr>si3"
3202   [(set (match_operand:SI 0 "register_operand" "=r")
3203         (shift:SI (match_operand:SI 1 "register_operand" "0")
3204                   (match_operand:SI 2 "nonmemory_operand" "Kcr")))]
3205   ""
3206 {
3207   if (REG_S_P (operands[2]))
3208     return "<slr>.d %2,%0";
3209
3210   return "<slr>q %2,%0";
3211 }
3212   [(set_attr "slottable" "yes")
3213    (set_attr "cc" "noov32")])
3214
3215 ;; Since gcc gets lost, and forgets to zero-extend the source (or mask
3216 ;; the destination) when it changes shifts of lower modes into SImode,
3217 ;; it is better to make these expands an anonymous patterns instead of
3218 ;; the more correct define_insns.  This occurs when gcc thinks that is
3219 ;; is better to widen to SImode and use immediate shift count.
3220
3221 ;; FIXME: Is this legacy or still true for gcc >= 2.7.2?
3222
3223 ;; FIXME: Can't parametrize sign_extend and zero_extend (before
3224 ;; mentioning "shiftrt"), so we need two patterns.
3225 (define_expand "ashr<mode>3"
3226   [(set (match_dup 3)
3227         (sign_extend:SI (match_operand:BW 1 "nonimmediate_operand" "")))
3228    (set (match_dup 4)
3229         (zero_extend:SI (match_operand:BW 2 "nonimmediate_operand" "")))
3230    (set (match_dup 5) (ashiftrt:SI (match_dup 3) (match_dup 4)))
3231    (set (match_operand:BW 0 "general_operand" "")
3232         (subreg:BW (match_dup 5) 0))]
3233   ""
3234 {
3235   int i;
3236
3237   for (i = 3; i < 6; i++)
3238     operands[i] = gen_reg_rtx (SImode);
3239 })
3240
3241 (define_expand "lshr<mode>3"
3242   [(set (match_dup 3)
3243         (zero_extend:SI (match_operand:BW 1 "nonimmediate_operand" "")))
3244    (set (match_dup 4)
3245         (zero_extend:SI (match_operand:BW 2 "nonimmediate_operand" "")))
3246    (set (match_dup 5) (lshiftrt:SI (match_dup 3) (match_dup 4)))
3247    (set (match_operand:BW 0 "general_operand" "")
3248         (subreg:BW (match_dup 5) 0))]
3249   ""
3250 {
3251   int i;
3252
3253   for (i = 3; i < 6; i++)
3254     operands[i] = gen_reg_rtx (SImode);
3255 })
3256
3257 (define_insn "*expanded_<shlr><mode>"
3258   [(set (match_operand:BW 0 "register_operand" "=r")
3259         (shiftrt:BW (match_operand:BW 1 "register_operand" "0")
3260                     (match_operand:BW 2 "register_operand" "r")))]
3261   ""
3262   "<slr><m> %2,%0"
3263   [(set_attr "slottable" "yes")
3264    (set_attr "cc" "noov32")])
3265
3266 (define_insn "*<shlr><mode>_lowpart"
3267   [(set (strict_low_part (match_operand:BW 0 "register_operand" "+r"))
3268         (shiftrt:BW (match_dup 0)
3269                     (match_operand:BW 1 "register_operand" "r")))]
3270   ""
3271   "<slr><m> %1,%0"
3272   [(set_attr "slottable" "yes")
3273    (set_attr "cc" "noov32")])
3274 \f
3275 ;; Arithmetic/logical shift left.
3276
3277 ;; For narrower modes than SI, we can use lslq although it makes cc
3278 ;; unusable.  The win is that we do not have to reload the shift-count
3279 ;; into a register.
3280
3281 (define_insn "ashl<mode>3"
3282   [(set (match_operand:BW 0 "register_operand" "=r,r")
3283         (ashift:BW (match_operand:BW 1 "register_operand" "0,0")
3284                    (match_operand:BW 2 "nonmemory_operand" "r,Kc")))]
3285   ""
3286 {
3287   return
3288     (CONST_INT_P (operands[2]) && INTVAL (operands[2]) > <nbitsm1>)
3289     ? "moveq 0,%0"
3290     : (CONSTANT_P (operands[2])
3291        ? "lslq %2,%0" : "lsl<m> %2,%0");
3292 }
3293   [(set_attr "slottable" "yes")
3294    (set_attr "cc" "noov32,clobber")])
3295
3296 ;; A strict_low_part matcher.
3297
3298 (define_insn "*ashl<mode>_lowpart"
3299   [(set (strict_low_part (match_operand:BW 0 "register_operand" "+r"))
3300         (ashift:BW (match_dup 0)
3301                    (match_operand:HI 1 "register_operand" "r")))]
3302   ""
3303   "lsl<m> %1,%0"
3304   [(set_attr "slottable" "yes")
3305    (set_attr "cc" "noov32")])
3306 \f
3307 ;; Various strange insns that gcc likes.
3308
3309 ;; Fortunately, it is simple to construct an abssf (although it may not
3310 ;; be very much used in practice).
3311
3312 (define_insn "abssf2"
3313   [(set (match_operand:SF 0 "register_operand" "=r")
3314         (abs:SF (match_operand:SF 1 "register_operand" "0")))]
3315   ""
3316   "lslq 1,%0\;lsrq 1,%0")
3317
3318 (define_insn "abssi2"
3319   [(set (match_operand:SI 0 "register_operand" "=r")
3320         (abs:SI (match_operand:SI 1 "register_operand" "r")))]
3321   ""
3322   "abs %1,%0"
3323   [(set_attr "slottable" "yes")
3324    (set_attr "cc" "noov32")])
3325
3326 ;; FIXME: GCC should be able to do these expansions itself.
3327
3328 (define_expand "abs<mode>2"
3329   [(set (match_dup 2)
3330         (sign_extend:SI (match_operand:BW 1 "general_operand" "")))
3331    (set (match_dup 3) (abs:SI (match_dup 2)))
3332    (set (match_operand:BW 0 "register_operand" "")
3333         (subreg:BW (match_dup 3) 0))]
3334   ""
3335   "operands[2] = gen_reg_rtx (SImode); operands[3] = gen_reg_rtx (SImode);")
3336
3337 (define_insn "clzsi2"
3338   [(set (match_operand:SI 0 "register_operand" "=r")
3339         (clz:SI (match_operand:SI 1 "register_operand" "r")))]
3340   "TARGET_HAS_LZ"
3341   "lz %1,%0"
3342   [(set_attr "slottable" "yes")
3343    (set_attr "cc" "noov32")])
3344
3345 (define_insn "bswapsi2"
3346   [(set (match_operand:SI 0 "register_operand" "=r")
3347         (bswap:SI (match_operand:SI 1 "register_operand" "0")))]
3348   "TARGET_HAS_SWAP"
3349   "swapwb %0"
3350   [(set_attr "slottable" "yes")
3351    (set_attr "cc" "noov32")])
3352
3353 ;; This instruction swaps all bits in a register.
3354 ;; That means that the most significant bit is put in the place
3355 ;; of the least significant bit, and so on.
3356
3357 (define_insn "cris_swap_bits"
3358   [(set (match_operand:SI 0 "register_operand" "=r")
3359         (unspec:SI [(match_operand:SI 1 "register_operand" "0")]
3360                    CRIS_UNSPEC_SWAP_BITS))]
3361   "TARGET_HAS_SWAP"
3362   "swapwbr %0"
3363   [(set_attr "slottable" "yes")
3364    (set_attr "cc" "noov32")])
3365
3366 ;; Implement ctz using two instructions, one for bit swap and one for clz.
3367 ;; Defines a scratch register to avoid clobbering input.
3368
3369 (define_expand "ctzsi2"
3370   [(set (match_dup 2)
3371         (match_operand:SI 1 "register_operand"))
3372    (set (match_dup 2)
3373         (unspec:SI [(match_dup 2)] CRIS_UNSPEC_SWAP_BITS))
3374    (set (match_operand:SI 0 "register_operand")
3375         (clz:SI (match_dup 2)))]
3376   "TARGET_HAS_LZ && TARGET_HAS_SWAP"
3377   "operands[2] = gen_reg_rtx (SImode);")
3378
3379 ;; Bound-insn.  Defined to be the same as an unsigned minimum, which is an
3380 ;; operation supported by gcc.  Used in casesi, but used now and then in
3381 ;; normal code too.
3382
3383 (define_expand "uminsi3"
3384   [(set (match_operand:SI 0 "register_operand" "")
3385         (umin:SI  (match_operand:SI 1 "register_operand" "")
3386                   (match_operand:SI 2 "general_operand" "")))]
3387   ""
3388 {
3389   if (MEM_P (operands[2]) && TARGET_V32)
3390     operands[2] = force_reg (SImode, operands[2]);
3391 })
3392
3393 (define_insn "*uminsi3_non_v32"
3394   [(set (match_operand:SI 0 "register_operand"           "=r,r, r,r")
3395         (umin:SI  (match_operand:SI 1 "register_operand" "%0,0, 0,r")
3396                   (match_operand:SI 2 "general_operand"   "r,Q>,g,!To")))]
3397   "!TARGET_V32"
3398 {
3399   if (CONST_INT_P (operands[2]))
3400     {
3401       /* Constant operands are zero-extended, so only 32-bit operands
3402          may be negative.  */
3403       if (INTVAL (operands[2]) >= 0)
3404         {
3405           if (INTVAL (operands[2]) < 256)
3406             return "bound.b %2,%0";
3407
3408           if (INTVAL (operands[2]) < 65536)
3409             return "bound.w %2,%0";
3410         }
3411     }
3412   else if (which_alternative == 3)
3413     return "bound.d %2,%1,%0";
3414
3415   return "bound.d %2,%0";
3416 }
3417  [(set_attr "slottable" "yes,yes,no,no")])
3418
3419 (define_insn "*uminsi3_v32"
3420   [(set (match_operand:SI 0 "register_operand" "=r,r")
3421         (umin:SI  (match_operand:SI 1 "register_operand" "%0,0")
3422                   (match_operand:SI 2 "nonmemory_operand" "r,i")))]
3423   "TARGET_V32"
3424 {
3425   if (GET_CODE (operands[2]) == CONST_INT)
3426     {
3427       /* Constant operands are zero-extended, so only 32-bit operands
3428          may be negative.  */
3429       if (INTVAL (operands[2]) >= 0)
3430         {
3431           if (INTVAL (operands[2]) < 256)
3432             return "bound.b %2,%0";
3433
3434           if (INTVAL (operands[2]) < 65536)
3435             return "bound.w %2,%0";
3436         }
3437     }
3438
3439   return "bound.d %2,%0";
3440 }
3441  [(set_attr "slottable" "yes,no")])
3442 \f
3443 ;; Jump and branch insns.
3444
3445 (define_insn "jump"
3446   [(set (pc)
3447         (label_ref (match_operand 0 "" "")))]
3448   ""
3449   "ba %l0%#"
3450   [(set_attr "slottable" "has_slot")])
3451
3452 ;; Testcase gcc.c-torture/compile/991213-3.c fails if we allow a constant
3453 ;; here, since the insn is not recognized as an indirect jump by
3454 ;; jmp_uses_reg_or_mem used by computed_jump_p.  Perhaps it is a kludge to
3455 ;; change from general_operand to nonimmediate_operand (at least the docs
3456 ;; should be changed), but then again the pattern is called indirect_jump.
3457 (define_expand "indirect_jump"
3458   [(set (pc) (match_operand:SI 0 "nonimmediate_operand"))]
3459   ""
3460 {
3461   if (TARGET_V32 && MEM_P (operands[0]))
3462     operands[0] = force_reg (SImode, operands[0]);
3463 })
3464
3465 (define_insn "*indirect_jump_non_v32"
3466   [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))]
3467   "!TARGET_V32"
3468   "jump %0")
3469
3470 (define_insn "*indirect_jump_v32"
3471   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
3472   "TARGET_V32"
3473   "jump %0%#"
3474   [(set_attr "slottable" "has_slot")])
3475
3476 ;; Return insn.  Used whenever the epilogue is very simple; if it is only
3477 ;; a single ret or jump [sp+].  No allocated stack space or saved
3478 ;; registers are allowed.
3479 ;; Note that for this pattern, although named, it is ok to check the
3480 ;; context of the insn in the test, not only compiler switches.
3481
3482 (define_expand "return"
3483   [(return)]
3484   "cris_simple_epilogue ()"
3485   "cris_expand_return (cris_return_address_on_stack ()); DONE;")
3486
3487 (define_insn "*return_expanded"
3488   [(return)]
3489   ""
3490 {
3491   return cris_return_address_on_stack_for_return ()
3492     ? "jump [$sp+]" : "ret%#";
3493 }
3494   [(set (attr "slottable")
3495         (if_then_else
3496          (ne (symbol_ref
3497               "(cris_return_address_on_stack_for_return ())")
3498              (const_int 0))
3499          (const_string "no")
3500          (const_string "has_return_slot")))])
3501
3502 (define_expand "prologue"
3503   [(const_int 0)]
3504   "TARGET_PROLOGUE_EPILOGUE"
3505   "cris_expand_prologue (); DONE;")
3506
3507 ;; Note that the (return) from the expander itself is always the last
3508 ;; insn in the epilogue.
3509 (define_expand "epilogue"
3510   [(const_int 0)]
3511   "TARGET_PROLOGUE_EPILOGUE"
3512   "cris_expand_epilogue (); DONE;")
3513 \f
3514 ;; Conditional branches.
3515
3516 (define_expand "cbranch<mode>4"
3517   [(set (cc0) (compare
3518                (match_operand:BWD 1 "nonimmediate_operand")
3519                (match_operand:BWD 2 "general_operand")))
3520    (set (pc)
3521         (if_then_else (match_operator 0 "ordered_comparison_operator"
3522                        [(cc0) (const_int 0)])
3523                       (label_ref (match_operand 3 "" ""))
3524                       (pc)))]
3525   ""
3526   "")
3527
3528 (define_expand "cbranchdi4"
3529   [(set (cc0)
3530         (compare (match_operand:DI 1 "nonimmediate_operand" "")
3531                  (match_operand:DI 2 "general_operand" "")))
3532    (set (pc)
3533         (if_then_else (match_operator 0 "ordered_comparison_operator"
3534                        [(cc0) (const_int 0)])
3535                       (label_ref (match_operand 3 "" ""))
3536                       (pc)))]
3537   ""
3538 {
3539   if (TARGET_V32 && !REG_P (operands[1]))
3540     operands[1] = force_reg (DImode, operands[1]);
3541   if (TARGET_V32 && MEM_P (operands[2]))
3542     operands[2] = force_reg (DImode, operands[2]);
3543 })
3544
3545
3546 ;; We suffer from the same overflow-bit-gets-in-the-way problem as
3547 ;; e.g. m68k, so we have to check if overflow bit is set on all "signed"
3548 ;; conditions.
3549
3550 (define_insn "b<ncond:code>"
3551   [(set (pc)
3552         (if_then_else (ncond (cc0)
3553                              (const_int 0))
3554                       (label_ref (match_operand 0 "" ""))
3555                       (pc)))]
3556   ""
3557   "b<CC> %l0%#"
3558   [(set_attr "slottable" "has_slot")])
3559
3560 (define_insn "b<ocond:code>"
3561   [(set (pc)
3562         (if_then_else (ocond (cc0)
3563                              (const_int 0))
3564                       (label_ref (match_operand 0 "" ""))
3565                       (pc)))]
3566   ""
3567 {
3568   return
3569     (cc_prev_status.flags & CC_NO_OVERFLOW)
3570     ? 0 : "b<CC> %l0%#";
3571 }
3572   [(set_attr "slottable" "has_slot")])
3573
3574 (define_insn "b<rcond:code>"
3575   [(set (pc)
3576         (if_then_else (rcond (cc0)
3577                              (const_int 0))
3578                       (label_ref (match_operand 0 "" ""))
3579                       (pc)))]
3580   ""
3581 {
3582   return
3583     (cc_prev_status.flags & CC_NO_OVERFLOW)
3584     ? "b<oCC> %l0%#" : "b<CC> %l0%#";
3585 }
3586   [(set_attr "slottable" "has_slot")])
3587 \f
3588 ;; Reversed anonymous patterns to the ones above, as mandated.
3589
3590 (define_insn "*b<ncond:code>_reversed"
3591   [(set (pc)
3592         (if_then_else (ncond (cc0)
3593                              (const_int 0))
3594                       (pc)
3595                       (label_ref (match_operand 0 "" ""))))]
3596   ""
3597   "b<rCC> %l0%#"
3598   [(set_attr "slottable" "has_slot")])
3599
3600 (define_insn "*b<ocond:code>_reversed"
3601   [(set (pc)
3602         (if_then_else (ocond (cc0)
3603                              (const_int 0))
3604                       (pc)
3605                       (label_ref (match_operand 0 "" ""))))]
3606   ""
3607 {
3608   return
3609     (cc_prev_status.flags & CC_NO_OVERFLOW)
3610     ? 0 : "b<rCC> %l0%#";
3611 }
3612   [(set_attr "slottable" "has_slot")])
3613
3614 (define_insn "*b<rcond:code>_reversed"
3615   [(set (pc)
3616         (if_then_else (rcond (cc0)
3617                              (const_int 0))
3618                       (pc)
3619                       (label_ref (match_operand 0 "" ""))))]
3620   ""
3621 {
3622   return
3623     (cc_prev_status.flags & CC_NO_OVERFLOW)
3624     ? "b<roCC> %l0%#" : "b<rCC> %l0%#";
3625 }
3626   [(set_attr "slottable" "has_slot")])
3627 \f
3628 ;; Set on condition: sCC.
3629
3630 (define_expand "cstoredi4"
3631   [(set (cc0) (compare
3632                (match_operand:DI 2 "nonimmediate_operand")
3633                (match_operand:DI 3 "general_operand")))
3634    (set (match_operand:SI 0 "register_operand")
3635         (match_operator:SI 1 "ordered_comparison_operator"
3636          [(cc0) (const_int 0)]))]
3637   ""
3638 {
3639   if (TARGET_V32 && !REG_P (operands[2]))
3640     operands[2] = force_reg (DImode, operands[2]);
3641   if (TARGET_V32 && MEM_P (operands[3]))
3642     operands[3] = force_reg (DImode, operands[3]);
3643 })
3644
3645 (define_expand "cstore<mode>4"
3646   [(set (cc0) (compare
3647                (match_operand:BWD 2 "nonimmediate_operand")
3648                (match_operand:BWD 3 "general_operand")))
3649    (set (match_operand:SI 0 "register_operand")
3650         (match_operator:SI 1 "ordered_comparison_operator"
3651          [(cc0) (const_int 0)]))]
3652   ""
3653   "")
3654
3655 ;; Like bCC, we have to check the overflow bit for
3656 ;; signed conditions.
3657
3658 (define_insn "s<ncond:code>"
3659   [(set (match_operand:SI 0 "register_operand" "=r")
3660         (ncond:SI (cc0) (const_int 0)))]
3661   ""
3662   "s<CC> %0"
3663   [(set_attr "slottable" "yes")
3664    (set_attr "cc" "none")])
3665
3666 (define_insn "s<rcond:code>"
3667   [(set (match_operand:SI 0 "register_operand" "=r")
3668         (rcond:SI (cc0) (const_int 0)))]
3669   ""
3670 {
3671   return
3672     (cc_prev_status.flags & CC_NO_OVERFLOW)
3673     ? "s<oCC> %0" : "s<CC> %0";
3674 }
3675   [(set_attr "slottable" "yes")
3676    (set_attr "cc" "none")])
3677
3678 (define_insn "s<ocond:code>"
3679   [(set (match_operand:SI 0 "register_operand" "=r")
3680         (ocond:SI (cc0) (const_int 0)))]
3681   ""
3682 {
3683   return
3684     (cc_prev_status.flags & CC_NO_OVERFLOW)
3685     ? 0 : "s<CC> %0";
3686 }
3687   [(set_attr "slottable" "yes")
3688    (set_attr "cc" "none")])
3689 \f
3690 ;; Call insns.
3691
3692 ;; We need to make these patterns "expand", since the real operand is
3693 ;; hidden in a (mem:QI ) inside operand[0] (call_value: operand[1]),
3694 ;; and cannot be checked if it were a "normal" pattern.
3695 ;;  Note that "call" and "call_value" are *always* called with a
3696 ;; mem-operand for operand 0 and 1 respective.  What happens for combined
3697 ;; instructions is a different issue.
3698
3699 (define_expand "call"
3700   [(parallel [(call (match_operand:QI 0 "cris_mem_call_operand" "")
3701                     (match_operand 1 "general_operand" ""))
3702               (clobber (reg:SI CRIS_SRP_REGNUM))])]
3703   ""
3704 {
3705   gcc_assert (MEM_P (operands[0]));
3706   if (flag_pic)
3707     cris_expand_pic_call_address (&operands[0]);
3708 })
3709
3710 ;; Accept *anything* as operand 1.  Accept operands for operand 0 in
3711 ;; order of preference.
3712
3713 (define_insn "*expanded_call_non_v32"
3714   [(call (mem:QI (match_operand:SI 0 "general_operand" "r,Q>,g"))
3715          (match_operand 1 "" ""))
3716    (clobber (reg:SI CRIS_SRP_REGNUM))]
3717   "!TARGET_V32"
3718   "jsr %0")
3719
3720 (define_insn "*expanded_call_v32"
3721   [(call
3722     (mem:QI
3723      (match_operand:SI 0 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i"))
3724     (match_operand 1 "" ""))
3725    (clobber (reg:SI CRIS_SRP_REGNUM))]
3726   "TARGET_V32"
3727   "@
3728    jsr %0%#
3729    jsr %0%#
3730    bsr %0%#
3731    bsr %0%#"
3732   [(set_attr "slottable" "has_call_slot")])
3733
3734 ;; Parallel when calculating and reusing address of indirect pointer
3735 ;; with simple offset.  (Makes most sense with PIC.)  It looks a bit
3736 ;; wrong not to have the clobber last, but that's the way combine
3737 ;; generates it (except it doesn' look into the *inner* mem, so this
3738 ;; just matches a peephole2).  FIXME: investigate that.
3739 (define_insn "*expanded_call_side"
3740   [(call (mem:QI
3741           (mem:SI
3742            (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,  r,r")
3743                     (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn"))))
3744          (match_operand 2 "" ""))
3745    (clobber (reg:SI CRIS_SRP_REGNUM))
3746    (set (match_operand:SI 3 "register_operand" "=*0,r,r")
3747         (plus:SI (match_dup 0)
3748                  (match_dup 1)))]
3749   "!TARGET_AVOID_GOTPLT && !TARGET_V32"
3750   "jsr [%3=%0%S1]")
3751
3752 (define_expand "call_value"
3753   [(parallel [(set (match_operand 0 "" "")
3754                    (call (match_operand:QI 1 "cris_mem_call_operand" "")
3755                          (match_operand 2 "" "")))
3756               (clobber (reg:SI CRIS_SRP_REGNUM))])]
3757   ""
3758 {
3759   gcc_assert (MEM_P (operands[1]));
3760   if (flag_pic)
3761     cris_expand_pic_call_address (&operands[1]);
3762 })
3763
3764 ;; Accept *anything* as operand 2.  The validity other than "general" of
3765 ;; operand 0 will be checked elsewhere.  Accept operands for operand 1 in
3766 ;; order of preference (Q includes r, but r is shorter, faster).
3767 ;;  We also accept a PLT symbol.  We output it as [rPIC+sym:GOTPLT] rather
3768 ;; than requiring getting rPIC + sym:PLT into a register.
3769
3770 (define_insn "*expanded_call_value_non_v32"
3771   [(set (match_operand 0 "nonimmediate_operand" "=g,g,g")
3772         (call (mem:QI (match_operand:SI 1 "general_operand" "r,Q>,g"))
3773               (match_operand 2 "" "")))
3774    (clobber (reg:SI CRIS_SRP_REGNUM))]
3775   "!TARGET_V32"
3776   "Jsr %1"
3777   [(set_attr "cc" "clobber")])
3778
3779 ;; See similar call special-case.
3780 (define_insn "*expanded_call_value_side"
3781   [(set (match_operand 0 "nonimmediate_operand" "=g,g,g")
3782         (call
3783          (mem:QI
3784           (mem:SI
3785            (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r,  r,r")
3786                     (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn"))))
3787               (match_operand 3 "" "")))
3788    (clobber (reg:SI CRIS_SRP_REGNUM))
3789    (set (match_operand:SI 4 "register_operand" "=*1,r,r")
3790         (plus:SI (match_dup 1)
3791                  (match_dup 2)))]
3792   "!TARGET_AVOID_GOTPLT && !TARGET_V32"
3793   "Jsr [%4=%1%S2]"
3794   [(set_attr "cc" "clobber")])
3795
3796 (define_insn "*expanded_call_value_v32"
3797   [(set
3798     (match_operand 0 "nonimmediate_operand" "=g,g,g,g")
3799     (call
3800      (mem:QI
3801       (match_operand:SI 1 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i"))
3802      (match_operand 2 "" "")))
3803    (clobber (reg:SI 16))]
3804   "TARGET_V32"
3805   "@
3806    Jsr %1%#
3807    Jsr %1%#
3808    Bsr %1%#
3809    Bsr %1%#"
3810   [(set_attr "cc" "clobber")
3811    (set_attr "slottable" "has_call_slot")])
3812
3813 ;; Used in debugging.  No use for the direct pattern; unfilled
3814 ;; delayed-branches are taken care of by other means.
3815
3816 (define_insn "nop"
3817   [(const_int 0)]
3818   ""
3819   "nop"
3820   [(set_attr "cc" "none")])
3821 \f
3822 ;; We need to stop accesses to the stack after the memory is
3823 ;; deallocated.  Unfortunately, reorg doesn't look at naked clobbers,
3824 ;; e.g. (insn ... (clobber (mem:BLK (stack_pointer_rtx)))) and we don't
3825 ;; want to use a naked (unspec_volatile) as that would stop any
3826 ;; scheduling in the epilogue.  Hence we model it as a "real" insn that
3827 ;; sets the memory in an unspecified manner.  FIXME: Unfortunately it
3828 ;; still has the effect of an unspec_volatile.
3829 (define_insn "cris_frame_deallocated_barrier"
3830   [(set (mem:BLK (reg:SI CRIS_SP_REGNUM))
3831         (unspec:BLK [(const_int 0)] CRIS_UNSPEC_FRAME_DEALLOC))]
3832   ""
3833   ""
3834   [(set_attr "length" "0")])
3835
3836 ;; We expand on casesi so we can use "bound" and "add offset fetched from
3837 ;; a table to pc" (adds.w [pc+%0.w],pc).
3838
3839 ;; Note: if you change the "parallel" (or add anything after it) in
3840 ;; this expansion, you must change the macro ASM_OUTPUT_CASE_END
3841 ;; accordingly, to add the default case at the end of the jump-table.
3842
3843 (define_expand "cris_casesi_non_v32"
3844   [(set (match_dup 5) (match_operand:SI 0 "general_operand" ""))
3845    (set (match_dup 6)
3846         (minus:SI (match_dup 5)
3847                   (match_operand:SI 1 "const_int_operand" "n")))
3848    (set (match_dup 7)
3849         (umin:SI (match_dup 6)
3850                  (match_operand:SI 2 "const_int_operand" "n")))
3851    (parallel
3852     [(set (pc)
3853           (if_then_else
3854            (ltu (match_dup 7) (match_dup 2))
3855            (plus:SI (sign_extend:SI
3856                      (mem:HI
3857                       (plus:SI (mult:SI (match_dup 7) (const_int 2))
3858                                (pc))))
3859                     (pc))
3860            (label_ref (match_operand 4 "" ""))))
3861      (use (label_ref (match_operand 3 "" "")))])]
3862   ""
3863 {
3864   operands[2] = plus_constant (operands[2], 1);
3865   operands[5] = gen_reg_rtx (SImode);
3866   operands[6] = gen_reg_rtx (SImode);
3867   operands[7] = gen_reg_rtx (SImode);
3868 })
3869
3870 ;; FIXME: Check effect of not JUMP_TABLES_IN_TEXT_SECTION.
3871 (define_expand "cris_casesi_v32"
3872   [(set (match_dup 5) (match_operand:SI 0 "general_operand"))
3873    (set (match_dup 6)
3874        (minus:SI (match_dup 5)
3875                  (match_operand:SI 1 "const_int_operand")))
3876    (set (match_dup 7)
3877        (umin:SI (match_dup 6)
3878                 (match_operand:SI 2 "const_int_operand")))
3879    (set (match_dup 8) (match_dup 11))
3880    (set (match_dup 9)
3881        (plus:SI (mult:SI (match_dup 7) (const_int 2))
3882                 (match_dup 8)))
3883    (set (match_dup 10)
3884        (plus:SI (sign_extend:SI (mem:HI (match_dup 9)))
3885                 (match_dup 9)))
3886    (parallel
3887     [(set (pc)
3888          (if_then_else
3889           (ltu (unspec [(const_int 0)] CRIS_UNSPEC_CASESI) (match_dup 2))
3890           (match_dup 10)
3891           (label_ref (match_operand 4 "" ""))))
3892      (use (label_ref (match_dup 3)))])]
3893   "TARGET_V32"
3894 {
3895   int i;
3896   rtx xlabel = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
3897   for (i = 5; i <= 10; i++)
3898     operands[i] = gen_reg_rtx (SImode);
3899   operands[2] = plus_constant (operands[2], 1);
3900
3901   /* Don't forget to decorate labels too, for PIC.  */
3902   operands[11] = flag_pic
3903     ? gen_rtx_CONST (Pmode,
3904                     gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xlabel),
3905                                     CRIS_UNSPEC_PCREL))
3906     : xlabel;
3907 })
3908
3909 (define_expand "casesi"
3910   [(match_operand:SI 0 "general_operand")
3911    (match_operand:SI 1 "const_int_operand")
3912    (match_operand:SI 2 "const_int_operand")
3913    (match_operand 3 "" "")
3914    (match_operand 4 "" "")]
3915   ""
3916 {
3917   if (TARGET_V32)
3918     emit_insn (gen_cris_casesi_v32 (operands[0], operands[1], operands[2],
3919                                     operands[3], operands[4]));
3920   else
3921     emit_insn (gen_cris_casesi_non_v32 (operands[0], operands[1], operands[2],
3922                                         operands[3], operands[4]));
3923   DONE;
3924 })
3925 \f
3926 ;; Split-patterns.  Some of them have modes unspecified.  This
3927 ;; should always be ok; if for no other reason sparc.md has it as
3928 ;; well.
3929 ;;
3930 ;; When register_operand is specified for an operand, we can get a
3931 ;; subreg as well (Axis-990331), so don't just assume that REG_P is true
3932 ;; for a register_operand and that REGNO can be used as is.  It is best to
3933 ;; guard with REG_P, unless it is worth it to adjust for the subreg case.
3934
3935 ;; op [rx + 0],ry,rz
3936 ;; The index to rx is optimized into zero, and gone.
3937
3938 ;; First, recognize bound [rx],ry,rz; where [rx] is zero-extended,
3939 ;; and add/sub [rx],ry,rz, with zero or sign-extend on [rx].
3940 ;; Split this into:
3941 ;;  move ry,rz
3942 ;;  op [rx],rz
3943 ;; Lose if rz=ry or rx=rz.
3944 ;; Call this op-extend-split.
3945 ;; Do not match for V32; the addo and addi shouldn't be split
3946 ;; up.
3947
3948 (define_split
3949   [(set (match_operand 0 "register_operand" "")
3950         (match_operator
3951          4 "cris_operand_extend_operator"
3952          [(match_operand 1 "register_operand" "")
3953           (match_operator
3954            3 "cris_extend_operator"
3955            [(match_operand 2 "memory_operand" "")])]))]
3956   "!TARGET_V32
3957    && REG_P (operands[0])
3958    && REG_P (operands[1])
3959    && REGNO (operands[1]) != REGNO (operands[0])
3960    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
3961    && REG_P (XEXP (operands[2], 0))
3962    && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])"
3963   [(set (match_dup 0)
3964         (match_dup 1))
3965    (set (match_dup 0)
3966         (match_op_dup
3967          4 [(match_dup 0)
3968             (match_op_dup 3 [(match_dup 2)])]))]
3969   "")
3970
3971 ;; As op-extend-split, but recognize and split op [rz],ry,rz into
3972 ;;  ext [rz],rz
3973 ;;  op ry,rz
3974 ;; Do this for plus or bound only, being commutative operations, since we
3975 ;; have swapped the operands.
3976 ;; Call this op-extend-split-rx=rz
3977
3978 (define_split
3979   [(set (match_operand 0 "register_operand" "")
3980         (match_operator
3981          4 "cris_plus_or_bound_operator"
3982          [(match_operand 1 "register_operand" "")
3983           (match_operator
3984            3 "cris_extend_operator"
3985            [(match_operand 2 "memory_operand" "")])]))]
3986   "!TARGET_V32
3987    && REG_P (operands[0])
3988    && REG_P (operands[1])
3989    && REGNO (operands[1]) != REGNO (operands[0])
3990    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
3991    && REG_P (XEXP (operands[2], 0))
3992    && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])"
3993   [(set (match_dup 0)
3994         (match_op_dup 3 [(match_dup 2)]))
3995    (set (match_dup 0)
3996         (match_op_dup
3997          4 [(match_dup 0)
3998             (match_dup 1)]))]
3999   "")
4000
4001 ;; As the op-extend-split, but swapped operands, and only for
4002 ;; plus or bound, being the commutative extend-operators.  FIXME: Why is
4003 ;; this needed?  Is it?
4004 ;; Call this op-extend-split-swapped
4005
4006 (define_split
4007   [(set (match_operand 0 "register_operand" "")
4008         (match_operator
4009          4 "cris_plus_or_bound_operator"
4010          [(match_operator
4011            3 "cris_extend_operator"
4012            [(match_operand 2 "memory_operand" "")])
4013           (match_operand 1 "register_operand" "")]))]
4014   "!TARGET_V32
4015    && REG_P (operands[0])
4016    && REG_P (operands[1])
4017    && REGNO (operands[1]) != REGNO (operands[0])
4018    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4019    && REG_P (XEXP (operands[2], 0))
4020    && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])"
4021   [(set (match_dup 0)
4022         (match_dup 1))
4023    (set (match_dup 0)
4024         (match_op_dup
4025          4 [(match_dup 0)
4026             (match_op_dup 3 [(match_dup 2)])]))]
4027   "")
4028
4029 ;; As op-extend-split-rx=rz, but swapped operands, only for plus or
4030 ;; bound.  Call this op-extend-split-swapped-rx=rz.
4031
4032 (define_split
4033   [(set (match_operand 0 "register_operand" "")
4034         (match_operator
4035          4 "cris_plus_or_bound_operator"
4036          [(match_operator
4037            3 "cris_extend_operator"
4038            [(match_operand 2 "memory_operand" "")])
4039           (match_operand 1 "register_operand" "")]))]
4040   "!TARGET_V32
4041    && REG_P (operands[0])
4042    && REG_P (operands[1])
4043    && REGNO (operands[1]) != REGNO (operands[0])
4044    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4045    && REG_P (XEXP (operands[2], 0))
4046    && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])"
4047   [(set (match_dup 0)
4048         (match_op_dup 3 [(match_dup 2)]))
4049    (set (match_dup 0)
4050         (match_op_dup
4051          4 [(match_dup 0)
4052             (match_dup 1)]))]
4053   "")
4054
4055 ;; As op-extend-split, but the mem operand is not extended.
4056 ;;
4057 ;; op [rx],ry,rz changed into
4058 ;;  move ry,rz
4059 ;;  op [rx],rz
4060 ;; lose if ry=rz or rx=rz
4061 ;; Call this op-extend.
4062
4063 (define_split
4064   [(set (match_operand 0 "register_operand" "")
4065         (match_operator
4066          3 "cris_orthogonal_operator"
4067          [(match_operand 1 "register_operand" "")
4068           (match_operand 2 "memory_operand" "")]))]
4069   "!TARGET_V32
4070    && REG_P (operands[0])
4071    && REG_P (operands[1])
4072    && REGNO (operands[1]) != REGNO (operands[0])
4073    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4074    && REG_P (XEXP (operands[2], 0))
4075    && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])"
4076   [(set (match_dup 0)
4077         (match_dup 1))
4078    (set (match_dup 0)
4079         (match_op_dup
4080          3 [(match_dup 0)
4081             (match_dup 2)]))]
4082   "")
4083
4084 ;; As op-extend-split-rx=rz, non-extended.
4085 ;; Call this op-split-rx=rz
4086
4087 (define_split
4088   [(set (match_operand 0 "register_operand" "")
4089         (match_operator
4090          3 "cris_commutative_orth_op"
4091          [(match_operand 2 "memory_operand" "")
4092           (match_operand 1 "register_operand" "")]))]
4093   "!TARGET_V32
4094    && REG_P (operands[0])
4095    && REG_P (operands[1])
4096    && REGNO (operands[1]) != REGNO (operands[0])
4097    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4098    && REG_P (XEXP (operands[2], 0))
4099    && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])"
4100   [(set (match_dup 0)
4101         (match_dup 1))
4102    (set (match_dup 0)
4103         (match_op_dup
4104          3 [(match_dup 0)
4105             (match_dup 2)]))]
4106   "")
4107
4108 ;; As op-extend-split-swapped, nonextended.
4109 ;; Call this op-split-swapped.
4110
4111 (define_split
4112   [(set (match_operand 0 "register_operand" "")
4113         (match_operator
4114          3 "cris_commutative_orth_op"
4115          [(match_operand 1 "register_operand" "")
4116           (match_operand 2 "memory_operand" "")]))]
4117   "!TARGET_V32
4118    && REG_P (operands[0]) && REG_P (operands[1])
4119    && REGNO (operands[1]) != REGNO (operands[0])
4120    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4121    && REG_P (XEXP (operands[2], 0))
4122    && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])"
4123   [(set (match_dup 0)
4124         (match_dup 2))
4125    (set (match_dup 0)
4126         (match_op_dup
4127          3 [(match_dup 0)
4128             (match_dup 1)]))]
4129   "")
4130
4131 ;; As op-extend-split-swapped-rx=rz, non-extended.
4132 ;; Call this op-split-swapped-rx=rz.
4133
4134 (define_split
4135   [(set (match_operand 0 "register_operand" "")
4136         (match_operator
4137          3 "cris_orthogonal_operator"
4138          [(match_operand 2 "memory_operand" "")
4139           (match_operand 1 "register_operand" "")]))]
4140   "!TARGET_V32
4141    && REG_P (operands[0]) && REG_P (operands[1])
4142    && REGNO (operands[1]) != REGNO (operands[0])
4143    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4144    && REG_P (XEXP (operands[2], 0))
4145    && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])"
4146   [(set (match_dup 0)
4147         (match_dup 2))
4148    (set (match_dup 0)
4149         (match_op_dup
4150          3 [(match_dup 0)
4151             (match_dup 1)]))]
4152   "")
4153 \f
4154 ;; Splits for all cases in side-effect insns where (possibly after reload
4155 ;; and register allocation) rx and ry in [rx=ry+i] are equal.
4156
4157 ;; move.S1 [rx=rx+rz.S2],ry
4158
4159 (define_split
4160   [(parallel
4161     [(set (match_operand 0 "register_operand" "")
4162           (match_operator
4163            6 "cris_mem_op"
4164            [(plus:SI
4165              (mult:SI (match_operand:SI 1 "register_operand" "")
4166                       (match_operand:SI 2 "const_int_operand" ""))
4167              (match_operand:SI 3 "register_operand" ""))]))
4168      (set (match_operand:SI 4 "register_operand" "")
4169           (plus:SI (mult:SI (match_dup 1)
4170                             (match_dup 2))
4171                     (match_dup 3)))])]
4172   "REG_P (operands[3]) && REG_P (operands[4])
4173    && REGNO (operands[3]) == REGNO (operands[4])"
4174   [(set (match_dup 4) (plus:SI (mult:SI (match_dup 1) (match_dup 2))
4175                                (match_dup 3)))
4176    (set (match_dup 0) (match_dup 5))]
4177   "operands[5] = replace_equiv_address (operands[6], operands[3]);")
4178
4179 ;; move.S1 [rx=rx+i],ry
4180
4181 (define_split
4182   [(parallel
4183     [(set (match_operand 0 "register_operand" "")
4184           (match_operator
4185            5 "cris_mem_op"
4186            [(plus:SI (match_operand:SI 1 "cris_bdap_operand" "")
4187                      (match_operand:SI 2 "cris_bdap_operand" ""))]))
4188      (set (match_operand:SI 3 "register_operand" "")
4189            (plus:SI (match_dup 1)
4190                     (match_dup 2)))])]
4191   "(rtx_equal_p (operands[3], operands[1])
4192     || rtx_equal_p (operands[3], operands[2]))"
4193   [(set (match_dup 3) (plus:SI (match_dup 1) (match_dup 2)))
4194    (set (match_dup 0) (match_dup 4))]
4195 {
4196   operands[4] = replace_equiv_address (operands[5], operands[3]);
4197   cris_order_for_addsi3 (operands, 1);
4198 })
4199
4200 ;; move.S1 ry,[rx=rx+rz.S2]
4201
4202 (define_split
4203   [(parallel
4204     [(set (match_operator
4205            6 "cris_mem_op"
4206            [(plus:SI
4207              (mult:SI (match_operand:SI 0 "register_operand" "")
4208                       (match_operand:SI 1 "const_int_operand" ""))
4209              (match_operand:SI 2 "register_operand" ""))])
4210           (match_operand 3 "register_operand" ""))
4211      (set (match_operand:SI 4 "register_operand" "")
4212            (plus:SI (mult:SI (match_dup 0)
4213                              (match_dup 1))
4214                     (match_dup 2)))])]
4215   "REG_P (operands[2]) && REG_P (operands[4])
4216    && REGNO (operands[4]) == REGNO (operands[2])"
4217   [(set (match_dup 4) (plus:SI (mult:SI (match_dup 0) (match_dup 1))
4218                                 (match_dup 2)))
4219    (set (match_dup 5) (match_dup 3))]
4220   "operands[5] = replace_equiv_address (operands[6], operands[4]);")
4221
4222 ;; move.S1 ry,[rx=rx+i]
4223
4224 (define_split
4225   [(parallel
4226     [(set (match_operator
4227            6 "cris_mem_op"
4228            [(plus:SI (match_operand:SI 0 "cris_bdap_operand" "")
4229                      (match_operand:SI 1 "cris_bdap_operand" ""))])
4230           (match_operand 2 "register_operand" ""))
4231      (set (match_operand:SI 3 "register_operand" "")
4232            (plus:SI (match_dup 0)
4233                    (match_dup 1)))])]
4234   "(rtx_equal_p (operands[3], operands[0])
4235     || rtx_equal_p (operands[3], operands[1]))"
4236   [(set (match_dup 3) (plus:SI (match_dup 0) (match_dup 1)))
4237    (set (match_dup 5) (match_dup 2))]
4238 {
4239   operands[5] = replace_equiv_address (operands[6], operands[3]);
4240   cris_order_for_addsi3 (operands, 0);
4241 })
4242
4243 ;; clear.[bwd] [rx=rx+rz.S2]
4244
4245 (define_split
4246   [(parallel
4247     [(set (mem:BWD (plus:SI
4248                     (mult:SI (match_operand:SI 0 "register_operand" "")
4249                              (match_operand:SI 1 "const_int_operand" ""))
4250                     (match_operand:SI 2 "register_operand" "")))
4251            (const_int 0))
4252      (set (match_operand:SI 3 "register_operand" "")
4253            (plus:SI (mult:SI (match_dup 0)
4254                              (match_dup 1))
4255                     (match_dup 2)))])]
4256   "REG_P (operands[2]) && REG_P (operands[3])
4257    && REGNO (operands[3]) == REGNO (operands[2])"
4258   [(set (match_dup 3) (plus:SI (mult:SI (match_dup 0) (match_dup 1))
4259                                 (match_dup 2)))
4260    (set (mem:BWD (match_dup 3)) (const_int 0))]
4261   "")
4262
4263 ;; clear.[bwd] [rx=rx+i]
4264
4265 (define_split
4266   [(parallel
4267     [(set (mem:BWD
4268            (plus:SI (match_operand:SI 0 "cris_bdap_operand" "")
4269                     (match_operand:SI 1 "cris_bdap_operand" "")))
4270            (const_int 0))
4271      (set (match_operand:SI 2 "register_operand" "")
4272            (plus:SI (match_dup 0)
4273                     (match_dup 1)))])]
4274   "(rtx_equal_p (operands[0], operands[2])
4275     || rtx_equal_p (operands[2], operands[1]))"
4276   [(set (match_dup 2) (plus:SI (match_dup 0) (match_dup 1)))
4277    (set (mem:BWD (match_dup 2)) (const_int 0))]
4278   "cris_order_for_addsi3 (operands, 0);")
4279
4280 ;; mov(s|u).S1 [rx=rx+rz.S2],ry
4281
4282 (define_split
4283   [(parallel
4284     [(set (match_operand 0 "register_operand" "")
4285           (match_operator
4286             5 "cris_extend_operator"
4287             [(mem (plus:SI
4288                    (mult:SI (match_operand:SI 1 "register_operand" "")
4289                             (match_operand:SI 2 "const_int_operand" ""))
4290                    (match_operand:SI 3 "register_operand" "")))]))
4291      (set (match_operand:SI 4 "register_operand" "")
4292            (plus:SI (mult:SI (match_dup 1)
4293                              (match_dup 2))
4294                     (match_dup 3)))])]
4295   "REG_P (operands[3])
4296    && REG_P (operands[4])
4297    && REGNO (operands[3]) == REGNO (operands[4])"
4298   [(set (match_dup 4) (plus:SI (mult:SI (match_dup 1) (match_dup 2))
4299                                 (match_dup 3)))
4300    (set (match_dup 0) (match_op_dup 5 [(match_dup 6)]))]
4301   "operands[6] = replace_equiv_address (XEXP (operands[5], 0), operands[4]);")
4302
4303 ;; mov(s|u).S1 [rx=rx+i],ry
4304
4305 (define_split
4306   [(parallel
4307     [(set (match_operand 0 "register_operand" "")
4308           (match_operator
4309             4 "cris_extend_operator"
4310             [(mem (plus:SI
4311                    (match_operand:SI 1 "cris_bdap_operand" "")
4312                    (match_operand:SI 2 "cris_bdap_operand" "")))]))
4313      (set (match_operand:SI 3 "register_operand" "")
4314            (plus:SI (match_dup 1)
4315                     (match_dup 2)))])]
4316   "(rtx_equal_p (operands[1], operands[3])
4317     || rtx_equal_p (operands[2], operands[3]))"
4318   [(set (match_dup 3) (plus:SI (match_dup 1) (match_dup 2)))
4319    (set (match_dup 0) (match_op_dup 4 [(match_dup 5)]))]
4320 {
4321   operands[5] = replace_equiv_address (XEXP (operands[4], 0), operands[3]);
4322   cris_order_for_addsi3 (operands, 1);
4323 })
4324
4325 ;; op.S1 [rx=rx+i],ry
4326
4327 (define_split
4328   [(parallel
4329     [(set (match_operand 0 "register_operand" "")
4330           (match_operator
4331             5 "cris_orthogonal_operator"
4332             [(match_operand 1 "register_operand" "")
4333              (mem (plus:SI
4334                    (match_operand:SI 2 "cris_bdap_operand" "")
4335                    (match_operand:SI 3 "cris_bdap_operand" "")))]))
4336      (set (match_operand:SI 4 "register_operand" "")
4337            (plus:SI (match_dup 2)
4338                     (match_dup 3)))])]
4339   "(rtx_equal_p (operands[4], operands[2])
4340     || rtx_equal_p (operands[4], operands[3]))"
4341   [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3)))
4342    (set (match_dup 0) (match_op_dup 5 [(match_dup 1) (match_dup 6)]))]
4343 {
4344   operands[6] = replace_equiv_address (XEXP (operands[5], 1), operands[4]);
4345   cris_order_for_addsi3 (operands, 2);
4346 })
4347
4348 ;; op.S1 [rx=rx+rz.S2],ry
4349
4350 (define_split
4351   [(parallel
4352     [(set (match_operand 0 "register_operand" "")
4353           (match_operator
4354             6 "cris_orthogonal_operator"
4355             [(match_operand 1 "register_operand" "")
4356              (mem (plus:SI
4357                    (mult:SI (match_operand:SI 2 "register_operand" "")
4358                             (match_operand:SI 3 "const_int_operand" ""))
4359                    (match_operand:SI 4 "register_operand" "")))]))
4360      (set (match_operand:SI 5 "register_operand" "")
4361            (plus:SI (mult:SI (match_dup 2)
4362                              (match_dup 3))
4363                    (match_dup 4)))])]
4364   "REG_P (operands[4])
4365    && REG_P (operands[5])
4366    && REGNO (operands[5]) == REGNO (operands[4])"
4367   [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3))
4368                                 (match_dup 4)))
4369    (set (match_dup 0) (match_op_dup 6 [(match_dup 1) (match_dup 7)]))]
4370   "operands[7] = replace_equiv_address (XEXP (operands[6], 1), operands[5]);")
4371
4372 ;; op.S1 [rx=rx+rz.S2],ry (swapped)
4373
4374 (define_split
4375   [(parallel
4376     [(set (match_operand 0 "register_operand" "")
4377           (match_operator
4378             6 "cris_commutative_orth_op"
4379             [(mem (plus:SI
4380                    (mult:SI (match_operand:SI 2 "register_operand" "")
4381                             (match_operand:SI 3 "const_int_operand" ""))
4382                    (match_operand:SI 4 "register_operand" "")))
4383              (match_operand 1 "register_operand" "")]))
4384      (set (match_operand:SI 5 "register_operand" "")
4385            (plus:SI (mult:SI (match_dup 2)
4386                              (match_dup 3))
4387                     (match_dup 4)))])]
4388   "REG_P (operands[4])
4389    && REG_P (operands[5])
4390    && REGNO (operands[5]) == REGNO (operands[4])"
4391   [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3))
4392                                (match_dup 4)))
4393    (set (match_dup 0) (match_op_dup 6 [(match_dup 7) (match_dup 1)]))]
4394   "operands[7] = replace_equiv_address (XEXP (operands[6], 0), operands[5]);")
4395
4396 ;; op.S1 [rx=rx+i],ry (swapped)
4397
4398 (define_split
4399   [(parallel
4400     [(set (match_operand 0 "register_operand" "")
4401           (match_operator
4402             5 "cris_commutative_orth_op"
4403             [(mem
4404               (plus:SI (match_operand:SI 2 "cris_bdap_operand" "")
4405                        (match_operand:SI 3 "cris_bdap_operand" "")))
4406              (match_operand 1 "register_operand" "")]))
4407      (set (match_operand:SI 4 "register_operand" "")
4408           (plus:SI (match_dup 2)
4409                     (match_dup 3)))])]
4410   "(rtx_equal_p (operands[4], operands[2])
4411     || rtx_equal_p (operands[4], operands[3]))"
4412   [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3)))
4413    (set (match_dup 0) (match_op_dup 5 [(match_dup 6) (match_dup 1)]))]
4414 {
4415   operands[6] = replace_equiv_address (XEXP (operands[5], 0), operands[4]);
4416   cris_order_for_addsi3 (operands, 2);
4417 })
4418
4419 ;; op(s|u).S1 [rx=rx+rz.S2],ry
4420
4421 (define_split
4422   [(parallel
4423     [(set (match_operand 0 "register_operand" "")
4424           (match_operator
4425             6 "cris_operand_extend_operator"
4426             [(match_operand 1 "register_operand" "")
4427              (match_operator
4428               7 "cris_extend_operator"
4429               [(mem (plus:SI
4430                      (mult:SI (match_operand:SI 2 "register_operand" "")
4431                               (match_operand:SI 3 "const_int_operand" ""))
4432                      (match_operand:SI 4 "register_operand" "")))])]))
4433      (set (match_operand:SI 5 "register_operand" "")
4434            (plus:SI (mult:SI (match_dup 2)
4435                              (match_dup 3))
4436                     (match_dup 4)))])]
4437   "REG_P (operands[4])
4438    && REG_P (operands[5])
4439    && REGNO (operands[5]) == REGNO (operands[4])"
4440   [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3))
4441                                (match_dup 4)))
4442    (set (match_dup 0) (match_op_dup 6 [(match_dup 1) (match_dup 8)]))]
4443   "operands[8] = gen_rtx_fmt_e (GET_CODE (operands[7]), GET_MODE (operands[7]),
4444                                 replace_equiv_address (XEXP (operands[7], 0),
4445                                                        operands[5]));")
4446
4447 ;; op(s|u).S1 [rx=rx+i],ry
4448
4449 (define_split
4450   [(parallel
4451     [(set (match_operand 0 "register_operand" "")
4452           (match_operator
4453             5 "cris_operand_extend_operator"
4454             [(match_operand 1 "register_operand" "")
4455              (match_operator
4456               6 "cris_extend_operator"
4457               [(mem
4458                 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "")
4459                          (match_operand:SI 3 "cris_bdap_operand" "")
4460                          ))])]))
4461      (set (match_operand:SI 4 "register_operand" "")
4462            (plus:SI (match_dup 2)
4463                     (match_dup 3)))])]
4464   "(rtx_equal_p (operands[4], operands[2])
4465     || rtx_equal_p (operands[4], operands[3]))"
4466   [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3)))
4467    (set (match_dup 0) (match_op_dup 5 [(match_dup 1) (match_dup 7)]))]
4468 {
4469   operands[7] = gen_rtx_fmt_e (GET_CODE (operands[6]), GET_MODE (operands[6]),
4470                                replace_equiv_address (XEXP (operands[6], 0),
4471                                                       operands[4]));
4472   cris_order_for_addsi3 (operands, 2);
4473 })
4474
4475 ;; op(s|u).S1 [rx=rx+rz.S2],ry (swapped, plus or bound)
4476
4477 (define_split
4478   [(parallel
4479     [(set (match_operand 0 "register_operand" "")
4480           (match_operator
4481             7 "cris_plus_or_bound_operator"
4482             [(match_operator
4483               6 "cris_extend_operator"
4484               [(mem (plus:SI
4485                      (mult:SI (match_operand:SI 2 "register_operand" "")
4486                               (match_operand:SI 3 "const_int_operand" ""))
4487                      (match_operand:SI 4 "register_operand" "")))])
4488              (match_operand 1 "register_operand" "")]))
4489      (set (match_operand:SI 5 "register_operand" "")
4490            (plus:SI (mult:SI (match_dup 2)
4491                              (match_dup 3))
4492                     (match_dup 4)))])]
4493   "REG_P (operands[4]) && REG_P (operands[5])
4494    && REGNO (operands[5]) == REGNO (operands[4])"
4495   [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3))
4496                                (match_dup 4)))
4497    (set (match_dup 0) (match_op_dup 6 [(match_dup 8) (match_dup 1)]))]
4498   "operands[8] = gen_rtx_fmt_e (GET_CODE (operands[6]), GET_MODE (operands[6]),
4499                                 replace_equiv_address (XEXP (operands[6], 0),
4500                                                        operands[5]));")
4501
4502 ;; op(s|u).S1 [rx=rx+i],ry (swapped, plus or bound)
4503
4504 (define_split
4505   [(parallel
4506     [(set (match_operand 0 "register_operand" "")
4507           (match_operator
4508             6 "cris_plus_or_bound_operator"
4509             [(match_operator
4510               5 "cris_extend_operator"
4511              [(mem (plus:SI
4512                     (match_operand:SI 2 "cris_bdap_operand" "")
4513                     (match_operand:SI 3 "cris_bdap_operand" "")))])
4514              (match_operand 1 "register_operand" "")]))
4515      (set (match_operand:SI 4 "register_operand" "")
4516            (plus:SI (match_dup 2)
4517                     (match_dup 3)))])]
4518   "(rtx_equal_p (operands[4], operands[2])
4519     || rtx_equal_p (operands[4], operands[3]))"
4520   [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3)))
4521    (set (match_dup 0) (match_op_dup 6 [(match_dup 7) (match_dup 1)]))]
4522 {
4523   operands[7] = gen_rtx_fmt_e (GET_CODE (operands[5]), GET_MODE (operands[5]),
4524                                replace_equiv_address (XEXP (operands[5], 0),
4525                                                       operands[4]));
4526   cris_order_for_addsi3 (operands, 2);
4527 })
4528 \f
4529 ;; Splits for addressing prefixes that have no side-effects, so we can
4530 ;; fill a delay slot.  Never split if we lose something, though.
4531
4532 ;; If we have a
4533 ;;  move [indirect_ref],rx
4534 ;; where indirect ref = {const, [r+], [r]}, it costs as much as
4535 ;;  move indirect_ref,rx
4536 ;;  move [rx],rx
4537 ;; Take care not to allow indirect_ref = register.
4538
4539 ;; We're not allowed to generate copies of registers with different mode
4540 ;; until after reload; copying pseudos upsets reload.  CVS as of
4541 ;; 2001-08-24, unwind-dw2-fde.c, _Unwind_Find_FDE ICE in
4542 ;; cselib_invalidate_regno.
4543
4544 (define_split ; indir_to_reg_split
4545   [(set (match_operand 0 "register_operand" "")
4546         (match_operand 1 "indirect_operand" ""))]
4547   "reload_completed
4548    && REG_P (operands[0])
4549    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4550    && (MEM_P (XEXP (operands[1], 0)) || CONSTANT_P (XEXP (operands[1], 0)))
4551    && REGNO (operands[0]) < CRIS_LAST_GENERAL_REGISTER"
4552   [(set (match_dup 2) (match_dup 4))
4553    (set (match_dup 0) (match_dup 3))]
4554   "operands[2] = gen_rtx_REG (Pmode, REGNO (operands[0]));
4555    operands[3] = replace_equiv_address (operands[1], operands[2]);
4556    operands[4] = XEXP (operands[1], 0);")
4557
4558 ;; As the above, but MOVS and MOVU.
4559
4560 (define_split
4561   [(set (match_operand 0 "register_operand" "")
4562         (match_operator
4563          4 "cris_extend_operator"
4564          [(match_operand 1 "indirect_operand" "")]))]
4565   "reload_completed
4566    && REG_P (operands[0])
4567    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD
4568    && (MEM_P (XEXP (operands[1], 0))
4569        || CONSTANT_P (XEXP (operands[1], 0)))"
4570   [(set (match_dup 2) (match_dup 5))
4571    (set (match_dup 0) (match_op_dup 4 [(match_dup 3)]))]
4572   "operands[2] = gen_rtx_REG (Pmode, REGNO (operands[0]));
4573    operands[3] = replace_equiv_address (XEXP (operands[4], 0), operands[2]);
4574    operands[5] = XEXP (operands[1], 0);")
4575 \f
4576 ;; Various peephole optimizations.
4577 ;;
4578 ;; Watch out: when you exchange one set of instructions for another, the
4579 ;; condition codes setting must be the same, or you have to CC_INIT or
4580 ;; whatever is appropriate, in the pattern before you emit the
4581 ;; assembly text.  This is best done here, not in cris_notice_update_cc,
4582 ;; to keep changes local to their cause.
4583 ;;
4584 ;; Do not add patterns that you do not know will be matched.
4585 ;; Please also add a self-contained testcase.
4586
4587 ;; We have trouble with and:s and shifts.  Maybe something is broken in
4588 ;; gcc?  Or it could just be that bit-field insn expansion is a bit
4589 ;; suboptimal when not having extzv insns.
4590 ;; Testcase for the following four peepholes: gcc.dg/cris-peep2-xsrand.c
4591
4592 (define_peephole2 ; asrandb (peephole casesi+31)
4593   [(set (match_operand:SI 0 "register_operand" "")
4594         (ashiftrt:SI (match_dup 0)
4595                      (match_operand:SI 1 "const_int_operand" "")))
4596    (set (match_dup 0)
4597         (and:SI (match_dup 0)
4598                 (match_operand 2 "const_int_operand" "")))]
4599   "INTVAL (operands[2]) > 31
4600    && INTVAL (operands[2]) < 255
4601    && INTVAL (operands[1]) > 23
4602    /* Check that the and-operation enables us to use logical-shift.  */
4603    && (INTVAL (operands[2])
4604           & ((HOST_WIDE_INT) -1 << (32 - INTVAL (operands[1])))) == 0"
4605   [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1)))
4606    (set (match_dup 3) (and:QI (match_dup 3) (match_dup 4)))]
4607   ;; FIXME: CC0 is valid except for the M bit.
4608 {
4609   operands[3] = gen_rtx_REG (QImode, REGNO (operands[0]));
4610   operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), QImode));
4611 })
4612
4613 (define_peephole2 ; asrandw (peephole casesi+32)
4614   [(set (match_operand:SI 0 "register_operand" "")
4615         (ashiftrt:SI (match_dup 0)
4616                      (match_operand:SI 1 "const_int_operand" "")))
4617    (set (match_dup 0)
4618         (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))]
4619   "INTVAL (operands[2]) > 31
4620    && INTVAL (operands[2]) < 65535
4621    && INTVAL (operands[2]) != 255
4622    && INTVAL (operands[1]) > 15
4623    /* Check that the and-operation enables us to use logical-shift.  */
4624    && (INTVAL (operands[2])
4625        & ((HOST_WIDE_INT) -1 << (32 - INTVAL (operands[1])))) == 0"
4626   [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1)))
4627    (set (match_dup 3) (and:HI (match_dup 3) (match_dup 4)))]
4628   ;; FIXME: CC0 is valid except for the M bit.
4629 {
4630   operands[3] = gen_rtx_REG (HImode, REGNO (operands[0]));
4631   operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), HImode));
4632 })
4633
4634 (define_peephole2 ; lsrandb (peephole casesi+33)
4635   [(set (match_operand:SI 0 "register_operand" "")
4636         (lshiftrt:SI (match_dup 0)
4637                      (match_operand:SI 1 "const_int_operand" "")))
4638    (set (match_dup 0)
4639         (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))]
4640   "INTVAL (operands[2]) > 31
4641    && INTVAL (operands[2]) < 255
4642    && INTVAL (operands[1]) > 23"
4643   [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1)))
4644    (set (match_dup 3) (and:QI (match_dup 3) (match_dup 4)))]
4645   ;; FIXME: CC0 is valid except for the M bit.
4646 {
4647   operands[3] = gen_rtx_REG (QImode, REGNO (operands[0]));
4648   operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), QImode));
4649 })
4650
4651 (define_peephole2 ; lsrandw (peephole casesi+34)
4652   [(set (match_operand:SI 0 "register_operand" "")
4653         (lshiftrt:SI (match_dup 0)
4654                      (match_operand:SI 1 "const_int_operand" "")))
4655    (set (match_dup 0)
4656         (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))]
4657   "INTVAL (operands[2]) > 31 && INTVAL (operands[2]) < 65535
4658    && INTVAL (operands[2]) != 255
4659    && INTVAL (operands[1]) > 15"
4660   [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1)))
4661    (set (match_dup 3) (and:HI (match_dup 3) (match_dup 4)))]
4662   ;; FIXME: CC0 is valid except for the M bit.
4663 {
4664   operands[3] = gen_rtx_REG (HImode, REGNO (operands[0]));
4665   operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), HImode));
4666 })
4667 \f
4668
4669 ;; Change
4670 ;;  add.d n,rx
4671 ;;  move [rx],ry
4672 ;; into
4673 ;;  move [rx=rx+n],ry
4674 ;; when -128 <= n <= 127.
4675 ;; This will reduce the size of the assembler code for n = [-128..127],
4676 ;; and speed up accordingly.  Don't match if the previous insn is
4677 ;; (set rx rz) because that combination is matched by another peephole.
4678 ;; No stable test-case.
4679
4680 (define_peephole2 ; moversideqi (peephole casesi+35)
4681   [(set (match_operand:SI 0 "register_operand" "")
4682         (plus:SI (match_operand:SI 1 "register_operand" "")
4683                  (match_operand:SI 2 "const_int_operand" "")))
4684    (set (match_operand 3 "register_operand" "")
4685         (match_operator 4 "cris_mem_op" [(match_dup 0)]))]
4686   "GET_MODE_SIZE (GET_MODE (operands[4])) <= UNITS_PER_WORD
4687    && REGNO (operands[3]) != REGNO (operands[0])
4688    && (BASE_P (operands[1]) || BASE_P (operands[2]))
4689    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')
4690    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
4691    && (INTVAL (operands[2]) >= -128 && INTVAL (operands[2]) < 128)
4692    && TARGET_SIDE_EFFECT_PREFIXES"
4693   [(parallel
4694     [(set (match_dup 3) (match_dup 5))
4695      (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])]
4696   ;; Checking the previous insn is a bit too awkward for the condition.
4697 {
4698   rtx prev = prev_nonnote_insn (curr_insn);
4699   if (prev != NULL_RTX)
4700     {
4701       rtx set = single_set (prev);
4702       if (set != NULL_RTX
4703           && REG_S_P (SET_DEST (set))
4704           && REGNO (SET_DEST (set)) == REGNO (operands[0])
4705           && REG_S_P (SET_SRC (set)))
4706         FAIL;
4707     }
4708   operands[5]
4709     = replace_equiv_address (operands[4],
4710                              gen_rtx_PLUS (SImode,
4711                                            operands[1], operands[2]));
4712 })
4713
4714 ;; Vice versa: move ry,[rx=rx+n]
4715
4716 (define_peephole2 ; movemsideqi (peephole casesi+36)
4717   [(set (match_operand:SI 0 "register_operand" "")
4718         (plus:SI (match_operand:SI 1 "register_operand" "")
4719                  (match_operand:SI 2 "const_int_operand" "")))
4720    (set (match_operator 3 "cris_mem_op" [(match_dup 0)])
4721         (match_operand 4 "register_operand" ""))]
4722   "GET_MODE_SIZE (GET_MODE (operands[4])) <= UNITS_PER_WORD
4723    && REGNO (operands[4]) != REGNO (operands[0])
4724    && (BASE_P (operands[1]) || BASE_P (operands[2]))
4725    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')
4726    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
4727    && (INTVAL (operands[2]) >= -128 && INTVAL (operands[2]) < 128)
4728    && TARGET_SIDE_EFFECT_PREFIXES"
4729   [(parallel
4730     [(set (match_dup 5) (match_dup 4))
4731      (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])]
4732   "operands[5]
4733      = replace_equiv_address (operands[3],
4734                               gen_rtx_PLUS (SImode,
4735                                             operands[1], operands[2]));")
4736 \f
4737 ;; As above, change:
4738 ;;  add.d n,rx
4739 ;;  op.d [rx],ry
4740 ;; into:
4741 ;;  op.d [rx=rx+n],ry
4742 ;; Saves when n = [-128..127].
4743 ;;
4744 ;; Splitting and joining combinations for side-effect modes are slightly
4745 ;; out of hand.  They probably will not save the time they take typing in,
4746 ;; not to mention the bugs that creep in.  FIXME: Get rid of as many of
4747 ;; the splits and peepholes as possible.
4748 ;; No stable test-case.
4749
4750 (define_peephole2 ; mover2side (peephole casesi+37)
4751   [(set (match_operand:SI 0 "register_operand" "")
4752         (plus:SI (match_operand:SI 1 "register_operand" "")
4753                  (match_operand:SI 2 "const_int_operand" "")))
4754    (set (match_operand 3 "register_operand" "")
4755           (match_operator 4 "cris_orthogonal_operator"
4756                           [(match_dup 3)
4757                            (match_operator
4758                             5 "cris_mem_op" [(match_dup 0)])]))]
4759   ;; FIXME: What about DFmode?
4760   ;; Change to GET_MODE_SIZE (GET_MODE (operands[3])) <= UNITS_PER_WORD?
4761   "GET_MODE (operands[3]) != DImode
4762    && REGNO (operands[0]) != REGNO (operands[3])
4763    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')
4764    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
4765    && INTVAL (operands[2]) >= -128
4766    && INTVAL (operands[2]) <= 127
4767    && TARGET_SIDE_EFFECT_PREFIXES"
4768   [(parallel
4769     [(set (match_dup 3) (match_op_dup 4 [(match_dup 3) (match_dup 6)]))
4770      (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])]
4771   "operands[6]
4772      = replace_equiv_address (operands[5],
4773                               gen_rtx_PLUS (SImode,
4774                                             operands[1], operands[2]));")
4775
4776 ;; Sometimes, for some reason the pattern
4777 ;;  move x,rx
4778 ;;  add y,rx
4779 ;;  move [rx],rz
4780 ;; will occur.  Solve this, and likewise for to-memory.
4781 ;; No stable test-case.
4782
4783 (define_peephole2 ; moverside (peephole casesi+38)
4784   [(set (match_operand:SI 0 "register_operand" "")
4785         (match_operand:SI 1 "cris_bdap_biap_operand" ""))
4786    (set (match_dup 0)
4787         (plus:SI (match_operand:SI 2 "cris_bdap_biap_operand" "")
4788                  (match_operand:SI 3 "cris_bdap_biap_operand" "")))
4789    (set (match_operand 4 "register_operand" "")
4790         (match_operator 5 "cris_mem_op" [(match_dup 0)]))]
4791   "(rtx_equal_p (operands[2], operands[0])
4792     || rtx_equal_p (operands[3], operands[0]))
4793    && cris_side_effect_mode_ok (PLUS, operands, 0,
4794                                 (REG_S_P (operands[1])
4795                                  ? 1
4796                                  : (rtx_equal_p (operands[2], operands[0])
4797                                     ? 3 : 2)),
4798                                 (! REG_S_P (operands[1])
4799                                  ? 1
4800                                  : (rtx_equal_p (operands[2], operands[0])
4801                                     ? 3 : 2)),
4802                                 -1, 4)"
4803   [(parallel
4804     [(set (match_dup 4) (match_dup 6))
4805      (set (match_dup 0) (plus:SI (match_dup 7) (match_dup 8)))])]
4806 {
4807   rtx otherop
4808     = rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2];
4809
4810   /* Make sure we have canonical RTX so we match the insn pattern -
4811      not a constant in the first operand.  We also require the order
4812      (plus reg mem) to match the final pattern.  */
4813   if (CONSTANT_P (otherop) || MEM_P (otherop))
4814     {
4815       operands[7] = operands[1];
4816       operands[8] = otherop;
4817     }
4818   else
4819     {
4820       operands[7] = otherop;
4821       operands[8] = operands[1];
4822     }
4823   operands[6]
4824     = replace_equiv_address (operands[5],
4825                              gen_rtx_PLUS (SImode,
4826                                            operands[7], operands[8]));
4827 })
4828
4829 ;; As above but to memory.
4830 ;; FIXME: Split movemside and moverside into variants and prune
4831 ;; the ones that don't trig.
4832 ;; No stable test-case.
4833
4834 (define_peephole2 ; movemside (peephole casesi+39)
4835   [(set (match_operand:SI 0 "register_operand" "")
4836         (match_operand:SI 1 "cris_bdap_biap_operand" ""))
4837    (set (match_dup 0)
4838         (plus:SI (match_operand:SI 2 "cris_bdap_biap_operand" "")
4839                  (match_operand:SI 3 "cris_bdap_biap_operand" "")))
4840    (set (match_operator 4 "cris_mem_op" [(match_dup 0)])
4841         (match_operand 5 "register_operand" ""))]
4842   "(rtx_equal_p (operands[2], operands[0])
4843     || rtx_equal_p (operands[3], operands[0]))
4844    && cris_side_effect_mode_ok (PLUS, operands, 0,
4845                                 (REG_S_P (operands[1])
4846                                  ? 1
4847                                  : (rtx_equal_p (operands[2], operands[0])
4848                                     ? 3 : 2)),
4849                                 (! REG_S_P (operands[1])
4850                                    ? 1
4851                                  : (rtx_equal_p (operands[2], operands[0])
4852                                     ? 3 : 2)),
4853                                 -1, 5)"
4854   [(parallel
4855     [(set (match_dup 6) (match_dup 5))
4856      (set (match_dup 0) (plus:SI (match_dup 7) (match_dup 8)))])]
4857 {
4858   rtx otherop
4859     = rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2];
4860
4861   /* Make sure we have canonical RTX so we match the insn pattern -
4862      not a constant in the first operand.  We also require the order
4863      (plus reg mem) to match the final pattern.  */
4864   if (CONSTANT_P (otherop) || MEM_P (otherop))
4865     {
4866       operands[7] = operands[1];
4867       operands[8] = otherop;
4868     }
4869   else
4870     {
4871       operands[7] = otherop;
4872       operands[8] = operands[1];
4873     }
4874   operands[6]
4875     = replace_equiv_address (operands[4],
4876                              gen_rtx_PLUS (SImode,
4877                                            operands[7], operands[8]));
4878 })
4879
4880 ;; Another spotted bad code:
4881 ;;   move rx,ry
4882 ;;   move [ry],ry
4883 ;; No stable test-case.
4884
4885 (define_peephole2 ; movei (peephole casesi+42)
4886   [(set (match_operand:SI 0 "register_operand" "")
4887         (match_operand:SI 1 "register_operand" ""))
4888    (set (match_operand 2 "register_operand" "")
4889         (match_operator 3 "cris_mem_op" [(match_dup 0)]))]
4890   "REGNO (operands[0]) == REGNO (operands[2])
4891    && (REGNO_REG_CLASS (REGNO (operands[0]))
4892        == REGNO_REG_CLASS (REGNO (operands[1])))
4893    && GET_MODE_SIZE (GET_MODE (operands[2])) <= UNITS_PER_WORD"
4894   [(set (match_dup 2) (match_dup 4))]
4895   "operands[4] = replace_equiv_address (operands[3], operands[1]);")
4896
4897 ;;   move.d [r10+16],r9
4898 ;;   and.d r12,r9
4899 ;; change to
4900 ;;   and.d [r10+16],r12,r9
4901 ;; With generalization of the operation, the size and the addressing mode.
4902 ;;  This seems to be the result of a quirk in register allocation
4903 ;; missing the three-operand cases when having different predicates.
4904 ;; Maybe that it matters that it is a commutative operation.
4905 ;;  This pattern helps that situation, but there's still the increased
4906 ;; register pressure.
4907 ;;  Note that adding the noncommutative variant did not show any matches
4908 ;; in ipps and cc1, so it's not here.
4909 ;; No stable test-case.
4910
4911 (define_peephole2 ; op3 (peephole casesi+44)
4912   [(set (match_operand 0 "register_operand" "")
4913         (match_operator
4914          6 "cris_mem_op"
4915          [(plus:SI
4916            (match_operand:SI 1 "cris_bdap_biap_operand" "")
4917            (match_operand:SI 2 "cris_bdap_biap_operand" ""))]))
4918    (set (match_dup 0)
4919         (match_operator
4920          5 "cris_commutative_orth_op"
4921          [(match_operand 3 "register_operand" "")
4922           (match_operand 4 "register_operand" "")]))]
4923   "(rtx_equal_p (operands[3], operands[0])
4924     || rtx_equal_p (operands[4], operands[0]))
4925    && ! rtx_equal_p (operands[3], operands[4])
4926    && (REG_S_P (operands[1]) || REG_S_P (operands[2]))
4927    && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD"
4928   [(set (match_dup 0) (match_op_dup 5 [(match_dup 7) (match_dup 6)]))]
4929   "operands[7]
4930      = rtx_equal_p (operands[3], operands[0]) ? operands[4] : operands[3];")
4931
4932 ;;  I cannot tell GCC (2.1, 2.7.2) how to correctly reload an instruction
4933 ;; that looks like
4934 ;;   and.b some_byte,const,reg_32
4935 ;; where reg_32 is the destination of the "three-address" code optimally.
4936 ;; It should be:
4937 ;;   movu.b some_byte,reg_32
4938 ;;   and.b const,reg_32
4939 ;; but it turns into:
4940 ;;   move.b some_byte,reg_32
4941 ;;   and.d const,reg_32
4942 ;; Fix it here.
4943 ;; Testcases: gcc.dg/cris-peep2-andu1.c gcc.dg/cris-peep2-andu2.c
4944
4945 (define_peephole2 ; andu (casesi+45)
4946   [(set (match_operand:SI 0 "register_operand" "")
4947         (match_operand:SI 1 "nonimmediate_operand" ""))
4948    (set (match_operand:SI 2 "register_operand" "")
4949         (and:SI (match_dup 0)
4950                 (match_operand:SI 3 "const_int_operand" "")))]
4951    ;; Since the size of the memory access could be made different here,
4952    ;; don't do this for a mem-volatile access.
4953   "REGNO (operands[2]) == REGNO (operands[0])
4954    && INTVAL (operands[3]) <= 65535 && INTVAL (operands[3]) >= 0
4955    && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'I')
4956    && !side_effects_p (operands[1])
4957    && (!REG_P (operands[1])
4958        || REGNO (operands[1]) <= CRIS_LAST_GENERAL_REGISTER)"
4959   ;; FIXME: CC0 valid except for M (i.e. CC_NOT_NEGATIVE).
4960   [(set (match_dup 0) (match_dup 4))
4961    (set (match_dup 5) (match_dup 6))]
4962 {
4963   enum machine_mode zmode = INTVAL (operands[3]) <= 255 ? QImode : HImode;
4964   enum machine_mode amode
4965     = CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'O') ? SImode : zmode;
4966   rtx op1
4967     = (REG_S_P (operands[1])
4968        ? gen_rtx_REG (zmode, REGNO (operands[1]))
4969        : adjust_address (operands[1], zmode, 0));
4970   operands[4]
4971     = gen_rtx_ZERO_EXTEND (SImode, op1);
4972   operands[5] = gen_rtx_REG (amode, REGNO (operands[0]));
4973   operands[6]
4974     = gen_rtx_AND (amode, gen_rtx_REG (amode, REGNO (operands[0])),
4975                    GEN_INT (trunc_int_for_mode (INTVAL (operands[3]),
4976                                                 amode == SImode
4977                                                 ? QImode : amode)));
4978 })
4979
4980 ;; Try and avoid GOTPLT reads escaping a call: transform them into
4981 ;; PLT.  Curiously (but thankfully), peepholes for instructions
4982 ;; *without side-effects* that just feed a call (or call_value) are
4983 ;; not matched neither in a build or test-suite, so those patterns are
4984 ;; omitted.
4985
4986 ;; A "normal" move where we don't check the consumer.
4987
4988 (define_peephole2 ; gotplt-to-plt
4989   [(set
4990     (match_operand:SI 0 "register_operand" "")
4991     (match_operator:SI
4992      1 "cris_mem_op"
4993      [(plus:SI
4994        (reg:SI CRIS_GOT_REGNUM)
4995        (const:SI
4996         (unspec:SI [(match_operand:SI 2 "cris_general_operand_or_symbol" "")]
4997                    CRIS_UNSPEC_PLTGOTREAD)))]))]
4998   "flag_pic
4999    && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true)
5000    && REGNO_REG_CLASS (REGNO (operands[0])) == REGNO_REG_CLASS (0)"
5001   [(set (match_dup 0) (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLT_GOTREL)))
5002    (set (match_dup 0) (plus:SI (match_dup 0) (reg:SI CRIS_GOT_REGNUM)))]
5003   "")
5004
5005 ;; And one set with a side-effect getting the PLTGOT offset.
5006 ;; First call and call_value variants.
5007
5008 (define_peephole2 ; gotplt-to-plt-side-call
5009   [(parallel
5010     [(set
5011       (match_operand:SI 0 "register_operand" "")
5012       (match_operator:SI
5013        1 "cris_mem_op"
5014        [(plus:SI
5015          (reg:SI CRIS_GOT_REGNUM)
5016          (const:SI
5017           (unspec:SI [(match_operand:SI
5018                        2 "cris_general_operand_or_symbol" "")]
5019                      CRIS_UNSPEC_PLTGOTREAD)))]))
5020      (set (match_operand:SI 3 "register_operand" "")
5021           (plus:SI (reg:SI CRIS_GOT_REGNUM)
5022                    (const:SI
5023                     (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))])
5024   (parallel [(call (mem:QI (match_dup 0))
5025                     (match_operand 4 "" ""))
5026               (clobber (reg:SI CRIS_SRP_REGNUM))])]
5027   "flag_pic
5028    && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true)
5029    && peep2_reg_dead_p (2, operands[0])"
5030   [(parallel [(call (mem:QI (match_dup 1))
5031                     (match_dup 4))
5032               (clobber (reg:SI CRIS_SRP_REGNUM))
5033               (set (match_dup 3)
5034                    (plus:SI (reg:SI CRIS_GOT_REGNUM)
5035                             (const:SI
5036                              (unspec:SI [(match_dup 2)]
5037                                         CRIS_UNSPEC_PLTGOTREAD))))])]
5038   "")
5039
5040 (define_peephole2 ; gotplt-to-plt-side-call-value
5041   [(parallel
5042     [(set
5043       (match_operand:SI 0 "register_operand" "")
5044       (match_operator:SI
5045        1 "cris_mem_op"
5046        [(plus:SI
5047          (reg:SI CRIS_GOT_REGNUM)
5048          (const:SI
5049           (unspec:SI [(match_operand:SI
5050                        2 "cris_general_operand_or_symbol" "")]
5051                      CRIS_UNSPEC_PLTGOTREAD)))]))
5052      (set (match_operand:SI 3 "register_operand" "")
5053           (plus:SI (reg:SI CRIS_GOT_REGNUM)
5054                    (const:SI
5055                     (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))])
5056    (parallel [(set (match_operand 5 "" "")
5057                    (call (mem:QI (match_dup 0))
5058                          (match_operand 4 "" "")))
5059               (clobber (reg:SI CRIS_SRP_REGNUM))])]
5060   "flag_pic
5061    && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true)
5062    && peep2_reg_dead_p (2, operands[0])"
5063   [(parallel [(set (match_dup 5)
5064                    (call (mem:QI (match_dup 1))
5065                          (match_dup 4)))
5066               (clobber (reg:SI CRIS_SRP_REGNUM))
5067               (set (match_dup 3)
5068                    (plus:SI (reg:SI CRIS_GOT_REGNUM)
5069                             (const:SI
5070                              (unspec:SI [(match_dup 2)]
5071                                         CRIS_UNSPEC_PLTGOTREAD))))])]
5072   "")
5073
5074 (define_peephole2 ; gotplt-to-plt-side
5075   [(parallel
5076     [(set
5077       (match_operand:SI 0 "register_operand" "")
5078       (match_operator:SI
5079        1 "cris_mem_op"
5080        [(plus:SI
5081          (reg:SI CRIS_GOT_REGNUM)
5082          (const:SI
5083           (unspec:SI [(match_operand:SI
5084                        2 "cris_general_operand_or_symbol" "")]
5085                      CRIS_UNSPEC_PLTGOTREAD)))]))
5086      (set (match_operand:SI 3 "register_operand" "")
5087           (plus:SI (reg:SI CRIS_GOT_REGNUM)
5088                    (const:SI
5089                     (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))])]
5090   "flag_pic
5091    && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true)
5092    && REGNO_REG_CLASS (REGNO (operands[0])) == REGNO_REG_CLASS (0)"
5093   [(set (match_dup 3)
5094         (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD)))
5095    (set (match_dup 3) (plus:SI (match_dup 3) (reg:SI CRIS_GOT_REGNUM)))
5096    (set (match_dup 0)
5097         (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLT_GOTREL)))
5098    (set (match_dup 0) (plus:SI (match_dup 0) (reg:SI CRIS_GOT_REGNUM)))]
5099   "")
5100 \f
5101 ;; Local variables:
5102 ;; mode:emacs-lisp
5103 ;; comment-start: ";; "
5104 ;; eval: (set-syntax-table (copy-sequence (syntax-table)))
5105 ;; eval: (modify-syntax-entry ?[ "(]")
5106 ;; eval: (modify-syntax-entry ?] ")[")
5107 ;; eval: (modify-syntax-entry ?{ "(}")
5108 ;; eval: (modify-syntax-entry ?} "){")
5109 ;; eval: (setq indent-tabs-mode t)
5110 ;; End: