/src/binutils-gdb/opcodes/arc-fxi.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Insert/extract functions for the ARC opcodes. |
2 | | Copyright (C) 2015-2023 Free Software Foundation, Inc. |
3 | | |
4 | | Contributed by Claudiu Zissulescu (claziss@synopsys.com) |
5 | | |
6 | | This file is part of libopcodes. |
7 | | |
8 | | This library is free software; you can redistribute it and/or modify |
9 | | it under the terms of the GNU General Public License as published by |
10 | | the Free Software Foundation; either version 3, or (at your option) |
11 | | any later version. |
12 | | |
13 | | It is distributed in the hope that it will be useful, but WITHOUT |
14 | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
15 | | or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
16 | | License for more details. |
17 | | |
18 | | You should have received a copy of the GNU General Public License |
19 | | along with this program; if not, write to the Free Software Foundation, |
20 | | Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
21 | | |
22 | | #ifndef INSERT_LIMM |
23 | | #define INSERT_LIMM |
24 | | /* mask = 00000000000000000000000000000000 |
25 | | insn = 00100bbb00101111FBBB111110001001. */ |
26 | | static unsigned long long |
27 | | insert_limm (unsigned long long insn ATTRIBUTE_UNUSED, |
28 | | long long int value ATTRIBUTE_UNUSED, |
29 | | const char **errmsg ATTRIBUTE_UNUSED) |
30 | 0 | { |
31 | |
|
32 | 0 | return insn; |
33 | 0 | } |
34 | | #endif /* INSERT_LIMM */ |
35 | | |
36 | | #ifndef EXTRACT_LIMM |
37 | | #define EXTRACT_LIMM |
38 | | /* mask = 00000000000000000000000000000000. */ |
39 | | static ATTRIBUTE_UNUSED int |
40 | | extract_limm (unsigned long long insn ATTRIBUTE_UNUSED, |
41 | | bool *invalid ATTRIBUTE_UNUSED) |
42 | 0 | { |
43 | 0 | unsigned value = 0; |
44 | 0 |
|
45 | 0 | return value; |
46 | 0 | } |
47 | | #endif /* EXTRACT_LIMM */ |
48 | | |
49 | | #ifndef INSERT_UIMM6_20 |
50 | | #define INSERT_UIMM6_20 |
51 | | /* mask = 00000000000000000000111111000000 |
52 | | insn = 00100bbb01101111FBBBuuuuuu001001. */ |
53 | | static unsigned long long |
54 | | insert_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
55 | | long long int value ATTRIBUTE_UNUSED, |
56 | | const char **errmsg ATTRIBUTE_UNUSED) |
57 | 0 | { |
58 | |
|
59 | 0 | insn |= ((value >> 0) & 0x003f) << 6; |
60 | |
|
61 | 0 | return insn; |
62 | 0 | } |
63 | | #endif /* INSERT_UIMM6_20 */ |
64 | | |
65 | | #ifndef EXTRACT_UIMM6_20 |
66 | | #define EXTRACT_UIMM6_20 |
67 | | /* mask = 00000000000000000000111111000000. */ |
68 | | static long long int |
69 | | extract_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
70 | | bool *invalid ATTRIBUTE_UNUSED) |
71 | 14.6k | { |
72 | 14.6k | unsigned value = 0; |
73 | | |
74 | 14.6k | value |= ((insn >> 6) & 0x003f) << 0; |
75 | | |
76 | 14.6k | return value; |
77 | 14.6k | } |
78 | | #endif /* EXTRACT_UIMM6_20 */ |
79 | | |
80 | | #ifndef INSERT_SIMM12_20 |
81 | | #define INSERT_SIMM12_20 |
82 | | /* mask = 00000000000000000000111111222222 |
83 | | insn = 00110bbb10101000FBBBssssssSSSSSS. */ |
84 | | static unsigned long long |
85 | | insert_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
86 | | long long int value ATTRIBUTE_UNUSED, |
87 | | const char **errmsg ATTRIBUTE_UNUSED) |
88 | 0 | { |
89 | |
|
90 | 0 | insn |= ((value >> 0) & 0x003f) << 6; |
91 | 0 | insn |= ((value >> 6) & 0x003f) << 0; |
92 | |
|
93 | 0 | return insn; |
94 | 0 | } |
95 | | #endif /* INSERT_SIMM12_20 */ |
96 | | |
97 | | #ifndef EXTRACT_SIMM12_20 |
98 | | #define EXTRACT_SIMM12_20 |
99 | | /* mask = 00000000000000000000111111222222. */ |
100 | | static long long int |
101 | | extract_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
102 | | bool *invalid ATTRIBUTE_UNUSED) |
103 | 9.61k | { |
104 | 9.61k | int value = 0; |
105 | | |
106 | 9.61k | value |= ((insn >> 6) & 0x003f) << 0; |
107 | 9.61k | value |= ((insn >> 0) & 0x003f) << 6; |
108 | | |
109 | | /* Extend the sign. */ |
110 | 9.61k | int signbit = 1 << (12 - 1); |
111 | 9.61k | value = (value ^ signbit) - signbit; |
112 | | |
113 | 9.61k | return value; |
114 | 9.61k | } |
115 | | #endif /* EXTRACT_SIMM12_20 */ |
116 | | |
117 | | #ifndef INSERT_SIMM3_5_S |
118 | | #define INSERT_SIMM3_5_S |
119 | | /* mask = 0000011100000000 |
120 | | insn = 01110ssshhh001HH. */ |
121 | | static ATTRIBUTE_UNUSED unsigned |
122 | | insert_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
123 | | long long int value ATTRIBUTE_UNUSED, |
124 | | const char **errmsg ATTRIBUTE_UNUSED) |
125 | 0 | { |
126 | 0 |
|
127 | 0 | insn |= ((value >> 0) & 0x0007) << 8; |
128 | 0 |
|
129 | 0 | return insn; |
130 | 0 | } |
131 | | #endif /* INSERT_SIMM3_5_S */ |
132 | | |
133 | | #ifndef EXTRACT_SIMM3_5_S |
134 | | #define EXTRACT_SIMM3_5_S |
135 | | /* mask = 0000011100000000. */ |
136 | | static ATTRIBUTE_UNUSED int |
137 | | extract_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
138 | | bool *invalid ATTRIBUTE_UNUSED) |
139 | 0 | { |
140 | 0 | int value = 0; |
141 | 0 |
|
142 | 0 | value |= ((insn >> 8) & 0x0007) << 0; |
143 | 0 |
|
144 | 0 | /* Extend the sign. */ |
145 | 0 | int signbit = 1 << (3 - 1); |
146 | 0 | value = (value ^ signbit) - signbit; |
147 | 0 |
|
148 | 0 | return value; |
149 | 0 | } |
150 | | #endif /* EXTRACT_SIMM3_5_S */ |
151 | | |
152 | | #ifndef INSERT_LIMM_S |
153 | | #define INSERT_LIMM_S |
154 | | /* mask = 0000000000000000 |
155 | | insn = 01110sss11000111. */ |
156 | | static ATTRIBUTE_UNUSED unsigned |
157 | | insert_limm_s (unsigned long long insn ATTRIBUTE_UNUSED, |
158 | | long long int value ATTRIBUTE_UNUSED, |
159 | | const char **errmsg ATTRIBUTE_UNUSED) |
160 | 0 | { |
161 | 0 |
|
162 | 0 | return insn; |
163 | 0 | } |
164 | | #endif /* INSERT_LIMM_S */ |
165 | | |
166 | | #ifndef EXTRACT_LIMM_S |
167 | | #define EXTRACT_LIMM_S |
168 | | /* mask = 0000000000000000. */ |
169 | | static ATTRIBUTE_UNUSED int |
170 | | extract_limm_s (unsigned long long insn ATTRIBUTE_UNUSED, |
171 | | bool *invalid ATTRIBUTE_UNUSED) |
172 | 0 | { |
173 | 0 | unsigned value = 0; |
174 | 0 |
|
175 | 0 | return value; |
176 | 0 | } |
177 | | #endif /* EXTRACT_LIMM_S */ |
178 | | |
179 | | #ifndef INSERT_UIMM7_A32_11_S |
180 | | #define INSERT_UIMM7_A32_11_S |
181 | | /* mask = 0000000000011111 |
182 | | insn = 11000bbb100uuuuu. */ |
183 | | static unsigned long long |
184 | | insert_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
185 | | long long int value ATTRIBUTE_UNUSED, |
186 | | const char **errmsg ATTRIBUTE_UNUSED) |
187 | 0 | { |
188 | 0 | if (value & 0x03) |
189 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
190 | |
|
191 | 0 | insn |= ((value >> 2) & 0x001f) << 0; |
192 | |
|
193 | 0 | return insn; |
194 | 0 | } |
195 | | #endif /* INSERT_UIMM7_A32_11_S */ |
196 | | |
197 | | #ifndef EXTRACT_UIMM7_A32_11_S |
198 | | #define EXTRACT_UIMM7_A32_11_S |
199 | | /* mask = 0000000000011111. */ |
200 | | static long long int |
201 | | extract_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
202 | | bool *invalid ATTRIBUTE_UNUSED) |
203 | 77.4k | { |
204 | 77.4k | unsigned value = 0; |
205 | | |
206 | 77.4k | value |= ((insn >> 0) & 0x001f) << 2; |
207 | | |
208 | 77.4k | return value; |
209 | 77.4k | } |
210 | | #endif /* EXTRACT_UIMM7_A32_11_S */ |
211 | | |
212 | | #ifndef INSERT_UIMM7_9_S |
213 | | #define INSERT_UIMM7_9_S |
214 | | /* mask = 0000000001111111 |
215 | | insn = 11100bbb0uuuuuuu. */ |
216 | | static unsigned long long |
217 | | insert_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED, |
218 | | long long int value ATTRIBUTE_UNUSED, |
219 | | const char **errmsg ATTRIBUTE_UNUSED) |
220 | 0 | { |
221 | |
|
222 | 0 | insn |= ((value >> 0) & 0x007f) << 0; |
223 | |
|
224 | 0 | return insn; |
225 | 0 | } |
226 | | #endif /* INSERT_UIMM7_9_S */ |
227 | | |
228 | | #ifndef EXTRACT_UIMM7_9_S |
229 | | #define EXTRACT_UIMM7_9_S |
230 | | /* mask = 0000000001111111. */ |
231 | | static long long int |
232 | | extract_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED, |
233 | | bool *invalid ATTRIBUTE_UNUSED) |
234 | 35.1k | { |
235 | 35.1k | unsigned value = 0; |
236 | | |
237 | 35.1k | value |= ((insn >> 0) & 0x007f) << 0; |
238 | | |
239 | 35.1k | return value; |
240 | 35.1k | } |
241 | | #endif /* EXTRACT_UIMM7_9_S */ |
242 | | |
243 | | #ifndef INSERT_UIMM3_13_S |
244 | | #define INSERT_UIMM3_13_S |
245 | | /* mask = 0000000000000111 |
246 | | insn = 01101bbbccc00uuu. */ |
247 | | static unsigned long long |
248 | | insert_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
249 | | long long int value ATTRIBUTE_UNUSED, |
250 | | const char **errmsg ATTRIBUTE_UNUSED) |
251 | 0 | { |
252 | |
|
253 | 0 | insn |= ((value >> 0) & 0x0007) << 0; |
254 | |
|
255 | 0 | return insn; |
256 | 0 | } |
257 | | #endif /* INSERT_UIMM3_13_S */ |
258 | | |
259 | | #ifndef EXTRACT_UIMM3_13_S |
260 | | #define EXTRACT_UIMM3_13_S |
261 | | /* mask = 0000000000000111. */ |
262 | | static long long int |
263 | | extract_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
264 | | bool *invalid ATTRIBUTE_UNUSED) |
265 | 29.8k | { |
266 | 29.8k | unsigned value = 0; |
267 | | |
268 | 29.8k | value |= ((insn >> 0) & 0x0007) << 0; |
269 | | |
270 | 29.8k | return value; |
271 | 29.8k | } |
272 | | #endif /* EXTRACT_UIMM3_13_S */ |
273 | | |
274 | | #ifndef INSERT_SIMM11_A32_7_S |
275 | | #define INSERT_SIMM11_A32_7_S |
276 | | /* mask = 0000000111111111 |
277 | | insn = 1100111sssssssss. */ |
278 | | static unsigned long long |
279 | | insert_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
280 | | long long int value ATTRIBUTE_UNUSED, |
281 | | const char **errmsg ATTRIBUTE_UNUSED) |
282 | 0 | { |
283 | 0 | if (value & 0x03) |
284 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
285 | |
|
286 | 0 | insn |= ((value >> 2) & 0x01ff) << 0; |
287 | |
|
288 | 0 | return insn; |
289 | 0 | } |
290 | | #endif /* INSERT_SIMM11_A32_7_S */ |
291 | | |
292 | | #ifndef EXTRACT_SIMM11_A32_7_S |
293 | | #define EXTRACT_SIMM11_A32_7_S |
294 | | /* mask = 0000000111111111. */ |
295 | | static long long int |
296 | | extract_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
297 | | bool *invalid ATTRIBUTE_UNUSED) |
298 | 13.8k | { |
299 | 13.8k | int value = 0; |
300 | | |
301 | 13.8k | value |= ((insn >> 0) & 0x01ff) << 2; |
302 | | |
303 | | /* Extend the sign. */ |
304 | 13.8k | int signbit = 1 << (11 - 1); |
305 | 13.8k | value = (value ^ signbit) - signbit; |
306 | | |
307 | 13.8k | return value; |
308 | 13.8k | } |
309 | | #endif /* EXTRACT_SIMM11_A32_7_S */ |
310 | | |
311 | | #ifndef INSERT_UIMM6_13_S |
312 | | #define INSERT_UIMM6_13_S |
313 | | /* mask = 0000000002220111 |
314 | | insn = 01001bbb0UUU1uuu. */ |
315 | | static unsigned long long |
316 | | insert_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
317 | | long long int value ATTRIBUTE_UNUSED, |
318 | | const char **errmsg ATTRIBUTE_UNUSED) |
319 | 0 | { |
320 | |
|
321 | 0 | insn |= ((value >> 0) & 0x0007) << 0; |
322 | 0 | insn |= ((value >> 3) & 0x0007) << 4; |
323 | |
|
324 | 0 | return insn; |
325 | 0 | } |
326 | | #endif /* INSERT_UIMM6_13_S */ |
327 | | |
328 | | #ifndef EXTRACT_UIMM6_13_S |
329 | | #define EXTRACT_UIMM6_13_S |
330 | | /* mask = 0000000002220111. */ |
331 | | static long long int |
332 | | extract_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
333 | | bool *invalid ATTRIBUTE_UNUSED) |
334 | 7.84k | { |
335 | 7.84k | unsigned value = 0; |
336 | | |
337 | 7.84k | value |= ((insn >> 0) & 0x0007) << 0; |
338 | 7.84k | value |= ((insn >> 4) & 0x0007) << 3; |
339 | | |
340 | 7.84k | return value; |
341 | 7.84k | } |
342 | | #endif /* EXTRACT_UIMM6_13_S */ |
343 | | |
344 | | #ifndef INSERT_UIMM5_11_S |
345 | | #define INSERT_UIMM5_11_S |
346 | | /* mask = 0000000000011111 |
347 | | insn = 10111bbb000uuuuu. */ |
348 | | static unsigned long long |
349 | | insert_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
350 | | long long int value ATTRIBUTE_UNUSED, |
351 | | const char **errmsg ATTRIBUTE_UNUSED) |
352 | 0 | { |
353 | |
|
354 | 0 | insn |= ((value >> 0) & 0x001f) << 0; |
355 | |
|
356 | 0 | return insn; |
357 | 0 | } |
358 | | #endif /* INSERT_UIMM5_11_S */ |
359 | | |
360 | | #ifndef EXTRACT_UIMM5_11_S |
361 | | #define EXTRACT_UIMM5_11_S |
362 | | /* mask = 0000000000011111. */ |
363 | | static long long int |
364 | | extract_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
365 | | bool *invalid ATTRIBUTE_UNUSED) |
366 | 71.5k | { |
367 | 71.5k | unsigned value = 0; |
368 | | |
369 | 71.5k | value |= ((insn >> 0) & 0x001f) << 0; |
370 | | |
371 | 71.5k | return value; |
372 | 71.5k | } |
373 | | #endif /* EXTRACT_UIMM5_11_S */ |
374 | | |
375 | | #ifndef INSERT_SIMM9_A16_8 |
376 | | #define INSERT_SIMM9_A16_8 |
377 | | /* mask = 00000000111111102000000000000000 |
378 | | insn = 00001bbbsssssss1SBBBCCCCCCN01110. */ |
379 | | static unsigned long long |
380 | | insert_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
381 | | long long int value ATTRIBUTE_UNUSED, |
382 | | const char **errmsg ATTRIBUTE_UNUSED) |
383 | 0 | { |
384 | 0 | if (value & 0x01) |
385 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
386 | |
|
387 | 0 | insn |= ((value >> 1) & 0x007f) << 17; |
388 | 0 | insn |= ((value >> 8) & 0x0001) << 15; |
389 | |
|
390 | 0 | return insn; |
391 | 0 | } |
392 | | #endif /* INSERT_SIMM9_A16_8 */ |
393 | | |
394 | | #ifndef EXTRACT_SIMM9_A16_8 |
395 | | #define EXTRACT_SIMM9_A16_8 |
396 | | /* mask = 00000000111111102000000000000000. */ |
397 | | static long long int |
398 | | extract_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
399 | | bool *invalid ATTRIBUTE_UNUSED) |
400 | 12.5k | { |
401 | 12.5k | int value = 0; |
402 | | |
403 | 12.5k | value |= ((insn >> 17) & 0x007f) << 1; |
404 | 12.5k | value |= ((insn >> 15) & 0x0001) << 8; |
405 | | |
406 | | /* Extend the sign. */ |
407 | 12.5k | int signbit = 1 << (9 - 1); |
408 | 12.5k | value = (value ^ signbit) - signbit; |
409 | | |
410 | 12.5k | return value; |
411 | 12.5k | } |
412 | | #endif /* EXTRACT_SIMM9_A16_8 */ |
413 | | |
414 | | #ifndef INSERT_UIMM6_8 |
415 | | #define INSERT_UIMM6_8 |
416 | | /* mask = 00000000000000000000111111000000 |
417 | | insn = 00001bbbsssssss1SBBBuuuuuuN11110. */ |
418 | | static unsigned long long |
419 | | insert_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
420 | | long long int value ATTRIBUTE_UNUSED, |
421 | | const char **errmsg ATTRIBUTE_UNUSED) |
422 | 0 | { |
423 | |
|
424 | 0 | insn |= ((value >> 0) & 0x003f) << 6; |
425 | |
|
426 | 0 | return insn; |
427 | 0 | } |
428 | | #endif /* INSERT_UIMM6_8 */ |
429 | | |
430 | | #ifndef EXTRACT_UIMM6_8 |
431 | | #define EXTRACT_UIMM6_8 |
432 | | /* mask = 00000000000000000000111111000000. */ |
433 | | static long long int |
434 | | extract_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
435 | | bool *invalid ATTRIBUTE_UNUSED) |
436 | 3.22k | { |
437 | 3.22k | unsigned value = 0; |
438 | | |
439 | 3.22k | value |= ((insn >> 6) & 0x003f) << 0; |
440 | | |
441 | 3.22k | return value; |
442 | 3.22k | } |
443 | | #endif /* EXTRACT_UIMM6_8 */ |
444 | | |
445 | | #ifndef INSERT_SIMM21_A16_5 |
446 | | #define INSERT_SIMM21_A16_5 |
447 | | /* mask = 00000111111111102222222222000000 |
448 | | insn = 00000ssssssssss0SSSSSSSSSSNQQQQQ. */ |
449 | | static unsigned long long |
450 | | insert_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
451 | | long long int value ATTRIBUTE_UNUSED, |
452 | | const char **errmsg ATTRIBUTE_UNUSED) |
453 | 0 | { |
454 | 0 | if (value & 0x01) |
455 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
456 | |
|
457 | 0 | insn |= ((value >> 1) & 0x03ff) << 17; |
458 | 0 | insn |= ((value >> 11) & 0x03ff) << 6; |
459 | |
|
460 | 0 | return insn; |
461 | 0 | } |
462 | | #endif /* INSERT_SIMM21_A16_5 */ |
463 | | |
464 | | #ifndef EXTRACT_SIMM21_A16_5 |
465 | | #define EXTRACT_SIMM21_A16_5 |
466 | | /* mask = 00000111111111102222222222000000. */ |
467 | | static long long int |
468 | | extract_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
469 | | bool *invalid ATTRIBUTE_UNUSED) |
470 | 109k | { |
471 | 109k | int value = 0; |
472 | | |
473 | 109k | value |= ((insn >> 17) & 0x03ff) << 1; |
474 | 109k | value |= ((insn >> 6) & 0x03ff) << 11; |
475 | | |
476 | | /* Extend the sign. */ |
477 | 109k | int signbit = 1 << (21 - 1); |
478 | 109k | value = (value ^ signbit) - signbit; |
479 | | |
480 | 109k | return value; |
481 | 109k | } |
482 | | #endif /* EXTRACT_SIMM21_A16_5 */ |
483 | | |
484 | | #ifndef INSERT_SIMM25_A16_5 |
485 | | #define INSERT_SIMM25_A16_5 |
486 | | /* mask = 00000111111111102222222222003333 |
487 | | insn = 00000ssssssssss1SSSSSSSSSSNRtttt. */ |
488 | | static unsigned long long |
489 | | insert_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
490 | | long long int value ATTRIBUTE_UNUSED, |
491 | | const char **errmsg ATTRIBUTE_UNUSED) |
492 | 0 | { |
493 | 0 | if (value & 0x01) |
494 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
495 | |
|
496 | 0 | insn |= ((value >> 1) & 0x03ff) << 17; |
497 | 0 | insn |= ((value >> 11) & 0x03ff) << 6; |
498 | 0 | insn |= ((value >> 21) & 0x000f) << 0; |
499 | |
|
500 | 0 | return insn; |
501 | 0 | } |
502 | | #endif /* INSERT_SIMM25_A16_5 */ |
503 | | |
504 | | #ifndef EXTRACT_SIMM25_A16_5 |
505 | | #define EXTRACT_SIMM25_A16_5 |
506 | | /* mask = 00000111111111102222222222003333. */ |
507 | | static long long int |
508 | | extract_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
509 | | bool *invalid ATTRIBUTE_UNUSED) |
510 | 54.9k | { |
511 | 54.9k | int value = 0; |
512 | | |
513 | 54.9k | value |= ((insn >> 17) & 0x03ff) << 1; |
514 | 54.9k | value |= ((insn >> 6) & 0x03ff) << 11; |
515 | 54.9k | value |= ((insn >> 0) & 0x000f) << 21; |
516 | | |
517 | | /* Extend the sign. */ |
518 | 54.9k | int signbit = 1 << (25 - 1); |
519 | 54.9k | value = (value ^ signbit) - signbit; |
520 | | |
521 | 54.9k | return value; |
522 | 54.9k | } |
523 | | #endif /* EXTRACT_SIMM25_A16_5 */ |
524 | | |
525 | | #ifndef INSERT_SIMM10_A16_7_S |
526 | | #define INSERT_SIMM10_A16_7_S |
527 | | /* mask = 0000000111111111 |
528 | | insn = 1111001sssssssss. */ |
529 | | static unsigned long long |
530 | | insert_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
531 | | long long int value ATTRIBUTE_UNUSED, |
532 | | const char **errmsg ATTRIBUTE_UNUSED) |
533 | 0 | { |
534 | 0 | if (value & 0x01) |
535 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
536 | |
|
537 | 0 | insn |= ((value >> 1) & 0x01ff) << 0; |
538 | |
|
539 | 0 | return insn; |
540 | 0 | } |
541 | | #endif /* INSERT_SIMM10_A16_7_S */ |
542 | | |
543 | | #ifndef EXTRACT_SIMM10_A16_7_S |
544 | | #define EXTRACT_SIMM10_A16_7_S |
545 | | /* mask = 0000000111111111. */ |
546 | | static long long int |
547 | | extract_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
548 | | bool *invalid ATTRIBUTE_UNUSED) |
549 | 27.4k | { |
550 | 27.4k | int value = 0; |
551 | | |
552 | 27.4k | value |= ((insn >> 0) & 0x01ff) << 1; |
553 | | |
554 | | /* Extend the sign. */ |
555 | 27.4k | int signbit = 1 << (10 - 1); |
556 | 27.4k | value = (value ^ signbit) - signbit; |
557 | | |
558 | 27.4k | return value; |
559 | 27.4k | } |
560 | | #endif /* EXTRACT_SIMM10_A16_7_S */ |
561 | | |
562 | | #ifndef INSERT_SIMM7_A16_10_S |
563 | | #define INSERT_SIMM7_A16_10_S |
564 | | /* mask = 0000000000111111 |
565 | | insn = 1111011000ssssss. */ |
566 | | static unsigned long long |
567 | | insert_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED, |
568 | | long long int value ATTRIBUTE_UNUSED, |
569 | | const char **errmsg ATTRIBUTE_UNUSED) |
570 | 0 | { |
571 | 0 | if (value & 0x01) |
572 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
573 | |
|
574 | 0 | insn |= ((value >> 1) & 0x003f) << 0; |
575 | |
|
576 | 0 | return insn; |
577 | 0 | } |
578 | | #endif /* INSERT_SIMM7_A16_10_S */ |
579 | | |
580 | | #ifndef EXTRACT_SIMM7_A16_10_S |
581 | | #define EXTRACT_SIMM7_A16_10_S |
582 | | /* mask = 0000000000111111. */ |
583 | | static long long int |
584 | | extract_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED, |
585 | | bool *invalid ATTRIBUTE_UNUSED) |
586 | 7.37k | { |
587 | 7.37k | int value = 0; |
588 | | |
589 | 7.37k | value |= ((insn >> 0) & 0x003f) << 1; |
590 | | |
591 | | /* Extend the sign. */ |
592 | 7.37k | int signbit = 1 << (7 - 1); |
593 | 7.37k | value = (value ^ signbit) - signbit; |
594 | | |
595 | 7.37k | return value; |
596 | 7.37k | } |
597 | | #endif /* EXTRACT_SIMM7_A16_10_S */ |
598 | | |
599 | | #ifndef INSERT_SIMM21_A32_5 |
600 | | #define INSERT_SIMM21_A32_5 |
601 | | /* mask = 00000111111111002222222222000000 |
602 | | insn = 00001sssssssss00SSSSSSSSSSNQQQQQ. */ |
603 | | static unsigned long long |
604 | | insert_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
605 | | long long int value ATTRIBUTE_UNUSED, |
606 | | const char **errmsg ATTRIBUTE_UNUSED) |
607 | 0 | { |
608 | 0 | if (value & 0x03) |
609 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
610 | |
|
611 | 0 | insn |= ((value >> 2) & 0x01ff) << 18; |
612 | 0 | insn |= ((value >> 11) & 0x03ff) << 6; |
613 | |
|
614 | 0 | return insn; |
615 | 0 | } |
616 | | #endif /* INSERT_SIMM21_A32_5 */ |
617 | | |
618 | | #ifndef EXTRACT_SIMM21_A32_5 |
619 | | #define EXTRACT_SIMM21_A32_5 |
620 | | /* mask = 00000111111111002222222222000000. */ |
621 | | static long long int |
622 | | extract_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
623 | | bool *invalid ATTRIBUTE_UNUSED) |
624 | 9.89k | { |
625 | 9.89k | int value = 0; |
626 | | |
627 | 9.89k | value |= ((insn >> 18) & 0x01ff) << 2; |
628 | 9.89k | value |= ((insn >> 6) & 0x03ff) << 11; |
629 | | |
630 | | /* Extend the sign. */ |
631 | 9.89k | int signbit = 1 << (21 - 1); |
632 | 9.89k | value = (value ^ signbit) - signbit; |
633 | | |
634 | 9.89k | return value; |
635 | 9.89k | } |
636 | | #endif /* EXTRACT_SIMM21_A32_5 */ |
637 | | |
638 | | #ifndef INSERT_SIMM25_A32_5 |
639 | | #define INSERT_SIMM25_A32_5 |
640 | | /* mask = 00000111111111002222222222003333 |
641 | | insn = 00001sssssssss10SSSSSSSSSSNRtttt. */ |
642 | | static unsigned long long |
643 | | insert_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
644 | | long long int value ATTRIBUTE_UNUSED, |
645 | | const char **errmsg ATTRIBUTE_UNUSED) |
646 | 0 | { |
647 | 0 | if (value & 0x03) |
648 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
649 | |
|
650 | 0 | insn |= ((value >> 2) & 0x01ff) << 18; |
651 | 0 | insn |= ((value >> 11) & 0x03ff) << 6; |
652 | 0 | insn |= ((value >> 21) & 0x000f) << 0; |
653 | |
|
654 | 0 | return insn; |
655 | 0 | } |
656 | | #endif /* INSERT_SIMM25_A32_5 */ |
657 | | |
658 | | #ifndef EXTRACT_SIMM25_A32_5 |
659 | | #define EXTRACT_SIMM25_A32_5 |
660 | | /* mask = 00000111111111002222222222003333. */ |
661 | | static long long int |
662 | | extract_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, |
663 | | bool *invalid ATTRIBUTE_UNUSED) |
664 | 5.32k | { |
665 | 5.32k | int value = 0; |
666 | | |
667 | 5.32k | value |= ((insn >> 18) & 0x01ff) << 2; |
668 | 5.32k | value |= ((insn >> 6) & 0x03ff) << 11; |
669 | 5.32k | value |= ((insn >> 0) & 0x000f) << 21; |
670 | | |
671 | | /* Extend the sign. */ |
672 | 5.32k | int signbit = 1 << (25 - 1); |
673 | 5.32k | value = (value ^ signbit) - signbit; |
674 | | |
675 | 5.32k | return value; |
676 | 5.32k | } |
677 | | #endif /* EXTRACT_SIMM25_A32_5 */ |
678 | | |
679 | | #ifndef INSERT_SIMM13_A32_5_S |
680 | | #define INSERT_SIMM13_A32_5_S |
681 | | /* mask = 0000011111111111 |
682 | | insn = 11111sssssssssss. */ |
683 | | static unsigned long long |
684 | | insert_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
685 | | long long int value ATTRIBUTE_UNUSED, |
686 | | const char **errmsg ATTRIBUTE_UNUSED) |
687 | 0 | { |
688 | 0 | if (value & 0x03) |
689 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
690 | |
|
691 | 0 | insn |= ((value >> 2) & 0x07ff) << 0; |
692 | |
|
693 | 0 | return insn; |
694 | 0 | } |
695 | | #endif /* INSERT_SIMM13_A32_5_S */ |
696 | | |
697 | | #ifndef EXTRACT_SIMM13_A32_5_S |
698 | | #define EXTRACT_SIMM13_A32_5_S |
699 | | /* mask = 0000011111111111. */ |
700 | | static long long int |
701 | | extract_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
702 | | bool *invalid ATTRIBUTE_UNUSED) |
703 | 147k | { |
704 | 147k | int value = 0; |
705 | | |
706 | 147k | value |= ((insn >> 0) & 0x07ff) << 2; |
707 | | |
708 | | /* Extend the sign. */ |
709 | 147k | int signbit = 1 << (13 - 1); |
710 | 147k | value = (value ^ signbit) - signbit; |
711 | | |
712 | 147k | return value; |
713 | 147k | } |
714 | | #endif /* EXTRACT_SIMM13_A32_5_S */ |
715 | | |
716 | | #ifndef INSERT_SIMM8_A16_9_S |
717 | | #define INSERT_SIMM8_A16_9_S |
718 | | /* mask = 0000000001111111 |
719 | | insn = 11101bbb1sssssss. */ |
720 | | static unsigned long long |
721 | | insert_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED, |
722 | | long long int value ATTRIBUTE_UNUSED, |
723 | | const char **errmsg ATTRIBUTE_UNUSED) |
724 | 0 | { |
725 | 0 | if (value & 0x01) |
726 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
727 | |
|
728 | 0 | insn |= ((value >> 1) & 0x007f) << 0; |
729 | |
|
730 | 0 | return insn; |
731 | 0 | } |
732 | | #endif /* INSERT_SIMM8_A16_9_S */ |
733 | | |
734 | | #ifndef EXTRACT_SIMM8_A16_9_S |
735 | | #define EXTRACT_SIMM8_A16_9_S |
736 | | /* mask = 0000000001111111. */ |
737 | | static long long int |
738 | | extract_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED, |
739 | | bool *invalid ATTRIBUTE_UNUSED) |
740 | 19.3k | { |
741 | 19.3k | int value = 0; |
742 | | |
743 | 19.3k | value |= ((insn >> 0) & 0x007f) << 1; |
744 | | |
745 | | /* Extend the sign. */ |
746 | 19.3k | int signbit = 1 << (8 - 1); |
747 | 19.3k | value = (value ^ signbit) - signbit; |
748 | | |
749 | 19.3k | return value; |
750 | 19.3k | } |
751 | | #endif /* EXTRACT_SIMM8_A16_9_S */ |
752 | | |
753 | | #ifndef INSERT_UIMM3_23 |
754 | | #define INSERT_UIMM3_23 |
755 | | /* mask = 00000000000000000000000111000000 |
756 | | insn = 00100011011011110001RRRuuu111111. */ |
757 | | static unsigned long long |
758 | | insert_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED, |
759 | | long long int value ATTRIBUTE_UNUSED, |
760 | | const char **errmsg ATTRIBUTE_UNUSED) |
761 | 0 | { |
762 | |
|
763 | 0 | insn |= ((value >> 0) & 0x0007) << 6; |
764 | |
|
765 | 0 | return insn; |
766 | 0 | } |
767 | | #endif /* INSERT_UIMM3_23 */ |
768 | | |
769 | | #ifndef EXTRACT_UIMM3_23 |
770 | | #define EXTRACT_UIMM3_23 |
771 | | /* mask = 00000000000000000000000111000000. */ |
772 | | static long long int |
773 | | extract_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED, |
774 | | bool *invalid ATTRIBUTE_UNUSED) |
775 | 192 | { |
776 | 192 | unsigned value = 0; |
777 | | |
778 | 192 | value |= ((insn >> 6) & 0x0007) << 0; |
779 | | |
780 | 192 | return value; |
781 | 192 | } |
782 | | #endif /* EXTRACT_UIMM3_23 */ |
783 | | |
784 | | #ifndef INSERT_UIMM10_6_S |
785 | | #define INSERT_UIMM10_6_S |
786 | | /* mask = 0000001111111111 |
787 | | insn = 010111uuuuuuuuuu. */ |
788 | | static unsigned long long |
789 | | insert_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED, |
790 | | long long int value ATTRIBUTE_UNUSED, |
791 | | const char **errmsg ATTRIBUTE_UNUSED) |
792 | 0 | { |
793 | |
|
794 | 0 | insn |= ((value >> 0) & 0x03ff) << 0; |
795 | |
|
796 | 0 | return insn; |
797 | 0 | } |
798 | | #endif /* INSERT_UIMM10_6_S */ |
799 | | |
800 | | #ifndef EXTRACT_UIMM10_6_S |
801 | | #define EXTRACT_UIMM10_6_S |
802 | | /* mask = 0000001111111111. */ |
803 | | static long long int |
804 | | extract_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED, |
805 | | bool *invalid ATTRIBUTE_UNUSED) |
806 | 19.8k | { |
807 | 19.8k | unsigned value = 0; |
808 | | |
809 | 19.8k | value |= ((insn >> 0) & 0x03ff) << 0; |
810 | | |
811 | 19.8k | return value; |
812 | 19.8k | } |
813 | | #endif /* EXTRACT_UIMM10_6_S */ |
814 | | |
815 | | #ifndef INSERT_UIMM6_11_S |
816 | | #define INSERT_UIMM6_11_S |
817 | | /* mask = 0000002200011110 |
818 | | insn = 110000UU111uuuu0. */ |
819 | | static unsigned long long |
820 | | insert_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
821 | | long long int value ATTRIBUTE_UNUSED, |
822 | | const char **errmsg ATTRIBUTE_UNUSED) |
823 | 0 | { |
824 | |
|
825 | 0 | insn |= ((value >> 0) & 0x000f) << 1; |
826 | 0 | insn |= ((value >> 4) & 0x0003) << 8; |
827 | |
|
828 | 0 | return insn; |
829 | 0 | } |
830 | | #endif /* INSERT_UIMM6_11_S */ |
831 | | |
832 | | #ifndef EXTRACT_UIMM6_11_S |
833 | | #define EXTRACT_UIMM6_11_S |
834 | | /* mask = 0000002200011110. */ |
835 | | static long long int |
836 | | extract_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
837 | | bool *invalid ATTRIBUTE_UNUSED) |
838 | 0 | { |
839 | 0 | unsigned value = 0; |
840 | |
|
841 | 0 | value |= ((insn >> 1) & 0x000f) << 0; |
842 | 0 | value |= ((insn >> 8) & 0x0003) << 4; |
843 | |
|
844 | 0 | return value; |
845 | 0 | } |
846 | | #endif /* EXTRACT_UIMM6_11_S */ |
847 | | |
848 | | #ifndef INSERT_SIMM9_8 |
849 | | #define INSERT_SIMM9_8 |
850 | | /* mask = 00000000111111112000000000000000 |
851 | | insn = 00010bbbssssssssSBBBDaaZZXAAAAAA. */ |
852 | | static unsigned long long |
853 | | insert_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
854 | | long long int value ATTRIBUTE_UNUSED, |
855 | | const char **errmsg ATTRIBUTE_UNUSED) |
856 | 0 | { |
857 | |
|
858 | 0 | insn |= ((value >> 0) & 0x00ff) << 16; |
859 | 0 | insn |= ((value >> 8) & 0x0001) << 15; |
860 | |
|
861 | 0 | return insn; |
862 | 0 | } |
863 | | #endif /* INSERT_SIMM9_8 */ |
864 | | |
865 | | #ifndef EXTRACT_SIMM9_8 |
866 | | #define EXTRACT_SIMM9_8 |
867 | | /* mask = 00000000111111112000000000000000. */ |
868 | | static long long int |
869 | | extract_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED, |
870 | | bool *invalid ATTRIBUTE_UNUSED) |
871 | 42.5k | { |
872 | 42.5k | int value = 0; |
873 | | |
874 | 42.5k | value |= ((insn >> 16) & 0x00ff) << 0; |
875 | 42.5k | value |= ((insn >> 15) & 0x0001) << 8; |
876 | | |
877 | | /* Extend the sign. */ |
878 | 42.5k | int signbit = 1 << (9 - 1); |
879 | 42.5k | value = (value ^ signbit) - signbit; |
880 | | |
881 | 42.5k | return value; |
882 | 42.5k | } |
883 | | #endif /* EXTRACT_SIMM9_8 */ |
884 | | |
885 | | #ifndef INSERT_UIMM10_A32_8_S |
886 | | #define INSERT_UIMM10_A32_8_S |
887 | | /* mask = 0000000011111111 |
888 | | insn = 11010bbbuuuuuuuu. */ |
889 | | static unsigned long long |
890 | | insert_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED, |
891 | | long long int value ATTRIBUTE_UNUSED, |
892 | | const char **errmsg ATTRIBUTE_UNUSED) |
893 | 0 | { |
894 | 0 | if (value & 0x03) |
895 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
896 | |
|
897 | 0 | insn |= ((value >> 2) & 0x00ff) << 0; |
898 | |
|
899 | 0 | return insn; |
900 | 0 | } |
901 | | #endif /* INSERT_UIMM10_A32_8_S */ |
902 | | |
903 | | #ifndef EXTRACT_UIMM10_A32_8_S |
904 | | #define EXTRACT_UIMM10_A32_8_S |
905 | | /* mask = 0000000011111111. */ |
906 | | static long long int |
907 | | extract_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED, |
908 | | bool *invalid ATTRIBUTE_UNUSED) |
909 | 14.9k | { |
910 | 14.9k | unsigned value = 0; |
911 | | |
912 | 14.9k | value |= ((insn >> 0) & 0x00ff) << 2; |
913 | | |
914 | 14.9k | return value; |
915 | 14.9k | } |
916 | | #endif /* EXTRACT_UIMM10_A32_8_S */ |
917 | | |
918 | | #ifndef INSERT_SIMM9_7_S |
919 | | #define INSERT_SIMM9_7_S |
920 | | /* mask = 0000000111111111 |
921 | | insn = 1100101sssssssss. */ |
922 | | static unsigned long long |
923 | | insert_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
924 | | long long int value ATTRIBUTE_UNUSED, |
925 | | const char **errmsg ATTRIBUTE_UNUSED) |
926 | 0 | { |
927 | |
|
928 | 0 | insn |= ((value >> 0) & 0x01ff) << 0; |
929 | |
|
930 | 0 | return insn; |
931 | 0 | } |
932 | | #endif /* INSERT_SIMM9_7_S */ |
933 | | |
934 | | #ifndef EXTRACT_SIMM9_7_S |
935 | | #define EXTRACT_SIMM9_7_S |
936 | | /* mask = 0000000111111111. */ |
937 | | static long long int |
938 | | extract_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED, |
939 | | bool *invalid ATTRIBUTE_UNUSED) |
940 | 4.77k | { |
941 | 4.77k | int value = 0; |
942 | | |
943 | 4.77k | value |= ((insn >> 0) & 0x01ff) << 0; |
944 | | |
945 | | /* Extend the sign. */ |
946 | 4.77k | int signbit = 1 << (9 - 1); |
947 | 4.77k | value = (value ^ signbit) - signbit; |
948 | | |
949 | 4.77k | return value; |
950 | 4.77k | } |
951 | | #endif /* EXTRACT_SIMM9_7_S */ |
952 | | |
953 | | #ifndef INSERT_UIMM6_A16_11_S |
954 | | #define INSERT_UIMM6_A16_11_S |
955 | | /* mask = 0000000000011111 |
956 | | insn = 10010bbbcccuuuuu. */ |
957 | | static unsigned long long |
958 | | insert_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
959 | | long long int value ATTRIBUTE_UNUSED, |
960 | | const char **errmsg ATTRIBUTE_UNUSED) |
961 | 0 | { |
962 | 0 | if (value & 0x01) |
963 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
964 | |
|
965 | 0 | insn |= ((value >> 1) & 0x001f) << 0; |
966 | |
|
967 | 0 | return insn; |
968 | 0 | } |
969 | | #endif /* INSERT_UIMM6_A16_11_S */ |
970 | | |
971 | | #ifndef EXTRACT_UIMM6_A16_11_S |
972 | | #define EXTRACT_UIMM6_A16_11_S |
973 | | /* mask = 0000000000011111. */ |
974 | | static long long int |
975 | | extract_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
976 | | bool *invalid ATTRIBUTE_UNUSED) |
977 | 77.8k | { |
978 | 77.8k | unsigned value = 0; |
979 | | |
980 | 77.8k | value |= ((insn >> 0) & 0x001f) << 1; |
981 | | |
982 | 77.8k | return value; |
983 | 77.8k | } |
984 | | #endif /* EXTRACT_UIMM6_A16_11_S */ |
985 | | |
986 | | #ifndef INSERT_UIMM5_A32_11_S |
987 | | #define INSERT_UIMM5_A32_11_S |
988 | | /* mask = 0000020000011000 |
989 | | insn = 01000U00hhhuu1HH. */ |
990 | | static unsigned long long |
991 | | insert_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
992 | | long long int value ATTRIBUTE_UNUSED, |
993 | | const char **errmsg ATTRIBUTE_UNUSED) |
994 | 0 | { |
995 | 0 | if (value & 0x03) |
996 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
997 | |
|
998 | 0 | insn |= ((value >> 2) & 0x0003) << 3; |
999 | 0 | insn |= ((value >> 4) & 0x0001) << 10; |
1000 | |
|
1001 | 0 | return insn; |
1002 | 0 | } |
1003 | | #endif /* INSERT_UIMM5_A32_11_S */ |
1004 | | |
1005 | | #ifndef EXTRACT_UIMM5_A32_11_S |
1006 | | #define EXTRACT_UIMM5_A32_11_S |
1007 | | /* mask = 0000020000011000. */ |
1008 | | static long long int |
1009 | | extract_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1010 | | bool *invalid ATTRIBUTE_UNUSED) |
1011 | 10.1k | { |
1012 | 10.1k | unsigned value = 0; |
1013 | | |
1014 | 10.1k | value |= ((insn >> 3) & 0x0003) << 2; |
1015 | 10.1k | value |= ((insn >> 10) & 0x0001) << 4; |
1016 | | |
1017 | 10.1k | return value; |
1018 | 10.1k | } |
1019 | | #endif /* EXTRACT_UIMM5_A32_11_S */ |
1020 | | |
1021 | | #ifndef INSERT_SIMM11_A32_13_S |
1022 | | #define INSERT_SIMM11_A32_13_S |
1023 | | /* mask = 0000022222200111 |
1024 | | insn = 01010SSSSSS00sss. */ |
1025 | | static unsigned long long |
1026 | | insert_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1027 | | long long int value ATTRIBUTE_UNUSED, |
1028 | | const char **errmsg ATTRIBUTE_UNUSED) |
1029 | 0 | { |
1030 | 0 | if (value & 0x03) |
1031 | 0 | *errmsg = _("Target address is not 32bit aligned."); |
1032 | |
|
1033 | 0 | insn |= ((value >> 2) & 0x0007) << 0; |
1034 | 0 | insn |= ((value >> 5) & 0x003f) << 5; |
1035 | |
|
1036 | 0 | return insn; |
1037 | 0 | } |
1038 | | #endif /* INSERT_SIMM11_A32_13_S */ |
1039 | | |
1040 | | #ifndef EXTRACT_SIMM11_A32_13_S |
1041 | | #define EXTRACT_SIMM11_A32_13_S |
1042 | | /* mask = 0000022222200111. */ |
1043 | | static long long int |
1044 | | extract_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1045 | | bool *invalid ATTRIBUTE_UNUSED) |
1046 | 5.85k | { |
1047 | 5.85k | int value = 0; |
1048 | | |
1049 | 5.85k | value |= ((insn >> 0) & 0x0007) << 2; |
1050 | 5.85k | value |= ((insn >> 5) & 0x003f) << 5; |
1051 | | |
1052 | | /* Extend the sign. */ |
1053 | 5.85k | int signbit = 1 << (11 - 1); |
1054 | 5.85k | value = (value ^ signbit) - signbit; |
1055 | | |
1056 | 5.85k | return value; |
1057 | 5.85k | } |
1058 | | #endif /* EXTRACT_SIMM11_A32_13_S */ |
1059 | | |
1060 | | #ifndef INSERT_UIMM7_13_S |
1061 | | #define INSERT_UIMM7_13_S |
1062 | | /* mask = 0000000022220111 |
1063 | | insn = 01010bbbUUUU1uuu. */ |
1064 | | static unsigned long long |
1065 | | insert_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1066 | | long long int value ATTRIBUTE_UNUSED, |
1067 | | const char **errmsg ATTRIBUTE_UNUSED) |
1068 | 0 | { |
1069 | |
|
1070 | 0 | insn |= ((value >> 0) & 0x0007) << 0; |
1071 | 0 | insn |= ((value >> 3) & 0x000f) << 4; |
1072 | |
|
1073 | 0 | return insn; |
1074 | 0 | } |
1075 | | #endif /* INSERT_UIMM7_13_S */ |
1076 | | |
1077 | | #ifndef EXTRACT_UIMM7_13_S |
1078 | | #define EXTRACT_UIMM7_13_S |
1079 | | /* mask = 0000000022220111. */ |
1080 | | static long long int |
1081 | | extract_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1082 | | bool *invalid ATTRIBUTE_UNUSED) |
1083 | 2.67k | { |
1084 | 2.67k | unsigned value = 0; |
1085 | | |
1086 | 2.67k | value |= ((insn >> 0) & 0x0007) << 0; |
1087 | 2.67k | value |= ((insn >> 4) & 0x000f) << 3; |
1088 | | |
1089 | 2.67k | return value; |
1090 | 2.67k | } |
1091 | | #endif /* EXTRACT_UIMM7_13_S */ |
1092 | | |
1093 | | #ifndef INSERT_UIMM6_A16_21 |
1094 | | #define INSERT_UIMM6_A16_21 |
1095 | | /* mask = 00000000000000000000011111000000 |
1096 | | insn = 00101bbb01001100RBBBRuuuuuAAAAAA. */ |
1097 | | static unsigned long long |
1098 | | insert_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED, |
1099 | | long long int value ATTRIBUTE_UNUSED, |
1100 | | const char **errmsg ATTRIBUTE_UNUSED) |
1101 | 0 | { |
1102 | 0 | if (value & 0x01) |
1103 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
1104 | |
|
1105 | 0 | insn |= ((value >> 1) & 0x001f) << 6; |
1106 | |
|
1107 | 0 | return insn; |
1108 | 0 | } |
1109 | | #endif /* INSERT_UIMM6_A16_21 */ |
1110 | | |
1111 | | #ifndef EXTRACT_UIMM6_A16_21 |
1112 | | #define EXTRACT_UIMM6_A16_21 |
1113 | | /* mask = 00000000000000000000011111000000. */ |
1114 | | static long long int |
1115 | | extract_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED, |
1116 | | bool *invalid ATTRIBUTE_UNUSED) |
1117 | 0 | { |
1118 | 0 | unsigned value = 0; |
1119 | |
|
1120 | 0 | value |= ((insn >> 6) & 0x001f) << 1; |
1121 | |
|
1122 | 0 | return value; |
1123 | 0 | } |
1124 | | #endif /* EXTRACT_UIMM6_A16_21 */ |
1125 | | |
1126 | | #ifndef INSERT_UIMM7_11_S |
1127 | | #define INSERT_UIMM7_11_S |
1128 | | /* mask = 0000022200011110 |
1129 | | insn = 11000UUU110uuuu0. */ |
1130 | | static unsigned long long |
1131 | | insert_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1132 | | long long int value ATTRIBUTE_UNUSED, |
1133 | | const char **errmsg ATTRIBUTE_UNUSED) |
1134 | 0 | { |
1135 | |
|
1136 | 0 | insn |= ((value >> 0) & 0x000f) << 1; |
1137 | 0 | insn |= ((value >> 4) & 0x0007) << 8; |
1138 | |
|
1139 | 0 | return insn; |
1140 | 0 | } |
1141 | | #endif /* INSERT_UIMM7_11_S */ |
1142 | | |
1143 | | #ifndef EXTRACT_UIMM7_11_S |
1144 | | #define EXTRACT_UIMM7_11_S |
1145 | | /* mask = 0000022200011110. */ |
1146 | | static long long int |
1147 | | extract_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1148 | | bool *invalid ATTRIBUTE_UNUSED) |
1149 | 0 | { |
1150 | 0 | unsigned value = 0; |
1151 | |
|
1152 | 0 | value |= ((insn >> 1) & 0x000f) << 0; |
1153 | 0 | value |= ((insn >> 8) & 0x0007) << 4; |
1154 | |
|
1155 | 0 | return value; |
1156 | 0 | } |
1157 | | #endif /* EXTRACT_UIMM7_11_S */ |
1158 | | |
1159 | | #ifndef INSERT_UIMM7_A16_20 |
1160 | | #define INSERT_UIMM7_A16_20 |
1161 | | /* mask = 00000000000000000000111111000000 |
1162 | | insn = 00100RRR111010000RRRuuuuuu1QQQQQ. */ |
1163 | | static unsigned long long |
1164 | | insert_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
1165 | | long long int value ATTRIBUTE_UNUSED, |
1166 | | const char **errmsg ATTRIBUTE_UNUSED) |
1167 | 0 | { |
1168 | 0 | if (value & 0x01) |
1169 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
1170 | |
|
1171 | 0 | insn |= ((value >> 1) & 0x003f) << 6; |
1172 | |
|
1173 | 0 | return insn; |
1174 | 0 | } |
1175 | | #endif /* INSERT_UIMM7_A16_20 */ |
1176 | | |
1177 | | #ifndef EXTRACT_UIMM7_A16_20 |
1178 | | #define EXTRACT_UIMM7_A16_20 |
1179 | | /* mask = 00000000000000000000111111000000. */ |
1180 | | static long long int |
1181 | | extract_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
1182 | | bool *invalid ATTRIBUTE_UNUSED) |
1183 | 388 | { |
1184 | 388 | unsigned value = 0; |
1185 | | |
1186 | 388 | value |= ((insn >> 6) & 0x003f) << 1; |
1187 | | |
1188 | 388 | return value; |
1189 | 388 | } |
1190 | | #endif /* EXTRACT_UIMM7_A16_20 */ |
1191 | | |
1192 | | #ifndef INSERT_SIMM13_A16_20 |
1193 | | #define INSERT_SIMM13_A16_20 |
1194 | | /* mask = 00000000000000000000111111222222 |
1195 | | insn = 00100RRR101010000RRRssssssSSSSSS. */ |
1196 | | static unsigned long long |
1197 | | insert_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
1198 | | long long int value ATTRIBUTE_UNUSED, |
1199 | | const char **errmsg ATTRIBUTE_UNUSED) |
1200 | 0 | { |
1201 | 0 | if (value & 0x01) |
1202 | 0 | *errmsg = _("Target address is not 16bit aligned."); |
1203 | |
|
1204 | 0 | insn |= ((value >> 1) & 0x003f) << 6; |
1205 | 0 | insn |= ((value >> 7) & 0x003f) << 0; |
1206 | |
|
1207 | 0 | return insn; |
1208 | 0 | } |
1209 | | #endif /* INSERT_SIMM13_A16_20 */ |
1210 | | |
1211 | | #ifndef EXTRACT_SIMM13_A16_20 |
1212 | | #define EXTRACT_SIMM13_A16_20 |
1213 | | /* mask = 00000000000000000000111111222222. */ |
1214 | | static long long int |
1215 | | extract_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, |
1216 | | bool *invalid ATTRIBUTE_UNUSED) |
1217 | 722 | { |
1218 | 722 | int value = 0; |
1219 | | |
1220 | 722 | value |= ((insn >> 6) & 0x003f) << 1; |
1221 | 722 | value |= ((insn >> 0) & 0x003f) << 7; |
1222 | | |
1223 | | /* Extend the sign. */ |
1224 | 722 | int signbit = 1 << (13 - 1); |
1225 | 722 | value = (value ^ signbit) - signbit; |
1226 | | |
1227 | 722 | return value; |
1228 | 722 | } |
1229 | | #endif /* EXTRACT_SIMM13_A16_20 */ |
1230 | | |
1231 | | #ifndef INSERT_UIMM8_8_S |
1232 | | #define INSERT_UIMM8_8_S |
1233 | | /* mask = 0000000011111111 |
1234 | | insn = 11011bbbuuuuuuuu. */ |
1235 | | static unsigned long long |
1236 | | insert_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1237 | | long long int value ATTRIBUTE_UNUSED, |
1238 | | const char **errmsg ATTRIBUTE_UNUSED) |
1239 | 0 | { |
1240 | |
|
1241 | 0 | insn |= ((value >> 0) & 0x00ff) << 0; |
1242 | |
|
1243 | 0 | return insn; |
1244 | 0 | } |
1245 | | #endif /* INSERT_UIMM8_8_S */ |
1246 | | |
1247 | | #ifndef EXTRACT_UIMM8_8_S |
1248 | | #define EXTRACT_UIMM8_8_S |
1249 | | /* mask = 0000000011111111. */ |
1250 | | static long long int |
1251 | | extract_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1252 | | bool *invalid ATTRIBUTE_UNUSED) |
1253 | 14.8k | { |
1254 | 14.8k | unsigned value = 0; |
1255 | | |
1256 | 14.8k | value |= ((insn >> 0) & 0x00ff) << 0; |
1257 | | |
1258 | 14.8k | return value; |
1259 | 14.8k | } |
1260 | | #endif /* EXTRACT_UIMM8_8_S */ |
1261 | | |
1262 | | #ifndef INSERT_UIMM6_5_S |
1263 | | #define INSERT_UIMM6_5_S |
1264 | | /* mask = 0000011111100000 |
1265 | | insn = 01111uuuuuu11111. */ |
1266 | | static unsigned long long |
1267 | | insert_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1268 | | long long int value ATTRIBUTE_UNUSED, |
1269 | | const char **errmsg ATTRIBUTE_UNUSED) |
1270 | 0 | { |
1271 | |
|
1272 | 0 | insn |= ((value >> 0) & 0x003f) << 5; |
1273 | |
|
1274 | 0 | return insn; |
1275 | 0 | } |
1276 | | #endif /* INSERT_UIMM6_5_S */ |
1277 | | |
1278 | | #ifndef EXTRACT_UIMM6_5_S |
1279 | | #define EXTRACT_UIMM6_5_S |
1280 | | /* mask = 0000011111100000. */ |
1281 | | static long long int |
1282 | | extract_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
1283 | | bool *invalid ATTRIBUTE_UNUSED) |
1284 | 7.39k | { |
1285 | 7.39k | unsigned value = 0; |
1286 | | |
1287 | 7.39k | value |= ((insn >> 5) & 0x003f) << 0; |
1288 | | |
1289 | 7.39k | return value; |
1290 | 7.39k | } |
1291 | | #endif /* EXTRACT_UIMM6_5_S */ |
1292 | | |
1293 | | #ifndef INSERT_UIMM6_AXX_ |
1294 | | #define INSERT_UIMM6_AXX_ |
1295 | | /* mask = 00000000000000000000000000000000 |
1296 | | insn = 00110bbb11100001100001100001QQQQ. */ |
1297 | | static ATTRIBUTE_UNUSED unsigned |
1298 | | insert_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED, |
1299 | | long long int value ATTRIBUTE_UNUSED, |
1300 | | const char **errmsg ATTRIBUTE_UNUSED) |
1301 | 0 | { |
1302 | 0 | if (value & 0x3f) |
1303 | 0 | *errmsg = _("Target address is not 512bit aligned."); |
1304 | 0 |
|
1305 | 0 | return insn; |
1306 | 0 | } |
1307 | | #endif /* INSERT_UIMM6_AXX_ */ |
1308 | | |
1309 | | #ifndef EXTRACT_UIMM6_AXX_ |
1310 | | #define EXTRACT_UIMM6_AXX_ |
1311 | | /* mask = 00000000000000000000000000000000. */ |
1312 | | static ATTRIBUTE_UNUSED int |
1313 | | extract_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED, |
1314 | | bool *invalid ATTRIBUTE_UNUSED) |
1315 | 0 | { |
1316 | 0 | unsigned value = 0; |
1317 | 0 |
|
1318 | 0 | return value; |
1319 | 0 | } |
1320 | | #endif /* EXTRACT_UIMM6_AXX_ */ |