annotate gcc/config/c6x/c6x.md @ 131:84e7813d76e9

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