avr.md revision 1.1.1.14 1 1.1 mrg ;; Machine description for GNU compiler,
2 1.1 mrg ;; for ATMEL AVR micro controllers.
3 1.1.1.14 mrg ;; Copyright (C) 1998-2020 Free Software Foundation, Inc.
4 1.1 mrg ;; Contributed by Denis Chertykov (chertykov (a] gmail.com)
5 1.1 mrg
6 1.1 mrg ;; This file is part of GCC.
7 1.1 mrg
8 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify
9 1.1 mrg ;; it under the terms of the GNU General Public License as published by
10 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option)
11 1.1 mrg ;; any later version.
12 1.1 mrg
13 1.1 mrg ;; GCC is distributed in the hope that it will be useful,
14 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 mrg ;; GNU General Public License for more details.
17 1.1 mrg
18 1.1 mrg ;; You should have received a copy of the GNU General Public License
19 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
20 1.1 mrg ;; <http://www.gnu.org/licenses/>.
21 1.1 mrg
22 1.1 mrg ;; Special characters after '%':
23 1.1 mrg ;; A No effect (add 0).
24 1.1 mrg ;; B Add 1 to REG number, MEM address or CONST_INT.
25 1.1 mrg ;; C Add 2.
26 1.1 mrg ;; D Add 3.
27 1.1.1.6 mrg ;; E reg number in XEXP(x, 0).
28 1.1.1.6 mrg ;; F Add 1 to reg number.
29 1.1.1.6 mrg ;; I reg number in XEXP(XEXP(x, 0), 0).
30 1.1.1.6 mrg ;; J Add 1 to reg number.
31 1.1 mrg ;; j Branch condition.
32 1.1 mrg ;; k Reverse branch condition.
33 1.1 mrg ;;..m..Constant Direct Data memory address.
34 1.1.1.2 mrg ;; i Print the SFR address quivalent of a CONST_INT or a CONST_INT
35 1.1.1.2 mrg ;; RAM address. The resulting address is suitable to be used in IN/OUT.
36 1.1 mrg ;; o Displacement for (mem (plus (reg) (const_int))) operands.
37 1.1 mrg ;; p POST_INC or PRE_DEC address as a pointer (X, Y, Z)
38 1.1 mrg ;; r POST_INC or PRE_DEC address as a register (r26, r28, r30)
39 1.1.1.6 mrg ;; r Print a REG without the register prefix 'r'.
40 1.1.1.2 mrg ;; T/T Print operand suitable for BLD/BST instruction, i.e. register and
41 1.1.1.2 mrg ;; bit number. This gets 2 operands: The first %T gets a REG_P and
42 1.1.1.2 mrg ;; just cashes the operand for the next %T. The second %T gets
43 1.1.1.2 mrg ;; a CONST_INT that represents a bit position.
44 1.1.1.2 mrg ;; Example: With %0 = (reg:HI 18) and %1 = (const_int 13)
45 1.1.1.2 mrg ;; "%T0%T1" it will print "r19,5".
46 1.1.1.2 mrg ;; Notice that you must not write a comma between %T0 and %T1.
47 1.1.1.2 mrg ;; T/t Similar to above, but don't print the comma and the bit number.
48 1.1.1.2 mrg ;; Example: With %0 = (reg:HI 18) and %1 = (const_int 13)
49 1.1.1.2 mrg ;; "%T0%t1" it will print "r19".
50 1.1 mrg ;;..x..Constant Direct Program memory address.
51 1.1 mrg ;; ~ Output 'r' if not AVR_HAVE_JMP_CALL.
52 1.1 mrg ;; ! Output 'e' if AVR_HAVE_EIJMP_EICALL.
53 1.1 mrg
54 1.1 mrg
55 1.1 mrg (define_constants
56 1.1.1.2 mrg [(REG_X 26)
57 1.1.1.2 mrg (REG_Y 28)
58 1.1.1.2 mrg (REG_Z 30)
59 1.1.1.2 mrg (REG_W 24)
60 1.1.1.2 mrg (REG_SP 32)
61 1.1.1.2 mrg (LPM_REGNO 0) ; implicit target register of LPM
62 1.1.1.2 mrg (TMP_REGNO 0) ; temporary register r0
63 1.1.1.2 mrg (ZERO_REGNO 1) ; zero register r1
64 1.1.1.2 mrg ])
65 1.1.1.2 mrg
66 1.1.1.6 mrg (define_constants
67 1.1.1.6 mrg [(TMP_REGNO_TINY 16) ; r16 is temp register for AVR_TINY
68 1.1.1.6 mrg (ZERO_REGNO_TINY 17) ; r17 is zero register for AVR_TINY
69 1.1.1.6 mrg ])
70 1.1.1.6 mrg
71 1.1.1.2 mrg (define_c_enum "unspec"
72 1.1.1.2 mrg [UNSPEC_STRLEN
73 1.1.1.14 mrg UNSPEC_CPYMEM
74 1.1.1.2 mrg UNSPEC_INDEX_JMP
75 1.1.1.2 mrg UNSPEC_FMUL
76 1.1.1.2 mrg UNSPEC_FMULS
77 1.1.1.2 mrg UNSPEC_FMULSU
78 1.1.1.2 mrg UNSPEC_COPYSIGN
79 1.1.1.2 mrg UNSPEC_IDENTITY
80 1.1.1.2 mrg UNSPEC_INSERT_BITS
81 1.1.1.2 mrg UNSPEC_ROUND
82 1.1.1.2 mrg ])
83 1.1.1.2 mrg
84 1.1.1.2 mrg (define_c_enum "unspecv"
85 1.1.1.2 mrg [UNSPECV_PROLOGUE_SAVES
86 1.1.1.2 mrg UNSPECV_EPILOGUE_RESTORES
87 1.1.1.2 mrg UNSPECV_WRITE_SP
88 1.1.1.12 mrg UNSPECV_GASISR
89 1.1.1.2 mrg UNSPECV_GOTO_RECEIVER
90 1.1.1.2 mrg UNSPECV_ENABLE_IRQS
91 1.1.1.2 mrg UNSPECV_MEMORY_BARRIER
92 1.1.1.2 mrg UNSPECV_NOP
93 1.1.1.2 mrg UNSPECV_SLEEP
94 1.1.1.2 mrg UNSPECV_WDR
95 1.1.1.2 mrg UNSPECV_DELAY_CYCLES
96 1.1.1.2 mrg ])
97 1.1.1.2 mrg
98 1.1.1.12 mrg ;; Chunk numbers for __gcc_isr are hard-coded in GAS.
99 1.1.1.12 mrg (define_constants
100 1.1.1.12 mrg [(GASISR_Prologue 1)
101 1.1.1.12 mrg (GASISR_Epilogue 2)
102 1.1.1.12 mrg (GASISR_Done 0)
103 1.1.1.12 mrg ])
104 1.1 mrg
105 1.1 mrg (include "predicates.md")
106 1.1 mrg (include "constraints.md")
107 1.1.1.2 mrg
108 1.1 mrg ;; Condition code settings.
109 1.1.1.3 skrll (define_attr "cc" "none,set_czn,set_zn,set_vzn,set_n,compare,clobber,
110 1.1.1.2 mrg plus,ldi"
111 1.1 mrg (const_string "none"))
112 1.1 mrg
113 1.1 mrg (define_attr "type" "branch,branch1,arith,xcall"
114 1.1 mrg (const_string "arith"))
115 1.1 mrg
116 1.1 mrg ;; The size of instructions in bytes.
117 1.1 mrg ;; XXX may depend from "cc"
118 1.1 mrg
119 1.1 mrg (define_attr "length" ""
120 1.1 mrg (cond [(eq_attr "type" "branch")
121 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
122 1.1.1.7 mrg (const_int -62))
123 1.1 mrg (le (minus (pc) (match_dup 0))
124 1.1 mrg (const_int 62)))
125 1.1 mrg (const_int 1)
126 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
127 1.1.1.7 mrg (const_int -2044))
128 1.1 mrg (le (minus (pc) (match_dup 0))
129 1.1 mrg (const_int 2045)))
130 1.1 mrg (const_int 2)
131 1.1 mrg (const_int 3)))
132 1.1 mrg (eq_attr "type" "branch1")
133 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
134 1.1 mrg (const_int -62))
135 1.1 mrg (le (minus (pc) (match_dup 0))
136 1.1 mrg (const_int 61)))
137 1.1 mrg (const_int 2)
138 1.1 mrg (if_then_else (and (ge (minus (pc) (match_dup 0))
139 1.1 mrg (const_int -2044))
140 1.1 mrg (le (minus (pc) (match_dup 0))
141 1.1 mrg (const_int 2043)))
142 1.1 mrg (const_int 3)
143 1.1 mrg (const_int 4)))
144 1.1.1.2 mrg (eq_attr "type" "xcall")
145 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
146 1.1.1.2 mrg (const_int 1)
147 1.1.1.2 mrg (const_int 2))]
148 1.1 mrg (const_int 2)))
149 1.1 mrg
150 1.1.1.2 mrg ;; Lengths of several insns are adjusted in avr.c:adjust_insn_length().
151 1.1.1.2 mrg ;; Following insn attribute tells if and how the adjustment has to be
152 1.1.1.2 mrg ;; done:
153 1.1.1.2 mrg ;; no No adjustment needed; attribute "length" is fine.
154 1.1.1.2 mrg ;; Otherwise do special processing depending on the attribute.
155 1.1.1.2 mrg
156 1.1.1.2 mrg (define_attr "adjust_len"
157 1.1.1.6 mrg "out_bitop, plus, addto_sp, sext,
158 1.1.1.2 mrg tsthi, tstpsi, tstsi, compare, compare64, call,
159 1.1.1.2 mrg mov8, mov16, mov24, mov32, reload_in16, reload_in24, reload_in32,
160 1.1.1.2 mrg ufract, sfract, round,
161 1.1.1.14 mrg xload, cpymem,
162 1.1.1.2 mrg ashlqi, ashrqi, lshrqi,
163 1.1.1.2 mrg ashlhi, ashrhi, lshrhi,
164 1.1.1.2 mrg ashlsi, ashrsi, lshrsi,
165 1.1.1.2 mrg ashlpsi, ashrpsi, lshrpsi,
166 1.1.1.9 mrg insert_bits, insv_notbit, insv_notbit_0, insv_notbit_7,
167 1.1.1.2 mrg no"
168 1.1.1.2 mrg (const_string "no"))
169 1.1.1.2 mrg
170 1.1.1.2 mrg ;; Flavours of instruction set architecture (ISA), used in enabled attribute
171 1.1.1.2 mrg
172 1.1.1.2 mrg ;; mov : ISA has no MOVW movw : ISA has MOVW
173 1.1.1.2 mrg ;; rjmp : ISA has no CALL/JMP jmp : ISA has CALL/JMP
174 1.1.1.2 mrg ;; ijmp : ISA has no EICALL/EIJMP eijmp : ISA has EICALL/EIJMP
175 1.1.1.2 mrg ;; lpm : ISA has no LPMX lpmx : ISA has LPMX
176 1.1.1.2 mrg ;; elpm : ISA has ELPM but no ELPMX elpmx : ISA has ELPMX
177 1.1.1.2 mrg ;; no_xmega: non-XMEGA core xmega : XMEGA core
178 1.1.1.6 mrg ;; no_tiny: non-TINY core tiny : TINY core
179 1.1.1.2 mrg
180 1.1.1.2 mrg (define_attr "isa"
181 1.1.1.6 mrg "mov,movw, rjmp,jmp, ijmp,eijmp, lpm,lpmx, elpm,elpmx, no_xmega,xmega, no_tiny,tiny,
182 1.1.1.2 mrg standard"
183 1.1.1.2 mrg (const_string "standard"))
184 1.1.1.2 mrg
185 1.1.1.2 mrg (define_attr "enabled" ""
186 1.1.1.2 mrg (cond [(eq_attr "isa" "standard")
187 1.1.1.2 mrg (const_int 1)
188 1.1.1.2 mrg
189 1.1.1.2 mrg (and (eq_attr "isa" "mov")
190 1.1.1.2 mrg (match_test "!AVR_HAVE_MOVW"))
191 1.1.1.2 mrg (const_int 1)
192 1.1.1.2 mrg
193 1.1.1.2 mrg (and (eq_attr "isa" "movw")
194 1.1.1.2 mrg (match_test "AVR_HAVE_MOVW"))
195 1.1.1.2 mrg (const_int 1)
196 1.1.1.2 mrg
197 1.1.1.2 mrg (and (eq_attr "isa" "rjmp")
198 1.1.1.2 mrg (match_test "!AVR_HAVE_JMP_CALL"))
199 1.1.1.2 mrg (const_int 1)
200 1.1.1.2 mrg
201 1.1.1.2 mrg (and (eq_attr "isa" "jmp")
202 1.1.1.2 mrg (match_test "AVR_HAVE_JMP_CALL"))
203 1.1.1.2 mrg (const_int 1)
204 1.1.1.2 mrg
205 1.1.1.2 mrg (and (eq_attr "isa" "ijmp")
206 1.1.1.2 mrg (match_test "!AVR_HAVE_EIJMP_EICALL"))
207 1.1.1.2 mrg (const_int 1)
208 1.1.1.2 mrg
209 1.1.1.2 mrg (and (eq_attr "isa" "eijmp")
210 1.1.1.2 mrg (match_test "AVR_HAVE_EIJMP_EICALL"))
211 1.1.1.2 mrg (const_int 1)
212 1.1.1.2 mrg
213 1.1.1.2 mrg (and (eq_attr "isa" "lpm")
214 1.1.1.2 mrg (match_test "!AVR_HAVE_LPMX"))
215 1.1.1.2 mrg (const_int 1)
216 1.1.1.2 mrg
217 1.1.1.2 mrg (and (eq_attr "isa" "lpmx")
218 1.1.1.2 mrg (match_test "AVR_HAVE_LPMX"))
219 1.1.1.2 mrg (const_int 1)
220 1.1.1.2 mrg
221 1.1.1.2 mrg (and (eq_attr "isa" "elpm")
222 1.1.1.2 mrg (match_test "AVR_HAVE_ELPM && !AVR_HAVE_ELPMX"))
223 1.1.1.2 mrg (const_int 1)
224 1.1.1.2 mrg
225 1.1.1.2 mrg (and (eq_attr "isa" "elpmx")
226 1.1.1.2 mrg (match_test "AVR_HAVE_ELPMX"))
227 1.1.1.2 mrg (const_int 1)
228 1.1.1.2 mrg
229 1.1.1.2 mrg (and (eq_attr "isa" "xmega")
230 1.1.1.2 mrg (match_test "AVR_XMEGA"))
231 1.1.1.2 mrg (const_int 1)
232 1.1.1.2 mrg
233 1.1.1.6 mrg (and (eq_attr "isa" "tiny")
234 1.1.1.6 mrg (match_test "AVR_TINY"))
235 1.1.1.6 mrg (const_int 1)
236 1.1.1.6 mrg
237 1.1.1.2 mrg (and (eq_attr "isa" "no_xmega")
238 1.1.1.2 mrg (match_test "!AVR_XMEGA"))
239 1.1.1.2 mrg (const_int 1)
240 1.1.1.6 mrg
241 1.1.1.6 mrg (and (eq_attr "isa" "no_tiny")
242 1.1.1.6 mrg (match_test "!AVR_TINY"))
243 1.1.1.6 mrg (const_int 1)
244 1.1.1.6 mrg
245 1.1.1.2 mrg ] (const_int 0)))
246 1.1.1.2 mrg
247 1.1.1.2 mrg
248 1.1.1.2 mrg ;; Define mode iterators
249 1.1.1.2 mrg (define_mode_iterator QIHI [QI HI])
250 1.1.1.2 mrg (define_mode_iterator QIHI2 [QI HI])
251 1.1.1.2 mrg (define_mode_iterator QISI [QI HI PSI SI])
252 1.1.1.2 mrg (define_mode_iterator QIDI [QI HI PSI SI DI])
253 1.1.1.2 mrg (define_mode_iterator HISI [HI PSI SI])
254 1.1.1.2 mrg
255 1.1.1.2 mrg (define_mode_iterator ALL1 [QI QQ UQQ])
256 1.1.1.2 mrg (define_mode_iterator ALL2 [HI HQ UHQ HA UHA])
257 1.1.1.2 mrg (define_mode_iterator ALL4 [SI SQ USQ SA USA])
258 1.1.1.2 mrg
259 1.1.1.2 mrg ;; All supported move-modes
260 1.1.1.2 mrg (define_mode_iterator MOVMODE [QI QQ UQQ
261 1.1.1.2 mrg HI HQ UHQ HA UHA
262 1.1.1.2 mrg SI SQ USQ SA USA
263 1.1.1.2 mrg SF PSI])
264 1.1.1.2 mrg
265 1.1.1.2 mrg ;; Supported ordered modes that are 2, 3, 4 bytes wide
266 1.1.1.2 mrg (define_mode_iterator ORDERED234 [HI SI PSI
267 1.1.1.2 mrg HQ UHQ HA UHA
268 1.1.1.2 mrg SQ USQ SA USA])
269 1.1.1.2 mrg
270 1.1.1.9 mrg ;; Post-reload split of 3, 4 bytes wide moves.
271 1.1.1.9 mrg (define_mode_iterator SPLIT34 [SI SF PSI
272 1.1.1.9 mrg SQ USQ SA USA])
273 1.1.1.9 mrg
274 1.1.1.2 mrg ;; Define code iterators
275 1.1.1.2 mrg ;; Define two incarnations so that we can build the cross product.
276 1.1.1.2 mrg (define_code_iterator any_extend [sign_extend zero_extend])
277 1.1.1.2 mrg (define_code_iterator any_extend2 [sign_extend zero_extend])
278 1.1.1.9 mrg (define_code_iterator any_extract [sign_extract zero_extract])
279 1.1.1.9 mrg (define_code_iterator any_shiftrt [lshiftrt ashiftrt])
280 1.1.1.2 mrg
281 1.1.1.9 mrg (define_code_iterator bitop [xor ior and])
282 1.1.1.2 mrg (define_code_iterator xior [xor ior])
283 1.1.1.2 mrg (define_code_iterator eqne [eq ne])
284 1.1.1.2 mrg
285 1.1.1.2 mrg (define_code_iterator ss_addsub [ss_plus ss_minus])
286 1.1.1.2 mrg (define_code_iterator us_addsub [us_plus us_minus])
287 1.1.1.2 mrg (define_code_iterator ss_abs_neg [ss_abs ss_neg])
288 1.1.1.2 mrg
289 1.1.1.2 mrg ;; Define code attributes
290 1.1.1.2 mrg (define_code_attr extend_su
291 1.1.1.2 mrg [(sign_extend "s")
292 1.1.1.2 mrg (zero_extend "u")])
293 1.1.1.2 mrg
294 1.1.1.2 mrg (define_code_attr extend_u
295 1.1.1.2 mrg [(sign_extend "")
296 1.1.1.2 mrg (zero_extend "u")])
297 1.1.1.2 mrg
298 1.1.1.2 mrg (define_code_attr extend_s
299 1.1.1.2 mrg [(sign_extend "s")
300 1.1.1.2 mrg (zero_extend "")])
301 1.1.1.2 mrg
302 1.1.1.2 mrg ;; Constrain input operand of widening multiply, i.e. MUL resp. MULS.
303 1.1.1.2 mrg (define_code_attr mul_r_d
304 1.1.1.2 mrg [(zero_extend "r")
305 1.1.1.2 mrg (sign_extend "d")])
306 1.1.1.2 mrg
307 1.1.1.2 mrg (define_code_attr abelian
308 1.1.1.2 mrg [(ss_minus "") (us_minus "")
309 1.1.1.2 mrg (ss_plus "%") (us_plus "%")])
310 1.1.1.2 mrg
311 1.1.1.2 mrg ;; Map RTX code to its standard insn name
312 1.1.1.2 mrg (define_code_attr code_stdname
313 1.1.1.2 mrg [(ashift "ashl")
314 1.1.1.2 mrg (ashiftrt "ashr")
315 1.1.1.2 mrg (lshiftrt "lshr")
316 1.1.1.2 mrg (ior "ior")
317 1.1.1.2 mrg (xor "xor")
318 1.1.1.2 mrg (rotate "rotl")
319 1.1.1.2 mrg (ss_plus "ssadd") (ss_minus "sssub") (ss_neg "ssneg") (ss_abs "ssabs")
320 1.1.1.2 mrg (us_plus "usadd") (us_minus "ussub") (us_neg "usneg")
321 1.1.1.2 mrg ])
322 1.1 mrg
323 1.1 mrg ;;========================================================================
324 1.1 mrg ;; The following is used by nonlocal_goto and setjmp.
325 1.1 mrg ;; The receiver pattern will create no instructions since internally
326 1.1 mrg ;; virtual_stack_vars = hard_frame_pointer + 1 so the RTL become R28=R28
327 1.1 mrg ;; This avoids creating add/sub offsets in frame_pointer save/resore.
328 1.1 mrg ;; The 'null' receiver also avoids problems with optimisation
329 1.1 mrg ;; not recognising incoming jmp and removing code that resets frame_pointer.
330 1.1 mrg ;; The code derived from builtins.c.
331 1.1 mrg
332 1.1 mrg (define_expand "nonlocal_goto_receiver"
333 1.1.1.2 mrg [(set (reg:HI REG_Y)
334 1.1.1.2 mrg (unspec_volatile:HI [(const_int 0)] UNSPECV_GOTO_RECEIVER))]
335 1.1 mrg ""
336 1.1 mrg {
337 1.1.1.12 mrg rtx offset = gen_int_mode (targetm.starting_frame_offset (), Pmode);
338 1.1.1.2 mrg emit_move_insn (virtual_stack_vars_rtx,
339 1.1.1.12 mrg gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, offset));
340 1.1.1.2 mrg /* ; This might change the hard frame pointer in ways that aren't
341 1.1.1.2 mrg ; apparent to early optimization passes, so force a clobber. */
342 1.1 mrg emit_clobber (hard_frame_pointer_rtx);
343 1.1 mrg DONE;
344 1.1 mrg })
345 1.1.1.2 mrg
346 1.1 mrg
347 1.1.1.14 mrg ;; Defining nonlocal_goto_receiver means we must also define this
348 1.1 mrg ;; even though its function is identical to that in builtins.c
349 1.1 mrg
350 1.1 mrg (define_expand "nonlocal_goto"
351 1.1.1.2 mrg [(use (match_operand 0 "general_operand"))
352 1.1.1.2 mrg (use (match_operand 1 "general_operand"))
353 1.1.1.2 mrg (use (match_operand 2 "general_operand"))
354 1.1.1.2 mrg (use (match_operand 3 "general_operand"))]
355 1.1 mrg ""
356 1.1.1.2 mrg {
357 1.1.1.2 mrg rtx r_label = copy_to_reg (operands[1]);
358 1.1.1.2 mrg rtx r_fp = operands[3];
359 1.1.1.2 mrg rtx r_sp = operands[2];
360 1.1 mrg
361 1.1.1.2 mrg emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
362 1.1 mrg
363 1.1.1.2 mrg emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
364 1.1 mrg
365 1.1.1.2 mrg emit_move_insn (hard_frame_pointer_rtx, r_fp);
366 1.1.1.2 mrg emit_stack_restore (SAVE_NONLOCAL, r_sp);
367 1.1 mrg
368 1.1.1.2 mrg emit_use (hard_frame_pointer_rtx);
369 1.1.1.2 mrg emit_use (stack_pointer_rtx);
370 1.1 mrg
371 1.1.1.2 mrg emit_indirect_jump (r_label);
372 1.1 mrg
373 1.1.1.2 mrg DONE;
374 1.1.1.2 mrg })
375 1.1 mrg
376 1.1.1.2 mrg ;; "pushqi1"
377 1.1.1.2 mrg ;; "pushqq1" "pushuqq1"
378 1.1.1.2 mrg (define_insn "push<mode>1"
379 1.1.1.2 mrg [(set (mem:ALL1 (post_dec:HI (reg:HI REG_SP)))
380 1.1.1.2 mrg (match_operand:ALL1 0 "reg_or_0_operand" "r,Y00"))]
381 1.1 mrg ""
382 1.1 mrg "@
383 1.1 mrg push %0
384 1.1 mrg push __zero_reg__"
385 1.1 mrg [(set_attr "length" "1,1")])
386 1.1 mrg
387 1.1.1.5 mrg (define_insn "pushhi1_insn"
388 1.1.1.5 mrg [(set (mem:HI (post_dec:HI (reg:HI REG_SP)))
389 1.1.1.5 mrg (match_operand:HI 0 "register_operand" "r"))]
390 1.1.1.5 mrg ""
391 1.1.1.5 mrg "push %B0\;push %A0"
392 1.1.1.5 mrg [(set_attr "length" "2")])
393 1.1.1.5 mrg
394 1.1.1.2 mrg ;; All modes for a multi-byte push. We must include complex modes here too,
395 1.1.1.2 mrg ;; lest emit_single_push_insn "helpfully" create the auto-inc itself.
396 1.1.1.2 mrg (define_mode_iterator MPUSH
397 1.1.1.2 mrg [CQI
398 1.1.1.2 mrg HI CHI HA UHA HQ UHQ
399 1.1.1.2 mrg SI CSI SA USA SQ USQ
400 1.1.1.2 mrg DI CDI DA UDA DQ UDQ
401 1.1.1.2 mrg TA UTA
402 1.1.1.14 mrg SF DF SC DC
403 1.1.1.2 mrg PSI])
404 1.1 mrg
405 1.1.1.2 mrg (define_expand "push<mode>1"
406 1.1.1.2 mrg [(match_operand:MPUSH 0 "" "")]
407 1.1 mrg ""
408 1.1.1.2 mrg {
409 1.1.1.4 mrg if (MEM_P (operands[0])
410 1.1.1.4 mrg && !ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (operands[0])))
411 1.1.1.5 mrg {
412 1.1.1.5 mrg // Avoid (subreg (mem)) for non-generic address spaces. Because
413 1.1.1.5 mrg // of the poor addressing capabilities of these spaces it's better to
414 1.1.1.5 mrg // load them in one chunk. And it avoids PR61443.
415 1.1.1.5 mrg
416 1.1.1.5 mrg operands[0] = copy_to_mode_reg (<MODE>mode, operands[0]);
417 1.1.1.5 mrg }
418 1.1.1.5 mrg else if (REG_P (operands[0])
419 1.1.1.5 mrg && IN_RANGE (REGNO (operands[0]), FIRST_VIRTUAL_REGISTER,
420 1.1.1.5 mrg LAST_VIRTUAL_REGISTER))
421 1.1.1.5 mrg {
422 1.1.1.5 mrg // Byte-wise pushing of virtual regs might result in something like
423 1.1.1.5 mrg //
424 1.1.1.5 mrg // (set (mem:QI (post_dec:HI (reg:HI 32 SP)))
425 1.1.1.5 mrg // (subreg:QI (plus:HI (reg:HI 28)
426 1.1.1.5 mrg // (const_int 17)) 0))
427 1.1.1.5 mrg //
428 1.1.1.5 mrg // after elimination. This cannot be handled by reload, cf. PR64452.
429 1.1.1.5 mrg // Reload virtuals in one chunk. That way it's possible to reload
430 1.1.1.5 mrg // above situation and finally
431 1.1.1.5 mrg //
432 1.1.1.5 mrg // (set (reg:HI **)
433 1.1.1.5 mrg // (const_int 17))
434 1.1.1.5 mrg // (set (reg:HI **)
435 1.1.1.5 mrg // (plus:HI (reg:HI **)
436 1.1.1.5 mrg // (reg:HI 28)))
437 1.1.1.5 mrg // (set (mem:HI (post_dec:HI (reg:HI 32 SP))
438 1.1.1.5 mrg // (reg:HI **)))
439 1.1.1.5 mrg
440 1.1.1.5 mrg emit_insn (gen_pushhi1_insn (operands[0]));
441 1.1.1.5 mrg DONE;
442 1.1.1.5 mrg }
443 1.1.1.4 mrg
444 1.1.1.5 mrg for (int i = GET_MODE_SIZE (<MODE>mode) - 1; i >= 0; --i)
445 1.1.1.2 mrg {
446 1.1.1.2 mrg rtx part = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i);
447 1.1.1.2 mrg if (part != const0_rtx)
448 1.1.1.2 mrg part = force_reg (QImode, part);
449 1.1.1.2 mrg emit_insn (gen_pushqi1 (part));
450 1.1.1.2 mrg }
451 1.1.1.2 mrg DONE;
452 1.1.1.2 mrg })
453 1.1.1.2 mrg
454 1.1.1.2 mrg ;; Notice a special-case when adding N to SP where N results in a
455 1.1.1.2 mrg ;; zero REG_ARGS_SIZE. This is equivalent to a move from FP.
456 1.1.1.2 mrg (define_split
457 1.1.1.2 mrg [(set (reg:HI REG_SP)
458 1.1.1.2 mrg (match_operand:HI 0 "register_operand" ""))]
459 1.1.1.2 mrg "reload_completed
460 1.1.1.2 mrg && frame_pointer_needed
461 1.1.1.2 mrg && !cfun->calls_alloca
462 1.1.1.2 mrg && find_reg_note (insn, REG_ARGS_SIZE, const0_rtx)"
463 1.1.1.2 mrg [(set (reg:HI REG_SP)
464 1.1.1.2 mrg (reg:HI REG_Y))])
465 1.1.1.2 mrg
466 1.1.1.2 mrg ;;========================================================================
467 1.1.1.2 mrg ;; Move stuff around
468 1.1.1.2 mrg
469 1.1.1.2 mrg ;; "loadqi_libgcc"
470 1.1.1.2 mrg ;; "loadhi_libgcc"
471 1.1.1.2 mrg ;; "loadpsi_libgcc"
472 1.1.1.2 mrg ;; "loadsi_libgcc"
473 1.1.1.2 mrg ;; "loadsf_libgcc"
474 1.1.1.2 mrg (define_expand "load<mode>_libgcc"
475 1.1.1.2 mrg [(set (match_dup 3)
476 1.1.1.2 mrg (match_dup 2))
477 1.1.1.2 mrg (set (reg:MOVMODE 22)
478 1.1.1.2 mrg (match_operand:MOVMODE 1 "memory_operand" ""))
479 1.1.1.2 mrg (set (match_operand:MOVMODE 0 "register_operand" "")
480 1.1.1.2 mrg (reg:MOVMODE 22))]
481 1.1.1.2 mrg "avr_load_libgcc_p (operands[1])"
482 1.1.1.2 mrg {
483 1.1.1.2 mrg operands[3] = gen_rtx_REG (HImode, REG_Z);
484 1.1.1.2 mrg operands[2] = force_operand (XEXP (operands[1], 0), NULL_RTX);
485 1.1.1.2 mrg operands[1] = replace_equiv_address (operands[1], operands[3]);
486 1.1.1.2 mrg set_mem_addr_space (operands[1], ADDR_SPACE_FLASH);
487 1.1.1.2 mrg })
488 1.1.1.2 mrg
489 1.1.1.2 mrg ;; "load_qi_libgcc"
490 1.1.1.2 mrg ;; "load_hi_libgcc"
491 1.1.1.2 mrg ;; "load_psi_libgcc"
492 1.1.1.2 mrg ;; "load_si_libgcc"
493 1.1.1.2 mrg ;; "load_sf_libgcc"
494 1.1.1.2 mrg (define_insn "load_<mode>_libgcc"
495 1.1.1.2 mrg [(set (reg:MOVMODE 22)
496 1.1.1.2 mrg (match_operand:MOVMODE 0 "memory_operand" "m,m"))]
497 1.1.1.2 mrg "avr_load_libgcc_p (operands[0])
498 1.1.1.2 mrg && REG_P (XEXP (operands[0], 0))
499 1.1.1.2 mrg && REG_Z == REGNO (XEXP (operands[0], 0))"
500 1.1.1.2 mrg {
501 1.1.1.2 mrg operands[0] = GEN_INT (GET_MODE_SIZE (<MODE>mode));
502 1.1.1.2 mrg return "%~call __load_%0";
503 1.1.1.2 mrg }
504 1.1.1.2 mrg [(set_attr "length" "1,2")
505 1.1.1.2 mrg (set_attr "isa" "rjmp,jmp")
506 1.1.1.2 mrg (set_attr "cc" "clobber")])
507 1.1.1.2 mrg
508 1.1.1.2 mrg
509 1.1.1.2 mrg ;; "xload8qi_A"
510 1.1.1.2 mrg ;; "xload8qq_A" "xload8uqq_A"
511 1.1.1.2 mrg (define_insn_and_split "xload8<mode>_A"
512 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=r")
513 1.1.1.2 mrg (match_operand:ALL1 1 "memory_operand" "m"))
514 1.1.1.2 mrg (clobber (reg:HI REG_Z))]
515 1.1.1.2 mrg "can_create_pseudo_p()
516 1.1.1.2 mrg && !avr_xload_libgcc_p (<MODE>mode)
517 1.1.1.2 mrg && avr_mem_memx_p (operands[1])
518 1.1.1.2 mrg && REG_P (XEXP (operands[1], 0))"
519 1.1.1.2 mrg { gcc_unreachable(); }
520 1.1.1.2 mrg "&& 1"
521 1.1.1.2 mrg [(clobber (const_int 0))]
522 1.1.1.2 mrg {
523 1.1.1.2 mrg /* ; Split away the high part of the address. GCC's register allocator
524 1.1.1.2 mrg ; in not able to allocate segment registers and reload the resulting
525 1.1.1.2 mrg ; expressions. Notice that no address register can hold a PSImode. */
526 1.1.1.2 mrg
527 1.1.1.6 mrg rtx_insn *insn;
528 1.1.1.6 mrg rtx addr = XEXP (operands[1], 0);
529 1.1.1.2 mrg rtx hi8 = gen_reg_rtx (QImode);
530 1.1.1.2 mrg rtx reg_z = gen_rtx_REG (HImode, REG_Z);
531 1.1.1.2 mrg
532 1.1.1.2 mrg emit_move_insn (reg_z, simplify_gen_subreg (HImode, addr, PSImode, 0));
533 1.1.1.2 mrg emit_move_insn (hi8, simplify_gen_subreg (QImode, addr, PSImode, 2));
534 1.1.1.2 mrg
535 1.1.1.2 mrg insn = emit_insn (gen_xload<mode>_8 (operands[0], hi8));
536 1.1.1.2 mrg set_mem_addr_space (SET_SRC (single_set (insn)),
537 1.1.1.2 mrg MEM_ADDR_SPACE (operands[1]));
538 1.1.1.2 mrg DONE;
539 1.1.1.2 mrg })
540 1.1.1.2 mrg
541 1.1.1.2 mrg ;; "xloadqi_A" "xloadqq_A" "xloaduqq_A"
542 1.1.1.2 mrg ;; "xloadhi_A" "xloadhq_A" "xloaduhq_A" "xloadha_A" "xloaduha_A"
543 1.1.1.2 mrg ;; "xloadsi_A" "xloadsq_A" "xloadusq_A" "xloadsa_A" "xloadusa_A"
544 1.1.1.2 mrg ;; "xloadpsi_A"
545 1.1.1.2 mrg ;; "xloadsf_A"
546 1.1.1.2 mrg (define_insn_and_split "xload<mode>_A"
547 1.1.1.2 mrg [(set (match_operand:MOVMODE 0 "register_operand" "=r")
548 1.1.1.2 mrg (match_operand:MOVMODE 1 "memory_operand" "m"))
549 1.1.1.2 mrg (clobber (reg:MOVMODE 22))
550 1.1.1.2 mrg (clobber (reg:QI 21))
551 1.1.1.2 mrg (clobber (reg:HI REG_Z))]
552 1.1.1.2 mrg "can_create_pseudo_p()
553 1.1.1.2 mrg && avr_mem_memx_p (operands[1])
554 1.1.1.2 mrg && REG_P (XEXP (operands[1], 0))"
555 1.1.1.2 mrg { gcc_unreachable(); }
556 1.1.1.2 mrg "&& 1"
557 1.1.1.2 mrg [(clobber (const_int 0))]
558 1.1.1.2 mrg {
559 1.1.1.2 mrg rtx addr = XEXP (operands[1], 0);
560 1.1.1.2 mrg rtx reg_z = gen_rtx_REG (HImode, REG_Z);
561 1.1.1.2 mrg rtx addr_hi8 = simplify_gen_subreg (QImode, addr, PSImode, 2);
562 1.1.1.2 mrg addr_space_t as = MEM_ADDR_SPACE (operands[1]);
563 1.1.1.6 mrg rtx_insn *insn;
564 1.1.1.2 mrg
565 1.1.1.2 mrg /* Split the address to R21:Z */
566 1.1.1.2 mrg emit_move_insn (reg_z, simplify_gen_subreg (HImode, addr, PSImode, 0));
567 1.1.1.2 mrg emit_move_insn (gen_rtx_REG (QImode, 21), addr_hi8);
568 1.1.1.2 mrg
569 1.1.1.2 mrg /* Load with code from libgcc */
570 1.1.1.2 mrg insn = emit_insn (gen_xload_<mode>_libgcc ());
571 1.1.1.2 mrg set_mem_addr_space (SET_SRC (single_set (insn)), as);
572 1.1.1.2 mrg
573 1.1.1.2 mrg /* Move to destination */
574 1.1.1.2 mrg emit_move_insn (operands[0], gen_rtx_REG (<MODE>mode, 22));
575 1.1.1.2 mrg
576 1.1.1.2 mrg DONE;
577 1.1.1.2 mrg })
578 1.1.1.2 mrg
579 1.1.1.2 mrg ;; Move value from address space memx to a register
580 1.1.1.2 mrg ;; These insns must be prior to respective generic move insn.
581 1.1.1.2 mrg
582 1.1.1.2 mrg ;; "xloadqi_8"
583 1.1.1.2 mrg ;; "xloadqq_8" "xloaduqq_8"
584 1.1.1.2 mrg (define_insn "xload<mode>_8"
585 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=&r,r")
586 1.1.1.2 mrg (mem:ALL1 (lo_sum:PSI (match_operand:QI 1 "register_operand" "r,r")
587 1.1.1.2 mrg (reg:HI REG_Z))))]
588 1.1.1.2 mrg "!avr_xload_libgcc_p (<MODE>mode)"
589 1.1.1.2 mrg {
590 1.1.1.2 mrg return avr_out_xload (insn, operands, NULL);
591 1.1.1.2 mrg }
592 1.1.1.2 mrg [(set_attr "length" "4,4")
593 1.1.1.2 mrg (set_attr "adjust_len" "*,xload")
594 1.1.1.2 mrg (set_attr "isa" "lpmx,lpm")
595 1.1.1.2 mrg (set_attr "cc" "none")])
596 1.1.1.2 mrg
597 1.1.1.2 mrg ;; R21:Z : 24-bit source address
598 1.1.1.2 mrg ;; R22 : 1-4 byte output
599 1.1.1.2 mrg
600 1.1.1.2 mrg ;; "xload_qi_libgcc" "xload_qq_libgcc" "xload_uqq_libgcc"
601 1.1.1.2 mrg ;; "xload_hi_libgcc" "xload_hq_libgcc" "xload_uhq_libgcc" "xload_ha_libgcc" "xload_uha_libgcc"
602 1.1.1.2 mrg ;; "xload_si_libgcc" "xload_sq_libgcc" "xload_usq_libgcc" "xload_sa_libgcc" "xload_usa_libgcc"
603 1.1.1.2 mrg ;; "xload_sf_libgcc"
604 1.1.1.2 mrg ;; "xload_psi_libgcc"
605 1.1.1.2 mrg (define_insn "xload_<mode>_libgcc"
606 1.1.1.2 mrg [(set (reg:MOVMODE 22)
607 1.1.1.2 mrg (mem:MOVMODE (lo_sum:PSI (reg:QI 21)
608 1.1.1.2 mrg (reg:HI REG_Z))))
609 1.1.1.2 mrg (clobber (reg:QI 21))
610 1.1.1.2 mrg (clobber (reg:HI REG_Z))]
611 1.1.1.2 mrg "avr_xload_libgcc_p (<MODE>mode)"
612 1.1.1.2 mrg {
613 1.1.1.2 mrg rtx x_bytes = GEN_INT (GET_MODE_SIZE (<MODE>mode));
614 1.1.1.2 mrg
615 1.1.1.2 mrg output_asm_insn ("%~call __xload_%0", &x_bytes);
616 1.1.1.2 mrg return "";
617 1.1.1.2 mrg }
618 1.1.1.2 mrg [(set_attr "type" "xcall")
619 1.1.1.2 mrg (set_attr "cc" "clobber")])
620 1.1 mrg
621 1.1 mrg
622 1.1.1.2 mrg ;; General move expanders
623 1.1.1.2 mrg
624 1.1.1.2 mrg ;; "movqi" "movqq" "movuqq"
625 1.1.1.2 mrg ;; "movhi" "movhq" "movuhq" "movha" "movuha"
626 1.1.1.2 mrg ;; "movsi" "movsq" "movusq" "movsa" "movusa"
627 1.1.1.2 mrg ;; "movsf"
628 1.1.1.2 mrg ;; "movpsi"
629 1.1.1.2 mrg (define_expand "mov<mode>"
630 1.1.1.2 mrg [(set (match_operand:MOVMODE 0 "nonimmediate_operand" "")
631 1.1.1.2 mrg (match_operand:MOVMODE 1 "general_operand" ""))]
632 1.1 mrg ""
633 1.1.1.2 mrg {
634 1.1.1.2 mrg rtx dest = operands[0];
635 1.1.1.6 mrg rtx src = avr_eval_addr_attrib (operands[1]);
636 1.1.1.2 mrg
637 1.1.1.2 mrg if (avr_mem_flash_p (dest))
638 1.1.1.2 mrg DONE;
639 1.1.1.2 mrg
640 1.1.1.7 mrg if (QImode == <MODE>mode
641 1.1.1.7 mrg && SUBREG_P (src)
642 1.1.1.7 mrg && CONSTANT_ADDRESS_P (SUBREG_REG (src))
643 1.1.1.7 mrg && can_create_pseudo_p())
644 1.1.1.7 mrg {
645 1.1.1.7 mrg // store_bitfield may want to store a SYMBOL_REF or CONST in a
646 1.1.1.7 mrg // structure that's represented as PSImode. As the upper 16 bits
647 1.1.1.7 mrg // of PSImode cannot be expressed as an HImode subreg, the rhs is
648 1.1.1.7 mrg // decomposed into QImode (word_mode) subregs of SYMBOL_REF,
649 1.1.1.7 mrg // CONST or LABEL_REF; cf. PR71103.
650 1.1.1.7 mrg
651 1.1.1.7 mrg rtx const_addr = SUBREG_REG (src);
652 1.1.1.7 mrg operands[1] = src = copy_rtx (src);
653 1.1.1.7 mrg SUBREG_REG (src) = copy_to_mode_reg (GET_MODE (const_addr), const_addr);
654 1.1.1.7 mrg }
655 1.1.1.7 mrg
656 1.1.1.2 mrg /* One of the operands has to be in a register. */
657 1.1.1.2 mrg if (!register_operand (dest, <MODE>mode)
658 1.1.1.2 mrg && !reg_or_0_operand (src, <MODE>mode))
659 1.1.1.2 mrg {
660 1.1.1.2 mrg operands[1] = src = copy_to_mode_reg (<MODE>mode, src);
661 1.1.1.2 mrg }
662 1.1.1.2 mrg
663 1.1.1.2 mrg if (avr_mem_memx_p (src))
664 1.1.1.2 mrg {
665 1.1.1.2 mrg rtx addr = XEXP (src, 0);
666 1.1.1.2 mrg
667 1.1.1.2 mrg if (!REG_P (addr))
668 1.1.1.2 mrg src = replace_equiv_address (src, copy_to_mode_reg (PSImode, addr));
669 1.1.1.2 mrg
670 1.1.1.2 mrg if (!avr_xload_libgcc_p (<MODE>mode))
671 1.1.1.2 mrg /* ; No <mode> here because gen_xload8<mode>_A only iterates over ALL1.
672 1.1.1.2 mrg ; insn-emit does not depend on the mode, it's all about operands. */
673 1.1.1.2 mrg emit_insn (gen_xload8qi_A (dest, src));
674 1.1.1.2 mrg else
675 1.1.1.2 mrg emit_insn (gen_xload<mode>_A (dest, src));
676 1.1.1.2 mrg
677 1.1.1.2 mrg DONE;
678 1.1.1.2 mrg }
679 1.1.1.2 mrg
680 1.1.1.2 mrg if (avr_load_libgcc_p (src))
681 1.1.1.2 mrg {
682 1.1.1.2 mrg /* For the small devices, do loads per libgcc call. */
683 1.1.1.2 mrg emit_insn (gen_load<mode>_libgcc (dest, src));
684 1.1.1.2 mrg DONE;
685 1.1.1.2 mrg }
686 1.1.1.2 mrg })
687 1.1 mrg
688 1.1 mrg ;;========================================================================
689 1.1 mrg ;; move byte
690 1.1 mrg ;; The last alternative (any immediate constant to any register) is
691 1.1 mrg ;; very expensive. It should be optimized by peephole2 if a scratch
692 1.1 mrg ;; register is available, but then that register could just as well be
693 1.1 mrg ;; allocated for the variable we are loading. But, most of NO_LD_REGS
694 1.1 mrg ;; are call-saved registers, and most of LD_REGS are call-used registers,
695 1.1 mrg ;; so this may still be a win for registers live across function calls.
696 1.1 mrg
697 1.1.1.2 mrg ;; "movqi_insn"
698 1.1.1.2 mrg ;; "movqq_insn" "movuqq_insn"
699 1.1.1.2 mrg (define_insn "mov<mode>_insn"
700 1.1.1.2 mrg [(set (match_operand:ALL1 0 "nonimmediate_operand" "=r ,d ,Qm ,r ,q,r,*r")
701 1.1.1.2 mrg (match_operand:ALL1 1 "nox_general_operand" "r Y00,n Ynn,r Y00,Qm,r,q,i"))]
702 1.1.1.2 mrg "register_operand (operands[0], <MODE>mode)
703 1.1.1.6 mrg || reg_or_0_operand (operands[1], <MODE>mode)"
704 1.1.1.2 mrg {
705 1.1.1.2 mrg return output_movqi (insn, operands, NULL);
706 1.1.1.2 mrg }
707 1.1 mrg [(set_attr "length" "1,1,5,5,1,1,4")
708 1.1.1.2 mrg (set_attr "adjust_len" "mov8")
709 1.1.1.2 mrg (set_attr "cc" "ldi,none,clobber,clobber,none,none,clobber")])
710 1.1 mrg
711 1.1 mrg ;; This is used in peephole2 to optimize loading immediate constants
712 1.1 mrg ;; if a scratch register from LD_REGS happens to be available.
713 1.1 mrg
714 1.1.1.2 mrg ;; "*reload_inqi"
715 1.1.1.2 mrg ;; "*reload_inqq" "*reload_inuqq"
716 1.1.1.2 mrg (define_insn "*reload_in<mode>"
717 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=l")
718 1.1.1.2 mrg (match_operand:ALL1 1 "const_operand" "i"))
719 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
720 1.1 mrg "reload_completed"
721 1.1 mrg "ldi %2,lo8(%1)
722 1.1 mrg mov %0,%2"
723 1.1 mrg [(set_attr "length" "2")
724 1.1 mrg (set_attr "cc" "none")])
725 1.1 mrg
726 1.1 mrg (define_peephole2
727 1.1 mrg [(match_scratch:QI 2 "d")
728 1.1.1.2 mrg (set (match_operand:ALL1 0 "l_register_operand" "")
729 1.1.1.2 mrg (match_operand:ALL1 1 "const_operand" ""))]
730 1.1.1.2 mrg ; No need for a clobber reg for 0x0, 0x01 or 0xff
731 1.1.1.2 mrg "!satisfies_constraint_Y00 (operands[1])
732 1.1.1.2 mrg && !satisfies_constraint_Y01 (operands[1])
733 1.1.1.2 mrg && !satisfies_constraint_Ym1 (operands[1])"
734 1.1.1.2 mrg [(parallel [(set (match_dup 0)
735 1.1.1.2 mrg (match_dup 1))
736 1.1.1.2 mrg (clobber (match_dup 2))])])
737 1.1 mrg
738 1.1 mrg ;;============================================================================
739 1.1 mrg ;; move word (16 bit)
740 1.1 mrg
741 1.1.1.2 mrg ;; Move register $1 to the Stack Pointer register SP.
742 1.1.1.2 mrg ;; This insn is emit during function prologue/epilogue generation.
743 1.1.1.2 mrg ;; $2 = 0: We know that IRQs are off
744 1.1.1.2 mrg ;; $2 = 1: We know that IRQs are on
745 1.1.1.2 mrg ;; $2 = 2: SP has 8 bits only, IRQ state does not matter
746 1.1.1.2 mrg ;; $2 = -1: We don't know anything about IRQ on/off
747 1.1.1.2 mrg ;; Always write SP via unspec, see PR50063
748 1.1.1.2 mrg
749 1.1.1.2 mrg (define_insn "movhi_sp_r"
750 1.1.1.2 mrg [(set (match_operand:HI 0 "stack_register_operand" "=q,q,q,q,q")
751 1.1.1.2 mrg (unspec_volatile:HI [(match_operand:HI 1 "register_operand" "r,r,r,r,r")
752 1.1.1.2 mrg (match_operand:HI 2 "const_int_operand" "L,P,N,K,LPN")]
753 1.1.1.2 mrg UNSPECV_WRITE_SP))]
754 1.1 mrg ""
755 1.1.1.2 mrg "@
756 1.1.1.2 mrg out %B0,%B1\;out %A0,%A1
757 1.1.1.2 mrg cli\;out %B0,%B1\;sei\;out %A0,%A1
758 1.1.1.2 mrg in __tmp_reg__,__SREG__\;cli\;out %B0,%B1\;out __SREG__,__tmp_reg__\;out %A0,%A1
759 1.1.1.2 mrg out %A0,%A1
760 1.1.1.2 mrg out %A0,%A1\;out %B0,%B1"
761 1.1.1.2 mrg [(set_attr "length" "2,4,5,1,2")
762 1.1.1.2 mrg (set_attr "isa" "no_xmega,no_xmega,no_xmega,*,xmega")
763 1.1 mrg (set_attr "cc" "none")])
764 1.1 mrg
765 1.1 mrg (define_peephole2
766 1.1 mrg [(match_scratch:QI 2 "d")
767 1.1.1.2 mrg (set (match_operand:ALL2 0 "l_register_operand" "")
768 1.1.1.2 mrg (match_operand:ALL2 1 "const_or_immediate_operand" ""))]
769 1.1.1.2 mrg "operands[1] != CONST0_RTX (<MODE>mode)"
770 1.1.1.2 mrg [(parallel [(set (match_dup 0)
771 1.1.1.2 mrg (match_dup 1))
772 1.1.1.2 mrg (clobber (match_dup 2))])])
773 1.1 mrg
774 1.1 mrg ;; '*' because it is not used in rtl generation, only in above peephole
775 1.1.1.2 mrg ;; "*reload_inhi"
776 1.1.1.2 mrg ;; "*reload_inhq" "*reload_inuhq"
777 1.1.1.2 mrg ;; "*reload_inha" "*reload_inuha"
778 1.1.1.2 mrg (define_insn "*reload_in<mode>"
779 1.1.1.2 mrg [(set (match_operand:ALL2 0 "l_register_operand" "=l")
780 1.1.1.2 mrg (match_operand:ALL2 1 "immediate_operand" "i"))
781 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
782 1.1 mrg "reload_completed"
783 1.1.1.2 mrg {
784 1.1.1.2 mrg return output_reload_inhi (operands, operands[2], NULL);
785 1.1.1.2 mrg }
786 1.1 mrg [(set_attr "length" "4")
787 1.1.1.2 mrg (set_attr "adjust_len" "reload_in16")
788 1.1.1.2 mrg (set_attr "cc" "clobber")])
789 1.1 mrg
790 1.1.1.2 mrg ;; "*movhi"
791 1.1.1.2 mrg ;; "*movhq" "*movuhq"
792 1.1.1.2 mrg ;; "*movha" "*movuha"
793 1.1.1.2 mrg (define_insn "*mov<mode>"
794 1.1.1.2 mrg [(set (match_operand:ALL2 0 "nonimmediate_operand" "=r,r ,r,m ,d,*r,q,r")
795 1.1.1.2 mrg (match_operand:ALL2 1 "nox_general_operand" "r,Y00,m,r Y00,i,i ,r,q"))]
796 1.1.1.2 mrg "register_operand (operands[0], <MODE>mode)
797 1.1.1.2 mrg || reg_or_0_operand (operands[1], <MODE>mode)"
798 1.1.1.2 mrg {
799 1.1.1.2 mrg return output_movhi (insn, operands, NULL);
800 1.1.1.2 mrg }
801 1.1.1.2 mrg [(set_attr "length" "2,2,6,7,2,6,5,2")
802 1.1.1.2 mrg (set_attr "adjust_len" "mov16")
803 1.1.1.2 mrg (set_attr "cc" "none,none,clobber,clobber,none,clobber,none,none")])
804 1.1 mrg
805 1.1 mrg (define_peephole2 ; movw
806 1.1.1.2 mrg [(set (match_operand:ALL1 0 "even_register_operand" "")
807 1.1.1.2 mrg (match_operand:ALL1 1 "even_register_operand" ""))
808 1.1.1.2 mrg (set (match_operand:ALL1 2 "odd_register_operand" "")
809 1.1.1.2 mrg (match_operand:ALL1 3 "odd_register_operand" ""))]
810 1.1.1.2 mrg "AVR_HAVE_MOVW
811 1.1.1.2 mrg && REGNO (operands[0]) == REGNO (operands[2]) - 1
812 1.1.1.2 mrg && REGNO (operands[1]) == REGNO (operands[3]) - 1"
813 1.1.1.2 mrg [(set (match_dup 4)
814 1.1.1.2 mrg (match_dup 5))]
815 1.1 mrg {
816 1.1 mrg operands[4] = gen_rtx_REG (HImode, REGNO (operands[0]));
817 1.1 mrg operands[5] = gen_rtx_REG (HImode, REGNO (operands[1]));
818 1.1 mrg })
819 1.1 mrg
820 1.1 mrg (define_peephole2 ; movw_r
821 1.1.1.2 mrg [(set (match_operand:ALL1 0 "odd_register_operand" "")
822 1.1.1.2 mrg (match_operand:ALL1 1 "odd_register_operand" ""))
823 1.1.1.2 mrg (set (match_operand:ALL1 2 "even_register_operand" "")
824 1.1.1.2 mrg (match_operand:ALL1 3 "even_register_operand" ""))]
825 1.1.1.2 mrg "AVR_HAVE_MOVW
826 1.1.1.2 mrg && REGNO (operands[2]) == REGNO (operands[0]) - 1
827 1.1.1.2 mrg && REGNO (operands[3]) == REGNO (operands[1]) - 1"
828 1.1.1.2 mrg [(set (match_dup 4)
829 1.1.1.2 mrg (match_dup 5))]
830 1.1 mrg {
831 1.1 mrg operands[4] = gen_rtx_REG (HImode, REGNO (operands[2]));
832 1.1 mrg operands[5] = gen_rtx_REG (HImode, REGNO (operands[3]));
833 1.1 mrg })
834 1.1 mrg
835 1.1.1.2 mrg ;; For LPM loads from AS1 we split
836 1.1.1.2 mrg ;; R = *Z
837 1.1.1.2 mrg ;; to
838 1.1.1.2 mrg ;; R = *Z++
839 1.1.1.2 mrg ;; Z = Z - sizeof (R)
840 1.1.1.2 mrg ;;
841 1.1.1.2 mrg ;; so that the second instruction can be optimized out.
842 1.1.1.2 mrg
843 1.1.1.2 mrg (define_split ; "split-lpmx"
844 1.1.1.2 mrg [(set (match_operand:HISI 0 "register_operand" "")
845 1.1.1.2 mrg (match_operand:HISI 1 "memory_operand" ""))]
846 1.1.1.2 mrg "reload_completed
847 1.1.1.2 mrg && AVR_HAVE_LPMX"
848 1.1.1.2 mrg [(set (match_dup 0)
849 1.1.1.2 mrg (match_dup 2))
850 1.1.1.2 mrg (set (match_dup 3)
851 1.1.1.2 mrg (plus:HI (match_dup 3)
852 1.1.1.2 mrg (match_dup 4)))]
853 1.1.1.2 mrg {
854 1.1.1.2 mrg rtx addr = XEXP (operands[1], 0);
855 1.1.1.2 mrg
856 1.1.1.2 mrg if (!avr_mem_flash_p (operands[1])
857 1.1.1.2 mrg || !REG_P (addr)
858 1.1.1.2 mrg || reg_overlap_mentioned_p (addr, operands[0]))
859 1.1.1.2 mrg {
860 1.1.1.2 mrg FAIL;
861 1.1.1.2 mrg }
862 1.1.1.2 mrg
863 1.1.1.2 mrg operands[2] = replace_equiv_address (operands[1],
864 1.1.1.2 mrg gen_rtx_POST_INC (Pmode, addr));
865 1.1.1.2 mrg operands[3] = addr;
866 1.1.1.2 mrg operands[4] = gen_int_mode (-GET_MODE_SIZE (<MODE>mode), HImode);
867 1.1.1.2 mrg })
868 1.1.1.2 mrg
869 1.1 mrg ;;==========================================================================
870 1.1.1.2 mrg ;; xpointer move (24 bit)
871 1.1.1.2 mrg
872 1.1.1.2 mrg (define_peephole2 ; *reload_inpsi
873 1.1.1.2 mrg [(match_scratch:QI 2 "d")
874 1.1.1.2 mrg (set (match_operand:PSI 0 "l_register_operand" "")
875 1.1.1.2 mrg (match_operand:PSI 1 "immediate_operand" ""))
876 1.1.1.2 mrg (match_dup 2)]
877 1.1.1.2 mrg "operands[1] != const0_rtx
878 1.1.1.2 mrg && operands[1] != constm1_rtx"
879 1.1.1.2 mrg [(parallel [(set (match_dup 0)
880 1.1.1.2 mrg (match_dup 1))
881 1.1.1.2 mrg (clobber (match_dup 2))])])
882 1.1 mrg
883 1.1.1.2 mrg ;; '*' because it is not used in rtl generation.
884 1.1.1.2 mrg (define_insn "*reload_inpsi"
885 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
886 1.1.1.2 mrg (match_operand:PSI 1 "immediate_operand" "i"))
887 1.1.1.2 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
888 1.1.1.2 mrg "reload_completed"
889 1.1.1.2 mrg {
890 1.1.1.2 mrg return avr_out_reload_inpsi (operands, operands[2], NULL);
891 1.1.1.2 mrg }
892 1.1.1.2 mrg [(set_attr "length" "6")
893 1.1.1.2 mrg (set_attr "adjust_len" "reload_in24")
894 1.1.1.2 mrg (set_attr "cc" "clobber")])
895 1.1 mrg
896 1.1.1.2 mrg (define_insn "*movpsi"
897 1.1.1.2 mrg [(set (match_operand:PSI 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r")
898 1.1.1.2 mrg (match_operand:PSI 1 "nox_general_operand" "r,L,Qm,rL,i ,i"))]
899 1.1.1.2 mrg "register_operand (operands[0], PSImode)
900 1.1.1.2 mrg || register_operand (operands[1], PSImode)
901 1.1.1.2 mrg || const0_rtx == operands[1]"
902 1.1.1.2 mrg {
903 1.1.1.2 mrg return avr_out_movpsi (insn, operands, NULL);
904 1.1.1.2 mrg }
905 1.1.1.2 mrg [(set_attr "length" "3,3,8,9,4,10")
906 1.1.1.2 mrg (set_attr "adjust_len" "mov24")
907 1.1.1.2 mrg (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
908 1.1 mrg
909 1.1.1.2 mrg ;;==========================================================================
910 1.1.1.2 mrg ;; move double word (32 bit)
911 1.1 mrg
912 1.1.1.2 mrg (define_peephole2 ; *reload_insi
913 1.1 mrg [(match_scratch:QI 2 "d")
914 1.1.1.2 mrg (set (match_operand:ALL4 0 "l_register_operand" "")
915 1.1.1.2 mrg (match_operand:ALL4 1 "immediate_operand" ""))
916 1.1 mrg (match_dup 2)]
917 1.1.1.2 mrg "operands[1] != CONST0_RTX (<MODE>mode)"
918 1.1.1.2 mrg [(parallel [(set (match_dup 0)
919 1.1.1.2 mrg (match_dup 1))
920 1.1.1.2 mrg (clobber (match_dup 2))])])
921 1.1 mrg
922 1.1 mrg ;; '*' because it is not used in rtl generation.
923 1.1.1.2 mrg ;; "*reload_insi"
924 1.1.1.2 mrg ;; "*reload_insq" "*reload_inusq"
925 1.1.1.2 mrg ;; "*reload_insa" "*reload_inusa"
926 1.1 mrg (define_insn "*reload_insi"
927 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r")
928 1.1.1.2 mrg (match_operand:ALL4 1 "immediate_operand" "n Ynn"))
929 1.1 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
930 1.1 mrg "reload_completed"
931 1.1.1.2 mrg {
932 1.1.1.2 mrg return output_reload_insisf (operands, operands[2], NULL);
933 1.1.1.2 mrg }
934 1.1 mrg [(set_attr "length" "8")
935 1.1.1.2 mrg (set_attr "adjust_len" "reload_in32")
936 1.1.1.2 mrg (set_attr "cc" "clobber")])
937 1.1 mrg
938 1.1 mrg
939 1.1.1.2 mrg ;; "*movsi"
940 1.1.1.2 mrg ;; "*movsq" "*movusq"
941 1.1.1.2 mrg ;; "*movsa" "*movusa"
942 1.1.1.2 mrg (define_insn "*mov<mode>"
943 1.1.1.2 mrg [(set (match_operand:ALL4 0 "nonimmediate_operand" "=r,r ,r ,Qm ,!d,r")
944 1.1.1.2 mrg (match_operand:ALL4 1 "nox_general_operand" "r,Y00,Qm,r Y00,i ,i"))]
945 1.1.1.2 mrg "register_operand (operands[0], <MODE>mode)
946 1.1.1.2 mrg || reg_or_0_operand (operands[1], <MODE>mode)"
947 1.1.1.2 mrg {
948 1.1.1.2 mrg return output_movsisf (insn, operands, NULL);
949 1.1.1.2 mrg }
950 1.1 mrg [(set_attr "length" "4,4,8,9,4,10")
951 1.1.1.2 mrg (set_attr "adjust_len" "mov32")
952 1.1.1.2 mrg (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
953 1.1 mrg
954 1.1 mrg ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
955 1.1 mrg ;; move floating point numbers (32 bit)
956 1.1 mrg
957 1.1 mrg (define_insn "*movsf"
958 1.1.1.2 mrg [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r")
959 1.1.1.2 mrg (match_operand:SF 1 "nox_general_operand" "r,G,Qm,rG,F ,F"))]
960 1.1 mrg "register_operand (operands[0], SFmode)
961 1.1.1.2 mrg || reg_or_0_operand (operands[1], SFmode)"
962 1.1.1.2 mrg {
963 1.1.1.2 mrg return output_movsisf (insn, operands, NULL);
964 1.1.1.2 mrg }
965 1.1 mrg [(set_attr "length" "4,4,8,9,4,10")
966 1.1.1.2 mrg (set_attr "adjust_len" "mov32")
967 1.1.1.2 mrg (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
968 1.1.1.2 mrg
969 1.1.1.2 mrg (define_peephole2 ; *reload_insf
970 1.1.1.2 mrg [(match_scratch:QI 2 "d")
971 1.1.1.2 mrg (set (match_operand:SF 0 "l_register_operand" "")
972 1.1.1.2 mrg (match_operand:SF 1 "const_double_operand" ""))
973 1.1.1.2 mrg (match_dup 2)]
974 1.1.1.2 mrg "operands[1] != CONST0_RTX (SFmode)"
975 1.1.1.2 mrg [(parallel [(set (match_dup 0)
976 1.1.1.2 mrg (match_dup 1))
977 1.1.1.2 mrg (clobber (match_dup 2))])])
978 1.1.1.2 mrg
979 1.1.1.2 mrg ;; '*' because it is not used in rtl generation.
980 1.1.1.2 mrg (define_insn "*reload_insf"
981 1.1.1.2 mrg [(set (match_operand:SF 0 "register_operand" "=r")
982 1.1.1.2 mrg (match_operand:SF 1 "const_double_operand" "F"))
983 1.1.1.2 mrg (clobber (match_operand:QI 2 "register_operand" "=&d"))]
984 1.1.1.2 mrg "reload_completed"
985 1.1.1.2 mrg {
986 1.1.1.2 mrg return output_reload_insisf (operands, operands[2], NULL);
987 1.1.1.2 mrg }
988 1.1.1.2 mrg [(set_attr "length" "8")
989 1.1.1.2 mrg (set_attr "adjust_len" "reload_in32")
990 1.1.1.2 mrg (set_attr "cc" "clobber")])
991 1.1 mrg
992 1.1 mrg ;;=========================================================================
993 1.1 mrg ;; move string (like memcpy)
994 1.1 mrg
995 1.1.1.14 mrg (define_expand "cpymemhi"
996 1.1 mrg [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
997 1.1.1.2 mrg (match_operand:BLK 1 "memory_operand" ""))
998 1.1.1.2 mrg (use (match_operand:HI 2 "const_int_operand" ""))
999 1.1.1.2 mrg (use (match_operand:HI 3 "const_int_operand" ""))])]
1000 1.1.1.2 mrg ""
1001 1.1.1.2 mrg {
1002 1.1.1.14 mrg if (avr_emit_cpymemhi (operands))
1003 1.1.1.2 mrg DONE;
1004 1.1 mrg
1005 1.1 mrg FAIL;
1006 1.1.1.2 mrg })
1007 1.1 mrg
1008 1.1.1.14 mrg (define_mode_attr CPYMEM_r_d [(QI "r")
1009 1.1.1.2 mrg (HI "wd")])
1010 1.1.1.2 mrg
1011 1.1.1.2 mrg ;; $0 : Address Space
1012 1.1.1.2 mrg ;; $1, $2 : Loop register
1013 1.1.1.2 mrg ;; R30 : source address
1014 1.1.1.2 mrg ;; R26 : destination address
1015 1.1.1.2 mrg
1016 1.1.1.14 mrg ;; "cpymem_qi"
1017 1.1.1.14 mrg ;; "cpymem_hi"
1018 1.1.1.14 mrg (define_insn "cpymem_<mode>"
1019 1.1.1.2 mrg [(set (mem:BLK (reg:HI REG_X))
1020 1.1.1.2 mrg (mem:BLK (reg:HI REG_Z)))
1021 1.1.1.2 mrg (unspec [(match_operand:QI 0 "const_int_operand" "n")]
1022 1.1.1.14 mrg UNSPEC_CPYMEM)
1023 1.1.1.14 mrg (use (match_operand:QIHI 1 "register_operand" "<CPYMEM_r_d>"))
1024 1.1.1.2 mrg (clobber (reg:HI REG_X))
1025 1.1.1.2 mrg (clobber (reg:HI REG_Z))
1026 1.1.1.2 mrg (clobber (reg:QI LPM_REGNO))
1027 1.1.1.2 mrg (clobber (match_operand:QIHI 2 "register_operand" "=1"))]
1028 1.1.1.2 mrg ""
1029 1.1.1.2 mrg {
1030 1.1.1.14 mrg return avr_out_cpymem (insn, operands, NULL);
1031 1.1.1.2 mrg }
1032 1.1.1.14 mrg [(set_attr "adjust_len" "cpymem")
1033 1.1.1.2 mrg (set_attr "cc" "clobber")])
1034 1.1 mrg
1035 1.1 mrg
1036 1.1.1.2 mrg ;; $0 : Address Space
1037 1.1.1.2 mrg ;; $1 : RAMPZ RAM address
1038 1.1.1.2 mrg ;; R24 : #bytes and loop register
1039 1.1.1.2 mrg ;; R23:Z : 24-bit source address
1040 1.1.1.2 mrg ;; R26 : 16-bit destination address
1041 1.1.1.2 mrg
1042 1.1.1.14 mrg ;; "cpymemx_qi"
1043 1.1.1.14 mrg ;; "cpymemx_hi"
1044 1.1.1.14 mrg (define_insn "cpymemx_<mode>"
1045 1.1.1.2 mrg [(set (mem:BLK (reg:HI REG_X))
1046 1.1.1.2 mrg (mem:BLK (lo_sum:PSI (reg:QI 23)
1047 1.1.1.2 mrg (reg:HI REG_Z))))
1048 1.1.1.2 mrg (unspec [(match_operand:QI 0 "const_int_operand" "n")]
1049 1.1.1.14 mrg UNSPEC_CPYMEM)
1050 1.1.1.2 mrg (use (reg:QIHI 24))
1051 1.1.1.2 mrg (clobber (reg:HI REG_X))
1052 1.1.1.2 mrg (clobber (reg:HI REG_Z))
1053 1.1.1.2 mrg (clobber (reg:QI LPM_REGNO))
1054 1.1.1.2 mrg (clobber (reg:HI 24))
1055 1.1.1.2 mrg (clobber (reg:QI 23))
1056 1.1.1.2 mrg (clobber (mem:QI (match_operand:QI 1 "io_address_operand" "n")))]
1057 1.1.1.2 mrg ""
1058 1.1.1.2 mrg "%~call __movmemx_<mode>"
1059 1.1.1.2 mrg [(set_attr "type" "xcall")
1060 1.1.1.2 mrg (set_attr "cc" "clobber")])
1061 1.1.1.2 mrg
1062 1.1 mrg
1063 1.1.1.2 mrg ;; =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2
1064 1.1 mrg ;; memset (%0, %2, %1)
1065 1.1 mrg
1066 1.1 mrg (define_expand "setmemhi"
1067 1.1 mrg [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
1068 1.1.1.2 mrg (match_operand 2 "const_int_operand" ""))
1069 1.1.1.2 mrg (use (match_operand:HI 1 "const_int_operand" ""))
1070 1.1.1.2 mrg (use (match_operand:HI 3 "const_int_operand" ""))
1071 1.1.1.9 mrg (clobber (match_scratch:HI 5 ""))
1072 1.1.1.9 mrg (clobber (match_dup 4))])]
1073 1.1.1.2 mrg ""
1074 1.1.1.2 mrg {
1075 1.1.1.2 mrg rtx addr0;
1076 1.1.1.6 mrg machine_mode mode;
1077 1.1 mrg
1078 1.1.1.2 mrg /* If value to set is not zero, use the library routine. */
1079 1.1.1.2 mrg if (operands[2] != const0_rtx)
1080 1.1.1.2 mrg FAIL;
1081 1.1.1.2 mrg
1082 1.1.1.2 mrg if (!CONST_INT_P (operands[1]))
1083 1.1.1.2 mrg FAIL;
1084 1.1.1.2 mrg
1085 1.1.1.2 mrg mode = u8_operand (operands[1], VOIDmode) ? QImode : HImode;
1086 1.1.1.9 mrg operands[4] = gen_rtx_SCRATCH (mode);
1087 1.1.1.2 mrg operands[1] = copy_to_mode_reg (mode,
1088 1.1.1.2 mrg gen_int_mode (INTVAL (operands[1]), mode));
1089 1.1.1.2 mrg addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
1090 1.1.1.2 mrg operands[0] = gen_rtx_MEM (BLKmode, addr0);
1091 1.1.1.2 mrg })
1092 1.1 mrg
1093 1.1 mrg
1094 1.1 mrg (define_insn "*clrmemqi"
1095 1.1 mrg [(set (mem:BLK (match_operand:HI 0 "register_operand" "e"))
1096 1.1.1.2 mrg (const_int 0))
1097 1.1 mrg (use (match_operand:QI 1 "register_operand" "r"))
1098 1.1 mrg (use (match_operand:QI 2 "const_int_operand" "n"))
1099 1.1 mrg (clobber (match_scratch:HI 3 "=0"))
1100 1.1 mrg (clobber (match_scratch:QI 4 "=&1"))]
1101 1.1 mrg ""
1102 1.1.1.2 mrg "0:\;st %a0+,__zero_reg__\;dec %1\;brne 0b"
1103 1.1 mrg [(set_attr "length" "3")
1104 1.1 mrg (set_attr "cc" "clobber")])
1105 1.1 mrg
1106 1.1.1.2 mrg
1107 1.1 mrg (define_insn "*clrmemhi"
1108 1.1 mrg [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e"))
1109 1.1.1.2 mrg (const_int 0))
1110 1.1 mrg (use (match_operand:HI 1 "register_operand" "!w,d"))
1111 1.1 mrg (use (match_operand:HI 2 "const_int_operand" "n,n"))
1112 1.1 mrg (clobber (match_scratch:HI 3 "=0,0"))
1113 1.1 mrg (clobber (match_scratch:HI 4 "=&1,&1"))]
1114 1.1 mrg ""
1115 1.1.1.2 mrg "@
1116 1.1.1.2 mrg 0:\;st %a0+,__zero_reg__\;sbiw %A1,1\;brne 0b
1117 1.1.1.2 mrg 0:\;st %a0+,__zero_reg__\;subi %A1,1\;sbci %B1,0\;brne 0b"
1118 1.1 mrg [(set_attr "length" "3,4")
1119 1.1 mrg (set_attr "cc" "clobber,clobber")])
1120 1.1 mrg
1121 1.1 mrg (define_expand "strlenhi"
1122 1.1.1.2 mrg [(set (match_dup 4)
1123 1.1.1.2 mrg (unspec:HI [(match_operand:BLK 1 "memory_operand" "")
1124 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")
1125 1.1.1.2 mrg (match_operand:HI 3 "immediate_operand" "")]
1126 1.1.1.2 mrg UNSPEC_STRLEN))
1127 1.1.1.2 mrg (set (match_dup 4)
1128 1.1.1.2 mrg (plus:HI (match_dup 4)
1129 1.1.1.2 mrg (const_int -1)))
1130 1.1.1.2 mrg (parallel [(set (match_operand:HI 0 "register_operand" "")
1131 1.1.1.2 mrg (minus:HI (match_dup 4)
1132 1.1.1.2 mrg (match_dup 5)))
1133 1.1.1.2 mrg (clobber (scratch:QI))])]
1134 1.1.1.2 mrg ""
1135 1.1.1.2 mrg {
1136 1.1.1.2 mrg rtx addr;
1137 1.1.1.2 mrg if (operands[2] != const0_rtx)
1138 1.1.1.2 mrg FAIL;
1139 1.1.1.2 mrg addr = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
1140 1.1.1.2 mrg operands[1] = gen_rtx_MEM (BLKmode, addr);
1141 1.1.1.2 mrg operands[5] = addr;
1142 1.1.1.2 mrg operands[4] = gen_reg_rtx (HImode);
1143 1.1.1.2 mrg })
1144 1.1 mrg
1145 1.1 mrg (define_insn "*strlenhi"
1146 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=e")
1147 1.1.1.2 mrg (unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand" "0"))
1148 1.1.1.2 mrg (const_int 0)
1149 1.1.1.2 mrg (match_operand:HI 2 "immediate_operand" "i")]
1150 1.1.1.2 mrg UNSPEC_STRLEN))]
1151 1.1.1.2 mrg ""
1152 1.1.1.2 mrg "0:\;ld __tmp_reg__,%a0+\;tst __tmp_reg__\;brne 0b"
1153 1.1 mrg [(set_attr "length" "3")
1154 1.1 mrg (set_attr "cc" "clobber")])
1155 1.1 mrg
1156 1.1 mrg ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1157 1.1 mrg ; add bytes
1158 1.1 mrg
1159 1.1.1.2 mrg ;; "addqi3"
1160 1.1.1.2 mrg ;; "addqq3" "adduqq3"
1161 1.1.1.2 mrg (define_insn "add<mode>3"
1162 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=r,d ,r ,r ,r ,r")
1163 1.1.1.2 mrg (plus:ALL1 (match_operand:ALL1 1 "register_operand" "%0,0 ,0 ,0 ,0 ,0")
1164 1.1.1.2 mrg (match_operand:ALL1 2 "nonmemory_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))]
1165 1.1 mrg ""
1166 1.1 mrg "@
1167 1.1 mrg add %0,%2
1168 1.1 mrg subi %0,lo8(-(%2))
1169 1.1 mrg inc %0
1170 1.1.1.2 mrg dec %0
1171 1.1.1.2 mrg inc %0\;inc %0
1172 1.1.1.2 mrg dec %0\;dec %0"
1173 1.1.1.2 mrg [(set_attr "length" "1,1,1,1,2,2")
1174 1.1.1.3 skrll (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
1175 1.1.1.2 mrg
1176 1.1.1.2 mrg ;; "addhi3"
1177 1.1.1.2 mrg ;; "addhq3" "adduhq3"
1178 1.1.1.2 mrg ;; "addha3" "adduha3"
1179 1.1.1.2 mrg (define_expand "add<mode>3"
1180 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "")
1181 1.1.1.2 mrg (plus:ALL2 (match_operand:ALL2 1 "register_operand" "")
1182 1.1.1.2 mrg (match_operand:ALL2 2 "nonmemory_or_const_operand" "")))]
1183 1.1 mrg ""
1184 1.1.1.2 mrg {
1185 1.1.1.2 mrg if (CONST_INT_P (operands[2]))
1186 1.1.1.2 mrg {
1187 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), HImode);
1188 1.1.1.2 mrg
1189 1.1.1.2 mrg if (can_create_pseudo_p()
1190 1.1.1.2 mrg && !stack_register_operand (operands[0], HImode)
1191 1.1.1.2 mrg && !stack_register_operand (operands[1], HImode)
1192 1.1.1.2 mrg && !d_register_operand (operands[0], HImode)
1193 1.1.1.2 mrg && !d_register_operand (operands[1], HImode))
1194 1.1.1.2 mrg {
1195 1.1.1.2 mrg emit_insn (gen_addhi3_clobber (operands[0], operands[1], operands[2]));
1196 1.1.1.2 mrg DONE;
1197 1.1.1.2 mrg }
1198 1.1.1.2 mrg }
1199 1.1.1.2 mrg
1200 1.1.1.2 mrg if (CONST_FIXED_P (operands[2]))
1201 1.1.1.2 mrg {
1202 1.1.1.2 mrg emit_insn (gen_add<mode>3_clobber (operands[0], operands[1], operands[2]));
1203 1.1.1.2 mrg DONE;
1204 1.1.1.2 mrg }
1205 1.1.1.2 mrg })
1206 1.1 mrg
1207 1.1 mrg
1208 1.1 mrg (define_insn "*addhi3_zero_extend"
1209 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=r,*?r")
1210 1.1.1.9 mrg (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r ,0"))
1211 1.1.1.9 mrg (match_operand:HI 2 "register_operand" "0 ,r")))]
1212 1.1 mrg ""
1213 1.1.1.9 mrg "@
1214 1.1.1.9 mrg add %A0,%1\;adc %B0,__zero_reg__
1215 1.1.1.9 mrg add %A0,%A2\;mov %B0,%B2\;adc %B0,__zero_reg__"
1216 1.1.1.9 mrg [(set_attr "length" "2,3")
1217 1.1 mrg (set_attr "cc" "set_n")])
1218 1.1 mrg
1219 1.1 mrg (define_insn "*addhi3_zero_extend1"
1220 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1221 1.1.1.2 mrg (plus:HI (match_operand:HI 1 "register_operand" "0")
1222 1.1.1.2 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1223 1.1 mrg ""
1224 1.1.1.2 mrg "add %A0,%2\;adc %B0,__zero_reg__"
1225 1.1 mrg [(set_attr "length" "2")
1226 1.1 mrg (set_attr "cc" "set_n")])
1227 1.1 mrg
1228 1.1.1.2 mrg (define_insn "*addhi3.sign_extend1"
1229 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1230 1.1.1.2 mrg (plus:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "r"))
1231 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "0")))]
1232 1.1.1.2 mrg ""
1233 1.1.1.2 mrg {
1234 1.1.1.2 mrg return reg_overlap_mentioned_p (operands[0], operands[1])
1235 1.1.1.2 mrg ? "mov __tmp_reg__,%1\;add %A0,%1\;adc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;dec %B0"
1236 1.1.1.2 mrg : "add %A0,%1\;adc %B0,__zero_reg__\;sbrc %1,7\;dec %B0";
1237 1.1.1.2 mrg }
1238 1.1.1.2 mrg [(set_attr "length" "5")
1239 1.1.1.2 mrg (set_attr "cc" "clobber")])
1240 1.1 mrg
1241 1.1.1.9 mrg (define_insn "*addhi3_zero_extend.const"
1242 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=d")
1243 1.1.1.9 mrg (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0"))
1244 1.1.1.9 mrg (match_operand:HI 2 "const_m255_to_m1_operand" "Cn8")))]
1245 1.1.1.9 mrg ""
1246 1.1.1.9 mrg "subi %A0,%n2\;sbc %B0,%B0"
1247 1.1.1.9 mrg [(set_attr "length" "2")
1248 1.1.1.9 mrg (set_attr "cc" "set_czn")])
1249 1.1.1.9 mrg
1250 1.1.1.9 mrg (define_insn "*usum_widenqihi3"
1251 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1252 1.1.1.9 mrg (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0"))
1253 1.1.1.9 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1254 1.1.1.9 mrg ""
1255 1.1.1.9 mrg "add %A0,%2\;clr %B0\;rol %B0"
1256 1.1.1.9 mrg [(set_attr "length" "3")
1257 1.1.1.9 mrg (set_attr "cc" "clobber")])
1258 1.1.1.9 mrg
1259 1.1.1.9 mrg (define_insn "*udiff_widenqihi3"
1260 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1261 1.1.1.9 mrg (minus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0"))
1262 1.1.1.9 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1263 1.1.1.9 mrg ""
1264 1.1.1.9 mrg "sub %A0,%2\;sbc %B0,%B0"
1265 1.1.1.9 mrg [(set_attr "length" "2")
1266 1.1.1.9 mrg (set_attr "cc" "set_czn")])
1267 1.1.1.9 mrg
1268 1.1.1.2 mrg (define_insn "*addhi3_sp"
1269 1.1.1.2 mrg [(set (match_operand:HI 1 "stack_register_operand" "=q")
1270 1.1.1.2 mrg (plus:HI (match_operand:HI 2 "stack_register_operand" "q")
1271 1.1.1.2 mrg (match_operand:HI 0 "avr_sp_immediate_operand" "Csp")))]
1272 1.1.1.2 mrg ""
1273 1.1.1.2 mrg {
1274 1.1.1.2 mrg return avr_out_addto_sp (operands, NULL);
1275 1.1.1.2 mrg }
1276 1.1.1.2 mrg [(set_attr "length" "6")
1277 1.1.1.2 mrg (set_attr "adjust_len" "addto_sp")])
1278 1.1.1.2 mrg
1279 1.1.1.2 mrg ;; "*addhi3"
1280 1.1.1.2 mrg ;; "*addhq3" "*adduhq3"
1281 1.1.1.2 mrg ;; "*addha3" "*adduha3"
1282 1.1.1.2 mrg (define_insn "*add<mode>3"
1283 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=??r,d,!w ,d")
1284 1.1.1.2 mrg (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0,0,0 ,0")
1285 1.1.1.2 mrg (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,s,IJ YIJ,n Ynn")))]
1286 1.1.1.2 mrg ""
1287 1.1.1.2 mrg {
1288 1.1.1.2 mrg return avr_out_plus (insn, operands);
1289 1.1.1.2 mrg }
1290 1.1.1.2 mrg [(set_attr "length" "2")
1291 1.1.1.2 mrg (set_attr "adjust_len" "plus")
1292 1.1.1.2 mrg (set_attr "cc" "plus")])
1293 1.1.1.2 mrg
1294 1.1.1.2 mrg ;; Adding a constant to NO_LD_REGS might have lead to a reload of
1295 1.1.1.2 mrg ;; that constant to LD_REGS. We don't add a scratch to *addhi3
1296 1.1.1.2 mrg ;; itself because that insn is special to reload.
1297 1.1.1.2 mrg
1298 1.1.1.2 mrg (define_peephole2 ; addhi3_clobber
1299 1.1.1.2 mrg [(set (match_operand:ALL2 0 "d_register_operand" "")
1300 1.1.1.2 mrg (match_operand:ALL2 1 "const_operand" ""))
1301 1.1.1.2 mrg (set (match_operand:ALL2 2 "l_register_operand" "")
1302 1.1.1.2 mrg (plus:ALL2 (match_dup 2)
1303 1.1.1.2 mrg (match_dup 0)))]
1304 1.1.1.2 mrg "peep2_reg_dead_p (2, operands[0])"
1305 1.1.1.2 mrg [(parallel [(set (match_dup 2)
1306 1.1.1.2 mrg (plus:ALL2 (match_dup 2)
1307 1.1.1.2 mrg (match_dup 1)))
1308 1.1.1.2 mrg (clobber (match_dup 3))])]
1309 1.1.1.2 mrg {
1310 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, 0);
1311 1.1.1.2 mrg })
1312 1.1.1.2 mrg
1313 1.1.1.2 mrg ;; Same, but with reload to NO_LD_REGS
1314 1.1.1.2 mrg ;; Combine *reload_inhi with *addhi3
1315 1.1.1.2 mrg
1316 1.1.1.2 mrg (define_peephole2 ; addhi3_clobber
1317 1.1.1.2 mrg [(parallel [(set (match_operand:ALL2 0 "l_register_operand" "")
1318 1.1.1.2 mrg (match_operand:ALL2 1 "const_operand" ""))
1319 1.1.1.2 mrg (clobber (match_operand:QI 2 "d_register_operand" ""))])
1320 1.1.1.2 mrg (set (match_operand:ALL2 3 "l_register_operand" "")
1321 1.1.1.2 mrg (plus:ALL2 (match_dup 3)
1322 1.1.1.2 mrg (match_dup 0)))]
1323 1.1.1.2 mrg "peep2_reg_dead_p (2, operands[0])"
1324 1.1.1.2 mrg [(parallel [(set (match_dup 3)
1325 1.1.1.2 mrg (plus:ALL2 (match_dup 3)
1326 1.1.1.2 mrg (match_dup 1)))
1327 1.1.1.2 mrg (clobber (match_dup 2))])])
1328 1.1.1.2 mrg
1329 1.1.1.2 mrg ;; "addhi3_clobber"
1330 1.1.1.2 mrg ;; "addhq3_clobber" "adduhq3_clobber"
1331 1.1.1.2 mrg ;; "addha3_clobber" "adduha3_clobber"
1332 1.1.1.2 mrg (define_insn "add<mode>3_clobber"
1333 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=!w ,d ,r")
1334 1.1.1.2 mrg (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0 ,0 ,0")
1335 1.1.1.2 mrg (match_operand:ALL2 2 "const_operand" "IJ YIJ,n Ynn,n Ynn")))
1336 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X ,X ,&d"))]
1337 1.1.1.2 mrg ""
1338 1.1.1.2 mrg {
1339 1.1.1.2 mrg return avr_out_plus (insn, operands);
1340 1.1.1.2 mrg }
1341 1.1 mrg [(set_attr "length" "4")
1342 1.1.1.2 mrg (set_attr "adjust_len" "plus")
1343 1.1.1.2 mrg (set_attr "cc" "plus")])
1344 1.1 mrg
1345 1.1.1.2 mrg
1346 1.1.1.2 mrg ;; "addsi3"
1347 1.1.1.2 mrg ;; "addsq3" "addusq3"
1348 1.1.1.2 mrg ;; "addsa3" "addusa3"
1349 1.1.1.2 mrg (define_insn "add<mode>3"
1350 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r")
1351 1.1.1.2 mrg (plus:ALL4 (match_operand:ALL4 1 "register_operand" "%0,0 ,0")
1352 1.1.1.2 mrg (match_operand:ALL4 2 "nonmemory_operand" "r,i ,n Ynn")))
1353 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
1354 1.1 mrg ""
1355 1.1.1.2 mrg {
1356 1.1.1.2 mrg return avr_out_plus (insn, operands);
1357 1.1.1.2 mrg }
1358 1.1.1.2 mrg [(set_attr "length" "4")
1359 1.1.1.2 mrg (set_attr "adjust_len" "plus")
1360 1.1.1.2 mrg (set_attr "cc" "plus")])
1361 1.1 mrg
1362 1.1.1.2 mrg (define_insn "*addpsi3_zero_extend.qi"
1363 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1364 1.1.1.2 mrg (plus:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))
1365 1.1.1.2 mrg (match_operand:PSI 2 "register_operand" "0")))]
1366 1.1 mrg ""
1367 1.1.1.2 mrg "add %A0,%A1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__"
1368 1.1.1.2 mrg [(set_attr "length" "3")
1369 1.1.1.2 mrg (set_attr "cc" "set_n")])
1370 1.1 mrg
1371 1.1.1.2 mrg (define_insn "*addpsi3_zero_extend.hi"
1372 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1373 1.1.1.2 mrg (plus:PSI (zero_extend:PSI (match_operand:HI 1 "register_operand" "r"))
1374 1.1.1.2 mrg (match_operand:PSI 2 "register_operand" "0")))]
1375 1.1 mrg ""
1376 1.1.1.2 mrg "add %A0,%A1\;adc %B0,%B1\;adc %C0,__zero_reg__"
1377 1.1.1.2 mrg [(set_attr "length" "3")
1378 1.1 mrg (set_attr "cc" "set_n")])
1379 1.1 mrg
1380 1.1.1.2 mrg (define_insn "*addpsi3_sign_extend.hi"
1381 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1382 1.1.1.2 mrg (plus:PSI (sign_extend:PSI (match_operand:HI 1 "register_operand" "r"))
1383 1.1.1.2 mrg (match_operand:PSI 2 "register_operand" "0")))]
1384 1.1 mrg ""
1385 1.1.1.2 mrg "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;sbrc %B1,7\;dec %C0"
1386 1.1.1.2 mrg [(set_attr "length" "5")
1387 1.1.1.2 mrg (set_attr "cc" "set_n")])
1388 1.1 mrg
1389 1.1.1.2 mrg (define_insn "*addsi3_zero_extend"
1390 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1391 1.1.1.2 mrg (plus:SI (zero_extend:SI (match_operand:QI 1 "register_operand" "r"))
1392 1.1.1.2 mrg (match_operand:SI 2 "register_operand" "0")))]
1393 1.1.1.2 mrg ""
1394 1.1.1.2 mrg "add %A0,%1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
1395 1.1 mrg [(set_attr "length" "4")
1396 1.1 mrg (set_attr "cc" "set_n")])
1397 1.1 mrg
1398 1.1.1.2 mrg (define_insn "*addsi3_zero_extend.hi"
1399 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1400 1.1.1.2 mrg (plus:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "r"))
1401 1.1.1.2 mrg (match_operand:SI 2 "register_operand" "0")))]
1402 1.1 mrg ""
1403 1.1.1.2 mrg "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
1404 1.1.1.2 mrg [(set_attr "length" "4")
1405 1.1.1.2 mrg (set_attr "cc" "set_n")])
1406 1.1 mrg
1407 1.1.1.2 mrg (define_insn "addpsi3"
1408 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=??r,d ,d,r")
1409 1.1.1.2 mrg (plus:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0,0")
1410 1.1.1.2 mrg (match_operand:PSI 2 "nonmemory_operand" "r,s ,n,n")))
1411 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,X,&d"))]
1412 1.1.1.2 mrg ""
1413 1.1.1.2 mrg {
1414 1.1.1.2 mrg return avr_out_plus (insn, operands);
1415 1.1.1.2 mrg }
1416 1.1 mrg [(set_attr "length" "3")
1417 1.1.1.2 mrg (set_attr "adjust_len" "plus")
1418 1.1.1.2 mrg (set_attr "cc" "plus")])
1419 1.1 mrg
1420 1.1.1.2 mrg (define_insn "subpsi3"
1421 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1422 1.1.1.2 mrg (minus:PSI (match_operand:PSI 1 "register_operand" "0")
1423 1.1.1.2 mrg (match_operand:PSI 2 "register_operand" "r")))]
1424 1.1 mrg ""
1425 1.1.1.2 mrg "sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2"
1426 1.1.1.2 mrg [(set_attr "length" "3")
1427 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1428 1.1 mrg
1429 1.1.1.2 mrg (define_insn "*subpsi3_zero_extend.qi"
1430 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1431 1.1.1.2 mrg (minus:PSI (match_operand:SI 1 "register_operand" "0")
1432 1.1.1.2 mrg (zero_extend:PSI (match_operand:QI 2 "register_operand" "r"))))]
1433 1.1.1.2 mrg ""
1434 1.1.1.2 mrg "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__"
1435 1.1 mrg [(set_attr "length" "3")
1436 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1437 1.1 mrg
1438 1.1.1.2 mrg (define_insn "*subpsi3_zero_extend.hi"
1439 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1440 1.1.1.2 mrg (minus:PSI (match_operand:PSI 1 "register_operand" "0")
1441 1.1.1.2 mrg (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
1442 1.1.1.2 mrg ""
1443 1.1.1.2 mrg "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__"
1444 1.1 mrg [(set_attr "length" "3")
1445 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1446 1.1.1.2 mrg
1447 1.1.1.2 mrg (define_insn "*subpsi3_sign_extend.hi"
1448 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1449 1.1.1.2 mrg (minus:PSI (match_operand:PSI 1 "register_operand" "0")
1450 1.1.1.2 mrg (sign_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
1451 1.1.1.2 mrg ""
1452 1.1.1.2 mrg "sub %A0,%A2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbrc %B2,7\;inc %C0"
1453 1.1.1.2 mrg [(set_attr "length" "5")
1454 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1455 1.1.1.2 mrg
1456 1.1.1.2 mrg ;-----------------------------------------------------------------------------
1457 1.1.1.2 mrg ; sub bytes
1458 1.1.1.2 mrg
1459 1.1.1.2 mrg ;; "subqi3"
1460 1.1.1.2 mrg ;; "subqq3" "subuqq3"
1461 1.1.1.2 mrg (define_insn "sub<mode>3"
1462 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=??r,d ,r ,r ,r ,r")
1463 1.1.1.2 mrg (minus:ALL1 (match_operand:ALL1 1 "register_operand" "0,0 ,0 ,0 ,0 ,0")
1464 1.1.1.2 mrg (match_operand:ALL1 2 "nonmemory_or_const_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))]
1465 1.1.1.2 mrg ""
1466 1.1.1.2 mrg "@
1467 1.1.1.2 mrg sub %0,%2
1468 1.1.1.2 mrg subi %0,lo8(%2)
1469 1.1.1.2 mrg dec %0
1470 1.1.1.2 mrg inc %0
1471 1.1.1.2 mrg dec %0\;dec %0
1472 1.1.1.2 mrg inc %0\;inc %0"
1473 1.1.1.2 mrg [(set_attr "length" "1,1,1,1,2,2")
1474 1.1.1.3 skrll (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
1475 1.1.1.2 mrg
1476 1.1.1.2 mrg ;; "subhi3"
1477 1.1.1.2 mrg ;; "subhq3" "subuhq3"
1478 1.1.1.2 mrg ;; "subha3" "subuha3"
1479 1.1.1.2 mrg (define_insn "sub<mode>3"
1480 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=??r,d ,*r")
1481 1.1.1.2 mrg (minus:ALL2 (match_operand:ALL2 1 "register_operand" "0,0 ,0")
1482 1.1.1.2 mrg (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,i Ynn,Ynn")))
1483 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
1484 1.1.1.2 mrg ""
1485 1.1.1.2 mrg {
1486 1.1.1.2 mrg return avr_out_plus (insn, operands);
1487 1.1.1.2 mrg }
1488 1.1.1.2 mrg [(set_attr "adjust_len" "plus")
1489 1.1.1.2 mrg (set_attr "cc" "plus")])
1490 1.1.1.2 mrg
1491 1.1.1.2 mrg (define_insn "*subhi3_zero_extend1"
1492 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1493 1.1.1.2 mrg (minus:HI (match_operand:HI 1 "register_operand" "0")
1494 1.1.1.2 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1495 1.1.1.2 mrg ""
1496 1.1.1.2 mrg "sub %A0,%2\;sbc %B0,__zero_reg__"
1497 1.1.1.2 mrg [(set_attr "length" "2")
1498 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1499 1.1.1.2 mrg
1500 1.1.1.2 mrg (define_insn "*subhi3.sign_extend2"
1501 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1502 1.1.1.2 mrg (minus:HI (match_operand:HI 1 "register_operand" "0")
1503 1.1.1.2 mrg (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1504 1.1.1.2 mrg ""
1505 1.1.1.2 mrg {
1506 1.1.1.2 mrg return reg_overlap_mentioned_p (operands[0], operands[2])
1507 1.1.1.2 mrg ? "mov __tmp_reg__,%2\;sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;inc %B0"
1508 1.1.1.2 mrg : "sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc %2,7\;inc %B0";
1509 1.1.1.2 mrg }
1510 1.1.1.2 mrg [(set_attr "length" "5")
1511 1.1 mrg (set_attr "cc" "clobber")])
1512 1.1 mrg
1513 1.1.1.2 mrg ;; "subsi3"
1514 1.1.1.2 mrg ;; "subsq3" "subusq3"
1515 1.1.1.2 mrg ;; "subsa3" "subusa3"
1516 1.1.1.2 mrg (define_insn "sub<mode>3"
1517 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r")
1518 1.1.1.2 mrg (minus:ALL4 (match_operand:ALL4 1 "register_operand" "0,0 ,0")
1519 1.1.1.2 mrg (match_operand:ALL4 2 "nonmemory_or_const_operand" "r,n Ynn,Ynn")))
1520 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
1521 1.1 mrg ""
1522 1.1.1.2 mrg {
1523 1.1.1.2 mrg return avr_out_plus (insn, operands);
1524 1.1.1.2 mrg }
1525 1.1.1.2 mrg [(set_attr "adjust_len" "plus")
1526 1.1.1.2 mrg (set_attr "cc" "plus")])
1527 1.1 mrg
1528 1.1.1.2 mrg (define_insn "*subsi3_zero_extend"
1529 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1530 1.1.1.2 mrg (minus:SI (match_operand:SI 1 "register_operand" "0")
1531 1.1.1.2 mrg (zero_extend:SI (match_operand:QI 2 "register_operand" "r"))))]
1532 1.1.1.2 mrg ""
1533 1.1.1.2 mrg "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
1534 1.1.1.2 mrg [(set_attr "length" "4")
1535 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1536 1.1.1.2 mrg
1537 1.1.1.2 mrg (define_insn "*subsi3_zero_extend.hi"
1538 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1539 1.1.1.2 mrg (minus:SI (match_operand:SI 1 "register_operand" "0")
1540 1.1.1.2 mrg (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))]
1541 1.1.1.2 mrg ""
1542 1.1.1.2 mrg "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
1543 1.1.1.2 mrg [(set_attr "length" "4")
1544 1.1.1.2 mrg (set_attr "cc" "set_czn")])
1545 1.1.1.2 mrg
1546 1.1.1.2 mrg ;******************************************************************************
1547 1.1.1.2 mrg ; mul
1548 1.1.1.2 mrg
1549 1.1.1.2 mrg (define_expand "mulqi3"
1550 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "")
1551 1.1.1.2 mrg (mult:QI (match_operand:QI 1 "register_operand" "")
1552 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "")))]
1553 1.1.1.2 mrg ""
1554 1.1.1.2 mrg {
1555 1.1.1.2 mrg if (!AVR_HAVE_MUL)
1556 1.1.1.2 mrg {
1557 1.1.1.2 mrg emit_insn (gen_mulqi3_call (operands[0], operands[1], operands[2]));
1558 1.1.1.2 mrg DONE;
1559 1.1.1.2 mrg }
1560 1.1.1.2 mrg })
1561 1.1.1.2 mrg
1562 1.1.1.2 mrg (define_insn "*mulqi3_enh"
1563 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1564 1.1.1.2 mrg (mult:QI (match_operand:QI 1 "register_operand" "r")
1565 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r")))]
1566 1.1 mrg "AVR_HAVE_MUL"
1567 1.1.1.2 mrg "mul %1,%2
1568 1.1.1.2 mrg mov %0,r0
1569 1.1 mrg clr r1"
1570 1.1.1.2 mrg [(set_attr "length" "3")
1571 1.1 mrg (set_attr "cc" "clobber")])
1572 1.1 mrg
1573 1.1.1.2 mrg (define_expand "mulqi3_call"
1574 1.1.1.2 mrg [(set (reg:QI 24) (match_operand:QI 1 "register_operand" ""))
1575 1.1.1.2 mrg (set (reg:QI 22) (match_operand:QI 2 "register_operand" ""))
1576 1.1.1.2 mrg (parallel [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
1577 1.1.1.2 mrg (clobber (reg:QI 22))])
1578 1.1.1.6 mrg (set (match_operand:QI 0 "register_operand" "") (reg:QI 24))]
1579 1.1.1.6 mrg ""
1580 1.1.1.6 mrg {
1581 1.1.1.6 mrg avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
1582 1.1.1.6 mrg })
1583 1.1 mrg
1584 1.1.1.2 mrg (define_insn "*mulqi3_call"
1585 1.1.1.2 mrg [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
1586 1.1.1.2 mrg (clobber (reg:QI 22))]
1587 1.1 mrg "!AVR_HAVE_MUL"
1588 1.1.1.2 mrg "%~call __mulqi3"
1589 1.1 mrg [(set_attr "type" "xcall")
1590 1.1 mrg (set_attr "cc" "clobber")])
1591 1.1 mrg
1592 1.1.1.2 mrg ;; "umulqi3_highpart"
1593 1.1.1.2 mrg ;; "smulqi3_highpart"
1594 1.1.1.2 mrg (define_insn "<extend_su>mulqi3_highpart"
1595 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1596 1.1.1.2 mrg (truncate:QI
1597 1.1.1.2 mrg (lshiftrt:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1598 1.1.1.2 mrg (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))
1599 1.1.1.2 mrg (const_int 8))))]
1600 1.1 mrg "AVR_HAVE_MUL"
1601 1.1.1.2 mrg "mul<extend_s> %1,%2
1602 1.1.1.2 mrg mov %0,r1
1603 1.1.1.2 mrg clr __zero_reg__"
1604 1.1.1.2 mrg [(set_attr "length" "3")
1605 1.1 mrg (set_attr "cc" "clobber")])
1606 1.1 mrg
1607 1.1 mrg
1608 1.1.1.2 mrg ;; Used when expanding div or mod inline for some special values
1609 1.1.1.2 mrg (define_insn "*subqi3.ashiftrt7"
1610 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1611 1.1.1.2 mrg (minus:QI (match_operand:QI 1 "register_operand" "0")
1612 1.1.1.2 mrg (ashiftrt:QI (match_operand:QI 2 "register_operand" "r")
1613 1.1.1.2 mrg (const_int 7))))]
1614 1.1 mrg ""
1615 1.1.1.2 mrg "sbrc %2,7\;inc %0"
1616 1.1.1.2 mrg [(set_attr "length" "2")
1617 1.1.1.2 mrg (set_attr "cc" "clobber")])
1618 1.1 mrg
1619 1.1.1.2 mrg (define_insn "*addqi3.lt0"
1620 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1621 1.1.1.2 mrg (plus:QI (lt:QI (match_operand:QI 1 "register_operand" "r")
1622 1.1.1.2 mrg (const_int 0))
1623 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "0")))]
1624 1.1 mrg ""
1625 1.1.1.2 mrg "sbrc %1,7\;inc %0"
1626 1.1.1.2 mrg [(set_attr "length" "2")
1627 1.1 mrg (set_attr "cc" "clobber")])
1628 1.1 mrg
1629 1.1.1.2 mrg (define_insn "*addhi3.lt0"
1630 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=w,r")
1631 1.1.1.2 mrg (plus:HI (lt:HI (match_operand:QI 1 "register_operand" "r,r")
1632 1.1.1.2 mrg (const_int 0))
1633 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "0,0")))
1634 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,&1"))]
1635 1.1 mrg ""
1636 1.1.1.2 mrg "@
1637 1.1.1.2 mrg sbrc %1,7\;adiw %0,1
1638 1.1.1.2 mrg lsl %1\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__"
1639 1.1.1.2 mrg [(set_attr "length" "2,3")
1640 1.1.1.2 mrg (set_attr "cc" "clobber")])
1641 1.1 mrg
1642 1.1.1.2 mrg (define_insn "*addpsi3.lt0"
1643 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
1644 1.1.1.2 mrg (plus:PSI (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "r")
1645 1.1.1.2 mrg (const_int 23))
1646 1.1.1.2 mrg (match_operand:PSI 2 "register_operand" "0")))]
1647 1.1.1.2 mrg ""
1648 1.1.1.2 mrg "mov __tmp_reg__,%C1\;lsl __tmp_reg__
1649 1.1.1.2 mrg adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__"
1650 1.1.1.2 mrg [(set_attr "length" "5")
1651 1.1 mrg (set_attr "cc" "clobber")])
1652 1.1 mrg
1653 1.1.1.2 mrg (define_insn "*addsi3.lt0"
1654 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
1655 1.1.1.2 mrg (plus:SI (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
1656 1.1.1.2 mrg (const_int 31))
1657 1.1.1.2 mrg (match_operand:SI 2 "register_operand" "0")))]
1658 1.1 mrg ""
1659 1.1.1.2 mrg "mov __tmp_reg__,%D1\;lsl __tmp_reg__
1660 1.1.1.2 mrg adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
1661 1.1.1.2 mrg [(set_attr "length" "6")
1662 1.1.1.2 mrg (set_attr "cc" "clobber")])
1663 1.1 mrg
1664 1.1.1.2 mrg (define_insn "*umulqihi3.call"
1665 1.1.1.2 mrg [(set (reg:HI 24)
1666 1.1.1.2 mrg (mult:HI (zero_extend:HI (reg:QI 22))
1667 1.1.1.2 mrg (zero_extend:HI (reg:QI 24))))
1668 1.1.1.2 mrg (clobber (reg:QI 21))
1669 1.1.1.2 mrg (clobber (reg:HI 22))]
1670 1.1.1.2 mrg "!AVR_HAVE_MUL"
1671 1.1.1.2 mrg "%~call __umulqihi3"
1672 1.1 mrg [(set_attr "type" "xcall")
1673 1.1 mrg (set_attr "cc" "clobber")])
1674 1.1 mrg
1675 1.1.1.2 mrg ;; "umulqihi3"
1676 1.1.1.2 mrg ;; "mulqihi3"
1677 1.1.1.2 mrg (define_insn "<extend_u>mulqihi3"
1678 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1679 1.1.1.2 mrg (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1680 1.1.1.2 mrg (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>"))))]
1681 1.1.1.2 mrg "AVR_HAVE_MUL"
1682 1.1.1.2 mrg "mul<extend_s> %1,%2
1683 1.1.1.2 mrg movw %0,r0
1684 1.1.1.2 mrg clr __zero_reg__"
1685 1.1.1.2 mrg [(set_attr "length" "3")
1686 1.1.1.2 mrg (set_attr "cc" "clobber")])
1687 1.1 mrg
1688 1.1.1.2 mrg (define_insn "usmulqihi3"
1689 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1690 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a"))
1691 1.1.1.2 mrg (sign_extend:HI (match_operand:QI 2 "register_operand" "a"))))]
1692 1.1.1.2 mrg "AVR_HAVE_MUL"
1693 1.1.1.2 mrg "mulsu %2,%1
1694 1.1.1.2 mrg movw %0,r0
1695 1.1.1.2 mrg clr __zero_reg__"
1696 1.1.1.2 mrg [(set_attr "length" "3")
1697 1.1 mrg (set_attr "cc" "clobber")])
1698 1.1 mrg
1699 1.1.1.2 mrg ;; Above insn is not canonicalized by insn combine, so here is a version with
1700 1.1.1.2 mrg ;; operands swapped.
1701 1.1 mrg
1702 1.1.1.2 mrg (define_insn "*sumulqihi3"
1703 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1704 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
1705 1.1.1.2 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "a"))))]
1706 1.1.1.2 mrg "AVR_HAVE_MUL"
1707 1.1.1.2 mrg "mulsu %1,%2
1708 1.1.1.2 mrg movw %0,r0
1709 1.1.1.2 mrg clr __zero_reg__"
1710 1.1.1.2 mrg [(set_attr "length" "3")
1711 1.1 mrg (set_attr "cc" "clobber")])
1712 1.1 mrg
1713 1.1.1.2 mrg ;; One-extend operand 1
1714 1.1 mrg
1715 1.1.1.2 mrg (define_insn "*osmulqihi3"
1716 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
1717 1.1.1.2 mrg (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "a"))))
1718 1.1.1.2 mrg (sign_extend:HI (match_operand:QI 2 "register_operand" "a"))))]
1719 1.1.1.2 mrg "AVR_HAVE_MUL"
1720 1.1.1.2 mrg "mulsu %2,%1
1721 1.1.1.2 mrg movw %0,r0
1722 1.1.1.2 mrg sub %B0,%2
1723 1.1.1.2 mrg clr __zero_reg__"
1724 1.1.1.2 mrg [(set_attr "length" "4")
1725 1.1 mrg (set_attr "cc" "clobber")])
1726 1.1 mrg
1727 1.1.1.2 mrg (define_insn "*oumulqihi3"
1728 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
1729 1.1.1.2 mrg (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r"))))
1730 1.1.1.2 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
1731 1.1.1.2 mrg "AVR_HAVE_MUL"
1732 1.1.1.2 mrg "mul %2,%1
1733 1.1.1.2 mrg movw %0,r0
1734 1.1.1.2 mrg sub %B0,%2
1735 1.1.1.2 mrg clr __zero_reg__"
1736 1.1.1.2 mrg [(set_attr "length" "4")
1737 1.1.1.2 mrg (set_attr "cc" "clobber")])
1738 1.1 mrg
1739 1.1.1.2 mrg ;******************************************************************************
1740 1.1.1.2 mrg ; multiply-add/sub QI: $0 = $3 +/- $1*$2
1741 1.1.1.2 mrg ;******************************************************************************
1742 1.1 mrg
1743 1.1.1.2 mrg (define_insn "*maddqi4"
1744 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1745 1.1.1.2 mrg (plus:QI (mult:QI (match_operand:QI 1 "register_operand" "r")
1746 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r"))
1747 1.1.1.2 mrg (match_operand:QI 3 "register_operand" "0")))]
1748 1.1 mrg
1749 1.1.1.2 mrg "AVR_HAVE_MUL"
1750 1.1.1.2 mrg "mul %1,%2
1751 1.1.1.2 mrg add %A0,r0
1752 1.1.1.2 mrg clr __zero_reg__"
1753 1.1.1.2 mrg [(set_attr "length" "4")
1754 1.1.1.2 mrg (set_attr "cc" "clobber")])
1755 1.1 mrg
1756 1.1.1.2 mrg (define_insn "*msubqi4"
1757 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1758 1.1.1.2 mrg (minus:QI (match_operand:QI 3 "register_operand" "0")
1759 1.1.1.2 mrg (mult:QI (match_operand:QI 1 "register_operand" "r")
1760 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r"))))]
1761 1.1.1.2 mrg "AVR_HAVE_MUL"
1762 1.1.1.2 mrg "mul %1,%2
1763 1.1.1.2 mrg sub %A0,r0
1764 1.1.1.2 mrg clr __zero_reg__"
1765 1.1.1.2 mrg [(set_attr "length" "4")
1766 1.1.1.2 mrg (set_attr "cc" "clobber")])
1767 1.1.1.2 mrg
1768 1.1.1.2 mrg (define_insn_and_split "*maddqi4.const"
1769 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1770 1.1.1.2 mrg (plus:QI (mult:QI (match_operand:QI 1 "register_operand" "r")
1771 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "n"))
1772 1.1.1.2 mrg (match_operand:QI 3 "register_operand" "0")))
1773 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1774 1.1.1.2 mrg "AVR_HAVE_MUL"
1775 1.1.1.2 mrg "#"
1776 1.1.1.2 mrg "&& reload_completed"
1777 1.1.1.2 mrg [(set (match_dup 4)
1778 1.1.1.2 mrg (match_dup 2))
1779 1.1.1.2 mrg ; *maddqi4
1780 1.1 mrg (set (match_dup 0)
1781 1.1.1.2 mrg (plus:QI (mult:QI (match_dup 1)
1782 1.1.1.2 mrg (match_dup 4))
1783 1.1.1.2 mrg (match_dup 3)))])
1784 1.1.1.2 mrg
1785 1.1.1.2 mrg (define_insn_and_split "*msubqi4.const"
1786 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
1787 1.1.1.2 mrg (minus:QI (match_operand:QI 3 "register_operand" "0")
1788 1.1.1.2 mrg (mult:QI (match_operand:QI 1 "register_operand" "r")
1789 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "n"))))
1790 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1791 1.1.1.2 mrg "AVR_HAVE_MUL"
1792 1.1.1.2 mrg "#"
1793 1.1.1.2 mrg "&& reload_completed"
1794 1.1.1.2 mrg [(set (match_dup 4)
1795 1.1.1.2 mrg (match_dup 2))
1796 1.1.1.2 mrg ; *msubqi4
1797 1.1.1.2 mrg (set (match_dup 0)
1798 1.1.1.2 mrg (minus:QI (match_dup 3)
1799 1.1.1.2 mrg (mult:QI (match_dup 1)
1800 1.1.1.2 mrg (match_dup 4))))])
1801 1.1 mrg
1802 1.1 mrg
1803 1.1.1.2 mrg ;******************************************************************************
1804 1.1.1.2 mrg ; multiply-add/sub HI: $0 = $3 +/- $1*$2 with 8-bit values $1, $2
1805 1.1.1.2 mrg ;******************************************************************************
1806 1.1 mrg
1807 1.1.1.2 mrg ;; We don't use standard insns/expanders as they lead to cumbersome code for,
1808 1.1.1.2 mrg ;; e.g,
1809 1.1.1.2 mrg ;;
1810 1.1.1.2 mrg ;; int foo (unsigned char z)
1811 1.1.1.2 mrg ;; {
1812 1.1.1.2 mrg ;; extern int aInt[];
1813 1.1.1.2 mrg ;; return aInt[3*z+2];
1814 1.1.1.2 mrg ;; }
1815 1.1.1.2 mrg ;;
1816 1.1.1.2 mrg ;; because the constant +4 then is added explicitely instead of consuming it
1817 1.1.1.2 mrg ;; with the aInt symbol. Therefore, we rely on insn combine which takes costs
1818 1.1.1.2 mrg ;; into account more accurately and doesn't do burte-force multiply-add/sub.
1819 1.1.1.2 mrg ;; The implementational effort is the same so we are fine with that approach.
1820 1.1 mrg
1821 1.1 mrg
1822 1.1.1.2 mrg ;; "*maddqihi4"
1823 1.1.1.2 mrg ;; "*umaddqihi4"
1824 1.1.1.2 mrg (define_insn "*<extend_u>maddqihi4"
1825 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1826 1.1.1.2 mrg (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1827 1.1.1.2 mrg (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))
1828 1.1.1.2 mrg (match_operand:HI 3 "register_operand" "0")))]
1829 1.1 mrg
1830 1.1.1.2 mrg "AVR_HAVE_MUL"
1831 1.1.1.2 mrg "mul<extend_s> %1,%2
1832 1.1.1.2 mrg add %A0,r0
1833 1.1.1.2 mrg adc %B0,r1
1834 1.1.1.2 mrg clr __zero_reg__"
1835 1.1.1.2 mrg [(set_attr "length" "4")
1836 1.1.1.2 mrg (set_attr "cc" "clobber")])
1837 1.1 mrg
1838 1.1.1.2 mrg ;; "*msubqihi4"
1839 1.1.1.2 mrg ;; "*umsubqihi4"
1840 1.1.1.2 mrg (define_insn "*<extend_u>msubqihi4"
1841 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1842 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
1843 1.1.1.2 mrg (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1844 1.1.1.2 mrg (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))))]
1845 1.1.1.2 mrg "AVR_HAVE_MUL"
1846 1.1.1.2 mrg "mul<extend_s> %1,%2
1847 1.1.1.2 mrg sub %A0,r0
1848 1.1.1.2 mrg sbc %B0,r1
1849 1.1.1.2 mrg clr __zero_reg__"
1850 1.1.1.2 mrg [(set_attr "length" "4")
1851 1.1.1.2 mrg (set_attr "cc" "clobber")])
1852 1.1 mrg
1853 1.1.1.2 mrg ;; "*usmaddqihi4"
1854 1.1.1.2 mrg ;; "*sumaddqihi4"
1855 1.1.1.2 mrg (define_insn "*<any_extend:extend_su><any_extend2:extend_su>msubqihi4"
1856 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1857 1.1.1.2 mrg (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a"))
1858 1.1.1.2 mrg (any_extend2:HI (match_operand:QI 2 "register_operand" "a")))
1859 1.1.1.2 mrg (match_operand:HI 3 "register_operand" "0")))]
1860 1.1.1.2 mrg "AVR_HAVE_MUL
1861 1.1.1.2 mrg && reload_completed
1862 1.1.1.2 mrg && <any_extend:CODE> != <any_extend2:CODE>"
1863 1.1.1.2 mrg {
1864 1.1.1.2 mrg output_asm_insn (<any_extend:CODE> == SIGN_EXTEND
1865 1.1.1.2 mrg ? "mulsu %1,%2" : "mulsu %2,%1", operands);
1866 1.1 mrg
1867 1.1.1.2 mrg return "add %A0,r0\;adc %B0,r1\;clr __zero_reg__";
1868 1.1.1.2 mrg }
1869 1.1.1.2 mrg [(set_attr "length" "4")
1870 1.1.1.2 mrg (set_attr "cc" "clobber")])
1871 1.1 mrg
1872 1.1.1.2 mrg ;; "*usmsubqihi4"
1873 1.1.1.2 mrg ;; "*sumsubqihi4"
1874 1.1.1.2 mrg (define_insn "*<any_extend:extend_su><any_extend2:extend_su>msubqihi4"
1875 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1876 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
1877 1.1.1.2 mrg (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a"))
1878 1.1.1.2 mrg (any_extend2:HI (match_operand:QI 2 "register_operand" "a")))))]
1879 1.1.1.2 mrg "AVR_HAVE_MUL
1880 1.1.1.2 mrg && reload_completed
1881 1.1.1.2 mrg && <any_extend:CODE> != <any_extend2:CODE>"
1882 1.1.1.2 mrg {
1883 1.1.1.2 mrg output_asm_insn (<any_extend:CODE> == SIGN_EXTEND
1884 1.1.1.2 mrg ? "mulsu %1,%2" : "mulsu %2,%1", operands);
1885 1.1.1.2 mrg
1886 1.1.1.2 mrg return "sub %A0,r0\;sbc %B0,r1\;clr __zero_reg__";
1887 1.1.1.2 mrg }
1888 1.1 mrg [(set_attr "length" "4")
1889 1.1.1.2 mrg (set_attr "cc" "clobber")])
1890 1.1 mrg
1891 1.1.1.2 mrg ;; Handle small constants
1892 1.1 mrg
1893 1.1.1.2 mrg ;; Special case of a += 2*b as frequently seen with accesses to int arrays.
1894 1.1.1.2 mrg ;; This is shorter, faster than MUL and has lower register pressure.
1895 1.1 mrg
1896 1.1.1.2 mrg (define_insn_and_split "*umaddqihi4.2"
1897 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1898 1.1.1.2 mrg (plus:HI (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
1899 1.1.1.2 mrg (const_int 2))
1900 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r")))]
1901 1.1.1.2 mrg "!reload_completed
1902 1.1.1.2 mrg && !reg_overlap_mentioned_p (operands[0], operands[1])"
1903 1.1.1.2 mrg { gcc_unreachable(); }
1904 1.1.1.2 mrg "&& 1"
1905 1.1.1.2 mrg [(set (match_dup 0)
1906 1.1.1.2 mrg (match_dup 2))
1907 1.1.1.2 mrg ; *addhi3_zero_extend
1908 1.1.1.2 mrg (set (match_dup 0)
1909 1.1.1.2 mrg (plus:HI (zero_extend:HI (match_dup 1))
1910 1.1.1.2 mrg (match_dup 0)))
1911 1.1.1.2 mrg ; *addhi3_zero_extend
1912 1.1.1.2 mrg (set (match_dup 0)
1913 1.1.1.2 mrg (plus:HI (zero_extend:HI (match_dup 1))
1914 1.1.1.2 mrg (match_dup 0)))])
1915 1.1 mrg
1916 1.1.1.2 mrg ;; "umaddqihi4.uconst"
1917 1.1.1.2 mrg ;; "maddqihi4.sconst"
1918 1.1.1.2 mrg (define_insn_and_split "*<extend_u>maddqihi4.<extend_su>const"
1919 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1920 1.1.1.2 mrg (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1921 1.1.1.2 mrg (match_operand:HI 2 "<extend_su>8_operand" "n"))
1922 1.1.1.2 mrg (match_operand:HI 3 "register_operand" "0")))
1923 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1924 1.1.1.2 mrg "AVR_HAVE_MUL"
1925 1.1.1.2 mrg "#"
1926 1.1.1.2 mrg "&& reload_completed"
1927 1.1.1.2 mrg [(set (match_dup 4)
1928 1.1.1.2 mrg (match_dup 2))
1929 1.1.1.2 mrg ; *umaddqihi4 resp. *maddqihi4
1930 1.1.1.2 mrg (set (match_dup 0)
1931 1.1.1.2 mrg (plus:HI (mult:HI (any_extend:HI (match_dup 1))
1932 1.1.1.2 mrg (any_extend:HI (match_dup 4)))
1933 1.1.1.2 mrg (match_dup 3)))]
1934 1.1.1.2 mrg {
1935 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
1936 1.1.1.2 mrg })
1937 1.1 mrg
1938 1.1.1.2 mrg ;; "*umsubqihi4.uconst"
1939 1.1.1.2 mrg ;; "*msubqihi4.sconst"
1940 1.1.1.2 mrg (define_insn_and_split "*<extend_u>msubqihi4.<extend_su>const"
1941 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1942 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
1943 1.1.1.2 mrg (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
1944 1.1.1.2 mrg (match_operand:HI 2 "<extend_su>8_operand" "n"))))
1945 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1946 1.1.1.2 mrg "AVR_HAVE_MUL"
1947 1.1.1.2 mrg "#"
1948 1.1.1.2 mrg "&& reload_completed"
1949 1.1.1.2 mrg [(set (match_dup 4)
1950 1.1.1.2 mrg (match_dup 2))
1951 1.1.1.2 mrg ; *umsubqihi4 resp. *msubqihi4
1952 1.1.1.2 mrg (set (match_dup 0)
1953 1.1.1.2 mrg (minus:HI (match_dup 3)
1954 1.1.1.2 mrg (mult:HI (any_extend:HI (match_dup 1))
1955 1.1.1.2 mrg (any_extend:HI (match_dup 4)))))]
1956 1.1.1.2 mrg {
1957 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
1958 1.1.1.2 mrg })
1959 1.1 mrg
1960 1.1.1.2 mrg ;; Same as the insn above, but combiner tries versions canonicalized to ASHIFT
1961 1.1.1.2 mrg ;; for MULT with power of 2 and skips trying MULT insn above.
1962 1.1 mrg
1963 1.1.1.2 mrg (define_insn_and_split "*umsubqihi4.uconst.ashift"
1964 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1965 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
1966 1.1.1.2 mrg (ashift:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
1967 1.1.1.2 mrg (match_operand:HI 2 "const_2_to_7_operand" "n"))))
1968 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1969 1.1.1.2 mrg "AVR_HAVE_MUL"
1970 1.1.1.2 mrg "#"
1971 1.1.1.2 mrg "&& reload_completed"
1972 1.1.1.2 mrg [(set (match_dup 4)
1973 1.1.1.2 mrg (match_dup 2))
1974 1.1.1.2 mrg ; *umsubqihi4
1975 1.1.1.2 mrg (set (match_dup 0)
1976 1.1.1.2 mrg (minus:HI (match_dup 3)
1977 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_dup 1))
1978 1.1.1.2 mrg (zero_extend:HI (match_dup 4)))))]
1979 1.1.1.2 mrg {
1980 1.1.1.2 mrg operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
1981 1.1.1.2 mrg })
1982 1.1 mrg
1983 1.1.1.2 mrg ;; Same as the insn above, but combiner tries versions canonicalized to ASHIFT
1984 1.1.1.2 mrg ;; for MULT with power of 2 and skips trying MULT insn above. We omit 128
1985 1.1.1.2 mrg ;; because this would require an extra pattern for just one value.
1986 1.1.1.2 mrg
1987 1.1.1.2 mrg (define_insn_and_split "*msubqihi4.sconst.ashift"
1988 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
1989 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
1990 1.1.1.2 mrg (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
1991 1.1.1.2 mrg (match_operand:HI 2 "const_1_to_6_operand" "M"))))
1992 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
1993 1.1.1.2 mrg "AVR_HAVE_MUL"
1994 1.1.1.2 mrg "#"
1995 1.1.1.2 mrg "&& reload_completed"
1996 1.1.1.2 mrg [(set (match_dup 4)
1997 1.1.1.2 mrg (match_dup 2))
1998 1.1.1.2 mrg ; *smsubqihi4
1999 1.1.1.2 mrg (set (match_dup 0)
2000 1.1.1.2 mrg (minus:HI (match_dup 3)
2001 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_dup 1))
2002 1.1.1.2 mrg (sign_extend:HI (match_dup 4)))))]
2003 1.1.1.2 mrg {
2004 1.1.1.2 mrg operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
2005 1.1.1.2 mrg })
2006 1.1 mrg
2007 1.1.1.2 mrg ;; For signed/unsigned combinations that require narrow constraint "a"
2008 1.1.1.2 mrg ;; just provide a pattern if signed/unsigned combination is actually needed.
2009 1.1 mrg
2010 1.1.1.2 mrg (define_insn_and_split "*sumaddqihi4.uconst"
2011 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2012 1.1.1.2 mrg (plus:HI (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2013 1.1.1.2 mrg (match_operand:HI 2 "u8_operand" "M"))
2014 1.1.1.2 mrg (match_operand:HI 3 "register_operand" "0")))
2015 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&a"))]
2016 1.1.1.2 mrg "AVR_HAVE_MUL
2017 1.1.1.2 mrg && !s8_operand (operands[2], VOIDmode)"
2018 1.1.1.2 mrg "#"
2019 1.1.1.2 mrg "&& reload_completed"
2020 1.1.1.2 mrg [(set (match_dup 4)
2021 1.1.1.2 mrg (match_dup 2))
2022 1.1.1.2 mrg ; *sumaddqihi4
2023 1.1.1.2 mrg (set (match_dup 0)
2024 1.1.1.2 mrg (plus:HI (mult:HI (sign_extend:HI (match_dup 1))
2025 1.1.1.2 mrg (zero_extend:HI (match_dup 4)))
2026 1.1.1.2 mrg (match_dup 3)))]
2027 1.1.1.2 mrg {
2028 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2029 1.1.1.2 mrg })
2030 1.1 mrg
2031 1.1.1.2 mrg (define_insn_and_split "*sumsubqihi4.uconst"
2032 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2033 1.1.1.2 mrg (minus:HI (match_operand:HI 3 "register_operand" "0")
2034 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2035 1.1.1.2 mrg (match_operand:HI 2 "u8_operand" "M"))))
2036 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&a"))]
2037 1.1.1.2 mrg "AVR_HAVE_MUL
2038 1.1.1.2 mrg && !s8_operand (operands[2], VOIDmode)"
2039 1.1 mrg "#"
2040 1.1.1.2 mrg "&& reload_completed"
2041 1.1.1.2 mrg [(set (match_dup 4)
2042 1.1.1.2 mrg (match_dup 2))
2043 1.1.1.2 mrg ; *sumsubqihi4
2044 1.1.1.2 mrg (set (match_dup 0)
2045 1.1.1.2 mrg (minus:HI (match_dup 3)
2046 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_dup 1))
2047 1.1.1.2 mrg (zero_extend:HI (match_dup 4)))))]
2048 1.1.1.2 mrg {
2049 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2050 1.1.1.2 mrg })
2051 1.1 mrg
2052 1.1.1.2 mrg ;******************************************************************************
2053 1.1.1.2 mrg ; mul HI: $1 = sign/zero-extend, $2 = small constant
2054 1.1.1.2 mrg ;******************************************************************************
2055 1.1 mrg
2056 1.1.1.2 mrg ;; "*muluqihi3.uconst"
2057 1.1.1.2 mrg ;; "*mulsqihi3.sconst"
2058 1.1.1.2 mrg (define_insn_and_split "*mul<extend_su>qihi3.<extend_su>const"
2059 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2060 1.1.1.2 mrg (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
2061 1.1.1.2 mrg (match_operand:HI 2 "<extend_su>8_operand" "n")))
2062 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&d"))]
2063 1.1.1.2 mrg "AVR_HAVE_MUL"
2064 1.1 mrg "#"
2065 1.1.1.2 mrg "&& reload_completed"
2066 1.1.1.2 mrg [(set (match_dup 3)
2067 1.1.1.2 mrg (match_dup 2))
2068 1.1.1.2 mrg ; umulqihi3 resp. mulqihi3
2069 1.1.1.2 mrg (set (match_dup 0)
2070 1.1.1.2 mrg (mult:HI (any_extend:HI (match_dup 1))
2071 1.1.1.2 mrg (any_extend:HI (match_dup 3))))]
2072 1.1.1.2 mrg {
2073 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2074 1.1.1.2 mrg })
2075 1.1 mrg
2076 1.1.1.2 mrg (define_insn_and_split "*muluqihi3.sconst"
2077 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2078 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a"))
2079 1.1.1.2 mrg (match_operand:HI 2 "s8_operand" "n")))
2080 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&a"))]
2081 1.1.1.2 mrg "AVR_HAVE_MUL"
2082 1.1.1.2 mrg "#"
2083 1.1.1.2 mrg "&& reload_completed"
2084 1.1.1.2 mrg [(set (match_dup 3)
2085 1.1.1.2 mrg (match_dup 2))
2086 1.1.1.2 mrg ; usmulqihi3
2087 1.1.1.2 mrg (set (match_dup 0)
2088 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_dup 1))
2089 1.1.1.2 mrg (sign_extend:HI (match_dup 3))))]
2090 1.1.1.2 mrg {
2091 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2092 1.1.1.2 mrg })
2093 1.1 mrg
2094 1.1.1.2 mrg (define_insn_and_split "*mulsqihi3.uconst"
2095 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2096 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2097 1.1.1.2 mrg (match_operand:HI 2 "u8_operand" "M")))
2098 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&a"))]
2099 1.1.1.2 mrg "AVR_HAVE_MUL"
2100 1.1.1.2 mrg "#"
2101 1.1.1.2 mrg "&& reload_completed"
2102 1.1.1.2 mrg [(set (match_dup 3)
2103 1.1.1.2 mrg (match_dup 2))
2104 1.1.1.2 mrg ; usmulqihi3
2105 1.1.1.2 mrg (set (match_dup 0)
2106 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_dup 3))
2107 1.1.1.2 mrg (sign_extend:HI (match_dup 1))))]
2108 1.1.1.2 mrg {
2109 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2110 1.1.1.2 mrg })
2111 1.1 mrg
2112 1.1.1.2 mrg (define_insn_and_split "*mulsqihi3.oconst"
2113 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
2114 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2115 1.1.1.2 mrg (match_operand:HI 2 "o8_operand" "n")))
2116 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&a"))]
2117 1.1.1.2 mrg "AVR_HAVE_MUL"
2118 1.1.1.2 mrg "#"
2119 1.1.1.2 mrg "&& reload_completed"
2120 1.1.1.2 mrg [(set (match_dup 3)
2121 1.1.1.2 mrg (match_dup 2))
2122 1.1.1.2 mrg ; *osmulqihi3
2123 1.1.1.2 mrg (set (match_dup 0)
2124 1.1.1.2 mrg (mult:HI (not:HI (zero_extend:HI (not:QI (match_dup 3))))
2125 1.1.1.2 mrg (sign_extend:HI (match_dup 1))))]
2126 1.1.1.2 mrg {
2127 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
2128 1.1.1.2 mrg })
2129 1.1 mrg
2130 1.1.1.2 mrg ;; The EXTEND of $1 only appears in combine, we don't see it in expand so that
2131 1.1.1.2 mrg ;; expand decides to use ASHIFT instead of MUL because ASHIFT costs are cheaper
2132 1.1.1.2 mrg ;; at that time. Fix that.
2133 1.1.1.2 mrg
2134 1.1.1.2 mrg (define_insn "*ashiftqihi2.signx.1"
2135 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r,*r")
2136 1.1.1.2 mrg (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0,r"))
2137 1.1.1.2 mrg (const_int 1)))]
2138 1.1 mrg ""
2139 1.1.1.2 mrg "@
2140 1.1.1.2 mrg lsl %A0\;sbc %B0,%B0
2141 1.1.1.2 mrg mov %A0,%1\;lsl %A0\;sbc %B0,%B0"
2142 1.1.1.2 mrg [(set_attr "length" "2,3")
2143 1.1.1.2 mrg (set_attr "cc" "clobber")])
2144 1.1 mrg
2145 1.1.1.2 mrg (define_insn_and_split "*ashifthi3.signx.const"
2146 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2147 1.1.1.2 mrg (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
2148 1.1.1.2 mrg (match_operand:HI 2 "const_2_to_6_operand" "I")))
2149 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&d"))]
2150 1.1.1.2 mrg "AVR_HAVE_MUL"
2151 1.1.1.2 mrg "#"
2152 1.1.1.2 mrg "&& reload_completed"
2153 1.1.1.2 mrg [(set (match_dup 3)
2154 1.1.1.2 mrg (match_dup 2))
2155 1.1.1.2 mrg ; mulqihi3
2156 1.1.1.2 mrg (set (match_dup 0)
2157 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_dup 1))
2158 1.1.1.2 mrg (sign_extend:HI (match_dup 3))))]
2159 1.1.1.2 mrg {
2160 1.1.1.2 mrg operands[2] = GEN_INT (1 << INTVAL (operands[2]));
2161 1.1.1.2 mrg })
2162 1.1 mrg
2163 1.1.1.2 mrg (define_insn_and_split "*ashifthi3.signx.const7"
2164 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2165 1.1.1.2 mrg (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2166 1.1.1.2 mrg (const_int 7)))
2167 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=&a"))]
2168 1.1.1.2 mrg "AVR_HAVE_MUL"
2169 1.1.1.2 mrg "#"
2170 1.1.1.2 mrg "&& reload_completed"
2171 1.1.1.2 mrg [(set (match_dup 2)
2172 1.1.1.2 mrg (match_dup 3))
2173 1.1.1.2 mrg ; usmulqihi3
2174 1.1.1.2 mrg (set (match_dup 0)
2175 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_dup 2))
2176 1.1.1.2 mrg (sign_extend:HI (match_dup 1))))]
2177 1.1.1.2 mrg {
2178 1.1.1.2 mrg operands[3] = gen_int_mode (1 << 7, QImode);
2179 1.1.1.2 mrg })
2180 1.1 mrg
2181 1.1.1.2 mrg (define_insn_and_split "*ashifthi3.zerox.const"
2182 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
2183 1.1.1.2 mrg (ashift:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
2184 1.1.1.2 mrg (match_operand:HI 2 "const_2_to_7_operand" "I")))
2185 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&d"))]
2186 1.1.1.2 mrg "AVR_HAVE_MUL"
2187 1.1.1.2 mrg "#"
2188 1.1.1.2 mrg "&& reload_completed"
2189 1.1.1.2 mrg [(set (match_dup 3)
2190 1.1.1.2 mrg (match_dup 2))
2191 1.1.1.2 mrg ; umulqihi3
2192 1.1.1.2 mrg (set (match_dup 0)
2193 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_dup 1))
2194 1.1.1.2 mrg (zero_extend:HI (match_dup 3))))]
2195 1.1.1.2 mrg {
2196 1.1.1.2 mrg operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
2197 1.1.1.2 mrg })
2198 1.1 mrg
2199 1.1.1.2 mrg ;******************************************************************************
2200 1.1.1.2 mrg ; mul HI: $1 = sign-/zero-/one-extend, $2 = reg
2201 1.1.1.2 mrg ;******************************************************************************
2202 1.1 mrg
2203 1.1.1.2 mrg (define_insn "mulsqihi3"
2204 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
2205 1.1.1.2 mrg (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
2206 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "a")))]
2207 1.1.1.2 mrg "AVR_HAVE_MUL"
2208 1.1.1.2 mrg "mulsu %1,%A2
2209 1.1.1.2 mrg movw %0,r0
2210 1.1.1.2 mrg mul %1,%B2
2211 1.1.1.2 mrg add %B0,r0
2212 1.1.1.2 mrg clr __zero_reg__"
2213 1.1.1.2 mrg [(set_attr "length" "5")
2214 1.1.1.2 mrg (set_attr "cc" "clobber")])
2215 1.1 mrg
2216 1.1.1.2 mrg (define_insn "muluqihi3"
2217 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
2218 1.1.1.2 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
2219 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r")))]
2220 1.1.1.2 mrg "AVR_HAVE_MUL"
2221 1.1.1.2 mrg "mul %1,%A2
2222 1.1.1.2 mrg movw %0,r0
2223 1.1.1.2 mrg mul %1,%B2
2224 1.1.1.2 mrg add %B0,r0
2225 1.1.1.2 mrg clr __zero_reg__"
2226 1.1.1.2 mrg [(set_attr "length" "5")
2227 1.1.1.2 mrg (set_attr "cc" "clobber")])
2228 1.1 mrg
2229 1.1.1.2 mrg ;; one-extend operand 1
2230 1.1 mrg
2231 1.1.1.2 mrg (define_insn "muloqihi3"
2232 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
2233 1.1.1.2 mrg (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r"))))
2234 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r")))]
2235 1.1.1.2 mrg "AVR_HAVE_MUL"
2236 1.1.1.2 mrg "mul %1,%A2
2237 1.1.1.2 mrg movw %0,r0
2238 1.1.1.2 mrg mul %1,%B2
2239 1.1.1.2 mrg add %B0,r0
2240 1.1.1.2 mrg sub %B0,%A2
2241 1.1.1.2 mrg clr __zero_reg__"
2242 1.1.1.2 mrg [(set_attr "length" "6")
2243 1.1.1.2 mrg (set_attr "cc" "clobber")])
2244 1.1 mrg
2245 1.1.1.2 mrg ;******************************************************************************
2246 1.1 mrg
2247 1.1.1.2 mrg (define_expand "mulhi3"
2248 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "")
2249 1.1.1.2 mrg (mult:HI (match_operand:HI 1 "register_operand" "")
2250 1.1.1.2 mrg (match_operand:HI 2 "register_or_s9_operand" "")))]
2251 1.1 mrg ""
2252 1.1.1.2 mrg {
2253 1.1.1.2 mrg if (!AVR_HAVE_MUL)
2254 1.1.1.2 mrg {
2255 1.1.1.2 mrg if (!register_operand (operands[2], HImode))
2256 1.1.1.2 mrg operands[2] = force_reg (HImode, operands[2]);
2257 1.1 mrg
2258 1.1.1.2 mrg emit_insn (gen_mulhi3_call (operands[0], operands[1], operands[2]));
2259 1.1.1.2 mrg DONE;
2260 1.1.1.2 mrg }
2261 1.1 mrg
2262 1.1.1.6 mrg /* ; For small constants we can do better by extending them on the fly.
2263 1.1.1.6 mrg ; The constant can be loaded in one instruction and the widening
2264 1.1.1.6 mrg ; multiplication is shorter. First try the unsigned variant because it
2265 1.1.1.6 mrg ; allows constraint "d" instead of "a" for the signed version. */
2266 1.1.1.2 mrg
2267 1.1.1.2 mrg if (s9_operand (operands[2], HImode))
2268 1.1.1.2 mrg {
2269 1.1.1.2 mrg rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
2270 1.1.1.2 mrg
2271 1.1.1.2 mrg if (u8_operand (operands[2], HImode))
2272 1.1.1.2 mrg {
2273 1.1.1.2 mrg emit_insn (gen_muluqihi3 (operands[0], reg, operands[1]));
2274 1.1.1.2 mrg }
2275 1.1.1.2 mrg else if (s8_operand (operands[2], HImode))
2276 1.1.1.2 mrg {
2277 1.1.1.2 mrg emit_insn (gen_mulsqihi3 (operands[0], reg, operands[1]));
2278 1.1.1.2 mrg }
2279 1.1.1.2 mrg else
2280 1.1.1.2 mrg {
2281 1.1.1.2 mrg emit_insn (gen_muloqihi3 (operands[0], reg, operands[1]));
2282 1.1.1.2 mrg }
2283 1.1 mrg
2284 1.1.1.2 mrg DONE;
2285 1.1.1.2 mrg }
2286 1.1 mrg
2287 1.1.1.2 mrg if (!register_operand (operands[2], HImode))
2288 1.1.1.2 mrg operands[2] = force_reg (HImode, operands[2]);
2289 1.1.1.2 mrg })
2290 1.1 mrg
2291 1.1.1.2 mrg (define_insn "*mulhi3_enh"
2292 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=&r")
2293 1.1.1.2 mrg (mult:HI (match_operand:HI 1 "register_operand" "r")
2294 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r")))]
2295 1.1.1.2 mrg "AVR_HAVE_MUL"
2296 1.1.1.2 mrg {
2297 1.1.1.2 mrg return REGNO (operands[1]) == REGNO (operands[2])
2298 1.1.1.2 mrg ? "mul %A1,%A1\;movw %0,r0\;mul %A1,%B1\;add %B0,r0\;add %B0,r0\;clr r1"
2299 1.1.1.2 mrg : "mul %A1,%A2\;movw %0,r0\;mul %A1,%B2\;add %B0,r0\;mul %B1,%A2\;add %B0,r0\;clr r1";
2300 1.1.1.2 mrg }
2301 1.1.1.2 mrg [(set_attr "length" "7")
2302 1.1.1.2 mrg (set_attr "cc" "clobber")])
2303 1.1 mrg
2304 1.1.1.2 mrg (define_expand "mulhi3_call"
2305 1.1.1.2 mrg [(set (reg:HI 24) (match_operand:HI 1 "register_operand" ""))
2306 1.1.1.2 mrg (set (reg:HI 22) (match_operand:HI 2 "register_operand" ""))
2307 1.1.1.2 mrg (parallel [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
2308 1.1.1.2 mrg (clobber (reg:HI 22))
2309 1.1.1.2 mrg (clobber (reg:QI 21))])
2310 1.1.1.6 mrg (set (match_operand:HI 0 "register_operand" "")
2311 1.1.1.6 mrg (reg:HI 24))]
2312 1.1.1.6 mrg ""
2313 1.1.1.6 mrg {
2314 1.1.1.6 mrg avr_fix_inputs (operands, (1 << 2), regmask (HImode, 24));
2315 1.1.1.6 mrg })
2316 1.1.1.6 mrg
2317 1.1 mrg
2318 1.1.1.2 mrg (define_insn "*mulhi3_call"
2319 1.1.1.2 mrg [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
2320 1.1.1.2 mrg (clobber (reg:HI 22))
2321 1.1.1.2 mrg (clobber (reg:QI 21))]
2322 1.1.1.2 mrg "!AVR_HAVE_MUL"
2323 1.1.1.2 mrg "%~call __mulhi3"
2324 1.1.1.2 mrg [(set_attr "type" "xcall")
2325 1.1.1.2 mrg (set_attr "cc" "clobber")])
2326 1.1 mrg
2327 1.1.1.2 mrg ;; To support widening multiplication with constant we postpone
2328 1.1.1.2 mrg ;; expanding to the implicit library call until post combine and
2329 1.1.1.2 mrg ;; prior to register allocation. Clobber all hard registers that
2330 1.1.1.2 mrg ;; might be used by the (widening) multiply until it is split and
2331 1.1.1.2 mrg ;; it's final register footprint is worked out.
2332 1.1 mrg
2333 1.1.1.2 mrg (define_expand "mulsi3"
2334 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "register_operand" "")
2335 1.1.1.2 mrg (mult:SI (match_operand:SI 1 "register_operand" "")
2336 1.1.1.2 mrg (match_operand:SI 2 "nonmemory_operand" "")))
2337 1.1.1.2 mrg (clobber (reg:HI 26))
2338 1.1.1.2 mrg (clobber (reg:DI 18))])]
2339 1.1.1.2 mrg "AVR_HAVE_MUL"
2340 1.1.1.2 mrg {
2341 1.1.1.2 mrg if (u16_operand (operands[2], SImode))
2342 1.1.1.2 mrg {
2343 1.1.1.2 mrg operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2344 1.1.1.2 mrg emit_insn (gen_muluhisi3 (operands[0], operands[2], operands[1]));
2345 1.1.1.2 mrg DONE;
2346 1.1.1.2 mrg }
2347 1.1 mrg
2348 1.1.1.2 mrg if (o16_operand (operands[2], SImode))
2349 1.1.1.2 mrg {
2350 1.1.1.2 mrg operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2351 1.1.1.2 mrg emit_insn (gen_mulohisi3 (operands[0], operands[2], operands[1]));
2352 1.1.1.2 mrg DONE;
2353 1.1.1.2 mrg }
2354 1.1.1.6 mrg
2355 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_mulsi3, operands, 1 << 0,
2356 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2357 1.1.1.6 mrg DONE;
2358 1.1.1.2 mrg })
2359 1.1 mrg
2360 1.1.1.2 mrg (define_insn_and_split "*mulsi3"
2361 1.1.1.2 mrg [(set (match_operand:SI 0 "pseudo_register_operand" "=r")
2362 1.1.1.2 mrg (mult:SI (match_operand:SI 1 "pseudo_register_operand" "r")
2363 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "rn")))
2364 1.1.1.2 mrg (clobber (reg:HI 26))
2365 1.1.1.2 mrg (clobber (reg:DI 18))]
2366 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2367 1.1.1.2 mrg { gcc_unreachable(); }
2368 1.1.1.2 mrg "&& 1"
2369 1.1.1.2 mrg [(set (reg:SI 18)
2370 1.1.1.2 mrg (match_dup 1))
2371 1.1.1.2 mrg (set (reg:SI 22)
2372 1.1.1.2 mrg (match_dup 2))
2373 1.1.1.2 mrg (parallel [(set (reg:SI 22)
2374 1.1.1.2 mrg (mult:SI (reg:SI 22)
2375 1.1.1.2 mrg (reg:SI 18)))
2376 1.1.1.2 mrg (clobber (reg:HI 26))])
2377 1.1.1.2 mrg (set (match_dup 0)
2378 1.1.1.2 mrg (reg:SI 22))]
2379 1.1.1.2 mrg {
2380 1.1.1.2 mrg if (u16_operand (operands[2], SImode))
2381 1.1.1.2 mrg {
2382 1.1.1.2 mrg operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2383 1.1.1.2 mrg emit_insn (gen_muluhisi3 (operands[0], operands[2], operands[1]));
2384 1.1.1.2 mrg DONE;
2385 1.1.1.2 mrg }
2386 1.1 mrg
2387 1.1.1.2 mrg if (o16_operand (operands[2], SImode))
2388 1.1.1.2 mrg {
2389 1.1.1.2 mrg operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2390 1.1.1.2 mrg emit_insn (gen_mulohisi3 (operands[0], operands[2], operands[1]));
2391 1.1.1.2 mrg DONE;
2392 1.1.1.2 mrg }
2393 1.1.1.2 mrg })
2394 1.1 mrg
2395 1.1.1.2 mrg ;; "muluqisi3"
2396 1.1.1.2 mrg ;; "muluhisi3"
2397 1.1.1.6 mrg (define_expand "mulu<mode>si3"
2398 1.1.1.6 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
2399 1.1.1.6 mrg (mult:SI (zero_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" ""))
2400 1.1.1.6 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
2401 1.1.1.6 mrg (clobber (reg:HI 26))
2402 1.1.1.6 mrg (clobber (reg:DI 18))])]
2403 1.1.1.6 mrg "AVR_HAVE_MUL"
2404 1.1.1.6 mrg {
2405 1.1.1.6 mrg avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
2406 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_mulu<mode>si3, operands, 1 << 0,
2407 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2408 1.1.1.6 mrg DONE;
2409 1.1.1.6 mrg })
2410 1.1.1.6 mrg
2411 1.1.1.6 mrg ;; "*muluqisi3"
2412 1.1.1.6 mrg ;; "*muluhisi3"
2413 1.1.1.6 mrg (define_insn_and_split "*mulu<mode>si3"
2414 1.1.1.2 mrg [(set (match_operand:SI 0 "pseudo_register_operand" "=r")
2415 1.1.1.2 mrg (mult:SI (zero_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" "r"))
2416 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "rn")))
2417 1.1.1.2 mrg (clobber (reg:HI 26))
2418 1.1.1.2 mrg (clobber (reg:DI 18))]
2419 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2420 1.1.1.2 mrg { gcc_unreachable(); }
2421 1.1.1.2 mrg "&& 1"
2422 1.1.1.2 mrg [(set (reg:HI 26)
2423 1.1.1.2 mrg (match_dup 1))
2424 1.1.1.2 mrg (set (reg:SI 18)
2425 1.1.1.2 mrg (match_dup 2))
2426 1.1.1.2 mrg (set (reg:SI 22)
2427 1.1.1.2 mrg (mult:SI (zero_extend:SI (reg:HI 26))
2428 1.1.1.2 mrg (reg:SI 18)))
2429 1.1.1.2 mrg (set (match_dup 0)
2430 1.1.1.2 mrg (reg:SI 22))]
2431 1.1.1.2 mrg {
2432 1.1.1.2 mrg /* Do the QI -> HI extension explicitely before the multiplication. */
2433 1.1.1.2 mrg /* Do the HI -> SI extension implicitely and after the multiplication. */
2434 1.1 mrg
2435 1.1.1.2 mrg if (QImode == <MODE>mode)
2436 1.1.1.2 mrg operands[1] = gen_rtx_ZERO_EXTEND (HImode, operands[1]);
2437 1.1 mrg
2438 1.1.1.2 mrg if (u16_operand (operands[2], SImode))
2439 1.1.1.2 mrg {
2440 1.1.1.2 mrg operands[1] = force_reg (HImode, operands[1]);
2441 1.1.1.2 mrg operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2442 1.1.1.2 mrg emit_insn (gen_umulhisi3 (operands[0], operands[1], operands[2]));
2443 1.1.1.2 mrg DONE;
2444 1.1.1.2 mrg }
2445 1.1.1.2 mrg })
2446 1.1 mrg
2447 1.1.1.2 mrg ;; "mulsqisi3"
2448 1.1.1.2 mrg ;; "mulshisi3"
2449 1.1.1.6 mrg (define_expand "muls<mode>si3"
2450 1.1.1.6 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
2451 1.1.1.6 mrg (mult:SI (sign_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" ""))
2452 1.1.1.6 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
2453 1.1.1.6 mrg (clobber (reg:HI 26))
2454 1.1.1.6 mrg (clobber (reg:DI 18))])]
2455 1.1.1.6 mrg "AVR_HAVE_MUL"
2456 1.1.1.6 mrg {
2457 1.1.1.6 mrg avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
2458 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_muls<mode>si3, operands, 1 << 0,
2459 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2460 1.1.1.6 mrg DONE;
2461 1.1.1.6 mrg })
2462 1.1.1.6 mrg
2463 1.1.1.6 mrg ;; "*mulsqisi3"
2464 1.1.1.6 mrg ;; "*mulshisi3"
2465 1.1.1.6 mrg (define_insn_and_split "*muls<mode>si3"
2466 1.1.1.2 mrg [(set (match_operand:SI 0 "pseudo_register_operand" "=r")
2467 1.1.1.2 mrg (mult:SI (sign_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" "r"))
2468 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "rn")))
2469 1.1.1.2 mrg (clobber (reg:HI 26))
2470 1.1.1.2 mrg (clobber (reg:DI 18))]
2471 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2472 1.1.1.2 mrg { gcc_unreachable(); }
2473 1.1.1.2 mrg "&& 1"
2474 1.1.1.2 mrg [(set (reg:HI 26)
2475 1.1.1.2 mrg (match_dup 1))
2476 1.1.1.2 mrg (set (reg:SI 18)
2477 1.1.1.2 mrg (match_dup 2))
2478 1.1.1.2 mrg (set (reg:SI 22)
2479 1.1.1.2 mrg (mult:SI (sign_extend:SI (reg:HI 26))
2480 1.1.1.2 mrg (reg:SI 18)))
2481 1.1.1.2 mrg (set (match_dup 0)
2482 1.1.1.2 mrg (reg:SI 22))]
2483 1.1.1.2 mrg {
2484 1.1.1.2 mrg /* Do the QI -> HI extension explicitely before the multiplication. */
2485 1.1.1.2 mrg /* Do the HI -> SI extension implicitely and after the multiplication. */
2486 1.1 mrg
2487 1.1.1.2 mrg if (QImode == <MODE>mode)
2488 1.1.1.2 mrg operands[1] = gen_rtx_SIGN_EXTEND (HImode, operands[1]);
2489 1.1 mrg
2490 1.1.1.2 mrg if (u16_operand (operands[2], SImode)
2491 1.1.1.2 mrg || s16_operand (operands[2], SImode))
2492 1.1.1.2 mrg {
2493 1.1.1.2 mrg rtx xop2 = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
2494 1.1 mrg
2495 1.1.1.2 mrg operands[1] = force_reg (HImode, operands[1]);
2496 1.1 mrg
2497 1.1.1.2 mrg if (u16_operand (operands[2], SImode))
2498 1.1.1.2 mrg emit_insn (gen_usmulhisi3 (operands[0], xop2, operands[1]));
2499 1.1.1.2 mrg else
2500 1.1.1.2 mrg emit_insn (gen_mulhisi3 (operands[0], operands[1], xop2));
2501 1.1 mrg
2502 1.1.1.2 mrg DONE;
2503 1.1.1.2 mrg }
2504 1.1.1.2 mrg })
2505 1.1 mrg
2506 1.1.1.2 mrg ;; One-extend operand 1
2507 1.1 mrg
2508 1.1.1.6 mrg (define_expand "mulohisi3"
2509 1.1.1.6 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
2510 1.1.1.6 mrg (mult:SI (not:SI (zero_extend:SI
2511 1.1.1.6 mrg (not:HI (match_operand:HI 1 "pseudo_register_operand" ""))))
2512 1.1.1.6 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
2513 1.1.1.6 mrg (clobber (reg:HI 26))
2514 1.1.1.6 mrg (clobber (reg:DI 18))])]
2515 1.1.1.6 mrg "AVR_HAVE_MUL"
2516 1.1.1.6 mrg {
2517 1.1.1.6 mrg avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
2518 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_mulohisi3, operands, 1 << 0,
2519 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2520 1.1.1.6 mrg DONE;
2521 1.1.1.6 mrg })
2522 1.1.1.6 mrg
2523 1.1.1.6 mrg (define_insn_and_split "*mulohisi3"
2524 1.1.1.2 mrg [(set (match_operand:SI 0 "pseudo_register_operand" "=r")
2525 1.1.1.2 mrg (mult:SI (not:SI (zero_extend:SI
2526 1.1.1.2 mrg (not:HI (match_operand:HI 1 "pseudo_register_operand" "r"))))
2527 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_or_const_int_operand" "rn")))
2528 1.1.1.2 mrg (clobber (reg:HI 26))
2529 1.1.1.2 mrg (clobber (reg:DI 18))]
2530 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2531 1.1.1.2 mrg { gcc_unreachable(); }
2532 1.1.1.2 mrg "&& 1"
2533 1.1.1.2 mrg [(set (reg:HI 26)
2534 1.1.1.2 mrg (match_dup 1))
2535 1.1.1.2 mrg (set (reg:SI 18)
2536 1.1.1.2 mrg (match_dup 2))
2537 1.1.1.2 mrg (set (reg:SI 22)
2538 1.1.1.2 mrg (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26))))
2539 1.1.1.2 mrg (reg:SI 18)))
2540 1.1.1.2 mrg (set (match_dup 0)
2541 1.1.1.2 mrg (reg:SI 22))])
2542 1.1 mrg
2543 1.1.1.2 mrg ;; "mulhisi3"
2544 1.1.1.2 mrg ;; "umulhisi3"
2545 1.1.1.2 mrg (define_expand "<extend_u>mulhisi3"
2546 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "register_operand" "")
2547 1.1.1.2 mrg (mult:SI (any_extend:SI (match_operand:HI 1 "register_operand" ""))
2548 1.1.1.2 mrg (any_extend:SI (match_operand:HI 2 "register_operand" ""))))
2549 1.1.1.2 mrg (clobber (reg:HI 26))
2550 1.1.1.2 mrg (clobber (reg:DI 18))])]
2551 1.1.1.6 mrg "AVR_HAVE_MUL"
2552 1.1.1.6 mrg {
2553 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_<extend_u>mulhisi3, operands, 1 << 0,
2554 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2555 1.1.1.6 mrg DONE;
2556 1.1.1.6 mrg })
2557 1.1.1.2 mrg
2558 1.1.1.2 mrg (define_expand "usmulhisi3"
2559 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "register_operand" "")
2560 1.1.1.2 mrg (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" ""))
2561 1.1.1.2 mrg (sign_extend:SI (match_operand:HI 2 "register_operand" ""))))
2562 1.1.1.2 mrg (clobber (reg:HI 26))
2563 1.1.1.2 mrg (clobber (reg:DI 18))])]
2564 1.1.1.6 mrg "AVR_HAVE_MUL"
2565 1.1.1.6 mrg {
2566 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_usmulhisi3, operands, 1 << 0,
2567 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2568 1.1.1.6 mrg DONE;
2569 1.1.1.6 mrg })
2570 1.1.1.2 mrg
2571 1.1.1.2 mrg ;; "*uumulqihisi3" "*uumulhiqisi3" "*uumulhihisi3" "*uumulqiqisi3"
2572 1.1.1.2 mrg ;; "*usmulqihisi3" "*usmulhiqisi3" "*usmulhihisi3" "*usmulqiqisi3"
2573 1.1.1.2 mrg ;; "*sumulqihisi3" "*sumulhiqisi3" "*sumulhihisi3" "*sumulqiqisi3"
2574 1.1.1.2 mrg ;; "*ssmulqihisi3" "*ssmulhiqisi3" "*ssmulhihisi3" "*ssmulqiqisi3"
2575 1.1.1.2 mrg (define_insn_and_split
2576 1.1.1.2 mrg "*<any_extend:extend_su><any_extend2:extend_su>mul<QIHI:mode><QIHI2:mode>si3"
2577 1.1.1.2 mrg [(set (match_operand:SI 0 "pseudo_register_operand" "=r")
2578 1.1.1.2 mrg (mult:SI (any_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" "r"))
2579 1.1.1.2 mrg (any_extend2:SI (match_operand:QIHI2 2 "pseudo_register_operand" "r"))))
2580 1.1.1.2 mrg (clobber (reg:HI 26))
2581 1.1.1.2 mrg (clobber (reg:DI 18))]
2582 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2583 1.1.1.2 mrg { gcc_unreachable(); }
2584 1.1.1.2 mrg "&& 1"
2585 1.1.1.2 mrg [(set (reg:HI 18)
2586 1.1.1.2 mrg (match_dup 1))
2587 1.1.1.2 mrg (set (reg:HI 26)
2588 1.1.1.2 mrg (match_dup 2))
2589 1.1.1.2 mrg (set (reg:SI 22)
2590 1.1.1.2 mrg (mult:SI (match_dup 3)
2591 1.1.1.2 mrg (match_dup 4)))
2592 1.1.1.2 mrg (set (match_dup 0)
2593 1.1.1.2 mrg (reg:SI 22))]
2594 1.1.1.2 mrg {
2595 1.1.1.2 mrg rtx xop1 = operands[1];
2596 1.1.1.2 mrg rtx xop2 = operands[2];
2597 1.1.1.2 mrg
2598 1.1.1.2 mrg /* Do the QI -> HI extension explicitely before the multiplication. */
2599 1.1.1.2 mrg /* Do the HI -> SI extension implicitely and after the multiplication. */
2600 1.1.1.2 mrg
2601 1.1.1.2 mrg if (QImode == <QIHI:MODE>mode)
2602 1.1.1.2 mrg xop1 = gen_rtx_fmt_e (<any_extend:CODE>, HImode, xop1);
2603 1.1.1.2 mrg
2604 1.1.1.2 mrg if (QImode == <QIHI2:MODE>mode)
2605 1.1.1.2 mrg xop2 = gen_rtx_fmt_e (<any_extend2:CODE>, HImode, xop2);
2606 1.1.1.2 mrg
2607 1.1.1.2 mrg if (<any_extend:CODE> == <any_extend2:CODE>
2608 1.1.1.2 mrg || <any_extend:CODE> == ZERO_EXTEND)
2609 1.1.1.2 mrg {
2610 1.1.1.2 mrg operands[1] = xop1;
2611 1.1.1.2 mrg operands[2] = xop2;
2612 1.1.1.2 mrg operands[3] = gen_rtx_fmt_e (<any_extend:CODE>, SImode, gen_rtx_REG (HImode, 18));
2613 1.1.1.2 mrg operands[4] = gen_rtx_fmt_e (<any_extend2:CODE>, SImode, gen_rtx_REG (HImode, 26));
2614 1.1.1.2 mrg }
2615 1.1.1.2 mrg else
2616 1.1.1.2 mrg {
2617 1.1.1.2 mrg /* <any_extend:CODE> = SIGN_EXTEND */
2618 1.1.1.2 mrg /* <any_extend2:CODE> = ZERO_EXTEND */
2619 1.1.1.2 mrg
2620 1.1.1.2 mrg operands[1] = xop2;
2621 1.1.1.2 mrg operands[2] = xop1;
2622 1.1.1.2 mrg operands[3] = gen_rtx_ZERO_EXTEND (SImode, gen_rtx_REG (HImode, 18));
2623 1.1.1.2 mrg operands[4] = gen_rtx_SIGN_EXTEND (SImode, gen_rtx_REG (HImode, 26));
2624 1.1.1.2 mrg }
2625 1.1.1.2 mrg })
2626 1.1.1.2 mrg
2627 1.1.1.2 mrg ;; "smulhi3_highpart"
2628 1.1.1.2 mrg ;; "umulhi3_highpart"
2629 1.1.1.2 mrg (define_expand "<extend_su>mulhi3_highpart"
2630 1.1.1.2 mrg [(set (reg:HI 18)
2631 1.1.1.2 mrg (match_operand:HI 1 "nonmemory_operand" ""))
2632 1.1.1.2 mrg (set (reg:HI 26)
2633 1.1.1.2 mrg (match_operand:HI 2 "nonmemory_operand" ""))
2634 1.1.1.2 mrg (parallel [(set (reg:HI 24)
2635 1.1.1.2 mrg (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18))
2636 1.1.1.2 mrg (any_extend:SI (reg:HI 26)))
2637 1.1.1.2 mrg (const_int 16))))
2638 1.1.1.2 mrg (clobber (reg:HI 22))])
2639 1.1 mrg (set (match_operand:HI 0 "register_operand" "")
2640 1.1.1.2 mrg (reg:HI 24))]
2641 1.1.1.6 mrg "AVR_HAVE_MUL"
2642 1.1.1.6 mrg {
2643 1.1.1.6 mrg avr_fix_inputs (operands, 1 << 2, regmask (HImode, 18));
2644 1.1.1.6 mrg })
2645 1.1 mrg
2646 1.1 mrg
2647 1.1.1.2 mrg (define_insn "*mulsi3_call"
2648 1.1.1.2 mrg [(set (reg:SI 22)
2649 1.1.1.2 mrg (mult:SI (reg:SI 22)
2650 1.1.1.2 mrg (reg:SI 18)))
2651 1.1.1.2 mrg (clobber (reg:HI 26))]
2652 1.1.1.2 mrg "AVR_HAVE_MUL"
2653 1.1.1.2 mrg "%~call __mulsi3"
2654 1.1.1.2 mrg [(set_attr "type" "xcall")
2655 1.1.1.2 mrg (set_attr "cc" "clobber")])
2656 1.1 mrg
2657 1.1.1.2 mrg ;; "*mulhisi3_call"
2658 1.1.1.2 mrg ;; "*umulhisi3_call"
2659 1.1.1.2 mrg (define_insn "*<extend_u>mulhisi3_call"
2660 1.1.1.2 mrg [(set (reg:SI 22)
2661 1.1.1.2 mrg (mult:SI (any_extend:SI (reg:HI 18))
2662 1.1.1.2 mrg (any_extend:SI (reg:HI 26))))]
2663 1.1.1.2 mrg "AVR_HAVE_MUL"
2664 1.1.1.2 mrg "%~call __<extend_u>mulhisi3"
2665 1.1.1.2 mrg [(set_attr "type" "xcall")
2666 1.1.1.2 mrg (set_attr "cc" "clobber")])
2667 1.1 mrg
2668 1.1.1.2 mrg ;; "*umulhi3_highpart_call"
2669 1.1.1.2 mrg ;; "*smulhi3_highpart_call"
2670 1.1.1.2 mrg (define_insn "*<extend_su>mulhi3_highpart_call"
2671 1.1.1.2 mrg [(set (reg:HI 24)
2672 1.1.1.2 mrg (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18))
2673 1.1.1.2 mrg (any_extend:SI (reg:HI 26)))
2674 1.1.1.2 mrg (const_int 16))))
2675 1.1.1.2 mrg (clobber (reg:HI 22))]
2676 1.1.1.2 mrg "AVR_HAVE_MUL"
2677 1.1.1.2 mrg "%~call __<extend_u>mulhisi3"
2678 1.1.1.2 mrg [(set_attr "type" "xcall")
2679 1.1.1.2 mrg (set_attr "cc" "clobber")])
2680 1.1 mrg
2681 1.1.1.2 mrg (define_insn "*usmulhisi3_call"
2682 1.1.1.2 mrg [(set (reg:SI 22)
2683 1.1.1.2 mrg (mult:SI (zero_extend:SI (reg:HI 18))
2684 1.1.1.2 mrg (sign_extend:SI (reg:HI 26))))]
2685 1.1.1.2 mrg "AVR_HAVE_MUL"
2686 1.1.1.2 mrg "%~call __usmulhisi3"
2687 1.1.1.2 mrg [(set_attr "type" "xcall")
2688 1.1 mrg (set_attr "cc" "clobber")])
2689 1.1 mrg
2690 1.1.1.2 mrg (define_insn "*mul<extend_su>hisi3_call"
2691 1.1.1.2 mrg [(set (reg:SI 22)
2692 1.1.1.2 mrg (mult:SI (any_extend:SI (reg:HI 26))
2693 1.1.1.2 mrg (reg:SI 18)))]
2694 1.1.1.2 mrg "AVR_HAVE_MUL"
2695 1.1.1.2 mrg "%~call __mul<extend_su>hisi3"
2696 1.1.1.2 mrg [(set_attr "type" "xcall")
2697 1.1.1.2 mrg (set_attr "cc" "clobber")])
2698 1.1 mrg
2699 1.1.1.2 mrg (define_insn "*mulohisi3_call"
2700 1.1.1.2 mrg [(set (reg:SI 22)
2701 1.1.1.2 mrg (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26))))
2702 1.1.1.2 mrg (reg:SI 18)))]
2703 1.1.1.2 mrg "AVR_HAVE_MUL"
2704 1.1.1.2 mrg "%~call __mulohisi3"
2705 1.1.1.2 mrg [(set_attr "type" "xcall")
2706 1.1.1.2 mrg (set_attr "cc" "clobber")])
2707 1.1 mrg
2708 1.1.1.2 mrg ; / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / %
2709 1.1.1.2 mrg ; divmod
2710 1.1 mrg
2711 1.1.1.2 mrg ;; Generate lib1funcs.S calls ourselves, because:
2712 1.1.1.2 mrg ;; - we know exactly which registers are clobbered (for QI and HI
2713 1.1.1.2 mrg ;; modes, some of the call-used registers are preserved)
2714 1.1.1.2 mrg ;; - we get both the quotient and the remainder at no extra cost
2715 1.1.1.2 mrg ;; - we split the patterns only after the first CSE passes because
2716 1.1.1.2 mrg ;; CSE has problems to operate on hard regs.
2717 1.1.1.2 mrg ;;
2718 1.1.1.2 mrg (define_insn_and_split "divmodqi4"
2719 1.1.1.2 mrg [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
2720 1.1.1.2 mrg (div:QI (match_operand:QI 1 "pseudo_register_operand" "")
2721 1.1.1.2 mrg (match_operand:QI 2 "pseudo_register_operand" "")))
2722 1.1.1.2 mrg (set (match_operand:QI 3 "pseudo_register_operand" "")
2723 1.1.1.2 mrg (mod:QI (match_dup 1) (match_dup 2)))
2724 1.1.1.2 mrg (clobber (reg:QI 22))
2725 1.1.1.2 mrg (clobber (reg:QI 23))
2726 1.1.1.2 mrg (clobber (reg:QI 24))
2727 1.1.1.2 mrg (clobber (reg:QI 25))])]
2728 1.1 mrg ""
2729 1.1.1.2 mrg "this divmodqi4 pattern should have been splitted;"
2730 1.1 mrg ""
2731 1.1.1.2 mrg [(set (reg:QI 24) (match_dup 1))
2732 1.1.1.2 mrg (set (reg:QI 22) (match_dup 2))
2733 1.1.1.2 mrg (parallel [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
2734 1.1.1.2 mrg (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
2735 1.1.1.2 mrg (clobber (reg:QI 22))
2736 1.1.1.2 mrg (clobber (reg:QI 23))])
2737 1.1.1.2 mrg (set (match_dup 0) (reg:QI 24))
2738 1.1.1.2 mrg (set (match_dup 3) (reg:QI 25))])
2739 1.1 mrg
2740 1.1.1.2 mrg (define_insn "*divmodqi4_call"
2741 1.1.1.2 mrg [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
2742 1.1.1.2 mrg (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
2743 1.1.1.2 mrg (clobber (reg:QI 22))
2744 1.1.1.2 mrg (clobber (reg:QI 23))]
2745 1.1 mrg ""
2746 1.1.1.2 mrg "%~call __divmodqi4"
2747 1.1.1.2 mrg [(set_attr "type" "xcall")
2748 1.1.1.2 mrg (set_attr "cc" "clobber")])
2749 1.1 mrg
2750 1.1.1.2 mrg (define_insn_and_split "udivmodqi4"
2751 1.1.1.2 mrg [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
2752 1.1.1.2 mrg (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "")
2753 1.1.1.2 mrg (match_operand:QI 2 "pseudo_register_operand" "")))
2754 1.1.1.2 mrg (set (match_operand:QI 3 "pseudo_register_operand" "")
2755 1.1.1.2 mrg (umod:QI (match_dup 1) (match_dup 2)))
2756 1.1.1.2 mrg (clobber (reg:QI 22))
2757 1.1.1.2 mrg (clobber (reg:QI 23))
2758 1.1.1.2 mrg (clobber (reg:QI 24))
2759 1.1.1.2 mrg (clobber (reg:QI 25))])]
2760 1.1 mrg ""
2761 1.1.1.2 mrg "this udivmodqi4 pattern should have been splitted;"
2762 1.1 mrg ""
2763 1.1.1.2 mrg [(set (reg:QI 24) (match_dup 1))
2764 1.1.1.2 mrg (set (reg:QI 22) (match_dup 2))
2765 1.1.1.2 mrg (parallel [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
2766 1.1.1.2 mrg (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
2767 1.1.1.2 mrg (clobber (reg:QI 23))])
2768 1.1.1.2 mrg (set (match_dup 0) (reg:QI 24))
2769 1.1.1.2 mrg (set (match_dup 3) (reg:QI 25))])
2770 1.1.1.2 mrg
2771 1.1.1.2 mrg (define_insn "*udivmodqi4_call"
2772 1.1.1.2 mrg [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
2773 1.1.1.2 mrg (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
2774 1.1.1.2 mrg (clobber (reg:QI 23))]
2775 1.1.1.2 mrg ""
2776 1.1.1.2 mrg "%~call __udivmodqi4"
2777 1.1.1.2 mrg [(set_attr "type" "xcall")
2778 1.1.1.2 mrg (set_attr "cc" "clobber")])
2779 1.1.1.2 mrg
2780 1.1.1.2 mrg (define_insn_and_split "divmodhi4"
2781 1.1.1.2 mrg [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
2782 1.1.1.2 mrg (div:HI (match_operand:HI 1 "pseudo_register_operand" "")
2783 1.1.1.2 mrg (match_operand:HI 2 "pseudo_register_operand" "")))
2784 1.1.1.2 mrg (set (match_operand:HI 3 "pseudo_register_operand" "")
2785 1.1.1.2 mrg (mod:HI (match_dup 1) (match_dup 2)))
2786 1.1.1.2 mrg (clobber (reg:QI 21))
2787 1.1.1.2 mrg (clobber (reg:HI 22))
2788 1.1.1.2 mrg (clobber (reg:HI 24))
2789 1.1.1.2 mrg (clobber (reg:HI 26))])]
2790 1.1.1.2 mrg ""
2791 1.1.1.2 mrg "this should have been splitted;"
2792 1.1.1.2 mrg ""
2793 1.1.1.2 mrg [(set (reg:HI 24) (match_dup 1))
2794 1.1.1.2 mrg (set (reg:HI 22) (match_dup 2))
2795 1.1.1.2 mrg (parallel [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
2796 1.1.1.2 mrg (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
2797 1.1.1.2 mrg (clobber (reg:HI 26))
2798 1.1.1.2 mrg (clobber (reg:QI 21))])
2799 1.1.1.2 mrg (set (match_dup 0) (reg:HI 22))
2800 1.1.1.2 mrg (set (match_dup 3) (reg:HI 24))])
2801 1.1.1.2 mrg
2802 1.1.1.2 mrg (define_insn "*divmodhi4_call"
2803 1.1.1.2 mrg [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
2804 1.1.1.2 mrg (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
2805 1.1.1.2 mrg (clobber (reg:HI 26))
2806 1.1.1.2 mrg (clobber (reg:QI 21))]
2807 1.1.1.2 mrg ""
2808 1.1.1.2 mrg "%~call __divmodhi4"
2809 1.1.1.2 mrg [(set_attr "type" "xcall")
2810 1.1.1.2 mrg (set_attr "cc" "clobber")])
2811 1.1.1.2 mrg
2812 1.1.1.2 mrg (define_insn_and_split "udivmodhi4"
2813 1.1.1.2 mrg [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
2814 1.1.1.2 mrg (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "")
2815 1.1.1.2 mrg (match_operand:HI 2 "pseudo_register_operand" "")))
2816 1.1.1.2 mrg (set (match_operand:HI 3 "pseudo_register_operand" "")
2817 1.1.1.2 mrg (umod:HI (match_dup 1) (match_dup 2)))
2818 1.1.1.2 mrg (clobber (reg:QI 21))
2819 1.1.1.2 mrg (clobber (reg:HI 22))
2820 1.1.1.2 mrg (clobber (reg:HI 24))
2821 1.1.1.2 mrg (clobber (reg:HI 26))])]
2822 1.1.1.2 mrg ""
2823 1.1.1.2 mrg "this udivmodhi4 pattern should have been splitted.;"
2824 1.1.1.2 mrg ""
2825 1.1.1.2 mrg [(set (reg:HI 24) (match_dup 1))
2826 1.1.1.2 mrg (set (reg:HI 22) (match_dup 2))
2827 1.1.1.2 mrg (parallel [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
2828 1.1.1.2 mrg (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
2829 1.1.1.2 mrg (clobber (reg:HI 26))
2830 1.1.1.2 mrg (clobber (reg:QI 21))])
2831 1.1.1.2 mrg (set (match_dup 0) (reg:HI 22))
2832 1.1.1.2 mrg (set (match_dup 3) (reg:HI 24))])
2833 1.1.1.2 mrg
2834 1.1.1.2 mrg (define_insn "*udivmodhi4_call"
2835 1.1.1.2 mrg [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
2836 1.1.1.2 mrg (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
2837 1.1.1.2 mrg (clobber (reg:HI 26))
2838 1.1.1.2 mrg (clobber (reg:QI 21))]
2839 1.1.1.2 mrg ""
2840 1.1.1.2 mrg "%~call __udivmodhi4"
2841 1.1.1.2 mrg [(set_attr "type" "xcall")
2842 1.1.1.2 mrg (set_attr "cc" "clobber")])
2843 1.1.1.2 mrg
2844 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2845 1.1.1.2 mrg ;; 24-bit multiply
2846 1.1.1.2 mrg
2847 1.1.1.2 mrg ;; To support widening multiplication with constant we postpone
2848 1.1.1.2 mrg ;; expanding to the implicit library call until post combine and
2849 1.1.1.2 mrg ;; prior to register allocation. Clobber all hard registers that
2850 1.1.1.2 mrg ;; might be used by the (widening) multiply until it is split and
2851 1.1.1.2 mrg ;; it's final register footprint is worked out.
2852 1.1.1.2 mrg
2853 1.1.1.2 mrg (define_expand "mulpsi3"
2854 1.1.1.2 mrg [(parallel [(set (match_operand:PSI 0 "register_operand" "")
2855 1.1.1.2 mrg (mult:PSI (match_operand:PSI 1 "register_operand" "")
2856 1.1.1.2 mrg (match_operand:PSI 2 "nonmemory_operand" "")))
2857 1.1.1.2 mrg (clobber (reg:HI 26))
2858 1.1.1.2 mrg (clobber (reg:DI 18))])]
2859 1.1.1.2 mrg "AVR_HAVE_MUL"
2860 1.1.1.2 mrg {
2861 1.1.1.2 mrg if (s8_operand (operands[2], PSImode))
2862 1.1.1.2 mrg {
2863 1.1.1.2 mrg rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
2864 1.1.1.2 mrg emit_insn (gen_mulsqipsi3 (operands[0], reg, operands[1]));
2865 1.1.1.2 mrg DONE;
2866 1.1.1.2 mrg }
2867 1.1.1.6 mrg
2868 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_mulpsi3, operands, 1u << 0,
2869 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2870 1.1.1.6 mrg DONE;
2871 1.1.1.2 mrg })
2872 1.1.1.2 mrg
2873 1.1.1.2 mrg (define_insn "*umulqihipsi3"
2874 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=&r")
2875 1.1.1.2 mrg (mult:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))
2876 1.1.1.2 mrg (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
2877 1.1.1.2 mrg "AVR_HAVE_MUL"
2878 1.1.1.2 mrg "mul %1,%A2
2879 1.1.1.2 mrg movw %A0,r0
2880 1.1.1.2 mrg mul %1,%B2
2881 1.1.1.2 mrg clr %C0
2882 1.1.1.2 mrg add %B0,r0
2883 1.1.1.2 mrg adc %C0,r1
2884 1.1.1.2 mrg clr __zero_reg__"
2885 1.1.1.2 mrg [(set_attr "length" "7")
2886 1.1.1.2 mrg (set_attr "cc" "clobber")])
2887 1.1.1.2 mrg
2888 1.1.1.2 mrg (define_insn "*umulhiqipsi3"
2889 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=&r")
2890 1.1.1.2 mrg (mult:PSI (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))
2891 1.1.1.2 mrg (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))))]
2892 1.1.1.2 mrg "AVR_HAVE_MUL"
2893 1.1.1.2 mrg "mul %1,%A2
2894 1.1.1.2 mrg movw %A0,r0
2895 1.1.1.2 mrg mul %1,%B2
2896 1.1.1.2 mrg add %B0,r0
2897 1.1.1.2 mrg mov %C0,r1
2898 1.1.1.2 mrg clr __zero_reg__
2899 1.1.1.2 mrg adc %C0,__zero_reg__"
2900 1.1.1.2 mrg [(set_attr "length" "7")
2901 1.1.1.2 mrg (set_attr "cc" "clobber")])
2902 1.1.1.2 mrg
2903 1.1.1.6 mrg (define_expand "mulsqipsi3"
2904 1.1.1.6 mrg [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
2905 1.1.1.6 mrg (mult:PSI (sign_extend:PSI (match_operand:QI 1 "pseudo_register_operand" ""))
2906 1.1.1.6 mrg (match_operand:PSI 2 "pseudo_register_or_const_int_operand""")))
2907 1.1.1.6 mrg (clobber (reg:HI 26))
2908 1.1.1.6 mrg (clobber (reg:DI 18))])]
2909 1.1.1.6 mrg "AVR_HAVE_MUL"
2910 1.1.1.6 mrg {
2911 1.1.1.6 mrg avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
2912 1.1.1.6 mrg if (avr_emit3_fix_outputs (gen_mulsqipsi3, operands, 1 << 0,
2913 1.1.1.6 mrg regmask (DImode, 18) | regmask (HImode, 26)))
2914 1.1.1.6 mrg DONE;
2915 1.1.1.6 mrg })
2916 1.1.1.6 mrg
2917 1.1.1.6 mrg (define_insn_and_split "*mulsqipsi3"
2918 1.1.1.2 mrg [(set (match_operand:PSI 0 "pseudo_register_operand" "=r")
2919 1.1.1.2 mrg (mult:PSI (sign_extend:PSI (match_operand:QI 1 "pseudo_register_operand" "r"))
2920 1.1.1.2 mrg (match_operand:PSI 2 "pseudo_register_or_const_int_operand" "rn")))
2921 1.1.1.2 mrg (clobber (reg:HI 26))
2922 1.1.1.2 mrg (clobber (reg:DI 18))]
2923 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2924 1.1.1.2 mrg { gcc_unreachable(); }
2925 1.1.1.2 mrg "&& 1"
2926 1.1.1.2 mrg [(set (reg:QI 25)
2927 1.1.1.2 mrg (match_dup 1))
2928 1.1.1.2 mrg (set (reg:PSI 22)
2929 1.1.1.2 mrg (match_dup 2))
2930 1.1.1.2 mrg (set (reg:PSI 18)
2931 1.1.1.2 mrg (mult:PSI (sign_extend:PSI (reg:QI 25))
2932 1.1.1.2 mrg (reg:PSI 22)))
2933 1.1.1.2 mrg (set (match_dup 0)
2934 1.1.1.2 mrg (reg:PSI 18))])
2935 1.1.1.2 mrg
2936 1.1.1.2 mrg (define_insn_and_split "*mulpsi3"
2937 1.1.1.2 mrg [(set (match_operand:PSI 0 "pseudo_register_operand" "=r")
2938 1.1.1.2 mrg (mult:PSI (match_operand:PSI 1 "pseudo_register_operand" "r")
2939 1.1.1.2 mrg (match_operand:PSI 2 "pseudo_register_or_const_int_operand" "rn")))
2940 1.1.1.2 mrg (clobber (reg:HI 26))
2941 1.1.1.2 mrg (clobber (reg:DI 18))]
2942 1.1.1.2 mrg "AVR_HAVE_MUL && !reload_completed"
2943 1.1.1.2 mrg { gcc_unreachable(); }
2944 1.1.1.2 mrg "&& 1"
2945 1.1.1.2 mrg [(set (reg:PSI 18)
2946 1.1.1.2 mrg (match_dup 1))
2947 1.1.1.2 mrg (set (reg:PSI 22)
2948 1.1.1.2 mrg (match_dup 2))
2949 1.1.1.2 mrg (parallel [(set (reg:PSI 22)
2950 1.1.1.2 mrg (mult:PSI (reg:PSI 22)
2951 1.1.1.2 mrg (reg:PSI 18)))
2952 1.1.1.2 mrg (clobber (reg:QI 21))
2953 1.1.1.2 mrg (clobber (reg:QI 25))
2954 1.1.1.2 mrg (clobber (reg:HI 26))])
2955 1.1.1.2 mrg (set (match_dup 0)
2956 1.1.1.2 mrg (reg:PSI 22))]
2957 1.1.1.2 mrg {
2958 1.1.1.2 mrg if (s8_operand (operands[2], PSImode))
2959 1.1.1.2 mrg {
2960 1.1.1.2 mrg rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
2961 1.1.1.2 mrg emit_insn (gen_mulsqipsi3 (operands[0], reg, operands[1]));
2962 1.1.1.2 mrg DONE;
2963 1.1.1.2 mrg }
2964 1.1.1.2 mrg })
2965 1.1.1.2 mrg
2966 1.1.1.2 mrg (define_insn "*mulsqipsi3.libgcc"
2967 1.1.1.2 mrg [(set (reg:PSI 18)
2968 1.1.1.2 mrg (mult:PSI (sign_extend:PSI (reg:QI 25))
2969 1.1.1.2 mrg (reg:PSI 22)))]
2970 1.1.1.2 mrg "AVR_HAVE_MUL"
2971 1.1.1.2 mrg "%~call __mulsqipsi3"
2972 1.1.1.2 mrg [(set_attr "type" "xcall")
2973 1.1.1.2 mrg (set_attr "cc" "clobber")])
2974 1.1.1.2 mrg
2975 1.1.1.2 mrg (define_insn "*mulpsi3.libgcc"
2976 1.1.1.2 mrg [(set (reg:PSI 22)
2977 1.1.1.2 mrg (mult:PSI (reg:PSI 22)
2978 1.1.1.2 mrg (reg:PSI 18)))
2979 1.1.1.2 mrg (clobber (reg:QI 21))
2980 1.1.1.2 mrg (clobber (reg:QI 25))
2981 1.1.1.2 mrg (clobber (reg:HI 26))]
2982 1.1.1.2 mrg "AVR_HAVE_MUL"
2983 1.1.1.2 mrg "%~call __mulpsi3"
2984 1.1.1.2 mrg [(set_attr "type" "xcall")
2985 1.1.1.2 mrg (set_attr "cc" "clobber")])
2986 1.1.1.2 mrg
2987 1.1.1.2 mrg
2988 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2989 1.1.1.2 mrg ;; 24-bit signed/unsigned division and modulo.
2990 1.1.1.2 mrg ;; Notice that the libgcc implementation return the quotient in R22
2991 1.1.1.2 mrg ;; and the remainder in R18 whereas the 32-bit [u]divmodsi4
2992 1.1.1.2 mrg ;; implementation works the other way round.
2993 1.1.1.2 mrg
2994 1.1.1.2 mrg (define_insn_and_split "divmodpsi4"
2995 1.1.1.2 mrg [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
2996 1.1.1.2 mrg (div:PSI (match_operand:PSI 1 "pseudo_register_operand" "")
2997 1.1.1.2 mrg (match_operand:PSI 2 "pseudo_register_operand" "")))
2998 1.1.1.2 mrg (set (match_operand:PSI 3 "pseudo_register_operand" "")
2999 1.1.1.2 mrg (mod:PSI (match_dup 1)
3000 1.1.1.2 mrg (match_dup 2)))
3001 1.1.1.2 mrg (clobber (reg:DI 18))
3002 1.1.1.2 mrg (clobber (reg:QI 26))])]
3003 1.1.1.2 mrg ""
3004 1.1.1.2 mrg { gcc_unreachable(); }
3005 1.1.1.2 mrg ""
3006 1.1.1.2 mrg [(set (reg:PSI 22) (match_dup 1))
3007 1.1.1.2 mrg (set (reg:PSI 18) (match_dup 2))
3008 1.1.1.2 mrg (parallel [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18)))
3009 1.1.1.2 mrg (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18)))
3010 1.1.1.2 mrg (clobber (reg:QI 21))
3011 1.1.1.2 mrg (clobber (reg:QI 25))
3012 1.1.1.2 mrg (clobber (reg:QI 26))])
3013 1.1.1.2 mrg (set (match_dup 0) (reg:PSI 22))
3014 1.1.1.2 mrg (set (match_dup 3) (reg:PSI 18))])
3015 1.1.1.2 mrg
3016 1.1.1.2 mrg (define_insn "*divmodpsi4_call"
3017 1.1.1.2 mrg [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18)))
3018 1.1.1.2 mrg (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18)))
3019 1.1.1.2 mrg (clobber (reg:QI 21))
3020 1.1.1.2 mrg (clobber (reg:QI 25))
3021 1.1.1.2 mrg (clobber (reg:QI 26))]
3022 1.1.1.2 mrg ""
3023 1.1.1.2 mrg "%~call __divmodpsi4"
3024 1.1.1.2 mrg [(set_attr "type" "xcall")
3025 1.1.1.2 mrg (set_attr "cc" "clobber")])
3026 1.1.1.2 mrg
3027 1.1.1.2 mrg (define_insn_and_split "udivmodpsi4"
3028 1.1.1.2 mrg [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
3029 1.1.1.2 mrg (udiv:PSI (match_operand:PSI 1 "pseudo_register_operand" "")
3030 1.1.1.2 mrg (match_operand:PSI 2 "pseudo_register_operand" "")))
3031 1.1.1.2 mrg (set (match_operand:PSI 3 "pseudo_register_operand" "")
3032 1.1.1.2 mrg (umod:PSI (match_dup 1)
3033 1.1.1.2 mrg (match_dup 2)))
3034 1.1.1.2 mrg (clobber (reg:DI 18))
3035 1.1.1.2 mrg (clobber (reg:QI 26))])]
3036 1.1.1.2 mrg ""
3037 1.1.1.2 mrg { gcc_unreachable(); }
3038 1.1.1.2 mrg ""
3039 1.1.1.2 mrg [(set (reg:PSI 22) (match_dup 1))
3040 1.1.1.2 mrg (set (reg:PSI 18) (match_dup 2))
3041 1.1.1.2 mrg (parallel [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18)))
3042 1.1.1.2 mrg (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18)))
3043 1.1.1.2 mrg (clobber (reg:QI 21))
3044 1.1.1.2 mrg (clobber (reg:QI 25))
3045 1.1.1.2 mrg (clobber (reg:QI 26))])
3046 1.1.1.2 mrg (set (match_dup 0) (reg:PSI 22))
3047 1.1.1.2 mrg (set (match_dup 3) (reg:PSI 18))])
3048 1.1.1.2 mrg
3049 1.1.1.2 mrg (define_insn "*udivmodpsi4_call"
3050 1.1.1.2 mrg [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18)))
3051 1.1.1.2 mrg (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18)))
3052 1.1.1.2 mrg (clobber (reg:QI 21))
3053 1.1.1.2 mrg (clobber (reg:QI 25))
3054 1.1.1.2 mrg (clobber (reg:QI 26))]
3055 1.1.1.2 mrg ""
3056 1.1.1.2 mrg "%~call __udivmodpsi4"
3057 1.1.1.2 mrg [(set_attr "type" "xcall")
3058 1.1.1.2 mrg (set_attr "cc" "clobber")])
3059 1.1.1.2 mrg
3060 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3061 1.1.1.2 mrg
3062 1.1.1.2 mrg (define_insn_and_split "divmodsi4"
3063 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
3064 1.1.1.2 mrg (div:SI (match_operand:SI 1 "pseudo_register_operand" "")
3065 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_operand" "")))
3066 1.1.1.2 mrg (set (match_operand:SI 3 "pseudo_register_operand" "")
3067 1.1.1.2 mrg (mod:SI (match_dup 1) (match_dup 2)))
3068 1.1.1.2 mrg (clobber (reg:SI 18))
3069 1.1.1.2 mrg (clobber (reg:SI 22))
3070 1.1.1.2 mrg (clobber (reg:HI 26))
3071 1.1.1.2 mrg (clobber (reg:HI 30))])]
3072 1.1.1.2 mrg ""
3073 1.1.1.2 mrg "this divmodsi4 pattern should have been splitted;"
3074 1.1.1.2 mrg ""
3075 1.1.1.2 mrg [(set (reg:SI 22) (match_dup 1))
3076 1.1.1.2 mrg (set (reg:SI 18) (match_dup 2))
3077 1.1.1.2 mrg (parallel [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
3078 1.1.1.2 mrg (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
3079 1.1.1.2 mrg (clobber (reg:HI 26))
3080 1.1.1.2 mrg (clobber (reg:HI 30))])
3081 1.1.1.2 mrg (set (match_dup 0) (reg:SI 18))
3082 1.1.1.2 mrg (set (match_dup 3) (reg:SI 22))])
3083 1.1.1.2 mrg
3084 1.1.1.2 mrg (define_insn "*divmodsi4_call"
3085 1.1.1.2 mrg [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
3086 1.1.1.2 mrg (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
3087 1.1.1.2 mrg (clobber (reg:HI 26))
3088 1.1.1.2 mrg (clobber (reg:HI 30))]
3089 1.1.1.2 mrg ""
3090 1.1.1.2 mrg "%~call __divmodsi4"
3091 1.1.1.2 mrg [(set_attr "type" "xcall")
3092 1.1.1.2 mrg (set_attr "cc" "clobber")])
3093 1.1.1.2 mrg
3094 1.1.1.2 mrg (define_insn_and_split "udivmodsi4"
3095 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
3096 1.1.1.2 mrg (udiv:SI (match_operand:SI 1 "pseudo_register_operand" "")
3097 1.1.1.2 mrg (match_operand:SI 2 "pseudo_register_operand" "")))
3098 1.1.1.2 mrg (set (match_operand:SI 3 "pseudo_register_operand" "")
3099 1.1.1.2 mrg (umod:SI (match_dup 1) (match_dup 2)))
3100 1.1.1.2 mrg (clobber (reg:SI 18))
3101 1.1.1.2 mrg (clobber (reg:SI 22))
3102 1.1.1.2 mrg (clobber (reg:HI 26))
3103 1.1.1.2 mrg (clobber (reg:HI 30))])]
3104 1.1.1.2 mrg ""
3105 1.1.1.2 mrg "this udivmodsi4 pattern should have been splitted;"
3106 1.1.1.2 mrg ""
3107 1.1.1.2 mrg [(set (reg:SI 22) (match_dup 1))
3108 1.1.1.2 mrg (set (reg:SI 18) (match_dup 2))
3109 1.1.1.2 mrg (parallel [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
3110 1.1.1.2 mrg (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
3111 1.1.1.2 mrg (clobber (reg:HI 26))
3112 1.1.1.2 mrg (clobber (reg:HI 30))])
3113 1.1.1.2 mrg (set (match_dup 0) (reg:SI 18))
3114 1.1.1.2 mrg (set (match_dup 3) (reg:SI 22))])
3115 1.1.1.2 mrg
3116 1.1.1.2 mrg (define_insn "*udivmodsi4_call"
3117 1.1.1.2 mrg [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
3118 1.1.1.2 mrg (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
3119 1.1.1.2 mrg (clobber (reg:HI 26))
3120 1.1.1.2 mrg (clobber (reg:HI 30))]
3121 1.1.1.2 mrg ""
3122 1.1.1.2 mrg "%~call __udivmodsi4"
3123 1.1.1.2 mrg [(set_attr "type" "xcall")
3124 1.1.1.2 mrg (set_attr "cc" "clobber")])
3125 1.1.1.2 mrg
3126 1.1.1.2 mrg ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3127 1.1.1.2 mrg ; and
3128 1.1.1.2 mrg
3129 1.1.1.2 mrg (define_insn "andqi3"
3130 1.1.1.9 mrg [(set (match_operand:QI 0 "register_operand" "=??r,d,*l")
3131 1.1.1.9 mrg (and:QI (match_operand:QI 1 "register_operand" "%0,0,0")
3132 1.1.1.9 mrg (match_operand:QI 2 "nonmemory_operand" "r,i,Ca1")))]
3133 1.1.1.2 mrg ""
3134 1.1.1.2 mrg "@
3135 1.1.1.2 mrg and %0,%2
3136 1.1.1.9 mrg andi %0,lo8(%2)
3137 1.1.1.9 mrg * return avr_out_bitop (insn, operands, NULL);"
3138 1.1.1.9 mrg [(set_attr "length" "1,1,2")
3139 1.1.1.9 mrg (set_attr "cc" "set_zn,set_zn,none")])
3140 1.1.1.2 mrg
3141 1.1.1.2 mrg (define_insn "andhi3"
3142 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r")
3143 1.1.1.2 mrg (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0")
3144 1.1.1.2 mrg (match_operand:HI 2 "nonmemory_operand" "r,s,n,Ca2,n")))
3145 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X ,&d"))]
3146 1.1.1.2 mrg ""
3147 1.1.1.2 mrg {
3148 1.1.1.2 mrg if (which_alternative == 0)
3149 1.1.1.2 mrg return "and %A0,%A2\;and %B0,%B2";
3150 1.1.1.2 mrg else if (which_alternative == 1)
3151 1.1.1.2 mrg return "andi %A0,lo8(%2)\;andi %B0,hi8(%2)";
3152 1.1.1.2 mrg
3153 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3154 1.1.1.2 mrg }
3155 1.1.1.2 mrg [(set_attr "length" "2,2,2,4,4")
3156 1.1.1.2 mrg (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")
3157 1.1.1.2 mrg (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")])
3158 1.1.1.2 mrg
3159 1.1.1.2 mrg (define_insn "andpsi3"
3160 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r")
3161 1.1.1.2 mrg (and:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0")
3162 1.1.1.2 mrg (match_operand:PSI 2 "nonmemory_operand" "r,n,Ca3,n")))
3163 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X ,&d"))]
3164 1.1.1.2 mrg ""
3165 1.1.1.2 mrg {
3166 1.1.1.2 mrg if (which_alternative == 0)
3167 1.1.1.2 mrg return "and %A0,%A2" CR_TAB
3168 1.1.1.2 mrg "and %B0,%B2" CR_TAB
3169 1.1.1.2 mrg "and %C0,%C2";
3170 1.1.1.2 mrg
3171 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3172 1.1.1.2 mrg }
3173 1.1.1.2 mrg [(set_attr "length" "3,3,6,6")
3174 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
3175 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber,clobber")])
3176 1.1.1.2 mrg
3177 1.1.1.2 mrg (define_insn "andsi3"
3178 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r")
3179 1.1.1.2 mrg (and:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0")
3180 1.1.1.2 mrg (match_operand:SI 2 "nonmemory_operand" "r,n,Ca4,n")))
3181 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X ,&d"))]
3182 1.1.1.2 mrg ""
3183 1.1.1.2 mrg {
3184 1.1.1.2 mrg if (which_alternative == 0)
3185 1.1.1.2 mrg return "and %0,%2" CR_TAB
3186 1.1.1.2 mrg "and %B0,%B2" CR_TAB
3187 1.1.1.2 mrg "and %C0,%C2" CR_TAB
3188 1.1.1.2 mrg "and %D0,%D2";
3189 1.1.1.2 mrg
3190 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3191 1.1.1.2 mrg }
3192 1.1.1.2 mrg [(set_attr "length" "4,4,8,8")
3193 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
3194 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber,clobber")])
3195 1.1.1.2 mrg
3196 1.1.1.2 mrg (define_peephole2 ; andi
3197 1.1.1.2 mrg [(set (match_operand:QI 0 "d_register_operand" "")
3198 1.1.1.2 mrg (and:QI (match_dup 0)
3199 1.1.1.2 mrg (match_operand:QI 1 "const_int_operand" "")))
3200 1.1.1.2 mrg (set (match_dup 0)
3201 1.1.1.2 mrg (and:QI (match_dup 0)
3202 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
3203 1.1.1.2 mrg ""
3204 1.1.1.2 mrg [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
3205 1.1.1.2 mrg {
3206 1.1.1.2 mrg operands[1] = GEN_INT (INTVAL (operands[1]) & INTVAL (operands[2]));
3207 1.1.1.2 mrg })
3208 1.1.1.2 mrg
3209 1.1.1.2 mrg ;;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3210 1.1.1.2 mrg ;; ior
3211 1.1.1.2 mrg
3212 1.1.1.2 mrg (define_insn "iorqi3"
3213 1.1.1.9 mrg [(set (match_operand:QI 0 "register_operand" "=??r,d,*l")
3214 1.1.1.9 mrg (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0")
3215 1.1.1.9 mrg (match_operand:QI 2 "nonmemory_operand" "r,i,Co1")))]
3216 1.1.1.2 mrg ""
3217 1.1.1.2 mrg "@
3218 1.1.1.2 mrg or %0,%2
3219 1.1.1.9 mrg ori %0,lo8(%2)
3220 1.1.1.9 mrg * return avr_out_bitop (insn, operands, NULL);"
3221 1.1.1.9 mrg [(set_attr "length" "1,1,2")
3222 1.1.1.9 mrg (set_attr "cc" "set_zn,set_zn,none")])
3223 1.1.1.2 mrg
3224 1.1.1.2 mrg (define_insn "iorhi3"
3225 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r")
3226 1.1.1.2 mrg (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0")
3227 1.1.1.2 mrg (match_operand:HI 2 "nonmemory_operand" "r,s,n,Co2,n")))
3228 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X ,&d"))]
3229 1.1.1.2 mrg ""
3230 1.1.1.2 mrg {
3231 1.1.1.2 mrg if (which_alternative == 0)
3232 1.1.1.2 mrg return "or %A0,%A2\;or %B0,%B2";
3233 1.1.1.2 mrg else if (which_alternative == 1)
3234 1.1.1.2 mrg return "ori %A0,lo8(%2)\;ori %B0,hi8(%2)";
3235 1.1.1.2 mrg
3236 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3237 1.1.1.2 mrg }
3238 1.1.1.2 mrg [(set_attr "length" "2,2,2,4,4")
3239 1.1.1.2 mrg (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")
3240 1.1.1.2 mrg (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")])
3241 1.1.1.2 mrg
3242 1.1.1.2 mrg (define_insn "iorpsi3"
3243 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r")
3244 1.1.1.2 mrg (ior:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0")
3245 1.1.1.2 mrg (match_operand:PSI 2 "nonmemory_operand" "r,n,Co3,n")))
3246 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X ,&d"))]
3247 1.1.1.2 mrg ""
3248 1.1.1.2 mrg {
3249 1.1.1.2 mrg if (which_alternative == 0)
3250 1.1.1.2 mrg return "or %A0,%A2" CR_TAB
3251 1.1.1.2 mrg "or %B0,%B2" CR_TAB
3252 1.1.1.2 mrg "or %C0,%C2";
3253 1.1.1.2 mrg
3254 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3255 1.1.1.2 mrg }
3256 1.1.1.2 mrg [(set_attr "length" "3,3,6,6")
3257 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
3258 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber,clobber")])
3259 1.1.1.2 mrg
3260 1.1.1.2 mrg (define_insn "iorsi3"
3261 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r")
3262 1.1.1.2 mrg (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0")
3263 1.1.1.2 mrg (match_operand:SI 2 "nonmemory_operand" "r,n,Co4,n")))
3264 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X ,&d"))]
3265 1.1.1.2 mrg ""
3266 1.1.1.2 mrg {
3267 1.1.1.2 mrg if (which_alternative == 0)
3268 1.1.1.2 mrg return "or %0,%2" CR_TAB
3269 1.1.1.2 mrg "or %B0,%B2" CR_TAB
3270 1.1.1.2 mrg "or %C0,%C2" CR_TAB
3271 1.1.1.2 mrg "or %D0,%D2";
3272 1.1.1.2 mrg
3273 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3274 1.1.1.2 mrg }
3275 1.1.1.2 mrg [(set_attr "length" "4,4,8,8")
3276 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
3277 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber,clobber")])
3278 1.1.1.2 mrg
3279 1.1.1.2 mrg ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3280 1.1.1.2 mrg ;; xor
3281 1.1.1.2 mrg
3282 1.1.1.2 mrg (define_insn "xorqi3"
3283 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
3284 1.1.1.2 mrg (xor:QI (match_operand:QI 1 "register_operand" "%0")
3285 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r")))]
3286 1.1.1.2 mrg ""
3287 1.1.1.2 mrg "eor %0,%2"
3288 1.1.1.2 mrg [(set_attr "length" "1")
3289 1.1.1.2 mrg (set_attr "cc" "set_zn")])
3290 1.1.1.2 mrg
3291 1.1.1.2 mrg (define_insn "xorhi3"
3292 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=??r,r ,r")
3293 1.1.1.2 mrg (xor:HI (match_operand:HI 1 "register_operand" "%0,0 ,0")
3294 1.1.1.2 mrg (match_operand:HI 2 "nonmemory_operand" "r,Cx2,n")))
3295 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
3296 1.1.1.2 mrg ""
3297 1.1.1.2 mrg {
3298 1.1.1.2 mrg if (which_alternative == 0)
3299 1.1.1.2 mrg return "eor %A0,%A2\;eor %B0,%B2";
3300 1.1.1.2 mrg
3301 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3302 1.1.1.2 mrg }
3303 1.1.1.2 mrg [(set_attr "length" "2,2,4")
3304 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop")
3305 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber")])
3306 1.1.1.2 mrg
3307 1.1.1.2 mrg (define_insn "xorpsi3"
3308 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=??r,r ,r")
3309 1.1.1.2 mrg (xor:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0")
3310 1.1.1.2 mrg (match_operand:PSI 2 "nonmemory_operand" "r,Cx3,n")))
3311 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
3312 1.1.1.2 mrg ""
3313 1.1.1.2 mrg {
3314 1.1.1.2 mrg if (which_alternative == 0)
3315 1.1.1.2 mrg return "eor %A0,%A2" CR_TAB
3316 1.1.1.2 mrg "eor %B0,%B2" CR_TAB
3317 1.1.1.2 mrg "eor %C0,%C2";
3318 1.1.1.2 mrg
3319 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3320 1.1.1.2 mrg }
3321 1.1.1.2 mrg [(set_attr "length" "3,6,6")
3322 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop")
3323 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber")])
3324 1.1.1.2 mrg
3325 1.1.1.2 mrg (define_insn "xorsi3"
3326 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=??r,r ,r")
3327 1.1.1.2 mrg (xor:SI (match_operand:SI 1 "register_operand" "%0,0 ,0")
3328 1.1.1.2 mrg (match_operand:SI 2 "nonmemory_operand" "r,Cx4,n")))
3329 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X ,&d"))]
3330 1.1.1.2 mrg ""
3331 1.1.1.2 mrg {
3332 1.1.1.2 mrg if (which_alternative == 0)
3333 1.1.1.2 mrg return "eor %0,%2" CR_TAB
3334 1.1.1.2 mrg "eor %B0,%B2" CR_TAB
3335 1.1.1.2 mrg "eor %C0,%C2" CR_TAB
3336 1.1.1.2 mrg "eor %D0,%D2";
3337 1.1.1.2 mrg
3338 1.1.1.2 mrg return avr_out_bitop (insn, operands, NULL);
3339 1.1.1.2 mrg }
3340 1.1.1.2 mrg [(set_attr "length" "4,8,8")
3341 1.1.1.2 mrg (set_attr "adjust_len" "*,out_bitop,out_bitop")
3342 1.1.1.2 mrg (set_attr "cc" "set_n,clobber,clobber")])
3343 1.1.1.2 mrg
3344 1.1.1.9 mrg
3345 1.1.1.9 mrg (define_split
3346 1.1.1.9 mrg [(set (match_operand:SPLIT34 0 "register_operand")
3347 1.1.1.9 mrg (match_operand:SPLIT34 1 "register_operand"))]
3348 1.1.1.9 mrg "optimize
3349 1.1.1.9 mrg && reload_completed"
3350 1.1.1.9 mrg [(set (match_dup 2) (match_dup 3))
3351 1.1.1.9 mrg (set (match_dup 4) (match_dup 5))]
3352 1.1.1.9 mrg {
3353 1.1.1.9 mrg machine_mode mode_hi = 4 == GET_MODE_SIZE (<MODE>mode) ? HImode : QImode;
3354 1.1.1.9 mrg bool lo_first = REGNO (operands[0]) < REGNO (operands[1]);
3355 1.1.1.9 mrg rtx dst_lo = simplify_gen_subreg (HImode, operands[0], <MODE>mode, 0);
3356 1.1.1.9 mrg rtx src_lo = simplify_gen_subreg (HImode, operands[1], <MODE>mode, 0);
3357 1.1.1.9 mrg rtx dst_hi = simplify_gen_subreg (mode_hi, operands[0], <MODE>mode, 2);
3358 1.1.1.9 mrg rtx src_hi = simplify_gen_subreg (mode_hi, operands[1], <MODE>mode, 2);
3359 1.1.1.9 mrg
3360 1.1.1.9 mrg operands[2] = lo_first ? dst_lo : dst_hi;
3361 1.1.1.9 mrg operands[3] = lo_first ? src_lo : src_hi;
3362 1.1.1.9 mrg operands[4] = lo_first ? dst_hi : dst_lo;
3363 1.1.1.9 mrg operands[5] = lo_first ? src_hi : src_lo;
3364 1.1.1.9 mrg })
3365 1.1.1.9 mrg
3366 1.1.1.9 mrg (define_split
3367 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand")
3368 1.1.1.9 mrg (match_operand:HI 1 "reg_or_0_operand"))]
3369 1.1.1.9 mrg "optimize
3370 1.1.1.9 mrg && reload_completed
3371 1.1.1.9 mrg && GENERAL_REG_P (operands[0])
3372 1.1.1.9 mrg && (operands[1] == const0_rtx || GENERAL_REG_P (operands[1]))
3373 1.1.1.9 mrg && (!AVR_HAVE_MOVW
3374 1.1.1.9 mrg || const0_rtx == operands[1])"
3375 1.1.1.9 mrg [(set (match_dup 2) (match_dup 3))
3376 1.1.1.9 mrg (set (match_dup 4) (match_dup 5))]
3377 1.1.1.9 mrg {
3378 1.1.1.9 mrg operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
3379 1.1.1.9 mrg operands[3] = simplify_gen_subreg (QImode, operands[1], HImode, 1);
3380 1.1.1.9 mrg operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
3381 1.1.1.9 mrg operands[5] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
3382 1.1.1.9 mrg })
3383 1.1.1.9 mrg
3384 1.1.1.9 mrg ;; Split andhi3, andpsi3, andsi3.
3385 1.1.1.9 mrg ;; Split iorhi3, iorpsi3, iorsi3.
3386 1.1.1.9 mrg ;; Split xorhi3, xorpsi3, xorsi3.
3387 1.1.1.9 mrg (define_split
3388 1.1.1.9 mrg [(parallel [(set (match_operand:HISI 0 "register_operand")
3389 1.1.1.9 mrg (bitop:HISI (match_dup 0)
3390 1.1.1.9 mrg (match_operand:HISI 1 "register_operand")))
3391 1.1.1.9 mrg (clobber (scratch:QI))])]
3392 1.1.1.9 mrg "optimize
3393 1.1.1.9 mrg && reload_completed"
3394 1.1.1.9 mrg [(const_int 1)]
3395 1.1.1.9 mrg {
3396 1.1.1.9 mrg for (int i = 0; i < GET_MODE_SIZE (<MODE>mode); i++)
3397 1.1.1.9 mrg {
3398 1.1.1.9 mrg rtx dst = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i);
3399 1.1.1.9 mrg rtx src = simplify_gen_subreg (QImode, operands[1], <MODE>mode, i);
3400 1.1.1.9 mrg emit_insn (gen_<code>qi3 (dst, dst, src));
3401 1.1.1.9 mrg }
3402 1.1.1.9 mrg DONE;
3403 1.1.1.9 mrg })
3404 1.1.1.9 mrg
3405 1.1.1.9 mrg
3406 1.1.1.2 mrg ;; swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap
3407 1.1.1.2 mrg ;; swap
3408 1.1.1.2 mrg
3409 1.1.1.2 mrg (define_expand "rotlqi3"
3410 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "")
3411 1.1.1.2 mrg (rotate:QI (match_operand:QI 1 "register_operand" "")
3412 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "")))]
3413 1.1.1.2 mrg ""
3414 1.1.1.2 mrg {
3415 1.1.1.2 mrg if (!CONST_INT_P (operands[2]))
3416 1.1.1.2 mrg FAIL;
3417 1.1.1.2 mrg
3418 1.1.1.2 mrg operands[2] = gen_int_mode (INTVAL (operands[2]) & 7, QImode);
3419 1.1.1.2 mrg })
3420 1.1.1.2 mrg
3421 1.1.1.2 mrg ;; Expander used by __builtin_avr_swap
3422 1.1.1.2 mrg (define_expand "rotlqi3_4"
3423 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "")
3424 1.1.1.2 mrg (rotate:QI (match_operand:QI 1 "register_operand" "")
3425 1.1.1.2 mrg (const_int 4)))])
3426 1.1.1.2 mrg
3427 1.1.1.2 mrg (define_insn "*rotlqi3"
3428 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r,r,r ,r ,r ,r ,r ,r")
3429 1.1.1.2 mrg (rotate:QI (match_operand:QI 1 "register_operand" "0,0,0 ,0 ,0 ,0 ,0 ,0")
3430 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "P,K,C03,C04,C05,C06,C07,L")))]
3431 1.1.1.2 mrg ""
3432 1.1.1.2 mrg "@
3433 1.1.1.2 mrg lsl %0\;adc %0,__zero_reg__
3434 1.1.1.2 mrg lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__
3435 1.1.1.2 mrg swap %0\;bst %0,0\;ror %0\;bld %0,7
3436 1.1.1.2 mrg swap %0
3437 1.1.1.2 mrg swap %0\;lsl %0\;adc %0,__zero_reg__
3438 1.1.1.2 mrg swap %0\;lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__
3439 1.1.1.2 mrg bst %0,0\;ror %0\;bld %0,7
3440 1.1.1.6 mrg " ; empty
3441 1.1.1.2 mrg [(set_attr "length" "2,4,4,1,3,5,3,0")
3442 1.1.1.2 mrg (set_attr "cc" "set_n,set_n,clobber,none,set_n,set_n,clobber,none")])
3443 1.1.1.2 mrg
3444 1.1.1.2 mrg ;; Split all rotates of HI,SI and PSImode registers where rotation is by
3445 1.1.1.2 mrg ;; a whole number of bytes. The split creates the appropriate moves and
3446 1.1.1.2 mrg ;; considers all overlap situations.
3447 1.1.1.2 mrg
3448 1.1.1.2 mrg ;; HImode does not need scratch. Use attribute for this constraint.
3449 1.1.1.2 mrg
3450 1.1.1.2 mrg (define_mode_attr rotx [(SI "&r,&r,X") (PSI "&r,&r,X") (HI "X,X,X")])
3451 1.1.1.2 mrg (define_mode_attr rotsmode [(SI "HI") (PSI "QI") (HI "QI")])
3452 1.1.1.2 mrg
3453 1.1.1.2 mrg ;; "rotlhi3"
3454 1.1.1.2 mrg ;; "rotlpsi3"
3455 1.1.1.2 mrg ;; "rotlsi3"
3456 1.1.1.2 mrg (define_expand "rotl<mode>3"
3457 1.1.1.2 mrg [(parallel [(set (match_operand:HISI 0 "register_operand" "")
3458 1.1.1.2 mrg (rotate:HISI (match_operand:HISI 1 "register_operand" "")
3459 1.1.1.8 mrg (match_operand:HISI 2 "const_int_operand" "")))
3460 1.1.1.2 mrg (clobber (match_dup 3))])]
3461 1.1.1.2 mrg ""
3462 1.1.1.2 mrg {
3463 1.1.1.2 mrg int offset;
3464 1.1.1.2 mrg
3465 1.1.1.2 mrg if (!CONST_INT_P (operands[2]))
3466 1.1.1.2 mrg FAIL;
3467 1.1.1.2 mrg
3468 1.1.1.2 mrg offset = INTVAL (operands[2]);
3469 1.1.1.2 mrg
3470 1.1.1.2 mrg if (0 == offset % 8)
3471 1.1.1.2 mrg {
3472 1.1.1.2 mrg if (AVR_HAVE_MOVW && 0 == offset % 16)
3473 1.1.1.2 mrg operands[3] = gen_rtx_SCRATCH (<rotsmode>mode);
3474 1.1.1.2 mrg else
3475 1.1.1.2 mrg operands[3] = gen_rtx_SCRATCH (QImode);
3476 1.1.1.2 mrg }
3477 1.1.1.2 mrg else if (offset == 1
3478 1.1.1.2 mrg || offset == GET_MODE_BITSIZE (<MODE>mode) -1)
3479 1.1.1.2 mrg {
3480 1.1.1.2 mrg /*; Support rotate left/right by 1 */
3481 1.1.1.2 mrg
3482 1.1.1.2 mrg emit_move_insn (operands[0],
3483 1.1.1.2 mrg gen_rtx_ROTATE (<MODE>mode, operands[1], operands[2]));
3484 1.1.1.2 mrg DONE;
3485 1.1.1.2 mrg }
3486 1.1.1.2 mrg else
3487 1.1.1.2 mrg FAIL;
3488 1.1.1.2 mrg })
3489 1.1.1.2 mrg
3490 1.1.1.2 mrg (define_insn "*rotlhi2.1"
3491 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
3492 1.1.1.2 mrg (rotate:HI (match_operand:HI 1 "register_operand" "0")
3493 1.1.1.2 mrg (const_int 1)))]
3494 1.1.1.2 mrg ""
3495 1.1.1.2 mrg "lsl %A0\;rol %B0\;adc %A0,__zero_reg__"
3496 1.1.1.2 mrg [(set_attr "length" "3")
3497 1.1.1.2 mrg (set_attr "cc" "clobber")])
3498 1.1.1.2 mrg
3499 1.1.1.2 mrg (define_insn "*rotlhi2.15"
3500 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
3501 1.1.1.2 mrg (rotate:HI (match_operand:HI 1 "register_operand" "0")
3502 1.1.1.2 mrg (const_int 15)))]
3503 1.1.1.2 mrg ""
3504 1.1.1.2 mrg "bst %A0,0\;ror %B0\;ror %A0\;bld %B0,7"
3505 1.1.1.2 mrg [(set_attr "length" "4")
3506 1.1.1.2 mrg (set_attr "cc" "clobber")])
3507 1.1.1.2 mrg
3508 1.1.1.2 mrg (define_insn "*rotlpsi2.1"
3509 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
3510 1.1.1.2 mrg (rotate:PSI (match_operand:PSI 1 "register_operand" "0")
3511 1.1.1.2 mrg (const_int 1)))]
3512 1.1.1.2 mrg ""
3513 1.1.1.2 mrg "lsl %A0\;rol %B0\;rol %C0\;adc %A0,__zero_reg__"
3514 1.1.1.2 mrg [(set_attr "length" "4")
3515 1.1.1.2 mrg (set_attr "cc" "clobber")])
3516 1.1.1.2 mrg
3517 1.1.1.2 mrg (define_insn "*rotlpsi2.23"
3518 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
3519 1.1.1.2 mrg (rotate:PSI (match_operand:PSI 1 "register_operand" "0")
3520 1.1.1.2 mrg (const_int 23)))]
3521 1.1.1.2 mrg ""
3522 1.1.1.2 mrg "bst %A0,0\;ror %C0\;ror %B0\;ror %A0\;bld %C0,7"
3523 1.1.1.2 mrg [(set_attr "length" "5")
3524 1.1.1.2 mrg (set_attr "cc" "clobber")])
3525 1.1.1.2 mrg
3526 1.1.1.2 mrg (define_insn "*rotlsi2.1"
3527 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
3528 1.1.1.2 mrg (rotate:SI (match_operand:SI 1 "register_operand" "0")
3529 1.1.1.2 mrg (const_int 1)))]
3530 1.1.1.2 mrg ""
3531 1.1.1.2 mrg "lsl %A0\;rol %B0\;rol %C0\;rol %D0\;adc %A0,__zero_reg__"
3532 1.1.1.2 mrg [(set_attr "length" "5")
3533 1.1.1.2 mrg (set_attr "cc" "clobber")])
3534 1.1.1.2 mrg
3535 1.1.1.2 mrg (define_insn "*rotlsi2.31"
3536 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
3537 1.1.1.2 mrg (rotate:SI (match_operand:SI 1 "register_operand" "0")
3538 1.1.1.2 mrg (const_int 31)))]
3539 1.1.1.2 mrg ""
3540 1.1.1.2 mrg "bst %A0,0\;ror %D0\;ror %C0\;ror %B0\;ror %A0\;bld %D0,7"
3541 1.1.1.2 mrg [(set_attr "length" "6")
3542 1.1.1.2 mrg (set_attr "cc" "clobber")])
3543 1.1.1.2 mrg
3544 1.1.1.2 mrg ;; Overlapping non-HImode registers often (but not always) need a scratch.
3545 1.1.1.2 mrg ;; The best we can do is use early clobber alternative "#&r" so that
3546 1.1.1.2 mrg ;; completely non-overlapping operands dont get a scratch but # so register
3547 1.1.1.2 mrg ;; allocation does not prefer non-overlapping.
3548 1.1.1.2 mrg
3549 1.1.1.2 mrg
3550 1.1.1.2 mrg ;; Split word aligned rotates using scratch that is mode dependent.
3551 1.1.1.2 mrg
3552 1.1.1.2 mrg ;; "*rotwhi"
3553 1.1.1.2 mrg ;; "*rotwsi"
3554 1.1.1.2 mrg (define_insn_and_split "*rotw<mode>"
3555 1.1.1.2 mrg [(set (match_operand:HISI 0 "register_operand" "=r,r,#&r")
3556 1.1.1.2 mrg (rotate:HISI (match_operand:HISI 1 "register_operand" "0,r,r")
3557 1.1.1.2 mrg (match_operand 2 "const_int_operand" "n,n,n")))
3558 1.1.1.2 mrg (clobber (match_scratch:<rotsmode> 3 "=<rotx>"))]
3559 1.1.1.2 mrg "AVR_HAVE_MOVW
3560 1.1.1.2 mrg && CONST_INT_P (operands[2])
3561 1.1.1.2 mrg && GET_MODE_SIZE (<MODE>mode) % 2 == 0
3562 1.1.1.2 mrg && 0 == INTVAL (operands[2]) % 16"
3563 1.1.1.2 mrg "#"
3564 1.1.1.2 mrg "&& reload_completed"
3565 1.1.1.2 mrg [(const_int 0)]
3566 1.1.1.2 mrg {
3567 1.1.1.2 mrg avr_rotate_bytes (operands);
3568 1.1.1.2 mrg DONE;
3569 1.1.1.2 mrg })
3570 1.1.1.2 mrg
3571 1.1.1.2 mrg
3572 1.1.1.2 mrg ;; Split byte aligned rotates using scratch that is always QI mode.
3573 1.1.1.2 mrg
3574 1.1.1.2 mrg ;; "*rotbhi"
3575 1.1.1.2 mrg ;; "*rotbpsi"
3576 1.1.1.2 mrg ;; "*rotbsi"
3577 1.1.1.2 mrg (define_insn_and_split "*rotb<mode>"
3578 1.1.1.2 mrg [(set (match_operand:HISI 0 "register_operand" "=r,r,#&r")
3579 1.1.1.2 mrg (rotate:HISI (match_operand:HISI 1 "register_operand" "0,r,r")
3580 1.1.1.2 mrg (match_operand 2 "const_int_operand" "n,n,n")))
3581 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=<rotx>"))]
3582 1.1.1.2 mrg "CONST_INT_P (operands[2])
3583 1.1.1.2 mrg && (8 == INTVAL (operands[2]) % 16
3584 1.1.1.2 mrg || ((!AVR_HAVE_MOVW
3585 1.1.1.2 mrg || GET_MODE_SIZE (<MODE>mode) % 2 != 0)
3586 1.1.1.2 mrg && 0 == INTVAL (operands[2]) % 16))"
3587 1.1.1.2 mrg "#"
3588 1.1.1.2 mrg "&& reload_completed"
3589 1.1.1.2 mrg [(const_int 0)]
3590 1.1.1.2 mrg {
3591 1.1.1.2 mrg avr_rotate_bytes (operands);
3592 1.1.1.2 mrg DONE;
3593 1.1.1.2 mrg })
3594 1.1.1.2 mrg
3595 1.1.1.2 mrg
3596 1.1.1.2 mrg ;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
3597 1.1.1.2 mrg ;; arithmetic shift left
3598 1.1.1.2 mrg
3599 1.1.1.2 mrg ;; "ashlqi3"
3600 1.1.1.2 mrg ;; "ashlqq3" "ashluqq3"
3601 1.1.1.2 mrg (define_expand "ashl<mode>3"
3602 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "")
3603 1.1.1.2 mrg (ashift:ALL1 (match_operand:ALL1 1 "register_operand" "")
3604 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "")))])
3605 1.1.1.2 mrg
3606 1.1.1.2 mrg (define_split ; ashlqi3_const4
3607 1.1.1.2 mrg [(set (match_operand:ALL1 0 "d_register_operand" "")
3608 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3609 1.1.1.2 mrg (const_int 4)))]
3610 1.1.1.2 mrg ""
3611 1.1.1.2 mrg [(set (match_dup 1)
3612 1.1.1.2 mrg (rotate:QI (match_dup 1)
3613 1.1.1.2 mrg (const_int 4)))
3614 1.1.1.2 mrg (set (match_dup 1)
3615 1.1.1.2 mrg (and:QI (match_dup 1)
3616 1.1.1.2 mrg (const_int -16)))]
3617 1.1.1.2 mrg {
3618 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
3619 1.1.1.2 mrg })
3620 1.1.1.2 mrg
3621 1.1.1.2 mrg (define_split ; ashlqi3_const5
3622 1.1.1.2 mrg [(set (match_operand:ALL1 0 "d_register_operand" "")
3623 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3624 1.1.1.2 mrg (const_int 5)))]
3625 1.1.1.2 mrg ""
3626 1.1.1.2 mrg [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
3627 1.1.1.2 mrg (set (match_dup 1) (ashift:QI (match_dup 1) (const_int 1)))
3628 1.1.1.2 mrg (set (match_dup 1) (and:QI (match_dup 1) (const_int -32)))]
3629 1.1.1.2 mrg {
3630 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
3631 1.1.1.2 mrg })
3632 1.1.1.2 mrg
3633 1.1.1.2 mrg (define_split ; ashlqi3_const6
3634 1.1.1.2 mrg [(set (match_operand:ALL1 0 "d_register_operand" "")
3635 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3636 1.1.1.2 mrg (const_int 6)))]
3637 1.1.1.2 mrg ""
3638 1.1.1.2 mrg [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
3639 1.1.1.2 mrg (set (match_dup 1) (ashift:QI (match_dup 1) (const_int 2)))
3640 1.1.1.2 mrg (set (match_dup 1) (and:QI (match_dup 1) (const_int -64)))]
3641 1.1.1.2 mrg {
3642 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
3643 1.1.1.2 mrg })
3644 1.1.1.2 mrg
3645 1.1.1.2 mrg ;; "*ashlqi3"
3646 1.1.1.2 mrg ;; "*ashlqq3" "*ashluqq3"
3647 1.1.1.2 mrg (define_insn "*ashl<mode>3"
3648 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r")
3649 1.1.1.2 mrg (ashift:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0")
3650 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm")))]
3651 1.1.1.2 mrg ""
3652 1.1.1.2 mrg {
3653 1.1.1.2 mrg return ashlqi3_out (insn, operands, NULL);
3654 1.1.1.2 mrg }
3655 1.1.1.2 mrg [(set_attr "length" "5,0,1,2,4,6,9")
3656 1.1.1.2 mrg (set_attr "adjust_len" "ashlqi")
3657 1.1.1.2 mrg (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
3658 1.1.1.2 mrg
3659 1.1.1.2 mrg (define_insn "ashl<mode>3"
3660 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r")
3661 1.1.1.2 mrg (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0")
3662 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
3663 1.1.1.2 mrg ""
3664 1.1.1.2 mrg {
3665 1.1.1.2 mrg return ashlhi3_out (insn, operands, NULL);
3666 1.1.1.2 mrg }
3667 1.1.1.2 mrg [(set_attr "length" "6,0,2,2,4,10,10")
3668 1.1.1.2 mrg (set_attr "adjust_len" "ashlhi")
3669 1.1.1.2 mrg (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
3670 1.1.1.2 mrg
3671 1.1.1.2 mrg
3672 1.1.1.2 mrg ;; Insns like the following are generated when (implicitly) extending 8-bit shifts
3673 1.1.1.2 mrg ;; like char1 = char2 << char3. Only the low-byte is needed in that situation.
3674 1.1.1.2 mrg
3675 1.1.1.2 mrg ;; "*ashluqihiqi3"
3676 1.1.1.2 mrg ;; "*ashlsqihiqi3"
3677 1.1.1.2 mrg (define_insn_and_split "*ashl<extend_su>qihiqi3"
3678 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
3679 1.1.1.2 mrg (subreg:QI (ashift:HI (any_extend:HI (match_operand:QI 1 "register_operand" "0"))
3680 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r"))
3681 1.1.1.2 mrg 0))]
3682 1.1.1.2 mrg ""
3683 1.1.1.2 mrg "#"
3684 1.1.1.2 mrg ""
3685 1.1.1.2 mrg [(set (match_dup 0)
3686 1.1.1.2 mrg (ashift:QI (match_dup 1)
3687 1.1.1.2 mrg (match_dup 2)))])
3688 1.1.1.2 mrg
3689 1.1.1.2 mrg ;; ??? Combiner does not recognize that it could split the following insn;
3690 1.1.1.2 mrg ;; presumably because he has no register handy?
3691 1.1.1.2 mrg
3692 1.1.1.2 mrg ;; "*ashluqihiqi3.mem"
3693 1.1.1.2 mrg ;; "*ashlsqihiqi3.mem"
3694 1.1.1.2 mrg (define_insn_and_split "*ashl<extend_su>qihiqi3.mem"
3695 1.1.1.2 mrg [(set (match_operand:QI 0 "memory_operand" "=m")
3696 1.1.1.2 mrg (subreg:QI (ashift:HI (any_extend:HI (match_operand:QI 1 "register_operand" "r"))
3697 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r"))
3698 1.1.1.2 mrg 0))]
3699 1.1.1.2 mrg "!reload_completed"
3700 1.1.1.2 mrg { gcc_unreachable(); }
3701 1.1.1.2 mrg "&& 1"
3702 1.1.1.2 mrg [(set (match_dup 3)
3703 1.1.1.2 mrg (ashift:QI (match_dup 1)
3704 1.1.1.2 mrg (match_dup 2)))
3705 1.1.1.2 mrg (set (match_dup 0)
3706 1.1.1.2 mrg (match_dup 3))]
3707 1.1.1.2 mrg {
3708 1.1.1.2 mrg operands[3] = gen_reg_rtx (QImode);
3709 1.1.1.2 mrg })
3710 1.1.1.2 mrg
3711 1.1.1.2 mrg ;; Similar.
3712 1.1.1.2 mrg
3713 1.1.1.2 mrg (define_insn_and_split "*ashlhiqi3"
3714 1.1.1.2 mrg [(set (match_operand:QI 0 "nonimmediate_operand" "=r")
3715 1.1.1.2 mrg (subreg:QI (ashift:HI (match_operand:HI 1 "register_operand" "0")
3716 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r")) 0))]
3717 1.1.1.2 mrg "!reload_completed"
3718 1.1.1.2 mrg { gcc_unreachable(); }
3719 1.1.1.2 mrg "&& 1"
3720 1.1.1.2 mrg [(set (match_dup 4)
3721 1.1.1.2 mrg (ashift:QI (match_dup 3)
3722 1.1.1.2 mrg (match_dup 2)))
3723 1.1.1.2 mrg (set (match_dup 0)
3724 1.1.1.2 mrg (match_dup 4))]
3725 1.1.1.2 mrg {
3726 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
3727 1.1.1.2 mrg operands[4] = gen_reg_rtx (QImode);
3728 1.1.1.2 mrg })
3729 1.1.1.2 mrg
3730 1.1.1.2 mrg ;; High part of 16-bit shift is unused after the instruction:
3731 1.1.1.2 mrg ;; No need to compute it, map to 8-bit shift.
3732 1.1.1.2 mrg
3733 1.1.1.2 mrg (define_peephole2
3734 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "")
3735 1.1.1.2 mrg (ashift:HI (match_dup 0)
3736 1.1.1.2 mrg (match_operand:QI 1 "register_operand" "")))]
3737 1.1.1.2 mrg ""
3738 1.1.1.2 mrg [(set (match_dup 2)
3739 1.1.1.2 mrg (ashift:QI (match_dup 2)
3740 1.1.1.2 mrg (match_dup 1)))
3741 1.1.1.2 mrg (clobber (match_dup 3))]
3742 1.1.1.2 mrg {
3743 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
3744 1.1.1.2 mrg
3745 1.1.1.2 mrg if (!peep2_reg_dead_p (1, operands[3]))
3746 1.1.1.2 mrg FAIL;
3747 1.1.1.2 mrg
3748 1.1.1.2 mrg operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
3749 1.1.1.2 mrg })
3750 1.1.1.2 mrg
3751 1.1.1.2 mrg
3752 1.1.1.2 mrg ;; "ashlsi3"
3753 1.1.1.2 mrg ;; "ashlsq3" "ashlusq3"
3754 1.1.1.2 mrg ;; "ashlsa3" "ashlusa3"
3755 1.1.1.2 mrg (define_insn "ashl<mode>3"
3756 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r")
3757 1.1.1.2 mrg (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0")
3758 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
3759 1.1.1.2 mrg ""
3760 1.1.1.2 mrg {
3761 1.1.1.2 mrg return ashlsi3_out (insn, operands, NULL);
3762 1.1.1.2 mrg }
3763 1.1.1.2 mrg [(set_attr "length" "8,0,4,4,8,10,12")
3764 1.1.1.2 mrg (set_attr "adjust_len" "ashlsi")
3765 1.1.1.2 mrg (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
3766 1.1.1.2 mrg
3767 1.1.1.2 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
3768 1.1.1.2 mrg
3769 1.1.1.2 mrg (define_peephole2 ; ashlqi3_l_const4
3770 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
3771 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3772 1.1.1.2 mrg (const_int 4)))
3773 1.1.1.2 mrg (match_scratch:QI 1 "d")]
3774 1.1.1.2 mrg ""
3775 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
3776 1.1.1.2 mrg (set (match_dup 1) (const_int -16))
3777 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
3778 1.1.1.2 mrg {
3779 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
3780 1.1.1.2 mrg })
3781 1.1.1.2 mrg
3782 1.1.1.2 mrg (define_peephole2 ; ashlqi3_l_const5
3783 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
3784 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3785 1.1.1.2 mrg (const_int 5)))
3786 1.1.1.2 mrg (match_scratch:QI 1 "d")]
3787 1.1.1.2 mrg ""
3788 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
3789 1.1.1.2 mrg (set (match_dup 2) (ashift:QI (match_dup 2) (const_int 1)))
3790 1.1.1.2 mrg (set (match_dup 1) (const_int -32))
3791 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
3792 1.1.1.2 mrg {
3793 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
3794 1.1.1.2 mrg })
3795 1.1.1.2 mrg
3796 1.1.1.2 mrg (define_peephole2 ; ashlqi3_l_const6
3797 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
3798 1.1.1.2 mrg (ashift:ALL1 (match_dup 0)
3799 1.1.1.2 mrg (const_int 6)))
3800 1.1.1.2 mrg (match_scratch:QI 1 "d")]
3801 1.1.1.2 mrg ""
3802 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
3803 1.1.1.2 mrg (set (match_dup 2) (ashift:QI (match_dup 2) (const_int 2)))
3804 1.1.1.2 mrg (set (match_dup 1) (const_int -64))
3805 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
3806 1.1.1.2 mrg {
3807 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
3808 1.1.1.2 mrg })
3809 1.1.1.2 mrg
3810 1.1.1.2 mrg (define_peephole2
3811 1.1.1.2 mrg [(match_scratch:QI 3 "d")
3812 1.1.1.2 mrg (set (match_operand:ALL2 0 "register_operand" "")
3813 1.1.1.2 mrg (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "")
3814 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
3815 1.1.1.2 mrg ""
3816 1.1.1.2 mrg [(parallel [(set (match_dup 0)
3817 1.1.1.2 mrg (ashift:ALL2 (match_dup 1)
3818 1.1.1.2 mrg (match_dup 2)))
3819 1.1.1.2 mrg (clobber (match_dup 3))])])
3820 1.1.1.2 mrg
3821 1.1.1.2 mrg ;; "*ashlhi3_const"
3822 1.1.1.2 mrg ;; "*ashlhq3_const" "*ashluhq3_const"
3823 1.1.1.2 mrg ;; "*ashlha3_const" "*ashluha3_const"
3824 1.1.1.2 mrg (define_insn "*ashl<mode>3_const"
3825 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r")
3826 1.1.1.2 mrg (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0")
3827 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
3828 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
3829 1.1.1.2 mrg "reload_completed"
3830 1.1.1.2 mrg {
3831 1.1.1.2 mrg return ashlhi3_out (insn, operands, NULL);
3832 1.1.1.2 mrg }
3833 1.1.1.2 mrg [(set_attr "length" "0,2,2,4,10")
3834 1.1.1.2 mrg (set_attr "adjust_len" "ashlhi")
3835 1.1.1.2 mrg (set_attr "cc" "none,set_n,clobber,set_n,clobber")])
3836 1.1.1.2 mrg
3837 1.1.1.2 mrg (define_peephole2
3838 1.1.1.2 mrg [(match_scratch:QI 3 "d")
3839 1.1.1.2 mrg (set (match_operand:ALL4 0 "register_operand" "")
3840 1.1.1.2 mrg (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "")
3841 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
3842 1.1.1.2 mrg ""
3843 1.1.1.2 mrg [(parallel [(set (match_dup 0)
3844 1.1.1.2 mrg (ashift:ALL4 (match_dup 1)
3845 1.1.1.2 mrg (match_dup 2)))
3846 1.1.1.2 mrg (clobber (match_dup 3))])])
3847 1.1.1.2 mrg
3848 1.1.1.2 mrg ;; "*ashlsi3_const"
3849 1.1.1.2 mrg ;; "*ashlsq3_const" "*ashlusq3_const"
3850 1.1.1.2 mrg ;; "*ashlsa3_const" "*ashlusa3_const"
3851 1.1.1.2 mrg (define_insn "*ashl<mode>3_const"
3852 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r")
3853 1.1.1.2 mrg (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0")
3854 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
3855 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
3856 1.1.1.2 mrg "reload_completed"
3857 1.1.1.2 mrg {
3858 1.1.1.2 mrg return ashlsi3_out (insn, operands, NULL);
3859 1.1.1.2 mrg }
3860 1.1.1.2 mrg [(set_attr "length" "0,4,4,10")
3861 1.1.1.2 mrg (set_attr "adjust_len" "ashlsi")
3862 1.1.1.2 mrg (set_attr "cc" "none,set_n,clobber,clobber")])
3863 1.1.1.2 mrg
3864 1.1.1.2 mrg (define_expand "ashlpsi3"
3865 1.1.1.2 mrg [(parallel [(set (match_operand:PSI 0 "register_operand" "")
3866 1.1.1.2 mrg (ashift:PSI (match_operand:PSI 1 "register_operand" "")
3867 1.1.1.2 mrg (match_operand:QI 2 "nonmemory_operand" "")))
3868 1.1.1.2 mrg (clobber (scratch:QI))])]
3869 1.1.1.2 mrg ""
3870 1.1.1.2 mrg {
3871 1.1.1.2 mrg if (AVR_HAVE_MUL
3872 1.1.1.2 mrg && CONST_INT_P (operands[2]))
3873 1.1.1.2 mrg {
3874 1.1.1.2 mrg if (IN_RANGE (INTVAL (operands[2]), 3, 6))
3875 1.1.1.2 mrg {
3876 1.1.1.2 mrg rtx xoffset = force_reg (QImode, gen_int_mode (1 << INTVAL (operands[2]), QImode));
3877 1.1.1.2 mrg emit_insn (gen_mulsqipsi3 (operands[0], xoffset, operands[1]));
3878 1.1.1.2 mrg DONE;
3879 1.1.1.2 mrg }
3880 1.1.1.2 mrg else if (optimize_insn_for_speed_p ()
3881 1.1.1.2 mrg && INTVAL (operands[2]) != 16
3882 1.1.1.2 mrg && IN_RANGE (INTVAL (operands[2]), 9, 22))
3883 1.1.1.2 mrg {
3884 1.1.1.2 mrg rtx xoffset = force_reg (PSImode, gen_int_mode (1 << INTVAL (operands[2]), PSImode));
3885 1.1.1.2 mrg emit_insn (gen_mulpsi3 (operands[0], operands[1], xoffset));
3886 1.1.1.2 mrg DONE;
3887 1.1.1.2 mrg }
3888 1.1.1.2 mrg }
3889 1.1.1.2 mrg })
3890 1.1.1.2 mrg
3891 1.1.1.2 mrg (define_insn "*ashlpsi3"
3892 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r")
3893 1.1.1.2 mrg (ashift:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0")
3894 1.1.1.2 mrg (match_operand:QI 2 "nonmemory_operand" "r,P,O,n")))
3895 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
3896 1.1.1.2 mrg ""
3897 1.1.1.2 mrg {
3898 1.1.1.2 mrg return avr_out_ashlpsi3 (insn, operands, NULL);
3899 1.1.1.2 mrg }
3900 1.1.1.2 mrg [(set_attr "adjust_len" "ashlpsi")
3901 1.1.1.2 mrg (set_attr "cc" "clobber")])
3902 1.1.1.2 mrg
3903 1.1.1.2 mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
3904 1.1.1.2 mrg ;; arithmetic shift right
3905 1.1.1.2 mrg
3906 1.1.1.2 mrg ;; "ashrqi3"
3907 1.1.1.2 mrg ;; "ashrqq3" "ashruqq3"
3908 1.1.1.2 mrg (define_insn "ashr<mode>3"
3909 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,r ,r ,r")
3910 1.1.1.2 mrg (ashiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0 ,0")
3911 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,K,C03 C04 C05,C06 C07,Qm")))]
3912 1.1.1.2 mrg ""
3913 1.1.1.2 mrg {
3914 1.1.1.2 mrg return ashrqi3_out (insn, operands, NULL);
3915 1.1.1.2 mrg }
3916 1.1.1.2 mrg [(set_attr "length" "5,0,1,2,5,4,9")
3917 1.1.1.2 mrg (set_attr "adjust_len" "ashrqi")
3918 1.1.1.2 mrg (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,clobber,clobber")])
3919 1.1.1.2 mrg
3920 1.1.1.2 mrg ;; "ashrhi3"
3921 1.1.1.2 mrg ;; "ashrhq3" "ashruhq3"
3922 1.1.1.2 mrg ;; "ashrha3" "ashruha3"
3923 1.1.1.2 mrg (define_insn "ashr<mode>3"
3924 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r")
3925 1.1.1.2 mrg (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0")
3926 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
3927 1.1.1.2 mrg ""
3928 1.1.1.2 mrg {
3929 1.1.1.2 mrg return ashrhi3_out (insn, operands, NULL);
3930 1.1.1.2 mrg }
3931 1.1.1.2 mrg [(set_attr "length" "6,0,2,4,4,10,10")
3932 1.1.1.2 mrg (set_attr "adjust_len" "ashrhi")
3933 1.1.1.2 mrg (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
3934 1.1.1.2 mrg
3935 1.1.1.2 mrg (define_insn "ashrpsi3"
3936 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r")
3937 1.1.1.2 mrg (ashiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,0,r,0")
3938 1.1.1.2 mrg (match_operand:QI 2 "nonmemory_operand" "r,P,K,O,n")))
3939 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
3940 1.1.1.2 mrg ""
3941 1.1.1.2 mrg {
3942 1.1.1.2 mrg return avr_out_ashrpsi3 (insn, operands, NULL);
3943 1.1.1.2 mrg }
3944 1.1.1.2 mrg [(set_attr "adjust_len" "ashrpsi")
3945 1.1.1.2 mrg (set_attr "cc" "clobber")])
3946 1.1.1.2 mrg
3947 1.1.1.2 mrg ;; "ashrsi3"
3948 1.1.1.2 mrg ;; "ashrsq3" "ashrusq3"
3949 1.1.1.2 mrg ;; "ashrsa3" "ashrusa3"
3950 1.1.1.2 mrg (define_insn "ashr<mode>3"
3951 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r")
3952 1.1.1.2 mrg (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0")
3953 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
3954 1.1.1.2 mrg ""
3955 1.1.1.2 mrg {
3956 1.1.1.2 mrg return ashrsi3_out (insn, operands, NULL);
3957 1.1.1.2 mrg }
3958 1.1.1.2 mrg [(set_attr "length" "8,0,4,6,8,10,12")
3959 1.1.1.2 mrg (set_attr "adjust_len" "ashrsi")
3960 1.1.1.2 mrg (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
3961 1.1.1.2 mrg
3962 1.1.1.2 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
3963 1.1.1.2 mrg
3964 1.1.1.2 mrg (define_peephole2
3965 1.1.1.2 mrg [(match_scratch:QI 3 "d")
3966 1.1.1.2 mrg (set (match_operand:ALL2 0 "register_operand" "")
3967 1.1.1.2 mrg (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "")
3968 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
3969 1.1.1.2 mrg ""
3970 1.1.1.2 mrg [(parallel [(set (match_dup 0)
3971 1.1.1.2 mrg (ashiftrt:ALL2 (match_dup 1)
3972 1.1.1.2 mrg (match_dup 2)))
3973 1.1.1.2 mrg (clobber (match_dup 3))])])
3974 1.1.1.2 mrg
3975 1.1.1.2 mrg ;; "*ashrhi3_const"
3976 1.1.1.2 mrg ;; "*ashrhq3_const" "*ashruhq3_const"
3977 1.1.1.2 mrg ;; "*ashrha3_const" "*ashruha3_const"
3978 1.1.1.2 mrg (define_insn "*ashr<mode>3_const"
3979 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r")
3980 1.1.1.2 mrg (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0")
3981 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
3982 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
3983 1.1.1.2 mrg "reload_completed"
3984 1.1.1.2 mrg {
3985 1.1.1.2 mrg return ashrhi3_out (insn, operands, NULL);
3986 1.1.1.2 mrg }
3987 1.1.1.2 mrg [(set_attr "length" "0,2,4,4,10")
3988 1.1.1.2 mrg (set_attr "adjust_len" "ashrhi")
3989 1.1.1.2 mrg (set_attr "cc" "none,clobber,set_n,clobber,clobber")])
3990 1.1.1.2 mrg
3991 1.1.1.2 mrg (define_peephole2
3992 1.1.1.2 mrg [(match_scratch:QI 3 "d")
3993 1.1.1.2 mrg (set (match_operand:ALL4 0 "register_operand" "")
3994 1.1.1.2 mrg (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "")
3995 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
3996 1.1.1.2 mrg ""
3997 1.1.1.2 mrg [(parallel [(set (match_dup 0)
3998 1.1.1.2 mrg (ashiftrt:ALL4 (match_dup 1)
3999 1.1.1.2 mrg (match_dup 2)))
4000 1.1.1.2 mrg (clobber (match_dup 3))])])
4001 1.1.1.2 mrg
4002 1.1.1.2 mrg ;; "*ashrsi3_const"
4003 1.1.1.2 mrg ;; "*ashrsq3_const" "*ashrusq3_const"
4004 1.1.1.2 mrg ;; "*ashrsa3_const" "*ashrusa3_const"
4005 1.1.1.2 mrg (define_insn "*ashr<mode>3_const"
4006 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r")
4007 1.1.1.2 mrg (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0")
4008 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
4009 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
4010 1.1.1.2 mrg "reload_completed"
4011 1.1.1.2 mrg {
4012 1.1.1.2 mrg return ashrsi3_out (insn, operands, NULL);
4013 1.1.1.2 mrg }
4014 1.1.1.2 mrg [(set_attr "length" "0,4,4,10")
4015 1.1.1.2 mrg (set_attr "adjust_len" "ashrsi")
4016 1.1.1.2 mrg (set_attr "cc" "none,clobber,set_n,clobber")])
4017 1.1.1.2 mrg
4018 1.1.1.2 mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
4019 1.1.1.2 mrg ;; logical shift right
4020 1.1.1.2 mrg
4021 1.1.1.2 mrg ;; "lshrqi3"
4022 1.1.1.9 mrg ;; "lshrqq3" "lshruqq3"
4023 1.1.1.2 mrg (define_expand "lshr<mode>3"
4024 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "")
4025 1.1.1.2 mrg (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "")
4026 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "")))])
4027 1.1.1.2 mrg
4028 1.1.1.2 mrg (define_split ; lshrqi3_const4
4029 1.1.1.2 mrg [(set (match_operand:ALL1 0 "d_register_operand" "")
4030 1.1.1.2 mrg (lshiftrt:ALL1 (match_dup 0)
4031 1.1.1.2 mrg (const_int 4)))]
4032 1.1.1.2 mrg ""
4033 1.1.1.2 mrg [(set (match_dup 1)
4034 1.1.1.2 mrg (rotate:QI (match_dup 1)
4035 1.1.1.2 mrg (const_int 4)))
4036 1.1.1.2 mrg (set (match_dup 1)
4037 1.1.1.2 mrg (and:QI (match_dup 1)
4038 1.1.1.2 mrg (const_int 15)))]
4039 1.1.1.2 mrg {
4040 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
4041 1.1.1.2 mrg })
4042 1.1.1.2 mrg
4043 1.1.1.2 mrg (define_split ; lshrqi3_const5
4044 1.1.1.2 mrg [(set (match_operand:ALL1 0 "d_register_operand" "")
4045 1.1.1.2 mrg (lshiftrt:ALL1 (match_dup 0)
4046 1.1.1.2 mrg (const_int 5)))]
4047 1.1.1.2 mrg ""
4048 1.1.1.2 mrg [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
4049 1.1.1.2 mrg (set (match_dup 1) (lshiftrt:QI (match_dup 1) (const_int 1)))
4050 1.1.1.2 mrg (set (match_dup 1) (and:QI (match_dup 1) (const_int 7)))]
4051 1.1.1.2 mrg {
4052 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
4053 1.1.1.2 mrg })
4054 1.1.1.2 mrg
4055 1.1.1.2 mrg (define_split ; lshrqi3_const6
4056 1.1.1.2 mrg [(set (match_operand:QI 0 "d_register_operand" "")
4057 1.1.1.2 mrg (lshiftrt:QI (match_dup 0)
4058 1.1.1.2 mrg (const_int 6)))]
4059 1.1.1.2 mrg ""
4060 1.1.1.2 mrg [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
4061 1.1.1.2 mrg (set (match_dup 1) (lshiftrt:QI (match_dup 1) (const_int 2)))
4062 1.1.1.2 mrg (set (match_dup 1) (and:QI (match_dup 1) (const_int 3)))]
4063 1.1.1.2 mrg {
4064 1.1.1.2 mrg operands[1] = avr_to_int_mode (operands[0]);
4065 1.1.1.2 mrg })
4066 1.1.1.2 mrg
4067 1.1.1.2 mrg ;; "*lshrqi3"
4068 1.1.1.2 mrg ;; "*lshrqq3"
4069 1.1.1.2 mrg ;; "*lshruqq3"
4070 1.1.1.2 mrg (define_insn "*lshr<mode>3"
4071 1.1.1.2 mrg [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r")
4072 1.1.1.2 mrg (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0")
4073 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm")))]
4074 1.1.1.2 mrg ""
4075 1.1.1.2 mrg {
4076 1.1.1.2 mrg return lshrqi3_out (insn, operands, NULL);
4077 1.1.1.2 mrg }
4078 1.1.1.2 mrg [(set_attr "length" "5,0,1,2,4,6,9")
4079 1.1.1.2 mrg (set_attr "adjust_len" "lshrqi")
4080 1.1.1.2 mrg (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
4081 1.1.1.2 mrg
4082 1.1.1.2 mrg ;; "lshrhi3"
4083 1.1.1.2 mrg ;; "lshrhq3" "lshruhq3"
4084 1.1.1.2 mrg ;; "lshrha3" "lshruha3"
4085 1.1.1.2 mrg (define_insn "lshr<mode>3"
4086 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r")
4087 1.1.1.2 mrg (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0")
4088 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
4089 1.1.1.2 mrg ""
4090 1.1.1.2 mrg {
4091 1.1.1.2 mrg return lshrhi3_out (insn, operands, NULL);
4092 1.1.1.2 mrg }
4093 1.1.1.2 mrg [(set_attr "length" "6,0,2,2,4,10,10")
4094 1.1.1.2 mrg (set_attr "adjust_len" "lshrhi")
4095 1.1.1.2 mrg (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
4096 1.1.1.2 mrg
4097 1.1.1.2 mrg (define_insn "lshrpsi3"
4098 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r")
4099 1.1.1.2 mrg (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0,0")
4100 1.1.1.2 mrg (match_operand:QI 2 "nonmemory_operand" "r,P,O,K,n")))
4101 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
4102 1.1.1.2 mrg ""
4103 1.1.1.2 mrg {
4104 1.1.1.2 mrg return avr_out_lshrpsi3 (insn, operands, NULL);
4105 1.1.1.2 mrg }
4106 1.1.1.2 mrg [(set_attr "adjust_len" "lshrpsi")
4107 1.1.1.2 mrg (set_attr "cc" "clobber")])
4108 1.1.1.2 mrg
4109 1.1.1.2 mrg ;; "lshrsi3"
4110 1.1.1.2 mrg ;; "lshrsq3" "lshrusq3"
4111 1.1.1.2 mrg ;; "lshrsa3" "lshrusa3"
4112 1.1.1.2 mrg (define_insn "lshr<mode>3"
4113 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r")
4114 1.1.1.2 mrg (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0")
4115 1.1.1.2 mrg (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
4116 1.1.1.2 mrg ""
4117 1.1.1.2 mrg {
4118 1.1.1.2 mrg return lshrsi3_out (insn, operands, NULL);
4119 1.1.1.2 mrg }
4120 1.1.1.2 mrg [(set_attr "length" "8,0,4,4,8,10,12")
4121 1.1.1.2 mrg (set_attr "adjust_len" "lshrsi")
4122 1.1.1.2 mrg (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
4123 1.1.1.2 mrg
4124 1.1.1.2 mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
4125 1.1.1.2 mrg
4126 1.1.1.2 mrg (define_peephole2 ; lshrqi3_l_const4
4127 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
4128 1.1.1.2 mrg (lshiftrt:ALL1 (match_dup 0)
4129 1.1.1.2 mrg (const_int 4)))
4130 1.1.1.2 mrg (match_scratch:QI 1 "d")]
4131 1.1.1.2 mrg ""
4132 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
4133 1.1.1.2 mrg (set (match_dup 1) (const_int 15))
4134 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
4135 1.1.1.2 mrg {
4136 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
4137 1.1.1.2 mrg })
4138 1.1.1.2 mrg
4139 1.1.1.2 mrg (define_peephole2 ; lshrqi3_l_const5
4140 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
4141 1.1.1.2 mrg (lshiftrt:ALL1 (match_dup 0)
4142 1.1.1.2 mrg (const_int 5)))
4143 1.1.1.2 mrg (match_scratch:QI 1 "d")]
4144 1.1.1.2 mrg ""
4145 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
4146 1.1.1.2 mrg (set (match_dup 2) (lshiftrt:QI (match_dup 2) (const_int 1)))
4147 1.1.1.2 mrg (set (match_dup 1) (const_int 7))
4148 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
4149 1.1.1.2 mrg {
4150 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
4151 1.1.1.2 mrg })
4152 1.1.1.2 mrg
4153 1.1.1.2 mrg (define_peephole2 ; lshrqi3_l_const6
4154 1.1.1.2 mrg [(set (match_operand:ALL1 0 "l_register_operand" "")
4155 1.1.1.2 mrg (lshiftrt:ALL1 (match_dup 0)
4156 1.1.1.2 mrg (const_int 6)))
4157 1.1.1.2 mrg (match_scratch:QI 1 "d")]
4158 1.1.1.2 mrg ""
4159 1.1.1.2 mrg [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
4160 1.1.1.2 mrg (set (match_dup 2) (lshiftrt:QI (match_dup 2) (const_int 2)))
4161 1.1.1.2 mrg (set (match_dup 1) (const_int 3))
4162 1.1.1.2 mrg (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
4163 1.1.1.2 mrg {
4164 1.1.1.2 mrg operands[2] = avr_to_int_mode (operands[0]);
4165 1.1.1.2 mrg })
4166 1.1.1.2 mrg
4167 1.1.1.2 mrg (define_peephole2
4168 1.1.1.2 mrg [(match_scratch:QI 3 "d")
4169 1.1.1.2 mrg (set (match_operand:ALL2 0 "register_operand" "")
4170 1.1.1.2 mrg (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "")
4171 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
4172 1.1.1.2 mrg ""
4173 1.1.1.2 mrg [(parallel [(set (match_dup 0)
4174 1.1.1.2 mrg (lshiftrt:ALL2 (match_dup 1)
4175 1.1.1.2 mrg (match_dup 2)))
4176 1.1.1.2 mrg (clobber (match_dup 3))])])
4177 1.1.1.2 mrg
4178 1.1.1.2 mrg ;; "*lshrhi3_const"
4179 1.1.1.2 mrg ;; "*lshrhq3_const" "*lshruhq3_const"
4180 1.1.1.2 mrg ;; "*lshrha3_const" "*lshruha3_const"
4181 1.1.1.2 mrg (define_insn "*lshr<mode>3_const"
4182 1.1.1.2 mrg [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r")
4183 1.1.1.2 mrg (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0")
4184 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
4185 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
4186 1.1.1.2 mrg "reload_completed"
4187 1.1.1.2 mrg {
4188 1.1.1.2 mrg return lshrhi3_out (insn, operands, NULL);
4189 1.1.1.2 mrg }
4190 1.1.1.2 mrg [(set_attr "length" "0,2,2,4,10")
4191 1.1.1.2 mrg (set_attr "adjust_len" "lshrhi")
4192 1.1.1.2 mrg (set_attr "cc" "none,clobber,clobber,clobber,clobber")])
4193 1.1.1.2 mrg
4194 1.1.1.2 mrg (define_peephole2
4195 1.1.1.2 mrg [(match_scratch:QI 3 "d")
4196 1.1.1.2 mrg (set (match_operand:ALL4 0 "register_operand" "")
4197 1.1.1.2 mrg (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "")
4198 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "")))]
4199 1.1.1.2 mrg ""
4200 1.1.1.2 mrg [(parallel [(set (match_dup 0)
4201 1.1.1.2 mrg (lshiftrt:ALL4 (match_dup 1)
4202 1.1.1.2 mrg (match_dup 2)))
4203 1.1.1.2 mrg (clobber (match_dup 3))])])
4204 1.1.1.2 mrg
4205 1.1.1.2 mrg ;; "*lshrsi3_const"
4206 1.1.1.2 mrg ;; "*lshrsq3_const" "*lshrusq3_const"
4207 1.1.1.2 mrg ;; "*lshrsa3_const" "*lshrusa3_const"
4208 1.1.1.2 mrg (define_insn "*lshr<mode>3_const"
4209 1.1.1.2 mrg [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r")
4210 1.1.1.2 mrg (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0")
4211 1.1.1.2 mrg (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
4212 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
4213 1.1.1.2 mrg "reload_completed"
4214 1.1.1.2 mrg {
4215 1.1.1.2 mrg return lshrsi3_out (insn, operands, NULL);
4216 1.1.1.2 mrg }
4217 1.1.1.2 mrg [(set_attr "length" "0,4,4,10")
4218 1.1.1.2 mrg (set_attr "adjust_len" "lshrsi")
4219 1.1.1.2 mrg (set_attr "cc" "none,clobber,clobber,clobber")])
4220 1.1.1.2 mrg
4221 1.1.1.2 mrg ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x)
4222 1.1.1.2 mrg ;; abs
4223 1.1.1.2 mrg
4224 1.1.1.2 mrg (define_insn "absqi2"
4225 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
4226 1.1.1.2 mrg (abs:QI (match_operand:QI 1 "register_operand" "0")))]
4227 1.1.1.2 mrg ""
4228 1.1.1.2 mrg "sbrc %0,7
4229 1.1.1.2 mrg neg %0"
4230 1.1.1.2 mrg [(set_attr "length" "2")
4231 1.1.1.2 mrg (set_attr "cc" "clobber")])
4232 1.1.1.2 mrg
4233 1.1.1.2 mrg
4234 1.1.1.2 mrg (define_insn "abssf2"
4235 1.1.1.2 mrg [(set (match_operand:SF 0 "register_operand" "=d,r")
4236 1.1.1.2 mrg (abs:SF (match_operand:SF 1 "register_operand" "0,0")))]
4237 1.1.1.2 mrg ""
4238 1.1.1.2 mrg "@
4239 1.1.1.2 mrg andi %D0,0x7f
4240 1.1.1.2 mrg clt\;bld %D0,7"
4241 1.1.1.2 mrg [(set_attr "length" "1,2")
4242 1.1.1.2 mrg (set_attr "cc" "set_n,clobber")])
4243 1.1.1.2 mrg
4244 1.1.1.2 mrg ;; 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x
4245 1.1.1.2 mrg ;; neg
4246 1.1.1.2 mrg
4247 1.1.1.2 mrg (define_insn "negqi2"
4248 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
4249 1.1.1.2 mrg (neg:QI (match_operand:QI 1 "register_operand" "0")))]
4250 1.1.1.2 mrg ""
4251 1.1.1.2 mrg "neg %0"
4252 1.1.1.2 mrg [(set_attr "length" "1")
4253 1.1.1.3 skrll (set_attr "cc" "set_vzn")])
4254 1.1.1.2 mrg
4255 1.1.1.2 mrg (define_insn "*negqihi2"
4256 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
4257 1.1.1.2 mrg (neg:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0"))))]
4258 1.1.1.2 mrg ""
4259 1.1.1.2 mrg "clr %B0\;neg %A0\;brge .+2\;com %B0"
4260 1.1.1.2 mrg [(set_attr "length" "4")
4261 1.1.1.2 mrg (set_attr "cc" "set_n")])
4262 1.1.1.2 mrg
4263 1.1.1.2 mrg (define_insn "neghi2"
4264 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r,&r")
4265 1.1.1.2 mrg (neg:HI (match_operand:HI 1 "register_operand" "0,r")))]
4266 1.1.1.2 mrg ""
4267 1.1.1.2 mrg "@
4268 1.1.1.2 mrg neg %B0\;neg %A0\;sbc %B0,__zero_reg__
4269 1.1.1.2 mrg clr %A0\;clr %B0\;sub %A0,%A1\;sbc %B0,%B1"
4270 1.1.1.2 mrg [(set_attr "length" "3,4")
4271 1.1.1.2 mrg (set_attr "cc" "set_czn")])
4272 1.1.1.2 mrg
4273 1.1.1.2 mrg (define_insn "negpsi2"
4274 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=!d,r,&r")
4275 1.1.1.2 mrg (neg:PSI (match_operand:PSI 1 "register_operand" "0,0,r")))]
4276 1.1.1.2 mrg ""
4277 1.1.1.2 mrg "@
4278 1.1.1.2 mrg com %C0\;com %B0\;neg %A0\;sbci %B0,-1\;sbci %C0,-1
4279 1.1.1.2 mrg com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__
4280 1.1.1.2 mrg clr %A0\;clr %B0\;clr %C0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1"
4281 1.1.1.2 mrg [(set_attr "length" "5,6,6")
4282 1.1.1.2 mrg (set_attr "cc" "set_czn,set_n,set_czn")])
4283 1.1.1.2 mrg
4284 1.1.1.2 mrg (define_insn "negsi2"
4285 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=!d,r,&r,&r")
4286 1.1.1.2 mrg (neg:SI (match_operand:SI 1 "register_operand" "0,0,r ,r")))]
4287 1.1.1.2 mrg ""
4288 1.1.1.2 mrg "@
4289 1.1.1.2 mrg com %D0\;com %C0\;com %B0\;neg %A0\;sbci %B0,lo8(-1)\;sbci %C0,lo8(-1)\;sbci %D0,lo8(-1)
4290 1.1.1.2 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__
4291 1.1.1.2 mrg clr %A0\;clr %B0\;clr %C0\;clr %D0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1
4292 1.1.1.2 mrg clr %A0\;clr %B0\;movw %C0,%A0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1"
4293 1.1.1.2 mrg [(set_attr "length" "7,8,8,7")
4294 1.1.1.2 mrg (set_attr "isa" "*,*,mov,movw")
4295 1.1.1.2 mrg (set_attr "cc" "set_czn,set_n,set_czn,set_czn")])
4296 1.1.1.2 mrg
4297 1.1.1.2 mrg (define_insn "negsf2"
4298 1.1.1.2 mrg [(set (match_operand:SF 0 "register_operand" "=d,r")
4299 1.1.1.2 mrg (neg:SF (match_operand:SF 1 "register_operand" "0,0")))]
4300 1.1.1.2 mrg ""
4301 1.1.1.2 mrg "@
4302 1.1.1.2 mrg subi %D0,0x80
4303 1.1.1.2 mrg bst %D0,7\;com %D0\;bld %D0,7\;com %D0"
4304 1.1.1.2 mrg [(set_attr "length" "1,4")
4305 1.1.1.2 mrg (set_attr "cc" "set_n,set_n")])
4306 1.1.1.2 mrg
4307 1.1.1.2 mrg ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4308 1.1.1.2 mrg ;; not
4309 1.1.1.2 mrg
4310 1.1.1.2 mrg (define_insn "one_cmplqi2"
4311 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
4312 1.1.1.2 mrg (not:QI (match_operand:QI 1 "register_operand" "0")))]
4313 1.1.1.2 mrg ""
4314 1.1.1.2 mrg "com %0"
4315 1.1.1.2 mrg [(set_attr "length" "1")
4316 1.1.1.2 mrg (set_attr "cc" "set_czn")])
4317 1.1 mrg
4318 1.1 mrg (define_insn "one_cmplhi2"
4319 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=r")
4320 1.1 mrg (not:HI (match_operand:HI 1 "register_operand" "0")))]
4321 1.1 mrg ""
4322 1.1.1.2 mrg "com %0
4323 1.1.1.2 mrg com %B0"
4324 1.1.1.2 mrg [(set_attr "length" "2")
4325 1.1.1.2 mrg (set_attr "cc" "set_n")])
4326 1.1.1.2 mrg
4327 1.1.1.2 mrg (define_insn "one_cmplpsi2"
4328 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
4329 1.1.1.2 mrg (not:PSI (match_operand:PSI 1 "register_operand" "0")))]
4330 1.1.1.2 mrg ""
4331 1.1.1.2 mrg "com %0\;com %B0\;com %C0"
4332 1.1.1.2 mrg [(set_attr "length" "3")
4333 1.1.1.2 mrg (set_attr "cc" "set_n")])
4334 1.1.1.2 mrg
4335 1.1.1.2 mrg (define_insn "one_cmplsi2"
4336 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
4337 1.1.1.2 mrg (not:SI (match_operand:SI 1 "register_operand" "0")))]
4338 1.1.1.2 mrg ""
4339 1.1.1.2 mrg "com %0
4340 1.1.1.2 mrg com %B0
4341 1.1.1.2 mrg com %C0
4342 1.1.1.2 mrg com %D0"
4343 1.1.1.2 mrg [(set_attr "length" "4")
4344 1.1.1.2 mrg (set_attr "cc" "set_n")])
4345 1.1.1.2 mrg
4346 1.1.1.2 mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
4347 1.1.1.2 mrg ;; sign extend
4348 1.1.1.2 mrg
4349 1.1.1.2 mrg ;; We keep combiner from inserting hard registers into the input of sign- and
4350 1.1.1.2 mrg ;; zero-extends. A hard register in the input operand is not wanted because
4351 1.1.1.2 mrg ;; 32-bit multiply patterns clobber some hard registers and extends with a
4352 1.1.1.2 mrg ;; hard register that overlaps these clobbers won't be combined to a widening
4353 1.1.1.2 mrg ;; multiplication. There is no need for combine to propagate hard registers,
4354 1.1.1.2 mrg ;; register allocation can do it just as well.
4355 1.1.1.2 mrg
4356 1.1.1.2 mrg (define_insn "extendqihi2"
4357 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r,r")
4358 1.1.1.2 mrg (sign_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
4359 1.1.1.2 mrg ""
4360 1.1.1.6 mrg {
4361 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4362 1.1.1.6 mrg }
4363 1.1.1.2 mrg [(set_attr "length" "3,4")
4364 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4365 1.1.1.6 mrg (set_attr "cc" "set_n")])
4366 1.1.1.2 mrg
4367 1.1.1.2 mrg (define_insn "extendqipsi2"
4368 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r")
4369 1.1.1.2 mrg (sign_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
4370 1.1.1.2 mrg ""
4371 1.1.1.6 mrg {
4372 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4373 1.1.1.6 mrg }
4374 1.1.1.2 mrg [(set_attr "length" "4,5")
4375 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4376 1.1.1.6 mrg (set_attr "cc" "set_n")])
4377 1.1.1.2 mrg
4378 1.1.1.2 mrg (define_insn "extendqisi2"
4379 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r,r")
4380 1.1.1.2 mrg (sign_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
4381 1.1.1.2 mrg ""
4382 1.1.1.6 mrg {
4383 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4384 1.1.1.6 mrg }
4385 1.1.1.2 mrg [(set_attr "length" "5,6")
4386 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4387 1.1.1.6 mrg (set_attr "cc" "set_n")])
4388 1.1.1.2 mrg
4389 1.1.1.2 mrg (define_insn "extendhipsi2"
4390 1.1.1.6 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r")
4391 1.1.1.6 mrg (sign_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))]
4392 1.1.1.2 mrg ""
4393 1.1.1.6 mrg {
4394 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4395 1.1.1.6 mrg }
4396 1.1.1.6 mrg [(set_attr "length" "3,5")
4397 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4398 1.1.1.2 mrg (set_attr "cc" "set_n")])
4399 1.1.1.2 mrg
4400 1.1.1.2 mrg (define_insn "extendhisi2"
4401 1.1.1.6 mrg [(set (match_operand:SI 0 "register_operand" "=r,r")
4402 1.1.1.6 mrg (sign_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))]
4403 1.1.1.2 mrg ""
4404 1.1.1.6 mrg {
4405 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4406 1.1.1.6 mrg }
4407 1.1.1.6 mrg [(set_attr "length" "4,6")
4408 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4409 1.1.1.2 mrg (set_attr "cc" "set_n")])
4410 1.1.1.2 mrg
4411 1.1.1.2 mrg (define_insn "extendpsisi2"
4412 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
4413 1.1.1.2 mrg (sign_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "0")))]
4414 1.1.1.2 mrg ""
4415 1.1.1.6 mrg {
4416 1.1.1.6 mrg return avr_out_sign_extend (insn, operands, NULL);
4417 1.1.1.6 mrg }
4418 1.1.1.2 mrg [(set_attr "length" "3")
4419 1.1.1.6 mrg (set_attr "adjust_len" "sext")
4420 1.1.1.2 mrg (set_attr "cc" "set_n")])
4421 1.1.1.2 mrg
4422 1.1.1.2 mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
4423 1.1.1.2 mrg ;; zero extend
4424 1.1.1.2 mrg
4425 1.1.1.2 mrg (define_insn_and_split "zero_extendqihi2"
4426 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
4427 1.1.1.2 mrg (zero_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
4428 1.1.1.2 mrg ""
4429 1.1.1.2 mrg "#"
4430 1.1.1.2 mrg "reload_completed"
4431 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4432 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4433 1.1.1.2 mrg {
4434 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (QImode, HImode);
4435 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (QImode, HImode);
4436 1.1.1.2 mrg
4437 1.1.1.2 mrg operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, low_off);
4438 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, high_off);
4439 1.1.1.2 mrg })
4440 1.1.1.2 mrg
4441 1.1.1.2 mrg (define_insn_and_split "zero_extendqipsi2"
4442 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
4443 1.1.1.2 mrg (zero_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
4444 1.1.1.2 mrg ""
4445 1.1.1.2 mrg "#"
4446 1.1.1.2 mrg "reload_completed"
4447 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4448 1.1.1.2 mrg (set (match_dup 3) (const_int 0))
4449 1.1.1.2 mrg (set (match_dup 4) (const_int 0))]
4450 1.1.1.2 mrg {
4451 1.1.1.2 mrg operands[2] = simplify_gen_subreg (QImode, operands[0], PSImode, 0);
4452 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], PSImode, 1);
4453 1.1.1.2 mrg operands[4] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
4454 1.1.1.2 mrg })
4455 1.1.1.2 mrg
4456 1.1.1.2 mrg (define_insn_and_split "zero_extendqisi2"
4457 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
4458 1.1.1.2 mrg (zero_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
4459 1.1.1.2 mrg ""
4460 1.1.1.2 mrg "#"
4461 1.1.1.2 mrg "reload_completed"
4462 1.1.1.2 mrg [(set (match_dup 2) (zero_extend:HI (match_dup 1)))
4463 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4464 1.1.1.2 mrg {
4465 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
4466 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (HImode, SImode);
4467 1.1.1.2 mrg
4468 1.1.1.2 mrg operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
4469 1.1.1.2 mrg operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
4470 1.1.1.2 mrg })
4471 1.1.1.2 mrg
4472 1.1.1.2 mrg (define_insn_and_split "zero_extendhipsi2"
4473 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r")
4474 1.1.1.2 mrg (zero_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "r")))]
4475 1.1.1.2 mrg ""
4476 1.1.1.2 mrg "#"
4477 1.1.1.2 mrg "reload_completed"
4478 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4479 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4480 1.1.1.2 mrg {
4481 1.1.1.2 mrg operands[2] = simplify_gen_subreg (HImode, operands[0], PSImode, 0);
4482 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
4483 1.1.1.2 mrg })
4484 1.1.1.2 mrg
4485 1.1.1.2 mrg (define_insn_and_split "n_extendhipsi2"
4486 1.1.1.2 mrg [(set (match_operand:PSI 0 "register_operand" "=r,r,d,r")
4487 1.1.1.2 mrg (lo_sum:PSI (match_operand:QI 1 "const_int_operand" "L,P,n,n")
4488 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r,r,r,r")))
4489 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
4490 1.1.1.2 mrg ""
4491 1.1.1.2 mrg "#"
4492 1.1.1.2 mrg "reload_completed"
4493 1.1.1.2 mrg [(set (match_dup 4) (match_dup 2))
4494 1.1.1.2 mrg (set (match_dup 3) (match_dup 6))
4495 1.1.1.2 mrg ; no-op move in the case where no scratch is needed
4496 1.1.1.2 mrg (set (match_dup 5) (match_dup 3))]
4497 1.1.1.2 mrg {
4498 1.1.1.2 mrg operands[4] = simplify_gen_subreg (HImode, operands[0], PSImode, 0);
4499 1.1.1.2 mrg operands[5] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
4500 1.1.1.2 mrg operands[6] = operands[1];
4501 1.1.1.2 mrg
4502 1.1.1.2 mrg if (GET_CODE (operands[3]) == SCRATCH)
4503 1.1.1.2 mrg operands[3] = operands[5];
4504 1.1.1.2 mrg })
4505 1.1.1.2 mrg
4506 1.1.1.2 mrg (define_insn_and_split "zero_extendhisi2"
4507 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
4508 1.1.1.2 mrg (zero_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "r")))]
4509 1.1.1.2 mrg ""
4510 1.1.1.2 mrg "#"
4511 1.1.1.2 mrg "reload_completed"
4512 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4513 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4514 1.1.1.2 mrg {
4515 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
4516 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (HImode, SImode);
4517 1.1.1.2 mrg
4518 1.1.1.2 mrg operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
4519 1.1.1.2 mrg operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
4520 1.1.1.2 mrg })
4521 1.1.1.2 mrg
4522 1.1.1.2 mrg (define_insn_and_split "zero_extendpsisi2"
4523 1.1.1.2 mrg [(set (match_operand:SI 0 "register_operand" "=r")
4524 1.1.1.2 mrg (zero_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "r")))]
4525 1.1.1.2 mrg ""
4526 1.1.1.2 mrg "#"
4527 1.1.1.2 mrg "reload_completed"
4528 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4529 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4530 1.1.1.2 mrg {
4531 1.1.1.2 mrg operands[2] = simplify_gen_subreg (PSImode, operands[0], SImode, 0);
4532 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], SImode, 3);
4533 1.1.1.2 mrg })
4534 1.1.1.2 mrg
4535 1.1.1.2 mrg (define_insn_and_split "zero_extendqidi2"
4536 1.1.1.2 mrg [(set (match_operand:DI 0 "register_operand" "=r")
4537 1.1.1.2 mrg (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
4538 1.1.1.2 mrg ""
4539 1.1.1.2 mrg "#"
4540 1.1.1.2 mrg "reload_completed"
4541 1.1.1.2 mrg [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
4542 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4543 1.1.1.2 mrg {
4544 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
4545 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
4546 1.1.1.2 mrg
4547 1.1.1.2 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
4548 1.1.1.2 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
4549 1.1.1.2 mrg })
4550 1.1.1.2 mrg
4551 1.1.1.2 mrg (define_insn_and_split "zero_extendhidi2"
4552 1.1.1.2 mrg [(set (match_operand:DI 0 "register_operand" "=r")
4553 1.1.1.2 mrg (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
4554 1.1.1.2 mrg ""
4555 1.1.1.2 mrg "#"
4556 1.1.1.2 mrg "reload_completed"
4557 1.1.1.2 mrg [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
4558 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4559 1.1.1.2 mrg {
4560 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
4561 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
4562 1.1.1.2 mrg
4563 1.1.1.2 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
4564 1.1.1.2 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
4565 1.1.1.2 mrg })
4566 1.1.1.2 mrg
4567 1.1.1.2 mrg (define_insn_and_split "zero_extendsidi2"
4568 1.1.1.2 mrg [(set (match_operand:DI 0 "register_operand" "=r")
4569 1.1.1.2 mrg (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
4570 1.1.1.2 mrg ""
4571 1.1.1.2 mrg "#"
4572 1.1.1.2 mrg "reload_completed"
4573 1.1.1.2 mrg [(set (match_dup 2) (match_dup 1))
4574 1.1.1.2 mrg (set (match_dup 3) (const_int 0))]
4575 1.1.1.2 mrg {
4576 1.1.1.2 mrg unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
4577 1.1.1.2 mrg unsigned int high_off = subreg_highpart_offset (SImode, DImode);
4578 1.1.1.2 mrg
4579 1.1.1.2 mrg operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
4580 1.1.1.2 mrg operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
4581 1.1.1.2 mrg })
4582 1.1.1.2 mrg
4583 1.1.1.2 mrg ;;<=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=>
4584 1.1.1.2 mrg ;; compare
4585 1.1.1.2 mrg
4586 1.1.1.2 mrg ; Optimize negated tests into reverse compare if overflow is undefined.
4587 1.1.1.2 mrg (define_insn "*negated_tstqi"
4588 1.1.1.2 mrg [(set (cc0)
4589 1.1.1.2 mrg (compare (neg:QI (match_operand:QI 0 "register_operand" "r"))
4590 1.1.1.2 mrg (const_int 0)))]
4591 1.1.1.12 mrg "!flag_wrapv && !flag_trapv"
4592 1.1.1.2 mrg "cp __zero_reg__,%0"
4593 1.1.1.2 mrg [(set_attr "cc" "compare")
4594 1.1.1.2 mrg (set_attr "length" "1")])
4595 1.1.1.2 mrg
4596 1.1.1.2 mrg (define_insn "*reversed_tstqi"
4597 1.1.1.2 mrg [(set (cc0)
4598 1.1.1.2 mrg (compare (const_int 0)
4599 1.1.1.2 mrg (match_operand:QI 0 "register_operand" "r")))]
4600 1.1.1.2 mrg ""
4601 1.1.1.2 mrg "cp __zero_reg__,%0"
4602 1.1.1.2 mrg [(set_attr "cc" "compare")
4603 1.1.1.2 mrg (set_attr "length" "2")])
4604 1.1.1.2 mrg
4605 1.1.1.2 mrg (define_insn "*negated_tsthi"
4606 1.1.1.2 mrg [(set (cc0)
4607 1.1.1.2 mrg (compare (neg:HI (match_operand:HI 0 "register_operand" "r"))
4608 1.1.1.2 mrg (const_int 0)))]
4609 1.1.1.12 mrg "!flag_wrapv && !flag_trapv"
4610 1.1.1.2 mrg "cp __zero_reg__,%A0
4611 1.1.1.2 mrg cpc __zero_reg__,%B0"
4612 1.1.1.2 mrg [(set_attr "cc" "compare")
4613 1.1.1.2 mrg (set_attr "length" "2")])
4614 1.1.1.2 mrg
4615 1.1.1.2 mrg ;; Leave here the clobber used by the cmphi pattern for simplicity, even
4616 1.1.1.2 mrg ;; though it is unused, because this pattern is synthesized by avr_reorg.
4617 1.1.1.2 mrg (define_insn "*reversed_tsthi"
4618 1.1.1.2 mrg [(set (cc0)
4619 1.1.1.2 mrg (compare (const_int 0)
4620 1.1.1.2 mrg (match_operand:HI 0 "register_operand" "r")))
4621 1.1.1.2 mrg (clobber (match_scratch:QI 1 "=X"))]
4622 1.1.1.2 mrg ""
4623 1.1.1.2 mrg "cp __zero_reg__,%A0
4624 1.1.1.2 mrg cpc __zero_reg__,%B0"
4625 1.1.1.2 mrg [(set_attr "cc" "compare")
4626 1.1.1.2 mrg (set_attr "length" "2")])
4627 1.1.1.2 mrg
4628 1.1.1.2 mrg (define_insn "*negated_tstpsi"
4629 1.1.1.2 mrg [(set (cc0)
4630 1.1.1.2 mrg (compare (neg:PSI (match_operand:PSI 0 "register_operand" "r"))
4631 1.1.1.2 mrg (const_int 0)))]
4632 1.1.1.12 mrg "!flag_wrapv && !flag_trapv"
4633 1.1.1.2 mrg "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0"
4634 1.1.1.2 mrg [(set_attr "cc" "compare")
4635 1.1.1.2 mrg (set_attr "length" "3")])
4636 1.1.1.2 mrg
4637 1.1.1.2 mrg (define_insn "*reversed_tstpsi"
4638 1.1.1.2 mrg [(set (cc0)
4639 1.1.1.2 mrg (compare (const_int 0)
4640 1.1.1.2 mrg (match_operand:PSI 0 "register_operand" "r")))
4641 1.1.1.2 mrg (clobber (match_scratch:QI 1 "=X"))]
4642 1.1.1.2 mrg ""
4643 1.1.1.2 mrg "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0"
4644 1.1.1.2 mrg [(set_attr "cc" "compare")
4645 1.1.1.2 mrg (set_attr "length" "3")])
4646 1.1.1.2 mrg
4647 1.1.1.2 mrg (define_insn "*negated_tstsi"
4648 1.1.1.2 mrg [(set (cc0)
4649 1.1.1.2 mrg (compare (neg:SI (match_operand:SI 0 "register_operand" "r"))
4650 1.1.1.2 mrg (const_int 0)))]
4651 1.1.1.12 mrg "!flag_wrapv && !flag_trapv"
4652 1.1.1.2 mrg "cp __zero_reg__,%A0
4653 1.1.1.2 mrg cpc __zero_reg__,%B0
4654 1.1.1.2 mrg cpc __zero_reg__,%C0
4655 1.1.1.2 mrg cpc __zero_reg__,%D0"
4656 1.1.1.2 mrg [(set_attr "cc" "compare")
4657 1.1.1.2 mrg (set_attr "length" "4")])
4658 1.1.1.2 mrg
4659 1.1.1.2 mrg ;; "*reversed_tstsi"
4660 1.1.1.2 mrg ;; "*reversed_tstsq" "*reversed_tstusq"
4661 1.1.1.2 mrg ;; "*reversed_tstsa" "*reversed_tstusa"
4662 1.1.1.2 mrg (define_insn "*reversed_tst<mode>"
4663 1.1.1.2 mrg [(set (cc0)
4664 1.1.1.2 mrg (compare (match_operand:ALL4 0 "const0_operand" "Y00")
4665 1.1.1.2 mrg (match_operand:ALL4 1 "register_operand" "r")))
4666 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=X"))]
4667 1.1.1.2 mrg ""
4668 1.1.1.2 mrg "cp __zero_reg__,%A1
4669 1.1.1.2 mrg cpc __zero_reg__,%B1
4670 1.1.1.2 mrg cpc __zero_reg__,%C1
4671 1.1.1.2 mrg cpc __zero_reg__,%D1"
4672 1.1.1.2 mrg [(set_attr "cc" "compare")
4673 1.1.1.2 mrg (set_attr "length" "4")])
4674 1.1.1.2 mrg
4675 1.1.1.2 mrg
4676 1.1.1.9 mrg ;; "cmpqi3"
4677 1.1.1.9 mrg ;; "cmpqq3" "cmpuqq3"
4678 1.1.1.9 mrg (define_insn "cmp<mode>3"
4679 1.1.1.2 mrg [(set (cc0)
4680 1.1.1.2 mrg (compare (match_operand:ALL1 0 "register_operand" "r ,r,d")
4681 1.1.1.2 mrg (match_operand:ALL1 1 "nonmemory_operand" "Y00,r,i")))]
4682 1.1.1.2 mrg ""
4683 1.1.1.2 mrg "@
4684 1.1.1.2 mrg tst %0
4685 1.1.1.2 mrg cp %0,%1
4686 1.1.1.2 mrg cpi %0,lo8(%1)"
4687 1.1.1.2 mrg [(set_attr "cc" "compare,compare,compare")
4688 1.1.1.2 mrg (set_attr "length" "1,1,1")])
4689 1.1.1.2 mrg
4690 1.1.1.2 mrg (define_insn "*cmpqi_sign_extend"
4691 1.1.1.2 mrg [(set (cc0)
4692 1.1.1.2 mrg (compare (sign_extend:HI (match_operand:QI 0 "register_operand" "d"))
4693 1.1.1.2 mrg (match_operand:HI 1 "s8_operand" "n")))]
4694 1.1.1.2 mrg ""
4695 1.1.1.2 mrg "cpi %0,lo8(%1)"
4696 1.1.1.2 mrg [(set_attr "cc" "compare")
4697 1.1.1.2 mrg (set_attr "length" "1")])
4698 1.1.1.2 mrg
4699 1.1.1.9 mrg
4700 1.1.1.9 mrg (define_insn "*cmphi.zero-extend.0"
4701 1.1.1.9 mrg [(set (cc0)
4702 1.1.1.9 mrg (compare (zero_extend:HI (match_operand:QI 0 "register_operand" "r"))
4703 1.1.1.9 mrg (match_operand:HI 1 "register_operand" "r")))]
4704 1.1.1.9 mrg ""
4705 1.1.1.9 mrg "cp %0,%A1\;cpc __zero_reg__,%B1"
4706 1.1.1.9 mrg [(set_attr "cc" "compare")
4707 1.1.1.9 mrg (set_attr "length" "2")])
4708 1.1.1.9 mrg
4709 1.1.1.9 mrg (define_insn "*cmphi.zero-extend.1"
4710 1.1.1.9 mrg [(set (cc0)
4711 1.1.1.9 mrg (compare (match_operand:HI 0 "register_operand" "r")
4712 1.1.1.9 mrg (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))))]
4713 1.1.1.9 mrg ""
4714 1.1.1.9 mrg "cp %A0,%1\;cpc %B0,__zero_reg__"
4715 1.1.1.9 mrg [(set_attr "cc" "compare")
4716 1.1.1.9 mrg (set_attr "length" "2")])
4717 1.1.1.9 mrg
4718 1.1.1.9 mrg ;; "cmphi3"
4719 1.1.1.9 mrg ;; "cmphq3" "cmpuhq3"
4720 1.1.1.9 mrg ;; "cmpha3" "cmpuha3"
4721 1.1.1.9 mrg (define_insn "cmp<mode>3"
4722 1.1.1.2 mrg [(set (cc0)
4723 1.1.1.2 mrg (compare (match_operand:ALL2 0 "register_operand" "!w ,r ,r,d ,r ,d,r")
4724 1.1.1.2 mrg (match_operand:ALL2 1 "nonmemory_operand" "Y00,Y00,r,s ,s ,M,n Ynn")))
4725 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=X ,X ,X,&d,&d ,X,&d"))]
4726 1.1.1.2 mrg ""
4727 1.1.1.2 mrg {
4728 1.1.1.2 mrg switch (which_alternative)
4729 1.1.1.2 mrg {
4730 1.1.1.2 mrg case 0:
4731 1.1.1.2 mrg case 1:
4732 1.1.1.2 mrg return avr_out_tsthi (insn, operands, NULL);
4733 1.1.1.2 mrg
4734 1.1.1.2 mrg case 2:
4735 1.1.1.2 mrg return "cp %A0,%A1\;cpc %B0,%B1";
4736 1.1.1.2 mrg
4737 1.1.1.2 mrg case 3:
4738 1.1.1.2 mrg if (<MODE>mode != HImode)
4739 1.1.1.2 mrg break;
4740 1.1.1.2 mrg return reg_unused_after (insn, operands[0])
4741 1.1.1.2 mrg ? "subi %A0,lo8(%1)\;sbci %B0,hi8(%1)"
4742 1.1.1.2 mrg : "ldi %2,hi8(%1)\;cpi %A0,lo8(%1)\;cpc %B0,%2";
4743 1.1.1.2 mrg
4744 1.1.1.2 mrg case 4:
4745 1.1.1.2 mrg if (<MODE>mode != HImode)
4746 1.1.1.2 mrg break;
4747 1.1.1.2 mrg return "ldi %2,lo8(%1)\;cp %A0,%2\;ldi %2,hi8(%1)\;cpc %B0,%2";
4748 1.1.1.2 mrg }
4749 1.1.1.2 mrg
4750 1.1.1.2 mrg return avr_out_compare (insn, operands, NULL);
4751 1.1.1.2 mrg }
4752 1.1.1.2 mrg [(set_attr "cc" "compare")
4753 1.1.1.2 mrg (set_attr "length" "1,2,2,3,4,2,4")
4754 1.1.1.2 mrg (set_attr "adjust_len" "tsthi,tsthi,*,*,*,compare,compare")])
4755 1.1.1.2 mrg
4756 1.1.1.2 mrg (define_insn "*cmppsi"
4757 1.1.1.2 mrg [(set (cc0)
4758 1.1.1.2 mrg (compare (match_operand:PSI 0 "register_operand" "r,r,d ,r ,d,r")
4759 1.1.1.2 mrg (match_operand:PSI 1 "nonmemory_operand" "L,r,s ,s ,M,n")))
4760 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=X,X,&d,&d ,X,&d"))]
4761 1.1.1.2 mrg ""
4762 1.1.1.2 mrg {
4763 1.1.1.2 mrg switch (which_alternative)
4764 1.1.1.2 mrg {
4765 1.1.1.2 mrg case 0:
4766 1.1.1.2 mrg return avr_out_tstpsi (insn, operands, NULL);
4767 1.1.1.2 mrg
4768 1.1.1.2 mrg case 1:
4769 1.1.1.2 mrg return "cp %A0,%A1\;cpc %B0,%B1\;cpc %C0,%C1";
4770 1.1.1.2 mrg
4771 1.1.1.2 mrg case 2:
4772 1.1.1.2 mrg return reg_unused_after (insn, operands[0])
4773 1.1.1.2 mrg ? "subi %A0,lo8(%1)\;sbci %B0,hi8(%1)\;sbci %C0,hh8(%1)"
4774 1.1.1.2 mrg : "cpi %A0,lo8(%1)\;ldi %2,hi8(%1)\;cpc %B0,%2\;ldi %2,hh8(%1)\;cpc %C0,%2";
4775 1.1.1.2 mrg
4776 1.1.1.2 mrg case 3:
4777 1.1.1.2 mrg return "ldi %2,lo8(%1)\;cp %A0,%2\;ldi %2,hi8(%1)\;cpc %B0,%2\;ldi %2,hh8(%1)\;cpc %C0,%2";
4778 1.1.1.2 mrg }
4779 1.1.1.2 mrg
4780 1.1.1.2 mrg return avr_out_compare (insn, operands, NULL);
4781 1.1.1.2 mrg }
4782 1.1.1.2 mrg [(set_attr "cc" "compare")
4783 1.1.1.2 mrg (set_attr "length" "3,3,5,6,3,7")
4784 1.1.1.2 mrg (set_attr "adjust_len" "tstpsi,*,*,*,compare,compare")])
4785 1.1.1.2 mrg
4786 1.1.1.2 mrg ;; "*cmpsi"
4787 1.1.1.2 mrg ;; "*cmpsq" "*cmpusq"
4788 1.1.1.2 mrg ;; "*cmpsa" "*cmpusa"
4789 1.1.1.2 mrg (define_insn "*cmp<mode>"
4790 1.1.1.2 mrg [(set (cc0)
4791 1.1.1.2 mrg (compare (match_operand:ALL4 0 "register_operand" "r ,r ,d,r ,r")
4792 1.1.1.2 mrg (match_operand:ALL4 1 "nonmemory_operand" "Y00,r ,M,M ,n Ynn")))
4793 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=X ,X ,X,&d,&d"))]
4794 1.1.1.2 mrg ""
4795 1.1.1.2 mrg {
4796 1.1.1.2 mrg if (0 == which_alternative)
4797 1.1.1.2 mrg return avr_out_tstsi (insn, operands, NULL);
4798 1.1.1.2 mrg else if (1 == which_alternative)
4799 1.1.1.2 mrg return "cp %A0,%A1\;cpc %B0,%B1\;cpc %C0,%C1\;cpc %D0,%D1";
4800 1.1.1.2 mrg
4801 1.1.1.2 mrg return avr_out_compare (insn, operands, NULL);
4802 1.1.1.2 mrg }
4803 1.1.1.2 mrg [(set_attr "cc" "compare")
4804 1.1.1.2 mrg (set_attr "length" "4,4,4,5,8")
4805 1.1.1.2 mrg (set_attr "adjust_len" "tstsi,*,compare,compare,compare")])
4806 1.1.1.2 mrg
4807 1.1.1.2 mrg
4808 1.1.1.2 mrg ;; ----------------------------------------------------------------------
4809 1.1.1.2 mrg ;; JUMP INSTRUCTIONS
4810 1.1.1.2 mrg ;; ----------------------------------------------------------------------
4811 1.1.1.2 mrg ;; Conditional jump instructions
4812 1.1.1.2 mrg
4813 1.1.1.2 mrg ;; "cbranchqi4"
4814 1.1.1.2 mrg ;; "cbranchqq4" "cbranchuqq4"
4815 1.1.1.2 mrg (define_expand "cbranch<mode>4"
4816 1.1.1.2 mrg [(set (cc0)
4817 1.1.1.2 mrg (compare (match_operand:ALL1 1 "register_operand" "")
4818 1.1.1.2 mrg (match_operand:ALL1 2 "nonmemory_operand" "")))
4819 1.1.1.2 mrg (set (pc)
4820 1.1.1.2 mrg (if_then_else
4821 1.1.1.2 mrg (match_operator 0 "ordered_comparison_operator" [(cc0)
4822 1.1.1.2 mrg (const_int 0)])
4823 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
4824 1.1.1.2 mrg (pc)))])
4825 1.1.1.2 mrg
4826 1.1.1.2 mrg ;; "cbranchhi4" "cbranchhq4" "cbranchuhq4" "cbranchha4" "cbranchuha4"
4827 1.1.1.2 mrg ;; "cbranchsi4" "cbranchsq4" "cbranchusq4" "cbranchsa4" "cbranchusa4"
4828 1.1.1.2 mrg ;; "cbranchpsi4"
4829 1.1.1.2 mrg (define_expand "cbranch<mode>4"
4830 1.1.1.2 mrg [(parallel [(set (cc0)
4831 1.1.1.2 mrg (compare (match_operand:ORDERED234 1 "register_operand" "")
4832 1.1.1.2 mrg (match_operand:ORDERED234 2 "nonmemory_operand" "")))
4833 1.1.1.2 mrg (clobber (match_scratch:QI 4 ""))])
4834 1.1.1.2 mrg (set (pc)
4835 1.1.1.2 mrg (if_then_else
4836 1.1.1.2 mrg (match_operator 0 "ordered_comparison_operator" [(cc0)
4837 1.1.1.2 mrg (const_int 0)])
4838 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
4839 1.1.1.2 mrg (pc)))])
4840 1.1.1.2 mrg
4841 1.1.1.2 mrg
4842 1.1.1.2 mrg ;; Test a single bit in a QI/HI/SImode register.
4843 1.1.1.2 mrg ;; Combine will create zero extract patterns for single bit tests.
4844 1.1.1.2 mrg ;; permit any mode in source pattern by using VOIDmode.
4845 1.1.1.2 mrg
4846 1.1.1.2 mrg (define_insn "*sbrx_branch<mode>"
4847 1.1.1.2 mrg [(set (pc)
4848 1.1.1.2 mrg (if_then_else
4849 1.1.1.2 mrg (match_operator 0 "eqne_operator"
4850 1.1.1.2 mrg [(zero_extract:QIDI
4851 1.1.1.2 mrg (match_operand:VOID 1 "register_operand" "r")
4852 1.1.1.2 mrg (const_int 1)
4853 1.1.1.2 mrg (match_operand 2 "const_int_operand" "n"))
4854 1.1.1.2 mrg (const_int 0)])
4855 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
4856 1.1.1.2 mrg (pc)))]
4857 1.1.1.2 mrg ""
4858 1.1.1.2 mrg {
4859 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
4860 1.1.1.2 mrg }
4861 1.1.1.2 mrg [(set (attr "length")
4862 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
4863 1.1.1.2 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
4864 1.1.1.2 mrg (const_int 2)
4865 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
4866 1.1.1.2 mrg (const_int 2)
4867 1.1.1.2 mrg (const_int 4))))
4868 1.1.1.2 mrg (set_attr "cc" "clobber")])
4869 1.1.1.2 mrg
4870 1.1.1.2 mrg ;; Same test based on bitwise AND. Keep this in case gcc changes patterns.
4871 1.1.1.2 mrg ;; or for old peepholes.
4872 1.1.1.2 mrg ;; Fixme - bitwise Mask will not work for DImode
4873 1.1.1.2 mrg
4874 1.1.1.2 mrg (define_insn "*sbrx_and_branch<mode>"
4875 1.1.1.2 mrg [(set (pc)
4876 1.1.1.2 mrg (if_then_else
4877 1.1.1.2 mrg (match_operator 0 "eqne_operator"
4878 1.1.1.2 mrg [(and:QISI
4879 1.1.1.2 mrg (match_operand:QISI 1 "register_operand" "r")
4880 1.1.1.2 mrg (match_operand:QISI 2 "single_one_operand" "n"))
4881 1.1.1.2 mrg (const_int 0)])
4882 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
4883 1.1.1.2 mrg (pc)))]
4884 1.1.1.2 mrg ""
4885 1.1.1.2 mrg {
4886 1.1.1.2 mrg HOST_WIDE_INT bitnumber;
4887 1.1.1.2 mrg bitnumber = exact_log2 (GET_MODE_MASK (<MODE>mode) & INTVAL (operands[2]));
4888 1.1.1.2 mrg operands[2] = GEN_INT (bitnumber);
4889 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
4890 1.1.1.2 mrg }
4891 1.1.1.2 mrg [(set (attr "length")
4892 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
4893 1.1.1.2 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
4894 1.1.1.2 mrg (const_int 2)
4895 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
4896 1.1.1.2 mrg (const_int 2)
4897 1.1.1.2 mrg (const_int 4))))
4898 1.1.1.2 mrg (set_attr "cc" "clobber")])
4899 1.1.1.2 mrg
4900 1.1.1.2 mrg ;; Convert sign tests to bit 7/15/31 tests that match the above insns.
4901 1.1.1.2 mrg (define_peephole2
4902 1.1.1.2 mrg [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
4903 1.1.1.2 mrg (const_int 0)))
4904 1.1.1.2 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
4905 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4906 1.1.1.2 mrg (pc)))]
4907 1.1.1.2 mrg ""
4908 1.1.1.2 mrg [(set (pc) (if_then_else (eq (zero_extract:HI (match_dup 0)
4909 1.1.1.2 mrg (const_int 1)
4910 1.1.1.2 mrg (const_int 7))
4911 1.1.1.2 mrg (const_int 0))
4912 1.1.1.2 mrg (label_ref (match_dup 1))
4913 1.1.1.2 mrg (pc)))])
4914 1.1.1.2 mrg
4915 1.1.1.2 mrg (define_peephole2
4916 1.1.1.2 mrg [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
4917 1.1.1.2 mrg (const_int 0)))
4918 1.1.1.2 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
4919 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4920 1.1.1.2 mrg (pc)))]
4921 1.1.1.2 mrg ""
4922 1.1.1.2 mrg [(set (pc) (if_then_else (ne (zero_extract:HI (match_dup 0)
4923 1.1.1.2 mrg (const_int 1)
4924 1.1.1.2 mrg (const_int 7))
4925 1.1.1.2 mrg (const_int 0))
4926 1.1.1.2 mrg (label_ref (match_dup 1))
4927 1.1.1.2 mrg (pc)))])
4928 1.1.1.2 mrg
4929 1.1.1.2 mrg (define_peephole2
4930 1.1.1.2 mrg [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
4931 1.1.1.2 mrg (const_int 0)))
4932 1.1.1.2 mrg (clobber (match_operand:HI 2 ""))])
4933 1.1.1.2 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
4934 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4935 1.1.1.2 mrg (pc)))]
4936 1.1.1.2 mrg ""
4937 1.1.1.2 mrg [(set (pc) (if_then_else (eq (and:HI (match_dup 0) (const_int -32768))
4938 1.1.1.2 mrg (const_int 0))
4939 1.1.1.2 mrg (label_ref (match_dup 1))
4940 1.1.1.2 mrg (pc)))])
4941 1.1.1.2 mrg
4942 1.1.1.2 mrg (define_peephole2
4943 1.1.1.2 mrg [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
4944 1.1.1.2 mrg (const_int 0)))
4945 1.1.1.2 mrg (clobber (match_operand:HI 2 ""))])
4946 1.1.1.2 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
4947 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4948 1.1.1.2 mrg (pc)))]
4949 1.1.1.2 mrg ""
4950 1.1.1.2 mrg [(set (pc) (if_then_else (ne (and:HI (match_dup 0) (const_int -32768))
4951 1.1.1.2 mrg (const_int 0))
4952 1.1.1.2 mrg (label_ref (match_dup 1))
4953 1.1.1.2 mrg (pc)))])
4954 1.1.1.2 mrg
4955 1.1.1.2 mrg (define_peephole2
4956 1.1.1.2 mrg [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
4957 1.1.1.2 mrg (const_int 0)))
4958 1.1.1.2 mrg (clobber (match_operand:SI 2 ""))])
4959 1.1.1.2 mrg (set (pc) (if_then_else (ge (cc0) (const_int 0))
4960 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4961 1.1.1.2 mrg (pc)))]
4962 1.1.1.2 mrg ""
4963 1.1.1.2 mrg [(set (pc) (if_then_else (eq (and:SI (match_dup 0) (match_dup 2))
4964 1.1.1.2 mrg (const_int 0))
4965 1.1.1.2 mrg (label_ref (match_dup 1))
4966 1.1.1.2 mrg (pc)))]
4967 1.1.1.2 mrg "operands[2] = gen_int_mode (-2147483647 - 1, SImode);")
4968 1.1.1.2 mrg
4969 1.1.1.2 mrg (define_peephole2
4970 1.1.1.2 mrg [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
4971 1.1.1.2 mrg (const_int 0)))
4972 1.1.1.2 mrg (clobber (match_operand:SI 2 ""))])
4973 1.1.1.2 mrg (set (pc) (if_then_else (lt (cc0) (const_int 0))
4974 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
4975 1.1.1.2 mrg (pc)))]
4976 1.1.1.2 mrg ""
4977 1.1.1.2 mrg [(set (pc) (if_then_else (ne (and:SI (match_dup 0) (match_dup 2))
4978 1.1.1.2 mrg (const_int 0))
4979 1.1.1.2 mrg (label_ref (match_dup 1))
4980 1.1.1.2 mrg (pc)))]
4981 1.1.1.2 mrg "operands[2] = gen_int_mode (-2147483647 - 1, SImode);")
4982 1.1.1.2 mrg
4983 1.1.1.2 mrg ;; ************************************************************************
4984 1.1.1.2 mrg ;; Implementation of conditional jumps here.
4985 1.1.1.2 mrg ;; Compare with 0 (test) jumps
4986 1.1.1.2 mrg ;; ************************************************************************
4987 1.1.1.2 mrg
4988 1.1.1.2 mrg (define_insn "branch"
4989 1.1.1.2 mrg [(set (pc)
4990 1.1.1.2 mrg (if_then_else (match_operator 1 "simple_comparison_operator"
4991 1.1.1.2 mrg [(cc0)
4992 1.1.1.2 mrg (const_int 0)])
4993 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))
4994 1.1.1.2 mrg (pc)))]
4995 1.1.1.2 mrg ""
4996 1.1.1.2 mrg {
4997 1.1.1.2 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
4998 1.1.1.2 mrg }
4999 1.1.1.2 mrg [(set_attr "type" "branch")
5000 1.1.1.2 mrg (set_attr "cc" "clobber")])
5001 1.1.1.2 mrg
5002 1.1.1.2 mrg
5003 1.1.1.2 mrg ;; Same as above but wrap SET_SRC so that this branch won't be transformed
5004 1.1.1.2 mrg ;; or optimized in the remainder.
5005 1.1.1.2 mrg
5006 1.1.1.2 mrg (define_insn "branch_unspec"
5007 1.1.1.2 mrg [(set (pc)
5008 1.1.1.2 mrg (unspec [(if_then_else (match_operator 1 "simple_comparison_operator"
5009 1.1.1.2 mrg [(cc0)
5010 1.1.1.2 mrg (const_int 0)])
5011 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))
5012 1.1.1.2 mrg (pc))
5013 1.1.1.2 mrg ] UNSPEC_IDENTITY))]
5014 1.1.1.2 mrg ""
5015 1.1.1.2 mrg {
5016 1.1.1.2 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
5017 1.1.1.2 mrg }
5018 1.1.1.2 mrg [(set_attr "type" "branch")
5019 1.1.1.2 mrg (set_attr "cc" "none")])
5020 1.1.1.2 mrg
5021 1.1.1.2 mrg ;; ****************************************************************
5022 1.1.1.2 mrg ;; AVR does not have following conditional jumps: LE,LEU,GT,GTU.
5023 1.1.1.2 mrg ;; Convert them all to proper jumps.
5024 1.1.1.2 mrg ;; ****************************************************************/
5025 1.1.1.2 mrg
5026 1.1.1.2 mrg (define_insn "difficult_branch"
5027 1.1.1.2 mrg [(set (pc)
5028 1.1.1.2 mrg (if_then_else (match_operator 1 "difficult_comparison_operator"
5029 1.1.1.2 mrg [(cc0)
5030 1.1.1.2 mrg (const_int 0)])
5031 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))
5032 1.1.1.2 mrg (pc)))]
5033 1.1.1.2 mrg ""
5034 1.1.1.2 mrg {
5035 1.1.1.2 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
5036 1.1.1.2 mrg }
5037 1.1.1.2 mrg [(set_attr "type" "branch1")
5038 1.1.1.2 mrg (set_attr "cc" "clobber")])
5039 1.1.1.2 mrg
5040 1.1.1.2 mrg ;; revers branch
5041 1.1.1.2 mrg
5042 1.1.1.2 mrg (define_insn "rvbranch"
5043 1.1.1.2 mrg [(set (pc)
5044 1.1.1.2 mrg (if_then_else (match_operator 1 "simple_comparison_operator"
5045 1.1.1.2 mrg [(cc0)
5046 1.1.1.2 mrg (const_int 0)])
5047 1.1.1.2 mrg (pc)
5048 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))))]
5049 1.1.1.2 mrg ""
5050 1.1.1.2 mrg {
5051 1.1.1.2 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);
5052 1.1.1.2 mrg }
5053 1.1.1.2 mrg [(set_attr "type" "branch1")
5054 1.1.1.2 mrg (set_attr "cc" "clobber")])
5055 1.1.1.2 mrg
5056 1.1.1.2 mrg (define_insn "difficult_rvbranch"
5057 1.1.1.2 mrg [(set (pc)
5058 1.1.1.2 mrg (if_then_else (match_operator 1 "difficult_comparison_operator"
5059 1.1.1.2 mrg [(cc0)
5060 1.1.1.2 mrg (const_int 0)])
5061 1.1.1.2 mrg (pc)
5062 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))))]
5063 1.1.1.2 mrg ""
5064 1.1.1.2 mrg {
5065 1.1.1.2 mrg return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);
5066 1.1.1.2 mrg }
5067 1.1.1.2 mrg [(set_attr "type" "branch")
5068 1.1.1.2 mrg (set_attr "cc" "clobber")])
5069 1.1.1.2 mrg
5070 1.1.1.2 mrg ;; **************************************************************************
5071 1.1.1.2 mrg ;; Unconditional and other jump instructions.
5072 1.1.1.2 mrg
5073 1.1.1.2 mrg (define_insn "jump"
5074 1.1.1.2 mrg [(set (pc)
5075 1.1.1.2 mrg (label_ref (match_operand 0 "" "")))]
5076 1.1.1.2 mrg ""
5077 1.1.1.2 mrg {
5078 1.1.1.2 mrg return AVR_HAVE_JMP_CALL && get_attr_length (insn) != 1
5079 1.1.1.2 mrg ? "jmp %x0"
5080 1.1.1.2 mrg : "rjmp %x0";
5081 1.1.1.2 mrg }
5082 1.1.1.2 mrg [(set (attr "length")
5083 1.1.1.2 mrg (if_then_else (match_operand 0 "symbol_ref_operand" "")
5084 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
5085 1.1.1.2 mrg (const_int 1)
5086 1.1.1.2 mrg (const_int 2))
5087 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 0)) (const_int -2047))
5088 1.1.1.2 mrg (le (minus (pc) (match_dup 0)) (const_int 2047)))
5089 1.1.1.2 mrg (const_int 1)
5090 1.1.1.2 mrg (const_int 2))))
5091 1.1.1.2 mrg (set_attr "cc" "none")])
5092 1.1.1.2 mrg
5093 1.1.1.2 mrg ;; call
5094 1.1.1.2 mrg
5095 1.1.1.2 mrg ;; Operand 1 not used on the AVR.
5096 1.1.1.2 mrg ;; Operand 2 is 1 for tail-call, 0 otherwise.
5097 1.1.1.2 mrg (define_expand "call"
5098 1.1.1.2 mrg [(parallel[(call (match_operand:HI 0 "call_insn_operand" "")
5099 1.1.1.2 mrg (match_operand:HI 1 "general_operand" ""))
5100 1.1.1.2 mrg (use (const_int 0))])])
5101 1.1.1.2 mrg
5102 1.1.1.2 mrg ;; Operand 1 not used on the AVR.
5103 1.1.1.2 mrg ;; Operand 2 is 1 for tail-call, 0 otherwise.
5104 1.1.1.2 mrg (define_expand "sibcall"
5105 1.1.1.2 mrg [(parallel[(call (match_operand:HI 0 "call_insn_operand" "")
5106 1.1.1.2 mrg (match_operand:HI 1 "general_operand" ""))
5107 1.1.1.2 mrg (use (const_int 1))])])
5108 1.1.1.2 mrg
5109 1.1.1.2 mrg ;; call value
5110 1.1.1.2 mrg
5111 1.1.1.2 mrg ;; Operand 2 not used on the AVR.
5112 1.1.1.2 mrg ;; Operand 3 is 1 for tail-call, 0 otherwise.
5113 1.1.1.2 mrg (define_expand "call_value"
5114 1.1.1.2 mrg [(parallel[(set (match_operand 0 "register_operand" "")
5115 1.1.1.2 mrg (call (match_operand:HI 1 "call_insn_operand" "")
5116 1.1.1.2 mrg (match_operand:HI 2 "general_operand" "")))
5117 1.1.1.2 mrg (use (const_int 0))])])
5118 1.1.1.2 mrg
5119 1.1.1.2 mrg ;; Operand 2 not used on the AVR.
5120 1.1.1.2 mrg ;; Operand 3 is 1 for tail-call, 0 otherwise.
5121 1.1.1.2 mrg (define_expand "sibcall_value"
5122 1.1.1.2 mrg [(parallel[(set (match_operand 0 "register_operand" "")
5123 1.1.1.2 mrg (call (match_operand:HI 1 "call_insn_operand" "")
5124 1.1.1.2 mrg (match_operand:HI 2 "general_operand" "")))
5125 1.1.1.2 mrg (use (const_int 1))])])
5126 1.1.1.2 mrg
5127 1.1.1.2 mrg (define_insn "call_insn"
5128 1.1.1.2 mrg [(parallel[(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "z,s,z,s"))
5129 1.1.1.2 mrg (match_operand:HI 1 "general_operand" "X,X,X,X"))
5130 1.1.1.2 mrg (use (match_operand:HI 2 "const_int_operand" "L,L,P,P"))])]
5131 1.1.1.2 mrg ;; Operand 1 not used on the AVR.
5132 1.1.1.2 mrg ;; Operand 2 is 1 for tail-call, 0 otherwise.
5133 1.1.1.2 mrg ""
5134 1.1.1.2 mrg "@
5135 1.1.1.2 mrg %!icall
5136 1.1.1.2 mrg %~call %x0
5137 1.1.1.2 mrg %!ijmp
5138 1.1.1.2 mrg %~jmp %x0"
5139 1.1.1.2 mrg [(set_attr "cc" "clobber")
5140 1.1.1.2 mrg (set_attr "length" "1,*,1,*")
5141 1.1.1.2 mrg (set_attr "adjust_len" "*,call,*,call")])
5142 1.1.1.2 mrg
5143 1.1.1.2 mrg (define_insn "call_value_insn"
5144 1.1.1.2 mrg [(parallel[(set (match_operand 0 "register_operand" "=r,r,r,r")
5145 1.1.1.2 mrg (call (mem:HI (match_operand:HI 1 "nonmemory_operand" "z,s,z,s"))
5146 1.1.1.2 mrg (match_operand:HI 2 "general_operand" "X,X,X,X")))
5147 1.1.1.2 mrg (use (match_operand:HI 3 "const_int_operand" "L,L,P,P"))])]
5148 1.1.1.2 mrg ;; Operand 2 not used on the AVR.
5149 1.1.1.2 mrg ;; Operand 3 is 1 for tail-call, 0 otherwise.
5150 1.1.1.2 mrg ""
5151 1.1.1.2 mrg "@
5152 1.1.1.2 mrg %!icall
5153 1.1.1.2 mrg %~call %x1
5154 1.1.1.2 mrg %!ijmp
5155 1.1.1.2 mrg %~jmp %x1"
5156 1.1.1.2 mrg [(set_attr "cc" "clobber")
5157 1.1.1.2 mrg (set_attr "length" "1,*,1,*")
5158 1.1.1.2 mrg (set_attr "adjust_len" "*,call,*,call")])
5159 1.1.1.2 mrg
5160 1.1.1.2 mrg (define_insn "nop"
5161 1.1.1.2 mrg [(const_int 0)]
5162 1.1.1.2 mrg ""
5163 1.1.1.2 mrg "nop"
5164 1.1.1.2 mrg [(set_attr "cc" "none")
5165 1.1.1.2 mrg (set_attr "length" "1")])
5166 1.1.1.2 mrg
5167 1.1.1.2 mrg ; indirect jump
5168 1.1.1.2 mrg
5169 1.1.1.2 mrg (define_expand "indirect_jump"
5170 1.1.1.2 mrg [(set (pc)
5171 1.1.1.2 mrg (match_operand:HI 0 "nonmemory_operand" ""))]
5172 1.1.1.2 mrg ""
5173 1.1.1.2 mrg {
5174 1.1.1.2 mrg if (!AVR_HAVE_JMP_CALL && !register_operand (operands[0], HImode))
5175 1.1.1.2 mrg {
5176 1.1.1.2 mrg operands[0] = copy_to_mode_reg (HImode, operands[0]);
5177 1.1.1.2 mrg }
5178 1.1.1.2 mrg })
5179 1.1.1.2 mrg
5180 1.1.1.2 mrg ; indirect jump
5181 1.1.1.2 mrg (define_insn "*indirect_jump"
5182 1.1.1.2 mrg [(set (pc)
5183 1.1.1.2 mrg (match_operand:HI 0 "nonmemory_operand" "i,i,!z,*r,z"))]
5184 1.1.1.2 mrg ""
5185 1.1.1.2 mrg "@
5186 1.1.1.2 mrg rjmp %x0
5187 1.1.1.2 mrg jmp %x0
5188 1.1.1.2 mrg ijmp
5189 1.1.1.2 mrg push %A0\;push %B0\;ret
5190 1.1.1.2 mrg eijmp"
5191 1.1.1.2 mrg [(set_attr "length" "1,2,1,3,1")
5192 1.1.1.2 mrg (set_attr "isa" "rjmp,jmp,ijmp,ijmp,eijmp")
5193 1.1.1.2 mrg (set_attr "cc" "none")])
5194 1.1.1.2 mrg
5195 1.1.1.2 mrg ;; table jump
5196 1.1.1.12 mrg ;; For entries in jump table see avr_output_addr_vec.
5197 1.1.1.2 mrg
5198 1.1.1.2 mrg ;; Table made from
5199 1.1.1.2 mrg ;; "rjmp .L<n>" instructions for <= 8K devices
5200 1.1.1.2 mrg ;; ".word gs(.L<n>)" addresses for > 8K devices
5201 1.1.1.2 mrg (define_insn "*tablejump"
5202 1.1.1.2 mrg [(set (pc)
5203 1.1.1.2 mrg (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")]
5204 1.1.1.2 mrg UNSPEC_INDEX_JMP))
5205 1.1.1.2 mrg (use (label_ref (match_operand 1 "" "")))
5206 1.1.1.6 mrg (clobber (match_dup 0))
5207 1.1.1.6 mrg (clobber (const_int 0))]
5208 1.1.1.6 mrg "!AVR_HAVE_EIJMP_EICALL"
5209 1.1.1.2 mrg "@
5210 1.1.1.2 mrg ijmp
5211 1.1.1.2 mrg push %A0\;push %B0\;ret
5212 1.1.1.2 mrg jmp __tablejump2__"
5213 1.1.1.2 mrg [(set_attr "length" "1,3,2")
5214 1.1.1.2 mrg (set_attr "isa" "rjmp,rjmp,jmp")
5215 1.1.1.2 mrg (set_attr "cc" "none,none,clobber")])
5216 1.1.1.2 mrg
5217 1.1.1.6 mrg (define_insn "*tablejump.3byte-pc"
5218 1.1.1.6 mrg [(set (pc)
5219 1.1.1.6 mrg (unspec:HI [(reg:HI REG_Z)]
5220 1.1.1.6 mrg UNSPEC_INDEX_JMP))
5221 1.1.1.6 mrg (use (label_ref (match_operand 0 "" "")))
5222 1.1.1.6 mrg (clobber (reg:HI REG_Z))
5223 1.1.1.6 mrg (clobber (reg:QI 24))]
5224 1.1.1.6 mrg "AVR_HAVE_EIJMP_EICALL"
5225 1.1.1.6 mrg "clr r24\;subi r30,pm_lo8(-(%0))\;sbci r31,pm_hi8(-(%0))\;sbci r24,pm_hh8(-(%0))\;jmp __tablejump2__"
5226 1.1.1.6 mrg [(set_attr "length" "6")
5227 1.1.1.6 mrg (set_attr "isa" "eijmp")
5228 1.1.1.6 mrg (set_attr "cc" "clobber")])
5229 1.1.1.6 mrg
5230 1.1.1.2 mrg
5231 1.1.1.9 mrg ;; FIXME: casesi comes up with an SImode switch value $0 which
5232 1.1.1.9 mrg ;; is quite some overhead because most code would use HI or
5233 1.1.1.9 mrg ;; even QI. We add an AVR specific pass .avr-casesi which
5234 1.1.1.9 mrg ;; tries to recover from the superfluous extension to SImode.
5235 1.1.1.9 mrg ;;
5236 1.1.1.9 mrg ;; Using "tablejump" could be a way out, but this also does
5237 1.1.1.9 mrg ;; not perform in a satisfying manner as the middle end will
5238 1.1.1.9 mrg ;; already multiply the table index by 2. Note that this
5239 1.1.1.9 mrg ;; multiplication is performed by libgcc's __tablejump2__.
5240 1.1.1.9 mrg ;; The multiplication there, however, runs *after* the table
5241 1.1.1.9 mrg ;; start (a byte address) has been added, not before it like
5242 1.1.1.9 mrg ;; "tablejump" will do.
5243 1.1.1.9 mrg ;;
5244 1.1.1.9 mrg ;; The preferred solution would be to let the middle ends pass
5245 1.1.1.9 mrg ;; down information on the index as an additional casesi operand.
5246 1.1.1.9 mrg ;;
5247 1.1.1.9 mrg ;; If this expander is changed, you'll likely have to go through
5248 1.1.1.9 mrg ;; "casesi_<mode>_sequence" (used to recog + extract casesi
5249 1.1.1.9 mrg ;; sequences in pass .avr-casesi) and propagate all adjustments
5250 1.1.1.9 mrg ;; also to that pattern and the code of the extra pass.
5251 1.1.1.9 mrg
5252 1.1.1.2 mrg (define_expand "casesi"
5253 1.1.1.9 mrg [(parallel [(set (match_dup 5)
5254 1.1.1.9 mrg (plus:SI (match_operand:SI 0 "register_operand")
5255 1.1.1.9 mrg (match_operand:SI 1 "const_int_operand")))
5256 1.1.1.2 mrg (clobber (scratch:QI))])
5257 1.1.1.2 mrg (parallel [(set (cc0)
5258 1.1.1.9 mrg (compare (match_dup 5)
5259 1.1.1.9 mrg (match_operand:SI 2 "const_int_operand")))
5260 1.1.1.9 mrg (clobber (scratch:QI))])
5261 1.1.1.2 mrg
5262 1.1.1.2 mrg (set (pc)
5263 1.1.1.2 mrg (if_then_else (gtu (cc0)
5264 1.1.1.2 mrg (const_int 0))
5265 1.1.1.9 mrg (label_ref (match_operand 4))
5266 1.1.1.2 mrg (pc)))
5267 1.1.1.2 mrg
5268 1.1.1.9 mrg (set (match_dup 7)
5269 1.1.1.9 mrg (match_dup 6))
5270 1.1.1.2 mrg
5271 1.1.1.6 mrg (parallel [(set (pc)
5272 1.1.1.9 mrg (unspec:HI [(match_dup 7)] UNSPEC_INDEX_JMP))
5273 1.1.1.2 mrg (use (label_ref (match_dup 3)))
5274 1.1.1.9 mrg (clobber (match_dup 7))
5275 1.1.1.6 mrg (clobber (match_dup 8))])]
5276 1.1.1.2 mrg ""
5277 1.1.1.2 mrg {
5278 1.1.1.9 mrg operands[1] = simplify_unary_operation (NEG, SImode, operands[1], SImode);
5279 1.1.1.9 mrg operands[5] = gen_reg_rtx (SImode);
5280 1.1.1.9 mrg operands[6] = simplify_gen_subreg (HImode, operands[5], SImode, 0);
5281 1.1.1.6 mrg
5282 1.1.1.6 mrg if (AVR_HAVE_EIJMP_EICALL)
5283 1.1.1.6 mrg {
5284 1.1.1.9 mrg operands[7] = gen_rtx_REG (HImode, REG_Z);
5285 1.1.1.6 mrg operands[8] = all_regs_rtx[24];
5286 1.1.1.6 mrg }
5287 1.1.1.6 mrg else
5288 1.1.1.6 mrg {
5289 1.1.1.9 mrg operands[6] = gen_rtx_PLUS (HImode, operands[6],
5290 1.1.1.6 mrg gen_rtx_LABEL_REF (VOIDmode, operands[3]));
5291 1.1.1.9 mrg operands[7] = gen_reg_rtx (HImode);
5292 1.1.1.6 mrg operands[8] = const0_rtx;
5293 1.1.1.6 mrg }
5294 1.1.1.2 mrg })
5295 1.1 mrg
5296 1.1.1.2 mrg
5297 1.1.1.9 mrg ;; This insn is used only for easy operand extraction.
5298 1.1.1.9 mrg ;; The elements must match an extension to SImode plus
5299 1.1.1.9 mrg ;; a sequence generated by casesi above.
5300 1.1.1.9 mrg
5301 1.1.1.9 mrg ;; "casesi_qi_sequence"
5302 1.1.1.9 mrg ;; "casesi_hi_sequence"
5303 1.1.1.9 mrg (define_insn "casesi_<mode>_sequence"
5304 1.1.1.9 mrg [(set (match_operand:SI 0 "register_operand")
5305 1.1.1.9 mrg (match_operator:SI 9 "extend_operator"
5306 1.1.1.9 mrg [(match_operand:QIHI 10 "register_operand")]))
5307 1.1.1.9 mrg
5308 1.1.1.9 mrg ;; What follows is a matcher for code from casesi.
5309 1.1.1.9 mrg ;; We keep the same operand numbering (except for $9 and $10
5310 1.1.1.9 mrg ;; which don't appear in casesi).
5311 1.1.1.9 mrg (parallel [(set (match_operand:SI 5 "register_operand")
5312 1.1.1.9 mrg (plus:SI (match_dup 0)
5313 1.1.1.9 mrg (match_operand:SI 1 "const_int_operand")))
5314 1.1.1.9 mrg (clobber (scratch:QI))])
5315 1.1.1.9 mrg (parallel [(set (cc0)
5316 1.1.1.9 mrg (compare (match_dup 5)
5317 1.1.1.9 mrg (match_operand:SI 2 "const_int_operand")))
5318 1.1.1.9 mrg (clobber (scratch:QI))])
5319 1.1.1.9 mrg
5320 1.1.1.9 mrg (set (pc)
5321 1.1.1.9 mrg (if_then_else (gtu (cc0)
5322 1.1.1.9 mrg (const_int 0))
5323 1.1.1.9 mrg (label_ref (match_operand 4))
5324 1.1.1.9 mrg (pc)))
5325 1.1.1.9 mrg
5326 1.1.1.9 mrg (set (match_operand:HI 7 "register_operand")
5327 1.1.1.9 mrg (match_operand:HI 6))
5328 1.1.1.9 mrg
5329 1.1.1.9 mrg (parallel [(set (pc)
5330 1.1.1.9 mrg (unspec:HI [(match_dup 7)] UNSPEC_INDEX_JMP))
5331 1.1.1.9 mrg (use (label_ref (match_operand 3)))
5332 1.1.1.9 mrg (clobber (match_dup 7))
5333 1.1.1.9 mrg (clobber (match_operand:QI 8))])]
5334 1.1.1.9 mrg "optimize
5335 1.1.1.9 mrg && avr_casei_sequence_check_operands (operands)"
5336 1.1.1.9 mrg { gcc_unreachable(); }
5337 1.1.1.9 mrg )
5338 1.1.1.9 mrg
5339 1.1.1.9 mrg
5340 1.1.1.2 mrg ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5341 1.1.1.2 mrg ;; This instruction sets Z flag
5342 1.1.1.2 mrg
5343 1.1.1.2 mrg (define_insn "sez"
5344 1.1.1.2 mrg [(set (cc0) (const_int 0))]
5345 1.1 mrg ""
5346 1.1.1.2 mrg "sez"
5347 1.1.1.2 mrg [(set_attr "length" "1")
5348 1.1.1.2 mrg (set_attr "cc" "compare")])
5349 1.1 mrg
5350 1.1.1.2 mrg ;; Clear/set/test a single bit in I/O address space.
5351 1.1 mrg
5352 1.1.1.2 mrg (define_insn "*cbi"
5353 1.1.1.6 mrg [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
5354 1.1.1.2 mrg (and:QI (mem:QI (match_dup 0))
5355 1.1.1.2 mrg (match_operand:QI 1 "single_zero_operand" "n")))]
5356 1.1 mrg ""
5357 1.1.1.2 mrg {
5358 1.1.1.2 mrg operands[2] = GEN_INT (exact_log2 (~INTVAL (operands[1]) & 0xff));
5359 1.1.1.2 mrg return "cbi %i0,%2";
5360 1.1.1.2 mrg }
5361 1.1.1.2 mrg [(set_attr "length" "1")
5362 1.1.1.2 mrg (set_attr "cc" "none")])
5363 1.1 mrg
5364 1.1.1.2 mrg (define_insn "*sbi"
5365 1.1.1.6 mrg [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
5366 1.1.1.2 mrg (ior:QI (mem:QI (match_dup 0))
5367 1.1.1.2 mrg (match_operand:QI 1 "single_one_operand" "n")))]
5368 1.1 mrg ""
5369 1.1.1.2 mrg {
5370 1.1.1.2 mrg operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1]) & 0xff));
5371 1.1.1.2 mrg return "sbi %i0,%2";
5372 1.1.1.2 mrg }
5373 1.1.1.2 mrg [(set_attr "length" "1")
5374 1.1.1.2 mrg (set_attr "cc" "none")])
5375 1.1 mrg
5376 1.1.1.2 mrg ;; Lower half of the I/O space - use sbic/sbis directly.
5377 1.1.1.2 mrg (define_insn "*sbix_branch"
5378 1.1.1.2 mrg [(set (pc)
5379 1.1.1.2 mrg (if_then_else
5380 1.1.1.2 mrg (match_operator 0 "eqne_operator"
5381 1.1.1.2 mrg [(zero_extract:QIHI
5382 1.1.1.6 mrg (mem:QI (match_operand 1 "low_io_address_operand" "i"))
5383 1.1.1.2 mrg (const_int 1)
5384 1.1.1.2 mrg (match_operand 2 "const_int_operand" "n"))
5385 1.1.1.2 mrg (const_int 0)])
5386 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
5387 1.1.1.2 mrg (pc)))]
5388 1.1.1.2 mrg ""
5389 1.1.1.2 mrg {
5390 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
5391 1.1.1.2 mrg }
5392 1.1.1.2 mrg [(set (attr "length")
5393 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
5394 1.1.1.2 mrg (le (minus (pc) (match_dup 3)) (const_int 2046)))
5395 1.1.1.2 mrg (const_int 2)
5396 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
5397 1.1.1.2 mrg (const_int 2)
5398 1.1.1.2 mrg (const_int 4))))
5399 1.1.1.2 mrg (set_attr "cc" "clobber")])
5400 1.1.1.2 mrg
5401 1.1.1.2 mrg ;; Tests of bit 7 are pessimized to sign tests, so we need this too...
5402 1.1.1.2 mrg (define_insn "*sbix_branch_bit7"
5403 1.1.1.2 mrg [(set (pc)
5404 1.1.1.2 mrg (if_then_else
5405 1.1.1.2 mrg (match_operator 0 "gelt_operator"
5406 1.1.1.6 mrg [(mem:QI (match_operand 1 "low_io_address_operand" "i"))
5407 1.1.1.2 mrg (const_int 0)])
5408 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5409 1.1.1.2 mrg (pc)))]
5410 1.1.1.2 mrg ""
5411 1.1.1.2 mrg {
5412 1.1.1.2 mrg operands[3] = operands[2];
5413 1.1.1.2 mrg operands[2] = GEN_INT (7);
5414 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
5415 1.1.1.2 mrg }
5416 1.1.1.2 mrg [(set (attr "length")
5417 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
5418 1.1.1.2 mrg (le (minus (pc) (match_dup 2)) (const_int 2046)))
5419 1.1.1.2 mrg (const_int 2)
5420 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
5421 1.1.1.2 mrg (const_int 2)
5422 1.1.1.2 mrg (const_int 4))))
5423 1.1.1.2 mrg (set_attr "cc" "clobber")])
5424 1.1.1.2 mrg
5425 1.1.1.2 mrg ;; Upper half of the I/O space - read port to __tmp_reg__ and use sbrc/sbrs.
5426 1.1.1.2 mrg (define_insn "*sbix_branch_tmp"
5427 1.1.1.2 mrg [(set (pc)
5428 1.1.1.2 mrg (if_then_else
5429 1.1.1.2 mrg (match_operator 0 "eqne_operator"
5430 1.1.1.2 mrg [(zero_extract:QIHI
5431 1.1.1.2 mrg (mem:QI (match_operand 1 "high_io_address_operand" "n"))
5432 1.1.1.2 mrg (const_int 1)
5433 1.1.1.2 mrg (match_operand 2 "const_int_operand" "n"))
5434 1.1.1.2 mrg (const_int 0)])
5435 1.1.1.2 mrg (label_ref (match_operand 3 "" ""))
5436 1.1.1.2 mrg (pc)))]
5437 1.1.1.2 mrg ""
5438 1.1.1.2 mrg {
5439 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
5440 1.1.1.2 mrg }
5441 1.1.1.2 mrg [(set (attr "length")
5442 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
5443 1.1.1.2 mrg (le (minus (pc) (match_dup 3)) (const_int 2045)))
5444 1.1.1.2 mrg (const_int 3)
5445 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
5446 1.1.1.2 mrg (const_int 3)
5447 1.1.1.2 mrg (const_int 5))))
5448 1.1.1.2 mrg (set_attr "cc" "clobber")])
5449 1.1.1.2 mrg
5450 1.1.1.2 mrg (define_insn "*sbix_branch_tmp_bit7"
5451 1.1.1.2 mrg [(set (pc)
5452 1.1.1.2 mrg (if_then_else
5453 1.1.1.2 mrg (match_operator 0 "gelt_operator"
5454 1.1.1.2 mrg [(mem:QI (match_operand 1 "high_io_address_operand" "n"))
5455 1.1.1.2 mrg (const_int 0)])
5456 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5457 1.1.1.2 mrg (pc)))]
5458 1.1.1.2 mrg ""
5459 1.1.1.2 mrg {
5460 1.1.1.2 mrg operands[3] = operands[2];
5461 1.1.1.2 mrg operands[2] = GEN_INT (7);
5462 1.1.1.2 mrg return avr_out_sbxx_branch (insn, operands);
5463 1.1.1.2 mrg }
5464 1.1.1.2 mrg [(set (attr "length")
5465 1.1.1.2 mrg (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
5466 1.1.1.2 mrg (le (minus (pc) (match_dup 2)) (const_int 2045)))
5467 1.1.1.2 mrg (const_int 3)
5468 1.1.1.2 mrg (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
5469 1.1.1.2 mrg (const_int 3)
5470 1.1.1.2 mrg (const_int 5))))
5471 1.1.1.2 mrg (set_attr "cc" "clobber")])
5472 1.1.1.2 mrg
5473 1.1.1.2 mrg ;; ************************* Peepholes ********************************
5474 1.1.1.2 mrg
5475 1.1.1.2 mrg (define_peephole ; "*dec-and-branchsi!=-1.d.clobber"
5476 1.1.1.2 mrg [(parallel [(set (match_operand:SI 0 "d_register_operand" "")
5477 1.1.1.2 mrg (plus:SI (match_dup 0)
5478 1.1.1.2 mrg (const_int -1)))
5479 1.1.1.2 mrg (clobber (scratch:QI))])
5480 1.1.1.2 mrg (parallel [(set (cc0)
5481 1.1.1.2 mrg (compare (match_dup 0)
5482 1.1.1.2 mrg (const_int -1)))
5483 1.1.1.2 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
5484 1.1.1.2 mrg (set (pc)
5485 1.1.1.2 mrg (if_then_else (eqne (cc0)
5486 1.1.1.2 mrg (const_int 0))
5487 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5488 1.1.1.2 mrg (pc)))]
5489 1.1.1.2 mrg ""
5490 1.1.1.2 mrg {
5491 1.1.1.2 mrg const char *op;
5492 1.1.1.2 mrg int jump_mode;
5493 1.1.1.2 mrg CC_STATUS_INIT;
5494 1.1.1.2 mrg if (test_hard_reg_class (ADDW_REGS, operands[0]))
5495 1.1.1.2 mrg output_asm_insn ("sbiw %0,1" CR_TAB
5496 1.1.1.2 mrg "sbc %C0,__zero_reg__" CR_TAB
5497 1.1.1.2 mrg "sbc %D0,__zero_reg__", operands);
5498 1.1.1.2 mrg else
5499 1.1.1.2 mrg output_asm_insn ("subi %A0,1" CR_TAB
5500 1.1.1.2 mrg "sbc %B0,__zero_reg__" CR_TAB
5501 1.1.1.2 mrg "sbc %C0,__zero_reg__" CR_TAB
5502 1.1.1.2 mrg "sbc %D0,__zero_reg__", operands);
5503 1.1.1.2 mrg
5504 1.1.1.2 mrg jump_mode = avr_jump_mode (operands[2], insn);
5505 1.1.1.2 mrg op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
5506 1.1.1.2 mrg operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
5507 1.1.1.2 mrg
5508 1.1.1.2 mrg switch (jump_mode)
5509 1.1.1.2 mrg {
5510 1.1.1.2 mrg case 1: return "%1 %2";
5511 1.1.1.2 mrg case 2: return "%1 .+2\;rjmp %2";
5512 1.1.1.2 mrg case 3: return "%1 .+4\;jmp %2";
5513 1.1.1.2 mrg }
5514 1.1.1.2 mrg
5515 1.1.1.2 mrg gcc_unreachable();
5516 1.1.1.2 mrg return "";
5517 1.1.1.2 mrg })
5518 1.1.1.2 mrg
5519 1.1.1.2 mrg (define_peephole ; "*dec-and-branchhi!=-1"
5520 1.1.1.2 mrg [(set (match_operand:HI 0 "d_register_operand" "")
5521 1.1.1.2 mrg (plus:HI (match_dup 0)
5522 1.1.1.2 mrg (const_int -1)))
5523 1.1.1.2 mrg (parallel [(set (cc0)
5524 1.1.1.2 mrg (compare (match_dup 0)
5525 1.1.1.2 mrg (const_int -1)))
5526 1.1.1.2 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
5527 1.1.1.2 mrg (set (pc)
5528 1.1.1.2 mrg (if_then_else (eqne (cc0)
5529 1.1.1.2 mrg (const_int 0))
5530 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5531 1.1.1.2 mrg (pc)))]
5532 1.1.1.2 mrg ""
5533 1.1.1.2 mrg {
5534 1.1.1.2 mrg const char *op;
5535 1.1.1.2 mrg int jump_mode;
5536 1.1.1.2 mrg CC_STATUS_INIT;
5537 1.1.1.2 mrg if (test_hard_reg_class (ADDW_REGS, operands[0]))
5538 1.1.1.2 mrg output_asm_insn ("sbiw %0,1", operands);
5539 1.1.1.2 mrg else
5540 1.1.1.2 mrg output_asm_insn ("subi %A0,1" CR_TAB
5541 1.1.1.2 mrg "sbc %B0,__zero_reg__", operands);
5542 1.1.1.2 mrg
5543 1.1.1.2 mrg jump_mode = avr_jump_mode (operands[2], insn);
5544 1.1.1.2 mrg op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
5545 1.1.1.2 mrg operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
5546 1.1.1.2 mrg
5547 1.1.1.2 mrg switch (jump_mode)
5548 1.1.1.2 mrg {
5549 1.1.1.2 mrg case 1: return "%1 %2";
5550 1.1.1.2 mrg case 2: return "%1 .+2\;rjmp %2";
5551 1.1.1.2 mrg case 3: return "%1 .+4\;jmp %2";
5552 1.1.1.2 mrg }
5553 1.1.1.2 mrg
5554 1.1.1.2 mrg gcc_unreachable();
5555 1.1.1.2 mrg return "";
5556 1.1.1.2 mrg })
5557 1.1.1.2 mrg
5558 1.1.1.2 mrg ;; Same as above but with clobber flavour of addhi3
5559 1.1.1.2 mrg (define_peephole ; "*dec-and-branchhi!=-1.d.clobber"
5560 1.1.1.2 mrg [(parallel [(set (match_operand:HI 0 "d_register_operand" "")
5561 1.1.1.2 mrg (plus:HI (match_dup 0)
5562 1.1.1.2 mrg (const_int -1)))
5563 1.1.1.2 mrg (clobber (scratch:QI))])
5564 1.1.1.2 mrg (parallel [(set (cc0)
5565 1.1.1.2 mrg (compare (match_dup 0)
5566 1.1.1.2 mrg (const_int -1)))
5567 1.1.1.2 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
5568 1.1.1.2 mrg (set (pc)
5569 1.1.1.2 mrg (if_then_else (eqne (cc0)
5570 1.1.1.2 mrg (const_int 0))
5571 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5572 1.1.1.2 mrg (pc)))]
5573 1.1.1.2 mrg ""
5574 1.1.1.2 mrg {
5575 1.1.1.2 mrg const char *op;
5576 1.1.1.2 mrg int jump_mode;
5577 1.1.1.2 mrg CC_STATUS_INIT;
5578 1.1.1.2 mrg if (test_hard_reg_class (ADDW_REGS, operands[0]))
5579 1.1.1.2 mrg output_asm_insn ("sbiw %0,1", operands);
5580 1.1.1.2 mrg else
5581 1.1.1.2 mrg output_asm_insn ("subi %A0,1" CR_TAB
5582 1.1.1.2 mrg "sbc %B0,__zero_reg__", operands);
5583 1.1.1.2 mrg
5584 1.1.1.2 mrg jump_mode = avr_jump_mode (operands[2], insn);
5585 1.1.1.2 mrg op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
5586 1.1.1.2 mrg operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
5587 1.1.1.2 mrg
5588 1.1.1.2 mrg switch (jump_mode)
5589 1.1.1.2 mrg {
5590 1.1.1.2 mrg case 1: return "%1 %2";
5591 1.1.1.2 mrg case 2: return "%1 .+2\;rjmp %2";
5592 1.1.1.2 mrg case 3: return "%1 .+4\;jmp %2";
5593 1.1.1.2 mrg }
5594 1.1.1.2 mrg
5595 1.1.1.2 mrg gcc_unreachable();
5596 1.1.1.2 mrg return "";
5597 1.1.1.2 mrg })
5598 1.1.1.2 mrg
5599 1.1.1.2 mrg ;; Same as above but with clobber flavour of addhi3
5600 1.1.1.2 mrg (define_peephole ; "*dec-and-branchhi!=-1.l.clobber"
5601 1.1.1.2 mrg [(parallel [(set (match_operand:HI 0 "l_register_operand" "")
5602 1.1.1.2 mrg (plus:HI (match_dup 0)
5603 1.1.1.2 mrg (const_int -1)))
5604 1.1.1.2 mrg (clobber (match_operand:QI 3 "d_register_operand" ""))])
5605 1.1.1.2 mrg (parallel [(set (cc0)
5606 1.1.1.2 mrg (compare (match_dup 0)
5607 1.1.1.2 mrg (const_int -1)))
5608 1.1.1.2 mrg (clobber (match_operand:QI 1 "d_register_operand" ""))])
5609 1.1.1.2 mrg (set (pc)
5610 1.1.1.2 mrg (if_then_else (eqne (cc0)
5611 1.1.1.2 mrg (const_int 0))
5612 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
5613 1.1.1.2 mrg (pc)))]
5614 1.1.1.2 mrg ""
5615 1.1.1.2 mrg {
5616 1.1.1.2 mrg const char *op;
5617 1.1.1.2 mrg int jump_mode;
5618 1.1.1.2 mrg CC_STATUS_INIT;
5619 1.1.1.2 mrg output_asm_insn ("ldi %3,1" CR_TAB
5620 1.1.1.2 mrg "sub %A0,%3" CR_TAB
5621 1.1.1.2 mrg "sbc %B0,__zero_reg__", operands);
5622 1.1.1.2 mrg
5623 1.1.1.2 mrg jump_mode = avr_jump_mode (operands[2], insn);
5624 1.1.1.2 mrg op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
5625 1.1.1.2 mrg operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
5626 1.1.1.2 mrg
5627 1.1.1.2 mrg switch (jump_mode)
5628 1.1.1.2 mrg {
5629 1.1.1.2 mrg case 1: return "%1 %2";
5630 1.1.1.2 mrg case 2: return "%1 .+2\;rjmp %2";
5631 1.1.1.2 mrg case 3: return "%1 .+4\;jmp %2";
5632 1.1.1.2 mrg }
5633 1.1.1.2 mrg
5634 1.1.1.2 mrg gcc_unreachable();
5635 1.1.1.2 mrg return "";
5636 1.1.1.2 mrg })
5637 1.1.1.2 mrg
5638 1.1.1.2 mrg (define_peephole ; "*dec-and-branchqi!=-1"
5639 1.1.1.2 mrg [(set (match_operand:QI 0 "d_register_operand" "")
5640 1.1.1.2 mrg (plus:QI (match_dup 0)
5641 1.1.1.2 mrg (const_int -1)))
5642 1.1.1.2 mrg (set (cc0)
5643 1.1.1.2 mrg (compare (match_dup 0)
5644 1.1.1.2 mrg (const_int -1)))
5645 1.1.1.2 mrg (set (pc)
5646 1.1.1.2 mrg (if_then_else (eqne (cc0)
5647 1.1.1.2 mrg (const_int 0))
5648 1.1.1.2 mrg (label_ref (match_operand 1 "" ""))
5649 1.1.1.2 mrg (pc)))]
5650 1.1 mrg ""
5651 1.1.1.2 mrg {
5652 1.1.1.2 mrg const char *op;
5653 1.1.1.2 mrg int jump_mode;
5654 1.1.1.2 mrg CC_STATUS_INIT;
5655 1.1.1.2 mrg cc_status.value1 = operands[0];
5656 1.1.1.2 mrg cc_status.flags |= CC_OVERFLOW_UNUSABLE;
5657 1.1.1.2 mrg
5658 1.1.1.2 mrg output_asm_insn ("subi %A0,1", operands);
5659 1.1.1.2 mrg
5660 1.1.1.2 mrg jump_mode = avr_jump_mode (operands[1], insn);
5661 1.1.1.2 mrg op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
5662 1.1.1.2 mrg operands[0] = gen_rtx_CONST_STRING (VOIDmode, op);
5663 1.1.1.2 mrg
5664 1.1.1.2 mrg switch (jump_mode)
5665 1.1.1.2 mrg {
5666 1.1.1.2 mrg case 1: return "%0 %1";
5667 1.1.1.2 mrg case 2: return "%0 .+2\;rjmp %1";
5668 1.1.1.2 mrg case 3: return "%0 .+4\;jmp %1";
5669 1.1.1.2 mrg }
5670 1.1.1.2 mrg
5671 1.1.1.2 mrg gcc_unreachable();
5672 1.1.1.2 mrg return "";
5673 1.1.1.2 mrg })
5674 1.1.1.2 mrg
5675 1.1.1.2 mrg
5676 1.1.1.2 mrg (define_peephole ; "*cpse.eq"
5677 1.1.1.2 mrg [(set (cc0)
5678 1.1.1.2 mrg (compare (match_operand:ALL1 1 "register_operand" "r,r")
5679 1.1.1.2 mrg (match_operand:ALL1 2 "reg_or_0_operand" "r,Y00")))
5680 1.1.1.2 mrg (set (pc)
5681 1.1.1.2 mrg (if_then_else (eq (cc0)
5682 1.1.1.2 mrg (const_int 0))
5683 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))
5684 1.1.1.2 mrg (pc)))]
5685 1.1.1.2 mrg "jump_over_one_insn_p (insn, operands[0])"
5686 1.1 mrg "@
5687 1.1.1.2 mrg cpse %1,%2
5688 1.1.1.2 mrg cpse %1,__zero_reg__")
5689 1.1 mrg
5690 1.1.1.2 mrg ;; This peephole avoids code like
5691 1.1.1.2 mrg ;;
5692 1.1.1.9 mrg ;; TST Rn ; cmpqi3
5693 1.1.1.2 mrg ;; BREQ .+2 ; branch
5694 1.1.1.2 mrg ;; RJMP .Lm
5695 1.1.1.2 mrg ;;
5696 1.1.1.2 mrg ;; Notice that the peephole is always shorter than cmpqi + branch.
5697 1.1.1.2 mrg ;; The reason to write it as peephole is that sequences like
5698 1.1.1.2 mrg ;;
5699 1.1.1.2 mrg ;; AND Rm, Rn
5700 1.1.1.2 mrg ;; BRNE .La
5701 1.1.1.2 mrg ;;
5702 1.1.1.2 mrg ;; shall not be superseeded. With a respective combine pattern
5703 1.1.1.2 mrg ;; the latter sequence would be
5704 1.1.1.2 mrg ;;
5705 1.1.1.2 mrg ;; AND Rm, Rn
5706 1.1.1.2 mrg ;; CPSE Rm, __zero_reg__
5707 1.1.1.2 mrg ;; RJMP .La
5708 1.1.1.2 mrg ;;
5709 1.1.1.2 mrg ;; and thus longer and slower and not easy to be rolled back.
5710 1.1 mrg
5711 1.1.1.2 mrg (define_peephole ; "*cpse.ne"
5712 1.1.1.2 mrg [(set (cc0)
5713 1.1.1.2 mrg (compare (match_operand:ALL1 1 "register_operand" "")
5714 1.1.1.2 mrg (match_operand:ALL1 2 "reg_or_0_operand" "")))
5715 1.1.1.2 mrg (set (pc)
5716 1.1.1.2 mrg (if_then_else (ne (cc0)
5717 1.1.1.2 mrg (const_int 0))
5718 1.1.1.2 mrg (label_ref (match_operand 0 "" ""))
5719 1.1.1.2 mrg (pc)))]
5720 1.1.1.2 mrg "!AVR_HAVE_JMP_CALL
5721 1.1.1.6 mrg || !TARGET_SKIP_BUG"
5722 1.1.1.2 mrg {
5723 1.1.1.2 mrg if (operands[2] == CONST0_RTX (<MODE>mode))
5724 1.1.1.2 mrg operands[2] = zero_reg_rtx;
5725 1.1.1.2 mrg
5726 1.1.1.2 mrg return 3 == avr_jump_mode (operands[0], insn)
5727 1.1.1.2 mrg ? "cpse %1,%2\;jmp %0"
5728 1.1.1.2 mrg : "cpse %1,%2\;rjmp %0";
5729 1.1.1.2 mrg })
5730 1.1.1.2 mrg
5731 1.1.1.2 mrg ;;pppppppppppppppppppppppppppppppppppppppppppppppppppp
5732 1.1.1.2 mrg ;;prologue/epilogue support instructions
5733 1.1.1.2 mrg
5734 1.1.1.2 mrg (define_insn "popqi"
5735 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
5736 1.1.1.2 mrg (mem:QI (pre_inc:HI (reg:HI REG_SP))))]
5737 1.1 mrg ""
5738 1.1.1.2 mrg "pop %0"
5739 1.1.1.2 mrg [(set_attr "cc" "none")
5740 1.1.1.2 mrg (set_attr "length" "1")])
5741 1.1 mrg
5742 1.1.1.2 mrg ;; Enable Interrupts
5743 1.1.1.2 mrg (define_expand "enable_interrupt"
5744 1.1.1.2 mrg [(clobber (const_int 0))]
5745 1.1 mrg ""
5746 1.1.1.2 mrg {
5747 1.1.1.2 mrg rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
5748 1.1.1.2 mrg MEM_VOLATILE_P (mem) = 1;
5749 1.1.1.2 mrg emit_insn (gen_cli_sei (const1_rtx, mem));
5750 1.1.1.2 mrg DONE;
5751 1.1.1.2 mrg })
5752 1.1 mrg
5753 1.1.1.2 mrg ;; Disable Interrupts
5754 1.1.1.2 mrg (define_expand "disable_interrupt"
5755 1.1.1.2 mrg [(clobber (const_int 0))]
5756 1.1 mrg ""
5757 1.1.1.2 mrg {
5758 1.1.1.2 mrg rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
5759 1.1.1.2 mrg MEM_VOLATILE_P (mem) = 1;
5760 1.1.1.2 mrg emit_insn (gen_cli_sei (const0_rtx, mem));
5761 1.1.1.2 mrg DONE;
5762 1.1.1.2 mrg })
5763 1.1 mrg
5764 1.1.1.2 mrg (define_insn "cli_sei"
5765 1.1.1.2 mrg [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "L,P")]
5766 1.1.1.2 mrg UNSPECV_ENABLE_IRQS)
5767 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
5768 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))]
5769 1.1 mrg ""
5770 1.1.1.2 mrg "@
5771 1.1.1.2 mrg cli
5772 1.1.1.2 mrg sei"
5773 1.1.1.2 mrg [(set_attr "length" "1")
5774 1.1.1.2 mrg (set_attr "cc" "none")])
5775 1.1 mrg
5776 1.1.1.2 mrg ;; Library prologue saves
5777 1.1.1.2 mrg (define_insn "call_prologue_saves"
5778 1.1.1.2 mrg [(unspec_volatile:HI [(const_int 0)] UNSPECV_PROLOGUE_SAVES)
5779 1.1.1.2 mrg (match_operand:HI 0 "immediate_operand" "i,i")
5780 1.1.1.2 mrg (set (reg:HI REG_SP)
5781 1.1.1.2 mrg (minus:HI (reg:HI REG_SP)
5782 1.1.1.2 mrg (match_operand:HI 1 "immediate_operand" "i,i")))
5783 1.1.1.2 mrg (use (reg:HI REG_X))
5784 1.1.1.2 mrg (clobber (reg:HI REG_Z))]
5785 1.1 mrg ""
5786 1.1.1.2 mrg "ldi r30,lo8(gs(1f))
5787 1.1.1.2 mrg ldi r31,hi8(gs(1f))
5788 1.1.1.2 mrg %~jmp __prologue_saves__+((18 - %0) * 2)
5789 1.1.1.2 mrg 1:"
5790 1.1.1.2 mrg [(set_attr "length" "5,6")
5791 1.1.1.2 mrg (set_attr "cc" "clobber")
5792 1.1.1.2 mrg (set_attr "isa" "rjmp,jmp")])
5793 1.1 mrg
5794 1.1.1.2 mrg ; epilogue restores using library
5795 1.1.1.2 mrg (define_insn "epilogue_restores"
5796 1.1.1.2 mrg [(unspec_volatile:QI [(const_int 0)] UNSPECV_EPILOGUE_RESTORES)
5797 1.1.1.2 mrg (set (reg:HI REG_Y)
5798 1.1.1.2 mrg (plus:HI (reg:HI REG_Y)
5799 1.1.1.2 mrg (match_operand:HI 0 "immediate_operand" "i,i")))
5800 1.1.1.2 mrg (set (reg:HI REG_SP)
5801 1.1.1.2 mrg (plus:HI (reg:HI REG_Y)
5802 1.1.1.2 mrg (match_dup 0)))
5803 1.1.1.2 mrg (clobber (reg:QI REG_Z))]
5804 1.1 mrg ""
5805 1.1.1.2 mrg "ldi r30, lo8(%0)
5806 1.1.1.2 mrg %~jmp __epilogue_restores__ + ((18 - %0) * 2)"
5807 1.1.1.2 mrg [(set_attr "length" "2,3")
5808 1.1.1.2 mrg (set_attr "cc" "clobber")
5809 1.1.1.2 mrg (set_attr "isa" "rjmp,jmp")])
5810 1.1.1.2 mrg
5811 1.1.1.12 mrg
5812 1.1.1.12 mrg ;; $0 = Chunk: 1 = Prologue, 2 = Epilogue
5813 1.1.1.12 mrg ;; $1 = Register as printed by chunk 0 (Done) in final postscan.
5814 1.1.1.12 mrg (define_expand "gasisr"
5815 1.1.1.12 mrg [(parallel [(unspec_volatile [(match_operand:QI 0 "const_int_operand")
5816 1.1.1.12 mrg (match_operand:QI 1 "const_int_operand")]
5817 1.1.1.12 mrg UNSPECV_GASISR)
5818 1.1.1.12 mrg (set (reg:HI REG_SP)
5819 1.1.1.12 mrg (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR))
5820 1.1.1.12 mrg (set (match_dup 2)
5821 1.1.1.12 mrg (unspec_volatile:BLK [(match_dup 2)]
5822 1.1.1.12 mrg UNSPECV_MEMORY_BARRIER))])]
5823 1.1.1.12 mrg "avr_gasisr_prologues"
5824 1.1.1.12 mrg {
5825 1.1.1.12 mrg operands[2] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
5826 1.1.1.12 mrg MEM_VOLATILE_P (operands[2]) = 1;
5827 1.1.1.12 mrg })
5828 1.1.1.12 mrg
5829 1.1.1.12 mrg (define_insn "*gasisr"
5830 1.1.1.12 mrg [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "P,K")
5831 1.1.1.12 mrg (match_operand:QI 1 "const_int_operand" "n,n")]
5832 1.1.1.12 mrg UNSPECV_GASISR)
5833 1.1.1.12 mrg (set (reg:HI REG_SP)
5834 1.1.1.12 mrg (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR))
5835 1.1.1.12 mrg (set (match_operand:BLK 2)
5836 1.1.1.12 mrg (unspec_volatile:BLK [(match_dup 2)] UNSPECV_MEMORY_BARRIER))]
5837 1.1.1.12 mrg "avr_gasisr_prologues"
5838 1.1.1.12 mrg "__gcc_isr %0"
5839 1.1.1.12 mrg [(set_attr "length" "6,5")
5840 1.1.1.12 mrg (set_attr "cc" "clobber")])
5841 1.1.1.12 mrg
5842 1.1.1.12 mrg
5843 1.1.1.2 mrg ; return
5844 1.1.1.2 mrg (define_insn "return"
5845 1.1.1.2 mrg [(return)]
5846 1.1.1.2 mrg "reload_completed && avr_simple_epilogue ()"
5847 1.1.1.2 mrg "ret"
5848 1.1.1.2 mrg [(set_attr "cc" "none")
5849 1.1.1.2 mrg (set_attr "length" "1")])
5850 1.1 mrg
5851 1.1.1.2 mrg (define_insn "return_from_epilogue"
5852 1.1.1.2 mrg [(return)]
5853 1.1.1.2 mrg "reload_completed
5854 1.1.1.2 mrg && cfun->machine
5855 1.1.1.2 mrg && !(cfun->machine->is_interrupt || cfun->machine->is_signal)
5856 1.1.1.2 mrg && !cfun->machine->is_naked"
5857 1.1.1.2 mrg "ret"
5858 1.1.1.2 mrg [(set_attr "cc" "none")
5859 1.1.1.2 mrg (set_attr "length" "1")])
5860 1.1 mrg
5861 1.1.1.2 mrg (define_insn "return_from_interrupt_epilogue"
5862 1.1.1.2 mrg [(return)]
5863 1.1.1.2 mrg "reload_completed
5864 1.1.1.2 mrg && cfun->machine
5865 1.1.1.2 mrg && (cfun->machine->is_interrupt || cfun->machine->is_signal)
5866 1.1.1.2 mrg && !cfun->machine->is_naked"
5867 1.1.1.2 mrg "reti"
5868 1.1.1.2 mrg [(set_attr "cc" "none")
5869 1.1 mrg (set_attr "length" "1")])
5870 1.1 mrg
5871 1.1.1.2 mrg (define_insn "return_from_naked_epilogue"
5872 1.1.1.2 mrg [(return)]
5873 1.1.1.2 mrg "reload_completed
5874 1.1.1.2 mrg && cfun->machine
5875 1.1.1.2 mrg && cfun->machine->is_naked"
5876 1.1 mrg ""
5877 1.1.1.2 mrg [(set_attr "cc" "none")
5878 1.1.1.2 mrg (set_attr "length" "0")])
5879 1.1 mrg
5880 1.1.1.2 mrg (define_expand "prologue"
5881 1.1.1.2 mrg [(const_int 0)]
5882 1.1 mrg ""
5883 1.1.1.2 mrg {
5884 1.1.1.2 mrg avr_expand_prologue ();
5885 1.1.1.2 mrg DONE;
5886 1.1.1.2 mrg })
5887 1.1 mrg
5888 1.1.1.2 mrg (define_expand "epilogue"
5889 1.1.1.2 mrg [(const_int 0)]
5890 1.1.1.2 mrg ""
5891 1.1.1.2 mrg {
5892 1.1.1.2 mrg avr_expand_epilogue (false /* sibcall_p */);
5893 1.1.1.2 mrg DONE;
5894 1.1.1.2 mrg })
5895 1.1 mrg
5896 1.1.1.2 mrg (define_expand "sibcall_epilogue"
5897 1.1.1.2 mrg [(const_int 0)]
5898 1.1 mrg ""
5899 1.1.1.2 mrg {
5900 1.1.1.2 mrg avr_expand_epilogue (true /* sibcall_p */);
5901 1.1.1.2 mrg DONE;
5902 1.1.1.2 mrg })
5903 1.1 mrg
5904 1.1.1.2 mrg ;; Some instructions resp. instruction sequences available
5905 1.1.1.2 mrg ;; via builtins.
5906 1.1 mrg
5907 1.1.1.2 mrg (define_insn "delay_cycles_1"
5908 1.1.1.2 mrg [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "n")
5909 1.1.1.2 mrg (const_int 1)]
5910 1.1.1.2 mrg UNSPECV_DELAY_CYCLES)
5911 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
5912 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
5913 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=&d"))]
5914 1.1.1.2 mrg ""
5915 1.1.1.2 mrg "ldi %2,lo8(%0)
5916 1.1.1.6 mrg 1: dec %2
5917 1.1.1.2 mrg brne 1b"
5918 1.1.1.2 mrg [(set_attr "length" "3")
5919 1.1.1.2 mrg (set_attr "cc" "clobber")])
5920 1.1 mrg
5921 1.1.1.2 mrg (define_insn "delay_cycles_2"
5922 1.1.1.6 mrg [(unspec_volatile [(match_operand:HI 0 "const_int_operand" "n,n")
5923 1.1.1.2 mrg (const_int 2)]
5924 1.1.1.2 mrg UNSPECV_DELAY_CYCLES)
5925 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
5926 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
5927 1.1.1.6 mrg (clobber (match_scratch:HI 2 "=&w,&d"))]
5928 1.1.1.2 mrg ""
5929 1.1.1.6 mrg "@
5930 1.1.1.6 mrg ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1: sbiw %A2,1\;brne 1b
5931 1.1.1.6 mrg ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1: subi %A2,1\;sbci %B2,0\;brne 1b"
5932 1.1.1.6 mrg [(set_attr "length" "4,5")
5933 1.1.1.6 mrg (set_attr "isa" "no_tiny,tiny")
5934 1.1.1.2 mrg (set_attr "cc" "clobber")])
5935 1.1 mrg
5936 1.1.1.2 mrg (define_insn "delay_cycles_3"
5937 1.1.1.2 mrg [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n")
5938 1.1.1.2 mrg (const_int 3)]
5939 1.1.1.2 mrg UNSPECV_DELAY_CYCLES)
5940 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
5941 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
5942 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=&d"))
5943 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&d"))
5944 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))]
5945 1.1.1.2 mrg ""
5946 1.1.1.2 mrg "ldi %2,lo8(%0)
5947 1.1.1.2 mrg ldi %3,hi8(%0)
5948 1.1.1.2 mrg ldi %4,hlo8(%0)
5949 1.1.1.6 mrg 1: subi %2,1
5950 1.1.1.2 mrg sbci %3,0
5951 1.1.1.2 mrg sbci %4,0
5952 1.1.1.2 mrg brne 1b"
5953 1.1.1.2 mrg [(set_attr "length" "7")
5954 1.1.1.2 mrg (set_attr "cc" "clobber")])
5955 1.1 mrg
5956 1.1.1.2 mrg (define_insn "delay_cycles_4"
5957 1.1.1.2 mrg [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n")
5958 1.1.1.2 mrg (const_int 4)]
5959 1.1.1.2 mrg UNSPECV_DELAY_CYCLES)
5960 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
5961 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
5962 1.1.1.2 mrg (clobber (match_scratch:QI 2 "=&d"))
5963 1.1.1.2 mrg (clobber (match_scratch:QI 3 "=&d"))
5964 1.1.1.2 mrg (clobber (match_scratch:QI 4 "=&d"))
5965 1.1.1.2 mrg (clobber (match_scratch:QI 5 "=&d"))]
5966 1.1.1.2 mrg ""
5967 1.1.1.2 mrg "ldi %2,lo8(%0)
5968 1.1.1.2 mrg ldi %3,hi8(%0)
5969 1.1.1.2 mrg ldi %4,hlo8(%0)
5970 1.1.1.2 mrg ldi %5,hhi8(%0)
5971 1.1.1.6 mrg 1: subi %2,1
5972 1.1.1.2 mrg sbci %3,0
5973 1.1.1.2 mrg sbci %4,0
5974 1.1.1.2 mrg sbci %5,0
5975 1.1.1.2 mrg brne 1b"
5976 1.1.1.2 mrg [(set_attr "length" "9")
5977 1.1.1.2 mrg (set_attr "cc" "clobber")])
5978 1.1 mrg
5979 1.1 mrg
5980 1.1.1.2 mrg ;; __builtin_avr_insert_bits
5981 1.1 mrg
5982 1.1.1.2 mrg (define_insn "insert_bits"
5983 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r ,d ,r")
5984 1.1.1.2 mrg (unspec:QI [(match_operand:SI 1 "const_int_operand" "C0f,Cxf,C0f")
5985 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "r ,r ,r")
5986 1.1.1.2 mrg (match_operand:QI 3 "nonmemory_operand" "n ,0 ,0")]
5987 1.1.1.2 mrg UNSPEC_INSERT_BITS))]
5988 1.1.1.2 mrg ""
5989 1.1.1.2 mrg {
5990 1.1.1.2 mrg return avr_out_insert_bits (operands, NULL);
5991 1.1.1.2 mrg }
5992 1.1.1.2 mrg [(set_attr "adjust_len" "insert_bits")
5993 1.1.1.2 mrg (set_attr "cc" "clobber")])
5994 1.1 mrg
5995 1.1 mrg
5996 1.1.1.2 mrg ;; __builtin_avr_flash_segment
5997 1.1 mrg
5998 1.1.1.2 mrg ;; Just a helper for the next "official" expander.
5999 1.1.1.2 mrg
6000 1.1.1.2 mrg (define_expand "flash_segment1"
6001 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "")
6002 1.1.1.2 mrg (subreg:QI (match_operand:PSI 1 "register_operand" "")
6003 1.1.1.2 mrg 2))
6004 1.1.1.2 mrg (set (cc0)
6005 1.1.1.2 mrg (compare (match_dup 0)
6006 1.1.1.2 mrg (const_int 0)))
6007 1.1 mrg (set (pc)
6008 1.1.1.2 mrg (if_then_else (ge (cc0)
6009 1.1.1.2 mrg (const_int 0))
6010 1.1.1.2 mrg (label_ref (match_operand 2 "" ""))
6011 1.1.1.2 mrg (pc)))
6012 1.1.1.2 mrg (set (match_dup 0)
6013 1.1.1.2 mrg (const_int -1))])
6014 1.1.1.2 mrg
6015 1.1.1.2 mrg (define_expand "flash_segment"
6016 1.1.1.2 mrg [(parallel [(match_operand:QI 0 "register_operand" "")
6017 1.1.1.2 mrg (match_operand:PSI 1 "register_operand" "")])]
6018 1.1.1.2 mrg ""
6019 1.1.1.2 mrg {
6020 1.1.1.2 mrg rtx label = gen_label_rtx ();
6021 1.1.1.2 mrg emit (gen_flash_segment1 (operands[0], operands[1], label));
6022 1.1.1.2 mrg emit_label (label);
6023 1.1.1.2 mrg DONE;
6024 1.1.1.2 mrg })
6025 1.1 mrg
6026 1.1.1.2 mrg ;; Actually, it's too late now to work out address spaces known at compiletime.
6027 1.1.1.2 mrg ;; Best place would be to fold ADDR_SPACE_CONVERT_EXPR in avr_fold_builtin.
6028 1.1.1.2 mrg ;; However, avr_addr_space_convert can add some built-in knowledge for PSTR
6029 1.1.1.2 mrg ;; so that ADDR_SPACE_CONVERT_EXPR in the built-in must not be resolved.
6030 1.1.1.2 mrg
6031 1.1.1.2 mrg (define_insn_and_split "*split.flash_segment"
6032 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=d")
6033 1.1.1.2 mrg (subreg:QI (lo_sum:PSI (match_operand:QI 1 "nonmemory_operand" "ri")
6034 1.1.1.2 mrg (match_operand:HI 2 "register_operand" "r"))
6035 1.1.1.2 mrg 2))]
6036 1.1.1.2 mrg ""
6037 1.1.1.2 mrg { gcc_unreachable(); }
6038 1.1.1.2 mrg ""
6039 1.1.1.2 mrg [(set (match_dup 0)
6040 1.1.1.2 mrg (match_dup 1))])
6041 1.1.1.2 mrg
6042 1.1.1.2 mrg
6043 1.1.1.2 mrg ;; Parity
6044 1.1.1.2 mrg
6045 1.1.1.2 mrg ;; Postpone expansion of 16-bit parity to libgcc call until after combine for
6046 1.1.1.2 mrg ;; better 8-bit parity recognition.
6047 1.1.1.2 mrg
6048 1.1.1.2 mrg (define_expand "parityhi2"
6049 1.1.1.2 mrg [(parallel [(set (match_operand:HI 0 "register_operand" "")
6050 1.1.1.2 mrg (parity:HI (match_operand:HI 1 "register_operand" "")))
6051 1.1.1.2 mrg (clobber (reg:HI 24))])])
6052 1.1.1.2 mrg
6053 1.1.1.2 mrg (define_insn_and_split "*parityhi2"
6054 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6055 1.1.1.2 mrg (parity:HI (match_operand:HI 1 "register_operand" "r")))
6056 1.1.1.2 mrg (clobber (reg:HI 24))]
6057 1.1.1.2 mrg "!reload_completed"
6058 1.1.1.2 mrg { gcc_unreachable(); }
6059 1.1.1.2 mrg "&& 1"
6060 1.1.1.2 mrg [(set (reg:HI 24)
6061 1.1.1.2 mrg (match_dup 1))
6062 1.1.1.2 mrg (set (reg:HI 24)
6063 1.1.1.2 mrg (parity:HI (reg:HI 24)))
6064 1.1.1.2 mrg (set (match_dup 0)
6065 1.1.1.2 mrg (reg:HI 24))])
6066 1.1 mrg
6067 1.1.1.2 mrg (define_insn_and_split "*parityqihi2"
6068 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6069 1.1.1.2 mrg (parity:HI (match_operand:QI 1 "register_operand" "r")))
6070 1.1.1.2 mrg (clobber (reg:HI 24))]
6071 1.1.1.2 mrg "!reload_completed"
6072 1.1.1.2 mrg { gcc_unreachable(); }
6073 1.1.1.2 mrg "&& 1"
6074 1.1.1.2 mrg [(set (reg:QI 24)
6075 1.1.1.2 mrg (match_dup 1))
6076 1.1.1.2 mrg (set (reg:HI 24)
6077 1.1.1.2 mrg (zero_extend:HI (parity:QI (reg:QI 24))))
6078 1.1.1.2 mrg (set (match_dup 0)
6079 1.1.1.2 mrg (reg:HI 24))])
6080 1.1 mrg
6081 1.1.1.2 mrg (define_expand "paritysi2"
6082 1.1.1.2 mrg [(set (reg:SI 22)
6083 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6084 1.1.1.2 mrg (set (reg:HI 24)
6085 1.1.1.2 mrg (truncate:HI (parity:SI (reg:SI 22))))
6086 1.1.1.2 mrg (set (match_dup 2)
6087 1.1.1.2 mrg (reg:HI 24))
6088 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6089 1.1.1.2 mrg (zero_extend:SI (match_dup 2)))]
6090 1.1 mrg ""
6091 1.1.1.2 mrg {
6092 1.1.1.2 mrg operands[2] = gen_reg_rtx (HImode);
6093 1.1.1.2 mrg })
6094 1.1 mrg
6095 1.1.1.2 mrg (define_insn "*parityhi2.libgcc"
6096 1.1.1.2 mrg [(set (reg:HI 24)
6097 1.1.1.2 mrg (parity:HI (reg:HI 24)))]
6098 1.1 mrg ""
6099 1.1.1.2 mrg "%~call __parityhi2"
6100 1.1.1.2 mrg [(set_attr "type" "xcall")
6101 1.1 mrg (set_attr "cc" "clobber")])
6102 1.1 mrg
6103 1.1.1.2 mrg (define_insn "*parityqihi2.libgcc"
6104 1.1.1.2 mrg [(set (reg:HI 24)
6105 1.1.1.2 mrg (zero_extend:HI (parity:QI (reg:QI 24))))]
6106 1.1 mrg ""
6107 1.1.1.2 mrg "%~call __parityqi2"
6108 1.1.1.2 mrg [(set_attr "type" "xcall")
6109 1.1.1.2 mrg (set_attr "cc" "clobber")])
6110 1.1 mrg
6111 1.1.1.2 mrg (define_insn "*paritysihi2.libgcc"
6112 1.1.1.2 mrg [(set (reg:HI 24)
6113 1.1.1.2 mrg (truncate:HI (parity:SI (reg:SI 22))))]
6114 1.1 mrg ""
6115 1.1.1.2 mrg "%~call __paritysi2"
6116 1.1.1.2 mrg [(set_attr "type" "xcall")
6117 1.1.1.2 mrg (set_attr "cc" "clobber")])
6118 1.1 mrg
6119 1.1 mrg
6120 1.1.1.2 mrg ;; Popcount
6121 1.1.1.2 mrg
6122 1.1.1.2 mrg (define_expand "popcounthi2"
6123 1.1.1.2 mrg [(set (reg:HI 24)
6124 1.1.1.2 mrg (match_operand:HI 1 "register_operand" ""))
6125 1.1.1.2 mrg (set (reg:HI 24)
6126 1.1.1.2 mrg (popcount:HI (reg:HI 24)))
6127 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6128 1.1.1.2 mrg (reg:HI 24))]
6129 1.1 mrg ""
6130 1.1 mrg "")
6131 1.1 mrg
6132 1.1.1.2 mrg (define_expand "popcountsi2"
6133 1.1.1.2 mrg [(set (reg:SI 22)
6134 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6135 1.1.1.2 mrg (set (reg:HI 24)
6136 1.1.1.2 mrg (truncate:HI (popcount:SI (reg:SI 22))))
6137 1.1.1.2 mrg (set (match_dup 2)
6138 1.1.1.2 mrg (reg:HI 24))
6139 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6140 1.1.1.2 mrg (zero_extend:SI (match_dup 2)))]
6141 1.1 mrg ""
6142 1.1.1.2 mrg {
6143 1.1.1.2 mrg operands[2] = gen_reg_rtx (HImode);
6144 1.1.1.2 mrg })
6145 1.1 mrg
6146 1.1.1.2 mrg (define_insn "*popcounthi2.libgcc"
6147 1.1.1.2 mrg [(set (reg:HI 24)
6148 1.1.1.2 mrg (popcount:HI (reg:HI 24)))]
6149 1.1 mrg ""
6150 1.1.1.2 mrg "%~call __popcounthi2"
6151 1.1.1.2 mrg [(set_attr "type" "xcall")
6152 1.1.1.2 mrg (set_attr "cc" "clobber")])
6153 1.1 mrg
6154 1.1.1.2 mrg (define_insn "*popcountsi2.libgcc"
6155 1.1.1.2 mrg [(set (reg:HI 24)
6156 1.1.1.2 mrg (truncate:HI (popcount:SI (reg:SI 22))))]
6157 1.1 mrg ""
6158 1.1.1.2 mrg "%~call __popcountsi2"
6159 1.1.1.2 mrg [(set_attr "type" "xcall")
6160 1.1 mrg (set_attr "cc" "clobber")])
6161 1.1 mrg
6162 1.1.1.2 mrg (define_insn "*popcountqi2.libgcc"
6163 1.1.1.2 mrg [(set (reg:QI 24)
6164 1.1.1.2 mrg (popcount:QI (reg:QI 24)))]
6165 1.1 mrg ""
6166 1.1.1.2 mrg "%~call __popcountqi2"
6167 1.1.1.2 mrg [(set_attr "type" "xcall")
6168 1.1 mrg (set_attr "cc" "clobber")])
6169 1.1 mrg
6170 1.1.1.2 mrg (define_insn_and_split "*popcountqihi2.libgcc"
6171 1.1.1.2 mrg [(set (reg:HI 24)
6172 1.1.1.2 mrg (zero_extend:HI (popcount:QI (reg:QI 24))))]
6173 1.1.1.2 mrg ""
6174 1.1.1.2 mrg "#"
6175 1.1.1.2 mrg ""
6176 1.1.1.2 mrg [(set (reg:QI 24)
6177 1.1.1.2 mrg (popcount:QI (reg:QI 24)))
6178 1.1.1.2 mrg (set (reg:QI 25)
6179 1.1.1.2 mrg (const_int 0))])
6180 1.1.1.2 mrg
6181 1.1.1.2 mrg ;; Count Leading Zeros
6182 1.1.1.2 mrg
6183 1.1.1.2 mrg (define_expand "clzhi2"
6184 1.1.1.2 mrg [(set (reg:HI 24)
6185 1.1.1.2 mrg (match_operand:HI 1 "register_operand" ""))
6186 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6187 1.1.1.2 mrg (clz:HI (reg:HI 24)))
6188 1.1.1.2 mrg (clobber (reg:QI 26))])
6189 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6190 1.1.1.2 mrg (reg:HI 24))])
6191 1.1 mrg
6192 1.1.1.2 mrg (define_expand "clzsi2"
6193 1.1.1.2 mrg [(set (reg:SI 22)
6194 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6195 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6196 1.1.1.2 mrg (truncate:HI (clz:SI (reg:SI 22))))
6197 1.1.1.2 mrg (clobber (reg:QI 26))])
6198 1.1.1.2 mrg (set (match_dup 2)
6199 1.1.1.2 mrg (reg:HI 24))
6200 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6201 1.1.1.2 mrg (zero_extend:SI (match_dup 2)))]
6202 1.1 mrg ""
6203 1.1.1.2 mrg {
6204 1.1.1.2 mrg operands[2] = gen_reg_rtx (HImode);
6205 1.1.1.2 mrg })
6206 1.1 mrg
6207 1.1.1.2 mrg (define_insn "*clzhi2.libgcc"
6208 1.1.1.2 mrg [(set (reg:HI 24)
6209 1.1.1.2 mrg (clz:HI (reg:HI 24)))
6210 1.1.1.2 mrg (clobber (reg:QI 26))]
6211 1.1 mrg ""
6212 1.1.1.2 mrg "%~call __clzhi2"
6213 1.1.1.2 mrg [(set_attr "type" "xcall")
6214 1.1 mrg (set_attr "cc" "clobber")])
6215 1.1 mrg
6216 1.1.1.2 mrg (define_insn "*clzsihi2.libgcc"
6217 1.1.1.2 mrg [(set (reg:HI 24)
6218 1.1.1.2 mrg (truncate:HI (clz:SI (reg:SI 22))))
6219 1.1.1.2 mrg (clobber (reg:QI 26))]
6220 1.1 mrg ""
6221 1.1.1.2 mrg "%~call __clzsi2"
6222 1.1.1.2 mrg [(set_attr "type" "xcall")
6223 1.1.1.2 mrg (set_attr "cc" "clobber")])
6224 1.1 mrg
6225 1.1.1.2 mrg ;; Count Trailing Zeros
6226 1.1.1.2 mrg
6227 1.1.1.2 mrg (define_expand "ctzhi2"
6228 1.1.1.2 mrg [(set (reg:HI 24)
6229 1.1.1.2 mrg (match_operand:HI 1 "register_operand" ""))
6230 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6231 1.1.1.2 mrg (ctz:HI (reg:HI 24)))
6232 1.1.1.2 mrg (clobber (reg:QI 26))])
6233 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6234 1.1.1.2 mrg (reg:HI 24))])
6235 1.1 mrg
6236 1.1.1.2 mrg (define_expand "ctzsi2"
6237 1.1.1.2 mrg [(set (reg:SI 22)
6238 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6239 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6240 1.1.1.2 mrg (truncate:HI (ctz:SI (reg:SI 22))))
6241 1.1.1.2 mrg (clobber (reg:QI 22))
6242 1.1.1.2 mrg (clobber (reg:QI 26))])
6243 1.1.1.2 mrg (set (match_dup 2)
6244 1.1.1.2 mrg (reg:HI 24))
6245 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6246 1.1.1.2 mrg (zero_extend:SI (match_dup 2)))]
6247 1.1 mrg ""
6248 1.1.1.2 mrg {
6249 1.1.1.2 mrg operands[2] = gen_reg_rtx (HImode);
6250 1.1.1.2 mrg })
6251 1.1 mrg
6252 1.1.1.2 mrg (define_insn "*ctzhi2.libgcc"
6253 1.1.1.2 mrg [(set (reg:HI 24)
6254 1.1.1.2 mrg (ctz:HI (reg:HI 24)))
6255 1.1.1.2 mrg (clobber (reg:QI 26))]
6256 1.1.1.2 mrg ""
6257 1.1.1.2 mrg "%~call __ctzhi2"
6258 1.1.1.2 mrg [(set_attr "type" "xcall")
6259 1.1.1.2 mrg (set_attr "cc" "clobber")])
6260 1.1 mrg
6261 1.1.1.2 mrg (define_insn "*ctzsihi2.libgcc"
6262 1.1.1.2 mrg [(set (reg:HI 24)
6263 1.1.1.2 mrg (truncate:HI (ctz:SI (reg:SI 22))))
6264 1.1.1.2 mrg (clobber (reg:QI 22))
6265 1.1.1.2 mrg (clobber (reg:QI 26))]
6266 1.1 mrg ""
6267 1.1.1.2 mrg "%~call __ctzsi2"
6268 1.1.1.2 mrg [(set_attr "type" "xcall")
6269 1.1.1.2 mrg (set_attr "cc" "clobber")])
6270 1.1 mrg
6271 1.1.1.2 mrg ;; Find First Set
6272 1.1 mrg
6273 1.1.1.2 mrg (define_expand "ffshi2"
6274 1.1.1.2 mrg [(set (reg:HI 24)
6275 1.1.1.2 mrg (match_operand:HI 1 "register_operand" ""))
6276 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6277 1.1.1.2 mrg (ffs:HI (reg:HI 24)))
6278 1.1.1.2 mrg (clobber (reg:QI 26))])
6279 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6280 1.1.1.2 mrg (reg:HI 24))])
6281 1.1 mrg
6282 1.1.1.2 mrg (define_expand "ffssi2"
6283 1.1.1.2 mrg [(set (reg:SI 22)
6284 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6285 1.1.1.2 mrg (parallel [(set (reg:HI 24)
6286 1.1.1.2 mrg (truncate:HI (ffs:SI (reg:SI 22))))
6287 1.1.1.2 mrg (clobber (reg:QI 22))
6288 1.1.1.2 mrg (clobber (reg:QI 26))])
6289 1.1.1.2 mrg (set (match_dup 2)
6290 1.1.1.2 mrg (reg:HI 24))
6291 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6292 1.1.1.2 mrg (zero_extend:SI (match_dup 2)))]
6293 1.1 mrg ""
6294 1.1.1.2 mrg {
6295 1.1.1.2 mrg operands[2] = gen_reg_rtx (HImode);
6296 1.1.1.2 mrg })
6297 1.1 mrg
6298 1.1.1.2 mrg (define_insn "*ffshi2.libgcc"
6299 1.1.1.2 mrg [(set (reg:HI 24)
6300 1.1.1.2 mrg (ffs:HI (reg:HI 24)))
6301 1.1.1.2 mrg (clobber (reg:QI 26))]
6302 1.1.1.2 mrg ""
6303 1.1.1.2 mrg "%~call __ffshi2"
6304 1.1.1.2 mrg [(set_attr "type" "xcall")
6305 1.1.1.2 mrg (set_attr "cc" "clobber")])
6306 1.1 mrg
6307 1.1.1.2 mrg (define_insn "*ffssihi2.libgcc"
6308 1.1.1.2 mrg [(set (reg:HI 24)
6309 1.1.1.2 mrg (truncate:HI (ffs:SI (reg:SI 22))))
6310 1.1.1.2 mrg (clobber (reg:QI 22))
6311 1.1.1.2 mrg (clobber (reg:QI 26))]
6312 1.1 mrg ""
6313 1.1.1.2 mrg "%~call __ffssi2"
6314 1.1.1.2 mrg [(set_attr "type" "xcall")
6315 1.1.1.2 mrg (set_attr "cc" "clobber")])
6316 1.1 mrg
6317 1.1.1.2 mrg ;; Copysign
6318 1.1.1.2 mrg
6319 1.1.1.2 mrg (define_insn "copysignsf3"
6320 1.1.1.2 mrg [(set (match_operand:SF 0 "register_operand" "=r")
6321 1.1.1.2 mrg (unspec:SF [(match_operand:SF 1 "register_operand" "0")
6322 1.1.1.2 mrg (match_operand:SF 2 "register_operand" "r")]
6323 1.1.1.2 mrg UNSPEC_COPYSIGN))]
6324 1.1 mrg ""
6325 1.1.1.2 mrg "bst %D2,7\;bld %D0,7"
6326 1.1 mrg [(set_attr "length" "2")
6327 1.1 mrg (set_attr "cc" "none")])
6328 1.1 mrg
6329 1.1.1.9 mrg ;; Swap Bytes (change byte-endianness)
6330 1.1 mrg
6331 1.1.1.2 mrg (define_expand "bswapsi2"
6332 1.1.1.2 mrg [(set (reg:SI 22)
6333 1.1.1.2 mrg (match_operand:SI 1 "register_operand" ""))
6334 1.1.1.2 mrg (set (reg:SI 22)
6335 1.1.1.2 mrg (bswap:SI (reg:SI 22)))
6336 1.1.1.2 mrg (set (match_operand:SI 0 "register_operand" "")
6337 1.1.1.2 mrg (reg:SI 22))])
6338 1.1 mrg
6339 1.1.1.2 mrg (define_insn "*bswapsi2.libgcc"
6340 1.1.1.2 mrg [(set (reg:SI 22)
6341 1.1.1.2 mrg (bswap:SI (reg:SI 22)))]
6342 1.1.1.2 mrg ""
6343 1.1.1.2 mrg "%~call __bswapsi2"
6344 1.1.1.2 mrg [(set_attr "type" "xcall")
6345 1.1 mrg (set_attr "cc" "clobber")])
6346 1.1 mrg
6347 1.1 mrg
6348 1.1.1.2 mrg ;; CPU instructions
6349 1.1 mrg
6350 1.1.1.2 mrg ;; NOP taking 1 or 2 Ticks
6351 1.1.1.2 mrg (define_expand "nopv"
6352 1.1.1.2 mrg [(parallel [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "")]
6353 1.1.1.2 mrg UNSPECV_NOP)
6354 1.1.1.2 mrg (set (match_dup 1)
6355 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)]
6356 1.1.1.2 mrg UNSPECV_MEMORY_BARRIER))])]
6357 1.1 mrg ""
6358 1.1.1.2 mrg {
6359 1.1.1.2 mrg operands[1] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
6360 1.1.1.2 mrg MEM_VOLATILE_P (operands[1]) = 1;
6361 1.1.1.2 mrg })
6362 1.1 mrg
6363 1.1.1.2 mrg (define_insn "*nopv"
6364 1.1.1.2 mrg [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "P,K")]
6365 1.1.1.2 mrg UNSPECV_NOP)
6366 1.1.1.2 mrg (set (match_operand:BLK 1 "" "")
6367 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))]
6368 1.1 mrg ""
6369 1.1.1.2 mrg "@
6370 1.1.1.2 mrg nop
6371 1.1.1.2 mrg rjmp ."
6372 1.1 mrg [(set_attr "length" "1")
6373 1.1.1.2 mrg (set_attr "cc" "none")])
6374 1.1 mrg
6375 1.1.1.2 mrg ;; SLEEP
6376 1.1.1.2 mrg (define_expand "sleep"
6377 1.1.1.2 mrg [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_SLEEP)
6378 1.1.1.2 mrg (set (match_dup 0)
6379 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 0)]
6380 1.1.1.2 mrg UNSPECV_MEMORY_BARRIER))])]
6381 1.1.1.2 mrg ""
6382 1.1.1.2 mrg {
6383 1.1.1.2 mrg operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
6384 1.1.1.2 mrg MEM_VOLATILE_P (operands[0]) = 1;
6385 1.1.1.2 mrg })
6386 1.1 mrg
6387 1.1.1.2 mrg (define_insn "*sleep"
6388 1.1.1.2 mrg [(unspec_volatile [(const_int 0)] UNSPECV_SLEEP)
6389 1.1.1.2 mrg (set (match_operand:BLK 0 "" "")
6390 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))]
6391 1.1.1.2 mrg ""
6392 1.1.1.2 mrg "sleep"
6393 1.1 mrg [(set_attr "length" "1")
6394 1.1 mrg (set_attr "cc" "none")])
6395 1.1 mrg
6396 1.1.1.2 mrg ;; WDR
6397 1.1.1.2 mrg (define_expand "wdr"
6398 1.1.1.2 mrg [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_WDR)
6399 1.1.1.2 mrg (set (match_dup 0)
6400 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 0)]
6401 1.1.1.2 mrg UNSPECV_MEMORY_BARRIER))])]
6402 1.1.1.2 mrg ""
6403 1.1.1.2 mrg {
6404 1.1.1.2 mrg operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
6405 1.1.1.2 mrg MEM_VOLATILE_P (operands[0]) = 1;
6406 1.1.1.2 mrg })
6407 1.1.1.2 mrg
6408 1.1.1.2 mrg (define_insn "*wdr"
6409 1.1.1.2 mrg [(unspec_volatile [(const_int 0)] UNSPECV_WDR)
6410 1.1.1.2 mrg (set (match_operand:BLK 0 "" "")
6411 1.1.1.2 mrg (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))]
6412 1.1.1.2 mrg ""
6413 1.1.1.2 mrg "wdr"
6414 1.1 mrg [(set_attr "length" "1")
6415 1.1 mrg (set_attr "cc" "none")])
6416 1.1 mrg
6417 1.1.1.2 mrg ;; FMUL
6418 1.1.1.2 mrg (define_expand "fmul"
6419 1.1.1.2 mrg [(set (reg:QI 24)
6420 1.1.1.2 mrg (match_operand:QI 1 "register_operand" ""))
6421 1.1.1.2 mrg (set (reg:QI 25)
6422 1.1.1.2 mrg (match_operand:QI 2 "register_operand" ""))
6423 1.1.1.2 mrg (parallel [(set (reg:HI 22)
6424 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6425 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMUL))
6426 1.1.1.2 mrg (clobber (reg:HI 24))])
6427 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6428 1.1.1.2 mrg (reg:HI 22))]
6429 1.1.1.2 mrg ""
6430 1.1.1.2 mrg {
6431 1.1.1.2 mrg if (AVR_HAVE_MUL)
6432 1.1.1.2 mrg {
6433 1.1.1.2 mrg emit_insn (gen_fmul_insn (operand0, operand1, operand2));
6434 1.1.1.2 mrg DONE;
6435 1.1.1.2 mrg }
6436 1.1.1.6 mrg avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
6437 1.1.1.2 mrg })
6438 1.1 mrg
6439 1.1.1.2 mrg (define_insn "fmul_insn"
6440 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6441 1.1.1.2 mrg (unspec:HI [(match_operand:QI 1 "register_operand" "a")
6442 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "a")]
6443 1.1.1.2 mrg UNSPEC_FMUL))]
6444 1.1.1.2 mrg "AVR_HAVE_MUL"
6445 1.1.1.2 mrg "fmul %1,%2
6446 1.1.1.2 mrg movw %0,r0
6447 1.1.1.2 mrg clr __zero_reg__"
6448 1.1.1.2 mrg [(set_attr "length" "3")
6449 1.1 mrg (set_attr "cc" "clobber")])
6450 1.1 mrg
6451 1.1.1.2 mrg (define_insn "*fmul.call"
6452 1.1.1.2 mrg [(set (reg:HI 22)
6453 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6454 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMUL))
6455 1.1.1.2 mrg (clobber (reg:HI 24))]
6456 1.1.1.2 mrg "!AVR_HAVE_MUL"
6457 1.1.1.2 mrg "%~call __fmul"
6458 1.1.1.2 mrg [(set_attr "type" "xcall")
6459 1.1 mrg (set_attr "cc" "clobber")])
6460 1.1 mrg
6461 1.1.1.2 mrg ;; FMULS
6462 1.1.1.2 mrg (define_expand "fmuls"
6463 1.1.1.2 mrg [(set (reg:QI 24)
6464 1.1.1.2 mrg (match_operand:QI 1 "register_operand" ""))
6465 1.1.1.2 mrg (set (reg:QI 25)
6466 1.1.1.2 mrg (match_operand:QI 2 "register_operand" ""))
6467 1.1.1.2 mrg (parallel [(set (reg:HI 22)
6468 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6469 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMULS))
6470 1.1.1.2 mrg (clobber (reg:HI 24))])
6471 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6472 1.1.1.2 mrg (reg:HI 22))]
6473 1.1.1.2 mrg ""
6474 1.1.1.2 mrg {
6475 1.1.1.2 mrg if (AVR_HAVE_MUL)
6476 1.1.1.2 mrg {
6477 1.1.1.2 mrg emit_insn (gen_fmuls_insn (operand0, operand1, operand2));
6478 1.1.1.2 mrg DONE;
6479 1.1.1.2 mrg }
6480 1.1.1.6 mrg avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
6481 1.1.1.2 mrg })
6482 1.1 mrg
6483 1.1.1.2 mrg (define_insn "fmuls_insn"
6484 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6485 1.1.1.2 mrg (unspec:HI [(match_operand:QI 1 "register_operand" "a")
6486 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "a")]
6487 1.1.1.2 mrg UNSPEC_FMULS))]
6488 1.1.1.2 mrg "AVR_HAVE_MUL"
6489 1.1.1.2 mrg "fmuls %1,%2
6490 1.1.1.2 mrg movw %0,r0
6491 1.1.1.2 mrg clr __zero_reg__"
6492 1.1.1.2 mrg [(set_attr "length" "3")
6493 1.1.1.2 mrg (set_attr "cc" "clobber")])
6494 1.1 mrg
6495 1.1.1.2 mrg (define_insn "*fmuls.call"
6496 1.1.1.2 mrg [(set (reg:HI 22)
6497 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6498 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMULS))
6499 1.1.1.2 mrg (clobber (reg:HI 24))]
6500 1.1.1.2 mrg "!AVR_HAVE_MUL"
6501 1.1.1.2 mrg "%~call __fmuls"
6502 1.1.1.2 mrg [(set_attr "type" "xcall")
6503 1.1.1.2 mrg (set_attr "cc" "clobber")])
6504 1.1 mrg
6505 1.1.1.2 mrg ;; FMULSU
6506 1.1.1.2 mrg (define_expand "fmulsu"
6507 1.1.1.2 mrg [(set (reg:QI 24)
6508 1.1.1.2 mrg (match_operand:QI 1 "register_operand" ""))
6509 1.1.1.2 mrg (set (reg:QI 25)
6510 1.1.1.2 mrg (match_operand:QI 2 "register_operand" ""))
6511 1.1.1.2 mrg (parallel [(set (reg:HI 22)
6512 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6513 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMULSU))
6514 1.1.1.2 mrg (clobber (reg:HI 24))])
6515 1.1.1.2 mrg (set (match_operand:HI 0 "register_operand" "")
6516 1.1.1.2 mrg (reg:HI 22))]
6517 1.1.1.2 mrg ""
6518 1.1.1.2 mrg {
6519 1.1.1.2 mrg if (AVR_HAVE_MUL)
6520 1.1.1.2 mrg {
6521 1.1.1.2 mrg emit_insn (gen_fmulsu_insn (operand0, operand1, operand2));
6522 1.1.1.2 mrg DONE;
6523 1.1.1.2 mrg }
6524 1.1.1.6 mrg avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
6525 1.1.1.2 mrg })
6526 1.1 mrg
6527 1.1.1.2 mrg (define_insn "fmulsu_insn"
6528 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6529 1.1.1.2 mrg (unspec:HI [(match_operand:QI 1 "register_operand" "a")
6530 1.1.1.2 mrg (match_operand:QI 2 "register_operand" "a")]
6531 1.1.1.2 mrg UNSPEC_FMULSU))]
6532 1.1.1.2 mrg "AVR_HAVE_MUL"
6533 1.1.1.2 mrg "fmulsu %1,%2
6534 1.1.1.2 mrg movw %0,r0
6535 1.1.1.2 mrg clr __zero_reg__"
6536 1.1.1.2 mrg [(set_attr "length" "3")
6537 1.1.1.2 mrg (set_attr "cc" "clobber")])
6538 1.1 mrg
6539 1.1.1.2 mrg (define_insn "*fmulsu.call"
6540 1.1.1.2 mrg [(set (reg:HI 22)
6541 1.1.1.2 mrg (unspec:HI [(reg:QI 24)
6542 1.1.1.2 mrg (reg:QI 25)] UNSPEC_FMULSU))
6543 1.1.1.2 mrg (clobber (reg:HI 24))]
6544 1.1.1.2 mrg "!AVR_HAVE_MUL"
6545 1.1.1.2 mrg "%~call __fmulsu"
6546 1.1.1.2 mrg [(set_attr "type" "xcall")
6547 1.1.1.2 mrg (set_attr "cc" "clobber")])
6548 1.1 mrg
6549 1.1.1.2 mrg
6551 1.1.1.2 mrg ;; Some combiner patterns dealing with bits.
6552 1.1.1.2 mrg ;; See PR42210
6553 1.1.1.2 mrg
6554 1.1.1.2 mrg ;; Move bit $3.0 into bit $0.$4
6555 1.1.1.2 mrg (define_insn "*movbitqi.1-6.a"
6556 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
6557 1.1.1.2 mrg (ior:QI (and:QI (match_operand:QI 1 "register_operand" "0")
6558 1.1.1.2 mrg (match_operand:QI 2 "single_zero_operand" "n"))
6559 1.1.1.2 mrg (and:QI (ashift:QI (match_operand:QI 3 "register_operand" "r")
6560 1.1.1.2 mrg (match_operand:QI 4 "const_0_to_7_operand" "n"))
6561 1.1.1.2 mrg (match_operand:QI 5 "single_one_operand" "n"))))]
6562 1.1.1.2 mrg "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))
6563 1.1.1.2 mrg && INTVAL(operands[4]) == exact_log2 (INTVAL(operands[5]) & GET_MODE_MASK (QImode))"
6564 1.1.1.2 mrg "bst %3,0\;bld %0,%4"
6565 1.1.1.2 mrg [(set_attr "length" "2")
6566 1.1 mrg (set_attr "cc" "none")])
6567 1.1.1.2 mrg
6568 1.1.1.2 mrg ;; Move bit $3.0 into bit $0.$4
6569 1.1.1.2 mrg ;; Variation of above. Unfortunately, there is no canonicalized representation
6570 1.1.1.2 mrg ;; of moving around bits. So what we see here depends on how user writes down
6571 1.1.1.2 mrg ;; bit manipulations.
6572 1.1.1.2 mrg (define_insn "*movbitqi.1-6.b"
6573 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
6574 1.1.1.2 mrg (ior:QI (and:QI (match_operand:QI 1 "register_operand" "0")
6575 1.1.1.2 mrg (match_operand:QI 2 "single_zero_operand" "n"))
6576 1.1.1.2 mrg (ashift:QI (and:QI (match_operand:QI 3 "register_operand" "r")
6577 1.1.1.2 mrg (const_int 1))
6578 1.1.1.2 mrg (match_operand:QI 4 "const_0_to_7_operand" "n"))))]
6579 1.1.1.2 mrg "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))"
6580 1.1.1.2 mrg "bst %3,0\;bld %0,%4"
6581 1.1.1.2 mrg [(set_attr "length" "2")
6582 1.1 mrg (set_attr "cc" "none")])
6583 1.1.1.2 mrg
6584 1.1.1.2 mrg ;; Move bit $3.0 into bit $0.0.
6585 1.1.1.2 mrg ;; For bit 0, combiner generates slightly different pattern.
6586 1.1.1.2 mrg (define_insn "*movbitqi.0"
6587 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
6588 1.1.1.2 mrg (ior:QI (and:QI (match_operand:QI 1 "register_operand" "0")
6589 1.1.1.2 mrg (match_operand:QI 2 "single_zero_operand" "n"))
6590 1.1.1.2 mrg (and:QI (match_operand:QI 3 "register_operand" "r")
6591 1.1.1.2 mrg (const_int 1))))]
6592 1.1.1.2 mrg "0 == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))"
6593 1.1.1.2 mrg "bst %3,0\;bld %0,0"
6594 1.1.1.2 mrg [(set_attr "length" "2")
6595 1.1 mrg (set_attr "cc" "none")])
6596 1.1.1.2 mrg
6597 1.1.1.2 mrg ;; Move bit $2.0 into bit $0.7.
6598 1.1.1.2 mrg ;; For bit 7, combiner generates slightly different pattern
6599 1.1.1.2 mrg (define_insn "*movbitqi.7"
6600 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=r")
6601 1.1.1.2 mrg (ior:QI (and:QI (match_operand:QI 1 "register_operand" "0")
6602 1.1.1.2 mrg (const_int 127))
6603 1.1.1.2 mrg (ashift:QI (match_operand:QI 2 "register_operand" "r")
6604 1.1 mrg (const_int 7))))]
6605 1.1.1.2 mrg ""
6606 1.1.1.2 mrg "bst %2,0\;bld %0,7"
6607 1.1.1.2 mrg [(set_attr "length" "2")
6608 1.1 mrg (set_attr "cc" "none")])
6609 1.1.1.2 mrg
6610 1.1.1.2 mrg ;; Combiner transforms above four pattern into ZERO_EXTRACT if it sees MEM
6611 1.1.1.2 mrg ;; and input/output match. We provide a special pattern for this, because
6612 1.1.1.2 mrg ;; in contrast to a IN/BST/BLD/OUT sequence we need less registers and the
6613 1.1.1.2 mrg ;; operation on I/O is atomic.
6614 1.1.1.6 mrg (define_insn "*insv.io"
6615 1.1.1.2 mrg [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i,i,i"))
6616 1.1.1.2 mrg (const_int 1)
6617 1.1.1.2 mrg (match_operand:QI 1 "const_0_to_7_operand" "n,n,n"))
6618 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "L,P,r"))]
6619 1.1.1.2 mrg ""
6620 1.1.1.2 mrg "@
6621 1.1.1.2 mrg cbi %i0,%1
6622 1.1.1.2 mrg sbi %i0,%1
6623 1.1.1.2 mrg sbrc %2,0\;sbi %i0,%1\;sbrs %2,0\;cbi %i0,%1"
6624 1.1.1.2 mrg [(set_attr "length" "1,1,4")
6625 1.1 mrg (set_attr "cc" "none")])
6626 1.1.1.2 mrg
6627 1.1.1.6 mrg (define_insn "*insv.not.io"
6628 1.1.1.2 mrg [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i"))
6629 1.1.1.2 mrg (const_int 1)
6630 1.1.1.2 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6631 1.1 mrg (not:QI (match_operand:QI 2 "register_operand" "r")))]
6632 1.1.1.2 mrg ""
6633 1.1.1.2 mrg "sbrs %2,0\;sbi %i0,%1\;sbrc %2,0\;cbi %i0,%1"
6634 1.1.1.2 mrg [(set_attr "length" "4")
6635 1.1 mrg (set_attr "cc" "none")])
6636 1.1.1.2 mrg
6637 1.1.1.2 mrg ;; The insv expander.
6638 1.1.1.2 mrg ;; We only support 1-bit inserts
6639 1.1.1.2 mrg (define_expand "insv"
6640 1.1.1.2 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "")
6641 1.1.1.2 mrg (match_operand:QI 1 "const1_operand" "") ; width
6642 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "")) ; pos
6643 1.1.1.2 mrg (match_operand:QI 3 "nonmemory_operand" ""))]
6644 1.1.1.2 mrg "optimize")
6645 1.1.1.9 mrg
6646 1.1.1.9 mrg ;; Some more patterns to support moving around one bit which can be accomplished
6647 1.1.1.9 mrg ;; by BST + BLD in most situations. Unfortunately, there is no canonical
6648 1.1.1.9 mrg ;; representation, and we just implement some more cases that are not too
6649 1.1.1.9 mrg ;; complicated.
6650 1.1.1.2 mrg
6651 1.1.1.2 mrg ;; Insert bit $2.0 into $0.$1
6652 1.1.1.2 mrg (define_insn "*insv.reg"
6653 1.1.1.2 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r,d,d,l,l")
6654 1.1.1.2 mrg (const_int 1)
6655 1.1.1.2 mrg (match_operand:QI 1 "const_0_to_7_operand" "n,n,n,n,n"))
6656 1.1 mrg (match_operand:QI 2 "nonmemory_operand" "r,L,P,L,P"))]
6657 1.1.1.2 mrg ""
6658 1.1.1.2 mrg "@
6659 1.1.1.2 mrg bst %2,0\;bld %0,%1
6660 1.1.1.2 mrg andi %0,lo8(~(1<<%1))
6661 1.1.1.2 mrg ori %0,lo8(1<<%1)
6662 1.1.1.2 mrg clt\;bld %0,%1
6663 1.1.1.2 mrg set\;bld %0,%1"
6664 1.1.1.2 mrg [(set_attr "length" "2,1,1,2,2")
6665 1.1.1.2 mrg (set_attr "cc" "none,set_zn,set_zn,none,none")])
6666 1.1.1.9 mrg
6667 1.1.1.9 mrg ;; Insert bit $2.$3 into $0.$1
6668 1.1.1.9 mrg (define_insn "*insv.extract"
6669 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6670 1.1.1.9 mrg (const_int 1)
6671 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6672 1.1.1.9 mrg (any_extract:QI (match_operand:QI 2 "register_operand" "r")
6673 1.1.1.9 mrg (const_int 1)
6674 1.1.1.9 mrg (match_operand:QI 3 "const_0_to_7_operand" "n")))]
6675 1.1.1.9 mrg ""
6676 1.1.1.9 mrg "bst %2,%3\;bld %0,%1"
6677 1.1.1.9 mrg [(set_attr "length" "2")
6678 1.1.1.9 mrg (set_attr "cc" "none")])
6679 1.1.1.9 mrg
6680 1.1.1.9 mrg ;; Insert bit $2.$3 into $0.$1
6681 1.1.1.9 mrg (define_insn "*insv.shiftrt"
6682 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6683 1.1.1.9 mrg (const_int 1)
6684 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6685 1.1.1.9 mrg (any_shiftrt:QI (match_operand:QI 2 "register_operand" "r")
6686 1.1.1.9 mrg (match_operand:QI 3 "const_0_to_7_operand" "n")))]
6687 1.1.1.9 mrg ""
6688 1.1.1.9 mrg "bst %2,%3\;bld %0,%1"
6689 1.1.1.9 mrg [(set_attr "length" "2")
6690 1.1.1.9 mrg (set_attr "cc" "none")])
6691 1.1.1.9 mrg
6692 1.1.1.9 mrg ;; Same, but with a NOT inverting the source bit.
6693 1.1.1.9 mrg ;; Insert bit ~$2.$3 into $0.$1
6694 1.1.1.9 mrg (define_insn "*insv.not-shiftrt"
6695 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6696 1.1.1.9 mrg (const_int 1)
6697 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6698 1.1.1.9 mrg (not:QI (any_shiftrt:QI (match_operand:QI 2 "register_operand" "r")
6699 1.1.1.9 mrg (match_operand:QI 3 "const_0_to_7_operand" "n"))))]
6700 1.1.1.9 mrg ""
6701 1.1.1.9 mrg {
6702 1.1.1.9 mrg return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL);
6703 1.1.1.9 mrg }
6704 1.1.1.9 mrg [(set_attr "adjust_len" "insv_notbit")
6705 1.1.1.9 mrg (set_attr "cc" "clobber")])
6706 1.1.1.9 mrg
6707 1.1.1.9 mrg ;; Insert bit ~$2.0 into $0.$1
6708 1.1.1.9 mrg (define_insn "*insv.xor1-bit.0"
6709 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6710 1.1.1.9 mrg (const_int 1)
6711 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6712 1.1.1.9 mrg (xor:QI (match_operand:QI 2 "register_operand" "r")
6713 1.1.1.9 mrg (const_int 1)))]
6714 1.1.1.9 mrg ""
6715 1.1.1.9 mrg {
6716 1.1.1.9 mrg return avr_out_insert_notbit (insn, operands, const0_rtx, NULL);
6717 1.1.1.9 mrg }
6718 1.1.1.9 mrg [(set_attr "adjust_len" "insv_notbit_0")
6719 1.1.1.9 mrg (set_attr "cc" "clobber")])
6720 1.1.1.9 mrg
6721 1.1.1.9 mrg ;; Insert bit ~$2.0 into $0.$1
6722 1.1.1.9 mrg (define_insn "*insv.not-bit.0"
6723 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6724 1.1.1.9 mrg (const_int 1)
6725 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6726 1.1.1.9 mrg (not:QI (match_operand:QI 2 "register_operand" "r")))]
6727 1.1.1.9 mrg ""
6728 1.1.1.9 mrg {
6729 1.1.1.9 mrg return avr_out_insert_notbit (insn, operands, const0_rtx, NULL);
6730 1.1.1.9 mrg }
6731 1.1.1.9 mrg [(set_attr "adjust_len" "insv_notbit_0")
6732 1.1.1.9 mrg (set_attr "cc" "clobber")])
6733 1.1.1.9 mrg
6734 1.1.1.9 mrg ;; Insert bit ~$2.7 into $0.$1
6735 1.1.1.9 mrg (define_insn "*insv.not-bit.7"
6736 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6737 1.1.1.9 mrg (const_int 1)
6738 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6739 1.1.1.9 mrg (ge:QI (match_operand:QI 2 "register_operand" "r")
6740 1.1.1.9 mrg (const_int 0)))]
6741 1.1.1.9 mrg ""
6742 1.1.1.9 mrg {
6743 1.1.1.9 mrg return avr_out_insert_notbit (insn, operands, GEN_INT (7), NULL);
6744 1.1.1.9 mrg }
6745 1.1.1.9 mrg [(set_attr "adjust_len" "insv_notbit_7")
6746 1.1.1.9 mrg (set_attr "cc" "clobber")])
6747 1.1.1.9 mrg
6748 1.1.1.9 mrg ;; Insert bit ~$2.$3 into $0.$1
6749 1.1.1.9 mrg (define_insn "*insv.xor-extract"
6750 1.1.1.9 mrg [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r")
6751 1.1.1.9 mrg (const_int 1)
6752 1.1.1.9 mrg (match_operand:QI 1 "const_0_to_7_operand" "n"))
6753 1.1.1.9 mrg (any_extract:QI (xor:QI (match_operand:QI 2 "register_operand" "r")
6754 1.1.1.9 mrg (match_operand:QI 4 "const_int_operand" "n"))
6755 1.1.1.9 mrg (const_int 1)
6756 1.1.1.9 mrg (match_operand:QI 3 "const_0_to_7_operand" "n")))]
6757 1.1.1.9 mrg "INTVAL (operands[4]) & (1 << INTVAL (operands[3]))"
6758 1.1.1.9 mrg {
6759 1.1.1.9 mrg return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL);
6760 1.1.1.9 mrg }
6761 1.1.1.9 mrg [(set_attr "adjust_len" "insv_notbit")
6762 1.1.1.9 mrg (set_attr "cc" "clobber")])
6763 1.1.1.2 mrg
6764 1.1.1.2 mrg
6766 1.1.1.2 mrg ;; Some combine patterns that try to fix bad code when a value is composed
6767 1.1.1.2 mrg ;; from byte parts like in PR27663.
6768 1.1.1.2 mrg ;; The patterns give some release but the code still is not optimal,
6769 1.1.1.2 mrg ;; in particular when subreg lowering (-fsplit-wide-types) is turned on.
6770 1.1.1.2 mrg ;; That switch obfuscates things here and in many other places.
6771 1.1.1.2 mrg
6772 1.1.1.2 mrg ;; "*iorhiqi.byte0" "*iorpsiqi.byte0" "*iorsiqi.byte0"
6773 1.1.1.2 mrg ;; "*xorhiqi.byte0" "*xorpsiqi.byte0" "*xorsiqi.byte0"
6774 1.1.1.2 mrg (define_insn_and_split "*<code_stdname><mode>qi.byte0"
6775 1.1.1.2 mrg [(set (match_operand:HISI 0 "register_operand" "=r")
6776 1.1.1.2 mrg (xior:HISI
6777 1.1 mrg (zero_extend:HISI (match_operand:QI 1 "register_operand" "r"))
6778 1.1.1.2 mrg (match_operand:HISI 2 "register_operand" "0")))]
6779 1.1.1.2 mrg ""
6780 1.1.1.2 mrg "#"
6781 1.1.1.2 mrg "reload_completed"
6782 1.1.1.2 mrg [(set (match_dup 3)
6783 1.1.1.2 mrg (xior:QI (match_dup 3)
6784 1.1.1.2 mrg (match_dup 1)))]
6785 1.1.1.2 mrg {
6786 1.1 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, 0);
6787 1.1.1.2 mrg })
6788 1.1.1.2 mrg
6789 1.1.1.2 mrg ;; "*iorhiqi.byte1-3" "*iorpsiqi.byte1-3" "*iorsiqi.byte1-3"
6790 1.1.1.2 mrg ;; "*xorhiqi.byte1-3" "*xorpsiqi.byte1-3" "*xorsiqi.byte1-3"
6791 1.1.1.2 mrg (define_insn_and_split "*<code_stdname><mode>qi.byte1-3"
6792 1.1.1.2 mrg [(set (match_operand:HISI 0 "register_operand" "=r")
6793 1.1.1.2 mrg (xior:HISI
6794 1.1.1.2 mrg (ashift:HISI (zero_extend:HISI (match_operand:QI 1 "register_operand" "r"))
6795 1.1.1.2 mrg (match_operand:QI 2 "const_8_16_24_operand" "n"))
6796 1.1.1.2 mrg (match_operand:HISI 3 "register_operand" "0")))]
6797 1.1.1.2 mrg "INTVAL(operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
6798 1.1.1.2 mrg "#"
6799 1.1.1.2 mrg "&& reload_completed"
6800 1.1.1.2 mrg [(set (match_dup 4)
6801 1.1.1.2 mrg (xior:QI (match_dup 4)
6802 1.1.1.2 mrg (match_dup 1)))]
6803 1.1.1.2 mrg {
6804 1.1.1.2 mrg int byteno = INTVAL(operands[2]) / BITS_PER_UNIT;
6805 1.1 mrg operands[4] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, byteno);
6806 1.1.1.9 mrg })
6807 1.1.1.9 mrg
6808 1.1.1.12 mrg
6809 1.1.1.9 mrg (define_insn_and_split "*iorhi3.ashift8-ext.zerox"
6810 1.1.1.12 mrg [(set (match_operand:HI 0 "register_operand" "=r,r")
6811 1.1.1.9 mrg (ior:HI (ashift:HI (any_extend:HI
6812 1.1.1.12 mrg (match_operand:QI 1 "register_operand" "r,r"))
6813 1.1.1.9 mrg (const_int 8))
6814 1.1.1.9 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "0,r"))))]
6815 1.1.1.9 mrg "optimize"
6816 1.1.1.9 mrg { gcc_unreachable(); }
6817 1.1.1.9 mrg "&& reload_completed"
6818 1.1.1.9 mrg [(set (match_dup 1) (xor:QI (match_dup 1) (match_dup 2)))
6819 1.1.1.9 mrg (set (match_dup 2) (xor:QI (match_dup 2) (match_dup 1)))
6820 1.1.1.9 mrg (set (match_dup 1) (xor:QI (match_dup 1) (match_dup 2)))]
6821 1.1.1.9 mrg {
6822 1.1.1.9 mrg rtx hi = simplify_gen_subreg (QImode, operands[0], HImode, 1);
6823 1.1.1.9 mrg rtx lo = simplify_gen_subreg (QImode, operands[0], HImode, 0);
6824 1.1.1.9 mrg
6825 1.1.1.9 mrg if (!reg_overlap_mentioned_p (hi, operands[2]))
6826 1.1.1.9 mrg {
6827 1.1.1.9 mrg emit_move_insn (hi, operands[1]);
6828 1.1.1.9 mrg emit_move_insn (lo, operands[2]);
6829 1.1.1.9 mrg DONE;
6830 1.1.1.9 mrg }
6831 1.1.1.9 mrg else if (!reg_overlap_mentioned_p (lo, operands[1]))
6832 1.1.1.9 mrg {
6833 1.1.1.9 mrg emit_move_insn (lo, operands[2]);
6834 1.1.1.9 mrg emit_move_insn (hi, operands[1]);
6835 1.1.1.9 mrg DONE;
6836 1.1.1.9 mrg }
6837 1.1.1.9 mrg
6838 1.1.1.9 mrg gcc_assert (REGNO (operands[1]) == REGNO (operands[0]));
6839 1.1.1.9 mrg gcc_assert (REGNO (operands[2]) == 1 + REGNO (operands[0]));
6840 1.1.1.9 mrg })
6841 1.1.1.9 mrg
6842 1.1.1.9 mrg (define_insn_and_split "*iorhi3.ashift8-ext.reg"
6843 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6844 1.1.1.9 mrg (ior:HI (ashift:HI (any_extend:HI
6845 1.1.1.9 mrg (match_operand:QI 1 "register_operand" "r"))
6846 1.1.1.9 mrg (const_int 8))
6847 1.1.1.9 mrg (match_operand:HI 2 "register_operand" "0")))]
6848 1.1.1.9 mrg "optimize"
6849 1.1.1.9 mrg { gcc_unreachable(); }
6850 1.1.1.9 mrg "&& reload_completed"
6851 1.1.1.9 mrg [(set (match_dup 3)
6852 1.1.1.9 mrg (ior:QI (match_dup 4)
6853 1.1.1.9 mrg (match_dup 1)))]
6854 1.1.1.9 mrg {
6855 1.1.1.9 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
6856 1.1.1.9 mrg operands[4] = simplify_gen_subreg (QImode, operands[2], HImode, 1);
6857 1.1.1.9 mrg })
6858 1.1.1.9 mrg
6859 1.1.1.9 mrg (define_insn_and_split "*iorhi3.ashift8-reg.zerox"
6860 1.1.1.9 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6861 1.1.1.9 mrg (ior:HI (ashift:HI (match_operand:HI 1 "register_operand" "r")
6862 1.1.1.9 mrg (const_int 8))
6863 1.1.1.9 mrg (zero_extend:HI (match_operand:QI 2 "register_operand" "0"))))]
6864 1.1.1.9 mrg "optimize"
6865 1.1.1.9 mrg { gcc_unreachable(); }
6866 1.1.1.9 mrg "&& reload_completed"
6867 1.1.1.9 mrg [(set (match_dup 3)
6868 1.1.1.9 mrg (match_dup 4))]
6869 1.1.1.9 mrg {
6870 1.1.1.9 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
6871 1.1.1.9 mrg operands[4] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
6872 1.1.1.9 mrg })
6873 1.1.1.9 mrg
6874 1.1.1.9 mrg
6875 1.1.1.9 mrg (define_peephole2
6876 1.1.1.9 mrg [(set (match_operand:QI 0 "register_operand")
6877 1.1.1.9 mrg (const_int 0))
6878 1.1.1.9 mrg (set (match_dup 0)
6879 1.1.1.9 mrg (ior:QI (match_dup 0)
6880 1.1.1.9 mrg (match_operand:QI 1 "register_operand")))]
6881 1.1.1.9 mrg ""
6882 1.1.1.9 mrg [(set (match_dup 0)
6883 1.1.1.9 mrg (match_dup 1))])
6884 1.1.1.2 mrg
6885 1.1.1.2 mrg
6886 1.1.1.2 mrg (define_expand "extzv"
6887 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "")
6888 1.1.1.2 mrg (zero_extract:QI (match_operand:QI 1 "register_operand" "")
6889 1.1.1.2 mrg (match_operand:QI 2 "const1_operand" "")
6890 1.1.1.2 mrg (match_operand:QI 3 "const_0_to_7_operand" "")))])
6891 1.1.1.2 mrg
6892 1.1.1.2 mrg (define_insn "*extzv"
6893 1.1.1.2 mrg [(set (match_operand:QI 0 "register_operand" "=*d,*d,*d,*d,r")
6894 1.1.1.2 mrg (zero_extract:QI (match_operand:QI 1 "register_operand" "0,r,0,0,r")
6895 1.1 mrg (const_int 1)
6896 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,C04,n")))]
6897 1.1.1.2 mrg ""
6898 1.1.1.2 mrg "@
6899 1.1.1.2 mrg andi %0,1
6900 1.1.1.2 mrg mov %0,%1\;andi %0,1
6901 1.1.1.2 mrg lsr %0\;andi %0,1
6902 1.1.1.2 mrg swap %0\;andi %0,1
6903 1.1.1.2 mrg bst %1,%2\;clr %0\;bld %0,0"
6904 1.1.1.2 mrg [(set_attr "length" "1,2,2,2,3")
6905 1.1.1.2 mrg (set_attr "cc" "set_zn,set_zn,set_zn,set_zn,clobber")])
6906 1.1.1.2 mrg
6907 1.1.1.2 mrg (define_insn_and_split "*extzv.qihi1"
6908 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6909 1.1.1.2 mrg (zero_extract:HI (match_operand:QI 1 "register_operand" "r")
6910 1.1 mrg (const_int 1)
6911 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "n")))]
6912 1.1.1.2 mrg ""
6913 1.1.1.2 mrg "#"
6914 1.1.1.2 mrg ""
6915 1.1.1.2 mrg [(set (match_dup 3)
6916 1.1.1.2 mrg (zero_extract:QI (match_dup 1)
6917 1.1.1.2 mrg (const_int 1)
6918 1.1.1.2 mrg (match_dup 2)))
6919 1.1 mrg (set (match_dup 4)
6920 1.1.1.2 mrg (const_int 0))]
6921 1.1.1.2 mrg {
6922 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
6923 1.1 mrg operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
6924 1.1.1.2 mrg })
6925 1.1.1.2 mrg
6926 1.1.1.2 mrg (define_insn_and_split "*extzv.qihi2"
6927 1.1.1.2 mrg [(set (match_operand:HI 0 "register_operand" "=r")
6928 1.1.1.2 mrg (zero_extend:HI
6929 1.1.1.2 mrg (zero_extract:QI (match_operand:QI 1 "register_operand" "r")
6930 1.1.1.2 mrg (const_int 1)
6931 1.1.1.2 mrg (match_operand:QI 2 "const_0_to_7_operand" "n"))))]
6932 1.1 mrg ""
6933 1.1.1.2 mrg "#"
6934 1.1.1.2 mrg ""
6935 1.1.1.2 mrg [(set (match_dup 3)
6936 1.1.1.2 mrg (zero_extract:QI (match_dup 1)
6937 1.1.1.2 mrg (const_int 1)
6938 1.1.1.2 mrg (match_dup 2)))
6939 1.1 mrg (set (match_dup 4)
6940 1.1.1.2 mrg (const_int 0))]
6941 1.1.1.2 mrg {
6942 1.1.1.2 mrg operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
6943 1.1.1.2 mrg operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
6944 1.1.1.9 mrg })
6945 1.1.1.9 mrg
6946 1.1.1.9 mrg ;; ??? do_store_flag emits a hard-coded right shift to extract a bit without
6947 1.1.1.9 mrg ;; even considering rtx_costs, extzv, or a bit-test. See PR 55181 for an example.
6948 1.1.1.9 mrg (define_insn_and_split "*extract.subreg.bit"
6949 1.1.1.9 mrg [(set (match_operand:QI 0 "register_operand" "=r")
6950 1.1.1.9 mrg (and:QI (subreg:QI (any_shiftrt:HISI (match_operand:HISI 1 "register_operand" "r")
6951 1.1.1.9 mrg (match_operand:QI 2 "const_int_operand" "n"))
6952 1.1.1.9 mrg 0)
6953 1.1.1.9 mrg (const_int 1)))]
6954 1.1.1.9 mrg "INTVAL (operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
6955 1.1.1.9 mrg { gcc_unreachable(); }
6956 1.1.1.9 mrg "&& reload_completed"
6957 1.1.1.9 mrg [;; "*extzv"
6958 1.1.1.9 mrg (set (match_dup 0)
6959 1.1.1.9 mrg (zero_extract:QI (match_dup 3)
6960 1.1.1.9 mrg (const_int 1)
6961 1.1.1.9 mrg (match_dup 4)))]
6962 1.1.1.9 mrg {
6963 1.1.1.9 mrg int bitno = INTVAL (operands[2]);
6964 1.1.1.9 mrg operands[3] = simplify_gen_subreg (QImode, operands[1], <MODE>mode, bitno / 8);
6965 1.1.1.9 mrg operands[4] = GEN_INT (bitno % 8);
6966 1.1.1.2 mrg })
6967 1.1.1.2 mrg
6968 1.1.1.2 mrg
6970 1.1.1.2 mrg ;; Fixed-point instructions
6971 1.1.1.2 mrg (include "avr-fixed.md")
6972
6973 ;; Operations on 64-bit registers
6974 (include "avr-dimode.md")
6975