annotate gcc/config/ft32/ft32.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 FT32
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 ;; Copyright (C) 2015-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by FTDI <support@ftdi.com>
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 ;; under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 ;; by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 ;; option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 ;; License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
22 ;; FT32 specific constraints, predicates and attributes
kono
parents:
diff changeset
23 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 (include "constraints.md")
kono
parents:
diff changeset
26 (include "predicates.md")
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 (define_constants [
kono
parents:
diff changeset
29 (FP_REG 0)
kono
parents:
diff changeset
30 (SP_REG 1)
kono
parents:
diff changeset
31 (CC_REG 35)
kono
parents:
diff changeset
32 ])
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 (define_c_enum "unspec"
kono
parents:
diff changeset
35 [UNSPEC_STRLEN
kono
parents:
diff changeset
36 UNSPEC_MOVMEM
kono
parents:
diff changeset
37 UNSPEC_SETMEM
kono
parents:
diff changeset
38 UNSPEC_STPCPY
kono
parents:
diff changeset
39 UNSPEC_INDEX_JMP
kono
parents:
diff changeset
40 UNSPEC_LPM
kono
parents:
diff changeset
41 UNSPEC_FMUL
kono
parents:
diff changeset
42 UNSPEC_FMULS
kono
parents:
diff changeset
43 UNSPEC_FMULSU
kono
parents:
diff changeset
44 UNSPEC_COPYSIGN
kono
parents:
diff changeset
45 UNSPEC_IDENTITY
kono
parents:
diff changeset
46 UNSPEC_INSERT_BITS
kono
parents:
diff changeset
47 UNSPEC_JMP_EPILOG
kono
parents:
diff changeset
48 UNSPEC_JMP_EPILOG24
kono
parents:
diff changeset
49 UNSPEC_JMP_PROLOG
kono
parents:
diff changeset
50 UNSPEC_XCHG
kono
parents:
diff changeset
51 ])
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
54 ;; nop instruction
kono
parents:
diff changeset
55 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 (define_insn "nop"
kono
parents:
diff changeset
58 [(const_int 0)]
kono
parents:
diff changeset
59 ""
kono
parents:
diff changeset
60 "nop")
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
63 ;; Arithmetic instructions
kono
parents:
diff changeset
64 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 (define_insn "addsi3"
kono
parents:
diff changeset
67 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
68 (plus:SI
kono
parents:
diff changeset
69 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
70 (match_operand:SI 2 "ft32_rimm_operand" "KA,r")))
kono
parents:
diff changeset
71 ]
kono
parents:
diff changeset
72 ""
kono
parents:
diff changeset
73 "add.l %0,%1,%2")
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 (define_insn "subsi3"
kono
parents:
diff changeset
76 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
77 (minus:SI
kono
parents:
diff changeset
78 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
79 (match_operand:SI 2 "ft32_rimm_operand" "KA,r")))]
kono
parents:
diff changeset
80 ""
kono
parents:
diff changeset
81 "sub.l %0,%1,%2")
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 (define_insn "mulsi3"
kono
parents:
diff changeset
84 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
85 (mult:SI
kono
parents:
diff changeset
86 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
87 (match_operand:SI 2 "ft32_rimm_operand" "KA,r")))]
kono
parents:
diff changeset
88 ""
kono
parents:
diff changeset
89 "mul.l %0,%1,%2")
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 (define_insn "umulsidi3"
kono
parents:
diff changeset
92 [(set (match_operand:DI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
93 (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r,r"))
kono
parents:
diff changeset
94 (zero_extend:DI (match_operand:SI 2 "ft32_rimm_operand" "r,KA"))))
kono
parents:
diff changeset
95 (clobber (reg:CC CC_REG))]
kono
parents:
diff changeset
96 ""
kono
parents:
diff changeset
97 "mul.l $cc,%1,%2\;muluh.l %h0,%1,%2\;move.l %0,$cc")
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 (define_insn "divsi3"
kono
parents:
diff changeset
100 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
101 (div:SI
kono
parents:
diff changeset
102 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
103 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
104 "!TARGET_NODIV"
kono
parents:
diff changeset
105 "div.l %0,%1,%2")
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 (define_insn "modsi3"
kono
parents:
diff changeset
108 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
109 (mod:SI
kono
parents:
diff changeset
110 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
111 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
112 "!TARGET_NODIV"
kono
parents:
diff changeset
113 "mod.l %0,%1,%2")
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 (define_insn "udivsi3"
kono
parents:
diff changeset
116 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
117 (udiv:SI
kono
parents:
diff changeset
118 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
119 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
120 "!TARGET_NODIV"
kono
parents:
diff changeset
121 "udiv.l %0,%1,%2")
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 (define_insn "umodsi3"
kono
parents:
diff changeset
124 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
125 (umod:SI
kono
parents:
diff changeset
126 (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
127 (match_operand:SI 2 "register_operand" "r,KA")))]
kono
parents:
diff changeset
128 "!TARGET_NODIV"
kono
parents:
diff changeset
129 "umod.l %0,%1,%2")
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 (define_insn "extvsi"
kono
parents:
diff changeset
132 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
133 (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
134 (match_operand:SI 2 "ft32_bwidth_operand" "b")
kono
parents:
diff changeset
135 (match_operand:SI 3 "const_int_operand" "i")))]
kono
parents:
diff changeset
136 ""
kono
parents:
diff changeset
137 "bexts.l %0,%1,((15 & %2) << 5) | (%3)")
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 (define_insn "extzvsi"
kono
parents:
diff changeset
140 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
141 (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
142 (match_operand:SI 2 "ft32_bwidth_operand" "b")
kono
parents:
diff changeset
143 (match_operand:SI 3 "const_int_operand" "i")))]
kono
parents:
diff changeset
144 ""
kono
parents:
diff changeset
145 "bextu.l %0,%1,((15 & %2) << 5) | (%3)")
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 (define_insn "insvsi"
kono
parents:
diff changeset
148 [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r,r")
kono
parents:
diff changeset
149 (match_operand:SI 1 "ft32_bwidth_operand" "b,b")
kono
parents:
diff changeset
150 (match_operand:SI 2 "const_int_operand" "i,i"))
kono
parents:
diff changeset
151 (match_operand:SI 3 "general_operand" "r,O"))
kono
parents:
diff changeset
152 (clobber (match_scratch:SI 4 "=&r,r"))]
kono
parents:
diff changeset
153 ""
kono
parents:
diff changeset
154 {
kono
parents:
diff changeset
155 if (which_alternative == 0)
kono
parents:
diff changeset
156 {
kono
parents:
diff changeset
157 return \"ldl.l %4,%3,((%1&15)<<5)|(%2)\;bins.l %0,%0,%4\";
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159 else
kono
parents:
diff changeset
160 {
kono
parents:
diff changeset
161 if ((INTVAL(operands[3]) == 0) || (INTVAL(operands[1]) == 1))
kono
parents:
diff changeset
162 return \"bins.l %0,%0,(%3<<9)|((%1&15)<<5)|(%2)\";
kono
parents:
diff changeset
163 else
kono
parents:
diff changeset
164 return \"ldk.l %4,(%3<<10)|((%1&15)<<5)|(%2)\;bins.l %0,%0,%4\";
kono
parents:
diff changeset
165 }
kono
parents:
diff changeset
166 })
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
169 ;; Unary arithmetic instructions
kono
parents:
diff changeset
170 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 (define_insn "one_cmplsi2"
kono
parents:
diff changeset
173 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
174 (not:SI (match_operand:SI 1 "register_operand" "r")))]
kono
parents:
diff changeset
175 ""
kono
parents:
diff changeset
176 "xor.l %0,%1,-1")
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
179 ;; Logical operators
kono
parents:
diff changeset
180 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 (define_insn "andsi3"
kono
parents:
diff changeset
183 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
kono
parents:
diff changeset
184 (and:SI (match_operand:SI 1 "register_operand" "r,r,r")
kono
parents:
diff changeset
185 (match_operand:SI 2 "general_operand" "r,x,KA")))]
kono
parents:
diff changeset
186 ""
kono
parents:
diff changeset
187 "@
kono
parents:
diff changeset
188 and.l %0,%1,%2
kono
parents:
diff changeset
189 bins.l %0,%1,%g2
kono
parents:
diff changeset
190 and.l %0,%1,%2")
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 (define_insn "andqi3"
kono
parents:
diff changeset
193 [(set (match_operand:QI 0 "register_operand" "=r,r,r")
kono
parents:
diff changeset
194 (and:QI (match_operand:QI 1 "register_operand" "r,r,r")
kono
parents:
diff changeset
195 (match_operand:QI 2 "general_operand" "r,x,KA")))]
kono
parents:
diff changeset
196 ""
kono
parents:
diff changeset
197 "@
kono
parents:
diff changeset
198 and.b %0,%1,%2
kono
parents:
diff changeset
199 bins.b %0,%1,%g2
kono
parents:
diff changeset
200 and.b %0,%1,%2")
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 (define_insn "xorsi3"
kono
parents:
diff changeset
203 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
204 (xor:SI (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
205 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
206 ""
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 return "xor.l %0,%1,%2";
kono
parents:
diff changeset
209 })
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 (define_insn "iorsi3"
kono
parents:
diff changeset
212 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
kono
parents:
diff changeset
213 (ior:SI (match_operand:SI 1 "register_operand" "r,r,r")
kono
parents:
diff changeset
214 (match_operand:SI 2 "general_operand" "r,w,KA")))]
kono
parents:
diff changeset
215 ""
kono
parents:
diff changeset
216 "@
kono
parents:
diff changeset
217 or.l %0,%1,%2
kono
parents:
diff changeset
218 bins.l %0,%1,%f2
kono
parents:
diff changeset
219 or.l %0,%1,%2")
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
222 ;; Shifters
kono
parents:
diff changeset
223 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 (define_insn "ashlsi3"
kono
parents:
diff changeset
226 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
227 (ashift:SI (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
228 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
229 ""
kono
parents:
diff changeset
230 {
kono
parents:
diff changeset
231 return "ashl.l %0,%1,%2";
kono
parents:
diff changeset
232 })
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 (define_insn "ashrsi3"
kono
parents:
diff changeset
235 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
236 (ashiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
237 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
238 ""
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 return "ashr.l %0,%1,%2";
kono
parents:
diff changeset
241 })
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 (define_insn "lshrsi3"
kono
parents:
diff changeset
244 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
245 (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
kono
parents:
diff changeset
246 (match_operand:SI 2 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
247 ""
kono
parents:
diff changeset
248 {
kono
parents:
diff changeset
249 return "lshr.l %0,%1,%2";
kono
parents:
diff changeset
250 })
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
253 ;; Move instructions
kono
parents:
diff changeset
254 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 ;; SImode
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 (define_insn "*sne"
kono
parents:
diff changeset
259 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
260 (reg:SI CC_REG))]
kono
parents:
diff changeset
261 ""
kono
parents:
diff changeset
262 "bextu.l %0,$cc,32|0\;xor.l %0,%0,-1"
kono
parents:
diff changeset
263 )
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 ;; Push a register onto the stack
kono
parents:
diff changeset
266 (define_insn "movsi_push"
kono
parents:
diff changeset
267 [(set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
kono
parents:
diff changeset
268 (match_operand:SI 0 "register_operand" "r"))]
kono
parents:
diff changeset
269 ""
kono
parents:
diff changeset
270 "push.l %0")
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 ;; Pop a register from the stack
kono
parents:
diff changeset
273 (define_insn "movsi_pop"
kono
parents:
diff changeset
274 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
275 (mem:SI (post_inc:SI (reg:SI SP_REG))))]
kono
parents:
diff changeset
276 ""
kono
parents:
diff changeset
277 "pop.l %0")
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 (define_expand "movsi"
kono
parents:
diff changeset
280 [(set (match_operand:SI 0 "general_operand" "")
kono
parents:
diff changeset
281 (match_operand:SI 1 "general_operand" ""))]
kono
parents:
diff changeset
282 ""
kono
parents:
diff changeset
283 {
kono
parents:
diff changeset
284 /* If this is a store, force the value into a register. */
kono
parents:
diff changeset
285 if (!(reload_in_progress || reload_completed))
kono
parents:
diff changeset
286 {
kono
parents:
diff changeset
287 if (MEM_P (operands[0]))
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 operands[1] = force_reg (SImode, operands[1]);
kono
parents:
diff changeset
290 if (MEM_P (XEXP (operands[0], 0)))
kono
parents:
diff changeset
291 operands[0] = gen_rtx_MEM (SImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
292 }
kono
parents:
diff changeset
293 else
kono
parents:
diff changeset
294 {
kono
parents:
diff changeset
295 if (MEM_P (operands[1]) && MEM_P (XEXP (operands[1], 0)))
kono
parents:
diff changeset
296 operands[1] = gen_rtx_MEM (SImode, force_reg (SImode, XEXP (operands[1], 0)));
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298 /*
kono
parents:
diff changeset
299 if (MEM_P (operands[0])) {
kono
parents:
diff changeset
300 rtx o = XEXP (operands[0], 0);
kono
parents:
diff changeset
301 if (!REG_P(o) &&
kono
parents:
diff changeset
302 !CONST_INT_P(o) &&
kono
parents:
diff changeset
303 GET_CODE(o) != SYMBOL_REF &&
kono
parents:
diff changeset
304 GET_CODE(o) != LABEL_REF) {
kono
parents:
diff changeset
305 operands[0] = gen_rtx_MEM (SImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
306 }
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308 */
kono
parents:
diff changeset
309 }
kono
parents:
diff changeset
310 })
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 (define_insn "*rtestsi"
kono
parents:
diff changeset
313 [(set (reg:SI CC_REG)
kono
parents:
diff changeset
314 (match_operand:SI 0 "register_operand" "r"))]
kono
parents:
diff changeset
315 ""
kono
parents:
diff changeset
316 "cmp.l %0,0"
kono
parents:
diff changeset
317 )
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 (define_insn "*rtestqi"
kono
parents:
diff changeset
320 [(set (reg:QI CC_REG)
kono
parents:
diff changeset
321 (match_operand:QI 0 "register_operand" "r"))]
kono
parents:
diff changeset
322 ""
kono
parents:
diff changeset
323 "cmp.b %0,0"
kono
parents:
diff changeset
324 )
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 (define_insn "*movsi"
kono
parents:
diff changeset
327 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,BW,r,r,r,r,A,r,r")
kono
parents:
diff changeset
328 (match_operand:SI 1 "ft32_general_movsrc_operand" "r,r,BW,A,S,i,r,e,f"))]
kono
parents:
diff changeset
329 "register_operand (operands[0], SImode) || register_operand (operands[1], SImode)"
kono
parents:
diff changeset
330 "@
kono
parents:
diff changeset
331 move.l %0,%1
kono
parents:
diff changeset
332 sti.l %0,%1
kono
parents:
diff changeset
333 ldi.l %0,%1
kono
parents:
diff changeset
334 lda.l %0,%1
kono
parents:
diff changeset
335 ldk.l %0,%1
kono
parents:
diff changeset
336 *return ft32_load_immediate(operands[0], INTVAL(operands[1]));
kono
parents:
diff changeset
337 sta.l %0,%1
kono
parents:
diff changeset
338 lpm.l %0,%1
kono
parents:
diff changeset
339 lpmi.l %0,%1"
kono
parents:
diff changeset
340 )
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 (define_expand "movqi"
kono
parents:
diff changeset
343 [(set (match_operand:QI 0 "general_operand" "")
kono
parents:
diff changeset
344 (match_operand:QI 1 "general_operand" ""))]
kono
parents:
diff changeset
345 ""
kono
parents:
diff changeset
346 {
kono
parents:
diff changeset
347 /* If this is a store, force the value into a register. */
kono
parents:
diff changeset
348 if (!(reload_in_progress || reload_completed))
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 if (MEM_P (operands[0]))
kono
parents:
diff changeset
351 {
kono
parents:
diff changeset
352 operands[1] = force_reg (QImode, operands[1]);
kono
parents:
diff changeset
353 if (MEM_P (XEXP (operands[0], 0)))
kono
parents:
diff changeset
354 operands[0] = gen_rtx_MEM (QImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
355 }
kono
parents:
diff changeset
356 else
kono
parents:
diff changeset
357 {
kono
parents:
diff changeset
358 if (MEM_P (operands[1]) && MEM_P (XEXP (operands[1], 0)))
kono
parents:
diff changeset
359 operands[1] = gen_rtx_MEM (QImode, force_reg (SImode, XEXP (operands[1], 0)));
kono
parents:
diff changeset
360 }
kono
parents:
diff changeset
361 if (MEM_P (operands[0]) && !REG_P(XEXP (operands[0], 0)))
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 operands[0] = gen_rtx_MEM (QImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
364 }
kono
parents:
diff changeset
365 }
kono
parents:
diff changeset
366 })
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 (define_insn "zero_extendqisi2"
kono
parents:
diff changeset
369 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r")
kono
parents:
diff changeset
370 (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "BW,r,f")))]
kono
parents:
diff changeset
371 ""
kono
parents:
diff changeset
372 "@
kono
parents:
diff changeset
373 ldi.b %0,%1
kono
parents:
diff changeset
374 and.l %0,%1,255
kono
parents:
diff changeset
375 lpmi.b %0,%1"
kono
parents:
diff changeset
376 )
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 (define_insn "extendqisi2"
kono
parents:
diff changeset
379 [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
kono
parents:
diff changeset
380 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r")))]
kono
parents:
diff changeset
381 ""
kono
parents:
diff changeset
382 "bexts.l %0,%1,(8<<5)|0"
kono
parents:
diff changeset
383 )
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 (define_insn "zero_extendhisi2"
kono
parents:
diff changeset
386 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r")
kono
parents:
diff changeset
387 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "BW,r,f")))]
kono
parents:
diff changeset
388 ""
kono
parents:
diff changeset
389 "@
kono
parents:
diff changeset
390 ldi.s %0,%1
kono
parents:
diff changeset
391 bextu.l %0,%1,(0<<5)|0
kono
parents:
diff changeset
392 lpmi.s %0,%1"
kono
parents:
diff changeset
393 )
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 (define_insn "extendhisi2"
kono
parents:
diff changeset
396 [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
kono
parents:
diff changeset
397 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r")))]
kono
parents:
diff changeset
398 ""
kono
parents:
diff changeset
399 "bexts.l %0,%1,(0<<5)|0"
kono
parents:
diff changeset
400 )
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 (define_insn "*movqi"
kono
parents:
diff changeset
403 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,BW,r,r,A,r,r,r")
kono
parents:
diff changeset
404 (match_operand:QI 1 "ft32_general_movsrc_operand" "r,r,BW,A,r,I,e,f"))]
kono
parents:
diff changeset
405 "register_operand (operands[0], QImode)
kono
parents:
diff changeset
406 || register_operand (operands[1], QImode)"
kono
parents:
diff changeset
407 "@
kono
parents:
diff changeset
408 move.b %0,%1
kono
parents:
diff changeset
409 sti.b %0,%1
kono
parents:
diff changeset
410 ldi.b %0,%1
kono
parents:
diff changeset
411 lda.b %0,%1
kono
parents:
diff changeset
412 sta.b %0,%1
kono
parents:
diff changeset
413 ldk.b %0,%1
kono
parents:
diff changeset
414 lpm.b %0,%1
kono
parents:
diff changeset
415 lpmi.b %0,%1"
kono
parents:
diff changeset
416 )
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 (define_expand "movhi"
kono
parents:
diff changeset
419 [(set (match_operand:HI 0 "general_operand" "")
kono
parents:
diff changeset
420 (match_operand:HI 1 "general_operand" ""))]
kono
parents:
diff changeset
421 ""
kono
parents:
diff changeset
422 {
kono
parents:
diff changeset
423 /* If this is a store, force the value into a register. */
kono
parents:
diff changeset
424 if (!(reload_in_progress || reload_completed))
kono
parents:
diff changeset
425 {
kono
parents:
diff changeset
426 if (MEM_P (operands[0]))
kono
parents:
diff changeset
427 {
kono
parents:
diff changeset
428 operands[1] = force_reg (HImode, operands[1]);
kono
parents:
diff changeset
429 if (MEM_P (XEXP (operands[0], 0)))
kono
parents:
diff changeset
430 operands[0] = gen_rtx_MEM (HImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
431 }
kono
parents:
diff changeset
432 else
kono
parents:
diff changeset
433 {
kono
parents:
diff changeset
434 if (MEM_P (operands[1]) && MEM_P (XEXP (operands[1], 0)))
kono
parents:
diff changeset
435 operands[1] = gen_rtx_MEM (HImode, force_reg (SImode, XEXP (operands[1], 0)));
kono
parents:
diff changeset
436 }
kono
parents:
diff changeset
437 if (MEM_P (operands[0]))
kono
parents:
diff changeset
438 {
kono
parents:
diff changeset
439 rtx o = XEXP (operands[0], 0);
kono
parents:
diff changeset
440 if (!REG_P(o) &&
kono
parents:
diff changeset
441 !CONST_INT_P(o) &&
kono
parents:
diff changeset
442 GET_CODE(o) != SYMBOL_REF &&
kono
parents:
diff changeset
443 GET_CODE(o) != LABEL_REF) {
kono
parents:
diff changeset
444 operands[0] = gen_rtx_MEM (HImode, force_reg (SImode, XEXP (operands[0], 0)));
kono
parents:
diff changeset
445 }
kono
parents:
diff changeset
446 }
kono
parents:
diff changeset
447 }
kono
parents:
diff changeset
448 })
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 (define_insn "*movhi"
kono
parents:
diff changeset
451 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,BW,r,r,A,r,r,r")
kono
parents:
diff changeset
452 (match_operand:HI 1 "ft32_general_movsrc_operand" "r,r,BW,A,r,I,e,f"))]
kono
parents:
diff changeset
453 "(register_operand (operands[0], HImode)
kono
parents:
diff changeset
454 || register_operand (operands[1], HImode))"
kono
parents:
diff changeset
455 "@
kono
parents:
diff changeset
456 move.s %0,%1
kono
parents:
diff changeset
457 sti.s %0,%1
kono
parents:
diff changeset
458 ldi.s %0,%1
kono
parents:
diff changeset
459 lda.s %0,%1
kono
parents:
diff changeset
460 sta.s %0,%1
kono
parents:
diff changeset
461 ldk.s %0,%1
kono
parents:
diff changeset
462 lpm.s %0,%1
kono
parents:
diff changeset
463 lpmi.s %0,%1"
kono
parents:
diff changeset
464 )
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 (define_expand "movsf"
kono
parents:
diff changeset
467 [(set (match_operand:SF 0 "general_operand" "")
kono
parents:
diff changeset
468 (match_operand:SF 1 "general_operand" ""))]
kono
parents:
diff changeset
469 ""
kono
parents:
diff changeset
470 {
kono
parents:
diff changeset
471 /* If this is a store, force the value into a register. */
kono
parents:
diff changeset
472 if (MEM_P (operands[0]))
kono
parents:
diff changeset
473 operands[1] = force_reg (SFmode, operands[1]);
kono
parents:
diff changeset
474 if (CONST_DOUBLE_P(operands[1]))
kono
parents:
diff changeset
475 operands[1] = force_const_mem(SFmode, operands[1]);
kono
parents:
diff changeset
476 })
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 (define_insn "*movsf"
kono
parents:
diff changeset
479 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,BW,r,r,A,r,r")
kono
parents:
diff changeset
480 (match_operand:SF 1 "ft32_general_movsrc_operand" "r,r,BW,A,r,I,f"))]
kono
parents:
diff changeset
481 "(register_operand (operands[0], SFmode)
kono
parents:
diff changeset
482 || register_operand (operands[1], SFmode))"
kono
parents:
diff changeset
483 "@
kono
parents:
diff changeset
484 move.l %0,%1
kono
parents:
diff changeset
485 sti.l %0,%1
kono
parents:
diff changeset
486 ldi.l %0,%1
kono
parents:
diff changeset
487 lda.l %0,%1
kono
parents:
diff changeset
488 sta.l %0,%1
kono
parents:
diff changeset
489 ldk.l %0,%1
kono
parents:
diff changeset
490 lpmi.l %0,%1"
kono
parents:
diff changeset
491 )
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
494 ;; Compare instructions
kono
parents:
diff changeset
495 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 (define_expand "cbranchsi4"
kono
parents:
diff changeset
498 [(set (reg:CC CC_REG)
kono
parents:
diff changeset
499 (compare:CC
kono
parents:
diff changeset
500 (match_operand:SI 1 "register_operand" "")
kono
parents:
diff changeset
501 (match_operand:SI 2 "ft32_rimm_operand" "")))
kono
parents:
diff changeset
502 (set (pc)
kono
parents:
diff changeset
503 (if_then_else (match_operator 0 "comparison_operator"
kono
parents:
diff changeset
504 [(reg:CC CC_REG) (const_int 0)])
kono
parents:
diff changeset
505 (label_ref (match_operand 3 "" ""))
kono
parents:
diff changeset
506 (pc)))]
kono
parents:
diff changeset
507 ""
kono
parents:
diff changeset
508 "")
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 (define_insn "cmpsi"
kono
parents:
diff changeset
511 [(set (reg:CC CC_REG)
kono
parents:
diff changeset
512 (compare:CC
kono
parents:
diff changeset
513 (match_operand:SI 0 "register_operand" "r,r")
kono
parents:
diff changeset
514 (match_operand:SI 1 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
515 ""
kono
parents:
diff changeset
516 "cmp.l %0,%1")
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 (define_insn ""
kono
parents:
diff changeset
519 [(set (pc)
kono
parents:
diff changeset
520 (if_then_else
kono
parents:
diff changeset
521 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
kono
parents:
diff changeset
522 (const_int 1)
kono
parents:
diff changeset
523 (match_operand:SI 1 "const_int_operand" "i"))
kono
parents:
diff changeset
524 (const_int 0))
kono
parents:
diff changeset
525 (label_ref (match_operand 2 "" ""))
kono
parents:
diff changeset
526 (pc)))
kono
parents:
diff changeset
527 (clobber (reg:CC CC_REG))]
kono
parents:
diff changeset
528 ""
kono
parents:
diff changeset
529 "btst.l %0,(1<<5)|%1\;jmpc nz,%l2")
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 (define_insn ""
kono
parents:
diff changeset
532 [(set (pc)
kono
parents:
diff changeset
533 (if_then_else
kono
parents:
diff changeset
534 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
kono
parents:
diff changeset
535 (const_int 1)
kono
parents:
diff changeset
536 (match_operand:SI 1 "const_int_operand" "i"))
kono
parents:
diff changeset
537 (const_int 0))
kono
parents:
diff changeset
538 (label_ref (match_operand 2 "" ""))
kono
parents:
diff changeset
539 (pc)))
kono
parents:
diff changeset
540 (clobber (reg:CC CC_REG))]
kono
parents:
diff changeset
541 ""
kono
parents:
diff changeset
542 "btst.l %0,(1<<5)|%1\;jmpc z,%l2")
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 (define_expand "cbranchqi4"
kono
parents:
diff changeset
545 [(set (reg:CC CC_REG)
kono
parents:
diff changeset
546 (compare:CC
kono
parents:
diff changeset
547 (match_operand:QI 1 "register_operand" "")
kono
parents:
diff changeset
548 (match_operand:QI 2 "ft32_rimm_operand" "")))
kono
parents:
diff changeset
549 (set (pc)
kono
parents:
diff changeset
550 (if_then_else (match_operator 0 "comparison_operator"
kono
parents:
diff changeset
551 [(reg:CC CC_REG) (const_int 0)])
kono
parents:
diff changeset
552 (label_ref (match_operand 3 "" ""))
kono
parents:
diff changeset
553 (pc)))]
kono
parents:
diff changeset
554 ""
kono
parents:
diff changeset
555 "")
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 (define_insn "*cmpqi"
kono
parents:
diff changeset
558 [(set (reg:CC CC_REG)
kono
parents:
diff changeset
559 (compare:CC
kono
parents:
diff changeset
560 (match_operand:QI 0 "register_operand" "r,r")
kono
parents:
diff changeset
561 (match_operand:QI 1 "ft32_rimm_operand" "r,KA")))]
kono
parents:
diff changeset
562 ""
kono
parents:
diff changeset
563 "cmp.b %0,%1")
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
566 ;; Branch instructions
kono
parents:
diff changeset
567 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 (define_code_iterator cond [ne eq lt ltu gt gtu ge le geu leu])
kono
parents:
diff changeset
570 (define_code_attr CC [(ne "nz") (eq "z") (lt "lt") (ltu "b")
kono
parents:
diff changeset
571 (gt "gt") (gtu "a") (ge "gte") (le "lte")
kono
parents:
diff changeset
572 (geu "ae") (leu "be") ])
kono
parents:
diff changeset
573 (define_code_attr rCC [(ne "z") (eq "nz") (lt "gte") (ltu "ae")
kono
parents:
diff changeset
574 (gt "lte") (gtu "be") (ge "lt") (le "gt")
kono
parents:
diff changeset
575 (geu "b") (leu "a") ])
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 (define_insn "*b<cond:code>"
kono
parents:
diff changeset
578 [(set (pc)
kono
parents:
diff changeset
579 (if_then_else (cond (reg:CC CC_REG)
kono
parents:
diff changeset
580 (const_int 0))
kono
parents:
diff changeset
581 (label_ref (match_operand 0 "" ""))
kono
parents:
diff changeset
582 (pc)))]
kono
parents:
diff changeset
583 ""
kono
parents:
diff changeset
584 {
kono
parents:
diff changeset
585 return "jmpc <CC>,%l0";
kono
parents:
diff changeset
586 }
kono
parents:
diff changeset
587 )
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 (define_expand "cstoresi4"
kono
parents:
diff changeset
590 [(set (reg:CC CC_REG)
kono
parents:
diff changeset
591 (compare:CC (match_operand:SI 2 "register_operand" "r,r")
kono
parents:
diff changeset
592 (match_operand:SI 3 "ft32_rimm_operand" "r,KA")))
kono
parents:
diff changeset
593 (set (match_operand:SI 0 "register_operand")
kono
parents:
diff changeset
594 (match_operator:SI 1 "ordered_comparison_operator"
kono
parents:
diff changeset
595 [(reg:CC CC_REG) (const_int 0)]))]
kono
parents:
diff changeset
596 ""
kono
parents:
diff changeset
597 {
kono
parents:
diff changeset
598 rtx test;
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 switch (GET_CODE (operands[1])) {
kono
parents:
diff changeset
601 case NE:
kono
parents:
diff changeset
602 case GEU:
kono
parents:
diff changeset
603 case LT:
kono
parents:
diff changeset
604 case LE:
kono
parents:
diff changeset
605 case LEU:
kono
parents:
diff changeset
606 test = gen_rtx_fmt_ee (reverse_condition (GET_CODE (operands[1])),
kono
parents:
diff changeset
607 SImode, operands[2], operands[3]);
kono
parents:
diff changeset
608 emit_insn(gen_cstoresi4(operands[0], test, operands[2], operands[3]));
kono
parents:
diff changeset
609 emit_insn(gen_xorsi3(operands[0], operands[0], gen_int_mode(1, SImode)));
kono
parents:
diff changeset
610 DONE;
kono
parents:
diff changeset
611 default:
kono
parents:
diff changeset
612 ;
kono
parents:
diff changeset
613 }
kono
parents:
diff changeset
614 })
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 (define_insn "*seq"
kono
parents:
diff changeset
617 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
618 (eq:SI (reg CC_REG) (const_int 0)))]
kono
parents:
diff changeset
619 ""
kono
parents:
diff changeset
620 "bextu.l %0,$cc,32|0"
kono
parents:
diff changeset
621 )
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 (define_insn "*sltu"
kono
parents:
diff changeset
624 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
625 (ltu:SI (reg CC_REG) (const_int 0)))]
kono
parents:
diff changeset
626 ""
kono
parents:
diff changeset
627 "bextu.l %0,$cc,32|1"
kono
parents:
diff changeset
628 )
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 (define_insn "*sge"
kono
parents:
diff changeset
631 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
632 (ge:SI (reg CC_REG) (const_int 0)))]
kono
parents:
diff changeset
633 ""
kono
parents:
diff changeset
634 "bextu.l %0,$cc,32|4"
kono
parents:
diff changeset
635 )
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 (define_insn "*sgt"
kono
parents:
diff changeset
638 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
639 (gt:SI (reg CC_REG) (const_int 0)))]
kono
parents:
diff changeset
640 ""
kono
parents:
diff changeset
641 "bextu.l %0,$cc,32|5"
kono
parents:
diff changeset
642 )
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 (define_insn "*sgtu"
kono
parents:
diff changeset
645 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
646 (gtu:SI (reg CC_REG) (const_int 0)))]
kono
parents:
diff changeset
647 ""
kono
parents:
diff changeset
648 "bextu.l %0,$cc,32|6"
kono
parents:
diff changeset
649 )
kono
parents:
diff changeset
650
kono
parents:
diff changeset
651 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
652 ;; Call and Jump instructions
kono
parents:
diff changeset
653 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 (define_expand "call"
kono
parents:
diff changeset
656 [(call (match_operand:QI 0 "memory_operand" "")
kono
parents:
diff changeset
657 (match_operand 1 "general_operand" ""))]
kono
parents:
diff changeset
658 ""
kono
parents:
diff changeset
659 {
kono
parents:
diff changeset
660 gcc_assert (MEM_P (operands[0]));
kono
parents:
diff changeset
661 })
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 (define_insn "*call"
kono
parents:
diff changeset
664 [(call (mem:QI (match_operand:SI
kono
parents:
diff changeset
665 0 "nonmemory_operand" "i,r"))
kono
parents:
diff changeset
666 (match_operand 1 "" ""))]
kono
parents:
diff changeset
667 ""
kono
parents:
diff changeset
668 "@
kono
parents:
diff changeset
669 call %0
kono
parents:
diff changeset
670 calli %0"
kono
parents:
diff changeset
671 )
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 (define_expand "call_value"
kono
parents:
diff changeset
674 [(set (match_operand 0 "" "")
kono
parents:
diff changeset
675 (call (match_operand:QI 1 "memory_operand" "")
kono
parents:
diff changeset
676 (match_operand 2 "" "")))]
kono
parents:
diff changeset
677 ""
kono
parents:
diff changeset
678 {
kono
parents:
diff changeset
679 gcc_assert (MEM_P (operands[1]));
kono
parents:
diff changeset
680 })
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 (define_insn "*call_value"
kono
parents:
diff changeset
683 [(set (match_operand 0 "register_operand" "=r")
kono
parents:
diff changeset
684 (call (mem:QI (match_operand:SI
kono
parents:
diff changeset
685 1 "immediate_operand" "i"))
kono
parents:
diff changeset
686 (match_operand 2 "" "")))]
kono
parents:
diff changeset
687 ""
kono
parents:
diff changeset
688 "call %1"
kono
parents:
diff changeset
689 )
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 (define_insn "*call_value_indirect"
kono
parents:
diff changeset
692 [(set (match_operand 0 "register_operand" "=r")
kono
parents:
diff changeset
693 (call (mem:QI (match_operand:SI
kono
parents:
diff changeset
694 1 "register_operand" "r"))
kono
parents:
diff changeset
695 (match_operand 2 "" "")))]
kono
parents:
diff changeset
696 ""
kono
parents:
diff changeset
697 "calli %1"
kono
parents:
diff changeset
698 )
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 (define_insn "indirect_jump"
kono
parents:
diff changeset
701 [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "r"))]
kono
parents:
diff changeset
702 ""
kono
parents:
diff changeset
703 "jmpi %0")
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 (define_insn "jump"
kono
parents:
diff changeset
706 [(set (pc)
kono
parents:
diff changeset
707 (label_ref (match_operand 0 "" "")))]
kono
parents:
diff changeset
708 ""
kono
parents:
diff changeset
709 "jmp %l0"
kono
parents:
diff changeset
710 )
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 (define_insn "call_prolog"
kono
parents:
diff changeset
713 [(unspec:SI [(match_operand 0 "" "")]
kono
parents:
diff changeset
714 UNSPEC_JMP_PROLOG)]
kono
parents:
diff changeset
715 ""
kono
parents:
diff changeset
716 "call __prolog_%0"
kono
parents:
diff changeset
717 )
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 (define_insn "jump_epilog"
kono
parents:
diff changeset
720 [(unspec:SI [(match_operand 0 "" "")]
kono
parents:
diff changeset
721 UNSPEC_JMP_EPILOG)]
kono
parents:
diff changeset
722 ""
kono
parents:
diff changeset
723 "jmp __epilog_%0"
kono
parents:
diff changeset
724 )
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 (define_insn "jump_epilog24"
kono
parents:
diff changeset
727 [(unspec:SI [(match_operand 0 "" "")]
kono
parents:
diff changeset
728 UNSPEC_JMP_EPILOG24)]
kono
parents:
diff changeset
729 ""
kono
parents:
diff changeset
730 "jmp __epilog24_%0"
kono
parents:
diff changeset
731 )
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 ;; Subroutines of "casesi".
kono
parents:
diff changeset
735 ;; operand 0 is index
kono
parents:
diff changeset
736 ;; operand 1 is the minimum bound
kono
parents:
diff changeset
737 ;; operand 2 is the maximum bound - minimum bound + 1
kono
parents:
diff changeset
738 ;; operand 3 is CODE_LABEL for the table;
kono
parents:
diff changeset
739 ;; operand 4 is the CODE_LABEL to go to if index out of range.
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 (define_expand "casesi"
kono
parents:
diff changeset
742 [(match_operand:SI 0 "general_operand" "")
kono
parents:
diff changeset
743 (match_operand:SI 1 "const_int_operand" "")
kono
parents:
diff changeset
744 (match_operand:SI 2 "const_int_operand" "")
kono
parents:
diff changeset
745 (match_operand 3 "" "")
kono
parents:
diff changeset
746 (match_operand 4 "" "")]
kono
parents:
diff changeset
747 ""
kono
parents:
diff changeset
748 "
kono
parents:
diff changeset
749 {
kono
parents:
diff changeset
750 if (GET_CODE (operands[0]) != REG)
kono
parents:
diff changeset
751 operands[0] = force_reg (SImode, operands[0]);
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 if (operands[1] != const0_rtx)
kono
parents:
diff changeset
754 {
kono
parents:
diff changeset
755 rtx index = gen_reg_rtx (SImode);
kono
parents:
diff changeset
756 rtx offset = gen_reg_rtx (SImode);
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 emit_insn (gen_movsi (offset, operands[1]));
kono
parents:
diff changeset
759 emit_insn (gen_subsi3 (index, operands[0], offset));
kono
parents:
diff changeset
760 operands[0] = index;
kono
parents:
diff changeset
761 }
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 {
kono
parents:
diff changeset
764 rtx test = gen_rtx_GTU (VOIDmode, operands[0], operands[2]);
kono
parents:
diff changeset
765 emit_jump_insn (gen_cbranchsi4 (test, operands[0], operands[2], operands[4]));
kono
parents:
diff changeset
766 }
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 emit_jump_insn (gen_casesi0 (operands[0], operands[3]));
kono
parents:
diff changeset
769 DONE;
kono
parents:
diff changeset
770 }")
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 (define_insn "casesi0"
kono
parents:
diff changeset
773 [(set (pc) (mem:SI (plus:SI
kono
parents:
diff changeset
774 (mult:SI (match_operand:SI 0 "register_operand" "r")
kono
parents:
diff changeset
775 (const_int 4))
kono
parents:
diff changeset
776 (label_ref (match_operand 1 "" "")))))
kono
parents:
diff changeset
777 (clobber (match_scratch:SI 2 "=&r"))
kono
parents:
diff changeset
778 ]
kono
parents:
diff changeset
779 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 if (TARGET_NOPM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 return \"ldk.l\t$cc,%l1\;ashl.l\t%2,%0,2\;add.l\t%2,%2,$cc\;ldi.l\t%2,%2,0\;jmpi\t%2\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 return \"ldk.l\t$cc,%l1\;ashl.l\t%2,%0,2\;add.l\t%2,%2,$cc\;lpmi.l\t%2,%2,0\;jmpi\t%2\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 })
111
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
788 ;; Atomic exchange instruction
kono
parents:
diff changeset
789 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 (define_insn "atomic_exchangesi"
kono
parents:
diff changeset
792 [(set (match_operand:SI 0 "register_operand" "=&r,r") ;; output
kono
parents:
diff changeset
793 (match_operand:SI 1 "memory_operand" "+BW,A")) ;; memory
kono
parents:
diff changeset
794 (set (match_dup 1)
kono
parents:
diff changeset
795 (unspec:SI
kono
parents:
diff changeset
796 [(match_operand:SI 2 "register_operand" "0,0") ;; input
kono
parents:
diff changeset
797 (match_operand:SI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
798 UNSPEC_XCHG))]
kono
parents:
diff changeset
799 ""
kono
parents:
diff changeset
800 "@
kono
parents:
diff changeset
801 exi.l %0,%1
kono
parents:
diff changeset
802 exa.l %0,%1")
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 (define_insn "atomic_exchangehi"
kono
parents:
diff changeset
805 [(set (match_operand:HI 0 "register_operand" "=&r,r") ;; output
kono
parents:
diff changeset
806 (match_operand:HI 1 "memory_operand" "+BW,A")) ;; memory
kono
parents:
diff changeset
807 (set (match_dup 1)
kono
parents:
diff changeset
808 (unspec:HI
kono
parents:
diff changeset
809 [(match_operand:HI 2 "register_operand" "0,0") ;; input
kono
parents:
diff changeset
810 (match_operand:HI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
811 UNSPEC_XCHG))]
kono
parents:
diff changeset
812 ""
kono
parents:
diff changeset
813 "@
kono
parents:
diff changeset
814 exi.s %0,%1
kono
parents:
diff changeset
815 exa.s %0,%1")
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 (define_insn "atomic_exchangeqi"
kono
parents:
diff changeset
818 [(set (match_operand:QI 0 "register_operand" "=&r,r") ;; output
kono
parents:
diff changeset
819 (match_operand:QI 1 "memory_operand" "+BW,A")) ;; memory
kono
parents:
diff changeset
820 (set (match_dup 1)
kono
parents:
diff changeset
821 (unspec:QI
kono
parents:
diff changeset
822 [(match_operand:QI 2 "register_operand" "0,0") ;; input
kono
parents:
diff changeset
823 (match_operand:QI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
824 UNSPEC_XCHG))]
kono
parents:
diff changeset
825 ""
kono
parents:
diff changeset
826 "@
kono
parents:
diff changeset
827 exi.b %0,%1
kono
parents:
diff changeset
828 exa.b %0,%1")
kono
parents:
diff changeset
829
kono
parents:
diff changeset
830 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
831 ;; String instructions
kono
parents:
diff changeset
832 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 (define_insn "cmpstrsi"
kono
parents:
diff changeset
835 [(set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
836 (compare:SI (match_operand:BLK 1 "memory_operand" "W,BW")
kono
parents:
diff changeset
837 (match_operand:BLK 2 "memory_operand" "W,BW")))
kono
parents:
diff changeset
838 (clobber (match_operand:SI 3))
kono
parents:
diff changeset
839 ]
kono
parents:
diff changeset
840 ""
kono
parents:
diff changeset
841 "strcmp.%d3 %0,%b1,%b2"
kono
parents:
diff changeset
842 )
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 (define_insn "movstr"
kono
parents:
diff changeset
845 [(set (match_operand:BLK 1 "memory_operand" "=W")
kono
parents:
diff changeset
846 (match_operand:BLK 2 "memory_operand" "W"))
kono
parents:
diff changeset
847 (use (match_operand:SI 0))
kono
parents:
diff changeset
848 (clobber (match_dup 0))
kono
parents:
diff changeset
849 ]
kono
parents:
diff changeset
850 "0"
kono
parents:
diff changeset
851 "stpcpy %b1,%b2 # %0 %b1 %b2"
kono
parents:
diff changeset
852 )
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 (define_insn "movmemsi"
kono
parents:
diff changeset
855 [(set (match_operand:BLK 0 "memory_operand" "=W,BW")
kono
parents:
diff changeset
856 (match_operand:BLK 1 "memory_operand" "W,BW"))
kono
parents:
diff changeset
857 (use (match_operand:SI 2 "ft32_imm_operand" "KA,KA"))
kono
parents:
diff changeset
858 (use (match_operand:SI 3))
kono
parents:
diff changeset
859 ]
kono
parents:
diff changeset
860 ""
kono
parents:
diff changeset
861 "memcpy.%d3 %b0,%b1,%2 "
kono
parents:
diff changeset
862 )
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 (define_insn "setmemsi"
kono
parents:
diff changeset
865 [(set (match_operand:BLK 0 "memory_operand" "=BW") (unspec:BLK [
kono
parents:
diff changeset
866 (use (match_operand:QI 2 "register_operand" "r"))
kono
parents:
diff changeset
867 (use (match_operand:SI 1 "ft32_imm_operand" "KA"))
kono
parents:
diff changeset
868 ] UNSPEC_SETMEM))
kono
parents:
diff changeset
869 (use (match_operand:SI 3))
kono
parents:
diff changeset
870 ]
kono
parents:
diff changeset
871 ""
kono
parents:
diff changeset
872 "memset.%d3 %b0,%2,%1"
kono
parents:
diff changeset
873 )
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 (define_insn "strlensi"
kono
parents:
diff changeset
876 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
877 (unspec:SI [(match_operand:BLK 1 "memory_operand" "W")
kono
parents:
diff changeset
878 (match_operand:QI 2 "const_int_operand" "")
kono
parents:
diff changeset
879 (match_operand:SI 3 "ft32_rimm_operand" "")]
kono
parents:
diff changeset
880 UNSPEC_STRLEN))]
kono
parents:
diff changeset
881 ""
kono
parents:
diff changeset
882 "strlen.%d3 %0,%b1 # %2 %3"
kono
parents:
diff changeset
883 )
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
886 ;; Prologue & Epilogue
kono
parents:
diff changeset
887 ;; -------------------------------------------------------------------------
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 (define_expand "prologue"
kono
parents:
diff changeset
890 [(clobber (const_int 0))]
kono
parents:
diff changeset
891 ""
kono
parents:
diff changeset
892 {
kono
parents:
diff changeset
893 extern void ft32_expand_prologue();
kono
parents:
diff changeset
894 ft32_expand_prologue ();
kono
parents:
diff changeset
895 DONE;
kono
parents:
diff changeset
896 })
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 (define_expand "epilogue"
kono
parents:
diff changeset
900 [(return)]
kono
parents:
diff changeset
901 ""
kono
parents:
diff changeset
902 {
kono
parents:
diff changeset
903 extern void ft32_expand_epilogue();
kono
parents:
diff changeset
904 ft32_expand_epilogue ();
kono
parents:
diff changeset
905 DONE;
kono
parents:
diff changeset
906 })
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 (define_insn "link"
kono
parents:
diff changeset
909 [
kono
parents:
diff changeset
910 ;; (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
kono
parents:
diff changeset
911 ;; (reg:SI FP_REG))
kono
parents:
diff changeset
912 (set (match_operand:SI 0)
kono
parents:
diff changeset
913 (reg:SI SP_REG))
kono
parents:
diff changeset
914 (set (reg:SI SP_REG)
kono
parents:
diff changeset
915 (plus:SI (reg:SI SP_REG)
kono
parents:
diff changeset
916 (match_operand:SI 1 "general_operand" "L")))]
kono
parents:
diff changeset
917 ""
kono
parents:
diff changeset
918 "link %0,%m1"
kono
parents:
diff changeset
919 )
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 (define_insn "unlink"
kono
parents:
diff changeset
922 [(set (reg:SI FP_REG)
kono
parents:
diff changeset
923 (mem:SI (reg:SI FP_REG)))
kono
parents:
diff changeset
924 (set (reg:SI SP_REG)
kono
parents:
diff changeset
925 (plus:SI (reg:SI FP_REG)
kono
parents:
diff changeset
926 (const_int 4)))]
kono
parents:
diff changeset
927 ""
kono
parents:
diff changeset
928 "unlink $r29"
kono
parents:
diff changeset
929 )
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 (define_insn "returner"
kono
parents:
diff changeset
932 [(return)]
kono
parents:
diff changeset
933 "reload_completed"
kono
parents:
diff changeset
934 "return")
kono
parents:
diff changeset
935
kono
parents:
diff changeset
936 (define_insn "pretend_returner"
kono
parents:
diff changeset
937 [(set (reg:SI SP_REG)
kono
parents:
diff changeset
938 (plus:SI (reg:SI SP_REG)
kono
parents:
diff changeset
939 (match_operand:SI 0)))
kono
parents:
diff changeset
940 (return)]
kono
parents:
diff changeset
941 "reload_completed"
kono
parents:
diff changeset
942 "pop.l $cc\;add.l $sp,$sp,%0\;jmpi $cc")
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 (define_insn "returner24"
kono
parents:
diff changeset
945 [
kono
parents:
diff changeset
946 (set (reg:SI SP_REG)
kono
parents:
diff changeset
947 (plus:SI
kono
parents:
diff changeset
948 (reg:SI SP_REG)
kono
parents:
diff changeset
949 (const_int 24)))
kono
parents:
diff changeset
950 (return)]
kono
parents:
diff changeset
951 ""
kono
parents:
diff changeset
952 "jmp __epilog24")