1
2
3 package riscv
4
5 import "cmd/internal/obj"
6
7 type inst struct {
8 opcode uint32
9 funct3 uint32
10 rs2 uint32
11 csr int64
12 funct7 uint32
13 }
14
15 func encode(a obj.As) *inst {
16 switch a {
17 case ABEQ:
18 return &inst{0x63, 0x0, 0x0, 0, 0x0}
19 case ABNE:
20 return &inst{0x63, 0x1, 0x0, 0, 0x0}
21 case ABLT:
22 return &inst{0x63, 0x4, 0x0, 0, 0x0}
23 case ABGE:
24 return &inst{0x63, 0x5, 0x0, 0, 0x0}
25 case ABLTU:
26 return &inst{0x63, 0x6, 0x0, 0, 0x0}
27 case ABGEU:
28 return &inst{0x63, 0x7, 0x0, 0, 0x0}
29 case AJALR:
30 return &inst{0x67, 0x0, 0x0, 0, 0x0}
31 case AJAL:
32 return &inst{0x6f, 0x0, 0x0, 0, 0x0}
33 case ALUI:
34 return &inst{0x37, 0x0, 0x0, 0, 0x0}
35 case AAUIPC:
36 return &inst{0x17, 0x0, 0x0, 0, 0x0}
37 case AADDI:
38 return &inst{0x13, 0x0, 0x0, 0, 0x0}
39 case ASLLI:
40 return &inst{0x13, 0x1, 0x0, 0, 0x0}
41 case ASLTI:
42 return &inst{0x13, 0x2, 0x0, 0, 0x0}
43 case ASLTIU:
44 return &inst{0x13, 0x3, 0x0, 0, 0x0}
45 case AXORI:
46 return &inst{0x13, 0x4, 0x0, 0, 0x0}
47 case ASRLI:
48 return &inst{0x13, 0x5, 0x0, 0, 0x0}
49 case ASRAI:
50 return &inst{0x13, 0x5, 0x0, 1024, 0x20}
51 case AORI:
52 return &inst{0x13, 0x6, 0x0, 0, 0x0}
53 case AANDI:
54 return &inst{0x13, 0x7, 0x0, 0, 0x0}
55 case AADD:
56 return &inst{0x33, 0x0, 0x0, 0, 0x0}
57 case ASUB:
58 return &inst{0x33, 0x0, 0x0, 1024, 0x20}
59 case ASLL:
60 return &inst{0x33, 0x1, 0x0, 0, 0x0}
61 case ASLT:
62 return &inst{0x33, 0x2, 0x0, 0, 0x0}
63 case ASLTU:
64 return &inst{0x33, 0x3, 0x0, 0, 0x0}
65 case AXOR:
66 return &inst{0x33, 0x4, 0x0, 0, 0x0}
67 case ASRL:
68 return &inst{0x33, 0x5, 0x0, 0, 0x0}
69 case ASRA:
70 return &inst{0x33, 0x5, 0x0, 1024, 0x20}
71 case AOR:
72 return &inst{0x33, 0x6, 0x0, 0, 0x0}
73 case AAND:
74 return &inst{0x33, 0x7, 0x0, 0, 0x0}
75 case AADDIW:
76 return &inst{0x1b, 0x0, 0x0, 0, 0x0}
77 case ASLLIW:
78 return &inst{0x1b, 0x1, 0x0, 0, 0x0}
79 case ASRLIW:
80 return &inst{0x1b, 0x5, 0x0, 0, 0x0}
81 case ASRAIW:
82 return &inst{0x1b, 0x5, 0x0, 1024, 0x20}
83 case AADDW:
84 return &inst{0x3b, 0x0, 0x0, 0, 0x0}
85 case ASUBW:
86 return &inst{0x3b, 0x0, 0x0, 1024, 0x20}
87 case ASLLW:
88 return &inst{0x3b, 0x1, 0x0, 0, 0x0}
89 case ASRLW:
90 return &inst{0x3b, 0x5, 0x0, 0, 0x0}
91 case ASRAW:
92 return &inst{0x3b, 0x5, 0x0, 1024, 0x20}
93 case ALB:
94 return &inst{0x3, 0x0, 0x0, 0, 0x0}
95 case ALH:
96 return &inst{0x3, 0x1, 0x0, 0, 0x0}
97 case ALW:
98 return &inst{0x3, 0x2, 0x0, 0, 0x0}
99 case ALD:
100 return &inst{0x3, 0x3, 0x0, 0, 0x0}
101 case ALBU:
102 return &inst{0x3, 0x4, 0x0, 0, 0x0}
103 case ALHU:
104 return &inst{0x3, 0x5, 0x0, 0, 0x0}
105 case ALWU:
106 return &inst{0x3, 0x6, 0x0, 0, 0x0}
107 case ASB:
108 return &inst{0x23, 0x0, 0x0, 0, 0x0}
109 case ASH:
110 return &inst{0x23, 0x1, 0x0, 0, 0x0}
111 case ASW:
112 return &inst{0x23, 0x2, 0x0, 0, 0x0}
113 case ASD:
114 return &inst{0x23, 0x3, 0x0, 0, 0x0}
115 case AFENCE:
116 return &inst{0xf, 0x0, 0x0, 0, 0x0}
117 case AFENCEI:
118 return &inst{0xf, 0x1, 0x0, 0, 0x0}
119 case AMUL:
120 return &inst{0x33, 0x0, 0x0, 32, 0x1}
121 case AMULH:
122 return &inst{0x33, 0x1, 0x0, 32, 0x1}
123 case AMULHSU:
124 return &inst{0x33, 0x2, 0x0, 32, 0x1}
125 case AMULHU:
126 return &inst{0x33, 0x3, 0x0, 32, 0x1}
127 case ADIV:
128 return &inst{0x33, 0x4, 0x0, 32, 0x1}
129 case ADIVU:
130 return &inst{0x33, 0x5, 0x0, 32, 0x1}
131 case AREM:
132 return &inst{0x33, 0x6, 0x0, 32, 0x1}
133 case AREMU:
134 return &inst{0x33, 0x7, 0x0, 32, 0x1}
135 case AMULW:
136 return &inst{0x3b, 0x0, 0x0, 32, 0x1}
137 case ADIVW:
138 return &inst{0x3b, 0x4, 0x0, 32, 0x1}
139 case ADIVUW:
140 return &inst{0x3b, 0x5, 0x0, 32, 0x1}
141 case AREMW:
142 return &inst{0x3b, 0x6, 0x0, 32, 0x1}
143 case AREMUW:
144 return &inst{0x3b, 0x7, 0x0, 32, 0x1}
145 case AAMOADDW:
146 return &inst{0x2f, 0x2, 0x0, 0, 0x0}
147 case AAMOXORW:
148 return &inst{0x2f, 0x2, 0x0, 512, 0x10}
149 case AAMOORW:
150 return &inst{0x2f, 0x2, 0x0, 1024, 0x20}
151 case AAMOANDW:
152 return &inst{0x2f, 0x2, 0x0, 1536, 0x30}
153 case AAMOMINW:
154 return &inst{0x2f, 0x2, 0x0, -2048, 0x40}
155 case AAMOMAXW:
156 return &inst{0x2f, 0x2, 0x0, -1536, 0x50}
157 case AAMOMINUW:
158 return &inst{0x2f, 0x2, 0x0, -1024, 0x60}
159 case AAMOMAXUW:
160 return &inst{0x2f, 0x2, 0x0, -512, 0x70}
161 case AAMOSWAPW:
162 return &inst{0x2f, 0x2, 0x0, 128, 0x4}
163 case ALRW:
164 return &inst{0x2f, 0x2, 0x0, 256, 0x8}
165 case ASCW:
166 return &inst{0x2f, 0x2, 0x0, 384, 0xc}
167 case AAMOADDD:
168 return &inst{0x2f, 0x3, 0x0, 0, 0x0}
169 case AAMOXORD:
170 return &inst{0x2f, 0x3, 0x0, 512, 0x10}
171 case AAMOORD:
172 return &inst{0x2f, 0x3, 0x0, 1024, 0x20}
173 case AAMOANDD:
174 return &inst{0x2f, 0x3, 0x0, 1536, 0x30}
175 case AAMOMIND:
176 return &inst{0x2f, 0x3, 0x0, -2048, 0x40}
177 case AAMOMAXD:
178 return &inst{0x2f, 0x3, 0x0, -1536, 0x50}
179 case AAMOMINUD:
180 return &inst{0x2f, 0x3, 0x0, -1024, 0x60}
181 case AAMOMAXUD:
182 return &inst{0x2f, 0x3, 0x0, -512, 0x70}
183 case AAMOSWAPD:
184 return &inst{0x2f, 0x3, 0x0, 128, 0x4}
185 case ALRD:
186 return &inst{0x2f, 0x3, 0x0, 256, 0x8}
187 case ASCD:
188 return &inst{0x2f, 0x3, 0x0, 384, 0xc}
189 case AECALL:
190 return &inst{0x73, 0x0, 0x0, 0, 0x0}
191 case AEBREAK:
192 return &inst{0x73, 0x0, 0x1, 1, 0x0}
193 case AURET:
194 return &inst{0x73, 0x0, 0x2, 2, 0x0}
195 case ASRET:
196 return &inst{0x73, 0x0, 0x2, 258, 0x8}
197 case AMRET:
198 return &inst{0x73, 0x0, 0x2, 770, 0x18}
199 case ADRET:
200 return &inst{0x73, 0x0, 0x12, 1970, 0x3d}
201 case ASFENCEVMA:
202 return &inst{0x73, 0x0, 0x0, 288, 0x9}
203 case AWFI:
204 return &inst{0x73, 0x0, 0x5, 261, 0x8}
205 case ACSRRW:
206 return &inst{0x73, 0x1, 0x0, 0, 0x0}
207 case ACSRRS:
208 return &inst{0x73, 0x2, 0x0, 0, 0x0}
209 case ACSRRC:
210 return &inst{0x73, 0x3, 0x0, 0, 0x0}
211 case ACSRRWI:
212 return &inst{0x73, 0x5, 0x0, 0, 0x0}
213 case ACSRRSI:
214 return &inst{0x73, 0x6, 0x0, 0, 0x0}
215 case ACSRRCI:
216 return &inst{0x73, 0x7, 0x0, 0, 0x0}
217 case AHFENCEVVMA:
218 return &inst{0x73, 0x0, 0x0, 544, 0x11}
219 case AHFENCEGVMA:
220 return &inst{0x73, 0x0, 0x0, 1568, 0x31}
221 case AFADDS:
222 return &inst{0x53, 0x0, 0x0, 0, 0x0}
223 case AFSUBS:
224 return &inst{0x53, 0x0, 0x0, 128, 0x4}
225 case AFMULS:
226 return &inst{0x53, 0x0, 0x0, 256, 0x8}
227 case AFDIVS:
228 return &inst{0x53, 0x0, 0x0, 384, 0xc}
229 case AFSGNJS:
230 return &inst{0x53, 0x0, 0x0, 512, 0x10}
231 case AFSGNJNS:
232 return &inst{0x53, 0x1, 0x0, 512, 0x10}
233 case AFSGNJXS:
234 return &inst{0x53, 0x2, 0x0, 512, 0x10}
235 case AFMINS:
236 return &inst{0x53, 0x0, 0x0, 640, 0x14}
237 case AFMAXS:
238 return &inst{0x53, 0x1, 0x0, 640, 0x14}
239 case AFSQRTS:
240 return &inst{0x53, 0x0, 0x0, 1408, 0x2c}
241 case AFADDD:
242 return &inst{0x53, 0x0, 0x0, 32, 0x1}
243 case AFSUBD:
244 return &inst{0x53, 0x0, 0x0, 160, 0x5}
245 case AFMULD:
246 return &inst{0x53, 0x0, 0x0, 288, 0x9}
247 case AFDIVD:
248 return &inst{0x53, 0x0, 0x0, 416, 0xd}
249 case AFSGNJD:
250 return &inst{0x53, 0x0, 0x0, 544, 0x11}
251 case AFSGNJND:
252 return &inst{0x53, 0x1, 0x0, 544, 0x11}
253 case AFSGNJXD:
254 return &inst{0x53, 0x2, 0x0, 544, 0x11}
255 case AFMIND:
256 return &inst{0x53, 0x0, 0x0, 672, 0x15}
257 case AFMAXD:
258 return &inst{0x53, 0x1, 0x0, 672, 0x15}
259 case AFCVTSD:
260 return &inst{0x53, 0x0, 0x1, 1025, 0x20}
261 case AFCVTDS:
262 return &inst{0x53, 0x0, 0x0, 1056, 0x21}
263 case AFSQRTD:
264 return &inst{0x53, 0x0, 0x0, 1440, 0x2d}
265 case AFADDQ:
266 return &inst{0x53, 0x0, 0x0, 96, 0x3}
267 case AFSUBQ:
268 return &inst{0x53, 0x0, 0x0, 224, 0x7}
269 case AFMULQ:
270 return &inst{0x53, 0x0, 0x0, 352, 0xb}
271 case AFDIVQ:
272 return &inst{0x53, 0x0, 0x0, 480, 0xf}
273 case AFSGNJQ:
274 return &inst{0x53, 0x0, 0x0, 608, 0x13}
275 case AFSGNJNQ:
276 return &inst{0x53, 0x1, 0x0, 608, 0x13}
277 case AFSGNJXQ:
278 return &inst{0x53, 0x2, 0x0, 608, 0x13}
279 case AFMINQ:
280 return &inst{0x53, 0x0, 0x0, 736, 0x17}
281 case AFMAXQ:
282 return &inst{0x53, 0x1, 0x0, 736, 0x17}
283 case AFCVTSQ:
284 return &inst{0x53, 0x0, 0x3, 1027, 0x20}
285 case AFCVTQS:
286 return &inst{0x53, 0x0, 0x0, 1120, 0x23}
287 case AFCVTDQ:
288 return &inst{0x53, 0x0, 0x3, 1059, 0x21}
289 case AFCVTQD:
290 return &inst{0x53, 0x0, 0x1, 1121, 0x23}
291 case AFSQRTQ:
292 return &inst{0x53, 0x0, 0x0, 1504, 0x2f}
293 case AFLES:
294 return &inst{0x53, 0x0, 0x0, -1536, 0x50}
295 case AFLTS:
296 return &inst{0x53, 0x1, 0x0, -1536, 0x50}
297 case AFEQS:
298 return &inst{0x53, 0x2, 0x0, -1536, 0x50}
299 case AFLED:
300 return &inst{0x53, 0x0, 0x0, -1504, 0x51}
301 case AFLTD:
302 return &inst{0x53, 0x1, 0x0, -1504, 0x51}
303 case AFEQD:
304 return &inst{0x53, 0x2, 0x0, -1504, 0x51}
305 case AFLEQ:
306 return &inst{0x53, 0x0, 0x0, -1440, 0x53}
307 case AFLTQ:
308 return &inst{0x53, 0x1, 0x0, -1440, 0x53}
309 case AFEQQ:
310 return &inst{0x53, 0x2, 0x0, -1440, 0x53}
311 case AFCVTWS:
312 return &inst{0x53, 0x0, 0x0, -1024, 0x60}
313 case AFCVTWUS:
314 return &inst{0x53, 0x0, 0x1, -1023, 0x60}
315 case AFCVTLS:
316 return &inst{0x53, 0x0, 0x2, -1022, 0x60}
317 case AFCVTLUS:
318 return &inst{0x53, 0x0, 0x3, -1021, 0x60}
319 case AFMVXW:
320 return &inst{0x53, 0x0, 0x0, -512, 0x70}
321 case AFCLASSS:
322 return &inst{0x53, 0x1, 0x0, -512, 0x70}
323 case AFCVTWD:
324 return &inst{0x53, 0x0, 0x0, -992, 0x61}
325 case AFCVTWUD:
326 return &inst{0x53, 0x0, 0x1, -991, 0x61}
327 case AFCVTLD:
328 return &inst{0x53, 0x0, 0x2, -990, 0x61}
329 case AFCVTLUD:
330 return &inst{0x53, 0x0, 0x3, -989, 0x61}
331 case AFMVXD:
332 return &inst{0x53, 0x0, 0x0, -480, 0x71}
333 case AFCLASSD:
334 return &inst{0x53, 0x1, 0x0, -480, 0x71}
335 case AFCVTWQ:
336 return &inst{0x53, 0x0, 0x0, -928, 0x63}
337 case AFCVTWUQ:
338 return &inst{0x53, 0x0, 0x1, -927, 0x63}
339 case AFCVTLQ:
340 return &inst{0x53, 0x0, 0x2, -926, 0x63}
341 case AFCVTLUQ:
342 return &inst{0x53, 0x0, 0x3, -925, 0x63}
343 case AFMVXQ:
344 return &inst{0x53, 0x0, 0x0, -416, 0x73}
345 case AFCLASSQ:
346 return &inst{0x53, 0x1, 0x0, -416, 0x73}
347 case AFCVTSW:
348 return &inst{0x53, 0x0, 0x0, -768, 0x68}
349 case AFCVTSWU:
350 return &inst{0x53, 0x0, 0x1, -767, 0x68}
351 case AFCVTSL:
352 return &inst{0x53, 0x0, 0x2, -766, 0x68}
353 case AFCVTSLU:
354 return &inst{0x53, 0x0, 0x3, -765, 0x68}
355 case AFMVWX:
356 return &inst{0x53, 0x0, 0x0, -256, 0x78}
357 case AFCVTDW:
358 return &inst{0x53, 0x0, 0x0, -736, 0x69}
359 case AFCVTDWU:
360 return &inst{0x53, 0x0, 0x1, -735, 0x69}
361 case AFCVTDL:
362 return &inst{0x53, 0x0, 0x2, -734, 0x69}
363 case AFCVTDLU:
364 return &inst{0x53, 0x0, 0x3, -733, 0x69}
365 case AFMVDX:
366 return &inst{0x53, 0x0, 0x0, -224, 0x79}
367 case AFCVTQW:
368 return &inst{0x53, 0x0, 0x0, -672, 0x6b}
369 case AFCVTQWU:
370 return &inst{0x53, 0x0, 0x1, -671, 0x6b}
371 case AFCVTQL:
372 return &inst{0x53, 0x0, 0x2, -670, 0x6b}
373 case AFCVTQLU:
374 return &inst{0x53, 0x0, 0x3, -669, 0x6b}
375 case AFMVQX:
376 return &inst{0x53, 0x0, 0x0, -160, 0x7b}
377 case AFLW:
378 return &inst{0x7, 0x2, 0x0, 0, 0x0}
379 case AFLD:
380 return &inst{0x7, 0x3, 0x0, 0, 0x0}
381 case AFLQ:
382 return &inst{0x7, 0x4, 0x0, 0, 0x0}
383 case AFSW:
384 return &inst{0x27, 0x2, 0x0, 0, 0x0}
385 case AFSD:
386 return &inst{0x27, 0x3, 0x0, 0, 0x0}
387 case AFSQ:
388 return &inst{0x27, 0x4, 0x0, 0, 0x0}
389 case AFMADDS:
390 return &inst{0x43, 0x0, 0x0, 0, 0x0}
391 case AFMSUBS:
392 return &inst{0x47, 0x0, 0x0, 0, 0x0}
393 case AFNMSUBS:
394 return &inst{0x4b, 0x0, 0x0, 0, 0x0}
395 case AFNMADDS:
396 return &inst{0x4f, 0x0, 0x0, 0, 0x0}
397 case AFMADDD:
398 return &inst{0x43, 0x0, 0x0, 32, 0x1}
399 case AFMSUBD:
400 return &inst{0x47, 0x0, 0x0, 32, 0x1}
401 case AFNMSUBD:
402 return &inst{0x4b, 0x0, 0x0, 32, 0x1}
403 case AFNMADDD:
404 return &inst{0x4f, 0x0, 0x0, 32, 0x1}
405 case AFMADDQ:
406 return &inst{0x43, 0x0, 0x0, 96, 0x3}
407 case AFMSUBQ:
408 return &inst{0x47, 0x0, 0x0, 96, 0x3}
409 case AFNMSUBQ:
410 return &inst{0x4b, 0x0, 0x0, 96, 0x3}
411 case AFNMADDQ:
412 return &inst{0x4f, 0x0, 0x0, 96, 0x3}
413 case ASLLIRV32:
414 return &inst{0x13, 0x1, 0x0, 0, 0x0}
415 case ASRLIRV32:
416 return &inst{0x13, 0x5, 0x0, 0, 0x0}
417 case ASRAIRV32:
418 return &inst{0x13, 0x5, 0x0, 1024, 0x20}
419 case AFRFLAGS:
420 return &inst{0x73, 0x2, 0x1, 1, 0x0}
421 case AFSFLAGS:
422 return &inst{0x73, 0x1, 0x1, 1, 0x0}
423 case AFSFLAGSI:
424 return &inst{0x73, 0x5, 0x1, 1, 0x0}
425 case AFRRM:
426 return &inst{0x73, 0x2, 0x2, 2, 0x0}
427 case AFSRM:
428 return &inst{0x73, 0x1, 0x2, 2, 0x0}
429 case AFSRMI:
430 return &inst{0x73, 0x5, 0x2, 2, 0x0}
431 case AFSCSR:
432 return &inst{0x73, 0x1, 0x3, 3, 0x0}
433 case AFRCSR:
434 return &inst{0x73, 0x2, 0x3, 3, 0x0}
435 case ARDCYCLE:
436 return &inst{0x73, 0x2, 0x0, -1024, 0x60}
437 case ARDTIME:
438 return &inst{0x73, 0x2, 0x1, -1023, 0x60}
439 case ARDINSTRET:
440 return &inst{0x73, 0x2, 0x2, -1022, 0x60}
441 case ARDCYCLEH:
442 return &inst{0x73, 0x2, 0x0, -896, 0x64}
443 case ARDTIMEH:
444 return &inst{0x73, 0x2, 0x1, -895, 0x64}
445 case ARDINSTRETH:
446 return &inst{0x73, 0x2, 0x2, -894, 0x64}
447 case ASCALL:
448 return &inst{0x73, 0x0, 0x0, 0, 0x0}
449 case ASBREAK:
450 return &inst{0x73, 0x0, 0x1, 1, 0x0}
451 case AFMVXS:
452 return &inst{0x53, 0x0, 0x0, -512, 0x70}
453 case AFMVSX:
454 return &inst{0x53, 0x0, 0x0, -256, 0x78}
455 case AFENCETSO:
456 return &inst{0xf, 0x0, 0x13, -1997, 0x41}
457 }
458 return nil
459 }
460
View as plain text