rl78-virt.md revision 1.11 1 1.1 mrg ;; Machine Description for Renesas RL78 processors
2 1.11 mrg ;; Copyright (C) 2011-2022 Free Software Foundation, Inc.
3 1.1 mrg ;; Contributed by Red Hat.
4 1.1 mrg
5 1.1 mrg ;; This file is part of GCC.
6 1.1 mrg
7 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify
8 1.1 mrg ;; it under the terms of the GNU General Public License as published by
9 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option)
10 1.1 mrg ;; any later version.
11 1.1 mrg
12 1.1 mrg ;; GCC is distributed in the hope that it will be useful,
13 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 mrg ;; GNU General Public License for more details.
16 1.1 mrg
17 1.1 mrg ;; You should have received a copy of the GNU General Public License
18 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
19 1.1 mrg ;; <http://www.gnu.org/licenses/>.
20 1.1 mrg
22 1.1 mrg ;; In this MD file, we define those insn patterns that involve
23 1.1 mrg ;; registers, where such registers are virtual until allocated to a
24 1.1 mrg ;; physical register. All of these insns need to be conditional on
25 1.1 mrg ;; rl78_virt_insns_ok () being true.
26 1.1 mrg
27 1.1 mrg ;; This tells the physical register allocator what method to use to
28 1.1 mrg ;; allocate registers. Basically, this defines the template of the
29 1.1 mrg ;; instruction - op1 is of the form "a = op(b)", op2 is "a = b op c"
30 1.1 mrg ;; etc.
31 1.5 mrg
32 1.1 mrg (define_attr "valloc" "op1,op2,ro1,cmp,umul,macax,divhi,divsi"
33 1.1 mrg (const_string "op2"))
34 1.1 mrg
35 1.1 mrg ;;---------- Moving ------------------------
36 1.3 mrg
37 1.3 mrg (define_insn "*movqi_virt_mm"
38 1.3 mrg [(set (match_operand:QI 0 "rl78_near_mem_operand" "=Y")
39 1.3 mrg (match_operand 1 "rl78_near_mem_operand" "Y"))]
40 1.3 mrg "rl78_virt_insns_ok ()"
41 1.3 mrg "v.mov %0, %1"
42 1.3 mrg [(set_attr "valloc" "op1")]
43 1.3 mrg )
44 1.1 mrg
45 1.5 mrg (define_insn "*movqi_virt"
46 1.5 mrg [(set (match_operand:QI 0 "nonimmediate_operand" "=vY,v,*Wfr,Y,*Wfr,*Wfr")
47 1.1 mrg (match_operand 1 "general_operand" "vInt8JY,*Wfr,vInt8J,*Wfr,Y,*Wfr"))]
48 1.1 mrg "rl78_virt_insns_ok ()"
49 1.1 mrg "v.mov %0, %1"
50 1.1 mrg [(set_attr "valloc" "op1")]
51 1.1 mrg )
52 1.3 mrg
53 1.3 mrg (define_insn "*movhi_virt_mm"
54 1.3 mrg [(set (match_operand:HI 0 "rl78_near_mem_operand" "=Y")
55 1.3 mrg (match_operand:HI 1 "rl78_near_mem_operand" "Y"))]
56 1.3 mrg "rl78_virt_insns_ok ()"
57 1.3 mrg "v.movw %0, %1"
58 1.3 mrg [(set_attr "valloc" "op1")]
59 1.3 mrg )
60 1.1 mrg
61 1.5 mrg (define_insn "*movhi_virt"
62 1.5 mrg [(set (match_operand:HI 0 "nonimmediate_operand" "=vS, Y, v, *Wfr")
63 1.1 mrg (match_operand:HI 1 "general_operand" "viYS, viS, *Wfr, vi"))]
64 1.1 mrg "rl78_virt_insns_ok ()"
65 1.1 mrg "v.movw %0, %1"
66 1.1 mrg [(set_attr "valloc" "op1")]
67 1.1 mrg )
68 1.8 mrg
69 1.8 mrg (define_insn "*bswaphi2_virt"
70 1.8 mrg [(set (match_operand:HI 0 "rl78_nonfar_nonimm_operand" "=vm")
71 1.8 mrg (bswap:HI (match_operand:HI 1 "general_operand" "vim")))]
72 1.8 mrg "rl78_virt_insns_ok ()"
73 1.8 mrg "v.bswaphi\t%0, %1"
74 1.8 mrg [(set_attr "valloc" "op1")]
75 1.8 mrg )
76 1.1 mrg
77 1.1 mrg ;;---------- Conversions ------------------------
78 1.1 mrg
79 1.5 mrg (define_insn "*zero_extendqihi2_virt"
80 1.5 mrg [(set (match_operand:HI 0 "rl78_nonfar_nonimm_operand" "=vY,*Wfr")
81 1.5 mrg (zero_extend:HI (match_operand:QI 1 "general_operand" "vim,viY")))]
82 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 2)"
83 1.1 mrg "v.zero_extend\t%0, %1"
84 1.1 mrg [(set_attr "valloc" "op1")]
85 1.1 mrg )
86 1.1 mrg
87 1.5 mrg (define_insn "*extendqihi2_virt"
88 1.5 mrg [(set (match_operand:HI 0 "rl78_nonfar_nonimm_operand" "=vY,*Wfr")
89 1.5 mrg (sign_extend:HI (match_operand:QI 1 "general_operand" "vim,viY")))]
90 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 2)"
91 1.1 mrg "v.sign_extend\t%0, %1"
92 1.1 mrg [(set_attr "valloc" "op1")]
93 1.1 mrg )
94 1.1 mrg
95 1.1 mrg ;;---------- Arithmetic ------------------------
96 1.3 mrg
97 1.3 mrg (define_insn "*inc<mode>3_virt"
98 1.3 mrg [(set (match_operand:QHI 0 "rl78_incdec_memory_operand" "=vm")
99 1.3 mrg (plus:QHI (match_operand:QHI 1 "rl78_incdec_memory_operand" "0")
100 1.3 mrg (match_operand:QHI 2 "rl78_1_2_operand" "KLNO")))
101 1.3 mrg ]
102 1.3 mrg "rl78_virt_insns_ok ()"
103 1.3 mrg "v.inc\t%0, %1, %2"
104 1.3 mrg )
105 1.1 mrg
106 1.5 mrg (define_insn "*add<mode>3_virt"
107 1.5 mrg [(set (match_operand:QHI 0 "rl78_nonimmediate_operand" "=vY, S, *Wfr, vY")
108 1.5 mrg (plus:QHI (match_operand:QHI 1 "rl78_general_operand" "%viY, 0, 0viY, *Wfr")
109 1.1 mrg (match_operand:QHI 2 "rl78_general_operand" "vim, i, viY, viY")))
110 1.5 mrg ]
111 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
112 1.1 mrg "v.add\t%0, %1, %2"
113 1.1 mrg )
114 1.1 mrg
115 1.5 mrg (define_insn "*sub<mode>3_virt"
116 1.5 mrg [(set (match_operand:QHI 0 "rl78_nonimmediate_operand" "=vY, S, *Wfr, vY")
117 1.5 mrg (minus:QHI (match_operand:QHI 1 "rl78_general_operand" "viY, 0, 0viY, *Wfr")
118 1.1 mrg (match_operand:QHI 2 "rl78_general_operand" "vim, i, viY, viY")))
119 1.5 mrg ]
120 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
121 1.1 mrg "v.sub\t%0, %1, %2"
122 1.1 mrg )
123 1.1 mrg
124 1.5 mrg (define_insn "*umulhi3_shift_virt"
125 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=v")
126 1.1 mrg (mult:HI (match_operand:HI 1 "rl78_nonfar_operand" "%vim")
127 1.4 mrg (match_operand:HI 2 "rl78_24_operand" "Ni")))]
128 1.1 mrg "rl78_virt_insns_ok ()"
129 1.1 mrg "v.mulu\t%0, %1, %2"
130 1.1 mrg [(set_attr "valloc" "umul")]
131 1.1 mrg )
132 1.1 mrg
133 1.5 mrg (define_insn "*umulqihi3_virt"
134 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=v")
135 1.1 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "rl78_nonfar_operand" "%vim"))
136 1.4 mrg (zero_extend:HI (match_operand:QI 2 "general_operand" "vim"))))]
137 1.1 mrg "rl78_virt_insns_ok ()"
138 1.1 mrg "v.mulu\t%0, %2"
139 1.1 mrg [(set_attr "valloc" "umul")]
140 1.1 mrg )
141 1.1 mrg
142 1.5 mrg (define_insn "*andqi3_virt"
143 1.5 mrg [(set (match_operand:QI 0 "rl78_nonimmediate_operand" "=vm, *Wfr, vY")
144 1.5 mrg (and:QI (match_operand:QI 1 "rl78_general_operand" "%vim, 0viY, *Wfr")
145 1.1 mrg (match_operand:QI 2 "rl78_general_operand" "vim, viY, viY")))
146 1.5 mrg ]
147 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
148 1.1 mrg "v.and\t%0, %1, %2"
149 1.1 mrg )
150 1.1 mrg
151 1.5 mrg (define_insn "*iorqi3_virt"
152 1.5 mrg [(set (match_operand:QI 0 "rl78_nonimmediate_operand" "=vm, *Wfr, vY")
153 1.5 mrg (ior:QI (match_operand:QI 1 "rl78_general_operand" "%vim, 0viY, *Wfr")
154 1.1 mrg (match_operand:QI 2 "rl78_general_operand" "vim, viY, viY")))
155 1.5 mrg ]
156 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
157 1.1 mrg "v.or\t%0, %1, %2"
158 1.1 mrg )
159 1.3 mrg
160 1.5 mrg (define_insn "*xorqi3_virt"
161 1.5 mrg [(set (match_operand:QI 0 "rl78_nonimmediate_operand" "=vm, *Wfr, vY")
162 1.5 mrg (xor:QI (match_operand:QI 1 "rl78_general_operand" "%vim, 0viY, *Wfr")
163 1.1 mrg (match_operand 2 "rl78_general_operand" "vim, viY, viY")))
164 1.5 mrg ]
165 1.1 mrg "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
166 1.1 mrg "v.xor\t%0, %1, %2"
167 1.1 mrg )
168 1.1 mrg
169 1.1 mrg ;;---------- Shifts ------------------------
170 1.1 mrg
171 1.1 mrg (define_insn "*ashl<mode>3_virt"
172 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
173 1.1 mrg (ashift:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
174 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
175 1.1 mrg ]
176 1.1 mrg "rl78_virt_insns_ok ()"
177 1.1 mrg "v.shl\t%0, %1, %2"
178 1.1 mrg )
179 1.1 mrg
180 1.1 mrg (define_insn "*ashr<mode>3_virt"
181 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
182 1.1 mrg (ashiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
183 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
184 1.1 mrg ]
185 1.1 mrg "rl78_virt_insns_ok ()"
186 1.1 mrg "v.sar\t%0, %1, %2"
187 1.1 mrg )
188 1.1 mrg
189 1.1 mrg (define_insn "*lshr<mode>3_virt"
190 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
191 1.1 mrg (lshiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
192 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
193 1.1 mrg ]
194 1.1 mrg "rl78_virt_insns_ok ()"
195 1.1 mrg "v.shr\t%0, %1, %2"
196 1.1 mrg )
197 1.3 mrg
198 1.3 mrg ;; This is complex mostly because the RL78 has no SImode operations,
199 1.3 mrg ;; and very limited HImode operations, and no variable shifts. This
200 1.3 mrg ;; pattern is optimized for each constant shift count and operand
201 1.3 mrg ;; types, so as to use a hand-optimized pattern. For readability, the
202 1.3 mrg ;; usual \t\; syntax is not used here. Also, there's no easy way to
203 1.3 mrg ;; constrain to avoid partial overlaps, hence the duplication.
204 1.3 mrg (define_insn "ashrsi3_virt" ;; 0 1 2-7 8 9-15 16 17-23 24 25-31 var
205 1.3 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "=v,vU,&vU,v, &vU, &vU, v, &vU, v, &vU, &vU, vU, v,&vU, vU, vU, vU")
206 1.3 mrg (ashiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "0, 0, vU,0, vWab, U, 0, vU, 0, vWab,U, vU, 0, vU, vU, vU, 0")
207 1.3 mrg (match_operand:SI 2 "nonmemory_operand" "M, K, K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Is17,Is17,Iv24,Is25, iv")))
208 1.3 mrg (clobber (reg:HI X_REG))
209 1.3 mrg ]
210 1.3 mrg ""
211 1.3 mrg "@
212 1.3 mrg ; ashrsi %0, 0
213 1.3 mrg
214 1.3 mrg movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
215 1.3 mrg movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
216 1.3 mrg
217 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
218 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
219 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
220 1.3 mrg
221 1.3 mrg mov x,%Q1 \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; sarw ax,8 \; movw %H0,ax
222 1.3 mrg mov a,%Q1 \; mov x, a \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; sarw ax,8 \; movw %H0,ax
223 1.3 mrg
224 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
225 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
226 1.3 mrg mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
227 1.3 mrg
228 1.3 mrg movw ax,%H1 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
229 1.3 mrg
230 1.3 mrg movw ax,%H1 \; sarw ax,%S2 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
231 1.3 mrg movw ax,%H1 \; sarw ax,%S2 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
232 1.3 mrg
233 1.3 mrg movw ax,%H1 \; mov %0,a \; sarw ax,15 \; movw %H0,ax \; mov %Q0,a
234 1.3 mrg
235 1.3 mrg movw ax,%H1 \; sar a,%s2 \; mov %0,a \; sarw ax,15 \; movw %H0,ax \; mov %Q0,a
236 1.3 mrg
237 1.3 mrg mov b,%2 \; cmp0 b \; bz $2f \; 1: \; movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a \; dec b \; bnz $1b \; 2:"
238 1.3 mrg [(set_attr "valloc" "macax")]
239 1.3 mrg )
240 1.3 mrg
241 1.3 mrg ;; Likewise.
242 1.3 mrg (define_insn "lshrsi3_virt" ;; 0 1 2-7 8 9-15 16 17-23 24 25-31 var
243 1.3 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "=v,vU,&vU,v, &vU, &vU, v, &vU, v, &vU, &vU, vU, v,&vU, vU, vU, vU")
244 1.3 mrg (lshiftrt:SI (match_operand:SI 1 "nonimmediate_operand" "0, 0, vU,0, vWab, U, 0, vU, 0, vWab,U, vU, 0, vU, vU, vU, 0")
245 1.3 mrg (match_operand:SI 2 "nonmemory_operand" "M, K, K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Is17,Is17,Iv24,Is25, iv")))
246 1.1 mrg (clobber (reg:HI X_REG))
247 1.1 mrg ]
248 1.1 mrg ""
249 1.3 mrg "@
250 1.3 mrg ; lshrsi %0, 0
251 1.3 mrg
252 1.3 mrg movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
253 1.3 mrg movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
254 1.3 mrg
255 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
256 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
257 1.3 mrg movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
258 1.3 mrg
259 1.3 mrg mov x,%Q1 \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; shrw ax,8 \; movw %H0,ax
260 1.3 mrg mov a,%Q1 \; mov x, a \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; shrw ax,8 \; movw %H0,ax
261 1.3 mrg
262 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
263 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
264 1.3 mrg mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
265 1.3 mrg
266 1.3 mrg movw ax,%H1 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
267 1.3 mrg
268 1.3 mrg movw ax,%H1 \; shrw ax,%S2 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
269 1.3 mrg movw ax,%H1 \; shrw ax,%S2 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
270 1.3 mrg
271 1.3 mrg movw ax,%H1 \; mov %0,a \; movw ax,#0 \; movw %H0,ax \; mov %Q0,a
272 1.3 mrg
273 1.3 mrg movw ax,%H1 \; shr a,%s2 \; mov %0,a \; movw ax,#0 \; movw %H0,ax \; mov %Q0,a
274 1.3 mrg
275 1.1 mrg mov b,%2 \; cmp0 b \; bz $2f \; 1: \; movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a \; dec b \; bnz $1b \; 2:"
276 1.1 mrg [(set_attr "valloc" "macax")]
277 1.1 mrg )
278 1.3 mrg
279 1.3 mrg ;; Likewise.
280 1.3 mrg (define_insn "ashlsi3_virt" ;; 0 1 2-7 8 9-15 16 17-23 24 25-31 var
281 1.3 mrg [(set (match_operand:SI 0 "nonimmediate_operand" "=v,vU,&vU,v, &vU, &vU, v, &vU, v, &vU, &vU, v, U, v,&vU, v, U, v, U, vWab,vU, vU")
282 1.3 mrg (ashift:SI (match_operand:SI 1 "nonimmediate_operand" "0, 0, vU,0, vWab, U, 0, vU, 0, vWab,U, vU, vU, 0, vU, vU, vU, vU, vU, 0, vWab,U")
283 1.3 mrg (match_operand:SI 2 "nonmemory_operand" "M, K, K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Iv16,Is17,Is17,Iv24,Iv24,Is25,Is25,iv, iv, iv")))
284 1.3 mrg (clobber (reg:HI X_REG))
285 1.3 mrg ]
286 1.3 mrg ""
287 1.3 mrg "@
288 1.3 mrg ; lshrsi %0, 0
289 1.3 mrg
290 1.3 mrg movw ax,%1 \; shlw ax,1 \; movw %0,ax \; movw ax,%H1 \; rolwc ax,1 \; movw %H0,ax
291 1.3 mrg movw ax,%1 \; shlw ax,1 \; movw %0,ax \; movw ax,%H1 \; rolwc ax,1 \; movw %H0,ax
292 1.3 mrg
293 1.3 mrg movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov x,%Q1 \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
294 1.3 mrg movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov x,%Q1 \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
295 1.3 mrg movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov a,%Q1 \; mov x,a \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
296 1.3 mrg
297 1.3 mrg mov x,%Q1 \; mov a,%H1 \; movw %H0,ax \; movw ax,%1 \; shlw ax,8 \; movw %0,ax
298 1.3 mrg mov a,%Q1 \; mov x,a \; mov a,%H1 \; movw %H0,ax \; movw ax,%1 \; shlw ax,8 \; movw %0,ax
299 1.3 mrg
300 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
301 1.3 mrg mov x,%Q1 \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
302 1.3 mrg mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
303 1.3 mrg
304 1.3 mrg movw ax,%1 \; movw %H0,ax \; movw %0,#0
305 1.3 mrg movw ax,%1 \; movw %H0,ax \; movw ax,#0 \; movw %0,ax
306 1.3 mrg
307 1.3 mrg movw ax,%1 \; shlw ax,%S2 \; movw %H0,ax \; movw %0,#0
308 1.3 mrg movw ax,%1 \; shlw ax,%S2 \; movw %H0,ax \; movw ax,#0 \; movw %0,ax
309 1.3 mrg
310 1.3 mrg mov a,%1 \; movw %H0,ax \; mov %H0,#0 \; movw %0,#0
311 1.3 mrg mov a,%1 \; movw %H0,ax \; movw ax,#0 \; mov %H0,a \; movW %0,ax
312 1.3 mrg
313 1.3 mrg mov a,%1 \; shl a,%s2 \; movw %H0,ax \; mov %H0,#0 \; movw %0,#0
314 1.3 mrg mov a,%1 \; shl a,%s2 \; movw %H0,ax \; movw ax,#0 \; mov %H0,a \; movW %0,ax
315 1.3 mrg
316 1.3 mrg mov a,%2 \; cmp0 a \; bz $2f \; mov d,a \; movw ax,%H1 \; movw bc,%1 \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; movw %H0,ax \; movw ax,bc \; movw %0,ax \; 2:
317 1.3 mrg mov a,%2 \; mov d,a \; movw ax,%H1 \; movw bc,%1 \; cmp0 0xFFEFD \; bz $2f \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; 2: \; movw %H0,ax \; movw ax,bc \; movw %0,ax
318 1.3 mrg mov a,%2 \; mov d,a \; movw ax,%1 \; movw bc,ax \; movw ax,%H1 \; cmp0 0xFFEFD \; bz $2f \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; 2: \; movw %H0,ax \; movw ax,bc \; movw %0,ax"
319 1.3 mrg [(set_attr "valloc" "macax")]
320 1.3 mrg )
321 1.1 mrg
322 1.1 mrg ;;---------- Branching ------------------------
323 1.1 mrg
324 1.1 mrg (define_insn "*indirect_jump_virt"
325 1.1 mrg [(set (pc)
326 1.1 mrg (match_operand:HI 0 "nonimmediate_operand" "vm"))]
327 1.1 mrg "rl78_virt_insns_ok ()"
328 1.1 mrg "v.br\t%0"
329 1.1 mrg [(set_attr "valloc" "ro1")]
330 1.1 mrg )
331 1.1 mrg
332 1.1 mrg (define_insn "*call_virt"
333 1.1 mrg [(call (match_operand:HI 0 "memory_operand" "Wab,Wcv")
334 1.1 mrg (match_operand 1 "" ""))]
335 1.1 mrg "rl78_virt_insns_ok ()"
336 1.1 mrg "v.call\t%0"
337 1.1 mrg [(set_attr "valloc" "ro1")]
338 1.1 mrg )
339 1.1 mrg
340 1.1 mrg (define_insn "*call_value_virt"
341 1.1 mrg [(set (match_operand 0 "register_operand" "=v,v")
342 1.1 mrg (call (match_operand:HI 1 "memory_operand" "Wab,Wcv")
343 1.1 mrg (match_operand 2 "" "")))]
344 1.1 mrg "rl78_virt_insns_ok ()"
345 1.1 mrg "v.call\t%1"
346 1.1 mrg [(set_attr "valloc" "op1")]
347 1.1 mrg )
348 1.3 mrg
349 1.3 mrg (define_insn "*cbranchqi4_virt_signed"
350 1.3 mrg [(set (pc) (if_then_else
351 1.3 mrg (match_operator 0 "rl78_cmp_operator_signed"
352 1.3 mrg [(match_operand:QI 1 "general_operand" "vim")
353 1.3 mrg (match_operand:QI 2 "nonmemory_operand" "vi")])
354 1.3 mrg (label_ref (match_operand 3 "" ""))
355 1.3 mrg (pc)))]
356 1.3 mrg "rl78_virt_insns_ok ()"
357 1.3 mrg "v.cmp\t%1, %2\\n\tv.b%C0\t%3"
358 1.3 mrg [(set_attr "valloc" "cmp")]
359 1.3 mrg )
360 1.1 mrg
361 1.1 mrg (define_insn "*cbranchqi4_virt"
362 1.1 mrg [(set (pc) (if_then_else
363 1.3 mrg (match_operator 0 "rl78_cmp_operator_real"
364 1.3 mrg [(match_operand:QI 1 "rl78_general_operand" "vim")
365 1.3 mrg (match_operand:QI 2 "rl78_general_operand" "vim")])
366 1.3 mrg (label_ref (match_operand 3 "" ""))
367 1.3 mrg (pc)))]
368 1.3 mrg "rl78_virt_insns_ok ()"
369 1.3 mrg "v.cmp\t%1, %2\\n\tv.b%C0\t%3"
370 1.3 mrg [(set_attr "valloc" "cmp")]
371 1.3 mrg )
372 1.3 mrg
373 1.3 mrg (define_insn "*cbranchhi4_virt_signed"
374 1.3 mrg [(set (pc) (if_then_else
375 1.3 mrg (match_operator 0 "rl78_cmp_operator_signed"
376 1.3 mrg [(match_operand:HI 1 "general_operand" "vim")
377 1.1 mrg (match_operand:HI 2 "nonmemory_operand" "vi")])
378 1.1 mrg (label_ref (match_operand 3 "" ""))
379 1.1 mrg (pc)))]
380 1.3 mrg "rl78_virt_insns_ok ()"
381 1.1 mrg "v.cmpw\t%1, %2\\n\tv.b%C0\t%3"
382 1.1 mrg [(set_attr "valloc" "cmp")]
383 1.1 mrg )
384 1.1 mrg
385 1.1 mrg (define_insn "*cbranchhi4_virt"
386 1.1 mrg [(set (pc) (if_then_else
387 1.3 mrg (match_operator 0 "rl78_cmp_operator_real"
388 1.3 mrg [(match_operand:HI 1 "rl78_general_operand" "vim")
389 1.1 mrg (match_operand:HI 2 "rl78_general_operand" "vim")])
390 1.1 mrg (label_ref (match_operand 3 "" ""))
391 1.1 mrg (pc)))]
392 1.3 mrg "rl78_virt_insns_ok ()"
393 1.1 mrg "v.cmpw\t%1, %2\\n\tv.b%C0\t%3"
394 1.1 mrg [(set_attr "valloc" "cmp")]
395 1.1 mrg )
396 1.3 mrg
397 1.3 mrg (define_insn "*cbranchsi4_virt"
398 1.3 mrg [(set (pc) (if_then_else
399 1.3 mrg (match_operator 0 "rl78_cmp_operator"
400 1.3 mrg [(match_operand:SI 1 "general_operand" "vim")
401 1.3 mrg (match_operand:SI 2 "nonmemory_operand" "vi")])
402 1.3 mrg (label_ref (match_operand 3 "" ""))
403 1.3 mrg (pc)))
404 1.3 mrg (clobber (reg:HI AX_REG))
405 1.3 mrg ]
406 1.3 mrg "rl78_virt_insns_ok ()"
407 1.3 mrg "v.cmpd\t%1, %2\\n\tv.b%C0\t%3"
408 1.3 mrg [(set_attr "valloc" "macax")]
409 1.3 mrg )
410 1.1 mrg
411 1.1 mrg ;;---------- Peepholes ------------------------
412 1.1 mrg
413 1.1 mrg (define_peephole2
414 1.1 mrg [(set (match_operand:QI 0 "" "")
415 1.1 mrg (match_operand:QI 1 "" ""))
416 1.1 mrg (set (match_operand:QI 2 "" "")
417 1.1 mrg (match_operand:QI 3 "" ""))]
418 1.1 mrg "rl78_peep_movhi_p (operands)"
419 1.1 mrg [(set (match_dup 4)
420 1.1 mrg (match_dup 5))]
421 1.1 mrg "rl78_setup_peep_movhi (operands);"
422 1.1 mrg )
423 1.1 mrg
424 1.1 mrg (define_peephole2
425 1.1 mrg [(set (reg:QI A_REG)
426 1.1 mrg (match_operand:QI 1 "" ""))
427 1.1 mrg (set (match_operand:QI 0 "" "")
428 1.1 mrg (reg:QI A_REG))
429 1.1 mrg (set (reg:QI A_REG)
430 1.1 mrg (match_operand:QI 3 "" ""))
431 1.1 mrg (set (match_operand:QI 2 "" "")
432 1.1 mrg (reg:QI A_REG))
433 1.1 mrg ]
434 1.1 mrg "rl78_peep_movhi_p (operands)"
435 1.1 mrg [(set (reg:HI AX_REG)
436 1.1 mrg (match_dup 5))
437 1.1 mrg (set (match_dup 4)
438 1.1 mrg (reg:HI AX_REG))
439 1.1 mrg ]
440 1.1 mrg "rl78_setup_peep_movhi (operands);"
441 1.3 mrg )
442 1.3 mrg
443 1.3 mrg (define_insn "*negandhi3_virt"
444 1.3 mrg [(set (match_operand:HI 0 "register_operand" "=v")
445 1.3 mrg (and:HI (neg:HI (match_operand:HI 1 "register_operand" "0"))
446 1.3 mrg (match_operand:HI 2 "immediate_operand" "n")))
447 1.3 mrg ]
448 1.3 mrg "rl78_virt_insns_ok ()"
449 1.3 mrg "v.nand\t%0, %1, %2"
450 )
451