c6x.md revision 1.9 1 1.1 mrg ;; Machine description for TI C6X.
2 1.9 mrg ;; Copyright (C) 2010-2020 Free Software Foundation, Inc.
3 1.1 mrg ;; Contributed by Andrew Jenner <andrew (a] codesourcery.com>
4 1.1 mrg ;; Contributed by Bernd Schmidt <bernds (a] codesourcery.com>
5 1.1 mrg ;; Contributed by CodeSourcery.
6 1.1 mrg ;;
7 1.1 mrg ;; This file is part of GCC.
8 1.1 mrg ;;
9 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify
10 1.1 mrg ;; it under the terms of the GNU General Public License as published by
11 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option)
12 1.1 mrg ;; any later version.
13 1.1 mrg ;;
14 1.1 mrg ;; GCC is distributed in the hope that it will be useful,
15 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1 mrg ;; GNU General Public License for more details.
18 1.1 mrg ;;
19 1.1 mrg ;; You should have received a copy of the GNU General Public License
20 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
21 1.1 mrg ;; <http://www.gnu.org/licenses/>.
22 1.1 mrg
23 1.1 mrg
24 1.1 mrg ;; Register names
25 1.1 mrg
26 1.1 mrg (define_constants
27 1.1 mrg [(REG_A0 0)
28 1.1 mrg (REG_A1 1)
29 1.1 mrg (REG_A2 2)
30 1.1 mrg (REG_A3 3)
31 1.1 mrg (REG_A4 4)
32 1.1 mrg (REG_A5 5)
33 1.1 mrg (REG_A6 6)
34 1.1 mrg (REG_A7 7)
35 1.1 mrg (REG_A8 8)
36 1.1 mrg (REG_A9 9)
37 1.1 mrg (REG_A10 10)
38 1.1 mrg (REG_A11 11)
39 1.1 mrg (REG_A12 12)
40 1.1 mrg (REG_A13 13)
41 1.1 mrg (REG_A14 14)
42 1.1 mrg (REG_A15 15)
43 1.1 mrg (REG_A16 16)
44 1.1 mrg (REG_A17 17)
45 1.1 mrg (REG_A18 18)
46 1.1 mrg (REG_A19 19)
47 1.1 mrg (REG_A20 20)
48 1.1 mrg (REG_A21 21)
49 1.1 mrg (REG_A22 22)
50 1.1 mrg (REG_A23 23)
51 1.1 mrg (REG_A24 24)
52 1.1 mrg (REG_A25 25)
53 1.1 mrg (REG_A26 26)
54 1.1 mrg (REG_A27 27)
55 1.1 mrg (REG_A28 28)
56 1.1 mrg (REG_A29 29)
57 1.1 mrg (REG_A30 30)
58 1.1 mrg (REG_A31 31)
59 1.1 mrg (REG_B0 32)
60 1.1 mrg (REG_B1 33)
61 1.1 mrg (REG_B2 34)
62 1.1 mrg (REG_B3 35)
63 1.1 mrg (REG_B4 36)
64 1.1 mrg (REG_B5 37)
65 1.1 mrg (REG_B6 38)
66 1.1 mrg (REG_B7 39)
67 1.1 mrg (REG_B8 40)
68 1.1 mrg (REG_B9 41)
69 1.1 mrg (REG_B10 42)
70 1.1 mrg (REG_B11 43)
71 1.1 mrg (REG_B12 44)
72 1.1 mrg (REG_B13 45)
73 1.1 mrg (REG_B14 46)
74 1.1 mrg (REG_SP 47)
75 1.1 mrg (REG_B15 47)
76 1.1 mrg (REG_B16 48)
77 1.1 mrg (REG_B17 49)
78 1.1 mrg (REG_B18 50)
79 1.1 mrg (REG_B19 51)
80 1.1 mrg (REG_B20 52)
81 1.1 mrg (REG_B21 53)
82 1.1 mrg (REG_B22 54)
83 1.1 mrg (REG_B23 55)
84 1.1 mrg (REG_B24 56)
85 1.1 mrg (REG_B25 57)
86 1.1 mrg (REG_B26 58)
87 1.1 mrg (REG_B27 59)
88 1.1 mrg (REG_B28 60)
89 1.1 mrg (REG_B29 61)
90 1.1 mrg (REG_B30 62)
91 1.1 mrg (REG_B31 63)
92 1.1 mrg (REG_FRAME 64)
93 1.1 mrg (REG_ARGP 65)
94 1.1 mrg (REG_ILC 66)])
95 1.1 mrg
96 1.1 mrg (define_c_enum "unspec" [
97 1.1 mrg UNSPEC_NOP
98 1.1 mrg UNSPEC_RCP
99 1.1 mrg UNSPEC_MISALIGNED_ACCESS
100 1.1 mrg UNSPEC_ADDKPC
101 1.1 mrg UNSPEC_SETUP_DSBT
102 1.1 mrg UNSPEC_LOAD_GOT
103 1.1 mrg UNSPEC_LOAD_SDATA
104 1.1 mrg UNSPEC_BITREV
105 1.1 mrg UNSPEC_GOTOFF
106 1.1 mrg UNSPEC_MVILC
107 1.1 mrg UNSPEC_REAL_JUMP
108 1.1 mrg UNSPEC_REAL_LOAD
109 1.1 mrg UNSPEC_REAL_MULT
110 1.1 mrg UNSPEC_JUMP_SHADOW
111 1.1 mrg UNSPEC_LOAD_SHADOW
112 1.1 mrg UNSPEC_MULT_SHADOW
113 1.1 mrg UNSPEC_EPILOGUE_BARRIER
114 1.1 mrg UNSPEC_ATOMIC
115 1.1 mrg UNSPEC_CLR
116 1.1 mrg UNSPEC_EXT
117 1.1 mrg UNSPEC_EXTU
118 1.1 mrg UNSPEC_SUBC
119 1.1 mrg UNSPEC_AVG
120 1.1 mrg ])
121 1.1 mrg
122 1.1 mrg (define_c_enum "unspecv" [
123 1.1 mrg UNSPECV_BLOCKAGE
124 1.1 mrg UNSPECV_SPLOOP
125 1.1 mrg UNSPECV_SPKERNEL
126 1.1 mrg UNSPECV_EH_RETURN
127 1.1 mrg UNSPECV_CAS
128 1.1 mrg ])
129 1.1 mrg
130 1.1 mrg ;; -------------------------------------------------------------------------
131 1.1 mrg ;; Instruction attributes
132 1.1 mrg ;; -------------------------------------------------------------------------
133 1.1 mrg
134 1.1 mrg (define_attr "cpu"
135 1.1 mrg "c62x,c64x,c64xp,c67x,c67xp,c674x"
136 1.1 mrg (const (symbol_ref "(enum attr_cpu)c6x_arch")))
137 1.1 mrg
138 1.1 mrg ;; Define a type for each insn which is used in the scheduling description.
139 1.1 mrg ;; These correspond to the types defined in chapter 4 of the C674x manual.
140 1.1 mrg (define_attr "type"
141 1.1 mrg "unknown,single,mpy2,store,storen,mpy4,load,loadn,branch,call,callp,dp2,fp4,
142 1.1 mrg intdp,cmpdp,adddp,mpy,mpyi,mpyid,mpydp,mpyspdp,mpysp2dp,spkernel,sploop,
143 1.1 mrg mvilc,blockage,shadow,load_shadow,mult_shadow,atomic"
144 1.1 mrg (const_string "single"))
145 1.1 mrg
146 1.1 mrg ;; The register file used by an instruction's destination register.
147 1.1 mrg ;; The function destreg_file computes this; instructions can override the
148 1.1 mrg ;; attribute if they aren't a single_set.
149 1.1 mrg (define_attr "dest_regfile"
150 1.1 mrg "unknown,any,a,b"
151 1.1 mrg (cond [(eq_attr "type" "single,load,mpy2,mpy4,dp2,fp4,intdp,cmpdp,adddp,mpy,mpyi,mpyid,mpydp,mpyspdp,mpysp2dp")
152 1.1 mrg (cond [(match_operand 0 "a_register" "") (const_string "a")
153 1.1 mrg (match_operand 0 "b_register" "") (const_string "b")]
154 1.1 mrg (const_string "unknown"))
155 1.1 mrg (eq_attr "type" "store")
156 1.1 mrg (cond [(match_operand 1 "a_register" "") (const_string "a")
157 1.1 mrg (match_operand 1 "b_register" "") (const_string "b")]
158 1.1 mrg (const_string "unknown"))]
159 1.1 mrg (const_string "unknown")))
160 1.1 mrg
161 1.1 mrg (define_attr "addr_regfile"
162 1.1 mrg "unknown,a,b"
163 1.1 mrg (const_string "unknown"))
164 1.1 mrg
165 1.1 mrg (define_attr "cross"
166 1.1 mrg "n,y"
167 1.1 mrg (const_string "n"))
168 1.1 mrg
169 1.1 mrg ;; This describes the relationship between operands and register files.
170 1.1 mrg ;; For example, "sxs" means that operands 0 and 2 determine the side of
171 1.1 mrg ;; the machine, and operand 1 can optionally use the cross path. "dt" and
172 1.1 mrg ;; "td" are used to describe loads and stores.
173 1.1 mrg ;; Used for register renaming in loops for improving modulo scheduling.
174 1.1 mrg (define_attr "op_pattern"
175 1.1 mrg "unknown,dt,td,sx,sxs,ssx"
176 1.1 mrg (cond [(eq_attr "type" "load") (const_string "td")
177 1.1 mrg (eq_attr "type" "store") (const_string "dt")]
178 1.1 mrg (const_string "unknown")))
179 1.1 mrg
180 1.1 mrg (define_attr "has_shadow"
181 1.1 mrg "n,y"
182 1.1 mrg (const_string "n"))
183 1.1 mrg
184 1.1 mrg ;; The number of cycles the instruction takes to finish. Any cycles above
185 1.1 mrg ;; the first are delay slots.
186 1.1 mrg (define_attr "cycles" ""
187 1.1 mrg (cond [(eq_attr "type" "branch,call") (const_int 6)
188 1.1 mrg (eq_attr "type" "load,loadn") (const_int 5)
189 1.1 mrg (eq_attr "type" "dp2") (const_int 2)
190 1.1 mrg (eq_attr "type" "mpy2") (const_int 2)
191 1.1 mrg (eq_attr "type" "mpy4") (const_int 4)
192 1.1 mrg (eq_attr "type" "fp4") (const_int 4)
193 1.1 mrg (eq_attr "type" "mvilc") (const_int 4)
194 1.1 mrg (eq_attr "type" "cmpdp") (const_int 2)
195 1.1 mrg (eq_attr "type" "intdp") (const_int 5)
196 1.1 mrg (eq_attr "type" "adddp") (const_int 7)
197 1.1 mrg (eq_attr "type" "mpydp") (const_int 10)
198 1.1 mrg (eq_attr "type" "mpyi") (const_int 9)
199 1.1 mrg (eq_attr "type" "mpyid") (const_int 10)
200 1.1 mrg (eq_attr "type" "mpyspdp") (const_int 7)
201 1.1 mrg (eq_attr "type" "mpysp2dp") (const_int 5)]
202 1.1 mrg (const_int 1)))
203 1.1 mrg
204 1.1 mrg ;; The number of cycles during which the instruction reserves functional
205 1.1 mrg ;; units.
206 1.1 mrg (define_attr "reserve_cycles" ""
207 1.1 mrg (cond [(eq_attr "type" "cmpdp") (const_int 2)
208 1.1 mrg (eq_attr "type" "adddp") (const_int 2)
209 1.1 mrg (eq_attr "type" "mpydp") (const_int 4)
210 1.1 mrg (eq_attr "type" "mpyi") (const_int 4)
211 1.1 mrg (eq_attr "type" "mpyid") (const_int 4)
212 1.1 mrg (eq_attr "type" "mpyspdp") (const_int 2)]
213 1.1 mrg (const_int 1)))
214 1.1 mrg
215 1.1 mrg (define_attr "predicable" "no,yes"
216 1.1 mrg (const_string "yes"))
217 1.1 mrg
218 1.1 mrg (define_attr "enabled" "no,yes"
219 1.1 mrg (const_string "yes"))
220 1.1 mrg
221 1.1 mrg ;; Specify which units can be used by a given instruction. Normally,
222 1.1 mrg ;; dest_regfile is used to select between the two halves of the machine.
223 1.1 mrg ;; D_ADDR is for load/store instructions; they use the D unit and use
224 1.1 mrg ;; addr_regfile to choose between D1 and D2.
225 1.1 mrg
226 1.1 mrg (define_attr "units62"
227 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
228 1.1 mrg (const_string "unknown"))
229 1.1 mrg
230 1.1 mrg (define_attr "units64"
231 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
232 1.1 mrg (const_string "unknown"))
233 1.1 mrg
234 1.1 mrg (define_attr "units64p"
235 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
236 1.1 mrg (attr "units64"))
237 1.1 mrg
238 1.1 mrg (define_attr "units67"
239 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
240 1.1 mrg (attr "units62"))
241 1.1 mrg
242 1.1 mrg (define_attr "units67p"
243 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
244 1.1 mrg (attr "units67"))
245 1.1 mrg
246 1.1 mrg (define_attr "units674"
247 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
248 1.1 mrg (attr "units64"))
249 1.1 mrg
250 1.1 mrg (define_attr "units"
251 1.1 mrg "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
252 1.1 mrg (cond [(eq_attr "cpu" "c62x")
253 1.1 mrg (attr "units62")
254 1.1 mrg (eq_attr "cpu" "c67x")
255 1.1 mrg (attr "units67")
256 1.1 mrg (eq_attr "cpu" "c67xp")
257 1.1 mrg (attr "units67p")
258 1.1 mrg (eq_attr "cpu" "c64x")
259 1.1 mrg (attr "units64")
260 1.1 mrg (eq_attr "cpu" "c64xp")
261 1.1 mrg (attr "units64p")
262 1.1 mrg (eq_attr "cpu" "c674x")
263 1.1 mrg (attr "units674")
264 1.1 mrg ]
265 1.1 mrg (const_string "unknown")))
266 1.1 mrg
267 1.1 mrg (define_automaton "c6x_1,c6x_2,c6x_m1,c6x_m2,c6x_t1,c6x_t2,c6x_branch")
268 1.1 mrg (automata_option "no-comb-vect")
269 1.1 mrg (automata_option "ndfa")
270 1.1 mrg (automata_option "collapse-ndfa")
271 1.1 mrg
272 1.1 mrg (define_query_cpu_unit "d1,l1,s1" "c6x_1")
273 1.1 mrg (define_cpu_unit "x1" "c6x_1")
274 1.1 mrg (define_cpu_unit "l1w,s1w" "c6x_1")
275 1.1 mrg (define_query_cpu_unit "m1" "c6x_m1")
276 1.1 mrg (define_cpu_unit "m1w" "c6x_m1")
277 1.1 mrg (define_cpu_unit "t1" "c6x_t1")
278 1.1 mrg (define_query_cpu_unit "d2,l2,s2" "c6x_2")
279 1.1 mrg (define_cpu_unit "x2" "c6x_2")
280 1.1 mrg (define_cpu_unit "l2w,s2w" "c6x_2")
281 1.1 mrg (define_query_cpu_unit "m2" "c6x_m2")
282 1.1 mrg (define_cpu_unit "m2w" "c6x_m2")
283 1.1 mrg (define_cpu_unit "t2" "c6x_t2")
284 1.1 mrg ;; A special set of units used to identify specific reservations, rather than
285 1.1 mrg ;; just units.
286 1.1 mrg (define_query_cpu_unit "fps1,fpl1,adddps1,adddpl1" "c6x_1")
287 1.1 mrg (define_query_cpu_unit "fps2,fpl2,adddps2,adddpl2" "c6x_2")
288 1.1 mrg
289 1.1 mrg ;; There can be up to two branches in one cycle (on the .s1 and .s2
290 1.1 mrg ;; units), but some instructions must not be scheduled in parallel
291 1.1 mrg ;; with a branch. We model this by reserving either br0 or br1 for a
292 1.1 mrg ;; normal branch, and both of them for an insn such as callp.
293 1.1 mrg ;; Another constraint is that two branches may only execute in parallel
294 1.1 mrg ;; if one uses an offset, and the other a register. We can distinguish
295 1.1 mrg ;; these by the dest_regfile attribute; it is "any" iff the branch uses
296 1.1 mrg ;; an offset. br0 is reserved for these, while br1 is reserved for
297 1.1 mrg ;; branches using a register.
298 1.1 mrg (define_cpu_unit "br0,br1" "c6x_branch")
299 1.1 mrg
300 1.1 mrg (include "c6x-sched.md")
301 1.1 mrg
302 1.1 mrg ;; Some reservations which aren't generated from c6x-sched.md.in
303 1.1 mrg
304 1.1 mrg (define_insn_reservation "branch_s1any" 6
305 1.1 mrg (and (eq_attr "type" "branch")
306 1.1 mrg (and (eq_attr "cross" "n")
307 1.1 mrg (and (eq_attr "units" "s")
308 1.1 mrg (eq_attr "dest_regfile" "any"))))
309 1.1 mrg "s1+s1w+br0")
310 1.1 mrg
311 1.1 mrg ;; For calls, we also reserve the units needed in the following cycles
312 1.1 mrg ;; to load the return address. There are two options; using addkpc or
313 1.1 mrg ;; mvkh/mvkl. The code in c6x_reorg knows whether to use one of these
314 1.1 mrg ;; or whether to use callp. The actual insns are emitted only after
315 1.1 mrg ;; the final scheduling pass is complete.
316 1.1 mrg ;; We always reserve S2 for PC-relative call insns, since that allows
317 1.1 mrg ;; us to turn them into callp insns later on.
318 1.1 mrg (define_insn_reservation "call_addkpc_s1any" 6
319 1.1 mrg (and (eq_attr "type" "call")
320 1.1 mrg (and (ne (symbol_ref "TARGET_INSNS_64") (const_int 0))
321 1.1 mrg (and (eq_attr "cross" "n")
322 1.1 mrg (and (eq_attr "units" "s")
323 1.1 mrg (eq_attr "dest_regfile" "any")))))
324 1.1 mrg "s2+s2w+br0,s2+s2w+br0+br1")
325 1.1 mrg
326 1.1 mrg (define_insn_reservation "call_mvk_s1any" 6
327 1.1 mrg (and (eq_attr "type" "call")
328 1.1 mrg (and (eq (symbol_ref "TARGET_INSNS_64") (const_int 0))
329 1.1 mrg (and (eq_attr "cross" "n")
330 1.1 mrg (and (eq_attr "units" "s")
331 1.1 mrg (eq_attr "dest_regfile" "any")))))
332 1.1 mrg "s2+s2w+br0,s2+s2w,s2+s2w")
333 1.1 mrg
334 1.1 mrg (define_reservation "all" "s1+s2+d1+d2+l1+l2+m1+m2")
335 1.1 mrg
336 1.1 mrg (define_insn_reservation "callp_s1" 1
337 1.1 mrg (and (eq_attr "type" "callp") (eq_attr "dest_regfile" "a"))
338 1.1 mrg "s1+s1w,all*5")
339 1.1 mrg
340 1.1 mrg (define_insn_reservation "callp_s2" 1
341 1.1 mrg (and (eq_attr "type" "callp") (eq_attr "dest_regfile" "b"))
342 1.1 mrg "s2+s2w,all*5")
343 1.1 mrg
344 1.1 mrg ;; Constraints
345 1.1 mrg
346 1.1 mrg (include "constraints.md")
347 1.1 mrg
348 1.1 mrg ;; Predicates
349 1.1 mrg
350 1.1 mrg (include "predicates.md")
351 1.1 mrg
352 1.1 mrg ;; General predication pattern.
353 1.1 mrg
354 1.1 mrg (define_cond_exec
355 1.1 mrg [(match_operator 0 "eqne_operator"
356 1.1 mrg [(match_operand 1 "predicate_register" "AB")
357 1.1 mrg (const_int 0)])]
358 1.1 mrg ""
359 1.1 mrg "")
360 1.1 mrg
361 1.1 mrg ;; -------------------------------------------------------------------------
362 1.1 mrg ;; NOP instruction
363 1.1 mrg ;; -------------------------------------------------------------------------
364 1.1 mrg
365 1.1 mrg (define_insn "nop"
366 1.1 mrg [(const_int 0)]
367 1.1 mrg ""
368 1.1 mrg "nop")
369 1.1 mrg
370 1.1 mrg (define_insn "nop_count"
371 1.1 mrg [(unspec [(match_operand 0 "const_int_operand" "n")] UNSPEC_NOP)]
372 1.1 mrg ""
373 1.1 mrg "%|%.\\tnop\\t%0")
374 1.1 mrg
375 1.1 mrg ;; -------------------------------------------------------------------------
376 1.1 mrg ;; Move instructions
377 1.1 mrg ;; -------------------------------------------------------------------------
378 1.1 mrg
379 1.1 mrg (define_mode_iterator QIHIM [QI HI])
380 1.1 mrg (define_mode_iterator SIDIM [SI DI])
381 1.1 mrg (define_mode_iterator SIDIVM [SI DI V2HI V4QI])
382 1.1 mrg (define_mode_iterator VEC4M [V2HI V4QI])
383 1.1 mrg (define_mode_iterator VEC8M [V2SI V4HI V8QI])
384 1.1 mrg (define_mode_iterator SISFVM [SI SF V2HI V4QI])
385 1.1 mrg (define_mode_iterator DIDFM [DI DF])
386 1.1 mrg (define_mode_iterator DIDFVM [DI DF V2SI V4HI V8QI])
387 1.1 mrg (define_mode_iterator SFDFM [SF DF])
388 1.1 mrg (define_mode_iterator M32 [QI HI SI SF V2HI V4QI])
389 1.1 mrg
390 1.1 mrg ;; The C6X LO_SUM and HIGH are backwards - HIGH sets the low bits, and
391 1.1 mrg ;; LO_SUM adds in the high bits. Fortunately these are opaque operations
392 1.1 mrg ;; so this does not matter.
393 1.1 mrg (define_insn "movsi_lo_sum"
394 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab")
395 1.1 mrg (lo_sum:SI (match_operand:SI 1 "register_operand" "0")
396 1.1 mrg (match_operand:SI 2 "const_int_or_symbolic_operand" "i")))]
397 1.1 mrg "reload_completed"
398 1.1 mrg "%|%.\\tmvkh\\t%$\\t%2, %0"
399 1.1 mrg [(set_attr "units" "s")])
400 1.1 mrg
401 1.1 mrg (define_insn "movsi_high"
402 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab")
403 1.1 mrg (high:SI (match_operand:SI 1 "const_int_or_symbolic_operand" "i")))]
404 1.1 mrg "reload_completed"
405 1.1 mrg "%|%.\\tmvkl\\t%$\\t%1, %0"
406 1.1 mrg [(set_attr "units" "s")])
407 1.1 mrg
408 1.1 mrg (define_insn "movsi_gotoff_lo_sum"
409 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab")
410 1.1 mrg (lo_sum:SI (match_operand:SI 1 "register_operand" "0")
411 1.1 mrg (unspec:SI [(match_operand:SI 2 "symbolic_operand" "S2")]
412 1.1 mrg UNSPEC_GOTOFF)))]
413 1.1 mrg "flag_pic == 2"
414 1.1 mrg "%|%.\\tmvkh\\t%$\\t$dpr_got%2, %0"
415 1.1 mrg [(set_attr "units" "s")])
416 1.1 mrg
417 1.1 mrg (define_insn "movsi_gotoff_high"
418 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab")
419 1.1 mrg (high:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "S2")]
420 1.1 mrg UNSPEC_GOTOFF)))]
421 1.1 mrg "flag_pic == 2"
422 1.1 mrg "%|%.\\tmvkl\\t%$\\t$dpr_got%1, %0"
423 1.1 mrg [(set_attr "units" "s")])
424 1.1 mrg
425 1.1 mrg ;; Normally we'd represent this as a normal load insn, but we can't currently
426 1.1 mrg ;; represent the addressing mode.
427 1.1 mrg (define_insn "load_got_gotoff"
428 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b")
429 1.1 mrg (unspec:SI [(match_operand:SI 1 "register_operand" "Z,Z")
430 1.1 mrg (match_operand:SI 2 "register_operand" "b,b")]
431 1.1 mrg UNSPEC_GOTOFF))]
432 1.1 mrg "flag_pic == 2"
433 1.1 mrg "%|%.\\tldw\\t%$\\t*+%1[%2], %0"
434 1.1 mrg [(set_attr "type" "load")
435 1.1 mrg (set_attr "units" "d_addr")
436 1.1 mrg (set_attr "op_pattern" "unknown")
437 1.1 mrg (set_attr "dest_regfile" "a,b")
438 1.1 mrg (set_attr "addr_regfile" "b")])
439 1.1 mrg
440 1.1 mrg (define_insn "*movstricthi_high"
441 1.1 mrg [(set (match_operand:SI 0 "register_operand" "+ab")
442 1.1 mrg (ior:SI (and:SI (match_dup 0) (const_int 65535))
443 1.1 mrg (ashift:SI (match_operand:SI 1 "const_int_operand" "IuB")
444 1.1 mrg (const_int 16))))]
445 1.1 mrg "reload_completed"
446 1.1 mrg "%|%.\\tmvklh\\t%$\\t%1, %0"
447 1.1 mrg [(set_attr "units" "s")])
448 1.1 mrg
449 1.1 mrg ;; Break up SImode loads of immediate operands.
450 1.1 mrg
451 1.1 mrg (define_split
452 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
453 1.1 mrg (match_operand:SI 1 "const_int_operand" ""))]
454 1.1 mrg "reload_completed
455 1.1 mrg && !satisfies_constraint_IsB (operands[1])"
456 1.1 mrg [(set (match_dup 0) (match_dup 2))
457 1.1 mrg (set (match_dup 0) (ior:SI (and:SI (match_dup 0) (const_int 65535))
458 1.1 mrg (ashift:SI (match_dup 3) (const_int 16))))]
459 1.1 mrg {
460 1.1 mrg HOST_WIDE_INT val = INTVAL (operands[1]);
461 1.1 mrg operands[2] = GEN_INT (trunc_int_for_mode (val, HImode));
462 1.1 mrg operands[3] = GEN_INT ((val >> 16) & 65535);
463 1.1 mrg })
464 1.1 mrg
465 1.1 mrg (define_split
466 1.1 mrg [(set (match_operand:VEC4M 0 "register_operand" "")
467 1.1 mrg (match_operand:VEC4M 1 "const_vector_operand" ""))]
468 1.1 mrg "reload_completed"
469 1.1 mrg [(set (match_dup 2) (match_dup 3))]
470 1.1 mrg {
471 1.1 mrg unsigned HOST_WIDE_INT mask, val;
472 1.3 mrg machine_mode inner_mode = GET_MODE_INNER (<MODE>mode);
473 1.1 mrg int i;
474 1.1 mrg
475 1.1 mrg val = 0;
476 1.1 mrg mask = GET_MODE_MASK (inner_mode);
477 1.1 mrg if (TARGET_BIG_ENDIAN)
478 1.1 mrg {
479 1.1 mrg for (i = 0; i < GET_MODE_NUNITS (<MODE>mode); i++)
480 1.1 mrg {
481 1.1 mrg val <<= GET_MODE_BITSIZE (inner_mode);
482 1.1 mrg val |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
483 1.1 mrg }
484 1.1 mrg }
485 1.1 mrg else
486 1.1 mrg {
487 1.1 mrg i = GET_MODE_NUNITS (<MODE>mode);
488 1.1 mrg while (i-- > 0)
489 1.1 mrg {
490 1.1 mrg val <<= GET_MODE_BITSIZE (inner_mode);
491 1.1 mrg val |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
492 1.1 mrg }
493 1.1 mrg }
494 1.1 mrg operands[2] = gen_rtx_REG (SImode, REGNO (operands[0]));
495 1.1 mrg operands[3] = GEN_INT (trunc_int_for_mode (val, SImode));
496 1.1 mrg })
497 1.1 mrg
498 1.1 mrg (define_split
499 1.1 mrg [(set (match_operand:VEC8M 0 "register_operand" "")
500 1.1 mrg (match_operand:VEC8M 1 "const_vector_operand" ""))]
501 1.1 mrg "reload_completed"
502 1.1 mrg [(set (match_dup 2) (match_dup 3))
503 1.1 mrg (set (match_dup 4) (match_dup 5))]
504 1.1 mrg {
505 1.1 mrg unsigned HOST_WIDE_INT mask;
506 1.1 mrg unsigned HOST_WIDE_INT val[2];
507 1.1 mrg rtx lo_half, hi_half;
508 1.3 mrg machine_mode inner_mode = GET_MODE_INNER (<MODE>mode);
509 1.1 mrg int i, j;
510 1.1 mrg
511 1.1 mrg split_di (operands, 1, &lo_half, &hi_half);
512 1.1 mrg
513 1.1 mrg val[0] = val[1] = 0;
514 1.1 mrg mask = GET_MODE_MASK (inner_mode);
515 1.1 mrg if (TARGET_BIG_ENDIAN)
516 1.1 mrg {
517 1.1 mrg for (i = 0, j = 1; i < GET_MODE_NUNITS (<MODE>mode); i++)
518 1.1 mrg {
519 1.1 mrg if (i * 2 == GET_MODE_NUNITS (<MODE>mode))
520 1.1 mrg j--;
521 1.1 mrg val[j] <<= GET_MODE_BITSIZE (inner_mode);
522 1.1 mrg val[j] |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
523 1.1 mrg }
524 1.1 mrg }
525 1.1 mrg else
526 1.1 mrg {
527 1.1 mrg i = GET_MODE_NUNITS (<MODE>mode);
528 1.1 mrg j = 1;
529 1.1 mrg while (i-- > 0)
530 1.1 mrg {
531 1.1 mrg val[j] <<= GET_MODE_BITSIZE (inner_mode);
532 1.1 mrg val[j] |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
533 1.1 mrg if (i * 2 == GET_MODE_NUNITS (<MODE>mode))
534 1.1 mrg j--;
535 1.1 mrg }
536 1.1 mrg }
537 1.1 mrg operands[2] = lo_half;
538 1.1 mrg operands[3] = GEN_INT (trunc_int_for_mode (val[0], SImode));
539 1.1 mrg operands[4] = hi_half;
540 1.1 mrg operands[5] = GEN_INT (trunc_int_for_mode (val[1], SImode));
541 1.1 mrg })
542 1.1 mrg
543 1.1 mrg (define_split
544 1.1 mrg [(set (match_operand:SF 0 "register_operand" "")
545 1.1 mrg (match_operand:SF 1 "immediate_operand" ""))]
546 1.1 mrg "reload_completed"
547 1.1 mrg [(set (match_dup 2) (match_dup 3))
548 1.1 mrg (set (match_dup 2) (ior:SI (and:SI (match_dup 2) (const_int 65535))
549 1.1 mrg (ashift:SI (match_dup 4) (const_int 16))))]
550 1.1 mrg {
551 1.1 mrg long values;
552 1.1 mrg
553 1.1 mrg gcc_assert (GET_CODE (operands[1]) == CONST_DOUBLE);
554 1.1 mrg
555 1.4 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (operands[1]), values);
556 1.1 mrg
557 1.1 mrg operands[2] = gen_rtx_REG (SImode, true_regnum (operands[0]));
558 1.1 mrg operands[3] = GEN_INT (trunc_int_for_mode (values, HImode));
559 1.1 mrg if (values >= -32768 && values < 32768)
560 1.1 mrg {
561 1.1 mrg emit_move_insn (operands[2], operands[3]);
562 1.1 mrg DONE;
563 1.1 mrg }
564 1.1 mrg operands[4] = GEN_INT ((values >> 16) & 65535);
565 1.1 mrg })
566 1.1 mrg
567 1.1 mrg (define_split
568 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
569 1.1 mrg (match_operand:SI 1 "symbolic_operand" ""))]
570 1.1 mrg "reload_completed
571 1.1 mrg && (!TARGET_INSNS_64PLUS
572 1.1 mrg || !sdata_symbolic_operand (operands[1], SImode))"
573 1.1 mrg [(set (match_dup 0) (high:SI (match_dup 1)))
574 1.1 mrg (set (match_dup 0) (lo_sum:SI (match_dup 0) (match_dup 1)))]
575 1.1 mrg "")
576 1.1 mrg
577 1.1 mrg ;; Normally, we represent the load of an sdata address as a normal
578 1.1 mrg ;; move of a SYMBOL_REF. In DSBT mode, B14 is not constant, so we
579 1.1 mrg ;; should show the dependency.
580 1.1 mrg (define_insn "load_sdata_pic"
581 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b")
582 1.1 mrg (plus:SI (match_operand:SI 1 "pic_register_operand" "Z,Z")
583 1.1 mrg (unspec:SI [(match_operand:SI 2 "sdata_symbolic_operand" "S0,S0")]
584 1.1 mrg UNSPEC_LOAD_SDATA)))]
585 1.1 mrg "flag_pic"
586 1.1 mrg "@
587 1.1 mrg %|%.\\tadda%D2\\t%$\\t%1, %2, %0
588 1.1 mrg %|%.\\tadda%D2\\t%$\\t%1, %2, %0"
589 1.1 mrg [(set_attr "units" "d")
590 1.1 mrg (set_attr "cross" "y,n")
591 1.1 mrg (set_attr "op_pattern" "unknown")
592 1.1 mrg (set_attr "predicable" "no")])
593 1.1 mrg
594 1.1 mrg ;; Move instruction patterns
595 1.1 mrg
596 1.1 mrg (define_mode_attr LDST_SUFFIX [(QI "b") (HI "h")
597 1.1 mrg (SI "w") (SF "w") (V2HI "w") (V4QI "w")
598 1.1 mrg (DI "dw") (V2SI "dw") (V4HI "dw") (V8QI "dw")])
599 1.1 mrg
600 1.1 mrg (define_insn "mov<mode>_insn"
601 1.1 mrg [(set (match_operand:QIHIM 0 "nonimmediate_operand"
602 1.1 mrg "=a,b, a, b, ab, ab,a,?a, b,?b, Q, R, R, Q")
603 1.1 mrg (match_operand:QIHIM 1 "general_operand"
604 1.1 mrg "a,b,?b,?a,Is5,IsB,Q, R, R, Q, a,?a, b,?b"))]
605 1.1 mrg "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) == REG"
606 1.1 mrg "@
607 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
608 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
609 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
610 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
611 1.1 mrg %|%.\\tmvk\\t%$\\t%1, %0
612 1.1 mrg %|%.\\tmvk\\t%$\\t%1, %0
613 1.1 mrg %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
614 1.1 mrg %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
615 1.1 mrg %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
616 1.1 mrg %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
617 1.1 mrg %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
618 1.1 mrg %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
619 1.1 mrg %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
620 1.1 mrg %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0"
621 1.1 mrg [(set_attr "type" "*,*,*,*,*,*,load,load,load,load,store,store,store,store")
622 1.1 mrg (set_attr "units62" "dls,dls,ls,ls,s,s,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
623 1.1 mrg (set_attr "units64" "dls,dls,ls,ls,dl,s,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
624 1.1 mrg (set_attr "op_pattern" "sx,sx,sx,sx,*,*,*,*,*,*,*,*,*,*")
625 1.1 mrg (set_attr "addr_regfile" "*,*,*,*,*,*,a,b,b,a,a,b,b,a")
626 1.1 mrg (set_attr "dest_regfile" "*,*,*,*,*,*,a,a,b,b,a,a,b,b")
627 1.1 mrg (set_attr "cross" "n,n,y,y,n,n,n,y,n,y,n,y,n,y")])
628 1.1 mrg
629 1.1 mrg (define_insn "mov<mode>_insn"
630 1.1 mrg [(set (match_operand:SISFVM 0 "nonimmediate_operand"
631 1.1 mrg "=a,b, a, b, ab, ab,a,b,ab,a,?a, b,?b, Q, R, R, Q")
632 1.1 mrg (match_operand:SISFVM 1 "general_operand"
633 1.1 mrg "a,b,?b,?a,Is5,IsB,S0,S0,Si,Q, R, R, Q, a,?a, b,?b"))]
634 1.1 mrg "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) == REG
635 1.1 mrg || (GET_CODE (operands[1]) == SUBREG && REG_P (SUBREG_REG (operands[1]))))"
636 1.1 mrg "@
637 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
638 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
639 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
640 1.1 mrg %|%.\\tmv\\t%$\\t%1, %0
641 1.1 mrg %|%.\\tmvk\\t%$\\t%1, %0
642 1.1 mrg %|%.\\tmvk\\t%$\\t%1, %0
643 1.1 mrg %|%.\\tadda%D1\\t%$\\tB14, %1, %0
644 1.1 mrg %|%.\\tadda%D1\\t%$\\tB14, %1, %0
645 1.1 mrg #
646 1.1 mrg %|%.\\tldw\\t%$\\t%1, %0
647 1.1 mrg %|%.\\tldw\\t%$\\t%1, %0
648 1.1 mrg %|%.\\tldw\\t%$\\t%1, %0
649 1.1 mrg %|%.\\tldw\\t%$\\t%1, %0
650 1.1 mrg %|%.\\tstw\\t%$\\t%1, %0
651 1.1 mrg %|%.\\tstw\\t%$\\t%1, %0
652 1.1 mrg %|%.\\tstw\\t%$\\t%1, %0
653 1.1 mrg %|%.\\tstw\\t%$\\t%1, %0"
654 1.1 mrg [(set_attr "type" "*,*,*,*,*,*,*,*,*,load,load,load,load,store,store,store,store")
655 1.1 mrg (set_attr "units62" "dls,dls,ls,ls,s,s,d,d,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
656 1.1 mrg (set_attr "units64" "dls,dls,ls,ls,dl,s,d,d,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
657 1.1 mrg (set_attr "op_pattern" "sx,sx,sx,sx,*,*,*,*,*,*,*,*,*,*,*,*,*")
658 1.1 mrg (set_attr "addr_regfile" "*,*,*,*,*,*,*,*,*,a,b,b,a,a,b,b,a")
659 1.1 mrg (set_attr "dest_regfile" "*,*,*,*,*,*,*,*,*,a,a,b,b,a,a,b,b")
660 1.1 mrg (set_attr "cross" "n,n,y,y,n,n,y,n,*,n,y,n,y,n,y,n,y")
661 1.1 mrg (set_attr "predicable" "yes,yes,yes,yes,yes,yes,no,no,yes,yes,yes,yes,yes,yes,yes,yes,yes")])
662 1.1 mrg
663 1.1 mrg (define_insn "*mov<mode>_insn"
664 1.1 mrg [(set (match_operand:DIDFVM 0 "nonimmediate_operand"
665 1.1 mrg "=a,b, a, b,ab,a,?a, b,?b, Q, R, R, Q")
666 1.1 mrg (match_operand:DIDFVM 1 "general_operand"
667 1.1 mrg "a,b,?b,?a,iF,Q, R, R, Q, a,?a, b,?b"))]
668 1.1 mrg "(!MEM_P (operands[0]) || REG_P (operands[1])
669 1.1 mrg || (GET_CODE (operands[1]) == SUBREG && REG_P (SUBREG_REG (operands[1]))))"
670 1.1 mrg {
671 1.1 mrg if (MEM_P (operands[1]) && TARGET_LDDW)
672 1.1 mrg return "%|%.\\tlddw\\t%$\\t%1, %0";
673 1.1 mrg if (MEM_P (operands[0]) && TARGET_STDW)
674 1.1 mrg return "%|%.\\tstdw\\t%$\\t%1, %0";
675 1.1 mrg if (TARGET_INSNS_64PLUS && REG_P (operands[0]) && REG_P (operands[1])
676 1.1 mrg && A_REGNO_P (REGNO (operands[0])) == A_REGNO_P (REGNO (operands[1])))
677 1.1 mrg return "%|%.\\tdmv\\t%$\\t%P1, %p1, %0";
678 1.1 mrg return "#";
679 1.1 mrg }
680 1.1 mrg [(set_attr "units" "s,s,*,*,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
681 1.1 mrg (set_attr "addr_regfile" "*,*,*,*,*,a,b,b,a,a,b,b,a")
682 1.1 mrg (set_attr "dest_regfile" "*,*,*,*,*,a,a,b,b,a,a,b,b")
683 1.1 mrg (set_attr "type" "*,*,*,*,*,load,load,load,load,store,store,store,store")
684 1.1 mrg (set_attr "cross" "n,n,y,y,*,n,y,n,y,n,y,n,y")])
685 1.1 mrg
686 1.1 mrg (define_split
687 1.1 mrg [(set (match_operand:DIDFVM 0 "nonimmediate_operand" "")
688 1.1 mrg (match_operand:DIDFVM 1 "general_operand" ""))]
689 1.1 mrg "reload_completed
690 1.1 mrg && !((MEM_P (operands[0]) && TARGET_STDW)
691 1.1 mrg || (MEM_P (operands[1]) && TARGET_LDDW))
692 1.1 mrg && !const_vector_operand (operands[1], <MODE>mode)
693 1.1 mrg && !(TARGET_INSNS_64PLUS && REG_P (operands[0]) && REG_P (operands[1])
694 1.1 mrg && A_REGNO_P (REGNO (operands[0])) == A_REGNO_P (REGNO (operands[1])))"
695 1.1 mrg [(set (match_dup 2) (match_dup 3))
696 1.1 mrg (set (match_dup 4) (match_dup 5))]
697 1.1 mrg {
698 1.1 mrg rtx lo_half[2], hi_half[2];
699 1.1 mrg split_di (operands, 2, lo_half, hi_half);
700 1.1 mrg
701 1.1 mrg /* We can't have overlap for a register-register move, but if
702 1.1 mrg memory is involved, we have to make sure we don't clobber the
703 1.1 mrg address. */
704 1.1 mrg if (reg_overlap_mentioned_p (lo_half[0], hi_half[1]))
705 1.1 mrg {
706 1.1 mrg operands[2] = hi_half[0];
707 1.1 mrg operands[3] = hi_half[1];
708 1.1 mrg operands[4] = lo_half[0];
709 1.1 mrg operands[5] = lo_half[1];
710 1.1 mrg }
711 1.1 mrg else
712 1.1 mrg {
713 1.1 mrg operands[2] = lo_half[0];
714 1.1 mrg operands[3] = lo_half[1];
715 1.1 mrg operands[4] = hi_half[0];
716 1.1 mrg operands[5] = hi_half[1];
717 1.1 mrg }
718 1.1 mrg })
719 1.1 mrg
720 1.1 mrg (define_insn "real_load<mode>"
721 1.1 mrg [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
722 1.1 mrg (match_operand:M32 1 "memory_operand" "Q,R,R,Q")]
723 1.1 mrg UNSPEC_REAL_LOAD)]
724 1.1 mrg ""
725 1.1 mrg "%|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %k0"
726 1.1 mrg [(set_attr "type" "load")
727 1.1 mrg (set_attr "units" "d_addr")
728 1.1 mrg (set_attr "addr_regfile" "a,b,b,a")
729 1.1 mrg (set_attr "dest_regfile" "a,a,b,b")
730 1.1 mrg (set_attr "cross" "n,y,n,y")])
731 1.1 mrg
732 1.1 mrg (define_insn "real_load<mode>"
733 1.1 mrg [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
734 1.1 mrg (match_operand:DIDFVM 1 "memory_operand" "Q,R,R,Q")]
735 1.1 mrg UNSPEC_REAL_LOAD)]
736 1.1 mrg "TARGET_LDDW"
737 1.1 mrg "%|%.\\tlddw\\t%$\\t%1, %K0"
738 1.1 mrg [(set_attr "type" "load")
739 1.1 mrg (set_attr "units" "d_addr")
740 1.1 mrg (set_attr "addr_regfile" "a,b,b,a")
741 1.1 mrg (set_attr "dest_regfile" "a,a,b,b")
742 1.1 mrg (set_attr "cross" "n,y,n,y")])
743 1.1 mrg
744 1.1 mrg (define_insn "load_shadow"
745 1.1 mrg [(set (match_operand 0 "register_operand" "=ab")
746 1.1 mrg (unspec [(pc)] UNSPEC_LOAD_SHADOW))]
747 1.1 mrg ""
748 1.1 mrg ";; load to %0 occurs"
749 1.1 mrg [(set_attr "type" "load_shadow")])
750 1.1 mrg
751 1.1 mrg (define_insn "mult_shadow"
752 1.1 mrg [(set (match_operand 0 "register_operand" "=ab")
753 1.1 mrg (unspec [(pc)] UNSPEC_MULT_SHADOW))]
754 1.1 mrg ""
755 1.1 mrg ";; multiplication occurs and stores to %0"
756 1.1 mrg [(set_attr "type" "mult_shadow")])
757 1.1 mrg
758 1.1 mrg
759 1.1 mrg (define_mode_iterator MOV [QI HI SI SF DI DF V2HI V4QI V2SI V4HI V8QI])
760 1.1 mrg
761 1.1 mrg (define_expand "mov<mode>"
762 1.1 mrg [(set (match_operand:MOV 0 "nonimmediate_operand" "")
763 1.1 mrg (match_operand:MOV 1 "general_operand" ""))]
764 1.1 mrg ""
765 1.1 mrg {
766 1.1 mrg if (expand_move (operands, <MODE>mode))
767 1.1 mrg DONE;
768 1.1 mrg })
769 1.1 mrg
770 1.1 mrg (define_expand "movmisalign<mode>"
771 1.1 mrg [(set (match_operand:SIDIVM 0 "nonimmediate_operand" "")
772 1.1 mrg (unspec:SIDIVM [(match_operand:SIDIVM 1 "nonimmediate_operand" "")]
773 1.1 mrg UNSPEC_MISALIGNED_ACCESS))]
774 1.1 mrg "TARGET_INSNS_64"
775 1.1 mrg {
776 1.3 mrg if (MEM_P (operands[0]))
777 1.1 mrg {
778 1.1 mrg emit_insn (gen_movmisalign<mode>_store (operands[0], operands[1]));
779 1.1 mrg DONE;
780 1.1 mrg }
781 1.1 mrg })
782 1.1 mrg
783 1.1 mrg (define_insn_and_split "movmisalign<mode>_store"
784 1.1 mrg [(set (match_operand:SIDIVM 0 "memory_operand" "=W,Q,T,Q,T")
785 1.1 mrg (unspec:SIDIVM [(match_operand:SIDIVM 1 "register_operand" "r,a,b,b,a")]
786 1.1 mrg UNSPEC_MISALIGNED_ACCESS))
787 1.1 mrg (clobber (match_scratch:SI 2 "=r,X,X,X,X"))]
788 1.1 mrg "TARGET_INSNS_64"
789 1.1 mrg "@
790 1.1 mrg #
791 1.1 mrg %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
792 1.1 mrg %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
793 1.1 mrg %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
794 1.1 mrg %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0"
795 1.1 mrg "&& reload_completed && satisfies_constraint_W (operands[0])"
796 1.1 mrg [(parallel
797 1.1 mrg [(set (match_dup 3) (unspec:SIDIVM [(match_dup 1)] UNSPEC_MISALIGNED_ACCESS))
798 1.1 mrg (clobber (match_dup 4))])]
799 1.1 mrg {
800 1.1 mrg rtx addr = XEXP (operands[0], 0);
801 1.1 mrg rtx tmpreg = operands[2];
802 1.1 mrg
803 1.1 mrg if (GET_CODE (addr) == PLUS && XEXP (addr, 0) == stack_pointer_rtx
804 1.1 mrg && GET_CODE (XEXP (addr, 1)) == CONST_INT)
805 1.1 mrg {
806 1.1 mrg unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
807 1.1 mrg val &= GET_MODE_SIZE (<MODE>mode) - 1;
808 1.1 mrg if (val == 0)
809 1.1 mrg {
810 1.1 mrg emit_move_insn (operands[0], operands[1]);
811 1.1 mrg DONE;
812 1.1 mrg }
813 1.1 mrg }
814 1.1 mrg operands[3] = change_address (operands[0], <MODE>mode, tmpreg);
815 1.1 mrg emit_move_insn (tmpreg, addr);
816 1.1 mrg operands[4] = gen_rtx_SCRATCH (SImode);
817 1.1 mrg }
818 1.1 mrg [(set_attr "type" "storen")
819 1.1 mrg (set_attr "units" "d_addr")
820 1.1 mrg (set_attr "addr_regfile" "*,a,b,a,b")
821 1.1 mrg (set_attr "dest_regfile" "*,a,b,b,a")
822 1.1 mrg (set_attr "cross" "*,n,n,y,y")])
823 1.1 mrg
824 1.1 mrg (define_insn_and_split "movmisalign<mode>_load"
825 1.1 mrg [(set (match_operand:SIDIVM 0 "register_operand" "=ab,a,b,b,a")
826 1.1 mrg (unspec:SIDIVM [(match_operand:SIDIVM 1 "memory_operand" "W,Q,T,Q,T")]
827 1.1 mrg UNSPEC_MISALIGNED_ACCESS))]
828 1.1 mrg "TARGET_INSNS_64"
829 1.1 mrg "@
830 1.1 mrg #
831 1.1 mrg %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
832 1.1 mrg %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
833 1.1 mrg %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
834 1.1 mrg %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0"
835 1.1 mrg "&& reload_completed && satisfies_constraint_W (operands[1])"
836 1.1 mrg [(set (match_dup 0) (unspec:SIDIVM [(match_dup 2)] UNSPEC_MISALIGNED_ACCESS))]
837 1.1 mrg {
838 1.1 mrg rtx addr = XEXP (operands[1], 0);
839 1.1 mrg rtx tmpreg = (GET_MODE (operands[0]) == SImode ? operands[0]
840 1.1 mrg : operand_subword_force (operands[0], 0, DImode));
841 1.1 mrg
842 1.1 mrg if (GET_CODE (addr) == PLUS && XEXP (addr, 0) == stack_pointer_rtx
843 1.1 mrg && GET_CODE (XEXP (addr, 1)) == CONST_INT)
844 1.1 mrg {
845 1.1 mrg unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
846 1.1 mrg val &= GET_MODE_SIZE (<MODE>mode) - 1;
847 1.1 mrg if (val == 0)
848 1.1 mrg {
849 1.1 mrg emit_move_insn (operands[0], operands[1]);
850 1.1 mrg DONE;
851 1.1 mrg }
852 1.1 mrg }
853 1.1 mrg operands[2] = change_address (operands[1], <MODE>mode, tmpreg);
854 1.1 mrg emit_move_insn (tmpreg, addr);
855 1.1 mrg }
856 1.1 mrg [(set_attr "type" "loadn")
857 1.1 mrg (set_attr "units" "d_addr")
858 1.1 mrg (set_attr "addr_regfile" "*,a,b,a,b")
859 1.1 mrg (set_attr "dest_regfile" "*,a,b,b,a")
860 1.1 mrg (set_attr "cross" "*,n,n,y,y")])
861 1.1 mrg
862 1.1 mrg ;;
863 1.1 mrg
864 1.1 mrg ;; -------------------------------------------------------------------------
865 1.1 mrg ;; Extensions/extractions
866 1.1 mrg ;; -------------------------------------------------------------------------
867 1.1 mrg
868 1.1 mrg (define_code_iterator any_extract [zero_extract sign_extract])
869 1.1 mrg (define_code_iterator any_ext [zero_extend sign_extend])
870 1.1 mrg
871 1.1 mrg (define_code_attr ext_name [(zero_extend "zero_extend") (sign_extend "sign_extend")])
872 1.1 mrg
873 1.1 mrg (define_code_attr u [(zero_extend "u") (sign_extend "")])
874 1.1 mrg
875 1.1 mrg (define_code_attr z [(zero_extract "z") (sign_extract "")])
876 1.1 mrg (define_code_attr zu [(zero_extract "u") (sign_extract "")])
877 1.1 mrg
878 1.1 mrg (define_mode_attr ext_shift [(QI "24") (HI "16")])
879 1.1 mrg
880 1.1 mrg (define_insn "<ext_name><mode>si2"
881 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,?a, b,?b")
882 1.1 mrg (any_ext:SI (match_operand:QIHIM 1 "nonimmediate_operand" "a,b,Q, R, R, Q")))]
883 1.1 mrg ""
884 1.1 mrg "@
885 1.1 mrg %|%.\\text<u>\\t%$\\t%1, <ext_shift>, <ext_shift>, %0
886 1.1 mrg %|%.\\text<u>\\t%$\\t%1, <ext_shift>, <ext_shift>, %0
887 1.1 mrg %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
888 1.1 mrg %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
889 1.1 mrg %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
890 1.1 mrg %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0"
891 1.1 mrg [(set_attr "type" "*,*,load,load,load,load")
892 1.1 mrg (set_attr "units" "s,s,d_addr,d_addr,d_addr,d_addr")
893 1.1 mrg (set_attr "addr_regfile" "*,*,a,b,b,a")
894 1.1 mrg (set_attr "dest_regfile" "*,*,a,a,b,b")
895 1.1 mrg (set_attr "cross" "n,n,n,y,n,y")])
896 1.1 mrg
897 1.1 mrg (define_insn "*ext<z>v_const"
898 1.1 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "=a,b")
899 1.1 mrg (any_extract:SI (match_operand:SI 1 "register_operand" "a,b")
900 1.1 mrg (match_operand:SI 2 "const_int_operand" "n,n")
901 1.1 mrg (match_operand:SI 3 "const_int_operand" "n,n")))]
902 1.1 mrg "INTVAL (operands[3]) >= 0
903 1.1 mrg && INTVAL (operands[2]) + INTVAL (operands[3]) <= 32"
904 1.1 mrg {
905 1.1 mrg int pos = INTVAL (operands[3]);
906 1.1 mrg int len = INTVAL (operands[2]);
907 1.1 mrg rtx xop[4];
908 1.1 mrg xop[0] = operands[0];
909 1.1 mrg xop[1] = operands[1];
910 1.1 mrg xop[2] = GEN_INT (32 - pos - len);
911 1.1 mrg xop[3] = GEN_INT (32 - len);
912 1.1 mrg
913 1.1 mrg output_asm_insn ("%|%.\\text<zu>\\t%$\\t%1, %2, %3, %0", xop);
914 1.1 mrg return "";
915 1.1 mrg }
916 1.1 mrg [(set_attr "units" "s")
917 1.1 mrg (set_attr "cross" "n")])
918 1.1 mrg
919 1.1 mrg (define_expand "ext<z>v"
920 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
921 1.1 mrg (any_extract:SI (match_operand:SI 1 "register_operand" "")
922 1.1 mrg (match_operand:SI 2 "const_int_operand" "")
923 1.1 mrg (match_operand:SI 3 "const_int_operand" "")))]
924 1.1 mrg ""
925 1.1 mrg {
926 1.1 mrg if (INTVAL (operands[2]) < 0
927 1.1 mrg || INTVAL (operands[2]) + INTVAL (operands[3]) > 32)
928 1.1 mrg FAIL;
929 1.1 mrg })
930 1.1 mrg
931 1.1 mrg (define_insn "real_<ext_name><mode>"
932 1.1 mrg [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
933 1.1 mrg (any_ext:SI (match_operand:QIHIM 1 "memory_operand" "Q,R,R,Q"))]
934 1.1 mrg UNSPEC_REAL_LOAD)]
935 1.1 mrg ""
936 1.1 mrg "%|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %k0"
937 1.1 mrg [(set_attr "type" "load")
938 1.1 mrg (set_attr "units" "d_addr")
939 1.1 mrg (set_attr "addr_regfile" "a,b,b,a")
940 1.1 mrg (set_attr "dest_regfile" "a,a,b,b")
941 1.1 mrg (set_attr "cross" "n,y,n,y")])
942 1.1 mrg
943 1.1 mrg (define_insn "clrr"
944 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
945 1.1 mrg (unspec:SI [(match_operand:SI 1 "register_operand" "0,0,0,0")
946 1.1 mrg (match_operand:SI 2 "register_operand" "a,b,?b,?a")
947 1.1 mrg (match_operand:SI 3 "reg_or_const_int_operand" "ai,bi,a,b")]
948 1.1 mrg UNSPEC_CLR))]
949 1.1 mrg ""
950 1.1 mrg {
951 1.1 mrg if (CONST_INT_P (operands[2]))
952 1.1 mrg {
953 1.1 mrg rtx xops[4];
954 1.1 mrg int v1 = INTVAL (operands[2]);
955 1.1 mrg int v2 = (v1 >> 5) & 0x1f;
956 1.1 mrg v1 &= 0x1f;
957 1.1 mrg xops[0] = operands[0];
958 1.1 mrg xops[1] = operands[1];
959 1.1 mrg xops[2] = GEN_INT (v1);
960 1.1 mrg xops[3] = GEN_INT (v2);
961 1.1 mrg output_asm_insn ("%|%.\\tclr\\t%$\\t%1, %3, %2, %0", xops);
962 1.1 mrg return "";
963 1.1 mrg }
964 1.1 mrg return "%|%.\\tclr\\t%$\\t%2, %3, %0";
965 1.1 mrg }
966 1.1 mrg [(set_attr "units" "s")
967 1.1 mrg (set_attr "cross" "n,n,y,y")])
968 1.1 mrg
969 1.1 mrg (define_insn "extr"
970 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
971 1.1 mrg (unspec:SI [(match_operand:SI 1 "register_operand" "a,b,?b,?a")
972 1.1 mrg (match_operand:SI 2 "reg_or_const_int_operand" "ai,bi,a,b")]
973 1.1 mrg UNSPEC_EXT))]
974 1.1 mrg ""
975 1.1 mrg {
976 1.1 mrg if (CONST_INT_P (operands[2]))
977 1.1 mrg {
978 1.1 mrg rtx xops[4];
979 1.1 mrg int v1 = INTVAL (operands[2]);
980 1.1 mrg int v2 = (v1 >> 5) & 0x1f;
981 1.1 mrg v1 &= 0x1f;
982 1.1 mrg xops[0] = operands[0];
983 1.1 mrg xops[1] = operands[1];
984 1.1 mrg xops[2] = GEN_INT (v1);
985 1.1 mrg xops[3] = GEN_INT (v2);
986 1.1 mrg output_asm_insn ("%|%.\\text\\t%$\\t%1, %3, %2, %0", xops);
987 1.1 mrg return "";
988 1.1 mrg }
989 1.1 mrg return "%|%.\\text\\t%$\\t%1, %2, %0";
990 1.1 mrg }
991 1.1 mrg [(set_attr "units" "s")
992 1.1 mrg (set_attr "cross" "n,n,y,y")])
993 1.1 mrg
994 1.1 mrg (define_insn "extru"
995 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
996 1.1 mrg (unspec:SI [(match_operand:SI 1 "register_operand" "a,b,?b,?a")
997 1.1 mrg (match_operand:SI 2 "reg_or_const_int_operand" "ai,bi,a,b")]
998 1.1 mrg UNSPEC_EXTU))]
999 1.1 mrg ""
1000 1.1 mrg {
1001 1.1 mrg if (CONST_INT_P (operands[2]))
1002 1.1 mrg {
1003 1.1 mrg rtx xops[4];
1004 1.1 mrg int v1 = INTVAL (operands[2]);
1005 1.1 mrg int v2 = (v1 >> 5) & 0x1f;
1006 1.1 mrg v1 &= 0x1f;
1007 1.1 mrg xops[0] = operands[0];
1008 1.1 mrg xops[1] = operands[1];
1009 1.1 mrg xops[2] = GEN_INT (v1);
1010 1.1 mrg xops[3] = GEN_INT (v2);
1011 1.1 mrg output_asm_insn ("%|%.\\textu\\t%$\\t%1, %3, %2, %0", xops);
1012 1.1 mrg return "";
1013 1.1 mrg }
1014 1.1 mrg return "%|%.\\textu\\t%$\\t%1, %2, %0";
1015 1.1 mrg }
1016 1.1 mrg [(set_attr "units" "s")
1017 1.1 mrg (set_attr "cross" "n,y,n,y")])
1018 1.1 mrg
1019 1.1 mrg ;; -------------------------------------------------------------------------
1020 1.1 mrg ;; Compare instructions
1021 1.1 mrg ;; -------------------------------------------------------------------------
1022 1.1 mrg
1023 1.1 mrg (define_insn "scmpsi_insn"
1024 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
1025 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1026 1.1 mrg [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
1027 1.1 mrg (match_operand:SI 3 "reg_or_scst5_operand" "Is5,aIs5,bIs5,aIs5,bIs5")]))]
1028 1.1 mrg ""
1029 1.1 mrg "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
1030 1.1 mrg [(set_attr "units" "l")
1031 1.1 mrg (set (attr "cross")
1032 1.1 mrg (symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
1033 1.1 mrg
1034 1.1 mrg (define_insn "*ucmpsi_insn_64"
1035 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
1036 1.1 mrg (match_operator:SI 1 "ltugtu_operator"
1037 1.1 mrg [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
1038 1.1 mrg (match_operand:SI 3 "reg_or_ucst5_operand" "Iu5,aIu5,bIu5,aIu5,bIu5")]))]
1039 1.1 mrg "TARGET_INSNS_64"
1040 1.1 mrg "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
1041 1.1 mrg [(set_attr "units" "l")
1042 1.1 mrg (set (attr "cross")
1043 1.1 mrg (symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
1044 1.1 mrg
1045 1.1 mrg (define_insn "*ucmpsi_insn"
1046 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
1047 1.1 mrg (match_operator:SI 1 "ltugtu_operator"
1048 1.1 mrg [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
1049 1.1 mrg (match_operand:SI 3 "reg_or_ucst4_operand" "Iu4,aIu4,bIu4,aIu4,bIu4")]))]
1050 1.1 mrg "!TARGET_INSNS_64"
1051 1.1 mrg "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
1052 1.1 mrg [(set_attr "units" "l")
1053 1.1 mrg (set (attr "cross")
1054 1.1 mrg (symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
1055 1.1 mrg
1056 1.1 mrg (define_code_iterator andior_eqne [eq ne])
1057 1.1 mrg (define_code_attr andior_name [(eq "and") (ne "ior")])
1058 1.1 mrg (define_code_attr andior_condmod [(eq "") (ne "!")])
1059 1.1 mrg
1060 1.1 mrg (define_insn "*scmpsi_<andior_name>_insn"
1061 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
1062 1.1 mrg (if_then_else:SI
1063 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1064 1.1 mrg (const_int 0))
1065 1.1 mrg (match_dup 4)
1066 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1067 1.1 mrg [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
1068 1.1 mrg (match_operand:SI 3 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5")])))]
1069 1.1 mrg ""
1070 1.1 mrg "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
1071 1.1 mrg [(set_attr "units" "l")
1072 1.1 mrg (set_attr "cross" "n,n,y,y")
1073 1.1 mrg (set_attr "predicable" "no")])
1074 1.1 mrg
1075 1.1 mrg (define_insn "*ucmpsi_<andior_name>_insn_64"
1076 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
1077 1.1 mrg (if_then_else:SI
1078 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1079 1.1 mrg (const_int 0))
1080 1.1 mrg (match_dup 4)
1081 1.1 mrg (match_operator:SI 1 "ltugtu_operator"
1082 1.1 mrg [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
1083 1.1 mrg (match_operand:SI 3 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")])))]
1084 1.1 mrg "TARGET_INSNS_64"
1085 1.1 mrg "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
1086 1.1 mrg [(set_attr "units" "l")
1087 1.1 mrg (set_attr "cross" "n,n,y,y")
1088 1.1 mrg (set_attr "predicable" "no")])
1089 1.1 mrg
1090 1.1 mrg (define_insn "*ucmpsi_<andior_name>_insn"
1091 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
1092 1.1 mrg (if_then_else:SI
1093 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1094 1.1 mrg (const_int 0))
1095 1.1 mrg (match_dup 4)
1096 1.1 mrg (match_operator:SI 1 "ltugtu_operator"
1097 1.1 mrg [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
1098 1.1 mrg (match_operand:SI 3 "reg_or_ucst4_operand" "aIu4,bIu4,aIu4,bIu4")])))]
1099 1.1 mrg "!TARGET_INSNS_64"
1100 1.1 mrg "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
1101 1.1 mrg [(set_attr "units" "l")
1102 1.1 mrg (set_attr "cross" "n,n,y,y")
1103 1.1 mrg (set_attr "predicable" "no")])
1104 1.1 mrg
1105 1.1 mrg (define_expand "cmpsi_<andior_name>"
1106 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
1107 1.1 mrg (if_then_else:SI
1108 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1109 1.1 mrg (const_int 0))
1110 1.1 mrg (match_dup 4)
1111 1.1 mrg (match_operator:SI 1 "c6x_comparison_operator"
1112 1.1 mrg [(match_operand:SI 2 "register_operand" "")
1113 1.1 mrg (match_operand:SI 3 "reg_or_const_int_operand" "")])))]
1114 1.1 mrg ""
1115 1.1 mrg {
1116 1.1 mrg if (c6x_force_op_for_comparison_p (GET_CODE (operands[1]), operands[3]))
1117 1.1 mrg operands[3] = force_reg (SImode, operands[3]);
1118 1.1 mrg })
1119 1.1 mrg
1120 1.1 mrg (define_insn "*cmpsf_insn"
1121 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1122 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1123 1.1 mrg [(match_operand:SF 2 "register_operand" "a,b,a,b")
1124 1.1 mrg (match_operand:SF 3 "register_operand" "a,b,?b,?a")]))]
1125 1.1 mrg "TARGET_FP"
1126 1.1 mrg "%|%.\\tcmp%c1sp\\t%$\\t%2, %3, %0"
1127 1.1 mrg [(set_attr "units" "s")
1128 1.1 mrg (set_attr "cross" "n,n,y,y")])
1129 1.1 mrg
1130 1.1 mrg (define_insn "*cmpdf_insn"
1131 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1132 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1133 1.1 mrg [(match_operand:DF 2 "register_operand" "a,b,a,b")
1134 1.1 mrg (match_operand:DF 3 "register_operand" "a,b,?b,?a")]))]
1135 1.1 mrg "TARGET_FP"
1136 1.1 mrg "%|%.\\tcmp%c1dp\\t%$\\t%2, %3, %0"
1137 1.1 mrg [(set_attr "type" "cmpdp")
1138 1.1 mrg (set_attr "units" "s")
1139 1.1 mrg (set_attr "cross" "n,n,y,y")])
1140 1.1 mrg
1141 1.1 mrg (define_expand "cmp<mode>_<andior_name>"
1142 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
1143 1.1 mrg (if_then_else:SI
1144 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1145 1.1 mrg (const_int 0))
1146 1.1 mrg (match_dup 4)
1147 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1148 1.1 mrg [(match_operand:SFDFM 2 "register_operand" "")
1149 1.1 mrg (match_operand:SFDFM 3 "register_operand" "")])))]
1150 1.1 mrg "TARGET_FP")
1151 1.1 mrg
1152 1.1 mrg (define_insn "*cmpsf_<andior_name>_insn"
1153 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
1154 1.1 mrg (if_then_else:SI
1155 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1156 1.1 mrg (const_int 0))
1157 1.1 mrg (match_dup 4)
1158 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1159 1.1 mrg [(match_operand:SF 2 "register_operand" "a,b,a,b")
1160 1.1 mrg (match_operand:SF 3 "register_operand" "a,b,?b,?a")])))]
1161 1.1 mrg "TARGET_FP"
1162 1.1 mrg "%|[<andior_condmod>%4]\\tcmp%c1sp\\t%$\\t%2, %3, %0"
1163 1.1 mrg [(set_attr "units" "s")
1164 1.1 mrg (set_attr "cross" "n,n,y,y")
1165 1.1 mrg (set_attr "predicable" "no")])
1166 1.1 mrg
1167 1.1 mrg ;; reload_reg_class_lower will ensure that two-word reloads are allocated first,
1168 1.1 mrg ;; which could exhaust the predicate registers if we used just "a" and "b"
1169 1.1 mrg ;; constraints on operands 2 and 3.
1170 1.1 mrg (define_insn "*cmpdf_<andior_name>_insn"
1171 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
1172 1.1 mrg (if_then_else:SI
1173 1.1 mrg (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
1174 1.1 mrg (const_int 0))
1175 1.1 mrg (match_dup 4)
1176 1.1 mrg (match_operator:SI 1 "eqltgt_operator"
1177 1.1 mrg [(match_operand:DF 2 "register_operand" "Da,Db,Da,Db")
1178 1.1 mrg (match_operand:DF 3 "register_operand" "Da,Db,?Db,?Da")])))]
1179 1.1 mrg "TARGET_FP"
1180 1.1 mrg "%|[<andior_condmod>%4]\\tcmp%c1dp\\t%$\\t%2, %3, %0"
1181 1.1 mrg [(set_attr "type" "cmpdp")
1182 1.1 mrg (set_attr "units" "s")
1183 1.1 mrg (set_attr "cross" "n,n,y,y")
1184 1.1 mrg (set_attr "predicable" "no")])
1185 1.1 mrg
1186 1.1 mrg (define_split
1187 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
1188 1.1 mrg (ior:SI (match_operand 1 "c6x_any_comparison_operand" "")
1189 1.1 mrg (match_operand 2 "c6x_any_comparison_operand" "")))]
1190 1.1 mrg "!reg_overlap_mentioned_p (operands[0], operands[2])"
1191 1.1 mrg [(set (match_dup 0) (match_dup 1))
1192 1.1 mrg (set (match_dup 0)
1193 1.1 mrg (if_then_else:SI (ne:SI (match_dup 0) (const_int 0))
1194 1.1 mrg (match_dup 0)
1195 1.1 mrg (match_dup 2)))])
1196 1.1 mrg
1197 1.1 mrg (define_split
1198 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
1199 1.1 mrg (and:SI (match_operand 1 "c6x_any_comparison_operand" "")
1200 1.1 mrg (match_operand 2 "c6x_any_comparison_operand" "")))]
1201 1.1 mrg "!reg_overlap_mentioned_p (operands[0], operands[2])"
1202 1.1 mrg [(set (match_dup 0) (match_dup 1))
1203 1.1 mrg (set (match_dup 0)
1204 1.1 mrg (if_then_else:SI (eq:SI (match_dup 0) (const_int 0))
1205 1.1 mrg (match_dup 0)
1206 1.1 mrg (match_dup 2)))])
1207 1.1 mrg
1208 1.1 mrg
1209 1.1 mrg ;; -------------------------------------------------------------------------
1210 1.1 mrg ;; setcc instructions
1211 1.1 mrg ;; -------------------------------------------------------------------------
1212 1.1 mrg
1213 1.1 mrg (define_expand "cstoresi4"
1214 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
1215 1.1 mrg (match_operator:SI 1 "comparison_operator"
1216 1.1 mrg [(match_operand:SI 2 "register_operand" "")
1217 1.1 mrg (match_operand:SI 3 "reg_or_ucst4_operand" "")]))]
1218 1.1 mrg ""
1219 1.1 mrg {
1220 1.1 mrg if (!c6x_comparison_operator (operands[1], SImode))
1221 1.1 mrg {
1222 1.1 mrg rtx tmpreg = gen_reg_rtx (SImode);
1223 1.1 mrg rtx t = gen_rtx_fmt_ee (reverse_condition (GET_CODE (operands[1])),
1224 1.1 mrg SImode, operands[2], operands[3]);
1225 1.4 mrg emit_insn (gen_rtx_SET (tmpreg, t));
1226 1.1 mrg emit_insn (gen_scmpsi_insn (operands[0],
1227 1.1 mrg gen_rtx_fmt_ee (EQ, SImode, tmpreg, const0_rtx),
1228 1.1 mrg tmpreg, const0_rtx));
1229 1.1 mrg DONE;
1230 1.1 mrg }
1231 1.1 mrg })
1232 1.1 mrg
1233 1.1 mrg ;; -------------------------------------------------------------------------
1234 1.1 mrg ;; Jump instructions
1235 1.1 mrg ;; -------------------------------------------------------------------------
1236 1.1 mrg
1237 1.1 mrg (define_insn "indirect_jump"
1238 1.1 mrg [(set (pc) (match_operand:SI 0 "register_operand" "a,b"))]
1239 1.1 mrg ""
1240 1.1 mrg "%|%.\\tb\\t%$\\t%0"
1241 1.1 mrg [(set_attr "type" "branch")
1242 1.1 mrg (set_attr "units" "s")
1243 1.1 mrg (set_attr "cross" "y,n")
1244 1.1 mrg (set_attr "dest_regfile" "b")])
1245 1.1 mrg
1246 1.1 mrg (define_insn "jump"
1247 1.1 mrg [(set (pc)
1248 1.1 mrg (label_ref (match_operand 0 "" "")))]
1249 1.1 mrg ""
1250 1.1 mrg "%|%.\\tb\\t%$\\t%l0"
1251 1.1 mrg [(set_attr "type" "branch")
1252 1.1 mrg (set_attr "units" "s")
1253 1.1 mrg (set_attr "dest_regfile" "any")])
1254 1.1 mrg
1255 1.1 mrg (define_expand "tablejump"
1256 1.1 mrg [(parallel [(set (pc) (match_operand:SI 0 "register_operand" ""))
1257 1.1 mrg (use (label_ref (match_operand 1 "" "")))])]
1258 1.1 mrg "!flag_pic || !TARGET_INSNS_64"
1259 1.1 mrg {
1260 1.1 mrg })
1261 1.1 mrg
1262 1.1 mrg (define_insn "*tablejump_internal"
1263 1.1 mrg [(set (pc) (match_operand:SI 0 "register_operand" "b"))
1264 1.1 mrg (use (label_ref (match_operand 1 "" "")))]
1265 1.1 mrg "!flag_pic || !TARGET_INSNS_64"
1266 1.1 mrg "%|\\tb\\t%$\\t%0"
1267 1.1 mrg [(set_attr "type" "branch")
1268 1.1 mrg (set_attr "predicable" "no")
1269 1.1 mrg (set_attr "units" "s")
1270 1.1 mrg (set_attr "dest_regfile" "b")])
1271 1.1 mrg
1272 1.1 mrg ;; Implement switch statements when generating PIC code. Switches are
1273 1.1 mrg ;; implemented by `tablejump' when not using -fpic.
1274 1.1 mrg
1275 1.1 mrg ;; Emit code here to do the range checking and make the index zero based.
1276 1.1 mrg ;; operand 0 is the index
1277 1.1 mrg ;; operand 1 is the lower bound
1278 1.1 mrg ;; operand 2 is the range of indices (highest - lowest + 1)
1279 1.1 mrg ;; operand 3 is the label that precedes the table itself
1280 1.1 mrg ;; operand 4 is the fall through label
1281 1.1 mrg
1282 1.1 mrg (define_expand "casesi"
1283 1.1 mrg [(use (match_operand:SI 0 "register_operand" ""))
1284 1.1 mrg (use (match_operand:SI 1 "const_int_operand" ""))
1285 1.1 mrg (use (match_operand:SI 2 "const_int_operand" ""))
1286 1.1 mrg (use (match_operand 3 "" ""))
1287 1.1 mrg (use (match_operand 4 "" ""))]
1288 1.1 mrg "flag_pic && TARGET_INSNS_64"
1289 1.1 mrg {
1290 1.1 mrg rtx indx;
1291 1.1 mrg rtx low = operands[1];
1292 1.1 mrg rtx range = operands[2];
1293 1.1 mrg rtx table = operands[3];
1294 1.1 mrg rtx fail = operands[4];
1295 1.1 mrg
1296 1.1 mrg gcc_assert (GET_CODE (operands[1]) == CONST_INT);
1297 1.1 mrg gcc_assert (GET_CODE (operands[2]) == CONST_INT);
1298 1.1 mrg
1299 1.1 mrg if (!reg_or_ucst4_operand (range, SImode))
1300 1.1 mrg range = force_reg (SImode, range);
1301 1.1 mrg
1302 1.1 mrg /* If low bound is 0, we don't have to subtract it. */
1303 1.1 mrg if (INTVAL (operands[1]) == 0)
1304 1.1 mrg indx = operands[0];
1305 1.1 mrg else
1306 1.1 mrg {
1307 1.1 mrg rtx offset = GEN_INT (-INTVAL (low));
1308 1.1 mrg indx = gen_reg_rtx (SImode);
1309 1.1 mrg if (!addsi_operand (offset, SImode))
1310 1.1 mrg offset = force_reg (SImode, offset);
1311 1.1 mrg emit_insn (gen_addsi3 (indx, operands[0], offset));
1312 1.1 mrg }
1313 1.1 mrg emit_cmp_and_jump_insns (indx, range, GTU, NULL_RTX, SImode, 1, fail);
1314 1.1 mrg
1315 1.1 mrg emit_jump_insn (gen_casesi_internal (indx, table));
1316 1.1 mrg DONE;
1317 1.1 mrg })
1318 1.1 mrg
1319 1.1 mrg ;; This is the only instance in this file where a pattern emits more than
1320 1.1 mrg ;; one instruction. The concern here is that the addkpc insn could otherwise
1321 1.1 mrg ;; be scheduled too far away from the label. A tablejump always ends an
1322 1.1 mrg ;; extended basic block, so it shouldn't happen that the scheduler places
1323 1.1 mrg ;; something in the delay slots.
1324 1.1 mrg (define_insn "casesi_internal"
1325 1.1 mrg [(set (pc)
1326 1.1 mrg (mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "b")
1327 1.1 mrg (const_int 4))
1328 1.1 mrg (label_ref (match_operand 1 "" "")))))
1329 1.1 mrg (clobber (match_scratch:SI 2 "=&b"))
1330 1.1 mrg (clobber (match_scratch:SI 3 "=b"))]
1331 1.1 mrg "flag_pic && TARGET_INSNS_64"
1332 1.1 mrg "addkpc\t.s2\t%l1,%2, 0\n\t\tldw\t.d2t2\t*+%2[%0], %3\n\t\tnop\t\t4\n\t\tadd\t.l2\t%2, %3, %3\n\t\tb\t.s2\t%3"
1333 1.1 mrg [(set_attr "type" "branch")
1334 1.1 mrg (set_attr "predicable" "no")
1335 1.1 mrg (set_attr "dest_regfile" "b")])
1336 1.1 mrg
1337 1.1 mrg (define_expand "cbranch<mode>4"
1338 1.1 mrg [(set (pc)
1339 1.1 mrg (if_then_else (match_operator 0 "comparison_operator"
1340 1.1 mrg [(match_operand:SIDIM 1 "register_operand" "")
1341 1.1 mrg (match_operand:SIDIM 2 "reg_or_const_int_operand" "")])
1342 1.1 mrg (label_ref (match_operand 3 "" ""))
1343 1.1 mrg (pc)))]
1344 1.1 mrg ""
1345 1.1 mrg {
1346 1.1 mrg rtx t = c6x_expand_compare (operands[0], VOIDmode);
1347 1.1 mrg operands[0] = t;
1348 1.1 mrg operands[1] = XEXP (t, 0);
1349 1.1 mrg operands[2] = XEXP (t, 1);
1350 1.1 mrg })
1351 1.1 mrg
1352 1.1 mrg (define_expand "cbranch<mode>4"
1353 1.1 mrg [(set (pc)
1354 1.1 mrg (if_then_else (match_operator 0 "c6x_fp_comparison_operator"
1355 1.1 mrg [(match_operand:SFDFM 1 "register_operand" "")
1356 1.1 mrg (match_operand:SFDFM 2 "register_operand" "")])
1357 1.1 mrg (label_ref (match_operand 3 "" ""))
1358 1.1 mrg (pc)))]
1359 1.1 mrg ""
1360 1.1 mrg {
1361 1.1 mrg rtx t = c6x_expand_compare (operands[0], VOIDmode);
1362 1.1 mrg operands[0] = t;
1363 1.1 mrg operands[1] = XEXP (t, 0);
1364 1.1 mrg operands[2] = XEXP (t, 1);
1365 1.1 mrg })
1366 1.1 mrg
1367 1.1 mrg (define_insn "br_true"
1368 1.1 mrg [(set (pc)
1369 1.1 mrg (if_then_else (match_operator 0 "predicate_operator"
1370 1.1 mrg [(match_operand:SI 1 "register_operand" "AB")
1371 1.1 mrg (const_int 0)])
1372 1.1 mrg (label_ref (match_operand 2 "" ""))
1373 1.1 mrg (pc)))]
1374 1.1 mrg ""
1375 1.1 mrg "%|[%J0]\\tb\\t%$\\t%l2"
1376 1.1 mrg [(set_attr "type" "branch")
1377 1.1 mrg (set_attr "predicable" "no")
1378 1.1 mrg (set_attr "units" "s")
1379 1.1 mrg (set_attr "dest_regfile" "any")])
1380 1.1 mrg
1381 1.1 mrg (define_insn "br_false"
1382 1.1 mrg [(set (pc)
1383 1.1 mrg (if_then_else (match_operator 0 "predicate_operator"
1384 1.1 mrg [(match_operand:SI 1 "register_operand" "AB")
1385 1.1 mrg (const_int 0)])
1386 1.1 mrg (pc)
1387 1.1 mrg (label_ref (match_operand 2 "" ""))))]
1388 1.1 mrg ""
1389 1.1 mrg "%|[%j0]\\tb\\t%$\\t%l2"
1390 1.1 mrg [(set_attr "type" "branch")
1391 1.1 mrg (set_attr "predicable" "no")
1392 1.1 mrg (set_attr "units" "s")
1393 1.1 mrg (set_attr "dest_regfile" "any")])
1394 1.1 mrg
1395 1.1 mrg (define_expand "return"
1396 1.1 mrg [(parallel
1397 1.1 mrg [(return)
1398 1.1 mrg (use (reg:SI REG_B3))])]
1399 1.1 mrg "reload_completed && get_frame_size () == 0 && c6x_nsaved_regs () == 0")
1400 1.1 mrg
1401 1.1 mrg ;; We can't expand this before we know where the link register is stored.
1402 1.1 mrg (define_insn_and_split "eh_return"
1403 1.1 mrg [(unspec_volatile [(match_operand:SI 0 "register_operand" "ab")]
1404 1.1 mrg UNSPECV_EH_RETURN)
1405 1.1 mrg (clobber (match_scratch:SI 1 "=&ab"))]
1406 1.1 mrg ""
1407 1.1 mrg "#"
1408 1.1 mrg "&& reload_completed"
1409 1.1 mrg [(const_int 0)]
1410 1.1 mrg "
1411 1.1 mrg {
1412 1.1 mrg c6x_set_return_address (operands[0], operands[1]);
1413 1.1 mrg DONE;
1414 1.1 mrg }"
1415 1.1 mrg )
1416 1.1 mrg
1417 1.1 mrg ;; -------------------------------------------------------------------------
1418 1.1 mrg ;; Doloop
1419 1.1 mrg ;; -------------------------------------------------------------------------
1420 1.1 mrg
1421 1.1 mrg ; operand 0 is the loop count pseudo register
1422 1.3 mrg ; operand 1 is the label to jump to at the top of the loop
1423 1.1 mrg (define_expand "doloop_end"
1424 1.1 mrg [(parallel [(set (pc) (if_then_else
1425 1.1 mrg (ne (match_operand:SI 0 "" "")
1426 1.1 mrg (const_int 1))
1427 1.3 mrg (label_ref (match_operand 1 "" ""))
1428 1.1 mrg (pc)))
1429 1.1 mrg (set (match_dup 0)
1430 1.1 mrg (plus:SI (match_dup 0)
1431 1.1 mrg (const_int -1)))
1432 1.3 mrg (clobber (match_dup 2))])] ; match_scratch
1433 1.1 mrg "TARGET_INSNS_64PLUS && optimize"
1434 1.1 mrg {
1435 1.1 mrg /* The loop optimizer doesn't check the predicates... */
1436 1.1 mrg if (GET_MODE (operands[0]) != SImode)
1437 1.1 mrg FAIL;
1438 1.3 mrg operands[2] = gen_rtx_SCRATCH (SImode);
1439 1.1 mrg })
1440 1.1 mrg
1441 1.1 mrg (define_insn "mvilc"
1442 1.1 mrg [(set (reg:SI REG_ILC)
1443 1.1 mrg (unspec [(match_operand:SI 0 "register_operand" "a,b")] UNSPEC_MVILC))]
1444 1.1 mrg "TARGET_INSNS_64PLUS"
1445 1.1 mrg "%|%.\\tmvc\\t%$\\t%0, ILC"
1446 1.1 mrg [(set_attr "predicable" "no")
1447 1.1 mrg (set_attr "cross" "y,n")
1448 1.1 mrg (set_attr "units" "s")
1449 1.1 mrg (set_attr "dest_regfile" "b")
1450 1.1 mrg (set_attr "type" "mvilc")])
1451 1.1 mrg
1452 1.1 mrg (define_insn "sploop"
1453 1.1 mrg [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "i")
1454 1.1 mrg (reg:SI REG_ILC)]
1455 1.1 mrg UNSPECV_SPLOOP)]
1456 1.1 mrg "TARGET_INSNS_64PLUS"
1457 1.1 mrg "%|%.\\tsploop\t%0"
1458 1.1 mrg [(set_attr "predicable" "no")
1459 1.1 mrg (set_attr "type" "sploop")])
1460 1.1 mrg
1461 1.1 mrg (define_insn "spkernel"
1462 1.1 mrg [(set (pc)
1463 1.1 mrg (if_then_else
1464 1.1 mrg (ne (unspec_volatile:SI
1465 1.1 mrg [(match_operand:SI 0 "const_int_operand" "i")
1466 1.1 mrg (match_operand:SI 1 "const_int_operand" "i")]
1467 1.1 mrg UNSPECV_SPKERNEL)
1468 1.1 mrg (const_int 1))
1469 1.1 mrg (label_ref (match_operand 2 "" ""))
1470 1.1 mrg (pc)))]
1471 1.1 mrg "TARGET_INSNS_64PLUS"
1472 1.1 mrg "%|%.\\tspkernel\t%0, %1"
1473 1.1 mrg [(set_attr "predicable" "no")
1474 1.1 mrg (set_attr "type" "spkernel")])
1475 1.1 mrg
1476 1.1 mrg (define_insn "loop_end"
1477 1.1 mrg [(set (pc)
1478 1.1 mrg (if_then_else (ne (match_operand:SI 3 "nonimmediate_operand" "0,0,0,*r")
1479 1.1 mrg (const_int 1))
1480 1.1 mrg (label_ref (match_operand 1 "" ""))
1481 1.1 mrg (pc)))
1482 1.1 mrg (set (match_operand:SI 0 "nonimmediate_operand" "=AB,*r,m,m")
1483 1.1 mrg (plus:SI (match_dup 3)
1484 1.1 mrg (const_int -1)))
1485 1.1 mrg (clobber (match_scratch:SI 2 "=X,&AB,&AB,&AB"))]
1486 1.1 mrg "TARGET_INSNS_64PLUS && optimize"
1487 1.1 mrg "#"
1488 1.1 mrg [(set_attr "type" "spkernel")])
1489 1.1 mrg
1490 1.1 mrg (define_split
1491 1.1 mrg [(set (pc)
1492 1.1 mrg (if_then_else (ne (match_operand:SI 3 "nonimmediate_operand" "")
1493 1.1 mrg (const_int 1))
1494 1.1 mrg (label_ref (match_operand 1 "" ""))
1495 1.1 mrg (pc)))
1496 1.1 mrg (set (match_operand:SI 0 "memory_operand" "")
1497 1.1 mrg (plus:SI (match_dup 3)
1498 1.1 mrg (const_int -1)))
1499 1.1 mrg (clobber (match_scratch 2))]
1500 1.1 mrg ""
1501 1.1 mrg [(set (match_dup 2) (plus:SI (match_dup 3) (const_int -1)))
1502 1.1 mrg (set (match_dup 0) (match_dup 2))
1503 1.1 mrg (set (pc)
1504 1.1 mrg (if_then_else (ne (match_dup 2) (const_int 0))
1505 1.1 mrg (label_ref (match_dup 1))
1506 1.1 mrg (pc)))]
1507 1.1 mrg {
1508 1.1 mrg if (!REG_P (operands[3]))
1509 1.1 mrg {
1510 1.1 mrg emit_move_insn (operands[2], operands[3]);
1511 1.1 mrg operands[3] = operands[2];
1512 1.1 mrg }
1513 1.1 mrg })
1514 1.1 mrg
1515 1.1 mrg ;; -------------------------------------------------------------------------
1516 1.1 mrg ;; Delayed-branch real jumps and shadows
1517 1.1 mrg ;; -------------------------------------------------------------------------
1518 1.1 mrg
1519 1.1 mrg (define_insn "real_jump"
1520 1.3 mrg [(unspec [(match_operand 0 "c6x_jump_operand" "a,b,S3") (const_int 0)]
1521 1.1 mrg UNSPEC_REAL_JUMP)]
1522 1.1 mrg ""
1523 1.1 mrg {
1524 1.1 mrg if (GET_CODE (operands[0]) == LABEL_REF)
1525 1.1 mrg return "%|%.\\tb\\t%$\\t%l0";
1526 1.1 mrg return "%|%.\\tb\\t%$\\t%0";
1527 1.1 mrg }
1528 1.1 mrg [(set_attr "type" "branch")
1529 1.1 mrg (set_attr "has_shadow" "y")
1530 1.1 mrg (set_attr "units" "s")
1531 1.1 mrg (set_attr "cross" "y,n,n")
1532 1.1 mrg (set_attr "dest_regfile" "b,b,any")])
1533 1.1 mrg
1534 1.1 mrg (define_insn "real_call"
1535 1.1 mrg [(unspec [(match_operand 0 "c6x_call_operand" "a,b,S1") (const_int 1)]
1536 1.1 mrg UNSPEC_REAL_JUMP)
1537 1.1 mrg (clobber (reg:SI REG_B3))]
1538 1.1 mrg ""
1539 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
1540 1.1 mrg [(set_attr "type" "call")
1541 1.1 mrg (set_attr "has_shadow" "y")
1542 1.1 mrg (set_attr "predicable" "no")
1543 1.1 mrg (set_attr "units" "s")
1544 1.1 mrg (set_attr "cross" "y,n,n")
1545 1.1 mrg (set_attr "dest_regfile" "b,b,any")])
1546 1.1 mrg
1547 1.1 mrg (define_insn "real_ret"
1548 1.1 mrg [(unspec [(match_operand 0 "register_operand" "a,b") (const_int 2)]
1549 1.1 mrg UNSPEC_REAL_JUMP)]
1550 1.1 mrg ""
1551 1.1 mrg "%|%.\\tret\\t%$\\t%0"
1552 1.1 mrg [(set_attr "type" "branch")
1553 1.1 mrg (set_attr "has_shadow" "y")
1554 1.1 mrg (set_attr "units" "s")
1555 1.1 mrg (set_attr "cross" "y,n")
1556 1.1 mrg (set_attr "dest_regfile" "b")])
1557 1.1 mrg
1558 1.1 mrg ;; computed_jump_p returns true if it finds a constant; so use one in the
1559 1.1 mrg ;; unspec.
1560 1.1 mrg (define_insn "indirect_jump_shadow"
1561 1.1 mrg [(set (pc) (unspec [(const_int 1)] UNSPEC_JUMP_SHADOW))]
1562 1.1 mrg ""
1563 1.1 mrg ";; indirect jump occurs"
1564 1.1 mrg [(set_attr "type" "shadow")])
1565 1.1 mrg
1566 1.1 mrg ;; Operand 0 may be a PARALLEL which isn't handled by output_operand, so
1567 1.1 mrg ;; we don't try to print it.
1568 1.1 mrg (define_insn "indirect_call_value_shadow"
1569 1.1 mrg [(set (match_operand 0 "" "")
1570 1.1 mrg (call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
1571 1.1 mrg (const_int 0)))]
1572 1.1 mrg ""
1573 1.1 mrg ";; indirect call occurs, with return value"
1574 1.1 mrg [(set_attr "type" "shadow")])
1575 1.1 mrg
1576 1.1 mrg (define_insn "indirect_sibcall_shadow"
1577 1.1 mrg [(call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
1578 1.1 mrg (const_int 0))]
1579 1.1 mrg "SIBLING_CALL_P (insn)"
1580 1.1 mrg ";; indirect sibcall occurs"
1581 1.1 mrg [(set_attr "type" "shadow")])
1582 1.1 mrg
1583 1.1 mrg (define_insn "indirect_call_shadow"
1584 1.1 mrg [(call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
1585 1.1 mrg (const_int 0))]
1586 1.1 mrg ""
1587 1.1 mrg ";; indirect call occurs"
1588 1.1 mrg [(set_attr "type" "shadow")])
1589 1.1 mrg
1590 1.1 mrg (define_insn "call_value_shadow"
1591 1.1 mrg [(set (match_operand 0 "" "")
1592 1.1 mrg (call (unspec [(match_operand 1 "" "")] UNSPEC_JUMP_SHADOW)
1593 1.1 mrg (const_int 0)))]
1594 1.1 mrg ""
1595 1.1 mrg ";; call to %1 occurs, with return value"
1596 1.1 mrg [(set_attr "type" "shadow")])
1597 1.1 mrg
1598 1.1 mrg (define_insn "call_shadow"
1599 1.1 mrg [(call (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW)
1600 1.1 mrg (const_int 0))]
1601 1.1 mrg "!SIBLING_CALL_P (insn)"
1602 1.1 mrg ";; call to %0 occurs"
1603 1.1 mrg [(set_attr "type" "shadow")])
1604 1.1 mrg
1605 1.1 mrg (define_insn "sibcall_shadow"
1606 1.1 mrg [(call (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW)
1607 1.1 mrg (const_int 0))]
1608 1.1 mrg "SIBLING_CALL_P (insn)"
1609 1.1 mrg ";; sibcall to %0 occurs"
1610 1.1 mrg [(set_attr "type" "shadow")])
1611 1.1 mrg
1612 1.1 mrg (define_insn "jump_shadow"
1613 1.1 mrg [(set (pc) (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW))]
1614 1.1 mrg ""
1615 1.1 mrg ";; jump to %0 occurs"
1616 1.1 mrg [(set_attr "type" "shadow")])
1617 1.1 mrg
1618 1.1 mrg (define_insn "condjump_shadow"
1619 1.1 mrg [(set (pc)
1620 1.1 mrg (if_then_else (eq (unspec [(const_int 0)] UNSPEC_JUMP_SHADOW)
1621 1.1 mrg (const_int 0))
1622 1.1 mrg (match_operand 0 "" "")
1623 1.1 mrg (pc)))]
1624 1.1 mrg ""
1625 1.1 mrg ";; condjump to %0 occurs"
1626 1.1 mrg [(set_attr "type" "shadow")])
1627 1.1 mrg
1628 1.1 mrg (define_insn "return_shadow"
1629 1.1 mrg [(unspec [(const_int 0)] UNSPEC_JUMP_SHADOW)
1630 1.1 mrg (return)]
1631 1.1 mrg ""
1632 1.1 mrg ";; return occurs"
1633 1.1 mrg [(set_attr "type" "shadow")])
1634 1.1 mrg
1635 1.1 mrg ;; -------------------------------------------------------------------------
1636 1.1 mrg ;; Add instructions
1637 1.1 mrg ;; -------------------------------------------------------------------------
1638 1.1 mrg
1639 1.1 mrg (define_insn "addsi3"
1640 1.1 mrg [(set (match_operand:SI 0 "register_operand"
1641 1.1 mrg "=a ,b , a, b, a, b, a, b, ab, a, b, a, b,ab")
1642 1.1 mrg (plus:SI (match_operand:SI 1 "register_operand"
1643 1.1 mrg "%a ,b , a, b, b, a, b, a, 0, a, b, z, z,0")
1644 1.1 mrg (match_operand:SI 2 "addsi_operand"
1645 1.1 mrg "aIs5,bIs5,?b,?a,?a,?b,?aIs5,?bIs5,I5x,I5x,I5x,Iux,Iux,IsB")))]
1646 1.1 mrg ""
1647 1.1 mrg {
1648 1.1 mrg if (CONSTANT_P (operands[2]))
1649 1.1 mrg {
1650 1.1 mrg HOST_WIDE_INT val = INTVAL (operands[2]);
1651 1.1 mrg
1652 1.1 mrg if (c6x_get_unit_specifier (insn) == 'd')
1653 1.1 mrg {
1654 1.1 mrg bool issp = (TARGET_INSNS_64PLUS
1655 1.1 mrg && operands[1] == stack_pointer_rtx
1656 1.1 mrg && GET_CODE (PATTERN (insn)) != COND_EXEC);
1657 1.1 mrg
1658 1.1 mrg if (get_attr_cross (insn) == CROSS_N)
1659 1.1 mrg {
1660 1.1 mrg if (satisfies_constraint_Iu5 (operands[2]))
1661 1.1 mrg return "%|%.\\tadd\\t%$\\t%1, %2, %0";
1662 1.1 mrg else if (satisfies_constraint_In5 (operands[2]))
1663 1.1 mrg return "%|%.\\tsub\\t%$\\t%1, %n2, %0";
1664 1.1 mrg }
1665 1.1 mrg
1666 1.1 mrg if (issp && val > 0 && val < 32768)
1667 1.1 mrg {
1668 1.1 mrg return "%|%.\\taddab\\t%$\\t%1, %2, %0";
1669 1.1 mrg }
1670 1.1 mrg if ((val & 1) == 0 && ((val >= -62 && val <= 62)
1671 1.1 mrg || (issp && val > 0 && val < 65536)))
1672 1.1 mrg {
1673 1.1 mrg if (val < 0)
1674 1.1 mrg return "%|%.\\tsubah\\t%$\\t%1, %r2, %0";
1675 1.1 mrg else
1676 1.1 mrg return "%|%.\\taddah\\t%$\\t%1, %r2, %0";
1677 1.1 mrg }
1678 1.1 mrg else if ((val & 3) == 0 && ((val >= -124 && val <= 124)
1679 1.1 mrg || (issp && val > 0 && val < 131072)))
1680 1.1 mrg {
1681 1.1 mrg if (val < 0)
1682 1.1 mrg return "%|%.\\tsubaw\\t%$\\t%1, %R2, %0";
1683 1.1 mrg else
1684 1.1 mrg return "%|%.\\taddaw\\t%$\\t%1, %R2, %0";
1685 1.1 mrg }
1686 1.1 mrg else if ((val & 7) == 0 && val > 0 && val <= 248)
1687 1.1 mrg {
1688 1.1 mrg rtx xop[3];
1689 1.1 mrg xop[0] = operands[0];
1690 1.1 mrg xop[1] = operands[1];
1691 1.1 mrg xop[2] = GEN_INT (val >> 3);
1692 1.1 mrg output_asm_insn ("%|%.\\taddad\\t%$\\t%1, %2, %0", xop);
1693 1.1 mrg return "";
1694 1.1 mrg }
1695 1.1 mrg }
1696 1.1 mrg else
1697 1.1 mrg {
1698 1.1 mrg if (satisfies_constraint_Is5 (operands[2]))
1699 1.1 mrg return "%|%.\\tadd\\t%$\\t%2, %1, %0";
1700 1.1 mrg }
1701 1.1 mrg gcc_assert (rtx_equal_p (operands[0], operands[1]));
1702 1.1 mrg return "%|%.\\taddk\\t%$\\t%2, %0";
1703 1.1 mrg }
1704 1.1 mrg if (which_alternative == 4 || which_alternative == 5)
1705 1.1 mrg return "%|%.\\tadd\\t%$\\t%2, %1, %0";
1706 1.1 mrg else
1707 1.1 mrg return "%|%.\\tadd\\t%$\\t%1, %2, %0";
1708 1.1 mrg }
1709 1.1 mrg [(set_attr "units62" "dls,dls,ls,ls,ls,ls,ls,ls,s,d,d,*,*,s")
1710 1.1 mrg (set_attr "units67" "dls,dls,ls,ls,ls,ls,ls,ls,ds,d,d,*,*,s")
1711 1.1 mrg (set_attr "units64" "dls,dls,dls,dls,dls,dls,ls,ls,ds,d,d,d,d,s")
1712 1.1 mrg (set_attr "cross" "n,n,y,y,y,y,y,y,n,n,n,y,n,n")
1713 1.1 mrg (set_attr "predicable" "yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,yes")])
1714 1.1 mrg
1715 1.1 mrg (define_insn "subsi3"
1716 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
1717 1.1 mrg (minus:SI (match_operand:SI 1 "reg_or_scst5_operand" "a,b,aIs5,bIs5,bIs5,aIs5")
1718 1.1 mrg (match_operand:SI 2 "register_operand" "a,b,a,b,?a,?b")))]
1719 1.1 mrg ""
1720 1.1 mrg "%|%.\\tsub\\t%$\\t%1, %2, %0"
1721 1.1 mrg [(set_attr "units62" "dls,dls,ls,ls,l,l")
1722 1.1 mrg (set_attr "units64" "dls,dls,ls,ls,ls,ls")
1723 1.1 mrg (set_attr "cross" "n,n,n,n,y,y")])
1724 1.1 mrg
1725 1.1 mrg (define_insn "*addshiftsi"
1726 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b")
1727 1.1 mrg (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "a,b")
1728 1.1 mrg (match_operand:SI 3 "adda_scale_operand" "n,n"))
1729 1.1 mrg (match_operand:SI 1 "register_operand" "a,b")))]
1730 1.1 mrg ""
1731 1.1 mrg "%|%.\\tadda%d3\\t%$\\t%1, %2, %0"
1732 1.1 mrg [(set_attr "units" "d")])
1733 1.1 mrg
1734 1.1 mrg (define_insn "*subshiftsi"
1735 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b")
1736 1.1 mrg (minus:SI (match_operand:SI 1 "register_operand" "a,b")
1737 1.1 mrg (mult:SI (match_operand:SI 2 "register_operand" "a,b")
1738 1.1 mrg (match_operand:SI 3 "suba_scale_operand" "n,n"))))]
1739 1.1 mrg ""
1740 1.1 mrg "%|%.\\tsuba%d3\\t%$\\t%1, %2, %0"
1741 1.1 mrg [(set_attr "units" "d")])
1742 1.1 mrg
1743 1.1 mrg (define_insn "addsidi3_widen"
1744 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=a,b,a,b")
1745 1.1 mrg (plus:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%a,b,a,b"))
1746 1.1 mrg (zero_extend:DI (match_operand:SI 2 "register_operand" "a,b,?b,?a"))))]
1747 1.1 mrg ""
1748 1.1 mrg "%|%.\\taddu\\t%$\\t%1, %2, %0"
1749 1.1 mrg [(set_attr "units" "l")
1750 1.1 mrg (set_attr "cross" "n,n,y,y")])
1751 1.1 mrg
1752 1.1 mrg (define_expand "adddi3"
1753 1.1 mrg [(set (match_operand:DI 0 "register_operand" "")
1754 1.1 mrg (plus:DI (match_operand:DI 1 "register_operand" "")
1755 1.1 mrg (match_operand:DI 2 "register_operand" "")))]
1756 1.1 mrg ""
1757 1.1 mrg {
1758 1.1 mrg rtx tmp;
1759 1.1 mrg rtx lo_half[3], hi_half[3];
1760 1.1 mrg split_di (operands + 1, 2, lo_half + 1, hi_half + 1);
1761 1.1 mrg if (reg_overlap_mentioned_p (operands[0], hi_half[1])
1762 1.1 mrg || reg_overlap_mentioned_p (operands[0], hi_half[2]))
1763 1.1 mrg tmp = gen_reg_rtx (DImode);
1764 1.1 mrg else
1765 1.1 mrg tmp = operands[0];
1766 1.1 mrg split_di (&tmp, 1, lo_half, hi_half);
1767 1.1 mrg emit_insn (gen_addsidi3_widen (tmp, lo_half[1], lo_half[2]));
1768 1.1 mrg emit_insn (gen_addsi3 (hi_half[0], copy_rtx (hi_half[0]), hi_half[1]));
1769 1.1 mrg emit_insn (gen_addsi3 (copy_rtx (hi_half[0]),
1770 1.1 mrg copy_rtx (hi_half[0]), hi_half[2]));
1771 1.1 mrg if (tmp != operands[0])
1772 1.1 mrg emit_move_insn (operands[0], tmp);
1773 1.1 mrg DONE;
1774 1.1 mrg })
1775 1.1 mrg
1776 1.1 mrg (define_insn "addsf3"
1777 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
1778 1.1 mrg (plus:SF (match_operand:SF 1 "register_operand" "%a,b,a,b")
1779 1.1 mrg (match_operand:SF 2 "register_operand" "a,b,?b,?a")))]
1780 1.1 mrg "TARGET_FP"
1781 1.1 mrg "%|%.\\taddsp\\t%$\\t%1, %2, %0"
1782 1.1 mrg [(set_attr "type" "fp4")
1783 1.1 mrg (set_attr "units67" "l")
1784 1.1 mrg (set_attr "units67p" "ls")
1785 1.1 mrg (set_attr "units674" "ls")
1786 1.1 mrg (set_attr "cross" "n,n,y,y")])
1787 1.1 mrg
1788 1.1 mrg (define_insn "adddf3"
1789 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
1790 1.1 mrg (plus:DF (match_operand:DF 1 "register_operand" "%a,b,a,b")
1791 1.1 mrg (match_operand:DF 2 "register_operand" "a,b,?b,?a")))]
1792 1.1 mrg "TARGET_FP"
1793 1.1 mrg "%|%.\\tadddp\\t%$\\t%1, %2, %0"
1794 1.1 mrg [(set_attr "type" "adddp")
1795 1.1 mrg (set_attr "units67" "l")
1796 1.1 mrg (set_attr "units67p" "ls")
1797 1.1 mrg (set_attr "units674" "ls")
1798 1.1 mrg (set_attr "cross" "n,n,y,y")])
1799 1.1 mrg
1800 1.1 mrg (define_insn "subsf3"
1801 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b, a, b, a, b")
1802 1.1 mrg (minus:SF (match_operand:SF 1 "register_operand" "a,b, b, a, a, b")
1803 1.1 mrg (match_operand:SF 2 "register_operand" "a,b,?a,?b,?b,?a")))]
1804 1.1 mrg "TARGET_FP"
1805 1.1 mrg "%|%.\\tsubsp\\t%$\\t%1, %2, %0"
1806 1.1 mrg [(set_attr "type" "fp4")
1807 1.1 mrg (set_attr "units67" "l")
1808 1.1 mrg (set_attr "units67p" "ls")
1809 1.1 mrg (set_attr "units674" "ls")
1810 1.1 mrg (set_attr "cross" "n,n,y,y,y,y")])
1811 1.1 mrg
1812 1.1 mrg (define_insn "subdf3"
1813 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b, a, b, a, b")
1814 1.1 mrg (minus:DF (match_operand:DF 1 "register_operand" "a,b, b, a, a, b")
1815 1.1 mrg (match_operand:DF 2 "register_operand" "a,b,?a,?b,?b,?a")))]
1816 1.1 mrg "TARGET_FP"
1817 1.1 mrg "%|%.\\tsubdp\\t%$\\t%1, %2, %0"
1818 1.1 mrg [(set_attr "type" "adddp")
1819 1.1 mrg (set_attr "units67" "l")
1820 1.1 mrg (set_attr "units67p" "ls")
1821 1.1 mrg (set_attr "units674" "ls")
1822 1.1 mrg (set_attr "cross" "n,n,y,y,y,y")])
1823 1.1 mrg
1824 1.1 mrg ;; -------------------------------------------------------------------------
1825 1.1 mrg ;; Logical instructions
1826 1.1 mrg ;; -------------------------------------------------------------------------
1827 1.1 mrg
1828 1.1 mrg (define_insn "andsi3"
1829 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
1830 1.1 mrg (and:SI (match_operand:SI 1 "register_operand" "%a,b,b,a,a,b")
1831 1.1 mrg (match_operand:SI 2 "andsi_operand" "aIs5,bIs5,?aIs5,?bIs5,aJc,bJc")))]
1832 1.1 mrg ""
1833 1.1 mrg {
1834 1.1 mrg if (which_alternative < 4)
1835 1.1 mrg return "%|%.\\tand\\t%$\\t%2, %1, %0";
1836 1.1 mrg else
1837 1.1 mrg return "%|%.\\tclr\\t%$\\t%1, %f2, %F2, %0";
1838 1.1 mrg }
1839 1.1 mrg [(set_attr "units62" "ls,ls,ls,ls,s,s")
1840 1.1 mrg (set_attr "units64" "dls,dls,dls,dls,s,s")
1841 1.1 mrg (set_attr "cross" "n,n,y,y,n,n")])
1842 1.1 mrg
1843 1.1 mrg (define_insn "iorsi3"
1844 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
1845 1.1 mrg (ior:SI (match_operand:SI 1 "register_operand" "%a,b,b,a,a,b")
1846 1.1 mrg (match_operand:SI 2 "iorsi_operand" "aIs5,bIs5,?aIs5,?bIs5,aJs,bJs")))]
1847 1.1 mrg ""
1848 1.1 mrg {
1849 1.1 mrg if (which_alternative < 4)
1850 1.1 mrg return "%|%.\\tor\\t%$\\t%2, %1, %0";
1851 1.1 mrg else
1852 1.1 mrg return "%|%.\\tset\\t%$\\t%1, %s2, %S2, %0";
1853 1.1 mrg }
1854 1.1 mrg [(set_attr "units62" "ls,ls,ls,ls,s,s")
1855 1.1 mrg (set_attr "units64" "dls,dls,dls,dls,s,s")
1856 1.1 mrg (set_attr "cross" "n,n,y,y,n,n")])
1857 1.1 mrg
1858 1.1 mrg (define_insn "xorsi3"
1859 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1860 1.1 mrg (xor:SI (match_operand:SI 1 "register_operand" "%a,b,b,a")
1861 1.1 mrg (match_operand:SI 2 "reg_or_scst5_operand" "aIs5,bIs5,?aIs5,?bIs5")))]
1862 1.1 mrg ""
1863 1.1 mrg "%|%.\\txor\\t%$\\t%2, %1, %0"
1864 1.1 mrg [(set_attr "units62" "ls")
1865 1.1 mrg (set_attr "units64" "dls")
1866 1.1 mrg (set_attr "cross" "n,n,y,y")])
1867 1.1 mrg
1868 1.1 mrg ;; -------------------------------------------------------------------------
1869 1.1 mrg ;; Conversions
1870 1.1 mrg ;; -------------------------------------------------------------------------
1871 1.1 mrg
1872 1.1 mrg (define_insn "extendsfdf2"
1873 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
1874 1.1 mrg (float_extend:DF (match_operand:SF 1 "register_operand" "a,b,?b,?a")))]
1875 1.1 mrg "TARGET_FP"
1876 1.1 mrg "%|%.\\tspdp\\t%$\\t%1,%0"
1877 1.1 mrg [(set_attr "type" "dp2")
1878 1.1 mrg (set_attr "units" "s")
1879 1.1 mrg (set_attr "cross" "n,n,y,y")])
1880 1.1 mrg
1881 1.1 mrg (define_insn "truncdfsf2"
1882 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b")
1883 1.1 mrg (float_truncate:SF (match_operand:DF 1 "register_operand" "a,b")))]
1884 1.1 mrg "TARGET_FP"
1885 1.1 mrg "%|%.\\tdpsp\\t%$\\t%1,%0"
1886 1.1 mrg [(set_attr "type" "fp4")
1887 1.1 mrg (set_attr "units" "l")
1888 1.1 mrg (set_attr "cross" "n")])
1889 1.1 mrg
1890 1.1 mrg ;;;; Convert between signed integer types and floating point.
1891 1.1 mrg (define_insn "floatsisf2"
1892 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
1893 1.1 mrg (float:SF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
1894 1.1 mrg "TARGET_FP"
1895 1.1 mrg "%|%.\\tintsp\\t%$\\t%1,%0"
1896 1.1 mrg [(set_attr "type" "fp4")
1897 1.1 mrg (set_attr "units" "l")
1898 1.1 mrg (set_attr "cross" "n,n,y,y")])
1899 1.1 mrg
1900 1.1 mrg (define_insn "floatunssisf2"
1901 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
1902 1.1 mrg (unsigned_float:SF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
1903 1.1 mrg "TARGET_FP"
1904 1.1 mrg "%|%.\\tintspu\\t%$\\t%1,%0"
1905 1.1 mrg [(set_attr "type" "fp4")
1906 1.1 mrg (set_attr "units" "l")
1907 1.1 mrg (set_attr "cross" "n,n,y,y")])
1908 1.1 mrg
1909 1.1 mrg (define_insn "floatsidf2"
1910 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
1911 1.1 mrg (float:DF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
1912 1.1 mrg "TARGET_FP"
1913 1.1 mrg "%|%.\\tintdp\\t%$\\t%1,%0"
1914 1.1 mrg [(set_attr "type" "intdp")
1915 1.1 mrg (set_attr "units" "l")
1916 1.1 mrg (set_attr "cross" "n,n,y,y")])
1917 1.1 mrg
1918 1.1 mrg (define_insn "floatunssidf2"
1919 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
1920 1.1 mrg (unsigned_float:DF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
1921 1.1 mrg "TARGET_FP"
1922 1.1 mrg "%|%.\\tintdpu\\t%$\\t%1,%0"
1923 1.1 mrg [(set_attr "type" "intdp")
1924 1.1 mrg (set_attr "units" "l")
1925 1.1 mrg (set_attr "cross" "n,n,y,y")])
1926 1.1 mrg
1927 1.1 mrg (define_insn "fix_truncsfsi2"
1928 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1929 1.1 mrg (fix:SI (match_operand:SF 1 "register_operand" "a,b,?b,?a")))]
1930 1.1 mrg "TARGET_FP"
1931 1.1 mrg "%|%.\\tsptrunc\\t%$\\t%1,%0"
1932 1.1 mrg [(set_attr "type" "fp4")
1933 1.1 mrg (set_attr "units" "l")
1934 1.1 mrg (set_attr "cross" "n,n,y,y")])
1935 1.1 mrg
1936 1.1 mrg (define_insn "fix_truncdfsi2"
1937 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b")
1938 1.1 mrg (fix:SI (match_operand:DF 1 "register_operand" "a,b")))]
1939 1.1 mrg "TARGET_FP"
1940 1.1 mrg "%|%.\\tdptrunc\\t%$\\t%1,%0"
1941 1.1 mrg [(set_attr "type" "fp4")
1942 1.1 mrg (set_attr "units" "l")
1943 1.1 mrg (set_attr "cross" "n")])
1944 1.1 mrg
1945 1.1 mrg ;; -------------------------------------------------------------------------
1946 1.1 mrg ;; Saturating arithmetic
1947 1.1 mrg ;; -------------------------------------------------------------------------
1948 1.1 mrg
1949 1.1 mrg (define_insn "saddsi3"
1950 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b,a,b")
1951 1.1 mrg (ss_plus:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a,a,b,?b,?a")
1952 1.1 mrg (match_operand:SI 2 "reg_or_const_int_operand" "a,b,a,b,aIs5,bIs5,aIs5,bIs5")))]
1953 1.1 mrg ""
1954 1.1 mrg "%|%.\\tsadd\\t%$\\t%2, %1, %0"
1955 1.1 mrg [(set_attr "units" "ls,ls,ls,ls,l,l,l,l")
1956 1.1 mrg (set_attr "cross" "n,n,y,y,n,n,y,y")])
1957 1.1 mrg
1958 1.1 mrg (define_insn "ssubsi3"
1959 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1960 1.1 mrg (ss_minus:SI (match_operand:SI 1 "reg_or_scst5_operand" "aIs5,bIs5,?bIs5,?aIs5")
1961 1.1 mrg (match_operand:SI 2 "register_operand" "a,b,a,b")))]
1962 1.1 mrg ""
1963 1.1 mrg "%|%.\\tssub\\t%$\\t%1, %2, %0"
1964 1.1 mrg [(set_attr "units" "l")
1965 1.1 mrg (set_attr "cross" "n,n,y,y")])
1966 1.1 mrg
1967 1.1 mrg (define_insn "subcsi3"
1968 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
1969 1.1 mrg (unspec:SI
1970 1.1 mrg [(match_operand:SI 1 "register_operand" "a,b,a,b")
1971 1.1 mrg (match_operand:SI 2 "register_operand" "a,b,?b,?a")]
1972 1.1 mrg UNSPEC_SUBC))]
1973 1.1 mrg ""
1974 1.1 mrg "%|%.\\tsubc\\t%$\\t%1, %2, %0"
1975 1.1 mrg [(set_attr "units" "l")
1976 1.1 mrg (set_attr "cross" "n,n,y,y")])
1977 1.1 mrg
1978 1.1 mrg ;; -------------------------------------------------------------------------
1979 1.1 mrg ;; Call instructions
1980 1.1 mrg ;; -------------------------------------------------------------------------
1981 1.1 mrg
1982 1.1 mrg (define_expand "call"
1983 1.1 mrg [(match_operand 0 "" "")]
1984 1.1 mrg ""
1985 1.1 mrg {
1986 1.1 mrg c6x_expand_call (NULL_RTX, operands[0], false);
1987 1.1 mrg DONE;
1988 1.1 mrg })
1989 1.1 mrg
1990 1.1 mrg (define_expand "call_value"
1991 1.1 mrg [(match_operand 0 "" "")
1992 1.1 mrg (match_operand 1 "" "")]
1993 1.1 mrg ""
1994 1.1 mrg {
1995 1.1 mrg c6x_expand_call (operands[0], operands[1], false);
1996 1.1 mrg DONE;
1997 1.1 mrg })
1998 1.1 mrg
1999 1.1 mrg (define_expand "sibcall"
2000 1.1 mrg [(match_operand 0 "" "")]
2001 1.1 mrg ""
2002 1.1 mrg {
2003 1.1 mrg c6x_expand_call (NULL_RTX, operands[0], true);
2004 1.1 mrg cfun->machine->contains_sibcall = true;
2005 1.1 mrg DONE;
2006 1.1 mrg })
2007 1.1 mrg
2008 1.1 mrg (define_expand "sibcall_value"
2009 1.1 mrg [(match_operand 0 "" "")
2010 1.1 mrg (match_operand 1 "" "")]
2011 1.1 mrg ""
2012 1.1 mrg {
2013 1.1 mrg c6x_expand_call (operands[0], operands[1], true);
2014 1.1 mrg cfun->machine->contains_sibcall = true;
2015 1.1 mrg DONE;
2016 1.1 mrg })
2017 1.1 mrg
2018 1.1 mrg (define_insn "call_internal"
2019 1.1 mrg [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1,a,b"))
2020 1.1 mrg (const_int 0))]
2021 1.1 mrg "!SIBLING_CALL_P (insn)"
2022 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2023 1.1 mrg [(set_attr "type" "call")
2024 1.1 mrg (set_attr "predicable" "no")
2025 1.1 mrg (set_attr "units" "s")
2026 1.1 mrg (set_attr "dest_regfile" "any,b,b")
2027 1.1 mrg (set_attr "cross" "n,y,n")])
2028 1.1 mrg
2029 1.1 mrg (define_insn "call_value_internal"
2030 1.1 mrg [(set (match_operand 0 "" "")
2031 1.1 mrg (call (mem (match_operand:SI 1 "c6x_call_operand" "S1,a,b"))
2032 1.1 mrg (const_int 0)))]
2033 1.1 mrg ""
2034 1.1 mrg "%|%.\\tcall\\t%$\\t%1"
2035 1.1 mrg [(set_attr "type" "call")
2036 1.1 mrg (set_attr "predicable" "no")
2037 1.1 mrg (set_attr "units" "s")
2038 1.1 mrg (set_attr "dest_regfile" "any,b,b")
2039 1.1 mrg (set_attr "cross" "n,y,n")])
2040 1.1 mrg
2041 1.1 mrg (define_insn "sibcall_internal"
2042 1.1 mrg [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1,C"))
2043 1.1 mrg (const_int 0))]
2044 1.1 mrg "SIBLING_CALL_P (insn)"
2045 1.1 mrg "%|%.\\tb\\t%$\\t%0"
2046 1.1 mrg [(set_attr "type" "branch")
2047 1.1 mrg (set_attr "predicable" "no")
2048 1.1 mrg (set_attr "units" "s")
2049 1.1 mrg (set_attr "dest_regfile" "any,b")])
2050 1.1 mrg
2051 1.1 mrg (define_insn "callp"
2052 1.1 mrg [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1"))
2053 1.1 mrg (const_int 0))
2054 1.1 mrg (unspec [(const_int 6)] UNSPEC_NOP)]
2055 1.1 mrg "!SIBLING_CALL_P (insn)"
2056 1.1 mrg "%|%.\\tcallp\\t%$\\t%0, B3"
2057 1.1 mrg [(set_attr "type" "callp")
2058 1.1 mrg (set_attr "predicable" "no")
2059 1.1 mrg (set_attr "units" "s")
2060 1.1 mrg (set_attr "dest_regfile" "b")
2061 1.1 mrg (set_attr "cross" "n")])
2062 1.1 mrg
2063 1.1 mrg (define_insn "callp_value"
2064 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2065 1.1 mrg (call (mem (match_operand:SI 1 "c6x_call_operand" "S1"))
2066 1.1 mrg (const_int 0)))
2067 1.1 mrg (unspec [(const_int 6)] UNSPEC_NOP)]
2068 1.1 mrg "!SIBLING_CALL_P (insn)"
2069 1.1 mrg "%|%.\\tcallp\\t%$\\t%1, B3"
2070 1.1 mrg [(set_attr "type" "callp")
2071 1.1 mrg (set_attr "predicable" "no")
2072 1.1 mrg (set_attr "units" "s")
2073 1.1 mrg (set_attr "dest_regfile" "b")
2074 1.1 mrg (set_attr "cross" "n")])
2075 1.1 mrg
2076 1.1 mrg (define_insn "return_internal"
2077 1.1 mrg [(return)
2078 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))]
2079 1.1 mrg "reload_completed"
2080 1.1 mrg "%|%.\\tret\\t%$\\t%0"
2081 1.1 mrg [(set_attr "type" "branch")
2082 1.1 mrg (set_attr "units" "s")
2083 1.1 mrg (set_attr "dest_regfile" "b")])
2084 1.1 mrg
2085 1.1 mrg (define_insn "addkpc"
2086 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=b")
2087 1.1 mrg (unspec:SI [(match_operand 1 "" "")] UNSPEC_ADDKPC))
2088 1.1 mrg (unspec [(match_operand 2 "const_int_operand" "n")] UNSPEC_NOP)]
2089 1.1 mrg "TARGET_INSNS_64"
2090 1.1 mrg "%|%.\\taddkpc\\t%$\\t%l1, %0, %2"
2091 1.1 mrg [(set_attr "units" "s")
2092 1.1 mrg (set_attr "dest_regfile" "b")])
2093 1.1 mrg
2094 1.1 mrg ;; -------------------------------------------------------------------------
2095 1.1 mrg ;; Unary operations
2096 1.1 mrg ;; -------------------------------------------------------------------------
2097 1.1 mrg
2098 1.1 mrg (define_insn "negsi2"
2099 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
2100 1.1 mrg (neg:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
2101 1.1 mrg ""
2102 1.1 mrg "%|%.\\tneg\\t%$\\t%1, %0"
2103 1.1 mrg [(set_attr "units" "ls")
2104 1.1 mrg (set_attr "cross" "n,y,n,y")])
2105 1.1 mrg
2106 1.1 mrg (define_insn "one_cmplsi2"
2107 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
2108 1.1 mrg (not:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
2109 1.1 mrg ""
2110 1.1 mrg "%|%.\\tnot\\t%$\\t%1, %0"
2111 1.1 mrg [(set_attr "units" "ls")
2112 1.1 mrg (set_attr "cross" "n,y,n,y")])
2113 1.1 mrg
2114 1.1 mrg (define_insn "clrsbsi2"
2115 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
2116 1.1 mrg (clrsb:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
2117 1.1 mrg ""
2118 1.1 mrg "%|%.\\tnorm\\t%$\\t%1, %0"
2119 1.1 mrg [(set_attr "units" "l")
2120 1.1 mrg (set_attr "cross" "n,y,n,y")])
2121 1.1 mrg
2122 1.1 mrg (define_insn "clzsi2"
2123 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
2124 1.1 mrg (clz:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
2125 1.1 mrg ""
2126 1.1 mrg "%|%.\\tlmbd\\t%$\\t1, %1, %0"
2127 1.1 mrg [(set_attr "units" "l")
2128 1.1 mrg (set_attr "cross" "n,y,n,y")])
2129 1.1 mrg
2130 1.1 mrg ;; bitrevsi2 is defined in c6x-mult.md.in.
2131 1.1 mrg
2132 1.1 mrg (define_expand "ctzsi2"
2133 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2134 1.1 mrg (ctz:SI (match_operand:SI 1 "register_operand" "")))]
2135 1.1 mrg "TARGET_INSNS_64"
2136 1.1 mrg {
2137 1.1 mrg rtx tmpreg = gen_reg_rtx (SImode);
2138 1.1 mrg emit_insn (gen_bitrevsi2 (tmpreg, operands[1]));
2139 1.1 mrg emit_insn (gen_clzsi2 (operands[0], tmpreg));
2140 1.1 mrg DONE;
2141 1.1 mrg })
2142 1.1 mrg
2143 1.1 mrg (define_expand "ctzdi2"
2144 1.1 mrg [(set (match_operand:DI 0 "register_operand" "")
2145 1.1 mrg (ctz:DI (match_operand:DI 1 "register_operand" "")))]
2146 1.1 mrg "TARGET_INSNS_64"
2147 1.1 mrg {
2148 1.1 mrg rtx tmpreg = gen_reg_rtx (DImode);
2149 1.1 mrg rtx out;
2150 1.1 mrg emit_insn (gen_bitrevsi2 (gen_highpart (SImode, tmpreg),
2151 1.1 mrg gen_lowpart (SImode, operands[1])));
2152 1.1 mrg emit_insn (gen_bitrevsi2 (gen_lowpart (SImode, tmpreg),
2153 1.1 mrg gen_highpart (SImode, operands[1])));
2154 1.1 mrg out = expand_unop (DImode, clz_optab, tmpreg, operands[0], 1);
2155 1.1 mrg if (!rtx_equal_p (out, operands[0]))
2156 1.1 mrg emit_move_insn (operands[0], out);
2157 1.1 mrg DONE;
2158 1.1 mrg })
2159 1.1 mrg
2160 1.1 mrg (define_insn "ssabssi2"
2161 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
2162 1.1 mrg (ss_abs:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
2163 1.1 mrg ""
2164 1.1 mrg "%|%.\\tabs\\t%$\\t%1, %0"
2165 1.1 mrg [(set_attr "units" "l")
2166 1.1 mrg (set_attr "cross" "n,y,n,y")])
2167 1.1 mrg
2168 1.1 mrg ;; -------------------------------------------------------------------------
2169 1.1 mrg ;; Shift instructions
2170 1.1 mrg ;; -------------------------------------------------------------------------
2171 1.1 mrg
2172 1.1 mrg (define_code_iterator any_shift [ss_ashift ashift ashiftrt lshiftrt])
2173 1.1 mrg (define_code_iterator any_rshift [ashiftrt lshiftrt])
2174 1.1 mrg (define_code_attr shift_code [(ss_ashift "ss_ashl") (ashift "ashl")
2175 1.1 mrg (ashiftrt "ashr") (lshiftrt "lshr")])
2176 1.1 mrg (define_code_attr shift_insn [(ss_ashift "sshl") (ashift "shl")
2177 1.1 mrg (ashiftrt "shr") (lshiftrt "shru")])
2178 1.1 mrg
2179 1.1 mrg (define_insn "<shift_code>si3"
2180 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
2181 1.1 mrg (any_shift:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
2182 1.1 mrg (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))]
2183 1.1 mrg ""
2184 1.1 mrg "%|%.\\t<shift_insn>\\t%$\\t%1, %2, %0"
2185 1.1 mrg [(set_attr "units" "s")
2186 1.1 mrg (set_attr "cross" "n,n,y,y")])
2187 1.1 mrg
2188 1.1 mrg ;; See c6x-mult.md.in for the rotlsi3 pattern.
2189 1.1 mrg
2190 1.1 mrg (define_insn "rotrdi3_16"
2191 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=a,b")
2192 1.1 mrg (rotatert:DI (match_operand:DI 1 "register_operand" "a,b")
2193 1.1 mrg (const_int 16)))]
2194 1.1 mrg "TARGET_INSNS_64PLUS"
2195 1.1 mrg "%|%.\\tdpackx2\\t%$\\t%P1, %p1, %0"
2196 1.1 mrg [(set_attr "units" "l")
2197 1.1 mrg (set_attr "cross" "n")])
2198 1.1 mrg
2199 1.1 mrg (define_insn "shlmbsi3"
2200 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
2201 1.1 mrg (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
2202 1.1 mrg (const_int 8))
2203 1.1 mrg (lshiftrt:SI (match_operand:SI 2 "register_operand" "a,b,a,b")
2204 1.1 mrg (const_int 24))))]
2205 1.1 mrg "TARGET_INSNS_64"
2206 1.1 mrg "%|%.\\tshlmb\\t%$\\t%2, %1, %0"
2207 1.1 mrg [(set_attr "units" "ls")
2208 1.1 mrg (set_attr "cross" "n,n,y,y")])
2209 1.1 mrg
2210 1.1 mrg (define_expand "ashldi3"
2211 1.1 mrg [(set (match_operand:DI 0 "register_operand" "")
2212 1.1 mrg (ashift:DI (match_operand:DI 1 "register_operand" "")
2213 1.1 mrg (match_operand:SI 2 "const_int_operand" "")))]
2214 1.1 mrg "TARGET_INSNS_64"
2215 1.1 mrg {
2216 1.1 mrg if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 8)
2217 1.1 mrg {
2218 1.1 mrg rtx lo0, lo1, hi0, hi1, tmp;
2219 1.1 mrg lo0 = gen_lowpart (SImode, operands[0]);
2220 1.1 mrg hi0 = gen_highpart (SImode, operands[0]);
2221 1.1 mrg lo1 = gen_lowpart (SImode, operands[1]);
2222 1.1 mrg hi1 = gen_highpart (SImode, operands[1]);
2223 1.1 mrg if (reg_overlap_mentioned_p (hi0, lo1))
2224 1.1 mrg tmp = gen_reg_rtx (SImode);
2225 1.1 mrg else
2226 1.1 mrg tmp = hi0;
2227 1.1 mrg emit_insn (gen_shlmbsi3 (tmp, hi1, lo1));
2228 1.1 mrg emit_insn (gen_ashlsi3 (lo0, lo1, operands[2]));
2229 1.1 mrg if (tmp != hi0)
2230 1.1 mrg emit_move_insn (hi0, tmp);
2231 1.1 mrg DONE;
2232 1.1 mrg }
2233 1.1 mrg FAIL;
2234 1.1 mrg })
2235 1.1 mrg
2236 1.1 mrg (define_expand "rotrdi3"
2237 1.1 mrg [(set (match_operand:DI 0 "register_operand" "")
2238 1.1 mrg (rotatert:DI (match_operand:DI 1 "register_operand" "")
2239 1.1 mrg (match_operand:SI 2 "const_int_operand" "")))]
2240 1.1 mrg "TARGET_INSNS_64PLUS"
2241 1.1 mrg {
2242 1.1 mrg if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 16)
2243 1.1 mrg {
2244 1.1 mrg emit_insn (gen_rotrdi3_16 (operands[0], operands[1]));
2245 1.1 mrg DONE;
2246 1.1 mrg }
2247 1.1 mrg FAIL;
2248 1.1 mrg })
2249 1.1 mrg
2250 1.1 mrg (define_insn "bswapv2hi2"
2251 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
2252 1.1 mrg (bswap:V2HI (match_operand:V2HI 1 "register_operand" "a,b,?b,?a")))]
2253 1.1 mrg "TARGET_INSNS_64"
2254 1.1 mrg "%|%.\\tswap4\\t%$\\t%1, %0"
2255 1.1 mrg [(set_attr "units" "l")
2256 1.1 mrg (set_attr "cross" "n,n,y,y")])
2257 1.1 mrg
2258 1.1 mrg (define_expand "bswapsi2"
2259 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2260 1.1 mrg (bswap:SI (match_operand:SI 1 "register_operand" "")))]
2261 1.1 mrg "TARGET_INSNS_64"
2262 1.1 mrg {
2263 1.1 mrg rtx tmpreg = gen_reg_rtx (SImode);
2264 1.1 mrg rtx tmpv2 = gen_lowpart (V2HImode, tmpreg);
2265 1.1 mrg rtx op0v2 = gen_lowpart (V2HImode, operands[0]);
2266 1.1 mrg emit_insn (gen_rotlsi3 (tmpreg, operands[1], GEN_INT (16)));
2267 1.1 mrg emit_insn (gen_bswapv2hi2 (op0v2, tmpv2));
2268 1.1 mrg DONE;
2269 1.1 mrg })
2270 1.1 mrg
2271 1.1 mrg ;; -------------------------------------------------------------------------
2272 1.1 mrg ;; Division
2273 1.1 mrg ;; -------------------------------------------------------------------------
2274 1.1 mrg
2275 1.1 mrg (define_insn "divsi3_insn"
2276 1.1 mrg [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2277 1.1 mrg (clobber (reg:SI REG_A0))
2278 1.1 mrg (clobber (reg:SI REG_A1))
2279 1.1 mrg (clobber (reg:SI REG_A2))
2280 1.1 mrg (clobber (reg:SI REG_A6))
2281 1.1 mrg (clobber (reg:SI REG_B0))
2282 1.1 mrg (clobber (reg:SI REG_B1))
2283 1.1 mrg (clobber (reg:SI REG_B2))
2284 1.1 mrg (clobber (reg:SI REG_B3))
2285 1.1 mrg (clobber (reg:SI REG_B4))
2286 1.1 mrg (clobber (reg:SI REG_B5))
2287 1.1 mrg (clobber (reg:SI REG_B30))
2288 1.1 mrg (clobber (reg:SI REG_B31))]
2289 1.1 mrg ""
2290 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_divi"
2291 1.1 mrg [(set_attr "type" "call")
2292 1.1 mrg (set_attr "dest_regfile" "any")
2293 1.1 mrg (set_attr "units" "s")
2294 1.1 mrg (set_attr "cross" "n")])
2295 1.1 mrg
2296 1.1 mrg (define_insn "divsi3_insn_indcall"
2297 1.1 mrg [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2298 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2299 1.1 mrg (clobber (reg:SI REG_A0))
2300 1.1 mrg (clobber (reg:SI REG_A1))
2301 1.1 mrg (clobber (reg:SI REG_A2))
2302 1.1 mrg (clobber (reg:SI REG_A6))
2303 1.1 mrg (clobber (reg:SI REG_B0))
2304 1.1 mrg (clobber (reg:SI REG_B1))
2305 1.1 mrg (clobber (reg:SI REG_B2))
2306 1.1 mrg (clobber (reg:SI REG_B3))
2307 1.1 mrg (clobber (reg:SI REG_B4))
2308 1.1 mrg (clobber (reg:SI REG_B5))
2309 1.1 mrg (clobber (reg:SI REG_B30))
2310 1.1 mrg (clobber (reg:SI REG_B31))]
2311 1.1 mrg ""
2312 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2313 1.1 mrg [(set_attr "type" "call")
2314 1.1 mrg (set_attr "dest_regfile" "any")
2315 1.1 mrg (set_attr "units" "s")
2316 1.1 mrg (set_attr "cross" "n")])
2317 1.1 mrg
2318 1.1 mrg (define_insn "udivsi3_insn"
2319 1.1 mrg [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2320 1.1 mrg (clobber (reg:SI REG_A0))
2321 1.1 mrg (clobber (reg:SI REG_A1))
2322 1.1 mrg (clobber (reg:SI REG_A2))
2323 1.1 mrg (clobber (reg:SI REG_A6))
2324 1.1 mrg (clobber (reg:SI REG_B0))
2325 1.1 mrg (clobber (reg:SI REG_B1))
2326 1.1 mrg (clobber (reg:SI REG_B2))
2327 1.1 mrg (clobber (reg:SI REG_B3))
2328 1.1 mrg (clobber (reg:SI REG_B4))
2329 1.1 mrg (clobber (reg:SI REG_B30))
2330 1.1 mrg (clobber (reg:SI REG_B31))]
2331 1.1 mrg ""
2332 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_divu"
2333 1.1 mrg [(set_attr "type" "call")
2334 1.1 mrg (set_attr "dest_regfile" "any")
2335 1.1 mrg (set_attr "units" "s")
2336 1.1 mrg (set_attr "cross" "n")])
2337 1.1 mrg
2338 1.1 mrg (define_insn "udivsi3_insn_indcall"
2339 1.1 mrg [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2340 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2341 1.1 mrg (clobber (reg:SI REG_A0))
2342 1.1 mrg (clobber (reg:SI REG_A1))
2343 1.1 mrg (clobber (reg:SI REG_A2))
2344 1.1 mrg (clobber (reg:SI REG_A6))
2345 1.1 mrg (clobber (reg:SI REG_B0))
2346 1.1 mrg (clobber (reg:SI REG_B1))
2347 1.1 mrg (clobber (reg:SI REG_B2))
2348 1.1 mrg (clobber (reg:SI REG_B3))
2349 1.1 mrg (clobber (reg:SI REG_B4))
2350 1.1 mrg (clobber (reg:SI REG_B30))
2351 1.1 mrg (clobber (reg:SI REG_B31))]
2352 1.1 mrg ""
2353 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2354 1.1 mrg [(set_attr "type" "call")
2355 1.1 mrg (set_attr "dest_regfile" "any")
2356 1.1 mrg (set_attr "units" "s")
2357 1.1 mrg (set_attr "cross" "n")])
2358 1.1 mrg
2359 1.1 mrg (define_insn "modsi3_insn"
2360 1.1 mrg [(set (reg:SI REG_A4) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2361 1.1 mrg (clobber (reg:SI REG_A1))
2362 1.1 mrg (clobber (reg:SI REG_A2))
2363 1.1 mrg (clobber (reg:SI REG_A5))
2364 1.1 mrg (clobber (reg:SI REG_A6))
2365 1.1 mrg (clobber (reg:SI REG_B0))
2366 1.1 mrg (clobber (reg:SI REG_B1))
2367 1.1 mrg (clobber (reg:SI REG_B2))
2368 1.1 mrg (clobber (reg:SI REG_B3))
2369 1.1 mrg (clobber (reg:SI REG_B4))
2370 1.1 mrg (clobber (reg:SI REG_B30))
2371 1.1 mrg (clobber (reg:SI REG_B31))]
2372 1.1 mrg ""
2373 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_remi"
2374 1.1 mrg [(set_attr "type" "call")
2375 1.1 mrg (set_attr "dest_regfile" "any")
2376 1.1 mrg (set_attr "units" "s")
2377 1.1 mrg (set_attr "cross" "n")])
2378 1.1 mrg
2379 1.1 mrg (define_insn "modsi3_insn_indcall"
2380 1.1 mrg [(set (reg:SI REG_A4) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2381 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2382 1.1 mrg (clobber (reg:SI REG_A1))
2383 1.1 mrg (clobber (reg:SI REG_A2))
2384 1.1 mrg (clobber (reg:SI REG_A5))
2385 1.1 mrg (clobber (reg:SI REG_A6))
2386 1.1 mrg (clobber (reg:SI REG_B0))
2387 1.1 mrg (clobber (reg:SI REG_B1))
2388 1.1 mrg (clobber (reg:SI REG_B2))
2389 1.1 mrg (clobber (reg:SI REG_B3))
2390 1.1 mrg (clobber (reg:SI REG_B4))
2391 1.1 mrg (clobber (reg:SI REG_B30))
2392 1.1 mrg (clobber (reg:SI REG_B31))]
2393 1.1 mrg ""
2394 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2395 1.1 mrg [(set_attr "type" "call")
2396 1.1 mrg (set_attr "dest_regfile" "any")
2397 1.1 mrg (set_attr "units" "s")
2398 1.1 mrg (set_attr "cross" "n")])
2399 1.1 mrg
2400 1.1 mrg (define_insn "divmodsi4_insn"
2401 1.1 mrg [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2402 1.1 mrg (set (reg:SI REG_A5) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2403 1.1 mrg (clobber (reg:SI REG_A1))
2404 1.1 mrg (clobber (reg:SI REG_A2))
2405 1.1 mrg (clobber (reg:SI REG_A6))
2406 1.1 mrg (clobber (reg:SI REG_B0))
2407 1.1 mrg (clobber (reg:SI REG_B1))
2408 1.1 mrg (clobber (reg:SI REG_B2))
2409 1.1 mrg (clobber (reg:SI REG_B3))
2410 1.1 mrg (clobber (reg:SI REG_B4))
2411 1.1 mrg (clobber (reg:SI REG_B30))
2412 1.1 mrg (clobber (reg:SI REG_B31))]
2413 1.1 mrg ""
2414 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_divremi"
2415 1.1 mrg [(set_attr "type" "call")
2416 1.1 mrg (set_attr "dest_regfile" "any")
2417 1.1 mrg (set_attr "units" "s")
2418 1.1 mrg (set_attr "cross" "n")])
2419 1.1 mrg
2420 1.1 mrg (define_insn "divmodsi4_insn_indcall"
2421 1.1 mrg [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2422 1.1 mrg (set (reg:SI REG_A5) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2423 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2424 1.1 mrg (clobber (reg:SI REG_A1))
2425 1.1 mrg (clobber (reg:SI REG_A2))
2426 1.1 mrg (clobber (reg:SI REG_A5))
2427 1.1 mrg (clobber (reg:SI REG_A6))
2428 1.1 mrg (clobber (reg:SI REG_B0))
2429 1.1 mrg (clobber (reg:SI REG_B1))
2430 1.1 mrg (clobber (reg:SI REG_B2))
2431 1.1 mrg (clobber (reg:SI REG_B3))
2432 1.1 mrg (clobber (reg:SI REG_B4))
2433 1.1 mrg (clobber (reg:SI REG_B30))
2434 1.1 mrg (clobber (reg:SI REG_B31))]
2435 1.1 mrg ""
2436 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2437 1.1 mrg [(set_attr "type" "call")
2438 1.1 mrg (set_attr "dest_regfile" "any")
2439 1.1 mrg (set_attr "units" "s")
2440 1.1 mrg (set_attr "cross" "n")])
2441 1.1 mrg
2442 1.1 mrg (define_insn "umodsi3_insn"
2443 1.1 mrg [(set (reg:SI REG_A4) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2444 1.1 mrg (clobber (reg:SI REG_A1))
2445 1.1 mrg (clobber (reg:SI REG_A5))
2446 1.1 mrg (clobber (reg:SI REG_A7))
2447 1.1 mrg (clobber (reg:SI REG_B0))
2448 1.1 mrg (clobber (reg:SI REG_B1))
2449 1.1 mrg (clobber (reg:SI REG_B2))
2450 1.1 mrg (clobber (reg:SI REG_B3))
2451 1.1 mrg (clobber (reg:SI REG_B4))
2452 1.1 mrg (clobber (reg:SI REG_B30))
2453 1.1 mrg (clobber (reg:SI REG_B31))]
2454 1.1 mrg ""
2455 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_remu"
2456 1.1 mrg [(set_attr "type" "call")
2457 1.1 mrg (set_attr "dest_regfile" "any")
2458 1.1 mrg (set_attr "units" "s")
2459 1.1 mrg (set_attr "cross" "n")])
2460 1.1 mrg
2461 1.1 mrg (define_insn "umodsi3_insn_indcall"
2462 1.1 mrg [(set (reg:SI REG_A4) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2463 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2464 1.1 mrg (clobber (reg:SI REG_A1))
2465 1.1 mrg (clobber (reg:SI REG_A5))
2466 1.1 mrg (clobber (reg:SI REG_A7))
2467 1.1 mrg (clobber (reg:SI REG_B0))
2468 1.1 mrg (clobber (reg:SI REG_B1))
2469 1.1 mrg (clobber (reg:SI REG_B2))
2470 1.1 mrg (clobber (reg:SI REG_B3))
2471 1.1 mrg (clobber (reg:SI REG_B4))
2472 1.1 mrg (clobber (reg:SI REG_B30))
2473 1.1 mrg (clobber (reg:SI REG_B31))]
2474 1.1 mrg ""
2475 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2476 1.1 mrg [(set_attr "type" "call")
2477 1.1 mrg (set_attr "dest_regfile" "any")
2478 1.1 mrg (set_attr "units" "s")
2479 1.1 mrg (set_attr "cross" "n")])
2480 1.1 mrg
2481 1.1 mrg (define_insn "udivmodsi4_insn"
2482 1.1 mrg [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2483 1.1 mrg (set (reg:SI REG_A5) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2484 1.1 mrg (clobber (reg:SI REG_A0))
2485 1.1 mrg (clobber (reg:SI REG_A1))
2486 1.1 mrg (clobber (reg:SI REG_A2))
2487 1.1 mrg (clobber (reg:SI REG_A6))
2488 1.1 mrg (clobber (reg:SI REG_B0))
2489 1.1 mrg (clobber (reg:SI REG_B1))
2490 1.1 mrg (clobber (reg:SI REG_B2))
2491 1.1 mrg (clobber (reg:SI REG_B3))
2492 1.1 mrg (clobber (reg:SI REG_B4))
2493 1.1 mrg (clobber (reg:SI REG_B30))
2494 1.1 mrg (clobber (reg:SI REG_B31))]
2495 1.1 mrg ""
2496 1.1 mrg "%|%.\\tcall\\t%$\\t__c6xabi_divremu"
2497 1.1 mrg [(set_attr "type" "call")
2498 1.1 mrg (set_attr "dest_regfile" "any")
2499 1.1 mrg (set_attr "units" "s")
2500 1.1 mrg (set_attr "cross" "n")])
2501 1.1 mrg
2502 1.1 mrg (define_insn "udivmodsi4_insn_indcall"
2503 1.1 mrg [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2504 1.1 mrg (set (reg:SI REG_A5) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
2505 1.1 mrg (use (match_operand:SI 0 "register_operand" "b"))
2506 1.1 mrg (clobber (reg:SI REG_A0))
2507 1.1 mrg (clobber (reg:SI REG_A1))
2508 1.1 mrg (clobber (reg:SI REG_A2))
2509 1.1 mrg (clobber (reg:SI REG_A6))
2510 1.1 mrg (clobber (reg:SI REG_B0))
2511 1.1 mrg (clobber (reg:SI REG_B1))
2512 1.1 mrg (clobber (reg:SI REG_B2))
2513 1.1 mrg (clobber (reg:SI REG_B3))
2514 1.1 mrg (clobber (reg:SI REG_B4))
2515 1.1 mrg (clobber (reg:SI REG_B30))
2516 1.1 mrg (clobber (reg:SI REG_B31))]
2517 1.1 mrg ""
2518 1.1 mrg "%|%.\\tcall\\t%$\\t%0"
2519 1.1 mrg [(set_attr "type" "call")
2520 1.1 mrg (set_attr "dest_regfile" "any")
2521 1.1 mrg (set_attr "units" "s")
2522 1.1 mrg (set_attr "cross" "n")])
2523 1.1 mrg
2524 1.1 mrg (define_insn_and_split "divmodsi4"
2525 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2526 1.1 mrg (div:SI (match_operand:SI 1 "register_operand" "")
2527 1.1 mrg (match_operand:SI 2 "register_operand" "")))
2528 1.1 mrg (set (match_operand:SI 3 "register_operand" "")
2529 1.1 mrg (mod:SI (match_dup 1) (match_dup 2)))
2530 1.1 mrg (clobber (reg:SI REG_A0))
2531 1.1 mrg (clobber (reg:SI REG_A1))
2532 1.1 mrg (clobber (reg:SI REG_A2))
2533 1.1 mrg (clobber (reg:SI REG_A4))
2534 1.1 mrg (clobber (reg:SI REG_A5))
2535 1.1 mrg (clobber (reg:SI REG_A6))
2536 1.1 mrg (clobber (reg:SI REG_B0))
2537 1.1 mrg (clobber (reg:SI REG_B1))
2538 1.1 mrg (clobber (reg:SI REG_B2))
2539 1.1 mrg (clobber (reg:SI REG_B3))
2540 1.1 mrg (clobber (reg:SI REG_B4))
2541 1.1 mrg (clobber (reg:SI REG_B5))
2542 1.1 mrg (clobber (reg:SI REG_B30))
2543 1.1 mrg (clobber (reg:SI REG_B31))]
2544 1.1 mrg ""
2545 1.1 mrg "#"
2546 1.1 mrg ""
2547 1.1 mrg [(const_int 0)]
2548 1.1 mrg {
2549 1.1 mrg rtx reg = NULL_RTX;
2550 1.1 mrg
2551 1.1 mrg if (TARGET_LONG_CALLS)
2552 1.1 mrg {
2553 1.1 mrg if (reload_completed)
2554 1.1 mrg reg = gen_rtx_REG (SImode, REG_A6);
2555 1.1 mrg else
2556 1.1 mrg reg = gen_reg_rtx (SImode);
2557 1.1 mrg }
2558 1.1 mrg emit_move_insn (gen_rtx_REG (SImode, REG_A4), operands[1]);
2559 1.1 mrg emit_move_insn (gen_rtx_REG (SImode, REG_B4), operands[2]);
2560 1.1 mrg if (find_reg_note (curr_insn, REG_UNUSED, operands[3]))
2561 1.1 mrg {
2562 1.1 mrg if (TARGET_LONG_CALLS)
2563 1.1 mrg {
2564 1.1 mrg emit_move_insn (reg, optab_libfunc (sdiv_optab, SImode));
2565 1.1 mrg emit_insn (gen_divsi3_insn_indcall (reg));
2566 1.1 mrg }
2567 1.1 mrg else
2568 1.1 mrg emit_insn (gen_divsi3_insn ());
2569 1.1 mrg emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
2570 1.1 mrg }
2571 1.1 mrg else if (find_reg_note (curr_insn, REG_UNUSED, operands[0]))
2572 1.1 mrg {
2573 1.1 mrg if (TARGET_LONG_CALLS)
2574 1.1 mrg {
2575 1.1 mrg emit_move_insn (reg, optab_libfunc (smod_optab, SImode));
2576 1.1 mrg emit_insn (gen_modsi3_insn_indcall (reg));
2577 1.1 mrg }
2578 1.1 mrg else
2579 1.1 mrg emit_insn (gen_modsi3_insn ());
2580 1.1 mrg emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A4));
2581 1.1 mrg }
2582 1.1 mrg else
2583 1.1 mrg {
2584 1.1 mrg if (TARGET_LONG_CALLS)
2585 1.1 mrg {
2586 1.1 mrg emit_move_insn (reg, optab_libfunc (sdivmod_optab, SImode));
2587 1.1 mrg emit_insn (gen_divmodsi4_insn_indcall (reg));
2588 1.1 mrg }
2589 1.1 mrg else
2590 1.1 mrg emit_insn (gen_divmodsi4_insn ());
2591 1.1 mrg emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
2592 1.1 mrg emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A5));
2593 1.1 mrg }
2594 1.1 mrg DONE;
2595 1.1 mrg })
2596 1.1 mrg
2597 1.1 mrg (define_insn_and_split "udivmodsi4"
2598 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2599 1.1 mrg (udiv:SI (match_operand:SI 1 "register_operand" "")
2600 1.1 mrg (match_operand:SI 2 "register_operand" "")))
2601 1.1 mrg (set (match_operand:SI 3 "register_operand" "")
2602 1.1 mrg (umod:SI (match_dup 1) (match_dup 2)))
2603 1.1 mrg (clobber (reg:SI REG_A0))
2604 1.1 mrg (clobber (reg:SI REG_A1))
2605 1.1 mrg (clobber (reg:SI REG_A2))
2606 1.1 mrg (clobber (reg:SI REG_A4))
2607 1.1 mrg (clobber (reg:SI REG_A5))
2608 1.1 mrg (clobber (reg:SI REG_A6))
2609 1.1 mrg (clobber (reg:SI REG_A7))
2610 1.1 mrg (clobber (reg:SI REG_B0))
2611 1.1 mrg (clobber (reg:SI REG_B1))
2612 1.1 mrg (clobber (reg:SI REG_B2))
2613 1.1 mrg (clobber (reg:SI REG_B3))
2614 1.1 mrg (clobber (reg:SI REG_B4))
2615 1.1 mrg (clobber (reg:SI REG_B30))
2616 1.1 mrg (clobber (reg:SI REG_B31))]
2617 1.1 mrg ""
2618 1.1 mrg "#"
2619 1.1 mrg ""
2620 1.1 mrg [(const_int 0)]
2621 1.1 mrg {
2622 1.1 mrg rtx reg = NULL_RTX;
2623 1.1 mrg
2624 1.1 mrg if (TARGET_LONG_CALLS)
2625 1.1 mrg {
2626 1.1 mrg if (reload_completed)
2627 1.1 mrg reg = gen_rtx_REG (SImode, REG_A6);
2628 1.1 mrg else
2629 1.1 mrg reg = gen_reg_rtx (SImode);
2630 1.1 mrg }
2631 1.1 mrg
2632 1.1 mrg emit_move_insn (gen_rtx_REG (SImode, REG_A4), operands[1]);
2633 1.1 mrg emit_move_insn (gen_rtx_REG (SImode, REG_B4), operands[2]);
2634 1.1 mrg if (find_reg_note (curr_insn, REG_UNUSED, operands[3]))
2635 1.1 mrg {
2636 1.1 mrg if (TARGET_LONG_CALLS)
2637 1.1 mrg {
2638 1.1 mrg emit_move_insn (reg, optab_libfunc (udiv_optab, SImode));
2639 1.1 mrg emit_insn (gen_udivsi3_insn_indcall (reg));
2640 1.1 mrg }
2641 1.1 mrg else
2642 1.1 mrg emit_insn (gen_udivsi3_insn ());
2643 1.1 mrg emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
2644 1.1 mrg }
2645 1.1 mrg else if (find_reg_note (curr_insn, REG_UNUSED, operands[0]))
2646 1.1 mrg {
2647 1.1 mrg if (TARGET_LONG_CALLS)
2648 1.1 mrg {
2649 1.1 mrg emit_move_insn (reg, optab_libfunc (umod_optab, SImode));
2650 1.1 mrg emit_insn (gen_umodsi3_insn_indcall (reg));
2651 1.1 mrg }
2652 1.1 mrg else
2653 1.1 mrg emit_insn (gen_umodsi3_insn ());
2654 1.1 mrg emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A4));
2655 1.1 mrg }
2656 1.1 mrg else
2657 1.1 mrg {
2658 1.1 mrg if (TARGET_LONG_CALLS)
2659 1.1 mrg {
2660 1.1 mrg emit_move_insn (reg, optab_libfunc (udivmod_optab, SImode));
2661 1.1 mrg emit_insn (gen_udivmodsi4_insn_indcall (reg));
2662 1.1 mrg }
2663 1.1 mrg else
2664 1.1 mrg emit_insn (gen_udivmodsi4_insn ());
2665 1.1 mrg emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
2666 1.1 mrg emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A5));
2667 1.1 mrg }
2668 1.1 mrg DONE;
2669 1.1 mrg })
2670 1.1 mrg
2671 1.1 mrg ;; -------------------------------------------------------------------------
2672 1.1 mrg ;; Multiplication
2673 1.1 mrg ;; See c6x-mult.md.in for define_insn patterns.
2674 1.1 mrg ;; -------------------------------------------------------------------------
2675 1.1 mrg
2676 1.1 mrg (define_expand "mulhisi3"
2677 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2678 1.1 mrg (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" ""))
2679 1.1 mrg (sign_extend:SI (match_operand:HI 2 "reg_or_scst5_operand" ""))))]
2680 1.1 mrg ""
2681 1.1 mrg {
2682 1.1 mrg if (CONSTANT_P (operands[2]))
2683 1.1 mrg {
2684 1.1 mrg emit_insn (gen_mulhisi3_const (operands[0], operands[1], operands[2]));
2685 1.1 mrg DONE;
2686 1.1 mrg }
2687 1.1 mrg })
2688 1.1 mrg
2689 1.1 mrg (define_expand "usmulhisi3"
2690 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2691 1.1 mrg (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" ""))
2692 1.1 mrg (sign_extend:SI (match_operand:HI 2 "reg_or_scst5_operand" ""))))]
2693 1.1 mrg ""
2694 1.1 mrg {
2695 1.1 mrg if (CONSTANT_P (operands[2]))
2696 1.1 mrg {
2697 1.1 mrg emit_insn (gen_usmulhisi3_const (operands[0], operands[1], operands[2]));
2698 1.1 mrg DONE;
2699 1.1 mrg }
2700 1.1 mrg })
2701 1.1 mrg
2702 1.1 mrg (define_expand "mulsi3"
2703 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2704 1.1 mrg (mult:SI (match_operand:SI 1 "register_operand" "")
2705 1.1 mrg (match_operand:SI 2 "register_operand" "")))]
2706 1.1 mrg ""
2707 1.1 mrg {
2708 1.1 mrg if (!TARGET_MPY32)
2709 1.1 mrg {
2710 1.1 mrg rtx lo1 = gen_lowpart (HImode, operands[1]);
2711 1.1 mrg rtx lo2 = gen_lowpart (HImode, operands[2]);
2712 1.1 mrg /* (N * AH + AL) * (N * BH + BL)
2713 1.1 mrg = N*(AH * BL + BH * AL) + AL*BL */
2714 1.1 mrg rtx tmp1 = gen_reg_rtx (SImode);
2715 1.1 mrg rtx tmp2 = gen_reg_rtx (SImode);
2716 1.1 mrg rtx tmp3 = gen_reg_rtx (SImode);
2717 1.1 mrg emit_insn (gen_umulhisi3 (tmp1, lo1, lo2));
2718 1.1 mrg emit_insn (gen_umulhisi3_lh (tmp2, lo1, operands[2]));
2719 1.1 mrg emit_insn (gen_umulhisi3_hl (tmp3, operands[1], lo2));
2720 1.1 mrg emit_insn (gen_addsi3 (tmp2, tmp2, tmp3));
2721 1.1 mrg emit_insn (gen_ashlsi3 (tmp2, tmp2, GEN_INT (16)));
2722 1.1 mrg emit_insn (gen_addsi3 (operands[0], tmp1, tmp2));
2723 1.1 mrg DONE;
2724 1.1 mrg }
2725 1.1 mrg })
2726 1.1 mrg
2727 1.1 mrg ;; -------------------------------------------------------------------------
2728 1.1 mrg ;; Floating point multiplication
2729 1.1 mrg ;; -------------------------------------------------------------------------
2730 1.1 mrg
2731 1.1 mrg (define_insn "mulsf3"
2732 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
2733 1.1 mrg (mult:SF (match_operand:SF 1 "register_operand" "%a,b,?a,?b")
2734 1.1 mrg (match_operand:SF 2 "register_operand" "a,b,b,a")))]
2735 1.1 mrg "TARGET_FP"
2736 1.1 mrg "%|%.\\tmpysp\\t%$\\t%1, %2, %0"
2737 1.1 mrg [(set_attr "type" "mpy4")
2738 1.1 mrg (set_attr "units" "m")
2739 1.1 mrg (set_attr "cross" "n,n,y,y")])
2740 1.1 mrg
2741 1.1 mrg (define_insn "muldf3"
2742 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b")
2743 1.1 mrg (mult:DF (match_operand:DF 1 "register_operand" "%a,b")
2744 1.1 mrg (match_operand:DF 2 "register_operand" "a,b")))]
2745 1.1 mrg "TARGET_FP"
2746 1.1 mrg "%|%.\\tmpydp\\t%$\\t%1, %2, %0"
2747 1.1 mrg [(set_attr "type" "mpydp")
2748 1.1 mrg (set_attr "units" "m")
2749 1.1 mrg (set_attr "cross" "n")])
2750 1.1 mrg
2751 1.1 mrg ;; Note that mpyspdp and mpysp2dp are available on C67x, despite what the
2752 1.1 mrg ;; manual says.
2753 1.1 mrg (define_insn "*muldf_ext1"
2754 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
2755 1.1 mrg (mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "a,b,a,b"))
2756 1.1 mrg (match_operand:DF 2 "register_operand" "a,b,?b,?a")))]
2757 1.1 mrg "TARGET_FP_EXT"
2758 1.1 mrg "%|%.\\tmpyspdp\\t%$\\t%1, %2, %0"
2759 1.1 mrg [(set_attr "type" "mpyspdp")
2760 1.1 mrg (set_attr "units" "m")
2761 1.1 mrg (set_attr "cross" "n,n,y,y")])
2762 1.1 mrg
2763 1.1 mrg (define_insn "*muldf_ext2"
2764 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
2765 1.1 mrg (mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "%a,b,a,b"))
2766 1.1 mrg (float_extend:DF (match_operand:SF 2 "register_operand" "a,b,?b,?a"))))]
2767 1.1 mrg "TARGET_FP_EXT"
2768 1.1 mrg "%|%.\\tmpysp2dp\\t%$\\t%1, %2, %0"
2769 1.1 mrg [(set_attr "type" "mpysp2dp")
2770 1.1 mrg (set_attr "units" "m")
2771 1.1 mrg (set_attr "cross" "n,n,y,y")])
2772 1.1 mrg
2773 1.1 mrg ;; -------------------------------------------------------------------------
2774 1.1 mrg ;; Floating point division
2775 1.1 mrg ;; -------------------------------------------------------------------------
2776 1.1 mrg
2777 1.1 mrg (define_insn "rcpsf2"
2778 1.1 mrg [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
2779 1.1 mrg (unspec:SF [(match_operand:SF 1 "register_operand" "a,b,?b,?a")]
2780 1.1 mrg UNSPEC_RCP))]
2781 1.1 mrg "TARGET_FP"
2782 1.1 mrg "%|%.\\trcpsp\\t%$\\t%1, %0"
2783 1.1 mrg [(set_attr "units" "s")
2784 1.1 mrg (set_attr "cross" "n,n,y,y")])
2785 1.1 mrg
2786 1.1 mrg (define_insn "rcpdf2"
2787 1.1 mrg [(set (match_operand:DF 0 "register_operand" "=a,b")
2788 1.1 mrg (unspec:DF [(match_operand:DF 1 "register_operand" "a,b")]
2789 1.1 mrg UNSPEC_RCP))]
2790 1.1 mrg "TARGET_FP"
2791 1.1 mrg "%|%.\\trcpdp\\t%$\\t%1, %0"
2792 1.1 mrg [(set_attr "type" "dp2")
2793 1.1 mrg (set_attr "units" "s")
2794 1.1 mrg (set_attr "cross" "n")])
2795 1.1 mrg
2796 1.1 mrg (define_expand "divsf3"
2797 1.1 mrg [(set (match_dup 4)
2798 1.1 mrg (unspec:SF [(match_operand:SF 2 "register_operand" "")]
2799 1.1 mrg UNSPEC_RCP))
2800 1.1 mrg (set (match_dup 5) (mult:SF (match_dup 2) (match_dup 4)))
2801 1.1 mrg (set (match_dup 6) (minus:SF (match_dup 3) (match_dup 5)))
2802 1.1 mrg (set (match_dup 4) (mult:SF (match_dup 4) (match_dup 6)))
2803 1.1 mrg (set (match_dup 5) (mult:SF (match_dup 2) (match_dup 4)))
2804 1.1 mrg (set (match_dup 6) (minus:SF (match_dup 3) (match_dup 5)))
2805 1.1 mrg (set (match_dup 4) (mult:SF (match_dup 4) (match_dup 6)))
2806 1.1 mrg (set (match_operand:SF 0 "register_operand" "")
2807 1.1 mrg (mult:SF (match_operand:SF 1 "register_operand")
2808 1.1 mrg (match_dup 4)))]
2809 1.1 mrg "TARGET_FP && flag_reciprocal_math"
2810 1.1 mrg {
2811 1.1 mrg operands[3] = force_reg (SFmode,
2812 1.4 mrg const_double_from_real_value (dconst2, SFmode));
2813 1.1 mrg operands[4] = gen_reg_rtx (SFmode);
2814 1.1 mrg operands[5] = gen_reg_rtx (SFmode);
2815 1.1 mrg operands[6] = gen_reg_rtx (SFmode);
2816 1.1 mrg })
2817 1.1 mrg
2818 1.1 mrg (define_expand "divdf3"
2819 1.1 mrg [(set (match_dup 4)
2820 1.1 mrg (unspec:DF [(match_operand:DF 2 "register_operand" "")]
2821 1.1 mrg UNSPEC_RCP))
2822 1.1 mrg (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
2823 1.1 mrg (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
2824 1.1 mrg (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
2825 1.1 mrg (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
2826 1.1 mrg (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
2827 1.1 mrg (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
2828 1.1 mrg (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
2829 1.1 mrg (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
2830 1.1 mrg (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
2831 1.1 mrg (set (match_operand:DF 0 "register_operand" "")
2832 1.1 mrg (mult:DF (match_operand:DF 1 "register_operand")
2833 1.1 mrg (match_dup 4)))]
2834 1.1 mrg "TARGET_FP && flag_reciprocal_math"
2835 1.1 mrg {
2836 1.1 mrg operands[3] = force_reg (DFmode,
2837 1.4 mrg const_double_from_real_value (dconst2, DFmode));
2838 1.1 mrg operands[4] = gen_reg_rtx (DFmode);
2839 1.1 mrg operands[5] = gen_reg_rtx (DFmode);
2840 1.1 mrg operands[6] = gen_reg_rtx (DFmode);
2841 1.1 mrg })
2842 1.1 mrg
2843 1.1 mrg ;; -------------------------------------------------------------------------
2844 1.1 mrg ;; Block moves
2845 1.1 mrg ;; -------------------------------------------------------------------------
2846 1.1 mrg
2847 1.9 mrg (define_expand "cpymemsi"
2848 1.1 mrg [(use (match_operand:BLK 0 "memory_operand" ""))
2849 1.1 mrg (use (match_operand:BLK 1 "memory_operand" ""))
2850 1.1 mrg (use (match_operand:SI 2 "nonmemory_operand" ""))
2851 1.1 mrg (use (match_operand:SI 3 "const_int_operand" ""))
2852 1.1 mrg (use (match_operand:SI 4 "const_int_operand" ""))
2853 1.1 mrg (use (match_operand:SI 5 "const_int_operand" ""))]
2854 1.1 mrg ""
2855 1.1 mrg {
2856 1.9 mrg if (c6x_expand_cpymem (operands[0], operands[1], operands[2], operands[3],
2857 1.1 mrg operands[4], operands[5]))
2858 1.1 mrg DONE;
2859 1.1 mrg else
2860 1.1 mrg FAIL;
2861 1.1 mrg })
2862 1.1 mrg
2863 1.1 mrg ;; -------------------------------------------------------------------------
2864 1.1 mrg ;; Prologue and epilogue.
2865 1.1 mrg ;; -------------------------------------------------------------------------
2866 1.1 mrg
2867 1.1 mrg ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
2868 1.1 mrg ;; all of memory. This blocks insns from being moved across this point.
2869 1.1 mrg
2870 1.1 mrg (define_insn "blockage"
2871 1.1 mrg [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
2872 1.1 mrg ""
2873 1.1 mrg ""
2874 1.1 mrg [(set_attr "type" "blockage")])
2875 1.1 mrg
2876 1.1 mrg (define_insn "push_rts"
2877 1.1 mrg [(set (mem:SI (reg:SI REG_SP)) (reg:SI REG_B14))
2878 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -8))) (reg:DI REG_A14))
2879 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -16))) (reg:DI REG_B12))
2880 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -24))) (reg:DI REG_A12))
2881 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -32))) (reg:DI REG_B10))
2882 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -40))) (reg:DI REG_A10))
2883 1.1 mrg (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -48))) (reg:DI REG_B2))
2884 1.1 mrg (set (reg:SI REG_SP) (plus:SI (reg:SI REG_SP) (const_int -56)))
2885 1.1 mrg (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
2886 1.1 mrg (clobber (reg:SI REG_A3))]
2887 1.1 mrg "TARGET_INSNS_64PLUS"
2888 1.1 mrg "%|%.\\tcallp\\t%$\\t__c6xabi_push_rts, a3"
2889 1.1 mrg [(set_attr "type" "callp")
2890 1.1 mrg (set_attr "dest_regfile" "a")
2891 1.1 mrg (set_attr "units" "s")
2892 1.1 mrg (set_attr "cross" "n")])
2893 1.1 mrg
2894 1.1 mrg (define_insn "pop_rts"
2895 1.1 mrg [(set (reg:SI REG_B14) (mem:SI (plus:SI (reg:SI REG_SP) (const_int 56))))
2896 1.1 mrg (set (reg:DI REG_A14) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 48))))
2897 1.1 mrg (set (reg:DI REG_B12) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 40))))
2898 1.1 mrg (set (reg:DI REG_A12) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 32))))
2899 1.1 mrg (set (reg:DI REG_B10) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 24))))
2900 1.1 mrg (set (reg:DI REG_A10) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 16))))
2901 1.1 mrg (set (reg:DI REG_B2) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 8))))
2902 1.1 mrg (set (reg:SI REG_SP) (plus:SI (reg:SI REG_SP) (const_int 56)))
2903 1.1 mrg (clobber (reg:SI REG_A3))
2904 1.1 mrg (return)]
2905 1.1 mrg "TARGET_INSNS_64PLUS"
2906 1.1 mrg "%|%.\\tretp\\t%$\\t__c6xabi_pop_rts, a3"
2907 1.1 mrg [(set_attr "type" "callp")
2908 1.1 mrg (set_attr "dest_regfile" "a")
2909 1.1 mrg (set_attr "units" "s")
2910 1.1 mrg (set_attr "cross" "n")])
2911 1.1 mrg
2912 1.1 mrg (define_expand "prologue"
2913 1.1 mrg [(const_int 1)]
2914 1.1 mrg ""
2915 1.1 mrg "c6x_expand_prologue (); DONE;")
2916 1.1 mrg
2917 1.1 mrg (define_expand "epilogue"
2918 1.1 mrg [(const_int 1)]
2919 1.1 mrg ""
2920 1.1 mrg "c6x_expand_epilogue (false); DONE;")
2921 1.1 mrg
2922 1.1 mrg (define_expand "sibcall_epilogue"
2923 1.1 mrg [(return)]
2924 1.1 mrg ""
2925 1.1 mrg {
2926 1.1 mrg c6x_expand_epilogue (true);
2927 1.1 mrg DONE;
2928 1.1 mrg })
2929 1.1 mrg
2930 1.1 mrg (define_insn "setup_dsbt"
2931 1.1 mrg [(set (match_operand:SI 0 "pic_register_operand" "+Z")
2932 1.1 mrg (unspec:SI [(match_dup 0)
2933 1.1 mrg (match_operand:SI 1 "symbolic_operand" "")]
2934 1.1 mrg UNSPEC_SETUP_DSBT))]
2935 1.1 mrg "TARGET_DSBT"
2936 1.1 mrg "%|%.\\tldw\\t%$\\t*+%0($DSBT_index%1), %0"
2937 1.1 mrg [(set_attr "type" "load")
2938 1.1 mrg (set_attr "units" "d_addr")
2939 1.1 mrg (set_attr "dest_regfile" "b")
2940 1.1 mrg (set_attr "addr_regfile" "b")])
2941 1.1 mrg
2942 1.1 mrg
2943 1.1 mrg ;; A dummy use/set to prevent prologue and epiloge overlapping.
2944 1.1 mrg ;; This can be caused by sched-ebb in the presence of multiple
2945 1.1 mrg ;; exit sequences, and causes the unwinding table generation to explode.
2946 1.1 mrg (define_insn "epilogue_barrier"
2947 1.1 mrg [(set (match_operand:SI 0 "register_operand" "")
2948 1.1 mrg (unspec:SI [(match_operand:SI 1 "register_operand" "")]
2949 1.1 mrg UNSPEC_EPILOGUE_BARRIER))]
2950 1.1 mrg ""
2951 1.1 mrg ""
2952 1.1 mrg [(set_attr "type" "blockage")])
2953 1.1 mrg
2954 1.1 mrg ;; -------------------------------------------------------------------------
2955 1.1 mrg ;; Vector insns
2956 1.1 mrg ;; -------------------------------------------------------------------------
2957 1.1 mrg
2958 1.1 mrg (define_code_iterator logical [and ior xor])
2959 1.1 mrg (define_code_attr logical_insn [(and "and") (ior "ior") (xor "xor")])
2960 1.1 mrg (define_code_attr logical_opcode [(and "and") (ior "or") (xor "xor")])
2961 1.1 mrg (define_code_iterator plusminus [plus minus])
2962 1.1 mrg (define_code_attr plusminus_insn [(plus "add") (minus "sub")])
2963 1.1 mrg (define_code_iterator ss_plusminus [ss_plus ss_minus])
2964 1.1 mrg (define_code_attr ss_plusminus_insn [(ss_plus "add") (ss_minus "sub")])
2965 1.1 mrg
2966 1.1 mrg ;; Vector logical insns
2967 1.1 mrg
2968 1.1 mrg (define_insn "<logical_insn><mode>3"
2969 1.1 mrg [(set (match_operand:VEC4M 0 "register_operand" "=a,b,a,b")
2970 1.1 mrg (logical:VEC4M (match_operand:VEC4M 1 "register_operand" "a,b,a,b")
2971 1.1 mrg (match_operand:VEC4M 2 "register_operand" "a,b,?b,?a")))]
2972 1.1 mrg ""
2973 1.1 mrg "%|%.\\t<logical_opcode>\\t%$\\t%1, %2, %0"
2974 1.1 mrg [(set_attr "units62" "ls")
2975 1.1 mrg (set_attr "units64" "dls")
2976 1.1 mrg (set_attr "cross" "n,n,y,y")])
2977 1.1 mrg
2978 1.1 mrg ;; Vector add/subtract
2979 1.1 mrg
2980 1.1 mrg (define_insn "<plusminus_insn>v2hi3"
2981 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
2982 1.1 mrg (plusminus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
2983 1.1 mrg (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
2984 1.1 mrg ""
2985 1.1 mrg "%|%.\\t<plusminus_insn>2\\t%$\\t%1, %2, %0"
2986 1.1 mrg [(set_attr "units62" "l")
2987 1.1 mrg (set_attr "units64" "dls")
2988 1.1 mrg (set_attr "cross" "n,n,y,y")])
2989 1.1 mrg
2990 1.1 mrg (define_insn "<plusminus_insn>v4qi3"
2991 1.1 mrg [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b")
2992 1.1 mrg (plusminus:V4QI (match_operand:V4QI 1 "register_operand" "a,b,a,b")
2993 1.1 mrg (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))]
2994 1.1 mrg "TARGET_INSNS_64"
2995 1.1 mrg "%|%.\\t<plusminus_insn>4\\t%$\\t%1, %2, %0"
2996 1.1 mrg [(set_attr "units" "l")
2997 1.1 mrg (set_attr "cross" "n,n,y,y")])
2998 1.1 mrg
2999 1.1 mrg (define_insn "ss_addv2hi3"
3000 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
3001 1.1 mrg (ss_plus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
3002 1.1 mrg (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
3003 1.1 mrg "TARGET_INSNS_64"
3004 1.1 mrg "%|%.\\tsadd2\\t%$\\t%1, %2, %0"
3005 1.1 mrg [(set_attr "units" "s")
3006 1.1 mrg (set_attr "cross" "n,n,y,y")])
3007 1.1 mrg
3008 1.1 mrg (define_insn "ss_subv2hi3"
3009 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
3010 1.1 mrg (ss_minus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
3011 1.1 mrg (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
3012 1.1 mrg "TARGET_INSNS_64"
3013 1.1 mrg "%|%.\\tssub2\\t%$\\t%1, %2, %0"
3014 1.1 mrg [(set_attr "units" "l")
3015 1.1 mrg (set_attr "cross" "n,n,y,y")])
3016 1.1 mrg
3017 1.1 mrg (define_insn "us_addv4qi3"
3018 1.1 mrg [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b")
3019 1.1 mrg (ss_plus:V4QI (match_operand:V4QI 1 "register_operand" "a,b,a,b")
3020 1.1 mrg (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))]
3021 1.1 mrg "TARGET_INSNS_64"
3022 1.1 mrg "%|%.\\tsaddu4\\t%$\\t%1, %2, %0"
3023 1.1 mrg [(set_attr "units" "s")
3024 1.1 mrg (set_attr "cross" "n,n,y,y")])
3025 1.1 mrg
3026 1.1 mrg ;; Vector/scalar min/max
3027 1.1 mrg
3028 1.1 mrg (define_mode_iterator SMINMAX [HI V2HI])
3029 1.1 mrg (define_mode_iterator UMINMAX [QI V4QI])
3030 1.1 mrg
3031 1.1 mrg (define_insn "smax<mode>3"
3032 1.1 mrg [(set (match_operand:SMINMAX 0 "register_operand" "=a,b,a,b")
3033 1.1 mrg (smax:SMINMAX (match_operand:SMINMAX 1 "register_operand" "a,b,a,b")
3034 1.1 mrg (match_operand:SMINMAX 2 "register_operand" "a,b,?b,?a")))]
3035 1.1 mrg "TARGET_INSNS_64"
3036 1.1 mrg "%|%.\\tmax2\\t%$\\t%1, %2, %0"
3037 1.1 mrg [(set_attr "units64" "l")
3038 1.1 mrg (set_attr "units64p" "ls")
3039 1.1 mrg (set_attr "cross" "n,n,y,y")])
3040 1.1 mrg
3041 1.1 mrg (define_insn "smin<mode>3"
3042 1.1 mrg [(set (match_operand:SMINMAX 0 "register_operand" "=a,b,a,b")
3043 1.1 mrg (smin:SMINMAX (match_operand:SMINMAX 1 "register_operand" "a,b,a,b")
3044 1.1 mrg (match_operand:SMINMAX 2 "register_operand" "a,b,?b,?a")))]
3045 1.1 mrg "TARGET_INSNS_64"
3046 1.1 mrg "%|%.\\tmin2\\t%$\\t%1, %2, %0"
3047 1.1 mrg [(set_attr "units64" "l")
3048 1.1 mrg (set_attr "units64p" "ls")
3049 1.1 mrg (set_attr "cross" "n,n,y,y")])
3050 1.1 mrg
3051 1.1 mrg (define_insn "umax<mode>3"
3052 1.1 mrg [(set (match_operand:UMINMAX 0 "register_operand" "=a,b,a,b")
3053 1.1 mrg (umax:UMINMAX (match_operand:UMINMAX 1 "register_operand" "a,b,a,b")
3054 1.1 mrg (match_operand:UMINMAX 2 "register_operand" "a,b,?b,?a")))]
3055 1.1 mrg "TARGET_INSNS_64"
3056 1.1 mrg "%|%.\\tmaxu4\\t%$\\t%1, %2, %0"
3057 1.1 mrg [(set_attr "units" "l")
3058 1.1 mrg (set_attr "cross" "n,n,y,y")])
3059 1.1 mrg
3060 1.1 mrg (define_insn "umin<mode>3"
3061 1.1 mrg [(set (match_operand:UMINMAX 0 "register_operand" "=a,b,a,b")
3062 1.1 mrg (umin:UMINMAX (match_operand:UMINMAX 1 "register_operand" "a,b,a,b")
3063 1.1 mrg (match_operand:UMINMAX 2 "register_operand" "a,b,?b,?a")))]
3064 1.1 mrg "TARGET_INSNS_64"
3065 1.1 mrg "%|%.\\tminu4\\t%$\\t%1, %2, %0"
3066 1.1 mrg [(set_attr "units" "l")
3067 1.1 mrg (set_attr "cross" "n,n,y,y")])
3068 1.1 mrg
3069 1.1 mrg ;; Vector shifts
3070 1.1 mrg
3071 1.1 mrg (define_insn "<shift_code>v2hi3"
3072 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
3073 1.1 mrg (any_rshift:V2HI (match_operand:V2HI 1 "register_operand" "a,b,?b,?a")
3074 1.1 mrg (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))]
3075 1.1 mrg "TARGET_INSNS_64"
3076 1.1 mrg "%|%.\\t<shift_insn>2\\t%$\\t%1, %2, %0"
3077 1.1 mrg [(set_attr "units" "s")
3078 1.1 mrg (set_attr "cross" "n,n,y,y")])
3079 1.1 mrg
3080 1.1 mrg ;; See c6x-mult.md.in for avg2/avgu4
3081 1.1 mrg
3082 1.1 mrg ;; Widening vector multiply and dot product.
3083 1.1 mrg ;; See c6x-mult.md.in for the define_insn patterns
3084 1.1 mrg
3085 1.1 mrg (define_expand "sdot_prodv2hi"
3086 1.1 mrg [(match_operand:SI 0 "register_operand" "")
3087 1.1 mrg (match_operand:V2HI 1 "register_operand" "")
3088 1.1 mrg (match_operand:V2HI 2 "register_operand" "")
3089 1.1 mrg (match_operand:SI 3 "register_operand" "")]
3090 1.1 mrg "TARGET_INSNS_64"
3091 1.1 mrg {
3092 1.1 mrg rtx t = gen_reg_rtx (SImode);
3093 1.1 mrg emit_insn (gen_dotv2hi (t, operands[1], operands[2]));
3094 1.1 mrg emit_insn (gen_addsi3 (operands[0], operands[3], t));
3095 1.1 mrg DONE;
3096 1.1 mrg })
3097 1.1 mrg
3098 1.1 mrg ;; Unary vector operations
3099 1.1 mrg
3100 1.1 mrg (define_insn "ssabsv2hi2"
3101 1.1 mrg [(set (match_operand:V2HI 0 "register_operand" "=a, a, b, b")
3102 1.1 mrg (ss_abs:V2HI (match_operand:V2HI 1 "register_operand" "a,?b, b,?a")))]
3103 1.1 mrg "TARGET_INSNS_64"
3104 1.1 mrg "%|%.\\tabs2\\t%$\\t%1, %0"
3105 1.1 mrg [(set_attr "units" "l")
3106 1.1 mrg (set_attr "cross" "n,y,n,y")])
3107 1.1 mrg
3108 1.1 mrg ;; Pack insns
3109 1.1 mrg
3110 1.1 mrg (define_insn "*packv2hi_insv"
3111 1.1 mrg [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+a,b,a,b,ab")
3112 1.1 mrg (const_int 16)
3113 1.1 mrg (const_int 16))
3114 1.1 mrg (match_operand:SI 1 "nonmemory_operand" "a,b,?b,?a,n"))]
3115 1.1 mrg "TARGET_INSNS_64"
3116 1.1 mrg "@
3117 1.1 mrg %|%.\\tpack2\\t%$\\t%1, %0, %0
3118 1.1 mrg %|%.\\tpack2\\t%$\\t%1, %0, %0
3119 1.1 mrg %|%.\\tpack2\\t%$\\t%1, %0, %0
3120 1.1 mrg %|%.\\tpack2\\t%$\\t%1, %0, %0
3121 1.1 mrg %|%.\\tmvklh\\t%$\\t%1, %0"
3122 1.1 mrg [(set_attr "units" "ls")
3123 1.1 mrg (set_attr "cross" "n,n,y,y,n")])
3124 1.1 mrg
3125 1.1 mrg (define_insn "movstricthi"
3126 1.1 mrg [(set (strict_low_part (match_operand:HI 0 "register_operand" "+a,b,a,b"))
3127 1.1 mrg (match_operand:HI 1 "register_operand" "a,b,?b,?a"))]
3128 1.1 mrg "TARGET_INSNS_64"
3129 1.1 mrg "%|%.\\tpackhl2\\t%$\\t%0, %1, %0"
3130 1.1 mrg [(set_attr "units" "ls")
3131 1.1 mrg (set_attr "cross" "n,n,y,y")])
3132 1.1 mrg
3133 1.1 mrg (include "c6x-mult.md")
3134 1.1 mrg (include "sync.md")
3135