source: trunk/third/gcc/config/sh/sh.md @ 8834

Revision 8834, 58.1 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
Line 
1;;- Machine description for the Hitachi SH.
2;;  Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
3;;  Contributed by Steve Chamberlain (sac@cygnus.com).
4;;  Improved by Jim Wilson (wilson@cygnus.com).
5
6;; This file is part of GNU CC.
7
8;; GNU CC is free software; you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation; either version 2, or (at your option)
11;; any later version.
12
13;; GNU CC is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16;; GNU General Public License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with GNU CC; see the file COPYING.  If not, write to
20;; the Free Software Foundation, 59 Temple Place - Suite 330,
21;; Boston, MA 02111-1307, USA.
22
23
24;; ??? Should prepend a * to all pattern names which are not used.
25;; This will make the compiler smaller, and rebuilds after changes faster.
26
27;; ??? Should be enhanced to include support for many more GNU superoptimizer
28;; sequences.  Especially the sequences for arithmetic right shifts.
29
30;; ??? Should check all DImode patterns for consistency and usefulness.
31
32;; ??? Should add support for using BSR for short function calls.
33
34;; ??? The MAC.W and MAC.L instructions are not supported.  There is no
35;; way to generate them.
36
37;; ??? The BSR instruction is not supported.  It might be possible to
38;; generate it by keeping track of function sizes (and hence relative
39;; addresses), and then using it only if the target is earlier in the same
40;; file, and is within range.  Better would be assembler/linker relaxing,
41;; but that is much harder.
42
43;; ??? The cmp/str instruction is not supported.  Perhaps it can be used
44;; for a str* inline function.
45
46;; Special constraints for SH machine description:
47;;
48;;    t -- T
49;;    x -- mac
50;;    l -- pr
51;;    z -- r0
52;;
53;; Special formats used for outputting SH instructions:
54;;
55;;   %.  --  print a .s if insn needs delay slot
56;;   %@  --  print rte/rts if is/isn't an interrupt function
57;;   %#  --  output a nop if there is nothing to put in the delay slot
58;;   %O  --  print a constant without the #
59;;   %R  --  print the lsw reg of a double
60;;   %S  --  print the msw reg of a double
61;;   %T  --  print next word of a double REG or MEM
62;;
63;; Special predicates:
64;;
65;;  arith_operand          -- operand is valid source for arithmetic op
66;;  arith_reg_operand      -- operand is valid register for arithmetic op
67;;  general_movdst_operand -- operand is valid move destination
68;;  general_movsrc_operand -- operand is valid move source
69;;  logical_operand        -- operand is valid source for logical op
70;; -------------------------------------------------------------------------
71;; Attributes
72;; -------------------------------------------------------------------------
73
74; Target CPU.
75
76(define_attr "cpu" "sh0,sh1,sh2,sh3"
77  (const (symbol_ref "sh_cpu_attr")))
78
79;;
80;; cbranch      conditional branch instructions
81;; jump         unconditional jumps
82;; arith        ordinary arithmetic
83;; load         from memory
84;; store        to memory
85;; move         register to register
86;; smpy         word precision integer multiply
87;; dmpy         longword or doublelongword precision integer multiply
88;; return       rts
89;; pload        load of pr reg, which can't be put into delay slot of rts
90;; pstore       store of pr reg, which can't be put into delay slot of jsr
91;; pcload       pc relative load of constant value
92;; rte          return from exception
93;; sfunc        special function call with known used registers
94;; call         function call
95
96(define_attr "type"
97 "cbranch,jump,arith,other,load,store,move,smpy,dmpy,return,pload,pstore,pcload,rte,sfunc,call"
98  (const_string "other"))
99
100; If a conditional branch destination is within -252..258 bytes away
101; from the instruction it can be 2 bytes long.  Something in the
102; range -4090..4100 bytes can be 6 bytes long.  All other conditional
103; branches are 16 bytes long.
104
105; An unconditional jump in the range -4092..4098 can be 2 bytes long.
106; Otherwise, it must be 14 bytes long.
107
108; All other instructions are two bytes long by default.
109
110; All positive offsets have an adjustment added, which is the number of bytes
111; difference between this instruction length and the next larger instruction
112; length.  This is because shorten_branches starts with the largest
113; instruction size and then tries to reduce them.
114
115(define_attr "length" ""
116  (cond [(eq_attr "type" "cbranch")
117         (if_then_else (and (ge (minus (match_dup 0) (pc))
118                                (const_int -252))
119                            (le (minus (match_dup 0) (pc))
120                                (const_int 262)))
121                       (const_int 2)
122                       (if_then_else (and (ge (minus (match_dup 0) (pc))
123                                              (const_int -4090))
124                                          (le (minus (match_dup 0) (pc))
125                                              (const_int 4110)))
126                                     (const_int 6)
127                                     (const_int 16)))
128
129         (eq_attr "type" "jump")
130         (if_then_else (and (ge (minus (match_dup 0) (pc))
131                                (const_int -4092))
132                            (le (minus (match_dup 0) (pc))
133                                (const_int 4110)))
134                       (const_int 2)
135                       (const_int 14))
136         ] (const_int 2)))
137
138;; (define_function_unit {name} {num-units} {n-users} {test}
139;;                       {ready-delay} {issue-delay} [{conflict-list}])
140
141;; ??? These are probably not correct.
142(define_function_unit "memory" 1 0 (eq_attr "type" "load,pcload,pload") 2 2)
143(define_function_unit "mpy"    1 0 (eq_attr "type" "smpy") 2 2)
144(define_function_unit "mpy"    1 0 (eq_attr "type" "dmpy") 3 3)
145
146; Definitions for filling branch delay slots.
147
148(define_attr "needs_delay_slot" "yes,no" (const_string "no"))
149
150(define_attr "hit_stack" "yes,no" (const_string "no"))
151
152(define_attr "interrupt_function" "no,yes"
153  (const (symbol_ref "pragma_interrupt")))
154
155(define_attr "in_delay_slot" "yes,no"
156  (cond [(eq_attr "type" "cbranch") (const_string "no")
157         (eq_attr "type" "pcload") (const_string "no")
158         (eq_attr "needs_delay_slot" "yes") (const_string "no")
159         (eq_attr "length" "2") (const_string "yes")
160         ] (const_string "no")))
161
162(define_delay
163  (eq_attr "needs_delay_slot" "yes")
164  [(eq_attr "in_delay_slot" "yes") (nil) (nil)])
165
166;; On the SH and SH2, the rte instruction reads the return pc from the stack,
167;; and thus we can't put a pop instruction in its delay slot.
168;; ??? On the SH3, the rte instruction does not use the stack, so a pop
169;; instruction can go in the delay slot.
170
171;; Since a normal return (rts) implicitly uses the PR register,
172;; we can't allow PR register loads in an rts delay slot.
173
174(define_delay
175  (eq_attr "type" "return")
176  [(and (eq_attr "in_delay_slot" "yes")
177        (ior (and (eq_attr "interrupt_function" "no")
178                  (eq_attr "type" "!pload"))
179             (and (eq_attr "interrupt_function" "yes")
180                  (eq_attr "hit_stack" "no")))) (nil) (nil)])
181
182;; Since a call implicitly uses the PR register, we can't allow
183;; a PR register store in a jsr delay slot.
184
185(define_delay
186  (ior (eq_attr "type" "call") (eq_attr "type" "sfunc"))
187  [(and (eq_attr "in_delay_slot" "yes")
188        (eq_attr "type" "!pstore")) (nil) (nil)])
189
190;; Say that we have annulled true branches, since this gives smaller and
191;; faster code when branches are predicted as not taken.
192
193;; ??? Branches which are out-of-range actually have two delay slots,
194;; the first is either always executed or else annulled false, and the
195;; second is always annulled false.  Handling these differently from
196;; in range branches would give better code.
197
198(define_delay
199  (and (eq_attr "type" "cbranch")
200       (eq_attr "cpu" "sh2,sh3"))
201  [(eq_attr "in_delay_slot" "yes") (eq_attr "in_delay_slot" "yes") (nil)])
202
203;; -------------------------------------------------------------------------
204;; SImode signed integer comparisons
205;; -------------------------------------------------------------------------
206
207(define_insn ""
208  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
209        (eq:SI (reg:SI 18)
210               (const_int 1)))]
211  ""
212  "movt %0")
213
214;; ??? This combiner pattern does not work, because combine does not combine
215;; instructions that set a hard register when SMALL_REGISTER_CLASSES is
216;; defined.  Perhaps use a pseudo-reg for the T bit?
217
218(define_insn ""
219  [(set (reg:SI 18)
220        (eq:SI (and:SI (match_operand:SI 0 "arith_reg_operand" "z,r")
221                       (match_operand:SI 1 "arith_operand" "L,r"))
222               (const_int 0)))]
223  ""
224  "tst  %1,%0")
225
226;; ??? Perhaps should only accept reg/constant if the register is reg 0.
227;; That would still allow reload to create cmpi instructions, but would
228;; perhaps allow forcing the constant into a register when that is better.
229;; Probably should use r0 for mem/imm compares, but force constant into a
230;; register for pseudo/imm compares.
231
232(define_insn "cmpeqsi_t"
233  [(set (reg:SI 18) (eq:SI (match_operand:SI 0 "arith_reg_operand" "r,z,r")
234                           (match_operand:SI 1 "arith_operand" "N,rI,r")))]
235  ""
236  "@
237        tst     %0,%0
238        cmp/eq  %1,%0
239        cmp/eq  %1,%0")
240
241(define_insn "cmpgtsi_t"
242  [(set (reg:SI 18) (gt:SI (match_operand:SI 0 "arith_reg_operand" "r,r")
243                           (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))]
244  ""
245  "@
246        cmp/gt  %1,%0
247        cmp/pl  %0")
248
249(define_insn "cmpgesi_t"
250  [(set (reg:SI 18) (ge:SI (match_operand:SI 0 "arith_reg_operand" "r,r")
251                           (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))]
252  ""
253  "@
254        cmp/ge  %1,%0
255        cmp/pz  %0")
256
257;; -------------------------------------------------------------------------
258;; SImode unsigned integer comparisons
259;; -------------------------------------------------------------------------
260
261(define_insn "cmpgeusi_t"
262  [(set (reg:SI 18) (geu:SI (match_operand:SI 0 "arith_reg_operand" "r")
263                            (match_operand:SI 1 "arith_reg_operand" "r")))]
264  ""
265  "cmp/hs       %1,%0")
266
267(define_insn "cmpgtusi_t"
268  [(set (reg:SI 18) (gtu:SI (match_operand:SI 0 "arith_reg_operand" "r")
269                            (match_operand:SI 1 "arith_reg_operand" "r")))]
270  ""
271  "cmp/hi       %1,%0")
272
273;; We save the compare operands in the cmpxx patterns and use them when
274;; we generate the branch.
275
276(define_expand "cmpsi"
277  [(set (reg:SI 18) (compare (match_operand:SI 0 "arith_operand" "")
278                             (match_operand:SI 1 "arith_operand" "")))]
279  ""
280  "
281{
282  sh_compare_op0 = operands[0];
283  sh_compare_op1 = operands[1];
284  DONE;
285}")
286
287;; -------------------------------------------------------------------------
288;; Addition instructions
289;; -------------------------------------------------------------------------
290
291;; ??? This should be a define expand.
292
293(define_insn "adddi3"
294  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
295        (plus:DI (match_operand:DI 1 "arith_reg_operand" "%0")
296                 (match_operand:DI 2 "arith_reg_operand" "r")))
297   (clobber (reg:SI 18))]
298  ""
299  "clrt\;addc   %R2,%R0\;addc   %S2,%S0"
300  [(set_attr "length" "6")])
301
302(define_insn "addsi3"
303  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
304        (plus:SI (match_operand:SI 1 "arith_operand" "%0")
305                 (match_operand:SI 2 "arith_operand" "rI")))]
306  ""
307  "add  %2,%0"
308  [(set_attr "type" "arith")])
309
310;; -------------------------------------------------------------------------
311;; Subtraction instructions
312;; -------------------------------------------------------------------------
313
314;; ??? This should be a define expand.
315
316(define_insn "subdi3"
317  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
318        (minus:DI (match_operand:DI 1 "arith_reg_operand" "0")
319                 (match_operand:DI 2 "arith_reg_operand" "r")))
320   (clobber (reg:SI 18))]
321  ""
322  "clrt\;subc   %R2,%R0\;subc   %S2,%S0"
323  [(set_attr "length" "6")])
324
325(define_insn "subsi3"
326  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
327        (minus:SI (match_operand:SI 1 "arith_reg_operand" "0")
328                  (match_operand:SI 2 "arith_reg_operand" "r")))]
329  ""
330  "sub  %2,%0"
331  [(set_attr "type" "arith")])
332
333;; -------------------------------------------------------------------------
334;; Division instructions
335;; -------------------------------------------------------------------------
336
337;; We take advantage of the library routines which don't clobber as many
338;; registers as a normal function call would.
339
340;; We must use a pseudo-reg forced to reg 0 in the SET_DEST rather than
341;; hard register 0.  If we used hard register 0, then the next instruction
342;; would be a move from hard register 0 to a pseudo-reg.  If the pseudo-reg
343;; gets allocated to a stack slot that needs its address reloaded, then
344;; there is nothing to prevent reload from using r0 to reload the address.
345;; This reload would clobber the value in r0 we are trying to store.
346;; If we let reload allocate r0, then this problem can never happen.
347
348(define_insn ""
349  [(set (match_operand:SI 1 "register_operand" "=z")
350        (udiv:SI (reg:SI 4) (reg:SI 5)))
351   (clobber (reg:SI 18))
352   (clobber (reg:SI 17))
353   (clobber (reg:SI 4))
354   (use (match_operand:SI 0 "arith_reg_operand" "r"))]
355  ""
356  "jsr  @%0%#"
357  [(set_attr "type" "sfunc")
358   (set_attr "needs_delay_slot" "yes")])
359
360(define_expand "udivsi3"
361  [(set (reg:SI 4) (match_operand:SI 1 "general_operand" ""))
362   (set (reg:SI 5) (match_operand:SI 2 "general_operand" ""))
363   (set (match_dup 3) (symbol_ref:SI "__udivsi3"))
364   (parallel [(set (match_operand:SI 0 "register_operand" "")
365                   (udiv:SI (reg:SI 4)
366                            (reg:SI 5)))
367              (clobber (reg:SI 18))
368              (clobber (reg:SI 17))
369              (clobber (reg:SI 4))
370              (use (match_dup 3))])]
371  ""
372  "operands[3] = gen_reg_rtx(SImode);")
373
374(define_insn ""
375  [(set (match_operand:SI 1 "register_operand" "=z")
376        (div:SI (reg:SI 4) (reg:SI 5)))
377   (clobber (reg:SI 18))
378   (clobber (reg:SI 17))
379   (clobber (reg:SI 1))
380   (clobber (reg:SI 2))
381   (clobber (reg:SI 3))
382   (use (match_operand:SI 0 "arith_reg_operand" "r"))]
383  ""
384  "jsr  @%0%#"
385  [(set_attr "type" "sfunc")
386   (set_attr "needs_delay_slot" "yes")])
387
388(define_expand "divsi3"
389  [(set (reg:SI 4) (match_operand:SI 1 "general_operand" ""))
390   (set (reg:SI 5) (match_operand:SI 2 "general_operand" ""))
391   (set (match_dup 3) (symbol_ref:SI "__sdivsi3"))
392   (parallel [(set (match_operand:SI 0 "register_operand" "")
393                   (div:SI (reg:SI 4)
394                           (reg:SI 5)))
395              (clobber (reg:SI 18))
396              (clobber (reg:SI 17))
397              (clobber (reg:SI 1))
398              (clobber (reg:SI 2))
399              (clobber (reg:SI 3))
400              (use (match_dup 3))])]
401  ""
402  "operands[3] = gen_reg_rtx(SImode);")
403
404;; -------------------------------------------------------------------------
405;; Multiplication instructions
406;; -------------------------------------------------------------------------
407
408(define_insn ""
409  [(set (reg:SI 21)
410        (mult:SI (zero_extend:SI (match_operand:HI 1 "arith_reg_operand" "r"))
411                 (zero_extend:SI (match_operand:HI 2 "arith_reg_operand" "r"))))]
412  ""
413  "mulu %2,%1"
414  [(set_attr "type" "smpy")])
415
416(define_insn ""
417  [(set (reg:SI 21)
418        (mult:SI (sign_extend:SI
419                  (match_operand:HI 1 "arith_reg_operand" "r"))
420                 (sign_extend:SI
421                  (match_operand:HI 2 "arith_reg_operand" "r"))))]
422  ""
423  "muls %2,%1"
424  [(set_attr "type" "smpy")])
425
426(define_expand "mulhisi3"
427  [(set (reg:SI 21)
428        (mult:SI (sign_extend:SI
429                  (match_operand:HI 1 "arith_reg_operand" ""))
430                 (sign_extend:SI
431                  (match_operand:HI 2 "arith_reg_operand" ""))))
432   (set (match_operand:SI 0 "arith_reg_operand" "")
433        (reg:SI 21))]
434  ""
435  "")
436
437(define_expand "umulhisi3"
438  [(set (reg:SI 21)
439        (mult:SI (zero_extend:SI
440                  (match_operand:HI 1 "arith_reg_operand" ""))
441                 (zero_extend:SI
442                  (match_operand:HI 2 "arith_reg_operand" ""))))
443   (set (match_operand:SI 0 "arith_reg_operand" "")
444        (reg:SI 21))]
445  ""
446  "")
447
448;; mulsi3 on the SH2 can be done in one instruction, on the SH1 we generate
449;; a call to a routine which clobbers known registers.
450
451(define_insn ""
452  [(set (match_operand:SI 1 "register_operand" "=z")
453        (mult:SI (reg:SI 4) (reg:SI 5)))
454   (clobber (reg:SI 21))
455   (clobber (reg:SI 18))
456   (clobber (reg:SI 17))
457   (clobber (reg:SI 3))
458   (clobber (reg:SI 2))
459   (clobber (reg:SI 1))
460   (use (match_operand:SI 0 "arith_reg_operand" "r"))]
461  ""
462  "jsr  @%0%#"
463  [(set_attr "type" "sfunc")
464   (set_attr "needs_delay_slot" "yes")])
465
466(define_expand "mulsi3_call"
467  [(set (reg:SI 4) (match_operand:SI 1 "general_operand" ""))
468   (set (reg:SI 5) (match_operand:SI 2 "general_operand" ""))
469   (set (match_dup 3) (symbol_ref:SI "__mulsi3"))
470   (parallel[(set (match_operand:SI 0 "register_operand" "")
471                  (mult:SI (reg:SI 4)
472                           (reg:SI 5)))
473             (clobber (reg:SI 21))
474             (clobber (reg:SI 18))
475             (clobber (reg:SI 17))
476             (clobber (reg:SI 3))
477             (clobber (reg:SI 2))
478             (clobber (reg:SI 1))
479             (use (match_dup 3))])]
480  ""
481  "operands[3] = gen_reg_rtx(SImode);")
482
483(define_insn "mul_l"
484  [(set (reg:SI 21)
485        (mult:SI (match_operand:SI 0 "arith_reg_operand" "r")
486                 (match_operand:SI 1 "arith_reg_operand" "r")))]
487  "TARGET_SH2"
488  "mul.l        %1,%0"
489  [(set_attr "type" "dmpy")])
490
491(define_expand "mulsi3"
492  [(set (reg:SI 21)
493        (mult:SI  (match_operand:SI 1 "arith_reg_operand" "")
494                  (match_operand:SI 2 "arith_reg_operand" "")))
495   (set (match_operand:SI 0 "arith_reg_operand" "")
496        (reg:SI 21))]
497  ""
498  "
499{
500  if (!TARGET_SH2)
501    {
502      FAIL;
503      /* ??? Does this give worse or better code?  */
504      emit_insn (gen_mulsi3_call (operands[0], operands[1], operands[2]));
505      DONE;
506    }
507}")
508
509(define_insn ""
510  [(set (reg:DI 20)
511        (mult:DI (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" "r"))
512                 (sign_extend:DI (match_operand:SI 2 "arith_reg_operand" "r"))))]
513  "TARGET_SH2"
514  "dmuls.l      %2,%1"
515  [(set_attr "type" "dmpy")])
516
517(define_expand "mulsidi3"
518  [(set (reg:DI 20)
519        (mult:DI (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" ""))
520                 (sign_extend:DI (match_operand:SI 2 "arith_reg_operand" ""))))
521   (set (match_operand:DI 0 "arith_reg_operand" "")
522        (reg:DI 20))]
523  "TARGET_SH2"
524  "")
525
526(define_insn ""
527  [(set (reg:DI 20)
528        (mult:DI (zero_extend:DI (match_operand:SI 1 "arith_reg_operand" "r"))
529                 (zero_extend:DI (match_operand:SI 2 "arith_reg_operand" "r"))))]
530  "TARGET_SH2"
531  "dmulu.l      %2,%1"
532  [(set_attr "type" "dmpy")])
533
534(define_expand "umulsidi3"
535  [(set (reg:DI 20)
536        (mult:DI (zero_extend:DI (match_operand:SI 1 "arith_reg_operand" ""))
537                 (zero_extend:DI (match_operand:SI 2 "arith_reg_operand" ""))))
538   (set (match_operand:DI 0 "arith_reg_operand" "")
539        (reg:DI 20))]
540  "TARGET_SH2"
541  "")
542
543(define_insn ""
544  [(set (reg:SI 20)
545        (truncate:SI
546         (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" "r"))
547                               (sign_extend:DI (match_operand:SI 2 "arith_reg_operand" "r")))
548                      (const_int 32))))
549   (clobber (reg:SI 21))]
550  "TARGET_SH2"
551  "dmuls.l      %2,%1"
552  [(set_attr "type" "dmpy")])
553
554(define_expand "smulsi3_highpart"
555  [(parallel [(set (reg:SI 20)
556                   (truncate:SI
557                    (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" ""))
558                                          (sign_extend:DI (match_operand:SI 2 "arith_reg_operand" "")))
559                                 (const_int 32))))
560              (clobber (reg:SI 21))])
561   (set (match_operand:SI 0 "arith_reg_operand" "")
562        (reg:SI 20))]
563  "TARGET_SH2"
564  "")
565
566(define_insn ""
567  [(set (reg:SI 20)
568        (truncate:SI
569         (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "arith_reg_operand" "r"))
570                               (zero_extend:DI (match_operand:SI 2 "arith_reg_operand" "r")))
571                      (const_int 32))))
572   (clobber (reg:SI 21))]
573  "TARGET_SH2"
574  "dmulu.l      %2,%1"
575  [(set_attr "type" "dmpy")])
576
577(define_expand "umulsi3_highpart"
578  [(parallel [(set (reg:SI 20)
579                   (truncate:SI
580                    (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "arith_reg_operand" ""))
581                                          (zero_extend:DI (match_operand:SI 2 "arith_reg_operand" "")))
582                                 (const_int 32))))
583              (clobber (reg:SI 21))])
584   (set (match_operand:SI 0 "arith_reg_operand" "")
585        (reg:SI 20))]
586  "TARGET_SH2"
587  "")
588
589;; -------------------------------------------------------------------------
590;; Logical operations
591;; -------------------------------------------------------------------------
592
593(define_insn ""
594  [(set (match_operand:SI 0 "arith_reg_operand" "=r,z")
595        (and:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
596                (match_operand:SI 2 "logical_operand" "r,L")))]
597  ""
598  "and  %2,%0"
599  [(set_attr "type" "arith")])
600
601;; If the constant is 255, then emit a extu.b instruction instead of an
602;; and, since that will give better code.
603
604(define_expand "andsi3"
605  [(set (match_operand:SI 0 "arith_reg_operand" "")
606        (and:SI (match_operand:SI 1 "arith_reg_operand" "")
607                (match_operand:SI 2 "logical_operand" "")))]
608  ""
609  "
610{
611  if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 255)
612    {
613      emit_insn (gen_zero_extendqisi2 (operands[0],
614                                       gen_lowpart (QImode, operands[1])));
615      DONE;
616    }
617}")
618
619(define_insn "iorsi3"
620  [(set (match_operand:SI 0 "arith_reg_operand" "=r,z")
621        (ior:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
622                (match_operand:SI 2 "logical_operand" "r,L")))]
623  ""
624  "or   %2,%0")
625
626(define_insn "xorsi3"
627  [(set (match_operand:SI 0 "arith_reg_operand" "=z,r")
628        (xor:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
629                (match_operand:SI 2 "logical_operand" "L,r")))]
630  ""
631  "xor  %2,%0"
632  [(set_attr "type" "arith")])
633
634;; -------------------------------------------------------------------------
635;; Shifts and rotates
636;; -------------------------------------------------------------------------
637
638(define_insn "rotlsi3_1"
639  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
640        (rotate:SI (match_operand:SI 1 "arith_reg_operand" "0")
641                   (const_int 1)))
642   (set (reg:SI 18)
643        (lshiftrt:SI (match_dup 1) (const_int 31)))]
644  ""
645  "rotl %0")
646
647(define_insn "rotlsi3_31"
648  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
649        (rotate:SI (match_operand:SI 1 "arith_reg_operand" "0")
650                   (const_int 31)))
651   (clobber (reg:SI 18))]
652  ""
653  "rotr %0")
654
655(define_insn ""
656  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
657        (rotate:SI (match_operand:SI 1 "arith_reg_operand" "r")
658                   (const_int 16)))]
659  ""
660  "swap.w       %1,%0")
661
662(define_expand "rotlsi3"
663  [(set (match_operand:SI 0 "arith_reg_operand" "")
664        (rotate:SI (match_operand:SI 1 "arith_reg_operand" "")
665                   (match_operand:SI 2 "immediate_operand" "")))]
666  ""
667  "
668{
669  if (GET_CODE (operands[2]) != CONST_INT)
670    FAIL;
671
672  if (INTVAL (operands[2]) == 1)
673    {
674      emit_insn (gen_rotlsi3_1 (operands[0], operands[1]));
675      DONE;
676    }
677  else if (INTVAL (operands[2]) == 31)
678    {
679      emit_insn (gen_rotlsi3_31 (operands[0], operands[1]));
680      DONE;
681    }
682  else if (INTVAL (operands[2]) != 16)
683    FAIL;
684}")
685
686(define_insn ""
687  [(set (match_operand:HI 0 "arith_reg_operand" "=r")
688        (rotate:HI (match_operand:HI 1 "arith_reg_operand" "r")
689                   (const_int 8)))]
690  ""
691  "swap.b       %1,%0")
692
693(define_expand "rotlhi3"
694  [(set (match_operand:HI 0 "arith_reg_operand" "")
695        (rotate:HI (match_operand:HI 1 "arith_reg_operand" "")
696                   (match_operand:HI 2 "immediate_operand" "")))]
697  ""
698  "
699{
700  if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 8)
701    FAIL;
702}")
703
704;;
705;; shift left
706
707(define_insn "ashlsi3_d"
708  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
709        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0")
710                   (match_operand:SI 2 "arith_reg_operand" "r")))]
711  "TARGET_SH3"
712  "shld %2,%0")
713
714(define_insn "ashlsi3_k"
715  [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
716        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0,0")
717                   (match_operand:SI 2 "const_int_operand" "M,K")))]
718  "CONST_OK_FOR_K (INTVAL (operands[2]))"
719  "@
720        add     %0,%0
721        shll%O2 %0")
722
723(define_insn "ashlsi3_n"
724  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
725        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0")
726                   (match_operand:SI 2 "const_int_operand" "n")))
727   (clobber (reg:SI 18))]
728  ""
729  "#"
730  [(set (attr "length")
731        (cond [(eq (symbol_ref "shift_insns_rtx (insn)") (const_int 1))
732               (const_string "2")
733               (eq (symbol_ref "shift_insns_rtx (insn)") (const_int 2))
734               (const_string "4")
735               (eq (symbol_ref "shift_insns_rtx (insn)") (const_int 3))
736               (const_string "6")]
737              (const_string "8")))
738   (set_attr "type" "arith")])
739
740(define_split
741  [(set (match_operand:SI 0 "arith_reg_operand" "")
742        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "")
743                   (match_operand:SI 2 "const_int_operand" "n")))
744   (clobber (reg:SI 18))]
745  ""
746  [(use (reg:SI 0))]
747  "
748{
749  gen_shifty_op (ASHIFT, operands);
750  DONE;
751}")
752
753(define_expand "ashlsi3"
754  [(parallel [(set (match_operand:SI 0 "arith_reg_operand" "")
755                   (ashift:SI (match_operand:SI 1 "arith_reg_operand" "")
756                              (match_operand:SI 2 "nonmemory_operand" "")))
757              (clobber (reg:SI 18))])]
758  ""
759  "
760{
761  if (TARGET_SH3 && arith_reg_operand (operands[2], GET_MODE (operands[2])))
762    {
763      emit_insn (gen_ashlsi3_d (operands[0], operands[1], operands[2]));
764      DONE;
765    }
766  if (! immediate_operand (operands[2], GET_MODE (operands[2])))
767    FAIL;
768}")
769
770;
771; arithmetic shift right
772;
773
774(define_insn "ashrsi3_k"
775  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
776        (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
777                     (match_operand:SI 2 "const_int_operand" "M")))
778   (clobber (reg:SI 18))]
779  "INTVAL (operands[2]) == 1"
780  "shar %0"
781  [(set_attr "type" "arith")])
782
783;; ??? This should be a define expand.
784
785(define_insn "ashrsi2_16"
786  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
787        (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "r")
788                     (const_int 16)))]
789  ""
790  "swap.w       %1,%0\;exts.w   %0,%0"
791  [(set_attr "length" "4")])
792
793;; ??? This should be a define expand.
794
795(define_insn "ashrsi2_31"
796  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
797        (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
798                     (const_int 31)))
799   (clobber (reg:SI 18))]
800  ""
801  "@
802   shll %0\;subc        %0,%0"
803  [(set_attr "length" "4")])
804
805(define_insn "ashrsi3_d"
806  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
807        (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
808                     (neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
809  "TARGET_SH3"
810  "shad %2,%1")
811
812(define_insn "ashrsi3_n"
813  [(set (reg:SI 4)
814        (ashiftrt:SI (reg:SI 4)
815                     (match_operand:SI 0 "const_int_operand" "i")))
816   (clobber (reg:SI 18))
817   (clobber (reg:SI 17))
818   (use (match_operand:SI 1 "arith_reg_operand" "r"))]
819  ""
820  "jsr  @%1%#"
821  [(set_attr "type" "sfunc")
822   (set_attr "needs_delay_slot" "yes")])
823
824(define_expand "ashrsi3"
825  [(parallel [(set (match_operand:SI 0 "arith_reg_operand" "")
826                   (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "")
827                                (match_operand:SI 2 "nonmemory_operand" "")))
828              (clobber (reg:SI 18))])]
829  ""
830  "if (expand_ashiftrt (operands)) DONE; else FAIL;")
831
832;; logical shift right
833
834(define_insn "lshrsi3_d"
835  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
836        (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
837                     (neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
838  "TARGET_SH3"
839  "shld %2,%0")
840
841;;  Only the single bit shift clobbers the T bit.
842
843(define_insn "lshrsi3_m"
844  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
845        (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
846                     (match_operand:SI 2 "const_int_operand" "M")))
847   (clobber (reg:SI 18))]
848  "CONST_OK_FOR_M (INTVAL (operands[2]))"
849  "shlr %0")
850
851(define_insn "lshrsi3_k"
852  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
853        (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
854                     (match_operand:SI 2 "const_int_operand" "K")))]
855  "CONST_OK_FOR_K (INTVAL (operands[2]))
856   && ! CONST_OK_FOR_M (INTVAL (operands[2]))"
857  "shlr%O2      %0")
858
859(define_insn "lshrsi3_n"
860  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
861        (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
862                     (match_operand:SI 2 "const_int_operand" "n")))
863   (clobber (reg:SI 18))]
864  ""
865  "#"
866  [(set (attr "length")
867        (cond [(eq (symbol_ref "shift_insns_rtx (insn)") (const_int 1))
868               (const_string "2")
869               (eq (symbol_ref "shift_insns_rtx (insn)") (const_int 2))
870               (const_string "4")
871               (eq (symbol_ref "shift_insns_rtx (insn)") (const_int 3))
872               (const_string "6")]
873              (const_string "8")))
874   (set_attr "type" "arith")])
875
876(define_split
877  [(set (match_operand:SI 0 "arith_reg_operand" "")
878        (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "")
879                     (match_operand:SI 2 "const_int_operand" "n")))
880   (clobber (reg:SI 18))]
881  ""
882  [(use (reg:SI 0))]
883  "
884{
885  gen_shifty_op (LSHIFTRT, operands);
886  DONE;
887}")
888
889(define_expand "lshrsi3"
890  [(parallel [(set (match_operand:SI 0 "arith_reg_operand" "")
891                   (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "")
892                                (match_operand:SI 2 "nonmemory_operand" "")))
893              (clobber (reg:SI 18))])]
894  ""
895  "
896{
897  if (TARGET_SH3 && arith_reg_operand (operands[2], GET_MODE (operands[2])))
898    {
899      rtx count = copy_to_mode_reg (SImode, operands[2]);
900      emit_insn (gen_negsi2 (count, count));
901      emit_insn (gen_ashlsi3_d (operands[0], operands[1], count));
902      DONE;
903    }
904  if (! immediate_operand (operands[2], GET_MODE (operands[2])))
905    FAIL;
906}")
907
908;; ??? This should be a define expand.
909
910(define_insn "ashldi3_k"
911  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
912        (ashift:DI (match_operand:DI 1 "arith_reg_operand" "0")
913                   (const_int 1)))
914   (clobber (reg:SI 18))]
915  ""
916  "shll %R0\;rotcl      %S0"
917  [(set_attr "length" "4")])
918
919(define_expand "ashldi3"
920  [(parallel [(set (match_operand:DI 0 "arith_reg_operand" "")
921                   (ashift:DI (match_operand:DI 1 "arith_reg_operand" "")
922                              (match_operand:DI 2 "immediate_operand" "")))
923              (clobber (reg:SI 18))])]
924  ""
925  "{ if (GET_CODE (operands[2]) != CONST_INT
926         || INTVAL (operands[2]) != 1) FAIL;} ")
927
928;; ??? This should be a define expand.
929
930(define_insn "lshrdi3_k"
931  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
932        (lshiftrt:DI (match_operand:DI 1 "arith_reg_operand" "0")
933                     (const_int 1)))
934   (clobber (reg:SI 18))]
935  ""
936  "shlr %S0\;rotcr      %R0"
937  [(set_attr "length" "4")])
938
939(define_expand "lshrdi3"
940  [(parallel [(set (match_operand:DI 0 "arith_reg_operand" "")
941                   (lshiftrt:DI (match_operand:DI 1 "arith_reg_operand" "")
942                               (match_operand:DI 2 "immediate_operand" "")))
943             (clobber (reg:SI 18))])]
944  ""
945  "{ if (GET_CODE (operands[2]) != CONST_INT
946         || INTVAL (operands[2]) != 1) FAIL;} ")
947
948;; ??? This should be a define expand.
949
950(define_insn "ashrdi3_k"
951  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
952        (ashiftrt:DI (match_operand:DI 1 "arith_reg_operand" "0")
953                     (const_int 1)))
954   (clobber (reg:SI 18))]
955  ""
956  "shar %S0\;rotcr      %R0"
957  [(set_attr "length" "4")])
958
959(define_expand "ashrdi3"
960  [(parallel [(set (match_operand:DI 0 "arith_reg_operand" "")
961                   (ashiftrt:DI (match_operand:DI 1 "arith_reg_operand" "")
962                                (match_operand:DI 2 "immediate_operand" "")))
963              (clobber (reg:SI 18))])]
964  ""
965  "{ if (GET_CODE (operands[2]) != CONST_INT
966         || INTVAL (operands[2]) != 1) FAIL; } ")
967
968;; -------------------------------------------------------------------------
969;; Unary arithmetic
970;; -------------------------------------------------------------------------
971
972(define_insn "negc"
973  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
974        (neg:SI (plus:SI (reg:SI 18)
975                         (match_operand:SI 1 "arith_reg_operand" "r"))))
976   (set (reg:SI 18)
977        (ne:SI (ior:SI (reg:SI 18) (match_dup 1))
978               (const_int 0)))]
979  ""
980  "negc %1,%0"
981  [(set_attr "type" "arith")])
982
983(define_expand "negdi2"
984  [(set (match_operand:DI 0 "arith_reg_operand" "")
985        (neg:DI (match_operand:DI 1 "arith_reg_operand" "")))
986   (clobber (reg:SI 18))]
987  ""
988  "
989{
990  int low_word = (TARGET_LITTLE_ENDIAN ? 0 : 1);
991  int high_word = (TARGET_LITTLE_ENDIAN ? 1 : 0);
992
993  rtx low_src = operand_subword (operands[1], low_word, 0, DImode);
994  rtx high_src = operand_subword (operands[1], high_word, 0, DImode);
995
996  rtx low_dst = operand_subword (operands[0], low_word, 1, DImode);
997  rtx high_dst = operand_subword (operands[0], high_word, 1, DImode);
998
999  emit_insn (gen_clrt ());
1000  emit_insn (gen_negc (low_dst, low_src));
1001  emit_insn (gen_negc (high_dst, high_src));
1002  DONE;
1003}")
1004
1005(define_insn "negsi2"
1006  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1007        (neg:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
1008  ""
1009  "neg  %1,%0"
1010  [(set_attr "type" "arith")])
1011
1012(define_insn "one_cmplsi2"
1013  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1014        (not:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
1015  ""
1016  "not  %1,%0"
1017  [(set_attr "type" "arith")])
1018
1019;; -------------------------------------------------------------------------
1020;; Zero extension instructions
1021;; -------------------------------------------------------------------------
1022
1023(define_insn "zero_extendhisi2"
1024  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1025        (zero_extend:SI (match_operand:HI 1 "arith_reg_operand" "r")))]
1026  ""
1027  "extu.w       %1,%0"
1028  [(set_attr "type" "arith")])
1029
1030(define_insn "zero_extendqisi2"
1031  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1032        (zero_extend:SI (match_operand:QI 1 "arith_reg_operand" "r")))]
1033  ""
1034  "extu.b       %1,%0"
1035  [(set_attr "type" "arith")])
1036
1037(define_insn "zero_extendqihi2"
1038  [(set (match_operand:HI 0 "arith_reg_operand" "=r")
1039        (zero_extend:HI (match_operand:QI 1 "arith_reg_operand" "r")))]
1040  ""
1041  "extu.b       %1,%0"
1042  [(set_attr "type" "arith")])
1043
1044;; -------------------------------------------------------------------------
1045;; Sign extension instructions
1046;; -------------------------------------------------------------------------
1047
1048;; ??? This should be a define expand.
1049;; ??? Or perhaps it should be dropped?
1050
1051(define_insn "extendsidi2"
1052  [(set (match_operand:DI 0 "arith_reg_operand" "=r")
1053        (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" "r")))
1054   (clobber (reg:SI 18))]
1055  ""
1056  "mov  %1,%S0\;mov     %1,%R0\;shll    %S0\;subc       %S0,%S0"
1057  [(set_attr "length" "8")])
1058
1059(define_insn "extendhisi2"
1060  [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
1061        (sign_extend:SI (match_operand:HI 1 "general_movsrc_operand" "r,m")))]
1062  ""
1063  "@
1064        exts.w  %1,%0
1065        mov.w   %1,%0"
1066  [(set_attr "type" "arith,load")])
1067
1068(define_insn "extendqisi2"
1069  [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
1070        (sign_extend:SI (match_operand:QI 1 "general_movsrc_operand" "r,m")))]
1071  ""
1072  "@
1073        exts.b  %1,%0
1074        mov.b   %1,%0"
1075  [(set_attr "type" "arith,load")])
1076
1077(define_insn "extendqihi2"
1078  [(set (match_operand:HI 0 "arith_reg_operand" "=r,r")
1079        (sign_extend:HI (match_operand:QI 1 "general_movsrc_operand" "r,m")))]
1080  ""
1081  "@
1082        exts.b  %1,%0
1083        mov.b   %1,%0"
1084  [(set_attr "type" "arith,load")])
1085
1086;; -------------------------------------------------------------------------
1087;; Move instructions
1088;; -------------------------------------------------------------------------
1089
1090;; define push and pop so it is easy for sh.c
1091
1092(define_insn "push"
1093  [(set (mem:SI (pre_dec:SI (reg:SI 15)))
1094        (match_operand:SI 0 "register_operand" "r,l,x"))]
1095  ""
1096  "@
1097        mov.l   %0,@-r15
1098        sts.l   %0,@-r15
1099        sts.l   %0,@-r15"
1100  [(set_attr "type" "store,pstore,store")
1101   (set_attr "hit_stack" "yes")])
1102
1103(define_insn "pop"
1104  [(set (match_operand:SI 0 "register_operand" "=r,l,x")
1105        (mem:SI (post_inc:SI (reg:SI 15))))]
1106  ""
1107  "@
1108        mov.l   @r15+,%0
1109        lds.l   @r15+,%0
1110        lds.l   @r15+,%0"
1111  [(set_attr "type" "load,pload,load")
1112   (set_attr "hit_stack" "yes")])
1113
1114;; These two patterns can happen as the result of optimization, when
1115;; comparisons get simplified to a move of zero or 1 into the T reg.
1116;; They don't disappear completely, because the T reg is a fixed hard reg.
1117
1118(define_insn "clrt"
1119  [(set (reg:SI 18) (const_int 0))]
1120  ""
1121  "clrt")
1122
1123(define_insn "sett"
1124  [(set (reg:SI 18) (const_int 1))]
1125  ""
1126  "sett")
1127
1128;; t/z is first, so that it will be preferred over r/r when reloading a move
1129;; of a pseudo-reg into the T reg
1130(define_insn "movsi_i"
1131  [(set (match_operand:SI 0 "general_movdst_operand" "=t,r,r,r,r,r,m,<,xl,xl,r")
1132        (match_operand:SI 1 "general_movsrc_operand" "z,Q,rI,m,xl,t,r,xl,r,>,i"))]
1133  "register_operand (operands[0], SImode)
1134   || register_operand (operands[1], SImode)"
1135  "@
1136        tst     %1,%1\;rotcl    %1\;xor #1,%1\;rotcr    %1
1137        mov.l   %1,%0
1138        mov     %1,%0
1139        mov.l   %1,%0
1140        sts     %1,%0
1141        movt    %0
1142        mov.l   %1,%0
1143        sts.l   %1,%0
1144        lds     %1,%0
1145        lds.l   %1,%0
1146        fake    %1,%0"
1147  [(set_attr "type" "move,pcload,move,load,move,store,store,move,load,move,move")
1148   (set_attr "length" "8,*,*,*,*,*,*,*,*,*,*")])
1149
1150(define_expand "movsi"
1151  [(set (match_operand:SI 0 "general_movdst_operand" "")
1152        (match_operand:SI 1 "general_movsrc_operand" ""))]
1153  ""
1154  "{ if (prepare_move_operands (operands, SImode)) DONE; }")
1155
1156(define_insn "movqi_i"
1157  [(set (match_operand:QI 0 "general_movdst_operand" "=r,r,m,r,r,l")
1158        (match_operand:QI 1 "general_movsrc_operand"  "ri,m,r,t,l,r"))]
1159  "arith_reg_operand (operands[0], QImode)
1160   || arith_reg_operand (operands[1], QImode)"
1161  "@
1162        mov     %1,%0
1163        mov.b   %1,%0
1164        mov.b   %1,%0
1165        movt    %0
1166        sts     %1,%0
1167        lds     %1,%0"
1168 [(set_attr "type" "move,load,store,move,move,move")])
1169
1170(define_expand "movqi"
1171  [(set (match_operand:QI 0 "general_operand" "")
1172        (match_operand:QI 1 "general_operand"  ""))]
1173  ""
1174  "{ if (prepare_move_operands (operands, QImode)) DONE; }")
1175
1176(define_insn "movhi_i"
1177  [(set (match_operand:HI 0 "general_movdst_operand" "=r,r,r,r,m,r,l,r")
1178        (match_operand:HI 1 "general_movsrc_operand" "Q,rI,m,t,r,l,r,i"))]
1179  "arith_reg_operand (operands[0], HImode)
1180   || arith_reg_operand (operands[1], HImode)"
1181  "@
1182        mov.w   %1,%0
1183        mov     %1,%0
1184        mov.w   %1,%0
1185        movt    %0
1186        mov.w   %1,%0
1187        sts     %1,%0
1188        lds     %1,%0
1189        fake    %1,%0"
1190  [(set_attr "type" "pcload,move,load,move,store,move,move,move")])
1191
1192(define_expand "movhi"
1193  [(set (match_operand:HI 0 "general_movdst_operand" "")
1194        (match_operand:HI 1 "general_movsrc_operand"  ""))]
1195  ""
1196  "{ if (prepare_move_operands (operands, HImode)) DONE; }")
1197
1198;; ??? This should be a define expand.
1199
1200(define_insn ""
1201  [(set (match_operand:DI 0 "general_movdst_operand" "=r,r,r,m,r,r")
1202        (match_operand:DI 1 "general_movsrc_operand" "Q,r,m,r,i,x"))]
1203  "arith_reg_operand (operands[0], DImode)
1204   || arith_reg_operand (operands[1], DImode)"
1205  "* return output_movedouble (insn, operands, DImode);"
1206  [(set_attr "length" "4")
1207   (set_attr "type" "pcload,move,load,store,move,move")])
1208
1209;; If the output is a register and the input is memory or a register, we have
1210;; to be careful and see which word needs to be loaded first. 
1211
1212(define_split
1213  [(set (match_operand:DI 0 "general_movdst_operand" "")
1214        (match_operand:DI 1 "general_movsrc_operand" ""))]
1215  "reload_completed"
1216  [(set (match_dup 2) (match_dup 3))
1217   (set (match_dup 4) (match_dup 5))]
1218  "
1219{
1220  int regno;
1221
1222  if ((GET_CODE (operands[0]) == MEM
1223       && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
1224      || (GET_CODE (operands[1]) == MEM
1225          && GET_CODE (XEXP (operands[1], 0)) == POST_INC))
1226    FAIL;
1227
1228  if (GET_CODE (operands[0]) == REG)
1229    regno = REGNO (operands[0]);
1230  else if (GET_CODE (operands[0]) == SUBREG)
1231    regno = REGNO (SUBREG_REG (operands[0])) + SUBREG_WORD (operands[0]);
1232  else if (GET_CODE (operands[0]) == MEM)
1233    regno = -1;
1234
1235  if (regno == -1
1236      || ! refers_to_regno_p (regno, regno + 1, operands[1], 0))
1237    {
1238      operands[2] = operand_subword (operands[0], 0, 0, DImode);
1239      operands[3] = operand_subword (operands[1], 0, 0, DImode);
1240      operands[4] = operand_subword (operands[0], 1, 0, DImode);
1241      operands[5] = operand_subword (operands[1], 1, 0, DImode);
1242    }
1243  else
1244    {
1245      operands[2] = operand_subword (operands[0], 1, 0, DImode);
1246      operands[3] = operand_subword (operands[1], 1, 0, DImode);
1247      operands[4] = operand_subword (operands[0], 0, 0, DImode);
1248      operands[5] = operand_subword (operands[1], 0, 0, DImode);
1249    }
1250
1251  if (operands[2] == 0 || operands[3] == 0
1252      || operands[4] == 0 || operands[5] == 0)
1253    FAIL;
1254}")
1255
1256(define_expand "movdi"
1257  [(set (match_operand:DI 0 "general_movdst_operand" "")
1258        (match_operand:DI 1 "general_movsrc_operand" ""))]
1259  ""
1260  "{ if ( prepare_move_operands (operands, DImode)) DONE; }")
1261
1262;; ??? This should be a define expand.
1263
1264(define_insn "movdf_k"
1265  [(set (match_operand:DF 0 "general_movdst_operand" "=r,r,m")
1266        (match_operand:DF 1 "general_movsrc_operand" "r,m,r"))]
1267  "arith_reg_operand (operands[0], DFmode)
1268   || arith_reg_operand (operands[1], DFmode)"
1269  "* return output_movedouble (insn, operands, DFmode);"
1270  [(set_attr "length" "4")
1271   (set_attr "type" "move,load,store")])
1272
1273;; If the output is a register and the input is memory or a register, we have
1274;; to be careful and see which word needs to be loaded first. 
1275
1276(define_split
1277  [(set (match_operand:DF 0 "general_movdst_operand" "")
1278        (match_operand:DF 1 "general_movsrc_operand" ""))]
1279  "reload_completed"
1280  [(set (match_dup 2) (match_dup 3))
1281   (set (match_dup 4) (match_dup 5))]
1282  "
1283{
1284  int regno;
1285
1286  if ((GET_CODE (operands[0]) == MEM
1287       && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
1288      || (GET_CODE (operands[1]) == MEM
1289          && GET_CODE (XEXP (operands[1], 0)) == POST_INC))
1290    FAIL;
1291
1292  if (GET_CODE (operands[0]) == REG)
1293    regno = REGNO (operands[0]);
1294  else if (GET_CODE (operands[0]) == SUBREG)
1295    regno = REGNO (SUBREG_REG (operands[0])) + SUBREG_WORD (operands[0]);
1296  else if (GET_CODE (operands[0]) == MEM)
1297    regno = -1;
1298
1299  if (regno == -1
1300      || ! refers_to_regno_p (regno, regno + 1, operands[1], 0))
1301    {
1302      operands[2] = operand_subword (operands[0], 0, 0, DFmode);
1303      operands[3] = operand_subword (operands[1], 0, 0, DFmode);
1304      operands[4] = operand_subword (operands[0], 1, 0, DFmode);
1305      operands[5] = operand_subword (operands[1], 1, 0, DFmode);
1306    }
1307  else
1308    {
1309      operands[2] = operand_subword (operands[0], 1, 0, DFmode);
1310      operands[3] = operand_subword (operands[1], 1, 0, DFmode);
1311      operands[4] = operand_subword (operands[0], 0, 0, DFmode);
1312      operands[5] = operand_subword (operands[1], 0, 0, DFmode);
1313    }
1314
1315  if (operands[2] == 0 || operands[3] == 0
1316      || operands[4] == 0 || operands[5] == 0)
1317    FAIL;
1318}")
1319
1320(define_expand "movdf"
1321  [(set (match_operand:DF 0 "general_movdst_operand" "")
1322        (match_operand:DF 1 "general_movsrc_operand" ""))]
1323  ""
1324  "{ if (prepare_move_operands (operands, DFmode)) DONE; }")
1325
1326(define_insn "movsf_i"
1327  [(set (match_operand:SF 0 "general_movdst_operand" "=r,r,r,m,l,r")
1328        (match_operand:SF 1 "general_movsrc_operand"  "r,I,m,r,r,l"))]
1329  "arith_reg_operand (operands[0], SFmode)
1330   || arith_reg_operand (operands[1], SFmode)"
1331  "@
1332        mov     %1,%0
1333        mov     %1,%0
1334        mov.l   %1,%0
1335        mov.l   %1,%0
1336        lds     %1,%0
1337        sts     %1,%0"
1338  [(set_attr "type" "move,move,load,store,move,move")])
1339
1340(define_expand "movsf"
1341  [(set (match_operand:SF 0 "general_movdst_operand" "")
1342        (match_operand:SF 1 "general_movsrc_operand" ""))]
1343  ""
1344  "{ if (prepare_move_operands (operands, SFmode)) DONE; }")
1345
1346;; ------------------------------------------------------------------------
1347;; Define the real conditional branch instructions.
1348;; ------------------------------------------------------------------------
1349
1350(define_insn "branch_true"
1351  [(set (pc) (if_then_else (eq (reg:SI 18) (const_int 1))
1352                           (label_ref (match_operand 0 "" ""))
1353                           (pc)))]
1354  ""
1355  "* return output_branch (1, insn, operands);"
1356  [(set_attr "type" "cbranch")])
1357
1358(define_insn "branch_false"
1359  [(set (pc) (if_then_else (ne (reg:SI 18) (const_int 1))
1360                           (label_ref (match_operand 0 "" ""))
1361                           (pc)))]
1362  ""
1363  "* return output_branch (0, insn, operands);"
1364  [(set_attr "type" "cbranch")])
1365
1366(define_insn "inverse_branch_true"
1367  [(set (pc) (if_then_else (eq (reg:SI 18) (const_int 1))
1368                           (pc)
1369                           (label_ref (match_operand 0 "" ""))))]
1370  ""
1371  "* return output_branch (0, insn, operands);"
1372  [(set_attr "type" "cbranch")])
1373
1374(define_insn "inverse_branch_false"
1375  [(set (pc) (if_then_else (ne (reg:SI 18) (const_int 1))
1376                           (pc)
1377                           (label_ref (match_operand 0 "" ""))))]
1378  ""
1379  "* return output_branch (1, insn, operands);"
1380  [(set_attr "type" "cbranch")])
1381
1382;; Conditional branch insns
1383
1384(define_expand "beq"
1385  [(set (reg:SI 18) (eq:SI (match_dup 1) (match_dup 2)))
1386   (set (pc)
1387        (if_then_else (eq (reg:SI 18) (const_int 1))
1388                      (label_ref (match_operand 0 "" ""))
1389                      (pc)))]
1390  ""
1391  "from_compare (operands, EQ);")
1392
1393; There is no bne compare, so we reverse the branch arms.
1394
1395(define_expand "bne"
1396  [(set (reg:SI 18) (eq:SI (match_dup 1) (match_dup 2)))
1397   (set (pc)
1398        (if_then_else (eq (reg:SI 18) (const_int 1))
1399                      (pc)
1400                      (label_ref (match_operand 0 "" ""))))]
1401  ""
1402  "from_compare (operands, NE);")
1403
1404(define_expand "bgt"
1405  [(set (reg:SI 18) (gt:SI (match_dup 1) (match_dup 2)))
1406   (set (pc)
1407        (if_then_else (eq (reg:SI 18) (const_int 1))
1408                      (label_ref (match_operand 0 "" ""))
1409                      (pc)))]
1410  ""
1411  "from_compare (operands, GT);")
1412
1413(define_expand "blt"
1414  [(set (reg:SI 18) (ge:SI (match_dup 1) (match_dup 2)))
1415   (set (pc)
1416        (if_then_else (eq (reg:SI 18) (const_int 1))
1417                      (pc)
1418                      (label_ref (match_operand 0 "" ""))))]
1419  ""
1420  "from_compare (operands, LT);")
1421
1422(define_expand "ble"
1423  [(set (reg:SI 18) (gt:SI (match_dup 1) (match_dup 2)))
1424   (set (pc)
1425        (if_then_else (eq (reg:SI 18) (const_int 1))
1426                      (pc)
1427                      (label_ref (match_operand 0 "" ""))))]
1428  ""
1429  "from_compare (operands, LE);")
1430
1431(define_expand "bge"
1432  [(set (reg:SI 18) (ge:SI (match_dup 1) (match_dup 2)))
1433   (set (pc)
1434        (if_then_else (eq (reg:SI 18) (const_int 1))
1435                      (label_ref (match_operand 0 "" ""))
1436                      (pc)))]
1437  ""
1438  "from_compare (operands, GE);")
1439
1440(define_expand "bgtu"
1441  [(set (reg:SI 18) (gtu:SI (match_dup 1) (match_dup 2)))
1442   (set (pc)
1443        (if_then_else (eq (reg:SI 18) (const_int 1))
1444                      (label_ref (match_operand 0 "" ""))
1445                      (pc)))]
1446  ""
1447  "from_compare (operands, GTU); ")
1448
1449(define_expand "bltu"
1450  [(set (reg:SI 18) (geu:SI (match_dup 1) (match_dup 2)))
1451   (set (pc)
1452                  (if_then_else (eq (reg:SI 18) (const_int 1))
1453                                (pc)
1454                                (label_ref (match_operand 0 "" ""))))]
1455  ""
1456  "from_compare (operands, LTU);")
1457
1458(define_expand "bgeu"
1459  [(set (reg:SI 18) (geu:SI (match_dup 1) (match_dup 2)))
1460   (set (pc)
1461        (if_then_else (eq (reg:SI 18) (const_int 1))
1462                      (label_ref (match_operand 0 "" ""))
1463                      (pc)))]
1464  ""
1465  "from_compare (operands, GEU);")
1466
1467(define_expand "bleu"
1468  [(set (reg:SI 18) (gtu:SI (match_dup 1) (match_dup 2)))
1469   (set (pc)
1470        (if_then_else (eq (reg:SI 18) (const_int 1))
1471                      (pc)
1472                      (label_ref (match_operand 0 "" ""))))]
1473  ""
1474  "from_compare (operands, LEU);")
1475
1476;; ------------------------------------------------------------------------
1477;; Jump and linkage insns
1478;; ------------------------------------------------------------------------
1479
1480(define_insn "jump"
1481  [(set (pc)
1482        (label_ref (match_operand 0 "" "")))]
1483  ""
1484  "*
1485{
1486  /* The length is 16 if the delay slot is unfilled.  */
1487  if (get_attr_length(insn) >= 14)
1488    return output_far_jump(insn, operands[0]);
1489  else
1490    return   \"bra      %l0%#\";
1491}"
1492  [(set_attr "type" "jump")
1493   (set_attr "needs_delay_slot" "yes")])
1494
1495(define_insn "calli"
1496  [(call (mem:SI (match_operand:SI 0 "arith_reg_operand" "r"))
1497         (match_operand 1 "" ""))
1498   (clobber (reg:SI 17))]
1499  ""
1500  "jsr  @%0%#"
1501  [(set_attr "type" "call")
1502   (set_attr "needs_delay_slot" "yes")])
1503
1504(define_insn "call_valuei"
1505  [(set (match_operand 0 "" "=rf")
1506        (call (mem:SI (match_operand:SI 1 "arith_reg_operand" "r"))
1507              (match_operand 2 "" "")))
1508   (clobber (reg:SI 17))]
1509  ""
1510  "jsr  @%1%#"
1511  [(set_attr "type" "call")
1512   (set_attr "needs_delay_slot" "yes")])
1513
1514(define_expand "call"
1515  [(parallel [(call (mem:SI (match_operand 0 "arith_reg_operand" ""))
1516                            (match_operand 1 "" ""))
1517              (clobber (reg:SI 17))])]
1518  ""
1519  "operands[0] = force_reg (SImode, XEXP (operands[0], 0));")
1520
1521(define_expand "call_value"
1522  [(parallel [(set (match_operand 0 "arith_reg_operand" "")
1523                   (call (mem:SI (match_operand 1 "arith_reg_operand" ""))
1524                                 (match_operand 2 "" "")))
1525              (clobber (reg:SI 17))])]
1526  ""
1527  "operands[1] = force_reg (SImode, XEXP (operands[1], 0));")
1528
1529(define_insn "indirect_jump"
1530  [(set (pc)
1531        (match_operand:SI 0 "arith_reg_operand" "r"))]
1532  ""
1533  "jmp  @%0%#"
1534  [(set_attr "needs_delay_slot" "yes")])
1535
1536;; ------------------------------------------------------------------------
1537;; Misc insns
1538;; ------------------------------------------------------------------------
1539
1540;; ??? This combiner pattern does not work, because combine does not combine
1541;; instructions that set a hard register when SMALL_REGISTER_CLASSES is
1542;; defined.  Perhaps use a pseudo-reg for the T bit?
1543
1544(define_insn "dect"
1545  [(parallel [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1546                   (plus:SI (match_dup 0)
1547                            (const_int -1)))
1548              (set (reg:SI 18)
1549                   (eq:SI (plus:SI (match_dup 0) (const_int -1))
1550                          (const_int 0)))])]
1551  "TARGET_SH2"
1552  "dt   %0")
1553
1554(define_insn "nop"
1555  [(const_int 0)]
1556  ""
1557  "nop")
1558
1559;; Load address of a label. This is only generated by the casesi expand.
1560;; This must use unspec, because this only works immediately before a casesi.
1561
1562(define_insn "mova"
1563  [(set (reg:SI 0)
1564        (unspec [(label_ref (match_operand 0 "" ""))] 1))]
1565  ""
1566  "mova %O0,r0"
1567  [(set_attr "in_delay_slot" "no")])
1568
1569;; case instruction for switch statements.
1570
1571;; Operand 0 is index
1572;; operand 1 is the minimum bound
1573;; operand 2 is the maximum bound - minimum bound + 1
1574;; operand 3 is CODE_LABEL for the table;
1575;; operand 4 is the CODE_LABEL to go to if index out of range.
1576
1577;; ??? There should be a barrier after the jump at the end.
1578
1579(define_expand "casesi"
1580  [(set (match_dup 5) (match_operand:SI 0 "arith_reg_operand" ""))
1581   (set (match_dup 5) (minus:SI (match_dup 5)
1582                                (match_operand:SI 1 "arith_operand" "")))
1583   (set (reg:SI 18)
1584        (gtu:SI (match_dup 5)
1585                (match_operand:SI 2 "arith_reg_operand" "")))
1586   (set (pc)
1587        (if_then_else (eq (reg:SI 18)
1588                          (const_int 1))
1589                      (label_ref (match_operand 4 "" ""))
1590                      (pc)))
1591   (set (match_dup 6) (match_dup 5))
1592   (set (match_dup 6) (ashift:SI (match_dup 6) (match_dup 7)))
1593   (set (reg:SI 0) (unspec [(label_ref (match_operand 3 "" ""))] 1))
1594   (parallel [(set (reg:SI 0) (plus:SI (reg:SI 0)
1595                                       (mem:HI (plus:SI (reg:SI 0)
1596                                                        (match_dup 6)))))
1597              (set (match_dup 6) (mem:HI (plus:SI (reg:SI 0) (match_dup 6))))])
1598   (set (pc) (reg:SI 0))]
1599  ""
1600  "
1601{
1602  operands[1] = copy_to_mode_reg (SImode, operands[1]);
1603  operands[2] = copy_to_mode_reg (SImode, operands[2]);
1604  operands[5] = gen_reg_rtx (SImode);
1605  operands[6] = gen_reg_rtx (SImode);
1606  operands[7] = GEN_INT (TARGET_BIGTABLE  ? 2 : 1);
1607}")
1608
1609(define_insn "casesi_worker"
1610  [(set (reg:SI 0)
1611        (plus:SI (reg:SI 0)
1612                 (mem:HI (plus:SI (reg:SI 0)
1613                                  (match_operand:SI 0 "arith_reg_operand" "+r")))))
1614   (set (match_dup 0) (mem:HI (plus:SI (reg:SI 0)
1615                                       (match_dup 0))))]
1616  ""
1617  "*
1618{
1619  if (TARGET_BIGTABLE)
1620    return \"mov.l      @(r0,%0),%0\;add        %0,r0\";
1621  else
1622    return \"mov.w      @(r0,%0),%0\;add        %0,r0\";
1623}"
1624  [(set_attr "length" "4")])
1625
1626(define_insn "return"
1627  [(return)]
1628  "reload_completed"
1629  "%@   %#"
1630  [(set_attr "type" "return")
1631   (set_attr "needs_delay_slot" "yes")])
1632
1633(define_expand "prologue"
1634  [(const_int 0)]
1635  ""
1636  "sh_expand_prologue (); DONE;")
1637
1638(define_expand "epilogue"
1639  [(return)]
1640  ""
1641  "sh_expand_epilogue ();")
1642
1643(define_insn "blockage"
1644  [(unspec_volatile [(const_int 0)] 0)]
1645  ""
1646  ""
1647  [(set_attr "length" "0")])
1648
1649;; ------------------------------------------------------------------------
1650;; Scc instructions
1651;; ------------------------------------------------------------------------
1652
1653(define_insn "movt"
1654  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1655        (eq:SI (reg:SI 18) (const_int 1)))]
1656  ""
1657  "movt %0")
1658
1659(define_expand "seq"
1660  [(set (match_operand:SI 0 "arith_reg_operand" "")
1661        (match_dup 1))]
1662  ""
1663  "operands[1] = prepare_scc_operands (EQ);")
1664
1665(define_expand "slt"
1666  [(set (match_operand:SI 0 "arith_reg_operand" "")
1667        (match_dup 1))]
1668  ""
1669  "operands[1] = prepare_scc_operands (LT);")
1670
1671(define_expand "sle"
1672  [(set (match_operand:SI 0 "arith_reg_operand" "")
1673        (match_dup 1))]
1674  ""
1675  "operands[1] = prepare_scc_operands (LE);")
1676
1677(define_expand "sgt"
1678  [(set (match_operand:SI 0 "arith_reg_operand" "")
1679        (match_dup 1))]
1680  ""
1681  "operands[1] = prepare_scc_operands (GT);")
1682
1683(define_expand "sge"
1684  [(set (match_operand:SI 0 "arith_reg_operand" "")
1685        (match_dup 1))]
1686  ""
1687  "operands[1] = prepare_scc_operands (GE);")
1688
1689(define_expand "sgtu"
1690  [(set (match_operand:SI 0 "arith_reg_operand" "")
1691        (match_dup 1))]
1692  ""
1693  "operands[1] = prepare_scc_operands (GTU);")
1694
1695(define_expand "sltu"
1696  [(set (match_operand:SI 0 "arith_reg_operand" "")
1697        (match_dup 1))]
1698  ""
1699  "operands[1] = prepare_scc_operands (LTU);")
1700
1701(define_expand "sleu"
1702  [(set (match_operand:SI 0 "arith_reg_operand" "")
1703        (match_dup 1))]
1704  ""
1705  "operands[1] = prepare_scc_operands (LEU);")
1706
1707(define_expand "sgeu"
1708  [(set (match_operand:SI 0 "arith_reg_operand" "")
1709        (match_dup 1))]
1710  ""
1711  "operands[1] = prepare_scc_operands (GEU);")
1712
1713(define_expand "sne"
1714  [(set (match_operand:SI 0 "arith_reg_operand" "")
1715        (match_dup 1))
1716   (set (match_dup 0) (xor:SI (match_dup 0) (const_int 1)))]
1717  ""
1718  "operands[1] = prepare_scc_operands (EQ);")
1719
1720;; -------------------------------------------------------------------------
1721;; Instructions to cope with inline literal tables
1722;; -------------------------------------------------------------------------
1723
1724; 2 byte integer in line
1725
1726(define_insn "consttable_2"
1727 [(unspec_volatile [(match_operand:SI 0 "general_operand" "=g")] 2)]
1728 ""
1729 "*
1730{
1731  assemble_integer (operands[0], 2, 1);
1732  return \"\";
1733}"
1734 [(set_attr "length" "2")
1735 (set_attr "in_delay_slot" "no")])
1736
1737; 4 byte integer in line
1738
1739(define_insn "consttable_4"
1740 [(unspec_volatile [(match_operand:SI 0 "general_operand" "=g")] 4)]
1741 ""
1742 "*
1743{
1744  assemble_integer (operands[0], 4, 1);
1745  return \"\";
1746}"
1747 [(set_attr "length" "4")
1748  (set_attr "in_delay_slot" "no")])
1749
1750; 8 byte integer in line
1751
1752(define_insn "consttable_8"
1753 [(unspec_volatile [(match_operand:SI 0 "general_operand" "=g")] 6)]
1754 ""
1755 "*
1756{
1757  assemble_integer (operands[0], 8, 1);
1758  return \"\";
1759}"
1760 [(set_attr "length" "8")
1761  (set_attr "in_delay_slot" "no")])
1762
1763; align to a two byte boundary
1764
1765(define_insn "align_2"
1766 [(unspec_volatile [(const_int 0)] 10)]
1767 ""
1768 ".align 1"
1769 [(set_attr "length" "0")
1770  (set_attr "in_delay_slot" "no")])
1771
1772; align to a four byte boundary
1773
1774(define_insn "align_4"
1775 [(unspec_volatile [(const_int 0)] 5)]
1776 ""
1777 ".align 2"
1778 [(set_attr "in_delay_slot" "no")])
1779
1780; emitted at the end of the literal table, used to emit the
1781; 32bit branch labels if needed.
1782
1783(define_insn "consttable_end"
1784  [(unspec_volatile [(const_int 0)] 11)]
1785  ""
1786  "* return output_jump_label_table ();"
1787  [(set_attr "in_delay_slot" "no")])
1788
1789;; -------------------------------------------------------------------------
1790;; Misc
1791;; -------------------------------------------------------------------------
1792
1793;; String/block move insn.
1794
1795(define_expand "movstrsi"
1796  [(parallel [(set (mem:BLK (match_operand:BLK 0 "" ""))
1797                   (mem:BLK (match_operand:BLK 1 "" "")))
1798              (use (match_operand:SI 2 "nonmemory_operand" ""))
1799              (use (match_operand:SI 3 "immediate_operand" ""))
1800              (clobber (reg:SI 17))
1801              (clobber (reg:SI 4))
1802              (clobber (reg:SI 5))
1803              (clobber (reg:SI 0))])]
1804  ""
1805  "
1806{
1807  if(expand_block_move (operands))
1808     DONE;
1809  else FAIL;
1810}")
1811
1812(define_insn "block_move_real"
1813  [(parallel [(set (mem:BLK (reg:SI 4))
1814                   (mem:BLK (reg:SI 5)))
1815              (use (match_operand:SI 0 "arith_reg_operand" "r"))
1816              (clobber (reg:SI 17))
1817              (clobber (reg:SI 0))])]
1818  ""
1819  "jsr  @%0%#"
1820  [(set_attr "type" "sfunc")
1821   (set_attr "needs_delay_slot" "yes")])
1822
1823(define_insn "block_lump_real"
1824  [(parallel [(set (mem:BLK (reg:SI 4))
1825                   (mem:BLK (reg:SI 5)))
1826              (use (match_operand:SI 0 "arith_reg_operand" "r"))
1827              (use (reg:SI 6))
1828              (clobber (reg:SI 17))
1829              (clobber (reg:SI 4))
1830              (clobber (reg:SI 5))
1831              (clobber (reg:SI 6))
1832              (clobber (reg:SI 0))])]
1833  ""
1834  "jsr  @%0%#"
1835  [(set_attr "type" "sfunc")
1836   (set_attr "needs_delay_slot" "yes")])
1837
1838;; -------------------------------------------------------------------------
1839;; Peepholes
1840;; -------------------------------------------------------------------------
1841
1842;; This matches cases where a stack pointer increment at the start of the
1843;; epilogue combines with a stack slot read loading the return value.
1844
1845(define_peephole
1846  [(set (match_operand:SI 0 "arith_reg_operand" "")
1847        (mem:SI (match_operand:SI 1 "arith_reg_operand" "")))
1848   (set (match_dup 1) (plus:SI (match_dup 1) (const_int 4)))]
1849  "REGNO (operands[1]) != REGNO (operands[0])"
1850  "mov.l        @%1+,%0")
1851
1852;; See the comment on the dt combiner pattern above.
1853
1854(define_peephole
1855  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1856        (plus:SI (match_dup 0)
1857                 (const_int -1)))
1858   (set (reg:SI 18)
1859        (eq:SI (match_dup 0)
1860               (const_int 0)))]
1861  "TARGET_SH2"
1862  "dt   %0")
1863
1864;; These convert sequences such as `mov #k,r0; add r15,r0; mov.l @r0,rn'
1865;; to `mov #k,r0; mov.l @(r0,r15),rn'.  These sequences are generated by
1866;; reload when the constant is too large for a reg+offset address.
1867
1868;; ??? We would get much better code if this was done in reload.  This would
1869;; require modifying find_reloads_address to recognize that if the constant
1870;; is out-of-range for an immediate add, then we get better code by reloading
1871;; the constant into a register than by reloading the sum into a register,
1872;; since the former is one instruction shorter if the address does not need
1873;; to be offsettable.  Unfortunately this does not work, because there is
1874;; only one register, r0, that can be used as an index register.  This register
1875;; is also the function return value register.  So, if we try to force reload
1876;; to use double-reg addresses, then we end up with some instructions that
1877;; need to use r0 twice.  The only way to fix this is to change the calling
1878;; convention so that r0 is not used to return values.
1879
1880(define_peephole
1881  [(set (match_operand:SI 0 "register_operand" "=r")
1882        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1883   (set (mem:SI (match_dup 0))
1884        (match_operand:SI 2 "general_movsrc_operand" ""))]
1885  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1886  "mov.l        %2,@(%0,%1)")
1887
1888(define_peephole
1889  [(set (match_operand:SI 0 "register_operand" "=r")
1890        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1891   (set (match_operand:SI 2 "general_movdst_operand" "")
1892        (mem:SI (match_dup 0)))]
1893  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1894  "mov.l        @(%0,%1),%2")
1895
1896(define_peephole
1897  [(set (match_operand:SI 0 "register_operand" "=r")
1898        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1899   (set (mem:HI (match_dup 0))
1900        (match_operand:HI 2 "general_movsrc_operand" ""))]
1901  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1902  "mov.w        %2,@(%0,%1)")
1903
1904(define_peephole
1905  [(set (match_operand:SI 0 "register_operand" "=r")
1906        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1907   (set (match_operand:HI 2 "general_movdst_operand" "")
1908        (mem:HI (match_dup 0)))]
1909  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1910  "mov.w        @(%0,%1),%2")
1911
1912(define_peephole
1913  [(set (match_operand:SI 0 "register_operand" "=r")
1914        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1915   (set (mem:QI (match_dup 0))
1916        (match_operand:QI 2 "general_movsrc_operand" ""))]
1917  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1918  "mov.b        %2,@(%0,%1)")
1919
1920(define_peephole
1921  [(set (match_operand:SI 0 "register_operand" "=r")
1922        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1923   (set (match_operand:QI 2 "general_movdst_operand" "")
1924        (mem:QI (match_dup 0)))]
1925  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1926  "mov.b        @(%0,%1),%2")
1927
1928(define_peephole
1929  [(set (match_operand:SI 0 "register_operand" "=r")
1930        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1931   (set (mem:SF (match_dup 0))
1932        (match_operand:SF 2 "general_movsrc_operand" ""))]
1933  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1934  "mov.l        %2,@(%0,%1)")
1935
1936(define_peephole
1937  [(set (match_operand:SI 0 "register_operand" "=r")
1938        (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))
1939   (set (match_operand:SF 2 "general_movdst_operand" "")
1940
1941        (mem:SF (match_dup 0)))]
1942  "REGNO (operands[0]) == 0 && reg_unused_after (operands[0], insn)"
1943  "mov.l        @(%0,%1),%2")
Note: See TracBrowser for help on using the repository browser.