avr.md revision 1.1 1 1.1 mrg ;; -*- Mode: Scheme -*-
2 1.1 mrg ;; Machine description for GNU compiler,
3 1.1 mrg ;; for ATMEL AVR micro controllers.
4 1.1 mrg ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008,
5 1.1 mrg ;; 2009, 2010 Free Software Foundation, Inc.
6 1.1 mrg ;; Contributed by Denis Chertykov (chertykov (a] gmail.com)
7 1.1 mrg
8 1.1 mrg ;; This file is part of GCC.
9 1.1 mrg
10 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify
11 1.1 mrg ;; it under the terms of the GNU General Public License as published by
12 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option)
13 1.1 mrg ;; any later version.
14 1.1 mrg
15 1.1 mrg ;; GCC is distributed in the hope that it will be useful,
16 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 mrg ;; GNU General Public License for more details.
19 1.1 mrg
20 1.1 mrg ;; You should have received a copy of the GNU General Public License
21 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
22 1.1 mrg ;; <http://www.gnu.org/licenses/>.
23 1.1 mrg
24 1.1 mrg ;; Special characters after '%':
25 1.1 mrg ;; A No effect (add 0).
26 1.1 mrg ;; B Add 1 to REG number, MEM address or CONST_INT.
27 1.1 mrg ;; C Add 2.
28 1.1 mrg ;; D Add 3.
29 1.1 mrg ;; j Branch condition.
30 1.1 mrg ;; k Reverse branch condition.
31 1.1 mrg ;;..m..Constant Direct Data memory address.
32 1.1 mrg ;; o Displacement for (mem (plus (reg) (const_int))) operands.
33 1.1 mrg ;; p POST_INC or PRE_DEC address as a pointer (X, Y, Z)
34 1.1 mrg ;; r POST_INC or PRE_DEC address as a register (r26, r28, r30)
35 1.1 mrg ;;..x..Constant Direct Program memory address.
36 1.1 mrg ;; ~ Output 'r' if not AVR_HAVE_JMP_CALL.
37 1.1 mrg ;; ! Output 'e' if AVR_HAVE_EIJMP_EICALL.
38 1.1 mrg
39 1.1 mrg ;; UNSPEC usage:
40 1.1 mrg ;; 0 Length of a string, see "strlenhi".
41 1.1 mrg ;; 1 Jump by register pair Z or by table addressed by Z, see "casesi".
42 1.1 mrg
43 1.1 mrg (define_constants
44 1.1 mrg [(REG_X 26)
45 1.1 mrg (REG_Y 28)
46 1.1 mrg (REG_Z 30)
47 1.1 mrg (REG_W 24)
48 1.1 mrg (REG_SP 32)
49 1.1 mrg (TMP_REGNO 0) ; temporary register r0
50 1.1 mrg (ZERO_REGNO 1) ; zero register r1
51 1.1 mrg
52 1.1 mrg (SREG_ADDR 0x5F)
53 1.1 mrg (RAMPZ_ADDR 0x5B)
54 1.1 mrg
55 1.1 mrg (UNSPEC_STRLEN 0)
56 1.1 mrg (UNSPEC_INDEX_JMP 1)
57 1.1 mrg (UNSPEC_SEI 2)
58 1.1 mrg (UNSPEC_CLI 3)
59 1.1 mrg
60 1.1 mrg (UNSPECV_PROLOGUE_SAVES 0)
61 1.1 mrg (UNSPECV_EPILOGUE_RESTORES 1)
62 1.1 mrg (UNSPECV_WRITE_SP_IRQ_ON 2)
63 1.1 mrg (UNSPECV_WRITE_SP_IRQ_OFF 3)
64 1.1 mrg (UNSPECV_GOTO_RECEIVER 4)])
65 1.1 mrg
66 1.1 mrg (include "predicates.md")
67 1.1 mrg (include "constraints.md")
68 1.1 mrg
69 1.1 mrg ;; Condition code settings.
70 1.1 mrg (define_attr "cc" "none,set_czn,set_zn,set_n,compare,clobber"
71 1.1 mrg (const_string "none"))
72 1.1 mrg
73 1.1 mrg (define_attr "type" "branch,branch1,arith,xcall"
74 1.1 mrg (const_string "arith"))
75 1.1 mrg
76 1.1 mrg (define_attr "mcu_have_movw" "yes,no"
77 1.1 mrg (const (if_then_else (symbol_ref "AVR_HAVE_MOVW")
78 1.1 mrg (const_string "yes")
79 1.1 mrg (const_string "no"))))
80 1.1 mrg
81 1.1 mrg (define_attr "mcu_mega" "yes,no"
82 1.1 mrg (const (if_then_else (symbol_ref "AVR_HAVE_JMP_CALL")
83 1.1 mrg (const_string "yes")
84 1.1 mrg (const_string "no"))))
85 1.1 mrg
86 1.1 mrg
87 1.1 mrg ;; The size of instructions in bytes.
88 1.1 mrg ;; XXX may depend from "cc"
89 1.1 mrg
90 1.1 mrg (define_attr "length" ""
91 1.1 mrg (cond [(eq_attr "type" "branch")
92 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
93 1.1 mrg (const_int -63))
94 1.1 mrg (le (minus (pc) (match_dup 0))
95 1.1 mrg (const_int 62)))
96 1.1 mrg (const_int 1)
97 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
98 1.1 mrg (const_int -2045))
99 1.1 mrg (le (minus (pc) (match_dup 0))
100 1.1 mrg (const_int 2045)))
101 1.1 mrg (const_int 2)
102 1.1 mrg (const_int 3)))
103 1.1 mrg (eq_attr "type" "branch1")
104 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
105 1.1 mrg (const_int -62))
106 1.1 mrg (le (minus (pc) (match_dup 0))
107 1.1 mrg (const_int 61)))
108 1.1 mrg (const_int 2)
109 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
110 1.1 mrg (const_int -2044))
111 1.1 mrg (le (minus (pc) (match_dup 0))
112 1.1 mrg (const_int 2043)))
113 1.1 mrg (const_int 3)
114 1.1 mrg (const_int 4)))
115 1.1 mrg (eq_attr "type" "xcall")
116 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
117 1.1 mrg (const_int 1)
118 1.1 mrg (const_int 2))]
119 1.1 mrg (const_int 2)))
120 1.1 mrg
121 1.1 mrg ;; Define mode iterator
122 1.1 mrg (define_mode_iterator QISI [(QI "") (HI "") (SI "")])
123 1.1 mrg (define_mode_iterator QIDI [(QI "") (HI "") (SI "") (DI "")])
124 1.1 mrg (define_mode_iterator HIDI [(HI "") (SI "") (DI "")])
125 1.1 mrg (define_mode_iterator HISI [(HI "") (SI "")])
126 1.1 mrg
127 1.1 mrg ;;========================================================================
128 1.1 mrg ;; The following is used by nonlocal_goto and setjmp.
129 1.1 mrg ;; The receiver pattern will create no instructions since internally
130 1.1 mrg ;; virtual_stack_vars = hard_frame_pointer + 1 so the RTL become R28=R28
131 1.1 mrg ;; This avoids creating add/sub offsets in frame_pointer save/resore.
132 1.1 mrg ;; The 'null' receiver also avoids problems with optimisation
133 1.1 mrg ;; not recognising incoming jmp and removing code that resets frame_pointer.
134 1.1 mrg ;; The code derived from builtins.c.
135 1.1 mrg
136 1.1 mrg (define_expand "nonlocal_goto_receiver"
137 1.1 mrg [(set (reg:HI REG_Y)
138 1.1 mrg (unspec_volatile:HI [(const_int 0)] UNSPECV_GOTO_RECEIVER))]
139 1.1 mrg ""
140 1.1 mrg {
141 1.1 mrg emit_move_insn (virtual_stack_vars_rtx,
142 1.1 mrg gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx,
143 1.1 mrg gen_int_mode (STARTING_FRAME_OFFSET,
144 1.1 mrg Pmode)));
145 1.1 mrg /* This might change the hard frame pointer in ways that aren't
146 1.1 mrg apparent to early optimization passes, so force a clobber. */
147 1.1 mrg emit_clobber (hard_frame_pointer_rtx);
148 1.1 mrg DONE;
149 1.1 mrg })
150 1.1 mrg
151 1.1 mrg
152 1.1 mrg ;; Defining nonlocal_goto_receiver means we must also define this.
153 1.1 mrg ;; even though its function is identical to that in builtins.c
154 1.1 mrg
155 1.1 mrg (define_expand "nonlocal_goto"
156 1.1 mrg [
157 1.1 mrg (use (match_operand 0 "general_operand"))
158 1.1 mrg (use (match_operand 1 "general_operand"))
159 1.1 mrg (use (match_operand 2 "general_operand"))
160 1.1 mrg (use (match_operand 3 "general_operand"))
161 1.1 mrg ]
162 1.1 mrg ""
163 1.1 mrg {
164 1.1 mrg rtx r_label = copy_to_reg (operands[1]);
165 1.1 mrg rtx r_fp = operands[3];
166 1.1 mrg rtx r_sp = operands[2];
167 1.1 mrg
168 1.1 mrg emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
169 1.1 mrg
170 1.1 mrg emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
171 1.1 mrg
172 1.1 mrg emit_move_insn (hard_frame_pointer_rtx, r_fp);
173 1.1 mrg emit_stack_restore (SAVE_NONLOCAL, r_sp, NULL_RTX);
174 1.1 mrg
175 1.1 mrg emit_use (hard_frame_pointer_rtx);
176 1.1 mrg emit_use (stack_pointer_rtx);
177 1.1 mrg
178 1.1 mrg emit_indirect_jump (r_label);
179 1.1 mrg
180 1.1 mrg DONE;
181 1.1 mrg })
182 1.1 mrg
183 1.1 mrg
184 1.1 mrg (define_insn "*pushqi"
185 1.1 mrg [(set (mem:QI (post_dec (reg:HI REG_SP)))
186 1.1 mrg (match_operand:QI 0 "reg_or_0_operand" "r,L"))]
187 1.1 mrg ""
188 1.1 mrg "@
189 1.1 mrg push %0
190 1.1 mrg push __zero_reg__"
191 1.1 mrg [(set_attr "length" "1,1")])
192 1.1 mrg
193 1.1 mrg
194 1.1 mrg (define_insn "*pushhi"
195 1.1 mrg [(set (mem:HI (post_dec (reg:HI REG_SP)))
196 1.1 mrg (match_operand:HI 0 "reg_or_0_operand" "r,L"))]
197 1.1 mrg ""
198 1.1 mrg "@
199 1.1 mrg push %B0\;push %A0
200 1.1 mrg push __zero_reg__\;push __zero_reg__"
201 1.1 mrg [(set_attr "length" "2,2")])
202 1.1 mrg
203 1.1 mrg (define_insn "*pushsi"
204 1.1 mrg [(set (mem:SI (post_dec (reg:HI REG_SP)))
205 1.1 mrg (match_operand:SI 0 "reg_or_0_operand" "r,L"))]
206 1.1 mrg ""
207 1.1 mrg "@
208 1.1 mrg push %D0\;push %C0\;push %B0\;push %A0
209 1.1 mrg push __zero_reg__\;push __zero_reg__\;push __zero_reg__\;push __zero_reg__"
210 1.1 mrg [(set_attr "length" "4,4")])
211 1.1 mrg
212 1.1 mrg (define_insn "*pushsf"
213 1.1 mrg [(set (mem:SF (post_dec (reg:HI REG_SP)))
214 1.1 mrg (match_operand:SF 0 "register_operand" "r"))]
215 1.1 mrg ""
216 1.1 mrg "push %D0
217 1.1 mrg push %C0
218 1.1 mrg push %B0
219 1.1 mrg push %A0"
220 1.1 mrg [(set_attr "length" "4")])
221 1.1 mrg
222 1.1 mrg ;;========================================================================
223 1.1 mrg ;; move byte
224 1.1 mrg ;; The last alternative (any immediate constant to any register) is
225 1.1 mrg ;; very expensive. It should be optimized by peephole2 if a scratch
226 1.1 mrg ;; register is available, but then that register could just as well be
227 1.1 mrg ;; allocated for the variable we are loading. But, most of NO_LD_REGS
228 1.1 mrg ;; are call-saved registers, and most of LD_REGS are call-used registers,
229 1.1 mrg ;; so this may still be a win for registers live across function calls.
230 1.1 mrg
231 1.1 mrg (define_expand "movqi"
232 1.1 mrg [(set (match_operand:QI 0 "nonimmediate_operand" "")
233 1.1 mrg (match_operand:QI 1 "general_operand" ""))]
234 1.1 mrg ""
235 1.1 mrg "/* One of the ops has to be in a register. */
236 1.1 mrg if (!register_operand(operand0, QImode)
237 1.1 mrg && ! (register_operand(operand1, QImode) || const0_rtx == operand1))
238 1.1 mrg operands[1] = copy_to_mode_reg(QImode, operand1);
239 1.1 mrg ")
240 1.1 mrg
241 1.1 mrg (define_insn "*movqi"
242 1.1 mrg [(set (match_operand:QI 0 "nonimmediate_operand" "=r,d,Qm,r,q,r,*r")
243 1.1 mrg (match_operand:QI 1 "general_operand" "rL,i,rL,Qm,r,q,i"))]
244 1.1 mrg "(register_operand (operands[0],QImode)
245 1.1 mrg || register_operand (operands[1], QImode) || const0_rtx == operands[1])"
246 1.1 mrg "* return output_movqi (insn, operands, NULL);"
247 1.1 mrg [(set_attr "length" "1,1,5,5,1,1,4")
248 1.1 mrg (set_attr "cc" "none,none,clobber,clobber,none,none,clobber")])
249 1.1 mrg
250 1.1 mrg ;; This is used in peephole2 to optimize loading immediate constants
251 1.1 mrg ;; if a scratch register from LD_REGS happens to be available.
252 1.1 mrg
253 1.1 mrg (define_insn "*reload_inqi"
254 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=l")
255 1.1 mrg (match_operand:QI 1 "immediate_operand" "i"))
256 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
257 1.1 mrg "reload_completed"
258 1.1 mrg "ldi %2,lo8(%1)
259 1.1 mrg mov %0,%2"
260 1.1 mrg [(set_attr "length" "2")
261 1.1 mrg (set_attr "cc" "none")])
262 1.1 mrg
263 1.1 mrg (define_peephole2
264 1.1 mrg [(match_scratch:QI 2 "d")
265 1.1 mrg (set (match_operand:QI 0 "l_register_operand" "")
266 1.1 mrg (match_operand:QI 1 "immediate_operand" ""))]
267 1.1 mrg "(operands[1] != const0_rtx
268 1.1 mrg && operands[1] != const1_rtx
269 1.1 mrg && operands[1] != constm1_rtx)"
270 1.1 mrg [(parallel [(set (match_dup 0) (match_dup 1))
271 1.1 mrg (clobber (match_dup 2))])]
272 1.1 mrg "")
273 1.1 mrg
274 1.1 mrg ;;============================================================================
275 1.1 mrg ;; move word (16 bit)
276 1.1 mrg
277 1.1 mrg (define_expand "movhi"
278 1.1 mrg [(set (match_operand:HI 0 "nonimmediate_operand" "")
279 1.1 mrg (match_operand:HI 1 "general_operand" ""))]
280 1.1 mrg ""
281 1.1 mrg "
282 1.1 mrg {
283 1.1 mrg /* One of the ops has to be in a register. */
284 1.1 mrg if (!register_operand(operand0, HImode)
285 1.1 mrg && !(register_operand(operand1, HImode) || const0_rtx == operands[1]))
286 1.1 mrg {
287 1.1 mrg operands[1] = copy_to_mode_reg(HImode, operand1);
288 1.1 mrg }
289 1.1 mrg }")
290 1.1 mrg
291 1.1 mrg (define_insn "*movhi_sp"
292 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=q,r")
293 1.1 mrg (match_operand:HI 1 "register_operand" "r,q"))]
294 1.1 mrg "((stack_register_operand(operands[0], HImode) && register_operand (operands[1], HImode))
295 1.1 mrg || (register_operand (operands[0], HImode) && stack_register_operand(operands[1], HImode)))"
296 1.1 mrg "* return output_movhi (insn, operands, NULL);"
297 1.1 mrg [(set_attr "length" "5,2")
298 1.1 mrg (set_attr "cc" "none,none")])
299 1.1 mrg
300 1.1 mrg (define_insn "movhi_sp_r_irq_off"
301 1.1 mrg [(set (match_operand:HI 0 "stack_register_operand" "=q")
302 1.1 mrg (unspec_volatile:HI [(match_operand:HI 1 "register_operand" "r")]
303 1.1 mrg UNSPECV_WRITE_SP_IRQ_OFF))]
304 1.1 mrg ""
305 1.1 mrg "out __SP_H__, %B1
306 1.1 mrg out __SP_L__, %A1"
307 1.1 mrg [(set_attr "length" "2")
308 1.1 mrg (set_attr "cc" "none")])
309 1.1 mrg
310 1.1 mrg (define_insn "movhi_sp_r_irq_on"
311 1.1 mrg [(set (match_operand:HI 0 "stack_register_operand" "=q")
312 1.1 mrg (unspec_volatile:HI [(match_operand:HI 1 "register_operand" "r")]
313 1.1 mrg UNSPECV_WRITE_SP_IRQ_ON))]
314 1.1 mrg ""
315 1.1 mrg "cli
316 1.1 mrg out __SP_H__, %B1
317 1.1 mrg sei
318 1.1 mrg out __SP_L__, %A1"
319 1.1 mrg [(set_attr "length" "4")
320 1.1 mrg (set_attr "cc" "none")])
321 1.1 mrg
322 1.1 mrg (define_peephole2
323 1.1 mrg [(match_scratch:QI 2 "d")
324 1.1 mrg (set (match_operand:HI 0 "l_register_operand" "")
325 1.1 mrg (match_operand:HI 1 "immediate_operand" ""))]
326 1.1 mrg "(operands[1] != const0_rtx
327 1.1 mrg && operands[1] != constm1_rtx)"
328 1.1 mrg [(parallel [(set (match_dup 0) (match_dup 1))
329 1.1 mrg (clobber (match_dup 2))])]
330 1.1 mrg "")
331 1.1 mrg
332 1.1 mrg ;; '*' because it is not used in rtl generation, only in above peephole
333 1.1 mrg (define_insn "*reload_inhi"
334 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
335 1.1 mrg (match_operand:HI 1 "immediate_operand" "i"))
336 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
337 1.1 mrg "reload_completed"
338 1.1 mrg "* return output_reload_inhi (insn, operands, NULL);"
339 1.1 mrg [(set_attr "length" "4")
340 1.1 mrg (set_attr "cc" "none")])
341 1.1 mrg
342 1.1 mrg (define_insn "*movhi"
343 1.1 mrg [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,d,*r,q,r")
344 1.1 mrg (match_operand:HI 1 "general_operand" "rL,m,rL,i,i,r,q"))]
345 1.1 mrg "(register_operand (operands[0],HImode)
346 1.1 mrg || register_operand (operands[1],HImode) || const0_rtx == operands[1])"
347 1.1 mrg "* return output_movhi (insn, operands, NULL);"
348 1.1 mrg [(set_attr "length" "2,6,7,2,6,5,2")
349 1.1 mrg (set_attr "cc" "none,clobber,clobber,none,clobber,none,none")])
350 1.1 mrg
351 1.1 mrg (define_peephole2 ; movw
352 1.1 mrg [(set (match_operand:QI 0 "even_register_operand" "")
353 1.1 mrg (match_operand:QI 1 "even_register_operand" ""))
354 1.1 mrg (set (match_operand:QI 2 "odd_register_operand" "")
355 1.1 mrg (match_operand:QI 3 "odd_register_operand" ""))]
356 1.1 mrg "(AVR_HAVE_MOVW
357 1.1 mrg && REGNO (operands[0]) == REGNO (operands[2]) - 1
358 1.1 mrg && REGNO (operands[1]) == REGNO (operands[3]) - 1)"
359 1.1 mrg [(set (match_dup 4) (match_dup 5))]
360 1.1 mrg {
361 1.1 mrg operands[4] = gen_rtx_REG (HImode, REGNO (operands[0]));
362 1.1 mrg operands[5] = gen_rtx_REG (HImode, REGNO (operands[1]));
363 1.1 mrg })
364 1.1 mrg
365 1.1 mrg (define_peephole2 ; movw_r
366 1.1 mrg [(set (match_operand:QI 0 "odd_register_operand" "")
367 1.1 mrg (match_operand:QI 1 "odd_register_operand" ""))
368 1.1 mrg (set (match_operand:QI 2 "even_register_operand" "")
369 1.1 mrg (match_operand:QI 3 "even_register_operand" ""))]
370 1.1 mrg "(AVR_HAVE_MOVW
371 1.1 mrg && REGNO (operands[2]) == REGNO (operands[0]) - 1
372 1.1 mrg && REGNO (operands[3]) == REGNO (operands[1]) - 1)"
373 1.1 mrg [(set (match_dup 4) (match_dup 5))]
374 1.1 mrg {
375 1.1 mrg operands[4] = gen_rtx_REG (HImode, REGNO (operands[2]));
376 1.1 mrg operands[5] = gen_rtx_REG (HImode, REGNO (operands[3]));
377 1.1 mrg })
378 1.1 mrg
379 1.1 mrg ;;==========================================================================
380 1.1 mrg ;; move double word (32 bit)
381 1.1 mrg
382 1.1 mrg (define_expand "movsi"
383 1.1 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "")
384 1.1 mrg (match_operand:SI 1 "general_operand" ""))]
385 1.1 mrg ""
386 1.1 mrg "
387 1.1 mrg {
388 1.1 mrg /* One of the ops has to be in a register. */
389 1.1 mrg if (!register_operand (operand0, SImode)
390 1.1 mrg && !(register_operand (operand1, SImode) || const0_rtx == operand1))
391 1.1 mrg {
392 1.1 mrg operands[1] = copy_to_mode_reg (SImode, operand1);
393 1.1 mrg }
394 1.1 mrg }")
395 1.1 mrg
396 1.1 mrg
397 1.1 mrg
398 1.1 mrg (define_peephole2 ; movsi_lreg_const
399 1.1 mrg [(match_scratch:QI 2 "d")
400 1.1 mrg (set (match_operand:SI 0 "l_register_operand" "")
401 1.1 mrg (match_operand:SI 1 "immediate_operand" ""))
402 1.1 mrg (match_dup 2)]
403 1.1 mrg "(operands[1] != const0_rtx
404 1.1 mrg && operands[1] != constm1_rtx)"
405 1.1 mrg [(parallel [(set (match_dup 0) (match_dup 1))
406 1.1 mrg (clobber (match_dup 2))])]
407 1.1 mrg "")
408 1.1 mrg
409 1.1 mrg ;; '*' because it is not used in rtl generation.
410 1.1 mrg (define_insn "*reload_insi"
411 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
412 1.1 mrg (match_operand:SI 1 "immediate_operand" "i"))
413 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
414 1.1 mrg "reload_completed"
415 1.1 mrg "* return output_reload_insisf (insn, operands, NULL);"
416 1.1 mrg [(set_attr "length" "8")
417 1.1 mrg (set_attr "cc" "none")])
418 1.1 mrg
419 1.1 mrg
420 1.1 mrg (define_insn "*movsi"
421 1.1 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
422 1.1 mrg (match_operand:SI 1 "general_operand" "r,L,Qm,rL,i,i"))]
423 1.1 mrg "(register_operand (operands[0],SImode)
424 1.1 mrg || register_operand (operands[1],SImode) || const0_rtx == operands[1])"
425 1.1 mrg "* return output_movsisf (insn, operands, NULL);"
426 1.1 mrg [(set_attr "length" "4,4,8,9,4,10")
427 1.1 mrg (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
428 1.1 mrg
429 1.1 mrg ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
430 1.1 mrg ;; move floating point numbers (32 bit)
431 1.1 mrg
432 1.1 mrg (define_expand "movsf"
433 1.1 mrg [(set (match_operand:SF 0 "nonimmediate_operand" "")
434 1.1 mrg (match_operand:SF 1 "general_operand" ""))]
435 1.1 mrg ""
436 1.1 mrg "
437 1.1 mrg {
438 1.1 mrg /* One of the ops has to be in a register. */
439 1.1 mrg if (!register_operand (operand1, SFmode)
440 1.1 mrg && !register_operand (operand0, SFmode))
441 1.1 mrg {
442 1.1 mrg operands[1] = copy_to_mode_reg (SFmode, operand1);
443 1.1 mrg }
444 1.1 mrg }")
445 1.1 mrg
446 1.1 mrg (define_insn "*movsf"
447 1.1 mrg [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
448 1.1 mrg (match_operand:SF 1 "general_operand" "r,G,Qm,r,F,F"))]
449 1.1 mrg "register_operand (operands[0], SFmode)
450 1.1 mrg || register_operand (operands[1], SFmode)"
451 1.1 mrg "* return output_movsisf (insn, operands, NULL);"
452 1.1 mrg [(set_attr "length" "4,4,8,9,4,10")
453 1.1 mrg (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
454 1.1 mrg
455 1.1 mrg ;;=========================================================================
456 1.1 mrg ;; move string (like memcpy)
457 1.1 mrg ;; implement as RTL loop
458 1.1 mrg
459 1.1 mrg (define_expand "movmemhi"
460 1.1 mrg [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
461 1.1 mrg (match_operand:BLK 1 "memory_operand" ""))
462 1.1 mrg (use (match_operand:HI 2 "const_int_operand" ""))
463 1.1 mrg (use (match_operand:HI 3 "const_int_operand" ""))])]
464 1.1 mrg ""
465 1.1 mrg "{
466 1.1 mrg int prob;
467 1.1 mrg HOST_WIDE_INT count;
468 1.1 mrg enum machine_mode mode;
469 1.1 mrg rtx label = gen_label_rtx ();
470 1.1 mrg rtx loop_reg;
471 1.1 mrg rtx jump;
472 1.1 mrg
473 1.1 mrg /* Copy pointers into new psuedos - they will be changed. */
474 1.1 mrg rtx addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
475 1.1 mrg rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
476 1.1 mrg
477 1.1 mrg /* Create rtx for tmp register - we use this as scratch. */
478 1.1 mrg rtx tmp_reg_rtx = gen_rtx_REG (QImode, TMP_REGNO);
479 1.1 mrg
480 1.1 mrg if (GET_CODE (operands[2]) != CONST_INT)
481 1.1 mrg FAIL;
482 1.1 mrg
483 1.1 mrg count = INTVAL (operands[2]);
484 1.1 mrg if (count <= 0)
485 1.1 mrg FAIL;
486 1.1 mrg
487 1.1 mrg /* Work out branch probability for latter use. */
488 1.1 mrg prob = REG_BR_PROB_BASE - REG_BR_PROB_BASE / count;
489 1.1 mrg
490 1.1 mrg /* See if constant fit 8 bits. */
491 1.1 mrg mode = (count < 0x100) ? QImode : HImode;
492 1.1 mrg /* Create loop counter register. */
493 1.1 mrg loop_reg = copy_to_mode_reg (mode, gen_int_mode (count, mode));
494 1.1 mrg
495 1.1 mrg /* Now create RTL code for move loop. */
496 1.1 mrg /* Label at top of loop. */
497 1.1 mrg emit_label (label);
498 1.1 mrg
499 1.1 mrg /* Move one byte into scratch and inc pointer. */
500 1.1 mrg emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, addr1));
501 1.1 mrg emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx));
502 1.1 mrg
503 1.1 mrg /* Move to mem and inc pointer. */
504 1.1 mrg emit_move_insn (gen_rtx_MEM (QImode, addr0), tmp_reg_rtx);
505 1.1 mrg emit_move_insn (addr0, gen_rtx_PLUS (Pmode, addr0, const1_rtx));
506 1.1 mrg
507 1.1 mrg /* Decrement count. */
508 1.1 mrg emit_move_insn (loop_reg, gen_rtx_PLUS (mode, loop_reg, constm1_rtx));
509 1.1 mrg
510 1.1 mrg /* Compare with zero and jump if not equal. */
511 1.1 mrg emit_cmp_and_jump_insns (loop_reg, const0_rtx, NE, NULL_RTX, mode, 1,
512 1.1 mrg label);
513 1.1 mrg /* Set jump probability based on loop count. */
514 1.1 mrg jump = get_last_insn ();
515 1.1 mrg add_reg_note (jump, REG_BR_PROB, GEN_INT (prob));
516 1.1 mrg DONE;
517 1.1 mrg }")
518 1.1 mrg
519 1.1 mrg ;; =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2
520 1.1 mrg ;; memset (%0, %2, %1)
521 1.1 mrg
522 1.1 mrg (define_expand "setmemhi"
523 1.1 mrg [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
524 1.1 mrg (match_operand 2 "const_int_operand" ""))
525 1.1 mrg (use (match_operand:HI 1 "const_int_operand" ""))
526 1.1 mrg (use (match_operand:HI 3 "const_int_operand" "n"))
527 1.1 mrg (clobber (match_scratch:HI 4 ""))
528 1.1 mrg (clobber (match_dup 5))])]
529 1.1 mrg ""
530 1.1 mrg "{
531 1.1 mrg rtx addr0;
532 1.1 mrg int cnt8;
533 1.1 mrg enum machine_mode mode;
534 1.1 mrg
535 1.1 mrg /* If value to set is not zero, use the library routine. */
536 1.1 mrg if (operands[2] != const0_rtx)
537 1.1 mrg FAIL;
538 1.1 mrg
539 1.1 mrg if (GET_CODE (operands[1]) != CONST_INT)
540 1.1 mrg FAIL;
541 1.1 mrg
542 1.1 mrg cnt8 = byte_immediate_operand (operands[1], GET_MODE (operands[1]));
543 1.1 mrg mode = cnt8 ? QImode : HImode;
544 1.1 mrg operands[5] = gen_rtx_SCRATCH (mode);
545 1.1 mrg operands[1] = copy_to_mode_reg (mode,
546 1.1 mrg gen_int_mode (INTVAL (operands[1]), mode));
547 1.1 mrg addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
548 1.1 mrg operands[0] = gen_rtx_MEM (BLKmode, addr0);
549 1.1 mrg }")
550 1.1 mrg
551 1.1 mrg (define_insn "*clrmemqi"
552 1.1 mrg [(set (mem:BLK (match_operand:HI 0 "register_operand" "e"))
553 1.1 mrg (const_int 0))
554 1.1 mrg (use (match_operand:QI 1 "register_operand" "r"))
555 1.1 mrg (use (match_operand:QI 2 "const_int_operand" "n"))
556 1.1 mrg (clobber (match_scratch:HI 3 "=0"))
557 1.1 mrg (clobber (match_scratch:QI 4 "=&1"))]
558 1.1 mrg ""
559 1.1 mrg "st %a0+,__zero_reg__
560 1.1 mrg dec %1
561 1.1 mrg brne .-6"
562 1.1 mrg [(set_attr "length" "3")
563 1.1 mrg (set_attr "cc" "clobber")])
564 1.1 mrg
565 1.1 mrg (define_insn "*clrmemhi"
566 1.1 mrg [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e"))
567 1.1 mrg (const_int 0))
568 1.1 mrg (use (match_operand:HI 1 "register_operand" "!w,d"))
569 1.1 mrg (use (match_operand:HI 2 "const_int_operand" "n,n"))
570 1.1 mrg (clobber (match_scratch:HI 3 "=0,0"))
571 1.1 mrg (clobber (match_scratch:HI 4 "=&1,&1"))]
572 1.1 mrg ""
573 1.1 mrg "*{
574 1.1 mrg if (which_alternative==0)
575 1.1 mrg return (AS2 (st,%a0+,__zero_reg__) CR_TAB
576 1.1 mrg AS2 (sbiw,%A1,1) CR_TAB
577 1.1 mrg AS1 (brne,.-6));
578 1.1 mrg else
579 1.1 mrg return (AS2 (st,%a0+,__zero_reg__) CR_TAB
580 1.1 mrg AS2 (subi,%A1,1) CR_TAB
581 1.1 mrg AS2 (sbci,%B1,0) CR_TAB
582 1.1 mrg AS1 (brne,.-8));
583 1.1 mrg }"
584 1.1 mrg [(set_attr "length" "3,4")
585 1.1 mrg (set_attr "cc" "clobber,clobber")])
586 1.1 mrg
587 1.1 mrg (define_expand "strlenhi"
588 1.1 mrg [(set (match_dup 4)
589 1.1 mrg (unspec:HI [(match_operand:BLK 1 "memory_operand" "")
590 1.1 mrg (match_operand:QI 2 "const_int_operand" "")
591 1.1 mrg (match_operand:HI 3 "immediate_operand" "")]
592 1.1 mrg UNSPEC_STRLEN))
593 1.1 mrg (set (match_dup 4) (plus:HI (match_dup 4)
594 1.1 mrg (const_int -1)))
595 1.1 mrg (set (match_operand:HI 0 "register_operand" "")
596 1.1 mrg (minus:HI (match_dup 4)
597 1.1 mrg (match_dup 5)))]
598 1.1 mrg ""
599 1.1 mrg "{
600 1.1 mrg rtx addr;
601 1.1 mrg if (! (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0))
602 1.1 mrg FAIL;
603 1.1 mrg addr = copy_to_mode_reg (Pmode, XEXP (operands[1],0));
604 1.1 mrg operands[1] = gen_rtx_MEM (BLKmode, addr);
605 1.1 mrg operands[5] = addr;
606 1.1 mrg operands[4] = gen_reg_rtx (HImode);
607 1.1 mrg }")
608 1.1 mrg
609 1.1 mrg (define_insn "*strlenhi"
610 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=e")
611 1.1 mrg (unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand" "%0"))
612 1.1 mrg (const_int 0)
613 1.1 mrg (match_operand:HI 2 "immediate_operand" "i")]
614 1.1 mrg UNSPEC_STRLEN))]
615 1.1 mrg ""
616 1.1 mrg "ld __tmp_reg__,%a0+
617 1.1 mrg tst __tmp_reg__
618 1.1 mrg brne .-6"
619 1.1 mrg [(set_attr "length" "3")
620 1.1 mrg (set_attr "cc" "clobber")])
621 1.1 mrg
622 1.1 mrg ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
623 1.1 mrg ; add bytes
624 1.1 mrg
625 1.1 mrg (define_insn "addqi3"
626 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,d,r,r")
627 1.1 mrg (plus:QI (match_operand:QI 1 "register_operand" "%0,0,0,0")
628 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "r,i,P,N")))]
629 1.1 mrg ""
630 1.1 mrg "@
631 1.1 mrg add %0,%2
632 1.1 mrg subi %0,lo8(-(%2))
633 1.1 mrg inc %0
634 1.1 mrg dec %0"
635 1.1 mrg [(set_attr "length" "1,1,1,1")
636 1.1 mrg (set_attr "cc" "set_czn,set_czn,set_zn,set_zn")])
637 1.1 mrg
638 1.1 mrg
639 1.1 mrg (define_expand "addhi3"
640 1.1 mrg [(set (match_operand:HI 0 "register_operand" "")
641 1.1 mrg (plus:HI (match_operand:HI 1 "register_operand" "")
642 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "")))]
643 1.1 mrg ""
644 1.1 mrg "
645 1.1 mrg {
646 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT)
647 1.1 mrg {
648 1.1 mrg short tmp = INTVAL (operands[2]);
649 1.1 mrg operands[2] = GEN_INT(tmp);
650 1.1 mrg }
651 1.1 mrg }")
652 1.1 mrg
653 1.1 mrg
654 1.1 mrg (define_insn "*addhi3_zero_extend"
655 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
656 1.1 mrg (plus:HI (zero_extend:HI
657 1.1 mrg (match_operand:QI 1 "register_operand" "r"))
658 1.1 mrg (match_operand:HI 2 "register_operand" "0")))]
659 1.1 mrg ""
660 1.1 mrg "add %A0,%1
661 1.1 mrg adc %B0,__zero_reg__"
662 1.1 mrg [(set_attr "length" "2")
663 1.1 mrg (set_attr "cc" "set_n")])
664 1.1 mrg
665 1.1 mrg (define_insn "*addhi3_zero_extend1"
666 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
667 1.1 mrg (plus:HI (match_operand:HI 1 "register_operand" "%0")
668 1.1 mrg (zero_extend:HI
669 1.1 mrg (match_operand:QI 2 "register_operand" "r"))))]
670 1.1 mrg ""
671 1.1 mrg "add %A0,%2
672 1.1 mrg adc %B0,__zero_reg__"
673 1.1 mrg [(set_attr "length" "2")
674 1.1 mrg (set_attr "cc" "set_n")])
675 1.1 mrg
676 1.1 mrg (define_insn "*addhi3_sp_R_pc2"
677 1.1 mrg [(set (match_operand:HI 1 "stack_register_operand" "=q")
678 1.1 mrg (plus:HI (match_operand:HI 2 "stack_register_operand" "q")
679 1.1 mrg (match_operand:HI 0 "avr_sp_immediate_operand" "R")))]
680 1.1 mrg "AVR_2_BYTE_PC"
681 1.1 mrg "*{
682 1.1 mrg if (CONST_INT_P (operands[0]))
683 1.1 mrg {
684 1.1 mrg switch(INTVAL (operands[0]))
685 1.1 mrg {
686 1.1 mrg case -6:
687 1.1 mrg return \"rcall .\" CR_TAB
688 1.1 mrg \"rcall .\" CR_TAB
689 1.1 mrg \"rcall .\";
690 1.1 mrg case -5:
691 1.1 mrg return \"rcall .\" CR_TAB
692 1.1 mrg \"rcall .\" CR_TAB
693 1.1 mrg \"push __tmp_reg__\";
694 1.1 mrg case -4:
695 1.1 mrg return \"rcall .\" CR_TAB
696 1.1 mrg \"rcall .\";
697 1.1 mrg case -3:
698 1.1 mrg return \"rcall .\" CR_TAB
699 1.1 mrg \"push __tmp_reg__\";
700 1.1 mrg case -2:
701 1.1 mrg return \"rcall .\";
702 1.1 mrg case -1:
703 1.1 mrg return \"push __tmp_reg__\";
704 1.1 mrg case 0:
705 1.1 mrg return \"\";
706 1.1 mrg case 1:
707 1.1 mrg return \"pop __tmp_reg__\";
708 1.1 mrg case 2:
709 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
710 1.1 mrg \"pop __tmp_reg__\";
711 1.1 mrg case 3:
712 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
713 1.1 mrg \"pop __tmp_reg__\" CR_TAB
714 1.1 mrg \"pop __tmp_reg__\";
715 1.1 mrg case 4:
716 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
717 1.1 mrg \"pop __tmp_reg__\" CR_TAB
718 1.1 mrg \"pop __tmp_reg__\" CR_TAB
719 1.1 mrg \"pop __tmp_reg__\";
720 1.1 mrg case 5:
721 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
722 1.1 mrg \"pop __tmp_reg__\" CR_TAB
723 1.1 mrg \"pop __tmp_reg__\" CR_TAB
724 1.1 mrg \"pop __tmp_reg__\" CR_TAB
725 1.1 mrg \"pop __tmp_reg__\";
726 1.1 mrg }
727 1.1 mrg }
728 1.1 mrg return \"bug\";
729 1.1 mrg }"
730 1.1 mrg [(set (attr "length")
731 1.1 mrg (cond [(eq (const_int -6) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
732 1.1 mrg (eq (const_int -5) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
733 1.1 mrg (eq (const_int -4) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
734 1.1 mrg (eq (const_int -3) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
735 1.1 mrg (eq (const_int -2) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
736 1.1 mrg (eq (const_int -1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
737 1.1 mrg (eq (const_int 0) (symbol_ref "INTVAL (operands[0])")) (const_int 0)
738 1.1 mrg (eq (const_int 1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
739 1.1 mrg (eq (const_int 2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
740 1.1 mrg (eq (const_int 3) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
741 1.1 mrg (eq (const_int 4) (symbol_ref "INTVAL (operands[0])")) (const_int 4)
742 1.1 mrg (eq (const_int 5) (symbol_ref "INTVAL (operands[0])")) (const_int 5)]
743 1.1 mrg (const_int 0)))])
744 1.1 mrg
745 1.1 mrg (define_insn "*addhi3_sp_R_pc3"
746 1.1 mrg [(set (match_operand:HI 1 "stack_register_operand" "=q")
747 1.1 mrg (plus:HI (match_operand:HI 2 "stack_register_operand" "q")
748 1.1 mrg (match_operand:QI 0 "avr_sp_immediate_operand" "R")))]
749 1.1 mrg "AVR_3_BYTE_PC"
750 1.1 mrg "*{
751 1.1 mrg if (CONST_INT_P (operands[0]))
752 1.1 mrg {
753 1.1 mrg switch(INTVAL (operands[0]))
754 1.1 mrg {
755 1.1 mrg case -6:
756 1.1 mrg return \"rcall .\" CR_TAB
757 1.1 mrg \"rcall .\";
758 1.1 mrg case -5:
759 1.1 mrg return \"rcall .\" CR_TAB
760 1.1 mrg \"push __tmp_reg__\" CR_TAB
761 1.1 mrg \"push __tmp_reg__\";
762 1.1 mrg case -4:
763 1.1 mrg return \"rcall .\" CR_TAB
764 1.1 mrg \"push __tmp_reg__\";
765 1.1 mrg case -3:
766 1.1 mrg return \"rcall .\";
767 1.1 mrg case -2:
768 1.1 mrg return \"push __tmp_reg__\" CR_TAB
769 1.1 mrg \"push __tmp_reg__\";
770 1.1 mrg case -1:
771 1.1 mrg return \"push __tmp_reg__\";
772 1.1 mrg case 0:
773 1.1 mrg return \"\";
774 1.1 mrg case 1:
775 1.1 mrg return \"pop __tmp_reg__\";
776 1.1 mrg case 2:
777 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
778 1.1 mrg \"pop __tmp_reg__\";
779 1.1 mrg case 3:
780 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
781 1.1 mrg \"pop __tmp_reg__\" CR_TAB
782 1.1 mrg \"pop __tmp_reg__\";
783 1.1 mrg case 4:
784 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
785 1.1 mrg \"pop __tmp_reg__\" CR_TAB
786 1.1 mrg \"pop __tmp_reg__\" CR_TAB
787 1.1 mrg \"pop __tmp_reg__\";
788 1.1 mrg case 5:
789 1.1 mrg return \"pop __tmp_reg__\" CR_TAB
790 1.1 mrg \"pop __tmp_reg__\" CR_TAB
791 1.1 mrg \"pop __tmp_reg__\" CR_TAB
792 1.1 mrg \"pop __tmp_reg__\" CR_TAB
793 1.1 mrg \"pop __tmp_reg__\";
794 1.1 mrg }
795 1.1 mrg }
796 1.1 mrg return \"bug\";
797 1.1 mrg }"
798 1.1 mrg [(set (attr "length")
799 1.1 mrg (cond [(eq (const_int -6) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
800 1.1 mrg (eq (const_int -5) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
801 1.1 mrg (eq (const_int -4) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
802 1.1 mrg (eq (const_int -3) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
803 1.1 mrg (eq (const_int -2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
804 1.1 mrg (eq (const_int -1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
805 1.1 mrg (eq (const_int 0) (symbol_ref "INTVAL (operands[0])")) (const_int 0)
806 1.1 mrg (eq (const_int 1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
807 1.1 mrg (eq (const_int 2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
808 1.1 mrg (eq (const_int 3) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
809 1.1 mrg (eq (const_int 4) (symbol_ref "INTVAL (operands[0])")) (const_int 4)
810 1.1 mrg (eq (const_int 5) (symbol_ref "INTVAL (operands[0])")) (const_int 5)]
811 1.1 mrg (const_int 0)))])
812 1.1 mrg
813 1.1 mrg (define_insn "*addhi3"
814 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,!w,!w,d,r,r")
815 1.1 mrg (plus:HI
816 1.1 mrg (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0")
817 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "r,I,J,i,P,N")))]
818 1.1 mrg ""
819 1.1 mrg "@
820 1.1 mrg add %A0,%A2\;adc %B0,%B2
821 1.1 mrg adiw %A0,%2
822 1.1 mrg sbiw %A0,%n2
823 1.1 mrg subi %A0,lo8(-(%2))\;sbci %B0,hi8(-(%2))
824 1.1 mrg sec\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__
825 1.1 mrg sec\;sbc %A0,__zero_reg__\;sbc %B0,__zero_reg__"
826 1.1 mrg [(set_attr "length" "2,1,1,2,3,3")
827 1.1 mrg (set_attr "cc" "set_n,set_czn,set_czn,set_czn,set_n,set_n")])
828 1.1 mrg
829 1.1 mrg (define_insn "addsi3"
830 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,!w,!w,d,r,r")
831 1.1 mrg (plus:SI
832 1.1 mrg (match_operand:SI 1 "register_operand" "%0,0,0,0,0,0")
833 1.1 mrg (match_operand:SI 2 "nonmemory_operand" "r,I,J,i,P,N")))]
834 1.1 mrg ""
835 1.1 mrg "@
836 1.1 mrg add %A0,%A2\;adc %B0,%B2\;adc %C0,%C2\;adc %D0,%D2
837 1.1 mrg adiw %0,%2\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
838 1.1 mrg sbiw %0,%n2\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__
839 1.1 mrg subi %0,lo8(-(%2))\;sbci %B0,hi8(-(%2))\;sbci %C0,hlo8(-(%2))\;sbci %D0,hhi8(-(%2))
840 1.1 mrg sec\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
841 1.1 mrg sec\;sbc %A0,__zero_reg__\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
842 1.1 mrg [(set_attr "length" "4,3,3,4,5,5")
843 1.1 mrg (set_attr "cc" "set_n,set_n,set_czn,set_czn,set_n,set_n")])
844 1.1 mrg
845 1.1 mrg (define_insn "*addsi3_zero_extend"
846 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
847 1.1 mrg (plus:SI (zero_extend:SI
848 1.1 mrg (match_operand:QI 1 "register_operand" "r"))
849 1.1 mrg (match_operand:SI 2 "register_operand" "0")))]
850 1.1 mrg ""
851 1.1 mrg "add %A0,%1
852 1.1 mrg adc %B0,__zero_reg__
853 1.1 mrg adc %C0,__zero_reg__
854 1.1 mrg adc %D0,__zero_reg__"
855 1.1 mrg [(set_attr "length" "4")
856 1.1 mrg (set_attr "cc" "set_n")])
857 1.1 mrg
858 1.1 mrg ;-----------------------------------------------------------------------------
859 1.1 mrg ; sub bytes
860 1.1 mrg (define_insn "subqi3"
861 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,d")
862 1.1 mrg (minus:QI (match_operand:QI 1 "register_operand" "0,0")
863 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "r,i")))]
864 1.1 mrg ""
865 1.1 mrg "@
866 1.1 mrg sub %0,%2
867 1.1 mrg subi %0,lo8(%2)"
868 1.1 mrg [(set_attr "length" "1,1")
869 1.1 mrg (set_attr "cc" "set_czn,set_czn")])
870 1.1 mrg
871 1.1 mrg (define_insn "subhi3"
872 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,d")
873 1.1 mrg (minus:HI (match_operand:HI 1 "register_operand" "0,0")
874 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "r,i")))]
875 1.1 mrg ""
876 1.1 mrg "@
877 1.1 mrg sub %A0,%A2\;sbc %B0,%B2
878 1.1 mrg subi %A0,lo8(%2)\;sbci %B0,hi8(%2)"
879 1.1 mrg [(set_attr "length" "2,2")
880 1.1 mrg (set_attr "cc" "set_czn,set_czn")])
881 1.1 mrg
882 1.1 mrg (define_insn "*subhi3_zero_extend1"
883 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
884 1.1 mrg (minus:HI (match_operand:HI 1 "register_operand" "0")
885 1.1 mrg (zero_extend:HI
886 1.1 mrg (match_operand:QI 2 "register_operand" "r"))))]
887 1.1 mrg ""
888 1.1 mrg "sub %A0,%2
889 1.1 mrg sbc %B0,__zero_reg__"
890 1.1 mrg [(set_attr "length" "2")
891 1.1 mrg (set_attr "cc" "set_n")])
892 1.1 mrg
893 1.1 mrg (define_insn "subsi3"
894 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,d")
895 1.1 mrg (minus:SI (match_operand:SI 1 "register_operand" "0,0")
896 1.1 mrg (match_operand:SI 2 "nonmemory_operand" "r,i")))]
897 1.1 mrg ""
898 1.1 mrg "@
899 1.1 mrg sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2\;sbc %D0,%D2
900 1.1 mrg subi %A0,lo8(%2)\;sbci %B0,hi8(%2)\;sbci %C0,hlo8(%2)\;sbci %D0,hhi8(%2)"
901 1.1 mrg [(set_attr "length" "4,4")
902 1.1 mrg (set_attr "cc" "set_czn,set_czn")])
903 1.1 mrg
904 1.1 mrg (define_insn "*subsi3_zero_extend"
905 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
906 1.1 mrg (minus:SI (match_operand:SI 1 "register_operand" "0")
907 1.1 mrg (zero_extend:SI
908 1.1 mrg (match_operand:QI 2 "register_operand" "r"))))]
909 1.1 mrg ""
910 1.1 mrg "sub %A0,%2
911 1.1 mrg sbc %B0,__zero_reg__
912 1.1 mrg sbc %C0,__zero_reg__
913 1.1 mrg sbc %D0,__zero_reg__"
914 1.1 mrg [(set_attr "length" "4")
915 1.1 mrg (set_attr "cc" "set_n")])
916 1.1 mrg
917 1.1 mrg ;******************************************************************************
918 1.1 mrg ; mul
919 1.1 mrg
920 1.1 mrg (define_expand "mulqi3"
921 1.1 mrg [(set (match_operand:QI 0 "register_operand" "")
922 1.1 mrg (mult:QI (match_operand:QI 1 "register_operand" "")
923 1.1 mrg (match_operand:QI 2 "register_operand" "")))]
924 1.1 mrg ""
925 1.1 mrg "{
926 1.1 mrg if (!AVR_HAVE_MUL)
927 1.1 mrg {
928 1.1 mrg emit_insn (gen_mulqi3_call (operands[0], operands[1], operands[2]));
929 1.1 mrg DONE;
930 1.1 mrg }
931 1.1 mrg }")
932 1.1 mrg
933 1.1 mrg (define_insn "*mulqi3_enh"
934 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
935 1.1 mrg (mult:QI (match_operand:QI 1 "register_operand" "r")
936 1.1 mrg (match_operand:QI 2 "register_operand" "r")))]
937 1.1 mrg "AVR_HAVE_MUL"
938 1.1 mrg "mul %1,%2
939 1.1 mrg mov %0,r0
940 1.1 mrg clr r1"
941 1.1 mrg [(set_attr "length" "3")
942 1.1 mrg (set_attr "cc" "clobber")])
943 1.1 mrg
944 1.1 mrg (define_expand "mulqi3_call"
945 1.1 mrg [(set (reg:QI 24) (match_operand:QI 1 "register_operand" ""))
946 1.1 mrg (set (reg:QI 22) (match_operand:QI 2 "register_operand" ""))
947 1.1 mrg (parallel [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
948 1.1 mrg (clobber (reg:QI 22))])
949 1.1 mrg (set (match_operand:QI 0 "register_operand" "") (reg:QI 24))]
950 1.1 mrg ""
951 1.1 mrg "")
952 1.1 mrg
953 1.1 mrg (define_insn "*mulqi3_call"
954 1.1 mrg [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
955 1.1 mrg (clobber (reg:QI 22))]
956 1.1 mrg "!AVR_HAVE_MUL"
957 1.1 mrg "%~call __mulqi3"
958 1.1 mrg [(set_attr "type" "xcall")
959 1.1 mrg (set_attr "cc" "clobber")])
960 1.1 mrg
961 1.1 mrg (define_insn "mulqihi3"
962 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
963 1.1 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
964 1.1 mrg (sign_extend:HI (match_operand:QI 2 "register_operand" "d"))))]
965 1.1 mrg "AVR_HAVE_MUL"
966 1.1 mrg "muls %1,%2
967 1.1 mrg movw %0,r0
968 1.1 mrg clr r1"
969 1.1 mrg [(set_attr "length" "3")
970 1.1 mrg (set_attr "cc" "clobber")])
971 1.1 mrg
972 1.1 mrg (define_insn "umulqihi3"
973 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
974 1.1 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
975 1.1 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
976 1.1 mrg "AVR_HAVE_MUL"
977 1.1 mrg "mul %1,%2
978 1.1 mrg movw %0,r0
979 1.1 mrg clr r1"
980 1.1 mrg [(set_attr "length" "3")
981 1.1 mrg (set_attr "cc" "clobber")])
982 1.1 mrg
983 1.1 mrg (define_expand "mulhi3"
984 1.1 mrg [(set (match_operand:HI 0 "register_operand" "")
985 1.1 mrg (mult:HI (match_operand:HI 1 "register_operand" "")
986 1.1 mrg (match_operand:HI 2 "register_operand" "")))]
987 1.1 mrg ""
988 1.1 mrg "
989 1.1 mrg {
990 1.1 mrg if (!AVR_HAVE_MUL)
991 1.1 mrg {
992 1.1 mrg emit_insn (gen_mulhi3_call (operands[0], operands[1], operands[2]));
993 1.1 mrg DONE;
994 1.1 mrg }
995 1.1 mrg }")
996 1.1 mrg
997 1.1 mrg (define_insn "*mulhi3_enh"
998 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
999 1.1 mrg (mult:HI (match_operand:HI 1 "register_operand" "r")
1000 1.1 mrg (match_operand:HI 2 "register_operand" "r")))]
1001 1.1 mrg "AVR_HAVE_MUL"
1002 1.1 mrg "mul %A1,%A2
1003 1.1 mrg movw %0,r0
1004 1.1 mrg mul %A1,%B2
1005 1.1 mrg add %B0,r0
1006 1.1 mrg mul %B1,%A2
1007 1.1 mrg add %B0,r0
1008 1.1 mrg clr r1"
1009 1.1 mrg [(set_attr "length" "7")
1010 1.1 mrg (set_attr "cc" "clobber")])
1011 1.1 mrg
1012 1.1 mrg (define_expand "mulhi3_call"
1013 1.1 mrg [(set (reg:HI 24) (match_operand:HI 1 "register_operand" ""))
1014 1.1 mrg (set (reg:HI 22) (match_operand:HI 2 "register_operand" ""))
1015 1.1 mrg (parallel [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
1016 1.1 mrg (clobber (reg:HI 22))
1017 1.1 mrg (clobber (reg:QI 21))])
1018 1.1 mrg (set (match_operand:HI 0 "register_operand" "") (reg:HI 24))]
1019 1.1 mrg ""
1020 1.1 mrg "")
1021 1.1 mrg
1022 1.1 mrg (define_insn "*mulhi3_call"
1023 1.1 mrg [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
1024 1.1 mrg (clobber (reg:HI 22))
1025 1.1 mrg (clobber (reg:QI 21))]
1026 1.1 mrg "!AVR_HAVE_MUL"
1027 1.1 mrg "%~call __mulhi3"
1028 1.1 mrg [(set_attr "type" "xcall")
1029 1.1 mrg (set_attr "cc" "clobber")])
1030 1.1 mrg
1031 1.1 mrg ;; Operand 2 (reg:SI 18) not clobbered on the enhanced core.
1032 1.1 mrg ;; All call-used registers clobbered otherwise - normal library call.
1033 1.1 mrg (define_expand "mulsi3"
1034 1.1 mrg [(set (reg:SI 22) (match_operand:SI 1 "register_operand" ""))
1035 1.1 mrg (set (reg:SI 18) (match_operand:SI 2 "register_operand" ""))
1036 1.1 mrg (parallel [(set (reg:SI 22) (mult:SI (reg:SI 22) (reg:SI 18)))
1037 1.1 mrg (clobber (reg:HI 26))
1038 1.1 mrg (clobber (reg:HI 30))])
1039 1.1 mrg (set (match_operand:SI 0 "register_operand" "") (reg:SI 22))]
1040 1.1 mrg "AVR_HAVE_MUL"
1041 1.1 mrg "")
1042 1.1 mrg
1043 1.1 mrg (define_insn "*mulsi3_call"
1044 1.1 mrg [(set (reg:SI 22) (mult:SI (reg:SI 22) (reg:SI 18)))
1045 1.1 mrg (clobber (reg:HI 26))
1046 1.1 mrg (clobber (reg:HI 30))]
1047 1.1 mrg "AVR_HAVE_MUL"
1048 1.1 mrg "%~call __mulsi3"
1049 1.1 mrg [(set_attr "type" "xcall")
1050 1.1 mrg (set_attr "cc" "clobber")])
1051 1.1 mrg
1052 1.1 mrg ; / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / %
1053 1.1 mrg ; divmod
1054 1.1 mrg
1055 1.1 mrg ;; Generate libgcc.S calls ourselves, because:
1056 1.1 mrg ;; - we know exactly which registers are clobbered (for QI and HI
1057 1.1 mrg ;; modes, some of the call-used registers are preserved)
1058 1.1 mrg ;; - we get both the quotient and the remainder at no extra cost
1059 1.1 mrg ;; - we split the patterns only after the first CSE passes because
1060 1.1 mrg ;; CSE has problems to operate on hard regs.
1061 1.1 mrg ;;
1062 1.1 mrg (define_insn_and_split "divmodqi4"
1063 1.1 mrg [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
1064 1.1 mrg (div:QI (match_operand:QI 1 "pseudo_register_operand" "")
1065 1.1 mrg (match_operand:QI 2 "pseudo_register_operand" "")))
1066 1.1 mrg (set (match_operand:QI 3 "pseudo_register_operand" "")
1067 1.1 mrg (mod:QI (match_dup 1) (match_dup 2)))
1068 1.1 mrg (clobber (reg:QI 22))
1069 1.1 mrg (clobber (reg:QI 23))
1070 1.1 mrg (clobber (reg:QI 24))
1071 1.1 mrg (clobber (reg:QI 25))])]
1072 1.1 mrg ""
1073 1.1 mrg "this divmodqi4 pattern should have been splitted;"
1074 1.1 mrg ""
1075 1.1 mrg [(set (reg:QI 24) (match_dup 1))
1076 1.1 mrg (set (reg:QI 22) (match_dup 2))
1077 1.1 mrg (parallel [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
1078 1.1 mrg (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
1079 1.1 mrg (clobber (reg:QI 22))
1080 1.1 mrg (clobber (reg:QI 23))])
1081 1.1 mrg (set (match_dup 0) (reg:QI 24))
1082 1.1 mrg (set (match_dup 3) (reg:QI 25))]
1083 1.1 mrg "")
1084 1.1 mrg
1085 1.1 mrg (define_insn "*divmodqi4_call"
1086 1.1 mrg [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
1087 1.1 mrg (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
1088 1.1 mrg (clobber (reg:QI 22))
1089 1.1 mrg (clobber (reg:QI 23))]
1090 1.1 mrg ""
1091 1.1 mrg "%~call __divmodqi4"
1092 1.1 mrg [(set_attr "type" "xcall")
1093 1.1 mrg (set_attr "cc" "clobber")])
1094 1.1 mrg
1095 1.1 mrg (define_insn_and_split "udivmodqi4"
1096 1.1 mrg [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
1097 1.1 mrg (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "")
1098 1.1 mrg (match_operand:QI 2 "pseudo_register_operand" "")))
1099 1.1 mrg (set (match_operand:QI 3 "pseudo_register_operand" "")
1100 1.1 mrg (umod:QI (match_dup 1) (match_dup 2)))
1101 1.1 mrg (clobber (reg:QI 22))
1102 1.1 mrg (clobber (reg:QI 23))
1103 1.1 mrg (clobber (reg:QI 24))
1104 1.1 mrg (clobber (reg:QI 25))])]
1105 1.1 mrg ""
1106 1.1 mrg "this udivmodqi4 pattern should have been splitted;"
1107 1.1 mrg ""
1108 1.1 mrg [(set (reg:QI 24) (match_dup 1))
1109 1.1 mrg (set (reg:QI 22) (match_dup 2))
1110 1.1 mrg (parallel [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
1111 1.1 mrg (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
1112 1.1 mrg (clobber (reg:QI 23))])
1113 1.1 mrg (set (match_dup 0) (reg:QI 24))
1114 1.1 mrg (set (match_dup 3) (reg:QI 25))]
1115 1.1 mrg "")
1116 1.1 mrg
1117 1.1 mrg (define_insn "*udivmodqi4_call"
1118 1.1 mrg [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
1119 1.1 mrg (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
1120 1.1 mrg (clobber (reg:QI 23))]
1121 1.1 mrg ""
1122 1.1 mrg "%~call __udivmodqi4"
1123 1.1 mrg [(set_attr "type" "xcall")
1124 1.1 mrg (set_attr "cc" "clobber")])
1125 1.1 mrg
1126 1.1 mrg (define_insn_and_split "divmodhi4"
1127 1.1 mrg [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
1128 1.1 mrg (div:HI (match_operand:HI 1 "pseudo_register_operand" "")
1129 1.1 mrg (match_operand:HI 2 "pseudo_register_operand" "")))
1130 1.1 mrg (set (match_operand:HI 3 "pseudo_register_operand" "")
1131 1.1 mrg (mod:HI (match_dup 1) (match_dup 2)))
1132 1.1 mrg (clobber (reg:QI 21))
1133 1.1 mrg (clobber (reg:HI 22))
1134 1.1 mrg (clobber (reg:HI 24))
1135 1.1 mrg (clobber (reg:HI 26))])]
1136 1.1 mrg ""
1137 1.1 mrg "this should have been splitted;"
1138 1.1 mrg ""
1139 1.1 mrg [(set (reg:HI 24) (match_dup 1))
1140 1.1 mrg (set (reg:HI 22) (match_dup 2))
1141 1.1 mrg (parallel [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
1142 1.1 mrg (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
1143 1.1 mrg (clobber (reg:HI 26))
1144 1.1 mrg (clobber (reg:QI 21))])
1145 1.1 mrg (set (match_dup 0) (reg:HI 22))
1146 1.1 mrg (set (match_dup 3) (reg:HI 24))]
1147 1.1 mrg "")
1148 1.1 mrg
1149 1.1 mrg (define_insn "*divmodhi4_call"
1150 1.1 mrg [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
1151 1.1 mrg (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
1152 1.1 mrg (clobber (reg:HI 26))
1153 1.1 mrg (clobber (reg:QI 21))]
1154 1.1 mrg ""
1155 1.1 mrg "%~call __divmodhi4"
1156 1.1 mrg [(set_attr "type" "xcall")
1157 1.1 mrg (set_attr "cc" "clobber")])
1158 1.1 mrg
1159 1.1 mrg (define_insn_and_split "udivmodhi4"
1160 1.1 mrg [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
1161 1.1 mrg (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "")
1162 1.1 mrg (match_operand:HI 2 "pseudo_register_operand" "")))
1163 1.1 mrg (set (match_operand:HI 3 "pseudo_register_operand" "")
1164 1.1 mrg (umod:HI (match_dup 1) (match_dup 2)))
1165 1.1 mrg (clobber (reg:QI 21))
1166 1.1 mrg (clobber (reg:HI 22))
1167 1.1 mrg (clobber (reg:HI 24))
1168 1.1 mrg (clobber (reg:HI 26))])]
1169 1.1 mrg ""
1170 1.1 mrg "this udivmodhi4 pattern should have been splitted.;"
1171 1.1 mrg ""
1172 1.1 mrg [(set (reg:HI 24) (match_dup 1))
1173 1.1 mrg (set (reg:HI 22) (match_dup 2))
1174 1.1 mrg (parallel [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
1175 1.1 mrg (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
1176 1.1 mrg (clobber (reg:HI 26))
1177 1.1 mrg (clobber (reg:QI 21))])
1178 1.1 mrg (set (match_dup 0) (reg:HI 22))
1179 1.1 mrg (set (match_dup 3) (reg:HI 24))]
1180 1.1 mrg "")
1181 1.1 mrg
1182 1.1 mrg (define_insn "*udivmodhi4_call"
1183 1.1 mrg [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
1184 1.1 mrg (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
1185 1.1 mrg (clobber (reg:HI 26))
1186 1.1 mrg (clobber (reg:QI 21))]
1187 1.1 mrg ""
1188 1.1 mrg "%~call __udivmodhi4"
1189 1.1 mrg [(set_attr "type" "xcall")
1190 1.1 mrg (set_attr "cc" "clobber")])
1191 1.1 mrg
1192 1.1 mrg (define_insn_and_split "divmodsi4"
1193 1.1 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
1194 1.1 mrg (div:SI (match_operand:SI 1 "pseudo_register_operand" "")
1195 1.1 mrg (match_operand:SI 2 "pseudo_register_operand" "")))
1196 1.1 mrg (set (match_operand:SI 3 "pseudo_register_operand" "")
1197 1.1 mrg (mod:SI (match_dup 1) (match_dup 2)))
1198 1.1 mrg (clobber (reg:SI 18))
1199 1.1 mrg (clobber (reg:SI 22))
1200 1.1 mrg (clobber (reg:HI 26))
1201 1.1 mrg (clobber (reg:HI 30))])]
1202 1.1 mrg ""
1203 1.1 mrg "this divmodsi4 pattern should have been splitted;"
1204 1.1 mrg ""
1205 1.1 mrg [(set (reg:SI 22) (match_dup 1))
1206 1.1 mrg (set (reg:SI 18) (match_dup 2))
1207 1.1 mrg (parallel [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
1208 1.1 mrg (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
1209 1.1 mrg (clobber (reg:HI 26))
1210 1.1 mrg (clobber (reg:HI 30))])
1211 1.1 mrg (set (match_dup 0) (reg:SI 18))
1212 1.1 mrg (set (match_dup 3) (reg:SI 22))]
1213 1.1 mrg "")
1214 1.1 mrg
1215 1.1 mrg (define_insn "*divmodsi4_call"
1216 1.1 mrg [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
1217 1.1 mrg (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
1218 1.1 mrg (clobber (reg:HI 26))
1219 1.1 mrg (clobber (reg:HI 30))]
1220 1.1 mrg ""
1221 1.1 mrg "%~call __divmodsi4"
1222 1.1 mrg [(set_attr "type" "xcall")
1223 1.1 mrg (set_attr "cc" "clobber")])
1224 1.1 mrg
1225 1.1 mrg (define_insn_and_split "udivmodsi4"
1226 1.1 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
1227 1.1 mrg (udiv:SI (match_operand:SI 1 "pseudo_register_operand" "")
1228 1.1 mrg (match_operand:SI 2 "pseudo_register_operand" "")))
1229 1.1 mrg (set (match_operand:SI 3 "pseudo_register_operand" "")
1230 1.1 mrg (umod:SI (match_dup 1) (match_dup 2)))
1231 1.1 mrg (clobber (reg:SI 18))
1232 1.1 mrg (clobber (reg:SI 22))
1233 1.1 mrg (clobber (reg:HI 26))
1234 1.1 mrg (clobber (reg:HI 30))])]
1235 1.1 mrg ""
1236 1.1 mrg "this udivmodsi4 pattern should have been splitted;"
1237 1.1 mrg ""
1238 1.1 mrg [(set (reg:SI 22) (match_dup 1))
1239 1.1 mrg (set (reg:SI 18) (match_dup 2))
1240 1.1 mrg (parallel [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
1241 1.1 mrg (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
1242 1.1 mrg (clobber (reg:HI 26))
1243 1.1 mrg (clobber (reg:HI 30))])
1244 1.1 mrg (set (match_dup 0) (reg:SI 18))
1245 1.1 mrg (set (match_dup 3) (reg:SI 22))]
1246 1.1 mrg "")
1247 1.1 mrg
1248 1.1 mrg (define_insn "*udivmodsi4_call"
1249 1.1 mrg [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
1250 1.1 mrg (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
1251 1.1 mrg (clobber (reg:HI 26))
1252 1.1 mrg (clobber (reg:HI 30))]
1253 1.1 mrg ""
1254 1.1 mrg "%~call __udivmodsi4"
1255 1.1 mrg [(set_attr "type" "xcall")
1256 1.1 mrg (set_attr "cc" "clobber")])
1257 1.1 mrg
1258 1.1 mrg ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1259 1.1 mrg ; and
1260 1.1 mrg
1261 1.1 mrg (define_insn "andqi3"
1262 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,d")
1263 1.1 mrg (and:QI (match_operand:QI 1 "register_operand" "%0,0")
1264 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "r,i")))]
1265 1.1 mrg ""
1266 1.1 mrg "@
1267 1.1 mrg and %0,%2
1268 1.1 mrg andi %0,lo8(%2)"
1269 1.1 mrg [(set_attr "length" "1,1")
1270 1.1 mrg (set_attr "cc" "set_zn,set_zn")])
1271 1.1 mrg
1272 1.1 mrg (define_insn "andhi3"
1273 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,d,r")
1274 1.1 mrg (and:HI (match_operand:HI 1 "register_operand" "%0,0,0")
1275 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "r,i,M")))
1276 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,&d"))]
1277 1.1 mrg ""
1278 1.1 mrg {
1279 1.1 mrg if (which_alternative==0)
1280 1.1 mrg return ("and %A0,%A2" CR_TAB
1281 1.1 mrg "and %B0,%B2");
1282 1.1 mrg else if (which_alternative==1)
1283 1.1 mrg {
1284 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT)
1285 1.1 mrg {
1286 1.1 mrg int mask = INTVAL (operands[2]);
1287 1.1 mrg if ((mask & 0xff) != 0xff)
1288 1.1 mrg output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
1289 1.1 mrg if ((mask & 0xff00) != 0xff00)
1290 1.1 mrg output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
1291 1.1 mrg return "";
1292 1.1 mrg }
1293 1.1 mrg return (AS2 (andi,%A0,lo8(%2)) CR_TAB
1294 1.1 mrg AS2 (andi,%B0,hi8(%2)));
1295 1.1 mrg }
1296 1.1 mrg return (AS2 (ldi,%3,lo8(%2)) CR_TAB
1297 1.1 mrg "and %A0,%3" CR_TAB
1298 1.1 mrg AS1 (clr,%B0));
1299 1.1 mrg }
1300 1.1 mrg [(set_attr "length" "2,2,3")
1301 1.1 mrg (set_attr "cc" "set_n,clobber,set_n")])
1302 1.1 mrg
1303 1.1 mrg (define_insn "andsi3"
1304 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,d")
1305 1.1 mrg (and:SI (match_operand:SI 1 "register_operand" "%0,0")
1306 1.1 mrg (match_operand:SI 2 "nonmemory_operand" "r,i")))]
1307 1.1 mrg ""
1308 1.1 mrg {
1309 1.1 mrg if (which_alternative==0)
1310 1.1 mrg return ("and %0,%2" CR_TAB
1311 1.1 mrg "and %B0,%B2" CR_TAB
1312 1.1 mrg "and %C0,%C2" CR_TAB
1313 1.1 mrg "and %D0,%D2");
1314 1.1 mrg else if (which_alternative==1)
1315 1.1 mrg {
1316 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT)
1317 1.1 mrg {
1318 1.1 mrg HOST_WIDE_INT mask = INTVAL (operands[2]);
1319 1.1 mrg if ((mask & 0xff) != 0xff)
1320 1.1 mrg output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
1321 1.1 mrg if ((mask & 0xff00) != 0xff00)
1322 1.1 mrg output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
1323 1.1 mrg if ((mask & 0xff0000L) != 0xff0000L)
1324 1.1 mrg output_asm_insn (AS2 (andi,%C0,hlo8(%2)), operands);
1325 1.1 mrg if ((mask & 0xff000000L) != 0xff000000L)
1326 1.1 mrg output_asm_insn (AS2 (andi,%D0,hhi8(%2)), operands);
1327 1.1 mrg return "";
1328 1.1 mrg }
1329 1.1 mrg return (AS2 (andi, %A0,lo8(%2)) CR_TAB
1330 1.1 mrg AS2 (andi, %B0,hi8(%2)) CR_TAB
1331 1.1 mrg AS2 (andi, %C0,hlo8(%2)) CR_TAB
1332 1.1 mrg AS2 (andi, %D0,hhi8(%2)));
1333 1.1 mrg }
1334 1.1 mrg return "bug";
1335 1.1 mrg }
1336 1.1 mrg [(set_attr "length" "4,4")
1337 1.1 mrg (set_attr "cc" "set_n,clobber")])
1338 1.1 mrg
1339 1.1 mrg (define_peephole2 ; andi
1340 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1341 1.1 mrg (and:QI (match_dup 0)
1342 1.1 mrg (match_operand:QI 1 "const_int_operand" "")))
1343 1.1 mrg (set (match_dup 0)
1344 1.1 mrg (and:QI (match_dup 0)
1345 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1346 1.1 mrg ""
1347 1.1 mrg [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1348 1.1 mrg {
1349 1.1 mrg operands[1] = GEN_INT (INTVAL (operands[1]) & INTVAL (operands[2]));
1350 1.1 mrg })
1351 1.1 mrg
1352 1.1 mrg ;;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1353 1.1 mrg ;; ior
1354 1.1 mrg
1355 1.1 mrg (define_insn "iorqi3"
1356 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,d")
1357 1.1 mrg (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
1358 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "r,i")))]
1359 1.1 mrg ""
1360 1.1 mrg "@
1361 1.1 mrg or %0,%2
1362 1.1 mrg ori %0,lo8(%2)"
1363 1.1 mrg [(set_attr "length" "1,1")
1364 1.1 mrg (set_attr "cc" "set_zn,set_zn")])
1365 1.1 mrg
1366 1.1 mrg (define_insn "iorhi3"
1367 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,d")
1368 1.1 mrg (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
1369 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "r,i")))]
1370 1.1 mrg ""
1371 1.1 mrg {
1372 1.1 mrg if (which_alternative==0)
1373 1.1 mrg return ("or %A0,%A2" CR_TAB
1374 1.1 mrg "or %B0,%B2");
1375 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT)
1376 1.1 mrg {
1377 1.1 mrg int mask = INTVAL (operands[2]);
1378 1.1 mrg if (mask & 0xff)
1379 1.1 mrg output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
1380 1.1 mrg if (mask & 0xff00)
1381 1.1 mrg output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
1382 1.1 mrg return "";
1383 1.1 mrg }
1384 1.1 mrg return (AS2 (ori,%0,lo8(%2)) CR_TAB
1385 1.1 mrg AS2 (ori,%B0,hi8(%2)));
1386 1.1 mrg }
1387 1.1 mrg [(set_attr "length" "2,2")
1388 1.1 mrg (set_attr "cc" "set_n,clobber")])
1389 1.1 mrg
1390 1.1 mrg (define_insn "*iorhi3_clobber"
1391 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r")
1392 1.1 mrg (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
1393 1.1 mrg (match_operand:HI 2 "immediate_operand" "M,i")))
1394 1.1 mrg (clobber (match_scratch:QI 3 "=&d,&d"))]
1395 1.1 mrg ""
1396 1.1 mrg "@
1397 1.1 mrg ldi %3,lo8(%2)\;or %A0,%3
1398 1.1 mrg ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3"
1399 1.1 mrg [(set_attr "length" "2,4")
1400 1.1 mrg (set_attr "cc" "clobber,set_n")])
1401 1.1 mrg
1402 1.1 mrg (define_insn "iorsi3"
1403 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,d")
1404 1.1 mrg (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
1405 1.1 mrg (match_operand:SI 2 "nonmemory_operand" "r,i")))]
1406 1.1 mrg ""
1407 1.1 mrg {
1408 1.1 mrg if (which_alternative==0)
1409 1.1 mrg return ("or %0,%2" CR_TAB
1410 1.1 mrg "or %B0,%B2" CR_TAB
1411 1.1 mrg "or %C0,%C2" CR_TAB
1412 1.1 mrg "or %D0,%D2");
1413 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT)
1414 1.1 mrg {
1415 1.1 mrg HOST_WIDE_INT mask = INTVAL (operands[2]);
1416 1.1 mrg if (mask & 0xff)
1417 1.1 mrg output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
1418 1.1 mrg if (mask & 0xff00)
1419 1.1 mrg output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
1420 1.1 mrg if (mask & 0xff0000L)
1421 1.1 mrg output_asm_insn (AS2 (ori,%C0,hlo8(%2)), operands);
1422 1.1 mrg if (mask & 0xff000000L)
1423 1.1 mrg output_asm_insn (AS2 (ori,%D0,hhi8(%2)), operands);
1424 1.1 mrg return "";
1425 1.1 mrg }
1426 1.1 mrg return (AS2 (ori, %A0,lo8(%2)) CR_TAB
1427 1.1 mrg AS2 (ori, %B0,hi8(%2)) CR_TAB
1428 1.1 mrg AS2 (ori, %C0,hlo8(%2)) CR_TAB
1429 1.1 mrg AS2 (ori, %D0,hhi8(%2)));
1430 1.1 mrg }
1431 1.1 mrg [(set_attr "length" "4,4")
1432 1.1 mrg (set_attr "cc" "set_n,clobber")])
1433 1.1 mrg
1434 1.1 mrg (define_insn "*iorsi3_clobber"
1435 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r")
1436 1.1 mrg (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
1437 1.1 mrg (match_operand:SI 2 "immediate_operand" "M,i")))
1438 1.1 mrg (clobber (match_scratch:QI 3 "=&d,&d"))]
1439 1.1 mrg ""
1440 1.1 mrg "@
1441 1.1 mrg ldi %3,lo8(%2)\;or %A0,%3
1442 1.1 mrg ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3\;ldi %3,hlo8(%2)\;or %C0,%3\;ldi %3,hhi8(%2)\;or %D0,%3"
1443 1.1 mrg [(set_attr "length" "2,8")
1444 1.1 mrg (set_attr "cc" "clobber,set_n")])
1445 1.1 mrg
1446 1.1 mrg ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1447 1.1 mrg ;; xor
1448 1.1 mrg
1449 1.1 mrg (define_insn "xorqi3"
1450 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1451 1.1 mrg (xor:QI (match_operand:QI 1 "register_operand" "%0")
1452 1.1 mrg (match_operand:QI 2 "register_operand" "r")))]
1453 1.1 mrg ""
1454 1.1 mrg "eor %0,%2"
1455 1.1 mrg [(set_attr "length" "1")
1456 1.1 mrg (set_attr "cc" "set_zn")])
1457 1.1 mrg
1458 1.1 mrg (define_insn "xorhi3"
1459 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1460 1.1 mrg (xor:HI (match_operand:HI 1 "register_operand" "%0")
1461 1.1 mrg (match_operand:HI 2 "register_operand" "r")))]
1462 1.1 mrg ""
1463 1.1 mrg "eor %0,%2
1464 1.1 mrg eor %B0,%B2"
1465 1.1 mrg [(set_attr "length" "2")
1466 1.1 mrg (set_attr "cc" "set_n")])
1467 1.1 mrg
1468 1.1 mrg (define_insn "xorsi3"
1469 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1470 1.1 mrg (xor:SI (match_operand:SI 1 "register_operand" "%0")
1471 1.1 mrg (match_operand:SI 2 "register_operand" "r")))]
1472 1.1 mrg ""
1473 1.1 mrg "eor %0,%2
1474 1.1 mrg eor %B0,%B2
1475 1.1 mrg eor %C0,%C2
1476 1.1 mrg eor %D0,%D2"
1477 1.1 mrg [(set_attr "length" "4")
1478 1.1 mrg (set_attr "cc" "set_n")])
1479 1.1 mrg
1480 1.1 mrg ;; swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap
1481 1.1 mrg ;; swap
1482 1.1 mrg
1483 1.1 mrg (define_expand "rotlqi3"
1484 1.1 mrg [(set (match_operand:QI 0 "register_operand" "")
1485 1.1 mrg (rotate:QI (match_operand:QI 1 "register_operand" "")
1486 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1487 1.1 mrg ""
1488 1.1 mrg "
1489 1.1 mrg {
1490 1.1 mrg if (!CONST_INT_P (operands[2]) || (INTVAL (operands[2]) != 4))
1491 1.1 mrg FAIL;
1492 1.1 mrg }")
1493 1.1 mrg
1494 1.1 mrg (define_insn "*rotlqi3_4"
1495 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1496 1.1 mrg (rotate:QI (match_operand:QI 1 "register_operand" "0")
1497 1.1 mrg (const_int 4)))]
1498 1.1 mrg ""
1499 1.1 mrg "swap %0"
1500 1.1 mrg [(set_attr "length" "1")
1501 1.1 mrg (set_attr "cc" "none")])
1502 1.1 mrg
1503 1.1 mrg ;; Split all rotates of HI,SI and DImode registers where rotation is by
1504 1.1 mrg ;; a whole number of bytes. The split creates the appropriate moves and
1505 1.1 mrg ;; considers all overlap situations. DImode is split before reload.
1506 1.1 mrg
1507 1.1 mrg ;; HImode does not need scratch. Use attribute for this constraint.
1508 1.1 mrg ;; Use QI scratch for DI mode as this is often split into byte sized operands.
1509 1.1 mrg
1510 1.1 mrg (define_mode_attr rotx [(DI "&r,&r,X") (SI "&r,&r,X") (HI "X,X,X")])
1511 1.1 mrg (define_mode_attr rotsmode [(DI "QI") (SI "HI") (HI "QI")])
1512 1.1 mrg
1513 1.1 mrg (define_expand "rotl<mode>3"
1514 1.1 mrg [(parallel [(set (match_operand:HIDI 0 "register_operand" "")
1515 1.1 mrg (rotate:HIDI (match_operand:HIDI 1 "register_operand" "")
1516 1.1 mrg (match_operand:VOID 2 "const_int_operand" "")))
1517 1.1 mrg (clobber (match_operand 3 ""))])]
1518 1.1 mrg ""
1519 1.1 mrg "
1520 1.1 mrg {
1521 1.1 mrg if (CONST_INT_P (operands[2]) && 0 == (INTVAL (operands[2]) % 8))
1522 1.1 mrg {
1523 1.1 mrg if (AVR_HAVE_MOVW && 0 == INTVAL (operands[2]) % 16)
1524 1.1 mrg operands[3] = gen_reg_rtx (<rotsmode>mode);
1525 1.1 mrg else
1526 1.1 mrg operands[3] = gen_reg_rtx (QImode);
1527 1.1 mrg }
1528 1.1 mrg else
1529 1.1 mrg FAIL;
1530 1.1 mrg }")
1531 1.1 mrg
1532 1.1 mrg
1533 1.1 mrg ;; Overlapping non-HImode registers often (but not always) need a scratch.
1534 1.1 mrg ;; The best we can do is use early clobber alternative "#&r" so that
1535 1.1 mrg ;; completely non-overlapping operands dont get a scratch but # so register
1536 1.1 mrg ;; allocation does not prefer non-overlapping.
1537 1.1 mrg
1538 1.1 mrg
1539 1.1 mrg ; Split word aligned rotates using scratch that is mode dependent.
1540 1.1 mrg (define_insn_and_split "*rotw<mode>"
1541 1.1 mrg [(set (match_operand:HIDI 0 "register_operand" "=r,r,#&r")
1542 1.1 mrg (rotate:HIDI (match_operand:HIDI 1 "register_operand" "0,r,r")
1543 1.1 mrg (match_operand 2 "immediate_operand" "n,n,n")))
1544 1.1 mrg (clobber (match_operand:<rotsmode> 3 "register_operand" "=<rotx>" ))]
1545 1.1 mrg "(CONST_INT_P (operands[2]) &&
1546 1.1 mrg (0 == (INTVAL (operands[2]) % 16) && AVR_HAVE_MOVW))"
1547 1.1 mrg "#"
1548 1.1 mrg "&& (reload_completed || <MODE>mode == DImode)"
1549 1.1 mrg [(const_int 0)]
1550 1.1 mrg "avr_rotate_bytes (operands);
1551 1.1 mrg DONE;"
1552 1.1 mrg )
1553 1.1 mrg
1554 1.1 mrg
1555 1.1 mrg ; Split byte aligned rotates using scratch that is always QI mode.
1556 1.1 mrg (define_insn_and_split "*rotb<mode>"
1557 1.1 mrg [(set (match_operand:HIDI 0 "register_operand" "=r,r,#&r")
1558 1.1 mrg (rotate:HIDI (match_operand:HIDI 1 "register_operand" "0,r,r")
1559 1.1 mrg (match_operand 2 "immediate_operand" "n,n,n")))
1560 1.1 mrg (clobber (match_operand:QI 3 "register_operand" "=<rotx>" ))]
1561 1.1 mrg "(CONST_INT_P (operands[2]) &&
1562 1.1 mrg (8 == (INTVAL (operands[2]) % 16)
1563 1.1 mrg || (!AVR_HAVE_MOVW && 0 == (INTVAL (operands[2]) % 16))))"
1564 1.1 mrg "#"
1565 1.1 mrg "&& (reload_completed || <MODE>mode == DImode)"
1566 1.1 mrg [(const_int 0)]
1567 1.1 mrg "avr_rotate_bytes (operands);
1568 1.1 mrg DONE;"
1569 1.1 mrg )
1570 1.1 mrg
1571 1.1 mrg
1572 1.1 mrg ;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
1573 1.1 mrg ;; arithmetic shift left
1574 1.1 mrg
1575 1.1 mrg (define_expand "ashlqi3"
1576 1.1 mrg [(set (match_operand:QI 0 "register_operand" "")
1577 1.1 mrg (ashift:QI (match_operand:QI 1 "register_operand" "")
1578 1.1 mrg (match_operand:QI 2 "general_operand" "")))]
1579 1.1 mrg ""
1580 1.1 mrg "")
1581 1.1 mrg
1582 1.1 mrg (define_split ; ashlqi3_const4
1583 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1584 1.1 mrg (ashift:QI (match_dup 0)
1585 1.1 mrg (const_int 4)))]
1586 1.1 mrg ""
1587 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1588 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int -16)))]
1589 1.1 mrg "")
1590 1.1 mrg
1591 1.1 mrg (define_split ; ashlqi3_const5
1592 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1593 1.1 mrg (ashift:QI (match_dup 0)
1594 1.1 mrg (const_int 5)))]
1595 1.1 mrg ""
1596 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1597 1.1 mrg (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 1)))
1598 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int -32)))]
1599 1.1 mrg "")
1600 1.1 mrg
1601 1.1 mrg (define_split ; ashlqi3_const6
1602 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1603 1.1 mrg (ashift:QI (match_dup 0)
1604 1.1 mrg (const_int 6)))]
1605 1.1 mrg ""
1606 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1607 1.1 mrg (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 2)))
1608 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int -64)))]
1609 1.1 mrg "")
1610 1.1 mrg
1611 1.1 mrg (define_insn "*ashlqi3"
1612 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,!d,r,r")
1613 1.1 mrg (ashift:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0,0")
1614 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,K,n,n,Qm")))]
1615 1.1 mrg ""
1616 1.1 mrg "* return ashlqi3_out (insn, operands, NULL);"
1617 1.1 mrg [(set_attr "length" "5,0,1,2,4,6,9")
1618 1.1 mrg (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
1619 1.1 mrg
1620 1.1 mrg (define_insn "ashlhi3"
1621 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r,r")
1622 1.1 mrg (ashift:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
1623 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1624 1.1 mrg ""
1625 1.1 mrg "* return ashlhi3_out (insn, operands, NULL);"
1626 1.1 mrg [(set_attr "length" "6,0,2,2,4,10,10")
1627 1.1 mrg (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
1628 1.1 mrg
1629 1.1 mrg (define_insn "ashlsi3"
1630 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r")
1631 1.1 mrg (ashift:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
1632 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1633 1.1 mrg ""
1634 1.1 mrg "* return ashlsi3_out (insn, operands, NULL);"
1635 1.1 mrg [(set_attr "length" "8,0,4,4,8,10,12")
1636 1.1 mrg (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
1637 1.1 mrg
1638 1.1 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
1639 1.1 mrg
1640 1.1 mrg (define_peephole2 ; ashlqi3_l_const4
1641 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1642 1.1 mrg (ashift:QI (match_dup 0)
1643 1.1 mrg (const_int 4)))
1644 1.1 mrg (match_scratch:QI 1 "d")]
1645 1.1 mrg ""
1646 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1647 1.1 mrg (set (match_dup 1) (const_int -16))
1648 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1649 1.1 mrg "")
1650 1.1 mrg
1651 1.1 mrg (define_peephole2 ; ashlqi3_l_const5
1652 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1653 1.1 mrg (ashift:QI (match_dup 0)
1654 1.1 mrg (const_int 5)))
1655 1.1 mrg (match_scratch:QI 1 "d")]
1656 1.1 mrg ""
1657 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1658 1.1 mrg (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 1)))
1659 1.1 mrg (set (match_dup 1) (const_int -32))
1660 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1661 1.1 mrg "")
1662 1.1 mrg
1663 1.1 mrg (define_peephole2 ; ashlqi3_l_const6
1664 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1665 1.1 mrg (ashift:QI (match_dup 0)
1666 1.1 mrg (const_int 6)))
1667 1.1 mrg (match_scratch:QI 1 "d")]
1668 1.1 mrg ""
1669 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1670 1.1 mrg (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 2)))
1671 1.1 mrg (set (match_dup 1) (const_int -64))
1672 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1673 1.1 mrg "")
1674 1.1 mrg
1675 1.1 mrg (define_peephole2
1676 1.1 mrg [(match_scratch:QI 3 "d")
1677 1.1 mrg (set (match_operand:HI 0 "register_operand" "")
1678 1.1 mrg (ashift:HI (match_operand:HI 1 "register_operand" "")
1679 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1680 1.1 mrg ""
1681 1.1 mrg [(parallel [(set (match_dup 0) (ashift:HI (match_dup 1) (match_dup 2)))
1682 1.1 mrg (clobber (match_dup 3))])]
1683 1.1 mrg "")
1684 1.1 mrg
1685 1.1 mrg (define_insn "*ashlhi3_const"
1686 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
1687 1.1 mrg (ashift:HI (match_operand:HI 1 "register_operand" "0,0,r,0,0")
1688 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
1689 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
1690 1.1 mrg "reload_completed"
1691 1.1 mrg "* return ashlhi3_out (insn, operands, NULL);"
1692 1.1 mrg [(set_attr "length" "0,2,2,4,10")
1693 1.1 mrg (set_attr "cc" "none,set_n,clobber,set_n,clobber")])
1694 1.1 mrg
1695 1.1 mrg (define_peephole2
1696 1.1 mrg [(match_scratch:QI 3 "d")
1697 1.1 mrg (set (match_operand:SI 0 "register_operand" "")
1698 1.1 mrg (ashift:SI (match_operand:SI 1 "register_operand" "")
1699 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1700 1.1 mrg ""
1701 1.1 mrg [(parallel [(set (match_dup 0) (ashift:SI (match_dup 1) (match_dup 2)))
1702 1.1 mrg (clobber (match_dup 3))])]
1703 1.1 mrg "")
1704 1.1 mrg
1705 1.1 mrg (define_insn "*ashlsi3_const"
1706 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1707 1.1 mrg (ashift:SI (match_operand:SI 1 "register_operand" "0,0,r,0")
1708 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
1709 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
1710 1.1 mrg "reload_completed"
1711 1.1 mrg "* return ashlsi3_out (insn, operands, NULL);"
1712 1.1 mrg [(set_attr "length" "0,4,4,10")
1713 1.1 mrg (set_attr "cc" "none,set_n,clobber,clobber")])
1714 1.1 mrg
1715 1.1 mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
1716 1.1 mrg ;; arithmetic shift right
1717 1.1 mrg
1718 1.1 mrg (define_insn "ashrqi3"
1719 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r,r")
1720 1.1 mrg (ashiftrt:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0")
1721 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,K,n,Qm")))]
1722 1.1 mrg ""
1723 1.1 mrg "* return ashrqi3_out (insn, operands, NULL);"
1724 1.1 mrg [(set_attr "length" "5,0,1,2,5,9")
1725 1.1 mrg (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber")])
1726 1.1 mrg
1727 1.1 mrg (define_insn "ashrhi3"
1728 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r,r")
1729 1.1 mrg (ashiftrt:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
1730 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1731 1.1 mrg ""
1732 1.1 mrg "* return ashrhi3_out (insn, operands, NULL);"
1733 1.1 mrg [(set_attr "length" "6,0,2,4,4,10,10")
1734 1.1 mrg (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
1735 1.1 mrg
1736 1.1 mrg (define_insn "ashrsi3"
1737 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r")
1738 1.1 mrg (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
1739 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1740 1.1 mrg ""
1741 1.1 mrg "* return ashrsi3_out (insn, operands, NULL);"
1742 1.1 mrg [(set_attr "length" "8,0,4,6,8,10,12")
1743 1.1 mrg (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
1744 1.1 mrg
1745 1.1 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
1746 1.1 mrg
1747 1.1 mrg (define_peephole2
1748 1.1 mrg [(match_scratch:QI 3 "d")
1749 1.1 mrg (set (match_operand:HI 0 "register_operand" "")
1750 1.1 mrg (ashiftrt:HI (match_operand:HI 1 "register_operand" "")
1751 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1752 1.1 mrg ""
1753 1.1 mrg [(parallel [(set (match_dup 0) (ashiftrt:HI (match_dup 1) (match_dup 2)))
1754 1.1 mrg (clobber (match_dup 3))])]
1755 1.1 mrg "")
1756 1.1 mrg
1757 1.1 mrg (define_insn "*ashrhi3_const"
1758 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
1759 1.1 mrg (ashiftrt:HI (match_operand:HI 1 "register_operand" "0,0,r,0,0")
1760 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
1761 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
1762 1.1 mrg "reload_completed"
1763 1.1 mrg "* return ashrhi3_out (insn, operands, NULL);"
1764 1.1 mrg [(set_attr "length" "0,2,4,4,10")
1765 1.1 mrg (set_attr "cc" "none,clobber,set_n,clobber,clobber")])
1766 1.1 mrg
1767 1.1 mrg (define_peephole2
1768 1.1 mrg [(match_scratch:QI 3 "d")
1769 1.1 mrg (set (match_operand:SI 0 "register_operand" "")
1770 1.1 mrg (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
1771 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1772 1.1 mrg ""
1773 1.1 mrg [(parallel [(set (match_dup 0) (ashiftrt:SI (match_dup 1) (match_dup 2)))
1774 1.1 mrg (clobber (match_dup 3))])]
1775 1.1 mrg "")
1776 1.1 mrg
1777 1.1 mrg (define_insn "*ashrsi3_const"
1778 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1779 1.1 mrg (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,0,r,0")
1780 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
1781 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
1782 1.1 mrg "reload_completed"
1783 1.1 mrg "* return ashrsi3_out (insn, operands, NULL);"
1784 1.1 mrg [(set_attr "length" "0,4,4,10")
1785 1.1 mrg (set_attr "cc" "none,clobber,set_n,clobber")])
1786 1.1 mrg
1787 1.1 mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
1788 1.1 mrg ;; logical shift right
1789 1.1 mrg
1790 1.1 mrg (define_expand "lshrqi3"
1791 1.1 mrg [(set (match_operand:QI 0 "register_operand" "")
1792 1.1 mrg (lshiftrt:QI (match_operand:QI 1 "register_operand" "")
1793 1.1 mrg (match_operand:QI 2 "general_operand" "")))]
1794 1.1 mrg ""
1795 1.1 mrg "")
1796 1.1 mrg
1797 1.1 mrg (define_split ; lshrqi3_const4
1798 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1799 1.1 mrg (lshiftrt:QI (match_dup 0)
1800 1.1 mrg (const_int 4)))]
1801 1.1 mrg ""
1802 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1803 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int 15)))]
1804 1.1 mrg "")
1805 1.1 mrg
1806 1.1 mrg (define_split ; lshrqi3_const5
1807 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1808 1.1 mrg (lshiftrt:QI (match_dup 0)
1809 1.1 mrg (const_int 5)))]
1810 1.1 mrg ""
1811 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1812 1.1 mrg (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 1)))
1813 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int 7)))]
1814 1.1 mrg "")
1815 1.1 mrg
1816 1.1 mrg (define_split ; lshrqi3_const6
1817 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
1818 1.1 mrg (lshiftrt:QI (match_dup 0)
1819 1.1 mrg (const_int 6)))]
1820 1.1 mrg ""
1821 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1822 1.1 mrg (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 2)))
1823 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (const_int 3)))]
1824 1.1 mrg "")
1825 1.1 mrg
1826 1.1 mrg (define_insn "*lshrqi3"
1827 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,!d,r,r")
1828 1.1 mrg (lshiftrt:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0,0")
1829 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,K,n,n,Qm")))]
1830 1.1 mrg ""
1831 1.1 mrg "* return lshrqi3_out (insn, operands, NULL);"
1832 1.1 mrg [(set_attr "length" "5,0,1,2,4,6,9")
1833 1.1 mrg (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
1834 1.1 mrg
1835 1.1 mrg (define_insn "lshrhi3"
1836 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r,r")
1837 1.1 mrg (lshiftrt:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
1838 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1839 1.1 mrg ""
1840 1.1 mrg "* return lshrhi3_out (insn, operands, NULL);"
1841 1.1 mrg [(set_attr "length" "6,0,2,2,4,10,10")
1842 1.1 mrg (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
1843 1.1 mrg
1844 1.1 mrg (define_insn "lshrsi3"
1845 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r")
1846 1.1 mrg (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
1847 1.1 mrg (match_operand:QI 2 "general_operand" "r,L,P,O,K,n,Qm")))]
1848 1.1 mrg ""
1849 1.1 mrg "* return lshrsi3_out (insn, operands, NULL);"
1850 1.1 mrg [(set_attr "length" "8,0,4,4,8,10,12")
1851 1.1 mrg (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
1852 1.1 mrg
1853 1.1 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
1854 1.1 mrg
1855 1.1 mrg (define_peephole2 ; lshrqi3_l_const4
1856 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1857 1.1 mrg (lshiftrt:QI (match_dup 0)
1858 1.1 mrg (const_int 4)))
1859 1.1 mrg (match_scratch:QI 1 "d")]
1860 1.1 mrg ""
1861 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1862 1.1 mrg (set (match_dup 1) (const_int 15))
1863 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1864 1.1 mrg "")
1865 1.1 mrg
1866 1.1 mrg (define_peephole2 ; lshrqi3_l_const5
1867 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1868 1.1 mrg (lshiftrt:QI (match_dup 0)
1869 1.1 mrg (const_int 5)))
1870 1.1 mrg (match_scratch:QI 1 "d")]
1871 1.1 mrg ""
1872 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1873 1.1 mrg (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 1)))
1874 1.1 mrg (set (match_dup 1) (const_int 7))
1875 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1876 1.1 mrg "")
1877 1.1 mrg
1878 1.1 mrg (define_peephole2 ; lshrqi3_l_const6
1879 1.1 mrg [(set (match_operand:QI 0 "l_register_operand" "")
1880 1.1 mrg (lshiftrt:QI (match_dup 0)
1881 1.1 mrg (const_int 6)))
1882 1.1 mrg (match_scratch:QI 1 "d")]
1883 1.1 mrg ""
1884 1.1 mrg [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
1885 1.1 mrg (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 2)))
1886 1.1 mrg (set (match_dup 1) (const_int 3))
1887 1.1 mrg (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
1888 1.1 mrg "")
1889 1.1 mrg
1890 1.1 mrg (define_peephole2
1891 1.1 mrg [(match_scratch:QI 3 "d")
1892 1.1 mrg (set (match_operand:HI 0 "register_operand" "")
1893 1.1 mrg (lshiftrt:HI (match_operand:HI 1 "register_operand" "")
1894 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1895 1.1 mrg ""
1896 1.1 mrg [(parallel [(set (match_dup 0) (lshiftrt:HI (match_dup 1) (match_dup 2)))
1897 1.1 mrg (clobber (match_dup 3))])]
1898 1.1 mrg "")
1899 1.1 mrg
1900 1.1 mrg (define_insn "*lshrhi3_const"
1901 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
1902 1.1 mrg (lshiftrt:HI (match_operand:HI 1 "register_operand" "0,0,r,0,0")
1903 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
1904 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
1905 1.1 mrg "reload_completed"
1906 1.1 mrg "* return lshrhi3_out (insn, operands, NULL);"
1907 1.1 mrg [(set_attr "length" "0,2,2,4,10")
1908 1.1 mrg (set_attr "cc" "none,clobber,clobber,clobber,clobber")])
1909 1.1 mrg
1910 1.1 mrg (define_peephole2
1911 1.1 mrg [(match_scratch:QI 3 "d")
1912 1.1 mrg (set (match_operand:SI 0 "register_operand" "")
1913 1.1 mrg (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
1914 1.1 mrg (match_operand:QI 2 "const_int_operand" "")))]
1915 1.1 mrg ""
1916 1.1 mrg [(parallel [(set (match_dup 0) (lshiftrt:SI (match_dup 1) (match_dup 2)))
1917 1.1 mrg (clobber (match_dup 3))])]
1918 1.1 mrg "")
1919 1.1 mrg
1920 1.1 mrg (define_insn "*lshrsi3_const"
1921 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1922 1.1 mrg (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0,r,0")
1923 1.1 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
1924 1.1 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
1925 1.1 mrg "reload_completed"
1926 1.1 mrg "* return lshrsi3_out (insn, operands, NULL);"
1927 1.1 mrg [(set_attr "length" "0,4,4,10")
1928 1.1 mrg (set_attr "cc" "none,clobber,clobber,clobber")])
1929 1.1 mrg
1930 1.1 mrg ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x)
1931 1.1 mrg ;; abs
1932 1.1 mrg
1933 1.1 mrg (define_insn "absqi2"
1934 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1935 1.1 mrg (abs:QI (match_operand:QI 1 "register_operand" "0")))]
1936 1.1 mrg ""
1937 1.1 mrg "sbrc %0,7
1938 1.1 mrg neg %0"
1939 1.1 mrg [(set_attr "length" "2")
1940 1.1 mrg (set_attr "cc" "clobber")])
1941 1.1 mrg
1942 1.1 mrg
1943 1.1 mrg (define_insn "abssf2"
1944 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=d,r")
1945 1.1 mrg (abs:SF (match_operand:SF 1 "register_operand" "0,0")))]
1946 1.1 mrg ""
1947 1.1 mrg "@
1948 1.1 mrg andi %D0,0x7f
1949 1.1 mrg clt\;bld %D0,7"
1950 1.1 mrg [(set_attr "length" "1,2")
1951 1.1 mrg (set_attr "cc" "set_n,clobber")])
1952 1.1 mrg
1953 1.1 mrg ;; 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x
1954 1.1 mrg ;; neg
1955 1.1 mrg
1956 1.1 mrg (define_insn "negqi2"
1957 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1958 1.1 mrg (neg:QI (match_operand:QI 1 "register_operand" "0")))]
1959 1.1 mrg ""
1960 1.1 mrg "neg %0"
1961 1.1 mrg [(set_attr "length" "1")
1962 1.1 mrg (set_attr "cc" "set_zn")])
1963 1.1 mrg
1964 1.1 mrg (define_insn "neghi2"
1965 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=!d,r,&r")
1966 1.1 mrg (neg:HI (match_operand:HI 1 "register_operand" "0,0,r")))]
1967 1.1 mrg ""
1968 1.1 mrg "@
1969 1.1 mrg com %B0\;neg %A0\;sbci %B0,lo8(-1)
1970 1.1 mrg com %B0\;neg %A0\;sbc %B0,__zero_reg__\;inc %B0
1971 1.1 mrg clr %A0\;clr %B0\;sub %A0,%A1\;sbc %B0,%B1"
1972 1.1 mrg [(set_attr "length" "3,4,4")
1973 1.1 mrg (set_attr "cc" "set_czn,set_n,set_czn")])
1974 1.1 mrg
1975 1.1 mrg (define_insn "negsi2"
1976 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=!d,r,&r")
1977 1.1 mrg (neg:SI (match_operand:SI 1 "register_operand" "0,0,r")))]
1978 1.1 mrg ""
1979 1.1 mrg "@
1980 1.1 mrg com %D0\;com %C0\;com %B0\;neg %A0\;sbci %B0,lo8(-1)\;sbci %C0,lo8(-1)\;sbci %D0,lo8(-1)
1981 1.1 mrg com %D0\;com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
1982 1.1 mrg clr %A0\;clr %B0\;{clr %C0\;clr %D0|movw %C0,%A0}\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1"
1983 1.1 mrg [(set_attr_alternative "length"
1984 1.1 mrg [(const_int 7)
1985 1.1 mrg (const_int 8)
1986 1.1 mrg (if_then_else (eq_attr "mcu_have_movw" "yes")
1987 1.1 mrg (const_int 7)
1988 1.1 mrg (const_int 8))])
1989 1.1 mrg (set_attr "cc" "set_czn,set_n,set_czn")])
1990 1.1 mrg
1991 1.1 mrg (define_insn "negsf2"
1992 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=d,r")
1993 1.1 mrg (neg:SF (match_operand:SF 1 "register_operand" "0,0")))]
1994 1.1 mrg ""
1995 1.1 mrg "@
1996 1.1 mrg subi %D0,0x80
1997 1.1 mrg bst %D0,7\;com %D0\;bld %D0,7\;com %D0"
1998 1.1 mrg [(set_attr "length" "1,4")
1999 1.1 mrg (set_attr "cc" "set_n,set_n")])
2000 1.1 mrg
2001 1.1 mrg ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2002 1.1 mrg ;; not
2003 1.1 mrg
2004 1.1 mrg (define_insn "one_cmplqi2"
2005 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
2006 1.1 mrg (not:QI (match_operand:QI 1 "register_operand" "0")))]
2007 1.1 mrg ""
2008 1.1 mrg "com %0"
2009 1.1 mrg [(set_attr "length" "1")
2010 1.1 mrg (set_attr "cc" "set_czn")])
2011 1.1 mrg
2012 1.1 mrg (define_insn "one_cmplhi2"
2013 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2014 1.1 mrg (not:HI (match_operand:HI 1 "register_operand" "0")))]
2015 1.1 mrg ""
2016 1.1 mrg "com %0
2017 1.1 mrg com %B0"
2018 1.1 mrg [(set_attr "length" "2")
2019 1.1 mrg (set_attr "cc" "set_n")])
2020 1.1 mrg
2021 1.1 mrg (define_insn "one_cmplsi2"
2022 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
2023 1.1 mrg (not:SI (match_operand:SI 1 "register_operand" "0")))]
2024 1.1 mrg ""
2025 1.1 mrg "com %0
2026 1.1 mrg com %B0
2027 1.1 mrg com %C0
2028 1.1 mrg com %D0"
2029 1.1 mrg [(set_attr "length" "4")
2030 1.1 mrg (set_attr "cc" "set_n")])
2031 1.1 mrg
2032 1.1 mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
2033 1.1 mrg ;; sign extend
2034 1.1 mrg
2035 1.1 mrg (define_insn "extendqihi2"
2036 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r,r")
2037 1.1 mrg (sign_extend:HI (match_operand:QI 1 "register_operand" "0,*r")))]
2038 1.1 mrg ""
2039 1.1 mrg "@
2040 1.1 mrg clr %B0\;sbrc %0,7\;com %B0
2041 1.1 mrg mov %A0,%A1\;clr %B0\;sbrc %A0,7\;com %B0"
2042 1.1 mrg [(set_attr "length" "3,4")
2043 1.1 mrg (set_attr "cc" "set_n,set_n")])
2044 1.1 mrg
2045 1.1 mrg (define_insn "extendqisi2"
2046 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,r")
2047 1.1 mrg (sign_extend:SI (match_operand:QI 1 "register_operand" "0,*r")))]
2048 1.1 mrg ""
2049 1.1 mrg "@
2050 1.1 mrg clr %B0\;sbrc %A0,7\;com %B0\;mov %C0,%B0\;mov %D0,%B0
2051 1.1 mrg mov %A0,%A1\;clr %B0\;sbrc %A0,7\;com %B0\;mov %C0,%B0\;mov %D0,%B0"
2052 1.1 mrg [(set_attr "length" "5,6")
2053 1.1 mrg (set_attr "cc" "set_n,set_n")])
2054 1.1 mrg
2055 1.1 mrg (define_insn "extendhisi2"
2056 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r,&r")
2057 1.1 mrg (sign_extend:SI (match_operand:HI 1 "register_operand" "0,*r")))]
2058 1.1 mrg ""
2059 1.1 mrg "@
2060 1.1 mrg clr %C0\;sbrc %B0,7\;com %C0\;mov %D0,%C0
2061 1.1 mrg {mov %A0,%A1\;mov %B0,%B1|movw %A0,%A1}\;clr %C0\;sbrc %B0,7\;com %C0\;mov %D0,%C0"
2062 1.1 mrg [(set_attr_alternative "length"
2063 1.1 mrg [(const_int 4)
2064 1.1 mrg (if_then_else (eq_attr "mcu_have_movw" "yes")
2065 1.1 mrg (const_int 5)
2066 1.1 mrg (const_int 6))])
2067 1.1 mrg (set_attr "cc" "set_n,set_n")])
2068 1.1 mrg
2069 1.1 mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
2070 1.1 mrg ;; zero extend
2071 1.1 mrg
2072 1.1 mrg (define_insn_and_split "zero_extendqihi2"
2073 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2074 1.1 mrg (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
2075 1.1 mrg ""
2076 1.1 mrg "#"
2077 1.1 mrg "reload_completed"
2078 1.1 mrg [(set (match_dup 2) (match_dup 1))
2079 1.1 mrg (set (match_dup 3) (const_int 0))]
2080 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (QImode, HImode);
2081 1.1 mrg unsigned int high_off = subreg_highpart_offset (QImode, HImode);
2082 1.1 mrg
2083 1.1 mrg operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, low_off);
2084 1.1 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, high_off);
2085 1.1 mrg ")
2086 1.1 mrg
2087 1.1 mrg (define_insn_and_split "zero_extendqisi2"
2088 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
2089 1.1 mrg (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
2090 1.1 mrg ""
2091 1.1 mrg "#"
2092 1.1 mrg "reload_completed"
2093 1.1 mrg [(set (match_dup 2) (zero_extend:HI (match_dup 1)))
2094 1.1 mrg (set (match_dup 3) (const_int 0))]
2095 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
2096 1.1 mrg unsigned int high_off = subreg_highpart_offset (HImode, SImode);
2097 1.1 mrg
2098 1.1 mrg operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
2099 1.1 mrg operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
2100 1.1 mrg ")
2101 1.1 mrg
2102 1.1 mrg (define_insn_and_split "zero_extendhisi2"
2103 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=r")
2104 1.1 mrg (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))]
2105 1.1 mrg ""
2106 1.1 mrg "#"
2107 1.1 mrg "reload_completed"
2108 1.1 mrg [(set (match_dup 2) (match_dup 1))
2109 1.1 mrg (set (match_dup 3) (const_int 0))]
2110 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
2111 1.1 mrg unsigned int high_off = subreg_highpart_offset (HImode, SImode);
2112 1.1 mrg
2113 1.1 mrg operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
2114 1.1 mrg operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
2115 1.1 mrg ")
2116 1.1 mrg
2117 1.1 mrg (define_insn_and_split "zero_extendqidi2"
2118 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=r")
2119 1.1 mrg (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
2120 1.1 mrg ""
2121 1.1 mrg "#"
2122 1.1 mrg "reload_completed"
2123 1.1 mrg [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
2124 1.1 mrg (set (match_dup 3) (const_int 0))]
2125 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
2126 1.1 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
2127 1.1 mrg
2128 1.1 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
2129 1.1 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
2130 1.1 mrg ")
2131 1.1 mrg
2132 1.1 mrg (define_insn_and_split "zero_extendhidi2"
2133 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=r")
2134 1.1 mrg (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
2135 1.1 mrg ""
2136 1.1 mrg "#"
2137 1.1 mrg "reload_completed"
2138 1.1 mrg [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
2139 1.1 mrg (set (match_dup 3) (const_int 0))]
2140 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
2141 1.1 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
2142 1.1 mrg
2143 1.1 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
2144 1.1 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
2145 1.1 mrg ")
2146 1.1 mrg
2147 1.1 mrg (define_insn_and_split "zero_extendsidi2"
2148 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=r")
2149 1.1 mrg (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
2150 1.1 mrg ""
2151 1.1 mrg "#"
2152 1.1 mrg "reload_completed"
2153 1.1 mrg [(set (match_dup 2) (match_dup 1))
2154 1.1 mrg (set (match_dup 3) (const_int 0))]
2155 1.1 mrg "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
2156 1.1 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
2157 1.1 mrg
2158 1.1 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
2159 1.1 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
2160 1.1 mrg ")
2161 1.1 mrg
2162 1.1 mrg ;;<=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=>
2163 1.1 mrg ;; compare
2164 1.1 mrg
2165 1.1 mrg ; Optimize negated tests into reverse compare if overflow is undefined.
2166 1.1 mrg (define_insn "*negated_tstqi"
2167 1.1 mrg [(set (cc0)
2168 1.1 mrg (compare (neg:QI (match_operand:QI 0 "register_operand" "r"))
2169 1.1 mrg (const_int 0)))]
2170 1.1 mrg "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
2171 1.1 mrg "cp __zero_reg__,%0"
2172 1.1 mrg [(set_attr "cc" "compare")
2173 1.1 mrg (set_attr "length" "1")])
2174 1.1 mrg
2175 1.1 mrg (define_insn "*reversed_tstqi"
2176 1.1 mrg [(set (cc0)
2177 1.1 mrg (compare (const_int 0)
2178 1.1 mrg (match_operand:QI 0 "register_operand" "r")))]
2179 1.1 mrg ""
2180 1.1 mrg "cp __zero_reg__,%0"
2181 1.1 mrg [(set_attr "cc" "compare")
2182 1.1 mrg (set_attr "length" "2")])
2183 1.1 mrg
2184 1.1 mrg (define_insn "*negated_tsthi"
2185 1.1 mrg [(set (cc0)
2186 1.1 mrg (compare (neg:HI (match_operand:HI 0 "register_operand" "r"))
2187 1.1 mrg (const_int 0)))]
2188 1.1 mrg "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
2189 1.1 mrg "cp __zero_reg__,%A0
2190 1.1 mrg cpc __zero_reg__,%B0"
2191 1.1 mrg [(set_attr "cc" "compare")
2192 1.1 mrg (set_attr "length" "2")])
2193 1.1 mrg
2194 1.1 mrg ;; Leave here the clobber used by the cmphi pattern for simplicity, even
2195 1.1 mrg ;; though it is unused, because this pattern is synthesized by avr_reorg.
2196 1.1 mrg (define_insn "*reversed_tsthi"
2197 1.1 mrg [(set (cc0)
2198 1.1 mrg (compare (const_int 0)
2199 1.1 mrg (match_operand:HI 0 "register_operand" "r")))
2200 1.1 mrg (clobber (match_scratch:QI 1 "=X"))]
2201 1.1 mrg ""
2202 1.1 mrg "cp __zero_reg__,%A0
2203 1.1 mrg cpc __zero_reg__,%B0"
2204 1.1 mrg [(set_attr "cc" "compare")
2205 1.1 mrg (set_attr "length" "2")])
2206 1.1 mrg
2207 1.1 mrg (define_insn "*negated_tstsi"
2208 1.1 mrg [(set (cc0)
2209 1.1 mrg (compare (neg:SI (match_operand:SI 0 "register_operand" "r"))
2210 1.1 mrg (const_int 0)))]
2211 1.1 mrg "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
2212 1.1 mrg "cp __zero_reg__,%A0
2213 1.1 mrg cpc __zero_reg__,%B0
2214 1.1 mrg cpc __zero_reg__,%C0
2215 1.1 mrg cpc __zero_reg__,%D0"
2216 1.1 mrg [(set_attr "cc" "compare")
2217 1.1 mrg (set_attr "length" "4")])
2218 1.1 mrg
2219 1.1 mrg (define_insn "*reversed_tstsi"
2220 1.1 mrg [(set (cc0)
2221 1.1 mrg (compare (const_int 0)
2222 1.1 mrg (match_operand:SI 0 "register_operand" "r")))
2223 1.1 mrg (clobber (match_scratch:QI 1 "=X"))]
2224 1.1 mrg ""
2225 1.1 mrg "cp __zero_reg__,%A0
2226 1.1 mrg cpc __zero_reg__,%B0
2227 1.1 mrg cpc __zero_reg__,%C0
2228 1.1 mrg cpc __zero_reg__,%D0"
2229 1.1 mrg [(set_attr "cc" "compare")
2230 1.1 mrg (set_attr "length" "4")])
2231 1.1 mrg
2232 1.1 mrg
2233 1.1 mrg (define_insn "*cmpqi"
2234 1.1 mrg [(set (cc0)
2235 1.1 mrg (compare (match_operand:QI 0 "register_operand" "r,r,d")
2236 1.1 mrg (match_operand:QI 1 "nonmemory_operand" "L,r,i")))]
2237 1.1 mrg ""
2238 1.1 mrg "@
2239 1.1 mrg tst %0
2240 1.1 mrg cp %0,%1
2241 1.1 mrg cpi %0,lo8(%1)"
2242 1.1 mrg [(set_attr "cc" "compare,compare,compare")
2243 1.1 mrg (set_attr "length" "1,1,1")])
2244 1.1 mrg
2245 1.1 mrg (define_insn "*cmpqi_sign_extend"
2246 1.1 mrg [(set (cc0)
2247 1.1 mrg (compare (sign_extend:HI
2248 1.1 mrg (match_operand:QI 0 "register_operand" "d"))
2249 1.1 mrg (match_operand:HI 1 "const_int_operand" "n")))]
2250 1.1 mrg "INTVAL (operands[1]) >= -128 && INTVAL (operands[1]) <= 127"
2251 1.1 mrg "cpi %0,lo8(%1)"
2252 1.1 mrg [(set_attr "cc" "compare")
2253 1.1 mrg (set_attr "length" "1")])
2254 1.1 mrg
2255 1.1 mrg (define_insn "*cmphi"
2256 1.1 mrg [(set (cc0)
2257 1.1 mrg (compare (match_operand:HI 0 "register_operand" "!w,r,r,d,d,r,r")
2258 1.1 mrg (match_operand:HI 1 "nonmemory_operand" "L,L,r,M,i,M,i")))
2259 1.1 mrg (clobber (match_scratch:QI 2 "=X,X,X,X,&d,&d,&d"))]
2260 1.1 mrg ""
2261 1.1 mrg "*{
2262 1.1 mrg switch (which_alternative)
2263 1.1 mrg {
2264 1.1 mrg case 0: case 1:
2265 1.1 mrg return out_tsthi (insn, operands[0], NULL);
2266 1.1 mrg
2267 1.1 mrg case 2:
2268 1.1 mrg return (AS2 (cp,%A0,%A1) CR_TAB
2269 1.1 mrg AS2 (cpc,%B0,%B1));
2270 1.1 mrg case 3:
2271 1.1 mrg if (reg_unused_after (insn, operands[0])
2272 1.1 mrg && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 63
2273 1.1 mrg && test_hard_reg_class (ADDW_REGS, operands[0]))
2274 1.1 mrg return AS2 (sbiw,%0,%1);
2275 1.1 mrg else
2276 1.1 mrg return (AS2 (cpi,%0,%1) CR_TAB
2277 1.1 mrg AS2 (cpc,%B0,__zero_reg__));
2278 1.1 mrg case 4:
2279 1.1 mrg if (reg_unused_after (insn, operands[0]))
2280 1.1 mrg return (AS2 (subi,%0,lo8(%1)) CR_TAB
2281 1.1 mrg AS2 (sbci,%B0,hi8(%1)));
2282 1.1 mrg else
2283 1.1 mrg return (AS2 (ldi, %2,hi8(%1)) CR_TAB
2284 1.1 mrg AS2 (cpi, %A0,lo8(%1)) CR_TAB
2285 1.1 mrg AS2 (cpc, %B0,%2));
2286 1.1 mrg case 5:
2287 1.1 mrg return (AS2 (ldi, %2,lo8(%1)) CR_TAB
2288 1.1 mrg AS2 (cp, %A0,%2) CR_TAB
2289 1.1 mrg AS2 (cpc, %B0,__zero_reg__));
2290 1.1 mrg
2291 1.1 mrg case 6:
2292 1.1 mrg return (AS2 (ldi, %2,lo8(%1)) CR_TAB
2293 1.1 mrg AS2 (cp, %A0,%2) CR_TAB
2294 1.1 mrg AS2 (ldi, %2,hi8(%1)) CR_TAB
2295 1.1 mrg AS2 (cpc, %B0,%2));
2296 1.1 mrg }
2297 1.1 mrg return \"bug\";
2298 1.1 mrg }"
2299 1.1 mrg [(set_attr "cc" "compare,compare,compare,compare,compare,compare,compare")
2300 1.1 mrg (set_attr "length" "1,2,2,2,3,3,4")])
2301 1.1 mrg
2302 1.1 mrg
2303 1.1 mrg (define_insn "*cmpsi"
2304 1.1 mrg [(set (cc0)
2305 1.1 mrg (compare (match_operand:SI 0 "register_operand" "r,r,d,d,r,r")
2306 1.1 mrg (match_operand:SI 1 "nonmemory_operand" "L,r,M,i,M,i")))
2307 1.1 mrg (clobber (match_scratch:QI 2 "=X,X,X,&d,&d,&d"))]
2308 1.1 mrg ""
2309 1.1 mrg "*{
2310 1.1 mrg switch (which_alternative)
2311 1.1 mrg {
2312 1.1 mrg case 0:
2313 1.1 mrg return out_tstsi (insn, operands[0], NULL);
2314 1.1 mrg
2315 1.1 mrg case 1:
2316 1.1 mrg return (AS2 (cp,%A0,%A1) CR_TAB
2317 1.1 mrg AS2 (cpc,%B0,%B1) CR_TAB
2318 1.1 mrg AS2 (cpc,%C0,%C1) CR_TAB
2319 1.1 mrg AS2 (cpc,%D0,%D1));
2320 1.1 mrg case 2:
2321 1.1 mrg if (reg_unused_after (insn, operands[0])
2322 1.1 mrg && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 63
2323 1.1 mrg && test_hard_reg_class (ADDW_REGS, operands[0]))
2324 1.1 mrg return (AS2 (sbiw,%0,%1) CR_TAB
2325 1.1 mrg AS2 (cpc,%C0,__zero_reg__) CR_TAB
2326 1.1 mrg AS2 (cpc,%D0,__zero_reg__));
2327 1.1 mrg else
2328 1.1 mrg return (AS2 (cpi,%A0,lo8(%1)) CR_TAB
2329 1.1 mrg AS2 (cpc,%B0,__zero_reg__) CR_TAB
2330 1.1 mrg AS2 (cpc,%C0,__zero_reg__) CR_TAB
2331 1.1 mrg AS2 (cpc,%D0,__zero_reg__));
2332 1.1 mrg case 3:
2333 1.1 mrg if (reg_unused_after (insn, operands[0]))
2334 1.1 mrg return (AS2 (subi,%A0,lo8(%1)) CR_TAB
2335 1.1 mrg AS2 (sbci,%B0,hi8(%1)) CR_TAB
2336 1.1 mrg AS2 (sbci,%C0,hlo8(%1)) CR_TAB
2337 1.1 mrg AS2 (sbci,%D0,hhi8(%1)));
2338 1.1 mrg else
2339 1.1 mrg return (AS2 (cpi, %A0,lo8(%1)) CR_TAB
2340 1.1 mrg AS2 (ldi, %2,hi8(%1)) CR_TAB
2341 1.1 mrg AS2 (cpc, %B0,%2) CR_TAB
2342 1.1 mrg AS2 (ldi, %2,hlo8(%1)) CR_TAB
2343 1.1 mrg AS2 (cpc, %C0,%2) CR_TAB
2344 1.1 mrg AS2 (ldi, %2,hhi8(%1)) CR_TAB
2345 1.1 mrg AS2 (cpc, %D0,%2));
2346 1.1 mrg case 4:
2347 1.1 mrg return (AS2 (ldi,%2,lo8(%1)) CR_TAB
2348 1.1 mrg AS2 (cp,%A0,%2) CR_TAB
2349 1.1 mrg AS2 (cpc,%B0,__zero_reg__) CR_TAB
2350 1.1 mrg AS2 (cpc,%C0,__zero_reg__) CR_TAB
2351 1.1 mrg AS2 (cpc,%D0,__zero_reg__));
2352 1.1 mrg case 5:
2353 1.1 mrg return (AS2 (ldi, %2,lo8(%1)) CR_TAB
2354 1.1 mrg AS2 (cp, %A0,%2) CR_TAB
2355 1.1 mrg AS2 (ldi, %2,hi8(%1)) CR_TAB
2356 1.1 mrg AS2 (cpc, %B0,%2) CR_TAB
2357 1.1 mrg AS2 (ldi, %2,hlo8(%1)) CR_TAB
2358 1.1 mrg AS2 (cpc, %C0,%2) CR_TAB
2359 1.1 mrg AS2 (ldi, %2,hhi8(%1)) CR_TAB
2360 1.1 mrg AS2 (cpc, %D0,%2));
2361 1.1 mrg }
2362 1.1 mrg return \"bug\";
2363 1.1 mrg }"
2364 1.1 mrg [(set_attr "cc" "compare,compare,compare,compare,compare,compare")
2365 1.1 mrg (set_attr "length" "4,4,4,7,5,8")])
2366 1.1 mrg
2367 1.1 mrg
2368 1.1 mrg ;; ----------------------------------------------------------------------
2369 1.1 mrg ;; JUMP INSTRUCTIONS
2370 1.1 mrg ;; ----------------------------------------------------------------------
2371 1.1 mrg ;; Conditional jump instructions
2372 1.1 mrg
2373 1.1 mrg (define_expand "cbranchsi4"
2374 1.1 mrg [(parallel [(set (cc0)
2375 1.1 mrg (compare (match_operand:SI 1 "register_operand" "")
2376 1.1 mrg (match_operand:SI 2 "nonmemory_operand" "")))
2377 1.1 mrg (clobber (match_scratch:QI 4 ""))])
2378 1.1 mrg (set (pc)
2379 1.1 mrg (if_then_else
2380 1.1 mrg (match_operator 0 "ordered_comparison_operator" [(cc0)
2381 1.1 mrg (const_int 0)])
2382 1.1 mrg (label_ref (match_operand 3 "" ""))
2383 1.1 mrg (pc)))]
2384 1.1 mrg "")
2385 1.1 mrg
2386 1.1 mrg (define_expand "cbranchhi4"
2387 1.1 mrg [(parallel [(set (cc0)
2388 1.1 mrg (compare (match_operand:HI 1 "register_operand" "")
2389 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "")))
2390 1.1 mrg (clobber (match_scratch:QI 4 ""))])
2391 1.1 mrg (set (pc)
2392 1.1 mrg (if_then_else
2393 1.1 mrg (match_operator 0 "ordered_comparison_operator" [(cc0)
2394 1.1 mrg (const_int 0)])
2395 1.1 mrg (label_ref (match_operand 3 "" ""))
2396 1.1 mrg (pc)))]
2397 1.1 mrg "")
2398 1.1 mrg
2399 1.1 mrg (define_expand "cbranchqi4"
2400 1.1 mrg [(set (cc0)
2401 1.1 mrg (compare (match_operand:QI 1 "register_operand" "")
2402 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "")))
2403 1.1 mrg (set (pc)
2404 1.1 mrg (if_then_else
2405 1.1 mrg (match_operator 0 "ordered_comparison_operator" [(cc0)
2406 1.1 mrg (const_int 0)])
2407 1.1 mrg (label_ref (match_operand 3 "" ""))
2408 1.1 mrg (pc)))]
2409 1.1 mrg "")
2410 1.1 mrg
2411 1.1 mrg
2412 1.1 mrg ;; Test a single bit in a QI/HI/SImode register.
2413 1.1 mrg ;; Combine will create zero extract patterns for single bit tests.
2414 1.1 mrg ;; permit any mode in source pattern by using VOIDmode.
2415 1.1 mrg
2416 1.1 mrg (define_insn "*sbrx_branch<mode>"
2417 1.1 mrg [(set (pc)
2418 1.1 mrg (if_then_else
2419 1.1 mrg (match_operator 0 "eqne_operator"
2420 1.1 mrg [(zero_extract:QIDI
2421 1.1 mrg (match_operand:VOID 1 "register_operand" "r")
2422 1.1 mrg (const_int 1)
2423 1.1 mrg (match_operand 2 "const_int_operand" "n"))
2424 1.1 mrg (const_int 0)])
2425 1.1 mrg (label_ref (match_operand 3 "" ""))
2426 1.1 mrg (pc)))]
2427 1.1 mrg ""
2428 1.1 mrg "* return avr_out_sbxx_branch (insn, operands);"
2429 1.1 mrg [(set (attr "length")
2430 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
2431 1.1 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
2432 1.1 mrg (const_int 2)
2433 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2434 1.1 mrg (const_int 2)
2435 1.1 mrg (const_int 4))))
2436 1.1 mrg (set_attr "cc" "clobber")])
2437 1.1 mrg
2438 1.1 mrg ;; Same test based on Bitwise AND RTL. Keep this incase gcc changes patterns.
2439 1.1 mrg ;; or for old peepholes.
2440 1.1 mrg ;; Fixme - bitwise Mask will not work for DImode
2441 1.1 mrg
2442 1.1 mrg (define_insn "*sbrx_and_branch<mode>"
2443 1.1 mrg [(set (pc)
2444 1.1 mrg (if_then_else
2445 1.1 mrg (match_operator 0 "eqne_operator"
2446 1.1 mrg [(and:QISI
2447 1.1 mrg (match_operand:QISI 1 "register_operand" "r")
2448 1.1 mrg (match_operand:QISI 2 "single_one_operand" "n"))
2449 1.1 mrg (const_int 0)])
2450 1.1 mrg (label_ref (match_operand 3 "" ""))
2451 1.1 mrg (pc)))]
2452 1.1 mrg ""
2453 1.1 mrg {
2454 1.1 mrg HOST_WIDE_INT bitnumber;
2455 1.1 mrg bitnumber = exact_log2 (GET_MODE_MASK (<MODE>mode) & INTVAL (operands[2]));
2456 1.1 mrg operands[2] = GEN_INT (bitnumber);
2457 1.1 mrg return avr_out_sbxx_branch (insn, operands);
2458 1.1 mrg }
2459 1.1 mrg [(set (attr "length")
2460 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
2461 1.1 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
2462 1.1 mrg (const_int 2)
2463 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2464 1.1 mrg (const_int 2)
2465 1.1 mrg (const_int 4))))
2466 1.1 mrg (set_attr "cc" "clobber")])
2467 1.1 mrg
2468 1.1 mrg ;; Convert sign tests to bit 7/15/31 tests that match the above insns.
2469 1.1 mrg (define_peephole2
2470 1.1 mrg [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
2471 1.1 mrg (const_int 0)))
2472 1.1 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
2473 1.1 mrg (label_ref (match_operand 1 "" ""))
2474 1.1 mrg (pc)))]
2475 1.1 mrg ""
2476 1.1 mrg [(set (pc) (if_then_else (eq (zero_extract:HI (match_dup 0)
2477 1.1 mrg (const_int 1)
2478 1.1 mrg (const_int 7))
2479 1.1 mrg (const_int 0))
2480 1.1 mrg (label_ref (match_dup 1))
2481 1.1 mrg (pc)))]
2482 1.1 mrg "")
2483 1.1 mrg
2484 1.1 mrg (define_peephole2
2485 1.1 mrg [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
2486 1.1 mrg (const_int 0)))
2487 1.1 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
2488 1.1 mrg (label_ref (match_operand 1 "" ""))
2489 1.1 mrg (pc)))]
2490 1.1 mrg ""
2491 1.1 mrg [(set (pc) (if_then_else (ne (zero_extract:HI (match_dup 0)
2492 1.1 mrg (const_int 1)
2493 1.1 mrg (const_int 7))
2494 1.1 mrg (const_int 0))
2495 1.1 mrg (label_ref (match_dup 1))
2496 1.1 mrg (pc)))]
2497 1.1 mrg "")
2498 1.1 mrg
2499 1.1 mrg (define_peephole2
2500 1.1 mrg [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
2501 1.1 mrg (const_int 0)))
2502 1.1 mrg (clobber (match_operand:HI 2 ""))])
2503 1.1 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
2504 1.1 mrg (label_ref (match_operand 1 "" ""))
2505 1.1 mrg (pc)))]
2506 1.1 mrg ""
2507 1.1 mrg [(set (pc) (if_then_else (eq (and:HI (match_dup 0) (const_int -32768))
2508 1.1 mrg (const_int 0))
2509 1.1 mrg (label_ref (match_dup 1))
2510 1.1 mrg (pc)))]
2511 1.1 mrg "")
2512 1.1 mrg
2513 1.1 mrg (define_peephole2
2514 1.1 mrg [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
2515 1.1 mrg (const_int 0)))
2516 1.1 mrg (clobber (match_operand:HI 2 ""))])
2517 1.1 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
2518 1.1 mrg (label_ref (match_operand 1 "" ""))
2519 1.1 mrg (pc)))]
2520 1.1 mrg ""
2521 1.1 mrg [(set (pc) (if_then_else (ne (and:HI (match_dup 0) (const_int -32768))
2522 1.1 mrg (const_int 0))
2523 1.1 mrg (label_ref (match_dup 1))
2524 1.1 mrg (pc)))]
2525 1.1 mrg "")
2526 1.1 mrg
2527 1.1 mrg (define_peephole2
2528 1.1 mrg [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
2529 1.1 mrg (const_int 0)))
2530 1.1 mrg (clobber (match_operand:SI 2 ""))])
2531 1.1 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
2532 1.1 mrg (label_ref (match_operand 1 "" ""))
2533 1.1 mrg (pc)))]
2534 1.1 mrg ""
2535 1.1 mrg [(set (pc) (if_then_else (eq (and:SI (match_dup 0) (match_dup 2))
2536 1.1 mrg (const_int 0))
2537 1.1 mrg (label_ref (match_dup 1))
2538 1.1 mrg (pc)))]
2539 1.1 mrg "operands[2] = GEN_INT (-2147483647 - 1);")
2540 1.1 mrg
2541 1.1 mrg (define_peephole2
2542 1.1 mrg [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
2543 1.1 mrg (const_int 0)))
2544 1.1 mrg (clobber (match_operand:SI 2 ""))])
2545 1.1 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
2546 1.1 mrg (label_ref (match_operand 1 "" ""))
2547 1.1 mrg (pc)))]
2548 1.1 mrg ""
2549 1.1 mrg [(set (pc) (if_then_else (ne (and:SI (match_dup 0) (match_dup 2))
2550 1.1 mrg (const_int 0))
2551 1.1 mrg (label_ref (match_dup 1))
2552 1.1 mrg (pc)))]
2553 1.1 mrg "operands[2] = GEN_INT (-2147483647 - 1);")
2554 1.1 mrg
2555 1.1 mrg ;; ************************************************************************
2556 1.1 mrg ;; Implementation of conditional jumps here.
2557 1.1 mrg ;; Compare with 0 (test) jumps
2558 1.1 mrg ;; ************************************************************************
2559 1.1 mrg
2560 1.1 mrg (define_insn "branch"
2561 1.1 mrg [(set (pc)
2562 1.1 mrg (if_then_else (match_operator 1 "simple_comparison_operator"
2563 1.1 mrg [(cc0)
2564 1.1 mrg (const_int 0)])
2565 1.1 mrg (label_ref (match_operand 0 "" ""))
2566 1.1 mrg (pc)))]
2567 1.1 mrg ""
2568 1.1 mrg "*
2569 1.1 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0],insn), 0);"
2570 1.1 mrg [(set_attr "type" "branch")
2571 1.1 mrg (set_attr "cc" "clobber")])
2572 1.1 mrg
2573 1.1 mrg ;; ****************************************************************
2574 1.1 mrg ;; AVR does not have following conditional jumps: LE,LEU,GT,GTU.
2575 1.1 mrg ;; Convert them all to proper jumps.
2576 1.1 mrg ;; ****************************************************************/
2577 1.1 mrg
2578 1.1 mrg (define_insn "difficult_branch"
2579 1.1 mrg [(set (pc)
2580 1.1 mrg (if_then_else (match_operator 1 "difficult_comparison_operator"
2581 1.1 mrg [(cc0)
2582 1.1 mrg (const_int 0)])
2583 1.1 mrg (label_ref (match_operand 0 "" ""))
2584 1.1 mrg (pc)))]
2585 1.1 mrg ""
2586 1.1 mrg "*
2587 1.1 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0],insn), 0);"
2588 1.1 mrg [(set_attr "type" "branch1")
2589 1.1 mrg (set_attr "cc" "clobber")])
2590 1.1 mrg
2591 1.1 mrg ;; revers branch
2592 1.1 mrg
2593 1.1 mrg (define_insn "rvbranch"
2594 1.1 mrg [(set (pc)
2595 1.1 mrg (if_then_else (match_operator 1 "simple_comparison_operator"
2596 1.1 mrg [(cc0)
2597 1.1 mrg (const_int 0)])
2598 1.1 mrg (pc)
2599 1.1 mrg (label_ref (match_operand 0 "" ""))))]
2600 1.1 mrg ""
2601 1.1 mrg "*
2602 1.1 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);"
2603 1.1 mrg [(set_attr "type" "branch1")
2604 1.1 mrg (set_attr "cc" "clobber")])
2605 1.1 mrg
2606 1.1 mrg (define_insn "difficult_rvbranch"
2607 1.1 mrg [(set (pc)
2608 1.1 mrg (if_then_else (match_operator 1 "difficult_comparison_operator"
2609 1.1 mrg [(cc0)
2610 1.1 mrg (const_int 0)])
2611 1.1 mrg (pc)
2612 1.1 mrg (label_ref (match_operand 0 "" ""))))]
2613 1.1 mrg ""
2614 1.1 mrg "*
2615 1.1 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);"
2616 1.1 mrg [(set_attr "type" "branch")
2617 1.1 mrg (set_attr "cc" "clobber")])
2618 1.1 mrg
2619 1.1 mrg ;; **************************************************************************
2620 1.1 mrg ;; Unconditional and other jump instructions.
2621 1.1 mrg
2622 1.1 mrg (define_insn "jump"
2623 1.1 mrg [(set (pc)
2624 1.1 mrg (label_ref (match_operand 0 "" "")))]
2625 1.1 mrg ""
2626 1.1 mrg "*{
2627 1.1 mrg if (AVR_HAVE_JMP_CALL && get_attr_length (insn) != 1)
2628 1.1 mrg return AS1 (jmp,%x0);
2629 1.1 mrg return AS1 (rjmp,%x0);
2630 1.1 mrg }"
2631 1.1 mrg [(set (attr "length")
2632 1.1 mrg (if_then_else (match_operand 0 "symbol_ref_operand" "")
2633 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2634 1.1 mrg (const_int 1)
2635 1.1 mrg (const_int 2))
2636 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0)) (const_int -2047))
2637 1.1 mrg (le (minus (pc) (match_dup 0)) (const_int 2047)))
2638 1.1 mrg (const_int 1)
2639 1.1 mrg (const_int 2))))
2640 1.1 mrg (set_attr "cc" "none")])
2641 1.1 mrg
2642 1.1 mrg ;; call
2643 1.1 mrg
2644 1.1 mrg (define_expand "call"
2645 1.1 mrg [(call (match_operand:HI 0 "call_insn_operand" "")
2646 1.1 mrg (match_operand:HI 1 "general_operand" ""))]
2647 1.1 mrg ;; Operand 1 not used on the AVR.
2648 1.1 mrg ""
2649 1.1 mrg "")
2650 1.1 mrg
2651 1.1 mrg ;; call value
2652 1.1 mrg
2653 1.1 mrg (define_expand "call_value"
2654 1.1 mrg [(set (match_operand 0 "register_operand" "")
2655 1.1 mrg (call (match_operand:HI 1 "call_insn_operand" "")
2656 1.1 mrg (match_operand:HI 2 "general_operand" "")))]
2657 1.1 mrg ;; Operand 2 not used on the AVR.
2658 1.1 mrg ""
2659 1.1 mrg "")
2660 1.1 mrg
2661 1.1 mrg (define_insn "call_insn"
2662 1.1 mrg [(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "!z,*r,s,n"))
2663 1.1 mrg (match_operand:HI 1 "general_operand" "X,X,X,X"))]
2664 1.1 mrg ;; We don't need in saving Z register because r30,r31 is a call used registers
2665 1.1 mrg ;; Operand 1 not used on the AVR.
2666 1.1 mrg "(register_operand (operands[0], HImode) || CONSTANT_P (operands[0]))"
2667 1.1 mrg "*{
2668 1.1 mrg if (which_alternative==0)
2669 1.1 mrg return \"%!icall\";
2670 1.1 mrg else if (which_alternative==1)
2671 1.1 mrg {
2672 1.1 mrg if (AVR_HAVE_MOVW)
2673 1.1 mrg return (AS2 (movw, r30, %0) CR_TAB
2674 1.1 mrg \"%!icall\");
2675 1.1 mrg else
2676 1.1 mrg return (AS2 (mov, r30, %A0) CR_TAB
2677 1.1 mrg AS2 (mov, r31, %B0) CR_TAB
2678 1.1 mrg \"%!icall\");
2679 1.1 mrg }
2680 1.1 mrg else if (which_alternative==2)
2681 1.1 mrg return AS1(%~call,%x0);
2682 1.1 mrg return (AS2 (ldi,r30,lo8(%0)) CR_TAB
2683 1.1 mrg AS2 (ldi,r31,hi8(%0)) CR_TAB
2684 1.1 mrg \"%!icall\");
2685 1.1 mrg }"
2686 1.1 mrg [(set_attr "cc" "clobber,clobber,clobber,clobber")
2687 1.1 mrg (set_attr_alternative "length"
2688 1.1 mrg [(const_int 1)
2689 1.1 mrg (if_then_else (eq_attr "mcu_have_movw" "yes")
2690 1.1 mrg (const_int 2)
2691 1.1 mrg (const_int 3))
2692 1.1 mrg (if_then_else (eq_attr "mcu_mega" "yes")
2693 1.1 mrg (const_int 2)
2694 1.1 mrg (const_int 1))
2695 1.1 mrg (const_int 3)])])
2696 1.1 mrg
2697 1.1 mrg (define_insn "call_value_insn"
2698 1.1 mrg [(set (match_operand 0 "register_operand" "=r,r,r,r")
2699 1.1 mrg (call (mem:HI (match_operand:HI 1 "nonmemory_operand" "!z,*r,s,n"))
2700 1.1 mrg ;; We don't need in saving Z register because r30,r31 is a call used registers
2701 1.1 mrg (match_operand:HI 2 "general_operand" "X,X,X,X")))]
2702 1.1 mrg ;; Operand 2 not used on the AVR.
2703 1.1 mrg "(register_operand (operands[0], VOIDmode) || CONSTANT_P (operands[0]))"
2704 1.1 mrg "*{
2705 1.1 mrg if (which_alternative==0)
2706 1.1 mrg return \"%!icall\";
2707 1.1 mrg else if (which_alternative==1)
2708 1.1 mrg {
2709 1.1 mrg if (AVR_HAVE_MOVW)
2710 1.1 mrg return (AS2 (movw, r30, %1) CR_TAB
2711 1.1 mrg \"%!icall\");
2712 1.1 mrg else
2713 1.1 mrg return (AS2 (mov, r30, %A1) CR_TAB
2714 1.1 mrg AS2 (mov, r31, %B1) CR_TAB
2715 1.1 mrg \"%!icall\");
2716 1.1 mrg }
2717 1.1 mrg else if (which_alternative==2)
2718 1.1 mrg return AS1(%~call,%x1);
2719 1.1 mrg return (AS2 (ldi, r30, lo8(%1)) CR_TAB
2720 1.1 mrg AS2 (ldi, r31, hi8(%1)) CR_TAB
2721 1.1 mrg \"%!icall\");
2722 1.1 mrg }"
2723 1.1 mrg [(set_attr "cc" "clobber,clobber,clobber,clobber")
2724 1.1 mrg (set_attr_alternative "length"
2725 1.1 mrg [(const_int 1)
2726 1.1 mrg (if_then_else (eq_attr "mcu_have_movw" "yes")
2727 1.1 mrg (const_int 2)
2728 1.1 mrg (const_int 3))
2729 1.1 mrg (if_then_else (eq_attr "mcu_mega" "yes")
2730 1.1 mrg (const_int 2)
2731 1.1 mrg (const_int 1))
2732 1.1 mrg (const_int 3)])])
2733 1.1 mrg
2734 1.1 mrg (define_insn "nop"
2735 1.1 mrg [(const_int 0)]
2736 1.1 mrg ""
2737 1.1 mrg "nop"
2738 1.1 mrg [(set_attr "cc" "none")
2739 1.1 mrg (set_attr "length" "1")])
2740 1.1 mrg
2741 1.1 mrg ; indirect jump
2742 1.1 mrg
2743 1.1 mrg (define_expand "indirect_jump"
2744 1.1 mrg [(set (pc) (match_operand:HI 0 "nonmemory_operand" ""))]
2745 1.1 mrg ""
2746 1.1 mrg " if ((!AVR_HAVE_JMP_CALL) && !register_operand(operand0, HImode))
2747 1.1 mrg {
2748 1.1 mrg operands[0] = copy_to_mode_reg(HImode, operand0);
2749 1.1 mrg }"
2750 1.1 mrg )
2751 1.1 mrg
2752 1.1 mrg ; indirect jump
2753 1.1 mrg (define_insn "*jcindirect_jump"
2754 1.1 mrg [(set (pc) (match_operand:HI 0 "immediate_operand" "i"))]
2755 1.1 mrg ""
2756 1.1 mrg "@
2757 1.1 mrg %~jmp %x0"
2758 1.1 mrg [(set_attr "length" "2")
2759 1.1 mrg (set_attr "cc" "none")])
2760 1.1 mrg
2761 1.1 mrg ;;
2762 1.1 mrg (define_insn "*njcindirect_jump"
2763 1.1 mrg [(set (pc) (match_operand:HI 0 "register_operand" "!z,*r"))]
2764 1.1 mrg "!AVR_HAVE_EIJMP_EICALL"
2765 1.1 mrg "@
2766 1.1 mrg ijmp
2767 1.1 mrg push %A0\;push %B0\;ret"
2768 1.1 mrg [(set_attr "length" "1,3")
2769 1.1 mrg (set_attr "cc" "none,none")])
2770 1.1 mrg
2771 1.1 mrg (define_insn "*indirect_jump_avr6"
2772 1.1 mrg [(set (pc) (match_operand:HI 0 "register_operand" "z"))]
2773 1.1 mrg "AVR_HAVE_EIJMP_EICALL"
2774 1.1 mrg "eijmp"
2775 1.1 mrg [(set_attr "length" "1")
2776 1.1 mrg (set_attr "cc" "none")])
2777 1.1 mrg
2778 1.1 mrg ;; table jump
2779 1.1 mrg
2780 1.1 mrg ;; Table made from "rjmp" instructions for <=8K devices.
2781 1.1 mrg (define_insn "*tablejump_rjmp"
2782 1.1 mrg [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r")]
2783 1.1 mrg UNSPEC_INDEX_JMP))
2784 1.1 mrg (use (label_ref (match_operand 1 "" "")))
2785 1.1 mrg (clobber (match_dup 0))]
2786 1.1 mrg "(!AVR_HAVE_JMP_CALL) && (!AVR_HAVE_EIJMP_EICALL)"
2787 1.1 mrg "@
2788 1.1 mrg ijmp
2789 1.1 mrg push %A0\;push %B0\;ret"
2790 1.1 mrg [(set_attr "length" "1,3")
2791 1.1 mrg (set_attr "cc" "none,none")])
2792 1.1 mrg
2793 1.1 mrg ;; Not a prologue, but similar idea - move the common piece of code to libgcc.
2794 1.1 mrg (define_insn "*tablejump_lib"
2795 1.1 mrg [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
2796 1.1 mrg UNSPEC_INDEX_JMP))
2797 1.1 mrg (use (label_ref (match_operand 1 "" "")))
2798 1.1 mrg (clobber (match_dup 0))]
2799 1.1 mrg "AVR_HAVE_JMP_CALL && TARGET_CALL_PROLOGUES"
2800 1.1 mrg "%~jmp __tablejump2__"
2801 1.1 mrg [(set_attr "length" "2")
2802 1.1 mrg (set_attr "cc" "clobber")])
2803 1.1 mrg
2804 1.1 mrg (define_insn "*tablejump_enh"
2805 1.1 mrg [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
2806 1.1 mrg UNSPEC_INDEX_JMP))
2807 1.1 mrg (use (label_ref (match_operand 1 "" "")))
2808 1.1 mrg (clobber (match_dup 0))]
2809 1.1 mrg "AVR_HAVE_JMP_CALL && AVR_HAVE_LPMX"
2810 1.1 mrg "lsl r30
2811 1.1 mrg rol r31
2812 1.1 mrg lpm __tmp_reg__,Z+
2813 1.1 mrg lpm r31,Z
2814 1.1 mrg mov r30,__tmp_reg__
2815 1.1 mrg %!ijmp"
2816 1.1 mrg [(set_attr "length" "6")
2817 1.1 mrg (set_attr "cc" "clobber")])
2818 1.1 mrg
2819 1.1 mrg (define_insn "*tablejump"
2820 1.1 mrg [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
2821 1.1 mrg UNSPEC_INDEX_JMP))
2822 1.1 mrg (use (label_ref (match_operand 1 "" "")))
2823 1.1 mrg (clobber (match_dup 0))]
2824 1.1 mrg "AVR_HAVE_JMP_CALL && !AVR_HAVE_EIJMP_EICALL"
2825 1.1 mrg "lsl r30
2826 1.1 mrg rol r31
2827 1.1 mrg lpm
2828 1.1 mrg inc r30
2829 1.1 mrg push r0
2830 1.1 mrg lpm
2831 1.1 mrg push r0
2832 1.1 mrg ret"
2833 1.1 mrg [(set_attr "length" "8")
2834 1.1 mrg (set_attr "cc" "clobber")])
2835 1.1 mrg
2836 1.1 mrg (define_expand "casesi"
2837 1.1 mrg [(set (match_dup 6)
2838 1.1 mrg (minus:HI (subreg:HI (match_operand:SI 0 "register_operand" "") 0)
2839 1.1 mrg (match_operand:HI 1 "register_operand" "")))
2840 1.1 mrg (parallel [(set (cc0)
2841 1.1 mrg (compare (match_dup 6)
2842 1.1 mrg (match_operand:HI 2 "register_operand" "")))
2843 1.1 mrg (clobber (match_scratch:QI 9 ""))])
2844 1.1 mrg
2845 1.1 mrg (set (pc)
2846 1.1 mrg (if_then_else (gtu (cc0)
2847 1.1 mrg (const_int 0))
2848 1.1 mrg (label_ref (match_operand 4 "" ""))
2849 1.1 mrg (pc)))
2850 1.1 mrg
2851 1.1 mrg (set (match_dup 6)
2852 1.1 mrg (plus:HI (match_dup 6) (label_ref (match_operand:HI 3 "" ""))))
2853 1.1 mrg
2854 1.1 mrg (parallel [(set (pc) (unspec:HI [(match_dup 6)] UNSPEC_INDEX_JMP))
2855 1.1 mrg (use (label_ref (match_dup 3)))
2856 1.1 mrg (clobber (match_dup 6))])]
2857 1.1 mrg ""
2858 1.1 mrg "
2859 1.1 mrg {
2860 1.1 mrg operands[6] = gen_reg_rtx (HImode);
2861 1.1 mrg }")
2862 1.1 mrg
2863 1.1 mrg
2864 1.1 mrg ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2865 1.1 mrg ;; This instruction sets Z flag
2866 1.1 mrg
2867 1.1 mrg (define_insn "sez"
2868 1.1 mrg [(set (cc0) (const_int 0))]
2869 1.1 mrg ""
2870 1.1 mrg "sez"
2871 1.1 mrg [(set_attr "length" "1")
2872 1.1 mrg (set_attr "cc" "compare")])
2873 1.1 mrg
2874 1.1 mrg ;; Clear/set/test a single bit in I/O address space.
2875 1.1 mrg
2876 1.1 mrg (define_insn "*cbi"
2877 1.1 mrg [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
2878 1.1 mrg (and:QI (mem:QI (match_dup 0))
2879 1.1 mrg (match_operand:QI 1 "single_zero_operand" "n")))]
2880 1.1 mrg "(optimize > 0)"
2881 1.1 mrg {
2882 1.1 mrg operands[2] = GEN_INT (exact_log2 (~INTVAL (operands[1]) & 0xff));
2883 1.1 mrg return AS2 (cbi,%m0-0x20,%2);
2884 1.1 mrg }
2885 1.1 mrg [(set_attr "length" "1")
2886 1.1 mrg (set_attr "cc" "none")])
2887 1.1 mrg
2888 1.1 mrg (define_insn "*sbi"
2889 1.1 mrg [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
2890 1.1 mrg (ior:QI (mem:QI (match_dup 0))
2891 1.1 mrg (match_operand:QI 1 "single_one_operand" "n")))]
2892 1.1 mrg "(optimize > 0)"
2893 1.1 mrg {
2894 1.1 mrg operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1]) & 0xff));
2895 1.1 mrg return AS2 (sbi,%m0-0x20,%2);
2896 1.1 mrg }
2897 1.1 mrg [(set_attr "length" "1")
2898 1.1 mrg (set_attr "cc" "none")])
2899 1.1 mrg
2900 1.1 mrg ;; Lower half of the I/O space - use sbic/sbis directly.
2901 1.1 mrg (define_insn "*sbix_branch"
2902 1.1 mrg [(set (pc)
2903 1.1 mrg (if_then_else
2904 1.1 mrg (match_operator 0 "eqne_operator"
2905 1.1 mrg [(zero_extract:HI
2906 1.1 mrg (mem:QI (match_operand 1 "low_io_address_operand" "n"))
2907 1.1 mrg (const_int 1)
2908 1.1 mrg (match_operand 2 "const_int_operand" "n"))
2909 1.1 mrg (const_int 0)])
2910 1.1 mrg (label_ref (match_operand 3 "" ""))
2911 1.1 mrg (pc)))]
2912 1.1 mrg "(optimize > 0)"
2913 1.1 mrg "* return avr_out_sbxx_branch (insn, operands);"
2914 1.1 mrg [(set (attr "length")
2915 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
2916 1.1 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
2917 1.1 mrg (const_int 2)
2918 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2919 1.1 mrg (const_int 2)
2920 1.1 mrg (const_int 4))))
2921 1.1 mrg (set_attr "cc" "clobber")])
2922 1.1 mrg
2923 1.1 mrg ;; Tests of bit 7 are pessimized to sign tests, so we need this too...
2924 1.1 mrg (define_insn "*sbix_branch_bit7"
2925 1.1 mrg [(set (pc)
2926 1.1 mrg (if_then_else
2927 1.1 mrg (match_operator 0 "gelt_operator"
2928 1.1 mrg [(mem:QI (match_operand 1 "low_io_address_operand" "n"))
2929 1.1 mrg (const_int 0)])
2930 1.1 mrg (label_ref (match_operand 2 "" ""))
2931 1.1 mrg (pc)))]
2932 1.1 mrg "(optimize > 0)"
2933 1.1 mrg {
2934 1.1 mrg operands[3] = operands[2];
2935 1.1 mrg operands[2] = GEN_INT (7);
2936 1.1 mrg return avr_out_sbxx_branch (insn, operands);
2937 1.1 mrg }
2938 1.1 mrg [(set (attr "length")
2939 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
2940 1.1 mrg (le (minus (pc) (match_dup 2)) (const_int 2046)))
2941 1.1 mrg (const_int 2)
2942 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2943 1.1 mrg (const_int 2)
2944 1.1 mrg (const_int 4))))
2945 1.1 mrg (set_attr "cc" "clobber")])
2946 1.1 mrg
2947 1.1 mrg ;; Upper half of the I/O space - read port to __tmp_reg__ and use sbrc/sbrs.
2948 1.1 mrg (define_insn "*sbix_branch_tmp"
2949 1.1 mrg [(set (pc)
2950 1.1 mrg (if_then_else
2951 1.1 mrg (match_operator 0 "eqne_operator"
2952 1.1 mrg [(zero_extract:HI
2953 1.1 mrg (mem:QI (match_operand 1 "high_io_address_operand" "n"))
2954 1.1 mrg (const_int 1)
2955 1.1 mrg (match_operand 2 "const_int_operand" "n"))
2956 1.1 mrg (const_int 0)])
2957 1.1 mrg (label_ref (match_operand 3 "" ""))
2958 1.1 mrg (pc)))]
2959 1.1 mrg "(optimize > 0)"
2960 1.1 mrg "* return avr_out_sbxx_branch (insn, operands);"
2961 1.1 mrg [(set (attr "length")
2962 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
2963 1.1 mrg (le (minus (pc) (match_dup 3)) (const_int 2045)))
2964 1.1 mrg (const_int 3)
2965 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2966 1.1 mrg (const_int 3)
2967 1.1 mrg (const_int 5))))
2968 1.1 mrg (set_attr "cc" "clobber")])
2969 1.1 mrg
2970 1.1 mrg (define_insn "*sbix_branch_tmp_bit7"
2971 1.1 mrg [(set (pc)
2972 1.1 mrg (if_then_else
2973 1.1 mrg (match_operator 0 "gelt_operator"
2974 1.1 mrg [(mem:QI (match_operand 1 "high_io_address_operand" "n"))
2975 1.1 mrg (const_int 0)])
2976 1.1 mrg (label_ref (match_operand 2 "" ""))
2977 1.1 mrg (pc)))]
2978 1.1 mrg "(optimize > 0)"
2979 1.1 mrg {
2980 1.1 mrg operands[3] = operands[2];
2981 1.1 mrg operands[2] = GEN_INT (7);
2982 1.1 mrg return avr_out_sbxx_branch (insn, operands);
2983 1.1 mrg }
2984 1.1 mrg [(set (attr "length")
2985 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
2986 1.1 mrg (le (minus (pc) (match_dup 2)) (const_int 2045)))
2987 1.1 mrg (const_int 3)
2988 1.1 mrg (if_then_else (eq_attr "mcu_mega" "no")
2989 1.1 mrg (const_int 3)
2990 1.1 mrg (const_int 5))))
2991 1.1 mrg (set_attr "cc" "clobber")])
2992 1.1 mrg
2993 1.1 mrg ;; ************************* Peepholes ********************************
2994 1.1 mrg
2995 1.1 mrg (define_peephole
2996 1.1 mrg [(set (match_operand:SI 0 "d_register_operand" "")
2997 1.1 mrg (plus:SI (match_dup 0)
2998 1.1 mrg (const_int -1)))
2999 1.1 mrg (parallel
3000 1.1 mrg [(set (cc0)
3001 1.1 mrg (compare (match_dup 0)
3002 1.1 mrg (const_int -1)))
3003 1.1 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
3004 1.1 mrg (set (pc)
3005 1.1 mrg (if_then_else (ne (cc0) (const_int 0))
3006 1.1 mrg (label_ref (match_operand 2 "" ""))
3007 1.1 mrg (pc)))]
3008 1.1 mrg ""
3009 1.1 mrg "*
3010 1.1 mrg {
3011 1.1 mrg CC_STATUS_INIT;
3012 1.1 mrg if (test_hard_reg_class (ADDW_REGS, operands[0]))
3013 1.1 mrg output_asm_insn (AS2 (sbiw,%0,1) CR_TAB
3014 1.1 mrg AS2 (sbc,%C0,__zero_reg__) CR_TAB
3015 1.1 mrg AS2 (sbc,%D0,__zero_reg__) \"\\n\", operands);
3016 1.1 mrg else
3017 1.1 mrg output_asm_insn (AS2 (subi,%A0,1) CR_TAB
3018 1.1 mrg AS2 (sbc,%B0,__zero_reg__) CR_TAB
3019 1.1 mrg AS2 (sbc,%C0,__zero_reg__) CR_TAB
3020 1.1 mrg AS2 (sbc,%D0,__zero_reg__) \"\\n\", operands);
3021 1.1 mrg switch (avr_jump_mode (operands[2],insn))
3022 1.1 mrg {
3023 1.1 mrg case 1:
3024 1.1 mrg return AS1 (brcc,%2);
3025 1.1 mrg case 2:
3026 1.1 mrg return (AS1 (brcs,.+2) CR_TAB
3027 1.1 mrg AS1 (rjmp,%2));
3028 1.1 mrg }
3029 1.1 mrg return (AS1 (brcs,.+4) CR_TAB
3030 1.1 mrg AS1 (jmp,%2));
3031 1.1 mrg }")
3032 1.1 mrg
3033 1.1 mrg (define_peephole
3034 1.1 mrg [(set (match_operand:HI 0 "d_register_operand" "")
3035 1.1 mrg (plus:HI (match_dup 0)
3036 1.1 mrg (const_int -1)))
3037 1.1 mrg (parallel
3038 1.1 mrg [(set (cc0)
3039 1.1 mrg (compare (match_dup 0)
3040 1.1 mrg (const_int 65535)))
3041 1.1 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
3042 1.1 mrg (set (pc)
3043 1.1 mrg (if_then_else (ne (cc0) (const_int 0))
3044 1.1 mrg (label_ref (match_operand 2 "" ""))
3045 1.1 mrg (pc)))]
3046 1.1 mrg ""
3047 1.1 mrg "*
3048 1.1 mrg {
3049 1.1 mrg CC_STATUS_INIT;
3050 1.1 mrg if (test_hard_reg_class (ADDW_REGS, operands[0]))
3051 1.1 mrg output_asm_insn (AS2 (sbiw,%0,1), operands);
3052 1.1 mrg else
3053 1.1 mrg output_asm_insn (AS2 (subi,%A0,1) CR_TAB
3054 1.1 mrg AS2 (sbc,%B0,__zero_reg__) \"\\n\", operands);
3055 1.1 mrg switch (avr_jump_mode (operands[2],insn))
3056 1.1 mrg {
3057 1.1 mrg case 1:
3058 1.1 mrg return AS1 (brcc,%2);
3059 1.1 mrg case 2:
3060 1.1 mrg return (AS1 (brcs,.+2) CR_TAB
3061 1.1 mrg AS1 (rjmp,%2));
3062 1.1 mrg }
3063 1.1 mrg return (AS1 (brcs,.+4) CR_TAB
3064 1.1 mrg AS1 (jmp,%2));
3065 1.1 mrg }")
3066 1.1 mrg
3067 1.1 mrg (define_peephole
3068 1.1 mrg [(set (match_operand:QI 0 "d_register_operand" "")
3069 1.1 mrg (plus:QI (match_dup 0)
3070 1.1 mrg (const_int -1)))
3071 1.1 mrg (set (cc0)
3072 1.1 mrg (compare (match_dup 0)
3073 1.1 mrg (const_int -1)))
3074 1.1 mrg (set (pc)
3075 1.1 mrg (if_then_else (ne (cc0) (const_int 0))
3076 1.1 mrg (label_ref (match_operand 1 "" ""))
3077 1.1 mrg (pc)))]
3078 1.1 mrg ""
3079 1.1 mrg "*
3080 1.1 mrg {
3081 1.1 mrg CC_STATUS_INIT;
3082 1.1 mrg cc_status.value1 = operands[0];
3083 1.1 mrg cc_status.flags |= CC_OVERFLOW_UNUSABLE;
3084 1.1 mrg output_asm_insn (AS2 (subi,%A0,1), operands);
3085 1.1 mrg switch (avr_jump_mode (operands[1],insn))
3086 1.1 mrg {
3087 1.1 mrg case 1:
3088 1.1 mrg return AS1 (brcc,%1);
3089 1.1 mrg case 2:
3090 1.1 mrg return (AS1 (brcs,.+2) CR_TAB
3091 1.1 mrg AS1 (rjmp,%1));
3092 1.1 mrg }
3093 1.1 mrg return (AS1 (brcs,.+4) CR_TAB
3094 1.1 mrg AS1 (jmp,%1));
3095 1.1 mrg }")
3096 1.1 mrg
3097 1.1 mrg (define_peephole
3098 1.1 mrg [(set (cc0)
3099 1.1 mrg (compare (match_operand:QI 0 "register_operand" "")
3100 1.1 mrg (const_int 0)))
3101 1.1 mrg (set (pc)
3102 1.1 mrg (if_then_else (eq (cc0) (const_int 0))
3103 1.1 mrg (label_ref (match_operand 1 "" ""))
3104 1.1 mrg (pc)))]
3105 1.1 mrg "jump_over_one_insn_p (insn, operands[1])"
3106 1.1 mrg "cpse %0,__zero_reg__")
3107 1.1 mrg
3108 1.1 mrg (define_peephole
3109 1.1 mrg [(set (cc0)
3110 1.1 mrg (compare (match_operand:QI 0 "register_operand" "")
3111 1.1 mrg (match_operand:QI 1 "register_operand" "")))
3112 1.1 mrg (set (pc)
3113 1.1 mrg (if_then_else (eq (cc0) (const_int 0))
3114 1.1 mrg (label_ref (match_operand 2 "" ""))
3115 1.1 mrg (pc)))]
3116 1.1 mrg "jump_over_one_insn_p (insn, operands[2])"
3117 1.1 mrg "cpse %0,%1")
3118 1.1 mrg
3119 1.1 mrg ;;pppppppppppppppppppppppppppppppppppppppppppppppppppp
3120 1.1 mrg ;;prologue/epilogue support instructions
3121 1.1 mrg
3122 1.1 mrg (define_insn "popqi"
3123 1.1 mrg [(set (match_operand:QI 0 "register_operand" "=r")
3124 1.1 mrg (mem:QI (post_inc (reg:HI REG_SP))))]
3125 1.1 mrg ""
3126 1.1 mrg "pop %0"
3127 1.1 mrg [(set_attr "cc" "none")
3128 1.1 mrg (set_attr "length" "1")])
3129 1.1 mrg
3130 1.1 mrg (define_insn "pophi"
3131 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
3132 1.1 mrg (mem:HI (post_inc (reg:HI REG_SP))))]
3133 1.1 mrg ""
3134 1.1 mrg "pop %A0\;pop %B0"
3135 1.1 mrg [(set_attr "cc" "none")
3136 1.1 mrg (set_attr "length" "2")])
3137 1.1 mrg
3138 1.1 mrg ;; Enable Interrupts
3139 1.1 mrg (define_insn "enable_interrupt"
3140 1.1 mrg [(unspec [(const_int 0)] UNSPEC_SEI)]
3141 1.1 mrg ""
3142 1.1 mrg "sei"
3143 1.1 mrg [(set_attr "length" "1")
3144 1.1 mrg (set_attr "cc" "none")
3145 1.1 mrg ])
3146 1.1 mrg
3147 1.1 mrg ;; Disable Interrupts
3148 1.1 mrg (define_insn "disable_interrupt"
3149 1.1 mrg [(unspec [(const_int 0)] UNSPEC_CLI)]
3150 1.1 mrg ""
3151 1.1 mrg "cli"
3152 1.1 mrg [(set_attr "length" "1")
3153 1.1 mrg (set_attr "cc" "none")
3154 1.1 mrg ])
3155 1.1 mrg
3156 1.1 mrg ;; Library prologue saves
3157 1.1 mrg (define_insn "call_prologue_saves"
3158 1.1 mrg [(unspec_volatile:HI [(const_int 0)] UNSPECV_PROLOGUE_SAVES)
3159 1.1 mrg (match_operand:HI 0 "immediate_operand" "")
3160 1.1 mrg (set (reg:HI REG_SP) (minus:HI
3161 1.1 mrg (reg:HI REG_SP)
3162 1.1 mrg (match_operand:HI 1 "immediate_operand" "")))
3163 1.1 mrg (use (reg:HI REG_X))
3164 1.1 mrg (clobber (reg:HI REG_Z))]
3165 1.1 mrg ""
3166 1.1 mrg "ldi r30,lo8(gs(1f))
3167 1.1 mrg ldi r31,hi8(gs(1f))
3168 1.1 mrg %~jmp __prologue_saves__+((18 - %0) * 2)
3169 1.1 mrg 1:"
3170 1.1 mrg [(set_attr_alternative "length"
3171 1.1 mrg [(if_then_else (eq_attr "mcu_mega" "yes")
3172 1.1 mrg (const_int 6)
3173 1.1 mrg (const_int 5))])
3174 1.1 mrg (set_attr "cc" "clobber")
3175 1.1 mrg ])
3176 1.1 mrg
3177 1.1 mrg ; epilogue restores using library
3178 1.1 mrg (define_insn "epilogue_restores"
3179 1.1 mrg [(unspec_volatile:QI [(const_int 0)] UNSPECV_EPILOGUE_RESTORES)
3180 1.1 mrg (set (reg:HI REG_Y ) (plus:HI
3181 1.1 mrg (reg:HI REG_Y)
3182 1.1 mrg (match_operand:HI 0 "immediate_operand" "")))
3183 1.1 mrg (set (reg:HI REG_SP) (reg:HI REG_Y))
3184 1.1 mrg (clobber (reg:QI REG_Z))]
3185 1.1 mrg ""
3186 1.1 mrg "ldi r30, lo8(%0)
3187 1.1 mrg %~jmp __epilogue_restores__ + ((18 - %0) * 2)"
3188 1.1 mrg [(set_attr_alternative "length"
3189 1.1 mrg [(if_then_else (eq_attr "mcu_mega" "yes")
3190 1.1 mrg (const_int 3)
3191 1.1 mrg (const_int 2))])
3192 1.1 mrg (set_attr "cc" "clobber")
3193 1.1 mrg ])
3194 1.1 mrg
3195 1.1 mrg ; return
3196 1.1 mrg (define_insn "return"
3197 1.1 mrg [(return)]
3198 1.1 mrg "reload_completed && avr_simple_epilogue ()"
3199 1.1 mrg "ret"
3200 1.1 mrg [(set_attr "cc" "none")
3201 1.1 mrg (set_attr "length" "1")])
3202 1.1 mrg
3203 1.1 mrg (define_insn "return_from_epilogue"
3204 1.1 mrg [(return)]
3205 1.1 mrg "(reload_completed
3206 1.1 mrg && cfun->machine
3207 1.1 mrg && !(cfun->machine->is_interrupt || cfun->machine->is_signal)
3208 1.1 mrg && !cfun->machine->is_naked)"
3209 1.1 mrg "ret"
3210 1.1 mrg [(set_attr "cc" "none")
3211 1.1 mrg (set_attr "length" "1")])
3212 1.1 mrg
3213 1.1 mrg (define_insn "return_from_interrupt_epilogue"
3214 1.1 mrg [(return)]
3215 1.1 mrg "(reload_completed
3216 1.1 mrg && cfun->machine
3217 1.1 mrg && (cfun->machine->is_interrupt || cfun->machine->is_signal)
3218 1.1 mrg && !cfun->machine->is_naked)"
3219 1.1 mrg "reti"
3220 1.1 mrg [(set_attr "cc" "none")
3221 1.1 mrg (set_attr "length" "1")])
3222 1.1 mrg
3223 1.1 mrg (define_insn "return_from_naked_epilogue"
3224 1.1 mrg [(return)]
3225 1.1 mrg "(reload_completed
3226 1.1 mrg && cfun->machine
3227 1.1 mrg && cfun->machine->is_naked)"
3228 1.1 mrg ""
3229 1.1 mrg [(set_attr "cc" "none")
3230 1.1 mrg (set_attr "length" "0")])
3231 1.1 mrg
3232 1.1 mrg (define_expand "prologue"
3233 1.1 mrg [(const_int 0)]
3234 1.1 mrg ""
3235 1.1 mrg "
3236 1.1 mrg {
3237 1.1 mrg expand_prologue ();
3238 1.1 mrg DONE;
3239 1.1 mrg }")
3240 1.1 mrg
3241 1.1 mrg (define_expand "epilogue"
3242 1.1 mrg [(const_int 0)]
3243 1.1 mrg ""
3244 1.1 mrg "
3245 1.1 mrg {
3246 1.1 mrg expand_epilogue ();
3247 1.1 mrg DONE;
3248 1.1 mrg }")
3249