rl78-virt.md revision 1.1 1 1.1 mrg ;; Machine Description for Renesas RL78 processors
2 1.1 mrg ;; Copyright (C) 2011-2013 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.1 mrg
32 1.1 mrg (define_attr "valloc" "op1,op2,ro1,cmp,umul,macax"
33 1.1 mrg (const_string "op2"))
34 1.1 mrg
35 1.1 mrg ;;---------- Moving ------------------------
36 1.1 mrg
37 1.1 mrg (define_insn "*movqi_virt"
38 1.1 mrg [(set (match_operand:QI 0 "nonimmediate_operand" "=vY,v,Wfr")
39 1.1 mrg (match_operand 1 "general_operand" "vInt8JY,Wfr,vInt8J"))]
40 1.1 mrg "rl78_virt_insns_ok ()"
41 1.1 mrg "v.mov %0, %1"
42 1.1 mrg [(set_attr "valloc" "op1")]
43 1.1 mrg )
44 1.1 mrg
45 1.1 mrg (define_insn "*movhi_virt"
46 1.1 mrg [(set (match_operand:HI 0 "nonimmediate_operand" "=vYS,v,Wfr")
47 1.1 mrg (match_operand:HI 1 "general_operand" "viYS,Wfr,v"))]
48 1.1 mrg "rl78_virt_insns_ok ()"
49 1.1 mrg "v.movw %0, %1"
50 1.1 mrg [(set_attr "valloc" "op1")]
51 1.1 mrg )
52 1.1 mrg
53 1.1 mrg ;;---------- Conversions ------------------------
54 1.1 mrg
55 1.1 mrg (define_insn "*zero_extendqihi2_virt"
56 1.1 mrg [(set (match_operand:HI 0 "rl78_nonfar_nonimm_operand" "=vm")
57 1.1 mrg (zero_extend:HI (match_operand:QI 1 "general_operand" "vim")))]
58 1.1 mrg "rl78_virt_insns_ok ()"
59 1.1 mrg "v.zero_extend\t%0, %1"
60 1.1 mrg [(set_attr "valloc" "op1")]
61 1.1 mrg )
62 1.1 mrg
63 1.1 mrg (define_insn "*extendqihi2_virt"
64 1.1 mrg [(set (match_operand:HI 0 "rl78_nonfar_nonimm_operand" "=vm")
65 1.1 mrg (sign_extend:HI (match_operand:QI 1 "general_operand" "vim")))]
66 1.1 mrg "rl78_virt_insns_ok ()"
67 1.1 mrg "v.sign_extend\t%0, %1"
68 1.1 mrg [(set_attr "valloc" "op1")]
69 1.1 mrg )
70 1.1 mrg
71 1.1 mrg ;;---------- Arithmetic ------------------------
72 1.1 mrg
73 1.1 mrg (define_insn "*add<mode>3_virt"
74 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vY,S")
75 1.1 mrg (plus:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "viY,0")
76 1.1 mrg (match_operand:QHI 2 "general_operand" "vim,i")))
77 1.1 mrg ]
78 1.1 mrg "rl78_virt_insns_ok ()"
79 1.1 mrg "v.add\t%0, %1, %2"
80 1.1 mrg )
81 1.1 mrg
82 1.1 mrg (define_insn "*sub<mode>3_virt"
83 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm,S")
84 1.1 mrg (minus:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim,0")
85 1.1 mrg (match_operand:QHI 2 "general_operand" "vim,i")))
86 1.1 mrg ]
87 1.1 mrg "rl78_virt_insns_ok ()"
88 1.1 mrg "v.sub\t%0, %1, %2"
89 1.1 mrg )
90 1.1 mrg
91 1.1 mrg (define_insn "*umulhi3_shift_virt"
92 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=vm")
93 1.1 mrg (mult:HI (match_operand:HI 1 "rl78_nonfar_operand" "%vim")
94 1.1 mrg (match_operand:HI 2 "rl78_24_operand" "Ni")))]
95 1.1 mrg "rl78_virt_insns_ok ()"
96 1.1 mrg "v.mulu\t%0, %1, %2"
97 1.1 mrg [(set_attr "valloc" "umul")]
98 1.1 mrg )
99 1.1 mrg
100 1.1 mrg (define_insn "*umulqihi3_virt"
101 1.1 mrg [(set (match_operand:HI 0 "register_operand" "=vm")
102 1.1 mrg (mult:HI (zero_extend:HI (match_operand:QI 1 "rl78_nonfar_operand" "%vim"))
103 1.1 mrg (zero_extend:HI (match_operand:QI 2 "general_operand" "vim"))))]
104 1.1 mrg "rl78_virt_insns_ok ()"
105 1.1 mrg "v.mulu\t%0, %2"
106 1.1 mrg [(set_attr "valloc" "umul")]
107 1.1 mrg )
108 1.1 mrg
109 1.1 mrg (define_insn "*andqi3_virt"
110 1.1 mrg [(set (match_operand:QI 0 "rl78_nonfar_nonimm_operand" "=vm")
111 1.1 mrg (and:QI (match_operand:QI 1 "rl78_nonfar_operand" "vim")
112 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
113 1.1 mrg ]
114 1.1 mrg "rl78_virt_insns_ok ()"
115 1.1 mrg "v.and\t%0, %1, %2"
116 1.1 mrg )
117 1.1 mrg
118 1.1 mrg (define_insn "*iorqi3_virt"
119 1.1 mrg [(set (match_operand:QI 0 "rl78_nonfar_nonimm_operand" "=vm")
120 1.1 mrg (ior:QI (match_operand:QI 1 "rl78_nonfar_operand" "vim")
121 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
122 1.1 mrg ]
123 1.1 mrg "rl78_virt_insns_ok ()"
124 1.1 mrg "v.or\t%0, %1, %2"
125 1.1 mrg )
126 1.1 mrg
127 1.1 mrg (define_insn "*xor3_virt"
128 1.1 mrg [(set (match_operand:QI 0 "rl78_nonfar_nonimm_operand" "=v,vm,m")
129 1.1 mrg (xor:QI (match_operand:QI 1 "rl78_nonfar_operand" "%0,vm,vm")
130 1.1 mrg (match_operand 2 "general_operand" "i,vm,vim")))
131 1.1 mrg ]
132 1.1 mrg "rl78_virt_insns_ok ()"
133 1.1 mrg "v.xor\t%0, %1, %2"
134 1.1 mrg )
135 1.1 mrg
136 1.1 mrg ;;---------- Shifts ------------------------
137 1.1 mrg
138 1.1 mrg (define_insn "*ashl<mode>3_virt"
139 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
140 1.1 mrg (ashift:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
141 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
142 1.1 mrg ]
143 1.1 mrg "rl78_virt_insns_ok ()"
144 1.1 mrg "v.shl\t%0, %1, %2"
145 1.1 mrg )
146 1.1 mrg
147 1.1 mrg (define_insn "*ashr<mode>3_virt"
148 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
149 1.1 mrg (ashiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
150 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
151 1.1 mrg ]
152 1.1 mrg "rl78_virt_insns_ok ()"
153 1.1 mrg "v.sar\t%0, %1, %2"
154 1.1 mrg )
155 1.1 mrg
156 1.1 mrg (define_insn "*lshr<mode>3_virt"
157 1.1 mrg [(set (match_operand:QHI 0 "rl78_nonfar_nonimm_operand" "=vm")
158 1.1 mrg (lshiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
159 1.1 mrg (match_operand:QI 2 "general_operand" "vim")))
160 1.1 mrg ]
161 1.1 mrg "rl78_virt_insns_ok ()"
162 1.1 mrg "v.shr\t%0, %1, %2"
163 1.1 mrg )
164 1.1 mrg
165 1.1 mrg ;; really a macro
166 1.1 mrg (define_insn "*ashrsi3_virt"
167 1.1 mrg [(set (match_operand:SI 0 "register_operand" "=v,v,v")
168 1.1 mrg (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,v,0")
169 1.1 mrg (match_operand:SI 2 "immediate_operand" "M,K,i")))
170 1.1 mrg ]
171 1.1 mrg ""
172 1.1 mrg "@
173 1.1 mrg ; ashrsi %0, 0
174 1.1 mrg movw\tax,%H1\;sarw\tax,1\;movw\t%H0,ax\;mov\ta,%Q1\;rorc\ta,1\;mov\t%Q0,a\;mov\ta,%q1\;rorc\ta,1\;mov\t%q0,a
175 1.1 mrg mov\tb,%2\;1:\;movw\tax,%H1\;sarw\tax,1\;movw\t%H0,ax\;mov\ta,%Q1\;rorc\ta,1\;mov\t%Q0,a\;mov\ta,%q1\;rorc\ta,1\;mov\t%q0,a\;dec\tb\;bnz $1b"
176 1.1 mrg [(set_attr "valloc" "macax")]
177 1.1 mrg )
178 1.1 mrg
179 1.1 mrg ;;---------- Branching ------------------------
180 1.1 mrg
181 1.1 mrg (define_insn "*indirect_jump_virt"
182 1.1 mrg [(set (pc)
183 1.1 mrg (match_operand:HI 0 "nonimmediate_operand" "vm"))]
184 1.1 mrg "rl78_virt_insns_ok ()"
185 1.1 mrg "v.br\t%0"
186 1.1 mrg [(set_attr "valloc" "ro1")]
187 1.1 mrg )
188 1.1 mrg
189 1.1 mrg (define_insn "*call_virt"
190 1.1 mrg [(call (match_operand:HI 0 "memory_operand" "Wab,Wcv")
191 1.1 mrg (match_operand 1 "" ""))]
192 1.1 mrg "rl78_virt_insns_ok ()"
193 1.1 mrg "v.call\t%0"
194 1.1 mrg [(set_attr "valloc" "ro1")]
195 1.1 mrg )
196 1.1 mrg
197 1.1 mrg (define_insn "*call_value_virt"
198 1.1 mrg [(set (match_operand 0 "register_operand" "=v,v")
199 1.1 mrg (call (match_operand:HI 1 "memory_operand" "Wab,Wcv")
200 1.1 mrg (match_operand 2 "" "")))]
201 1.1 mrg "rl78_virt_insns_ok ()"
202 1.1 mrg "v.call\t%1"
203 1.1 mrg [(set_attr "valloc" "op1")]
204 1.1 mrg )
205 1.1 mrg
206 1.1 mrg (define_insn "*cbranchqi4_virt"
207 1.1 mrg [(set (pc) (if_then_else
208 1.1 mrg (match_operator 0 "rl78_cmp_operator_real"
209 1.1 mrg [(match_operand:QI 1 "general_operand" "vim")
210 1.1 mrg (match_operand:QI 2 "general_operand" "vim")])
211 1.1 mrg (label_ref (match_operand 3 "" ""))
212 1.1 mrg (pc)))]
213 1.1 mrg "rl78_virt_insns_ok ()"
214 1.1 mrg "v.cmp\t%1, %2\\n\tv.b%c0\t%3"
215 1.1 mrg [(set_attr "valloc" "cmp")]
216 1.1 mrg )
217 1.1 mrg
218 1.1 mrg (define_insn "*cbranchhi4_virt"
219 1.1 mrg [(set (pc) (if_then_else
220 1.1 mrg (match_operator 0 "rl78_cmp_operator_real"
221 1.1 mrg [(match_operand:HI 1 "general_operand" "vim")
222 1.1 mrg (match_operand:HI 2 "general_operand" "vim")])
223 1.1 mrg (label_ref (match_operand 3 "" ""))
224 1.1 mrg (pc)))]
225 1.1 mrg "rl78_virt_insns_ok ()"
226 1.1 mrg "v.cmpw\t%1, %2\\n\tv.b%c0\t%3"
227 1.1 mrg [(set_attr "valloc" "cmp")]
228 1.1 mrg )
229 1.1 mrg
230 1.1 mrg ;;---------- Peepholes ------------------------
231 1.1 mrg
232 1.1 mrg (define_peephole2
233 1.1 mrg [(set (match_operand:QI 0 "" "")
234 1.1 mrg (match_operand:QI 1 "" ""))
235 1.1 mrg (set (match_operand:QI 2 "" "")
236 1.1 mrg (match_operand:QI 3 "" ""))]
237 1.1 mrg "rl78_peep_movhi_p (operands)"
238 1.1 mrg [(set (match_dup 4)
239 1.1 mrg (match_dup 5))]
240 1.1 mrg "rl78_setup_peep_movhi (operands);"
241 1.1 mrg )
242 1.1 mrg
243 1.1 mrg (define_peephole2
244 1.1 mrg [(set (reg:QI A_REG)
245 1.1 mrg (match_operand:QI 1 "" ""))
246 1.1 mrg (set (match_operand:QI 0 "" "")
247 1.1 mrg (reg:QI A_REG))
248 1.1 mrg (set (reg:QI A_REG)
249 1.1 mrg (match_operand:QI 3 "" ""))
250 1.1 mrg (set (match_operand:QI 2 "" "")
251 1.1 mrg (reg:QI A_REG))
252 1.1 mrg ]
253 1.1 mrg "rl78_peep_movhi_p (operands)"
254 1.1 mrg [(set (reg:HI AX_REG)
255 1.1 mrg (match_dup 5))
256 1.1 mrg (set (match_dup 4)
257 1.1 mrg (reg:HI AX_REG))
258 1.1 mrg ]
259 1.1 mrg "rl78_setup_peep_movhi (operands);"
260 )
261