annotate gcc/config/rl78/rl78.md @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Machine Description for Renesas RL78 processors
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 ;; Copyright (C) 2011-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Red Hat.
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
kono
parents:
diff changeset
8 ;; it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 ;; the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 ;; any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 ;; GNU General Public 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 (define_constants
kono
parents:
diff changeset
22 [
kono
parents:
diff changeset
23 (AX_REG 0)
kono
parents:
diff changeset
24 (X_REG 0)
kono
parents:
diff changeset
25 (A_REG 1)
kono
parents:
diff changeset
26 (BC_REG 2)
kono
parents:
diff changeset
27 (C_REG 2)
kono
parents:
diff changeset
28 (B_REG 3)
kono
parents:
diff changeset
29 (DE_REG 4)
kono
parents:
diff changeset
30 (E_REG 4)
kono
parents:
diff changeset
31 (D_REG 5)
kono
parents:
diff changeset
32 (HL_REG 6)
kono
parents:
diff changeset
33 (L_REG 6)
kono
parents:
diff changeset
34 (H_REG 7)
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 (FP_REG 22)
kono
parents:
diff changeset
37 (SP_REG 32)
kono
parents:
diff changeset
38 (CC_REG 34)
kono
parents:
diff changeset
39 (ES_REG 35)
kono
parents:
diff changeset
40 (CS_REG 36)
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 (UNS_PROLOG 1)
kono
parents:
diff changeset
43 (UNS_EPILOG 1)
kono
parents:
diff changeset
44 (UNS_RETI 2)
kono
parents:
diff changeset
45 (UNS_RETB 3)
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 (UNS_SET_RB 10)
kono
parents:
diff changeset
48 (UNS_ES_ADDR 11)
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 (UNS_TRAMPOLINE_INIT 20)
kono
parents:
diff changeset
51 (UNS_TRAMPOLINE_UNINIT 21)
kono
parents:
diff changeset
52 (UNS_NONLOCAL_GOTO 22)
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 ])
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 (define_insn "nop"
kono
parents:
diff changeset
57 [(const_int 0)]
kono
parents:
diff changeset
58 ""
kono
parents:
diff changeset
59 "nop"
kono
parents:
diff changeset
60 )
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 (define_mode_iterator QHI [QI HI])
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 (include "predicates.md")
kono
parents:
diff changeset
65 (include "constraints.md")
kono
parents:
diff changeset
66 (include "rl78-expand.md")
kono
parents:
diff changeset
67 (include "rl78-virt.md")
kono
parents:
diff changeset
68 (include "rl78-real.md")
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 (define_attr "is_g13_muldiv_insn" "yes,no" (const_string "no"))
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 ;; Function Prologue/Epilogue Instructions
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 (define_expand "prologue"
kono
parents:
diff changeset
75 [(const_int 0)]
kono
parents:
diff changeset
76 ""
kono
parents:
diff changeset
77 "rl78_expand_prologue (); DONE;"
kono
parents:
diff changeset
78 )
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 (define_expand "epilogue"
kono
parents:
diff changeset
81 [(const_int 0)]
kono
parents:
diff changeset
82 ""
kono
parents:
diff changeset
83 "rl78_expand_epilogue (); DONE;"
kono
parents:
diff changeset
84 )
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 (define_expand "sibcall_epilogue"
kono
parents:
diff changeset
87 [(return)]
kono
parents:
diff changeset
88 ""
kono
parents:
diff changeset
89 "FAIL;"
kono
parents:
diff changeset
90 )
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 (define_insn "rl78_return"
kono
parents:
diff changeset
93 [(return)]
kono
parents:
diff changeset
94 ""
kono
parents:
diff changeset
95 "ret"
kono
parents:
diff changeset
96 )
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 (define_insn "interrupt_return"
kono
parents:
diff changeset
99 [(unspec_volatile [(return)] UNS_RETI) ]
kono
parents:
diff changeset
100 ""
kono
parents:
diff changeset
101 "reti"
kono
parents:
diff changeset
102 )
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 (define_insn "brk_interrupt_return"
kono
parents:
diff changeset
105 [(unspec_volatile [(return)] UNS_RETB) ]
kono
parents:
diff changeset
106 ""
kono
parents:
diff changeset
107 "retb"
kono
parents:
diff changeset
108 )
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 (define_expand "eh_return"
kono
parents:
diff changeset
111 [(match_operand:HI 0 "")]
kono
parents:
diff changeset
112 ""
kono
parents:
diff changeset
113 "rl78_expand_eh_epilogue (operands[0]);
kono
parents:
diff changeset
114 emit_barrier ();
kono
parents:
diff changeset
115 DONE;"
kono
parents:
diff changeset
116 )
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 ;; These are used only by prologue/epilogue so it's "safe" to pass
kono
parents:
diff changeset
119 ;; virtual registers.
kono
parents:
diff changeset
120 (define_insn "push"
kono
parents:
diff changeset
121 [(set (reg:HI SP_REG)
kono
parents:
diff changeset
122 (plus:HI (reg:HI SP_REG)
kono
parents:
diff changeset
123 (const_int -2)))
kono
parents:
diff changeset
124 (set (mem:HI (reg:HI SP_REG))
kono
parents:
diff changeset
125 (match_operand:HI 0 "register_operand" "ABDT,vZint"))]
kono
parents:
diff changeset
126 ""
kono
parents:
diff changeset
127 "@
kono
parents:
diff changeset
128 push\t%v0
kono
parents:
diff changeset
129 push\t%v0 ; %0"
kono
parents:
diff changeset
130 )
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 (define_insn "pop"
kono
parents:
diff changeset
133 [(set (match_operand:HI 0 "register_operand" "=ABDT,vZint")
kono
parents:
diff changeset
134 (mem:HI (reg:HI SP_REG)))
kono
parents:
diff changeset
135 (set (reg:HI SP_REG)
kono
parents:
diff changeset
136 (plus:HI (reg:HI SP_REG)
kono
parents:
diff changeset
137 (const_int 2)))]
kono
parents:
diff changeset
138 ""
kono
parents:
diff changeset
139 "@
kono
parents:
diff changeset
140 pop\t%v0
kono
parents:
diff changeset
141 pop\t%v0 ; %0"
kono
parents:
diff changeset
142 )
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 (define_insn "sel_rb"
kono
parents:
diff changeset
145 [(unspec_volatile [(match_operand 0 "immediate_operand" "")] UNS_SET_RB)]
kono
parents:
diff changeset
146 "!TARGET_G10"
kono
parents:
diff changeset
147 "sel\trb%u0"
kono
parents:
diff changeset
148 )
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 (define_insn "trampoline_init"
kono
parents:
diff changeset
151 [(set (match_operand 0 "register_operand" "=Z08W")
kono
parents:
diff changeset
152 (unspec_volatile [(match_operand 1 "register_operand" "Z08W")
kono
parents:
diff changeset
153 (match_operand 2 "register_operand" "Z10W")
kono
parents:
diff changeset
154 ] UNS_TRAMPOLINE_INIT))
kono
parents:
diff changeset
155 ]
kono
parents:
diff changeset
156 ""
kono
parents:
diff changeset
157 "call !!___trampoline_init ; %0 <= %1 %2"
kono
parents:
diff changeset
158 )
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 (define_insn "trampoline_uninit"
kono
parents:
diff changeset
161 [(unspec_volatile [(const_int 0)] UNS_TRAMPOLINE_UNINIT)
kono
parents:
diff changeset
162 ]
kono
parents:
diff changeset
163 ""
kono
parents:
diff changeset
164 "call !!___trampoline_uninit"
kono
parents:
diff changeset
165 )
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 ;; GCC restores $fp *before* using it to access values on the *old*
kono
parents:
diff changeset
168 ;; frame. So, we do it ourselves, to ensure this is not the case.
kono
parents:
diff changeset
169 ;; Note that while %1 is usually a label_ref, we allow for a
kono
parents:
diff changeset
170 ;; non-immediate as well.
kono
parents:
diff changeset
171 (define_expand "nonlocal_goto"
kono
parents:
diff changeset
172 [(set (pc)
kono
parents:
diff changeset
173 (unspec_volatile [(match_operand 0 "") ;; fp (ignore)
kono
parents:
diff changeset
174 (match_operand 1 "") ;; target
kono
parents:
diff changeset
175 (match_operand 2 "") ;; sp
kono
parents:
diff changeset
176 (match_operand 3 "") ;; ?
kono
parents:
diff changeset
177 ] UNS_NONLOCAL_GOTO))
kono
parents:
diff changeset
178 ]
kono
parents:
diff changeset
179 ""
kono
parents:
diff changeset
180 "emit_jump_insn (gen_nonlocal_goto_insn (operands[0], operands[1], operands[2], operands[3]));
kono
parents:
diff changeset
181 emit_barrier ();
kono
parents:
diff changeset
182 DONE;"
kono
parents:
diff changeset
183 )
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 (define_insn "nonlocal_goto_insn"
kono
parents:
diff changeset
186 [(set (pc)
kono
parents:
diff changeset
187 (unspec_volatile [(match_operand 0 "" "") ;; fp (ignore)
kono
parents:
diff changeset
188 (match_operand 1 "" "vi") ;; target
kono
parents:
diff changeset
189 (match_operand 2 "" "vi") ;; sp
kono
parents:
diff changeset
190 (match_operand 3 "" "vi") ;; ?
kono
parents:
diff changeset
191 ] UNS_NONLOCAL_GOTO))
kono
parents:
diff changeset
192 ]
kono
parents:
diff changeset
193 ""
kono
parents:
diff changeset
194 "; nonlocal goto
kono
parents:
diff changeset
195 movw ax, %3
kono
parents:
diff changeset
196 movw r22, ax
kono
parents:
diff changeset
197 movw ax, %2
kono
parents:
diff changeset
198 movw sp, ax
kono
parents:
diff changeset
199 movw ax, %1
kono
parents:
diff changeset
200 br ax
kono
parents:
diff changeset
201 "
kono
parents:
diff changeset
202 )
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 (define_expand "es_addr"
kono
parents:
diff changeset
205 [(unspec:SI [(reg:QI ES_REG)
kono
parents:
diff changeset
206 (match_operand:HI 0 "")
kono
parents:
diff changeset
207 ] UNS_ES_ADDR)]
kono
parents:
diff changeset
208 ""
kono
parents:
diff changeset
209 ""
kono
parents:
diff changeset
210 )
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 ;;======================================================================
kono
parents:
diff changeset
213 ;;
kono
parents:
diff changeset
214 ;; "macro" insns - cases where inline chunks of code are more
kono
parents:
diff changeset
215 ;; efficient than anything else.
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 (define_expand "addsi3"
kono
parents:
diff changeset
218 [(set (match_operand:SI 0 "nonimmediate_operand" "=&vm")
kono
parents:
diff changeset
219 (plus:SI (match_operand:SI 1 "general_operand" "vim")
kono
parents:
diff changeset
220 (match_operand 2 "general_operand" "vim")))
kono
parents:
diff changeset
221 ]
kono
parents:
diff changeset
222 ""
kono
parents:
diff changeset
223 "emit_insn (gen_addsi3_internal_virt (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
224 DONE;"
kono
parents:
diff changeset
225 )
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 (define_expand "adddi3"
kono
parents:
diff changeset
228 [(set (match_operand:DI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
229 (plus:DI (match_operand:DI 1 "general_operand" "")
kono
parents:
diff changeset
230 (match_operand:DI 2 "general_operand" "")))
kono
parents:
diff changeset
231 ]
kono
parents:
diff changeset
232 ""
kono
parents:
diff changeset
233 "rl78_emit_libcall (\"__adddi3\", PLUS, DImode, DImode, 3, operands);
kono
parents:
diff changeset
234 DONE;"
kono
parents:
diff changeset
235 )
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 (define_insn "addsi3_internal_virt"
kono
parents:
diff changeset
238 [(set (match_operand:SI 0 "nonimmediate_operand" "=v,&vm, vm")
kono
parents:
diff changeset
239 (plus:SI (match_operand:SI 1 "general_operand" "0, vim, vim")
kono
parents:
diff changeset
240 (match_operand 2 "general_operand" "vim,vim,vim")))
kono
parents:
diff changeset
241 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
242 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
243 ]
kono
parents:
diff changeset
244 "rl78_virt_insns_ok ()"
kono
parents:
diff changeset
245 ""
kono
parents:
diff changeset
246 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
247 )
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 (define_insn "addsi3_internal_real"
kono
parents:
diff changeset
250 [(set (match_operand:SI 0 "nonimmediate_operand" "=v,&vU, vU")
kono
parents:
diff changeset
251 (plus:SI (match_operand:SI 1 "general_operand" "+0, viU, viU")
kono
parents:
diff changeset
252 (match_operand 2 "general_operand" "viWabWhlWh1,viWabWhlWh1,viWabWhlWh1")))
kono
parents:
diff changeset
253 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
254 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
255 ]
kono
parents:
diff changeset
256 "rl78_real_insns_ok ()"
kono
parents:
diff changeset
257 { return rl78_addsi3_internal (operands, which_alternative); }
kono
parents:
diff changeset
258 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
259 )
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 (define_expand "subsi3"
kono
parents:
diff changeset
262 [(set (match_operand:SI 0 "nonimmediate_operand")
kono
parents:
diff changeset
263 (minus:SI (match_operand:SI 1 "general_operand")
kono
parents:
diff changeset
264 (match_operand 2 "general_operand")))
kono
parents:
diff changeset
265 ]
kono
parents:
diff changeset
266 ""
kono
parents:
diff changeset
267 "emit_insn (gen_subsi3_internal_virt (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
268 DONE;"
kono
parents:
diff changeset
269 )
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 (define_expand "subdi3"
kono
parents:
diff changeset
272 [(set (match_operand:DI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
273 (minus:DI (match_operand:DI 1 "general_operand" "")
kono
parents:
diff changeset
274 (match_operand:DI 2 "general_operand" "")))
kono
parents:
diff changeset
275 ]
kono
parents:
diff changeset
276 ""
kono
parents:
diff changeset
277 "rl78_emit_libcall (\"__subdi3\", MINUS, DImode, DImode, 3, operands);
kono
parents:
diff changeset
278 DONE;"
kono
parents:
diff changeset
279 )
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 (define_insn "subsi3_internal_virt"
kono
parents:
diff changeset
282 [(set (match_operand:SI 0 "nonimmediate_operand" "=v,&vm, vm")
kono
parents:
diff changeset
283 (minus:SI (match_operand:SI 1 "general_operand" "0, vim, vim")
kono
parents:
diff changeset
284 (match_operand 2 "general_operand" "vim,vim,vim")))
kono
parents:
diff changeset
285 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
286 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
287 ]
kono
parents:
diff changeset
288 "rl78_virt_insns_ok ()"
kono
parents:
diff changeset
289 ""
kono
parents:
diff changeset
290 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
291 )
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 (define_insn "subsi3_internal_real"
kono
parents:
diff changeset
294 [(set (match_operand:SI 0 "nonimmediate_operand" "=v,&vU, vU")
kono
parents:
diff changeset
295 (minus:SI (match_operand:SI 1 "general_operand" "+0, viU, viU")
kono
parents:
diff changeset
296 (match_operand 2 "general_operand" "viWabWhlWh1,viWabWhlWh1,viWabWhlWh1")))
kono
parents:
diff changeset
297 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
298 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
299 ]
kono
parents:
diff changeset
300 "rl78_real_insns_ok ()"
kono
parents:
diff changeset
301 "@
kono
parents:
diff changeset
302 movw ax,%h1 \;subw ax,%h2 \;movw %h0, ax \;movw ax,%H1 \;sknc \;decw ax \;subw ax,%H2 \;movw %H0,ax
kono
parents:
diff changeset
303 movw ax,%h1 \;subw ax,%h2 \;movw %h0, ax \;movw ax,%H1 \;sknc \;decw ax \;subw ax,%H2 \;movw %H0,ax
kono
parents:
diff changeset
304 movw ax,%h1 \;subw ax,%h2 \;movw bc, ax \;movw ax,%H1 \;sknc \;decw ax \;subw ax,%H2 \;movw %H0,ax \;movw ax,bc \;movw %h0, ax"
kono
parents:
diff changeset
305 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
306 )
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 (define_expand "mulqi3"
kono
parents:
diff changeset
309 [(parallel
kono
parents:
diff changeset
310 [(set (match_operand:QI 0 "register_operand")
kono
parents:
diff changeset
311 (mult:QI (match_operand:QI 1 "general_operand")
kono
parents:
diff changeset
312 (match_operand:QI 2 "nonmemory_operand")))
kono
parents:
diff changeset
313 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
314 ])
kono
parents:
diff changeset
315 ]
kono
parents:
diff changeset
316 "" ; mulu supported by all targets
kono
parents:
diff changeset
317 ""
kono
parents:
diff changeset
318 )
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 (define_expand "mulhi3"
kono
parents:
diff changeset
321 [(set (match_operand:HI 0 "register_operand")
kono
parents:
diff changeset
322 (mult:HI (match_operand:HI 1 "general_operand")
kono
parents:
diff changeset
323 (match_operand:HI 2 "nonmemory_operand")))
kono
parents:
diff changeset
324 ]
kono
parents:
diff changeset
325 "! RL78_MUL_NONE"
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 if (RL78_MUL_G14)
kono
parents:
diff changeset
328 emit_insn (gen_mulhi3_g14 (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
329 else /* RL78_MUL_G13 */
kono
parents:
diff changeset
330 emit_insn (gen_mulhi3_g13 (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
331 DONE;
kono
parents:
diff changeset
332 }
kono
parents:
diff changeset
333 )
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 (define_expand "mulsi3"
kono
parents:
diff changeset
336 [(set (match_operand:SI 0 "register_operand")
kono
parents:
diff changeset
337 (mult:SI (match_operand:SI 1 "general_operand")
kono
parents:
diff changeset
338 (match_operand:SI 2 "nonmemory_operand")))
kono
parents:
diff changeset
339 ]
kono
parents:
diff changeset
340 "! RL78_MUL_NONE"
kono
parents:
diff changeset
341 {
kono
parents:
diff changeset
342 if (RL78_MUL_G14)
kono
parents:
diff changeset
343 emit_insn (gen_mulsi3_g14 (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
344 else /* RL78_MUL_G13 */
kono
parents:
diff changeset
345 emit_insn (gen_mulsi3_g13 (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
346 DONE;
kono
parents:
diff changeset
347 }
kono
parents:
diff changeset
348 )
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 (define_insn "*mulqi3_rl78"
kono
parents:
diff changeset
351 [(set (match_operand:QI 0 "register_operand" "=&v")
kono
parents:
diff changeset
352 (mult:QI (match_operand:QI 1 "general_operand" "viU")
kono
parents:
diff changeset
353 (match_operand:QI 2 "general_operand" "vi")))
kono
parents:
diff changeset
354 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
355 ]
kono
parents:
diff changeset
356 "" ; mulu supported by all targets
kono
parents:
diff changeset
357 "; mulqi macro %0 = %1 * %2
kono
parents:
diff changeset
358 mov a, %h1
kono
parents:
diff changeset
359 mov x, a
kono
parents:
diff changeset
360 mov a, %h2
kono
parents:
diff changeset
361 mulu x ; ax = a * x
kono
parents:
diff changeset
362 mov a, x
kono
parents:
diff changeset
363 mov %h0, a
kono
parents:
diff changeset
364 ; end of mulqi macro"
kono
parents:
diff changeset
365 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
366 )
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 (define_insn "mulhi3_g14"
kono
parents:
diff changeset
369 [(set (match_operand:HI 0 "register_operand" "=&v")
kono
parents:
diff changeset
370 (mult:HI (match_operand:HI 1 "general_operand" "viU")
kono
parents:
diff changeset
371 (match_operand:HI 2 "general_operand" "vi")))
kono
parents:
diff changeset
372 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
373 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
374 ]
kono
parents:
diff changeset
375 "RL78_MUL_G14"
kono
parents:
diff changeset
376 "; G14 mulhi macro %0 = %1 * %2
kono
parents:
diff changeset
377 movw ax, %h1
kono
parents:
diff changeset
378 movw bc, %h2
kono
parents:
diff changeset
379 mulhu ; bcax = bc * ax
kono
parents:
diff changeset
380 movw %h0, ax
kono
parents:
diff changeset
381 ; end of mulhi macro"
kono
parents:
diff changeset
382 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
383 )
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 (define_insn "mulhi3_g13"
kono
parents:
diff changeset
386 [(set (match_operand:HI 0 "register_operand" "=&v")
kono
parents:
diff changeset
387 (mult:HI (match_operand:HI 1 "general_operand" "viU")
kono
parents:
diff changeset
388 (match_operand:HI 2 "general_operand" "vi")))
kono
parents:
diff changeset
389 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
390 ]
kono
parents:
diff changeset
391 "RL78_MUL_G13"
kono
parents:
diff changeset
392 "; G13 mulhi macro %0 = %1 * %2
kono
parents:
diff changeset
393 mov a, #0x00
kono
parents:
diff changeset
394 mov !0xf00e8, a ; MDUC
kono
parents:
diff changeset
395 movw ax, %h1
kono
parents:
diff changeset
396 movw 0xffff0, ax ; MDAL
kono
parents:
diff changeset
397 movw ax, %h2
kono
parents:
diff changeset
398 movw 0xffff2, ax ; MDAH
kono
parents:
diff changeset
399 nop ; mdb = mdal * mdah
kono
parents:
diff changeset
400 movw ax, 0xffff6 ; MDBL
kono
parents:
diff changeset
401 movw %h0, ax
kono
parents:
diff changeset
402 ; end of mulhi macro"
kono
parents:
diff changeset
403 [(set_attr "valloc" "macax")
kono
parents:
diff changeset
404 (set_attr "is_g13_muldiv_insn" "yes")]
kono
parents:
diff changeset
405 )
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 ;; 0xFFFF0 is MACR(L). 0xFFFF2 is MACR(H) but we don't care about it
kono
parents:
diff changeset
408 ;; because we're only using the lower 16 bits (which is the upper 16
kono
parents:
diff changeset
409 ;; bits of the result).
kono
parents:
diff changeset
410 (define_insn "mulsi3_g14"
kono
parents:
diff changeset
411 [(set (match_operand:SI 0 "register_operand" "=&v")
kono
parents:
diff changeset
412 (mult:SI (match_operand:SI 1 "general_operand" "viU")
kono
parents:
diff changeset
413 (match_operand:SI 2 "general_operand" "vi")))
kono
parents:
diff changeset
414 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
415 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
416 ]
kono
parents:
diff changeset
417 "RL78_MUL_G14"
kono
parents:
diff changeset
418 "; G14 mulsi macro %0 = %1 * %2
kono
parents:
diff changeset
419 movw ax, %h1
kono
parents:
diff changeset
420 movw bc, %h2
kono
parents:
diff changeset
421 MULHU ; bcax = bc * ax
kono
parents:
diff changeset
422 movw %h0, ax
kono
parents:
diff changeset
423 movw ax, bc
kono
parents:
diff changeset
424 movw 0xffff0, ax
kono
parents:
diff changeset
425 movw ax, %H1
kono
parents:
diff changeset
426 movw bc, %h2
kono
parents:
diff changeset
427 MACHU ; MACR += bc * ax
kono
parents:
diff changeset
428 movw ax, %h1
kono
parents:
diff changeset
429 movw bc, %H2
kono
parents:
diff changeset
430 MACHU ; MACR += bc * ax
kono
parents:
diff changeset
431 movw ax, 0xffff0
kono
parents:
diff changeset
432 movw %H0, ax
kono
parents:
diff changeset
433 ; end of mulsi macro"
kono
parents:
diff changeset
434 [(set_attr "valloc" "macax")]
kono
parents:
diff changeset
435 )
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 ;; 0xFFFF0 is MDAL. 0xFFFF2 is MDAH.
kono
parents:
diff changeset
438 ;; 0xFFFF6 is MDBL. 0xFFFF4 is MDBH.
kono
parents:
diff changeset
439 ;; 0xF00E0 is MDCL. 0xF00E2 is MDCH.
kono
parents:
diff changeset
440 ;; 0xF00E8 is MDUC.
kono
parents:
diff changeset
441 ;; Warning: this matches the silicon not the documentation.
kono
parents:
diff changeset
442 (define_insn "mulsi3_g13"
kono
parents:
diff changeset
443 [(set (match_operand:SI 0 "register_operand" "=&v")
kono
parents:
diff changeset
444 (mult:SI (match_operand:SI 1 "general_operand" "viU")
kono
parents:
diff changeset
445 (match_operand:SI 2 "general_operand" "viU")))
kono
parents:
diff changeset
446 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
447 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
448 ]
kono
parents:
diff changeset
449 "RL78_MUL_G13"
kono
parents:
diff changeset
450 "; G13 mulsi macro %0 = %1 * %2
kono
parents:
diff changeset
451 mov a, #0x00
kono
parents:
diff changeset
452 mov !0xf00e8, a ; MDUC
kono
parents:
diff changeset
453 movw ax, %h1
kono
parents:
diff changeset
454 movw 0xffff0, ax ; MDAL
kono
parents:
diff changeset
455 movw ax, %h2
kono
parents:
diff changeset
456 movw 0xffff2, ax ; MDAH
kono
parents:
diff changeset
457 nop ; mdb = mdal * mdah
kono
parents:
diff changeset
458 movw ax, 0xffff6 ; MDBL
kono
parents:
diff changeset
459 movw %h0, ax
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 mov a, #0x40
kono
parents:
diff changeset
462 mov !0xf00e8, a ; MDUC
kono
parents:
diff changeset
463 movw ax, 0xffff4 ; MDBH
kono
parents:
diff changeset
464 movw !0xf00e0, ax ; MDCL
kono
parents:
diff changeset
465 movw ax, #0
kono
parents:
diff changeset
466 movw !0xf00e2, ax ; MDCL
kono
parents:
diff changeset
467 movw ax, %H1
kono
parents:
diff changeset
468 movw 0xffff0, ax ; MDAL
kono
parents:
diff changeset
469 movw ax, %h2
kono
parents:
diff changeset
470 movw 0xffff2, ax ; MDAH
kono
parents:
diff changeset
471 nop ; mdc += mdal * mdah
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 mov a, #0x40
kono
parents:
diff changeset
474 mov !0xf00e8, a ; MDUC
kono
parents:
diff changeset
475 movw ax, %h1
kono
parents:
diff changeset
476 movw 0xffff0, ax ; MDAL
kono
parents:
diff changeset
477 movw ax, %H2
kono
parents:
diff changeset
478 movw 0xffff2, ax ; MDAH
kono
parents:
diff changeset
479 nop ; mdc += mdal * mdah
kono
parents:
diff changeset
480 nop ; Additional nop for MAC
kono
parents:
diff changeset
481 movw ax, !0xf00e0 ; MDCL
kono
parents:
diff changeset
482 movw %H0, ax
kono
parents:
diff changeset
483 ; end of mulsi macro"
kono
parents:
diff changeset
484 [(set_attr "valloc" "macax")
kono
parents:
diff changeset
485 (set_attr "is_g13_muldiv_insn" "yes")]
kono
parents:
diff changeset
486 )
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 (define_expand "udivmodhi4"
kono
parents:
diff changeset
489 [(parallel
kono
parents:
diff changeset
490 [(set (match_operand:HI 0 "register_operand")
kono
parents:
diff changeset
491 (udiv:HI (match_operand:HI 1 "register_operand")
kono
parents:
diff changeset
492 (match_operand:HI 2 "register_operand")))
kono
parents:
diff changeset
493 (set (match_operand:HI 3 "register_operand")
kono
parents:
diff changeset
494 (umod:HI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
495 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
496 (clobber (reg:HI DE_REG))
kono
parents:
diff changeset
497 ])
kono
parents:
diff changeset
498 ]
kono
parents:
diff changeset
499 "RL78_MUL_G14"
kono
parents:
diff changeset
500 ""
kono
parents:
diff changeset
501 )
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 (define_insn "*udivmodhi4_g14"
kono
parents:
diff changeset
504 [(set (match_operand:HI 0 "register_operand" "=v")
kono
parents:
diff changeset
505 (udiv:HI (match_operand:HI 1 "register_operand" "v")
kono
parents:
diff changeset
506 (match_operand:HI 2 "register_operand" "v")))
kono
parents:
diff changeset
507 (set (match_operand:HI 3 "register_operand" "=v")
kono
parents:
diff changeset
508 (umod:HI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
509 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
510 (clobber (reg:HI DE_REG))
kono
parents:
diff changeset
511 ]
kono
parents:
diff changeset
512 "RL78_MUL_G14"
kono
parents:
diff changeset
513 {
kono
parents:
diff changeset
514 if (find_reg_note (insn, REG_UNUSED, operands[3]))
kono
parents:
diff changeset
515 return "; G14 udivhi macro %0 = %1 / %2 \n\
kono
parents:
diff changeset
516 movw ax, %h1 \n\
kono
parents:
diff changeset
517 movw de, %h2 \n\
kono
parents:
diff changeset
518 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
519 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
520 divhu ; ax = ax / de \n\
kono
parents:
diff changeset
521 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
522 movw %h0, ax \n\
kono
parents:
diff changeset
523 ; end of udivhi macro";
kono
parents:
diff changeset
524 else if (find_reg_note (insn, REG_UNUSED, operands[0]))
kono
parents:
diff changeset
525 return "; G14 umodhi macro %3 = %1 %% %2 \n\
kono
parents:
diff changeset
526 movw ax, %h1 \n\
kono
parents:
diff changeset
527 movw de, %h2 \n\
kono
parents:
diff changeset
528 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
529 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
530 divhu ; de = ax %% de \n\
kono
parents:
diff changeset
531 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
532 movw ax, de \n\
kono
parents:
diff changeset
533 movw %h3, ax \n\
kono
parents:
diff changeset
534 ; end of umodhi macro";
kono
parents:
diff changeset
535 else
kono
parents:
diff changeset
536 return "; G14 udivmodhi macro %0 = %1 / %2 and %3 = %1 %% %2 \n\
kono
parents:
diff changeset
537 movw ax, %h1 \n\
kono
parents:
diff changeset
538 movw de, %h2 \n\
kono
parents:
diff changeset
539 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
540 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
541 divhu ; ax = ax / de, de = ax %% de \n\
kono
parents:
diff changeset
542 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
543 movw %h0, ax \n\
kono
parents:
diff changeset
544 movw ax, de \n\
kono
parents:
diff changeset
545 movw %h3, ax \n\
kono
parents:
diff changeset
546 ; end of udivmodhi macro";
kono
parents:
diff changeset
547 }
kono
parents:
diff changeset
548 [(set_attr "valloc" "divhi")]
kono
parents:
diff changeset
549 )
kono
parents:
diff changeset
550
kono
parents:
diff changeset
551 (define_expand "udivmodsi4"
kono
parents:
diff changeset
552 [(parallel
kono
parents:
diff changeset
553 [(set (match_operand:SI 0 "register_operand")
kono
parents:
diff changeset
554 (udiv:SI (match_operand:SI 1 "register_operand")
kono
parents:
diff changeset
555 (match_operand:SI 2 "register_operand")))
kono
parents:
diff changeset
556 (set (match_operand:SI 3 "register_operand")
kono
parents:
diff changeset
557 (umod:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
558 ])
kono
parents:
diff changeset
559 ]
kono
parents:
diff changeset
560 "! RL78_MUL_NONE && ! optimize_size"
kono
parents:
diff changeset
561 {
kono
parents:
diff changeset
562 if (RL78_MUL_G14)
kono
parents:
diff changeset
563 emit_insn (gen_udivmodsi4_g14 (operands[0], operands[1], operands[2], operands[3]));
kono
parents:
diff changeset
564 else /* RL78_MUL_G13 */
kono
parents:
diff changeset
565 emit_insn (gen_udivmodsi4_g13 (operands[0], operands[1], operands[2], operands[3]));
kono
parents:
diff changeset
566 DONE;
kono
parents:
diff changeset
567 }
kono
parents:
diff changeset
568 )
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 (define_insn "udivmodsi4_g14"
kono
parents:
diff changeset
571 [(set (match_operand:SI 0 "register_operand" "=v")
kono
parents:
diff changeset
572 (udiv:SI (match_operand:SI 1 "register_operand" "v")
kono
parents:
diff changeset
573 (match_operand:SI 2 "register_operand" "v")))
kono
parents:
diff changeset
574 (set (match_operand:SI 3 "register_operand" "=v")
kono
parents:
diff changeset
575 (umod:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
576 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
577 (clobber (reg:HI BC_REG))
kono
parents:
diff changeset
578 (clobber (reg:HI DE_REG))
kono
parents:
diff changeset
579 (clobber (reg:HI HL_REG))
kono
parents:
diff changeset
580 ]
kono
parents:
diff changeset
581 "RL78_MUL_G14"
kono
parents:
diff changeset
582 {
kono
parents:
diff changeset
583 if (find_reg_note (insn, REG_UNUSED, operands[3]))
kono
parents:
diff changeset
584 return "; G14 udivsi macro %0 = %1 / %2 \n\
kono
parents:
diff changeset
585 movw ax, %h1 \n\
kono
parents:
diff changeset
586 movw bc, %H1 \n\
kono
parents:
diff changeset
587 movw de, %h2 \n\
kono
parents:
diff changeset
588 movw hl, %H2 \n\
kono
parents:
diff changeset
589 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
590 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
591 divwu ; bcax = bcax / hlde \n\
kono
parents:
diff changeset
592 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
593 movw %h0, ax \n\
kono
parents:
diff changeset
594 movw ax, bc \n\
kono
parents:
diff changeset
595 movw %H0, ax \n\
kono
parents:
diff changeset
596 ; end of udivsi macro";
kono
parents:
diff changeset
597 else if (find_reg_note (insn, REG_UNUSED, operands[0]))
kono
parents:
diff changeset
598 return "; G14 umodsi macro %3 = %1 %% %2 \n\
kono
parents:
diff changeset
599 movw ax, %h1 \n\
kono
parents:
diff changeset
600 movw bc, %H1 \n\
kono
parents:
diff changeset
601 movw de, %h2 \n\
kono
parents:
diff changeset
602 movw hl, %H2 \n\
kono
parents:
diff changeset
603 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
604 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
605 divwu ; hlde = bcax %% hlde \n\
kono
parents:
diff changeset
606 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
607 movw ax, de \n\
kono
parents:
diff changeset
608 movw %h3, ax \n\
kono
parents:
diff changeset
609 movw ax, hl \n\
kono
parents:
diff changeset
610 movw %H3, ax \n\
kono
parents:
diff changeset
611 ; end of umodsi macro";
kono
parents:
diff changeset
612 else
kono
parents:
diff changeset
613 return "; G14 udivmodsi macro %0 = %1 / %2 and %3 = %1 %% %2 \n\
kono
parents:
diff changeset
614 movw ax, %h1 \n\
kono
parents:
diff changeset
615 movw bc, %H1 \n\
kono
parents:
diff changeset
616 movw de, %h2 \n\
kono
parents:
diff changeset
617 movw hl, %H2 \n\
kono
parents:
diff changeset
618 push psw ; Save the current interrupt status \n\
kono
parents:
diff changeset
619 di ; Disable interrupts. See Renesas Technical update TN-RL*-A025B/E \n\
kono
parents:
diff changeset
620 divwu ; bcax = bcax / hlde, hlde = bcax %% hlde \n\
kono
parents:
diff changeset
621 pop psw ; Restore saved interrupt status \n\
kono
parents:
diff changeset
622 movw %h0, ax \n\
kono
parents:
diff changeset
623 movw ax, bc \n\
kono
parents:
diff changeset
624 movw %H0, ax \n\
kono
parents:
diff changeset
625 movw ax, de \n\
kono
parents:
diff changeset
626 movw %h3, ax \n\
kono
parents:
diff changeset
627 movw ax, hl \n\
kono
parents:
diff changeset
628 movw %H3, ax \n\
kono
parents:
diff changeset
629 ; end of udivmodsi macro";
kono
parents:
diff changeset
630 }
kono
parents:
diff changeset
631 [(set_attr "valloc" "divsi")]
kono
parents:
diff changeset
632 )
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 ;; Warning: these values match the silicon not the documentation.
kono
parents:
diff changeset
635 ;; 0xFFFF0 is MDAL. 0xFFFF2 is MDAH.
kono
parents:
diff changeset
636 ;; 0xFFFF6 is MDBL. 0xFFFF4 is MDBH.
kono
parents:
diff changeset
637 ;; 0xF00E0 is MDCL. 0xF00E2 is MDCH.
kono
parents:
diff changeset
638 ;; 0xF00E8 is MDUC.
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 (define_insn "udivmodsi4_g13"
kono
parents:
diff changeset
641 [(set (match_operand:SI 0 "register_operand" "=v")
kono
parents:
diff changeset
642 (udiv:SI (match_operand:SI 1 "register_operand" "v")
kono
parents:
diff changeset
643 (match_operand:SI 2 "register_operand" "v")))
kono
parents:
diff changeset
644 (set (match_operand:SI 3 "register_operand" "=v")
kono
parents:
diff changeset
645 (umod:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
646 (clobber (reg:HI AX_REG))
kono
parents:
diff changeset
647 ]
kono
parents:
diff changeset
648 "RL78_MUL_G13"
kono
parents:
diff changeset
649 {
kono
parents:
diff changeset
650 if (find_reg_note (insn, REG_UNUSED, operands[3]))
kono
parents:
diff changeset
651 return "; G13 udivsi macro %0 = %1 / %2 \n\
kono
parents:
diff changeset
652 mov a, #0xC0 ; Set DIVMODE=1 and MACMODE=1 \n\
kono
parents:
diff changeset
653 mov !0xf00e8, a ; This preps the peripheral for division without interrupt generation \n\
kono
parents:
diff changeset
654 movw ax, %H1 \n\
kono
parents:
diff changeset
655 movw 0xffff2, ax ; MDAH \n\
kono
parents:
diff changeset
656 movw ax, %h1 \n\
kono
parents:
diff changeset
657 movw 0xffff0, ax ; MDAL \n\
kono
parents:
diff changeset
658 movw ax, %H2 \n\
kono
parents:
diff changeset
659 movw 0xffff4, ax ; MDBH \n\
kono
parents:
diff changeset
660 movw ax, %h2 \n\
kono
parents:
diff changeset
661 movw 0xffff6, ax ; MDBL \n\
kono
parents:
diff changeset
662 mov a, #0xC1 ; Set the DIVST bit in MDUC \n\
kono
parents:
diff changeset
663 mov !0xf00e8, a ; This starts the division op \n\
kono
parents:
diff changeset
664 1: mov a, !0xf00e8 ; Wait 16 clocks or until DIVST is clear \n\
kono
parents:
diff changeset
665 bt a.0, $1b \n\
kono
parents:
diff changeset
666 movw ax, 0xffff0 ; Read the quotient \n\
kono
parents:
diff changeset
667 movw %h0, ax \n\
kono
parents:
diff changeset
668 movw ax, 0xffff2 \n\
kono
parents:
diff changeset
669 movw %H0, ax \n\
kono
parents:
diff changeset
670 ; end of udivsi macro";
kono
parents:
diff changeset
671 else if (find_reg_note (insn, REG_UNUSED, operands[0]))
kono
parents:
diff changeset
672 return "; G13 umodsi macro %3 = %1 %% %2 \n\
kono
parents:
diff changeset
673 mov a, #0xC0 ; Set DIVMODE=1 and MACMODE=1 \n\
kono
parents:
diff changeset
674 mov !0xf00e8, a ; This preps the peripheral for division without interrupt generation \n\
kono
parents:
diff changeset
675 movw ax, %H1 \n\
kono
parents:
diff changeset
676 movw 0xffff2, ax ; MDAH \n\
kono
parents:
diff changeset
677 movw ax, %h1 \n\
kono
parents:
diff changeset
678 movw 0xffff0, ax ; MDAL \n\
kono
parents:
diff changeset
679 movw ax, %H2 \n\
kono
parents:
diff changeset
680 movw 0xffff4, ax ; MDBH \n\
kono
parents:
diff changeset
681 movw ax, %h2 \n\
kono
parents:
diff changeset
682 movw 0xffff6, ax ; MDBL \n\
kono
parents:
diff changeset
683 mov a, #0xC1 ; Set the DIVST bit in MDUC \n\
kono
parents:
diff changeset
684 mov !0xf00e8, a ; This starts the division op \n\
kono
parents:
diff changeset
685 1: mov a, !0xf00e8 ; Wait 16 clocks or until DIVST is clear \n\
kono
parents:
diff changeset
686 bt a.0, $1b \n\
kono
parents:
diff changeset
687 movw ax, !0xf00e0 ; Read the remainder \n\
kono
parents:
diff changeset
688 movw %h3, ax \n\
kono
parents:
diff changeset
689 movw ax, !0xf00e2 \n\
kono
parents:
diff changeset
690 movw %H3, ax \n\
kono
parents:
diff changeset
691 ; end of umodsi macro";
kono
parents:
diff changeset
692 else
kono
parents:
diff changeset
693 return "; G13 udivmodsi macro %0 = %1 / %2 and %3 = %1 %% %2 \n\
kono
parents:
diff changeset
694 mov a, #0xC0 ; Set DIVMODE=1 and MACMODE=1 \n\
kono
parents:
diff changeset
695 mov !0xf00e8, a ; This preps the peripheral for division without interrupt generation \n\
kono
parents:
diff changeset
696 movw ax, %H1 \n\
kono
parents:
diff changeset
697 movw 0xffff2, ax ; MDAH \n\
kono
parents:
diff changeset
698 movw ax, %h1 \n\
kono
parents:
diff changeset
699 movw 0xffff0, ax ; MDAL \n\
kono
parents:
diff changeset
700 movw ax, %H2 \n\
kono
parents:
diff changeset
701 movw 0xffff4, ax ; MDBH \n\
kono
parents:
diff changeset
702 movw ax, %h2 \n\
kono
parents:
diff changeset
703 movw 0xffff6, ax ; MDBL \n\
kono
parents:
diff changeset
704 mov a, #0xC1 ; Set the DIVST bit in MDUC \n\
kono
parents:
diff changeset
705 mov !0xf00e8, a ; This starts the division op \n\
kono
parents:
diff changeset
706 1: mov a, !0xf00e8 ; Wait 16 clocks or until DIVST is clear \n\
kono
parents:
diff changeset
707 bt a.0, $1b \n\
kono
parents:
diff changeset
708 movw ax, 0xffff0 ; Read the quotient \n\
kono
parents:
diff changeset
709 movw %h0, ax \n\
kono
parents:
diff changeset
710 movw ax, 0xffff2 \n\
kono
parents:
diff changeset
711 movw %H0, ax \n\
kono
parents:
diff changeset
712 movw ax, !0xf00e0 ; Read the remainder \n\
kono
parents:
diff changeset
713 movw %h3, ax \n\
kono
parents:
diff changeset
714 movw ax, !0xf00e2 \n\
kono
parents:
diff changeset
715 movw %H3, ax \n\
kono
parents:
diff changeset
716 ; end of udivmodsi macro";
kono
parents:
diff changeset
717 }
kono
parents:
diff changeset
718 [(set_attr "valloc" "macax")
kono
parents:
diff changeset
719 (set_attr "is_g13_muldiv_insn" "yes")]
kono
parents:
diff changeset
720 )
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722 (define_expand "movdi"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 (match_operand:DI 1 "general_operand" ""))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 "rl78_split_movdi(operands, DImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 (define_expand "movdf"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 [(set (match_operand:DF 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 (match_operand:DF 1 "general_operand" ""))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
733 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
734 "rl78_split_movdi(operands, DFmode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
738 (define_expand "umindi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740 (umin:DI (match_operand:DI 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 (match_operand:DI 2 "general_operand" "")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 ]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 "optimize_size"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744 "rl78_emit_libcall (\"__umindi3\", UMIN, DImode, DImode, 3, operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
745 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
746 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
748 (define_expand "umaxdi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 (umax:DI (match_operand:DI 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751 (match_operand:DI 2 "general_operand" "")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 ]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 "optimize_size"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754 "rl78_emit_libcall (\"__umaxdi3\", UMAX, DImode, DImode, 3, operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 (define_expand "smindi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 (smin:DI (match_operand:DI 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
761 (match_operand:DI 2 "general_operand" "")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 ]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 "optimize_size"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 "rl78_emit_libcall (\"__smindi3\", SMIN, DImode, DImode, 3, operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
767
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 (define_expand "smaxdi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
769 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
770 (smax:DI (match_operand:DI 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
771 (match_operand:DI 2 "general_operand" "")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 ]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 "optimize_size"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 "rl78_emit_libcall (\"__smaxdi3\", SMAX, DImode, DImode, 3, operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
775 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
777
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 (define_expand "anddi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
779 [(set (match_operand:DI 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780 (and:DI (match_operand:DI 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 (match_operand:DI 2 "general_operand" "")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 ]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 "optimize_size"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 "rl78_emit_libcall (\"__anddi3\", AND, DImode, DImode, 3, operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 DONE;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 )