Commit | Line | Data |
---|---|---|
886a2506 | 1 | /* Insert/extract functions for the ARC opcodes. |
250d07de | 2 | Copyright (C) 2015-2021 Free Software Foundation, Inc. |
886a2506 NC |
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. */ | |
bdfe53e3 AB |
26 | static unsigned long long |
27 | insert_limm (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a AM |
28 | long long int value ATTRIBUTE_UNUSED, |
29 | const char **errmsg ATTRIBUTE_UNUSED) | |
886a2506 NC |
30 | { |
31 | ||
32 | return insn; | |
33 | } | |
34 | #endif /* INSERT_LIMM */ | |
35 | ||
36 | #ifndef EXTRACT_LIMM | |
37 | #define EXTRACT_LIMM | |
38 | /* mask = 00000000000000000000000000000000. */ | |
39 | static ATTRIBUTE_UNUSED int | |
78933a4a AM |
40 | extract_limm (unsigned long long insn ATTRIBUTE_UNUSED, |
41 | bool *invalid ATTRIBUTE_UNUSED) | |
886a2506 NC |
42 | { |
43 | unsigned value = 0; | |
44 | ||
45 | return value; | |
46 | } | |
47 | #endif /* EXTRACT_LIMM */ | |
48 | ||
49 | #ifndef INSERT_UIMM6_20 | |
50 | #define INSERT_UIMM6_20 | |
51 | /* mask = 00000000000000000000111111000000 | |
52 | insn = 00100bbb01101111FBBBuuuuuu001001. */ | |
bdfe53e3 AB |
53 | static unsigned long long |
54 | insert_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
55 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
56 | const char **errmsg ATTRIBUTE_UNUSED) |
57 | { | |
58 | ||
59 | insn |= ((value >> 0) & 0x003f) << 6; | |
60 | ||
61 | return insn; | |
62 | } | |
63 | #endif /* INSERT_UIMM6_20 */ | |
64 | ||
65 | #ifndef EXTRACT_UIMM6_20 | |
66 | #define EXTRACT_UIMM6_20 | |
67 | /* mask = 00000000000000000000111111000000. */ | |
bdfe53e3 AB |
68 | static long long int |
69 | extract_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 70 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
71 | { |
72 | unsigned value = 0; | |
73 | ||
74 | value |= ((insn >> 6) & 0x003f) << 0; | |
75 | ||
76 | return value; | |
77 | } | |
78 | #endif /* EXTRACT_UIMM6_20 */ | |
79 | ||
80 | #ifndef INSERT_SIMM12_20 | |
81 | #define INSERT_SIMM12_20 | |
82 | /* mask = 00000000000000000000111111222222 | |
83 | insn = 00110bbb10101000FBBBssssssSSSSSS. */ | |
bdfe53e3 AB |
84 | static unsigned long long |
85 | insert_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
86 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
87 | const char **errmsg ATTRIBUTE_UNUSED) |
88 | { | |
89 | ||
90 | insn |= ((value >> 0) & 0x003f) << 6; | |
91 | insn |= ((value >> 6) & 0x003f) << 0; | |
92 | ||
93 | return insn; | |
94 | } | |
95 | #endif /* INSERT_SIMM12_20 */ | |
96 | ||
97 | #ifndef EXTRACT_SIMM12_20 | |
98 | #define EXTRACT_SIMM12_20 | |
99 | /* mask = 00000000000000000000111111222222. */ | |
bdfe53e3 AB |
100 | static long long int |
101 | extract_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 102 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
103 | { |
104 | int value = 0; | |
105 | ||
106 | value |= ((insn >> 6) & 0x003f) << 0; | |
107 | value |= ((insn >> 0) & 0x003f) << 6; | |
108 | ||
109 | /* Extend the sign. */ | |
110 | int signbit = 1 << (12 - 1); | |
111 | value = (value ^ signbit) - signbit; | |
112 | ||
113 | return value; | |
114 | } | |
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 | |
bdfe53e3 AB |
122 | insert_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
123 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
124 | const char **errmsg ATTRIBUTE_UNUSED) |
125 | { | |
126 | ||
127 | insn |= ((value >> 0) & 0x0007) << 8; | |
128 | ||
129 | return insn; | |
130 | } | |
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 | |
bdfe53e3 | 137 | extract_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED, |
78933a4a | 138 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
139 | { |
140 | int value = 0; | |
141 | ||
142 | value |= ((insn >> 8) & 0x0007) << 0; | |
143 | ||
144 | /* Extend the sign. */ | |
145 | int signbit = 1 << (3 - 1); | |
146 | value = (value ^ signbit) - signbit; | |
147 | ||
148 | return value; | |
149 | } | |
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 | |
bdfe53e3 AB |
157 | insert_limm_s (unsigned long long insn ATTRIBUTE_UNUSED, |
158 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
159 | const char **errmsg ATTRIBUTE_UNUSED) |
160 | { | |
161 | ||
162 | return insn; | |
163 | } | |
164 | #endif /* INSERT_LIMM_S */ | |
165 | ||
166 | #ifndef EXTRACT_LIMM_S | |
167 | #define EXTRACT_LIMM_S | |
168 | /* mask = 0000000000000000. */ | |
169 | static ATTRIBUTE_UNUSED int | |
78933a4a AM |
170 | extract_limm_s (unsigned long long insn ATTRIBUTE_UNUSED, |
171 | bool *invalid ATTRIBUTE_UNUSED) | |
886a2506 NC |
172 | { |
173 | unsigned value = 0; | |
174 | ||
175 | return value; | |
176 | } | |
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. */ | |
bdfe53e3 AB |
183 | static unsigned long long |
184 | insert_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
185 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
186 | const char **errmsg ATTRIBUTE_UNUSED) |
187 | { | |
188 | if (value & 0x03) | |
189 | *errmsg = _("Target address is not 32bit aligned."); | |
190 | ||
191 | insn |= ((value >> 2) & 0x001f) << 0; | |
192 | ||
193 | return insn; | |
194 | } | |
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. */ | |
bdfe53e3 AB |
200 | static long long int |
201 | extract_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 202 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
203 | { |
204 | unsigned value = 0; | |
205 | ||
206 | value |= ((insn >> 0) & 0x001f) << 2; | |
207 | ||
208 | return value; | |
209 | } | |
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. */ | |
bdfe53e3 AB |
216 | static unsigned long long |
217 | insert_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
218 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
219 | const char **errmsg ATTRIBUTE_UNUSED) |
220 | { | |
221 | ||
222 | insn |= ((value >> 0) & 0x007f) << 0; | |
223 | ||
224 | return insn; | |
225 | } | |
226 | #endif /* INSERT_UIMM7_9_S */ | |
227 | ||
228 | #ifndef EXTRACT_UIMM7_9_S | |
229 | #define EXTRACT_UIMM7_9_S | |
230 | /* mask = 0000000001111111. */ | |
bdfe53e3 AB |
231 | static long long int |
232 | extract_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 233 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
234 | { |
235 | unsigned value = 0; | |
236 | ||
237 | value |= ((insn >> 0) & 0x007f) << 0; | |
238 | ||
239 | return value; | |
240 | } | |
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. */ | |
bdfe53e3 AB |
247 | static unsigned long long |
248 | insert_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
249 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
250 | const char **errmsg ATTRIBUTE_UNUSED) |
251 | { | |
252 | ||
253 | insn |= ((value >> 0) & 0x0007) << 0; | |
254 | ||
255 | return insn; | |
256 | } | |
257 | #endif /* INSERT_UIMM3_13_S */ | |
258 | ||
259 | #ifndef EXTRACT_UIMM3_13_S | |
260 | #define EXTRACT_UIMM3_13_S | |
261 | /* mask = 0000000000000111. */ | |
bdfe53e3 AB |
262 | static long long int |
263 | extract_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 264 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
265 | { |
266 | unsigned value = 0; | |
267 | ||
268 | value |= ((insn >> 0) & 0x0007) << 0; | |
269 | ||
270 | return value; | |
271 | } | |
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. */ | |
bdfe53e3 AB |
278 | static unsigned long long |
279 | insert_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
280 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
281 | const char **errmsg ATTRIBUTE_UNUSED) |
282 | { | |
283 | if (value & 0x03) | |
284 | *errmsg = _("Target address is not 32bit aligned."); | |
285 | ||
286 | insn |= ((value >> 2) & 0x01ff) << 0; | |
287 | ||
288 | return insn; | |
289 | } | |
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. */ | |
bdfe53e3 AB |
295 | static long long int |
296 | extract_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 297 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
298 | { |
299 | int value = 0; | |
300 | ||
301 | value |= ((insn >> 0) & 0x01ff) << 2; | |
302 | ||
303 | /* Extend the sign. */ | |
304 | int signbit = 1 << (11 - 1); | |
305 | value = (value ^ signbit) - signbit; | |
306 | ||
307 | return value; | |
308 | } | |
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. */ | |
bdfe53e3 AB |
315 | static unsigned long long |
316 | insert_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
317 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
318 | const char **errmsg ATTRIBUTE_UNUSED) |
319 | { | |
320 | ||
321 | insn |= ((value >> 0) & 0x0007) << 0; | |
322 | insn |= ((value >> 3) & 0x0007) << 4; | |
323 | ||
324 | return insn; | |
325 | } | |
326 | #endif /* INSERT_UIMM6_13_S */ | |
327 | ||
328 | #ifndef EXTRACT_UIMM6_13_S | |
329 | #define EXTRACT_UIMM6_13_S | |
330 | /* mask = 0000000002220111. */ | |
bdfe53e3 AB |
331 | static long long int |
332 | extract_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 333 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
334 | { |
335 | unsigned value = 0; | |
336 | ||
337 | value |= ((insn >> 0) & 0x0007) << 0; | |
338 | value |= ((insn >> 4) & 0x0007) << 3; | |
339 | ||
340 | return value; | |
341 | } | |
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. */ | |
bdfe53e3 AB |
348 | static unsigned long long |
349 | insert_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
350 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
351 | const char **errmsg ATTRIBUTE_UNUSED) |
352 | { | |
353 | ||
354 | insn |= ((value >> 0) & 0x001f) << 0; | |
355 | ||
356 | return insn; | |
357 | } | |
358 | #endif /* INSERT_UIMM5_11_S */ | |
359 | ||
360 | #ifndef EXTRACT_UIMM5_11_S | |
361 | #define EXTRACT_UIMM5_11_S | |
362 | /* mask = 0000000000011111. */ | |
bdfe53e3 AB |
363 | static long long int |
364 | extract_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 365 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
366 | { |
367 | unsigned value = 0; | |
368 | ||
369 | value |= ((insn >> 0) & 0x001f) << 0; | |
370 | ||
371 | return value; | |
372 | } | |
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. */ | |
bdfe53e3 AB |
379 | static unsigned long long |
380 | insert_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
381 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
382 | const char **errmsg ATTRIBUTE_UNUSED) |
383 | { | |
384 | if (value & 0x01) | |
385 | *errmsg = _("Target address is not 16bit aligned."); | |
386 | ||
387 | insn |= ((value >> 1) & 0x007f) << 17; | |
388 | insn |= ((value >> 8) & 0x0001) << 15; | |
389 | ||
390 | return insn; | |
391 | } | |
392 | #endif /* INSERT_SIMM9_A16_8 */ | |
393 | ||
394 | #ifndef EXTRACT_SIMM9_A16_8 | |
395 | #define EXTRACT_SIMM9_A16_8 | |
396 | /* mask = 00000000111111102000000000000000. */ | |
bdfe53e3 AB |
397 | static long long int |
398 | extract_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 399 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
400 | { |
401 | int value = 0; | |
402 | ||
403 | value |= ((insn >> 17) & 0x007f) << 1; | |
404 | value |= ((insn >> 15) & 0x0001) << 8; | |
405 | ||
406 | /* Extend the sign. */ | |
407 | int signbit = 1 << (9 - 1); | |
408 | value = (value ^ signbit) - signbit; | |
409 | ||
410 | return value; | |
411 | } | |
412 | #endif /* EXTRACT_SIMM9_A16_8 */ | |
413 | ||
414 | #ifndef INSERT_UIMM6_8 | |
415 | #define INSERT_UIMM6_8 | |
416 | /* mask = 00000000000000000000111111000000 | |
417 | insn = 00001bbbsssssss1SBBBuuuuuuN11110. */ | |
bdfe53e3 AB |
418 | static unsigned long long |
419 | insert_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
420 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
421 | const char **errmsg ATTRIBUTE_UNUSED) |
422 | { | |
423 | ||
424 | insn |= ((value >> 0) & 0x003f) << 6; | |
425 | ||
426 | return insn; | |
427 | } | |
428 | #endif /* INSERT_UIMM6_8 */ | |
429 | ||
430 | #ifndef EXTRACT_UIMM6_8 | |
431 | #define EXTRACT_UIMM6_8 | |
432 | /* mask = 00000000000000000000111111000000. */ | |
bdfe53e3 AB |
433 | static long long int |
434 | extract_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 435 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
436 | { |
437 | unsigned value = 0; | |
438 | ||
439 | value |= ((insn >> 6) & 0x003f) << 0; | |
440 | ||
441 | return value; | |
442 | } | |
443 | #endif /* EXTRACT_UIMM6_8 */ | |
444 | ||
445 | #ifndef INSERT_SIMM21_A16_5 | |
446 | #define INSERT_SIMM21_A16_5 | |
447 | /* mask = 00000111111111102222222222000000 | |
448 | insn = 00000ssssssssss0SSSSSSSSSSNQQQQQ. */ | |
bdfe53e3 AB |
449 | static unsigned long long |
450 | insert_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
451 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
452 | const char **errmsg ATTRIBUTE_UNUSED) |
453 | { | |
454 | if (value & 0x01) | |
455 | *errmsg = _("Target address is not 16bit aligned."); | |
456 | ||
457 | insn |= ((value >> 1) & 0x03ff) << 17; | |
458 | insn |= ((value >> 11) & 0x03ff) << 6; | |
459 | ||
460 | return insn; | |
461 | } | |
462 | #endif /* INSERT_SIMM21_A16_5 */ | |
463 | ||
464 | #ifndef EXTRACT_SIMM21_A16_5 | |
465 | #define EXTRACT_SIMM21_A16_5 | |
466 | /* mask = 00000111111111102222222222000000. */ | |
bdfe53e3 AB |
467 | static long long int |
468 | extract_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 469 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
470 | { |
471 | int value = 0; | |
472 | ||
473 | value |= ((insn >> 17) & 0x03ff) << 1; | |
474 | value |= ((insn >> 6) & 0x03ff) << 11; | |
475 | ||
476 | /* Extend the sign. */ | |
477 | int signbit = 1 << (21 - 1); | |
478 | value = (value ^ signbit) - signbit; | |
479 | ||
480 | return value; | |
481 | } | |
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. */ | |
bdfe53e3 AB |
488 | static unsigned long long |
489 | insert_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
490 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
491 | const char **errmsg ATTRIBUTE_UNUSED) |
492 | { | |
493 | if (value & 0x01) | |
494 | *errmsg = _("Target address is not 16bit aligned."); | |
495 | ||
496 | insn |= ((value >> 1) & 0x03ff) << 17; | |
497 | insn |= ((value >> 11) & 0x03ff) << 6; | |
498 | insn |= ((value >> 21) & 0x000f) << 0; | |
499 | ||
500 | return insn; | |
501 | } | |
502 | #endif /* INSERT_SIMM25_A16_5 */ | |
503 | ||
504 | #ifndef EXTRACT_SIMM25_A16_5 | |
505 | #define EXTRACT_SIMM25_A16_5 | |
506 | /* mask = 00000111111111102222222222003333. */ | |
bdfe53e3 AB |
507 | static long long int |
508 | extract_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 509 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
510 | { |
511 | int value = 0; | |
512 | ||
513 | value |= ((insn >> 17) & 0x03ff) << 1; | |
514 | value |= ((insn >> 6) & 0x03ff) << 11; | |
515 | value |= ((insn >> 0) & 0x000f) << 21; | |
516 | ||
517 | /* Extend the sign. */ | |
518 | int signbit = 1 << (25 - 1); | |
519 | value = (value ^ signbit) - signbit; | |
520 | ||
521 | return value; | |
522 | } | |
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. */ | |
bdfe53e3 AB |
529 | static unsigned long long |
530 | insert_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
531 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
532 | const char **errmsg ATTRIBUTE_UNUSED) |
533 | { | |
534 | if (value & 0x01) | |
535 | *errmsg = _("Target address is not 16bit aligned."); | |
536 | ||
537 | insn |= ((value >> 1) & 0x01ff) << 0; | |
538 | ||
539 | return insn; | |
540 | } | |
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. */ | |
bdfe53e3 AB |
546 | static long long int |
547 | extract_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 548 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
549 | { |
550 | int value = 0; | |
551 | ||
552 | value |= ((insn >> 0) & 0x01ff) << 1; | |
553 | ||
554 | /* Extend the sign. */ | |
555 | int signbit = 1 << (10 - 1); | |
556 | value = (value ^ signbit) - signbit; | |
557 | ||
558 | return value; | |
559 | } | |
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. */ | |
bdfe53e3 AB |
566 | static unsigned long long |
567 | insert_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
568 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
569 | const char **errmsg ATTRIBUTE_UNUSED) |
570 | { | |
571 | if (value & 0x01) | |
572 | *errmsg = _("Target address is not 16bit aligned."); | |
573 | ||
574 | insn |= ((value >> 1) & 0x003f) << 0; | |
575 | ||
576 | return insn; | |
577 | } | |
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. */ | |
bdfe53e3 AB |
583 | static long long int |
584 | extract_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 585 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
586 | { |
587 | int value = 0; | |
588 | ||
589 | value |= ((insn >> 0) & 0x003f) << 1; | |
590 | ||
591 | /* Extend the sign. */ | |
592 | int signbit = 1 << (7 - 1); | |
593 | value = (value ^ signbit) - signbit; | |
594 | ||
595 | return value; | |
596 | } | |
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. */ | |
bdfe53e3 AB |
603 | static unsigned long long |
604 | insert_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
605 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
606 | const char **errmsg ATTRIBUTE_UNUSED) |
607 | { | |
608 | if (value & 0x03) | |
609 | *errmsg = _("Target address is not 32bit aligned."); | |
610 | ||
611 | insn |= ((value >> 2) & 0x01ff) << 18; | |
612 | insn |= ((value >> 11) & 0x03ff) << 6; | |
613 | ||
614 | return insn; | |
615 | } | |
616 | #endif /* INSERT_SIMM21_A32_5 */ | |
617 | ||
618 | #ifndef EXTRACT_SIMM21_A32_5 | |
619 | #define EXTRACT_SIMM21_A32_5 | |
620 | /* mask = 00000111111111002222222222000000. */ | |
bdfe53e3 AB |
621 | static long long int |
622 | extract_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 623 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
624 | { |
625 | int value = 0; | |
626 | ||
627 | value |= ((insn >> 18) & 0x01ff) << 2; | |
628 | value |= ((insn >> 6) & 0x03ff) << 11; | |
629 | ||
630 | /* Extend the sign. */ | |
631 | int signbit = 1 << (21 - 1); | |
632 | value = (value ^ signbit) - signbit; | |
633 | ||
634 | return value; | |
635 | } | |
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. */ | |
bdfe53e3 AB |
642 | static unsigned long long |
643 | insert_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
644 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
645 | const char **errmsg ATTRIBUTE_UNUSED) |
646 | { | |
647 | if (value & 0x03) | |
648 | *errmsg = _("Target address is not 32bit aligned."); | |
649 | ||
650 | insn |= ((value >> 2) & 0x01ff) << 18; | |
651 | insn |= ((value >> 11) & 0x03ff) << 6; | |
652 | insn |= ((value >> 21) & 0x000f) << 0; | |
653 | ||
654 | return insn; | |
655 | } | |
656 | #endif /* INSERT_SIMM25_A32_5 */ | |
657 | ||
658 | #ifndef EXTRACT_SIMM25_A32_5 | |
659 | #define EXTRACT_SIMM25_A32_5 | |
660 | /* mask = 00000111111111002222222222003333. */ | |
bdfe53e3 AB |
661 | static long long int |
662 | extract_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 663 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
664 | { |
665 | int value = 0; | |
666 | ||
667 | value |= ((insn >> 18) & 0x01ff) << 2; | |
668 | value |= ((insn >> 6) & 0x03ff) << 11; | |
669 | value |= ((insn >> 0) & 0x000f) << 21; | |
670 | ||
671 | /* Extend the sign. */ | |
672 | int signbit = 1 << (25 - 1); | |
673 | value = (value ^ signbit) - signbit; | |
674 | ||
675 | return value; | |
676 | } | |
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. */ | |
bdfe53e3 AB |
683 | static unsigned long long |
684 | insert_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
685 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
686 | const char **errmsg ATTRIBUTE_UNUSED) |
687 | { | |
688 | if (value & 0x03) | |
689 | *errmsg = _("Target address is not 32bit aligned."); | |
690 | ||
691 | insn |= ((value >> 2) & 0x07ff) << 0; | |
692 | ||
693 | return insn; | |
694 | } | |
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. */ | |
bdfe53e3 AB |
700 | static long long int |
701 | extract_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 702 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
703 | { |
704 | int value = 0; | |
705 | ||
706 | value |= ((insn >> 0) & 0x07ff) << 2; | |
707 | ||
708 | /* Extend the sign. */ | |
709 | int signbit = 1 << (13 - 1); | |
710 | value = (value ^ signbit) - signbit; | |
711 | ||
712 | return value; | |
713 | } | |
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. */ | |
bdfe53e3 AB |
720 | static unsigned long long |
721 | insert_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
722 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
723 | const char **errmsg ATTRIBUTE_UNUSED) |
724 | { | |
725 | if (value & 0x01) | |
726 | *errmsg = _("Target address is not 16bit aligned."); | |
727 | ||
728 | insn |= ((value >> 1) & 0x007f) << 0; | |
729 | ||
730 | return insn; | |
731 | } | |
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. */ | |
bdfe53e3 AB |
737 | static long long int |
738 | extract_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 739 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
740 | { |
741 | int value = 0; | |
742 | ||
743 | value |= ((insn >> 0) & 0x007f) << 1; | |
744 | ||
745 | /* Extend the sign. */ | |
746 | int signbit = 1 << (8 - 1); | |
747 | value = (value ^ signbit) - signbit; | |
748 | ||
749 | return value; | |
750 | } | |
751 | #endif /* EXTRACT_SIMM8_A16_9_S */ | |
752 | ||
753 | #ifndef INSERT_UIMM3_23 | |
754 | #define INSERT_UIMM3_23 | |
755 | /* mask = 00000000000000000000000111000000 | |
756 | insn = 00100011011011110001RRRuuu111111. */ | |
bdfe53e3 AB |
757 | static unsigned long long |
758 | insert_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED, | |
759 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
760 | const char **errmsg ATTRIBUTE_UNUSED) |
761 | { | |
762 | ||
763 | insn |= ((value >> 0) & 0x0007) << 6; | |
764 | ||
765 | return insn; | |
766 | } | |
767 | #endif /* INSERT_UIMM3_23 */ | |
768 | ||
769 | #ifndef EXTRACT_UIMM3_23 | |
770 | #define EXTRACT_UIMM3_23 | |
771 | /* mask = 00000000000000000000000111000000. */ | |
bdfe53e3 AB |
772 | static long long int |
773 | extract_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 774 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
775 | { |
776 | unsigned value = 0; | |
777 | ||
778 | value |= ((insn >> 6) & 0x0007) << 0; | |
779 | ||
780 | return value; | |
781 | } | |
782 | #endif /* EXTRACT_UIMM3_23 */ | |
783 | ||
784 | #ifndef INSERT_UIMM10_6_S | |
785 | #define INSERT_UIMM10_6_S | |
786 | /* mask = 0000001111111111 | |
787 | insn = 010111uuuuuuuuuu. */ | |
bdfe53e3 AB |
788 | static unsigned long long |
789 | insert_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
790 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
791 | const char **errmsg ATTRIBUTE_UNUSED) |
792 | { | |
793 | ||
794 | insn |= ((value >> 0) & 0x03ff) << 0; | |
795 | ||
796 | return insn; | |
797 | } | |
798 | #endif /* INSERT_UIMM10_6_S */ | |
799 | ||
800 | #ifndef EXTRACT_UIMM10_6_S | |
801 | #define EXTRACT_UIMM10_6_S | |
802 | /* mask = 0000001111111111. */ | |
bdfe53e3 AB |
803 | static long long int |
804 | extract_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 805 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
806 | { |
807 | unsigned value = 0; | |
808 | ||
809 | value |= ((insn >> 0) & 0x03ff) << 0; | |
810 | ||
811 | return value; | |
812 | } | |
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. */ | |
bdfe53e3 AB |
819 | static unsigned long long |
820 | insert_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
821 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
822 | const char **errmsg ATTRIBUTE_UNUSED) |
823 | { | |
824 | ||
825 | insn |= ((value >> 0) & 0x000f) << 1; | |
826 | insn |= ((value >> 4) & 0x0003) << 8; | |
827 | ||
828 | return insn; | |
829 | } | |
830 | #endif /* INSERT_UIMM6_11_S */ | |
831 | ||
832 | #ifndef EXTRACT_UIMM6_11_S | |
833 | #define EXTRACT_UIMM6_11_S | |
834 | /* mask = 0000002200011110. */ | |
bdfe53e3 AB |
835 | static long long int |
836 | extract_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 837 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
838 | { |
839 | unsigned value = 0; | |
840 | ||
841 | value |= ((insn >> 1) & 0x000f) << 0; | |
842 | value |= ((insn >> 8) & 0x0003) << 4; | |
843 | ||
844 | return value; | |
845 | } | |
846 | #endif /* EXTRACT_UIMM6_11_S */ | |
847 | ||
848 | #ifndef INSERT_SIMM9_8 | |
849 | #define INSERT_SIMM9_8 | |
850 | /* mask = 00000000111111112000000000000000 | |
851 | insn = 00010bbbssssssssSBBBDaaZZXAAAAAA. */ | |
bdfe53e3 AB |
852 | static unsigned long long |
853 | insert_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
854 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
855 | const char **errmsg ATTRIBUTE_UNUSED) |
856 | { | |
857 | ||
858 | insn |= ((value >> 0) & 0x00ff) << 16; | |
859 | insn |= ((value >> 8) & 0x0001) << 15; | |
860 | ||
861 | return insn; | |
862 | } | |
863 | #endif /* INSERT_SIMM9_8 */ | |
864 | ||
865 | #ifndef EXTRACT_SIMM9_8 | |
866 | #define EXTRACT_SIMM9_8 | |
867 | /* mask = 00000000111111112000000000000000. */ | |
bdfe53e3 AB |
868 | static long long int |
869 | extract_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 870 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
871 | { |
872 | int value = 0; | |
873 | ||
874 | value |= ((insn >> 16) & 0x00ff) << 0; | |
875 | value |= ((insn >> 15) & 0x0001) << 8; | |
876 | ||
877 | /* Extend the sign. */ | |
878 | int signbit = 1 << (9 - 1); | |
879 | value = (value ^ signbit) - signbit; | |
880 | ||
881 | return value; | |
882 | } | |
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. */ | |
bdfe53e3 AB |
889 | static unsigned long long |
890 | insert_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
891 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
892 | const char **errmsg ATTRIBUTE_UNUSED) |
893 | { | |
894 | if (value & 0x03) | |
895 | *errmsg = _("Target address is not 32bit aligned."); | |
896 | ||
897 | insn |= ((value >> 2) & 0x00ff) << 0; | |
898 | ||
899 | return insn; | |
900 | } | |
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. */ | |
bdfe53e3 AB |
906 | static long long int |
907 | extract_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 908 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
909 | { |
910 | unsigned value = 0; | |
911 | ||
912 | value |= ((insn >> 0) & 0x00ff) << 2; | |
913 | ||
914 | return value; | |
915 | } | |
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. */ | |
bdfe53e3 AB |
922 | static unsigned long long |
923 | insert_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
924 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
925 | const char **errmsg ATTRIBUTE_UNUSED) |
926 | { | |
927 | ||
928 | insn |= ((value >> 0) & 0x01ff) << 0; | |
929 | ||
930 | return insn; | |
931 | } | |
932 | #endif /* INSERT_SIMM9_7_S */ | |
933 | ||
934 | #ifndef EXTRACT_SIMM9_7_S | |
935 | #define EXTRACT_SIMM9_7_S | |
936 | /* mask = 0000000111111111. */ | |
bdfe53e3 AB |
937 | static long long int |
938 | extract_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 939 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
940 | { |
941 | int value = 0; | |
942 | ||
943 | value |= ((insn >> 0) & 0x01ff) << 0; | |
944 | ||
945 | /* Extend the sign. */ | |
946 | int signbit = 1 << (9 - 1); | |
947 | value = (value ^ signbit) - signbit; | |
948 | ||
949 | return value; | |
950 | } | |
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. */ | |
bdfe53e3 AB |
957 | static unsigned long long |
958 | insert_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
959 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
960 | const char **errmsg ATTRIBUTE_UNUSED) |
961 | { | |
962 | if (value & 0x01) | |
963 | *errmsg = _("Target address is not 16bit aligned."); | |
964 | ||
965 | insn |= ((value >> 1) & 0x001f) << 0; | |
966 | ||
967 | return insn; | |
968 | } | |
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. */ | |
bdfe53e3 AB |
974 | static long long int |
975 | extract_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 976 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
977 | { |
978 | unsigned value = 0; | |
979 | ||
980 | value |= ((insn >> 0) & 0x001f) << 1; | |
981 | ||
982 | return value; | |
983 | } | |
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. */ | |
bdfe53e3 AB |
990 | static unsigned long long |
991 | insert_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
992 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
993 | const char **errmsg ATTRIBUTE_UNUSED) |
994 | { | |
995 | if (value & 0x03) | |
996 | *errmsg = _("Target address is not 32bit aligned."); | |
997 | ||
998 | insn |= ((value >> 2) & 0x0003) << 3; | |
999 | insn |= ((value >> 4) & 0x0001) << 10; | |
1000 | ||
1001 | return insn; | |
1002 | } | |
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. */ | |
bdfe53e3 AB |
1008 | static long long int |
1009 | extract_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1010 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1011 | { |
1012 | unsigned value = 0; | |
1013 | ||
1014 | value |= ((insn >> 3) & 0x0003) << 2; | |
1015 | value |= ((insn >> 10) & 0x0001) << 4; | |
1016 | ||
1017 | return value; | |
1018 | } | |
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. */ | |
bdfe53e3 AB |
1025 | static unsigned long long |
1026 | insert_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
1027 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1028 | const char **errmsg ATTRIBUTE_UNUSED) |
1029 | { | |
1030 | if (value & 0x03) | |
1031 | *errmsg = _("Target address is not 32bit aligned."); | |
1032 | ||
1033 | insn |= ((value >> 2) & 0x0007) << 0; | |
1034 | insn |= ((value >> 5) & 0x003f) << 5; | |
1035 | ||
1036 | return insn; | |
1037 | } | |
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. */ | |
bdfe53e3 AB |
1043 | static long long int |
1044 | extract_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1045 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1046 | { |
1047 | int value = 0; | |
1048 | ||
1049 | value |= ((insn >> 0) & 0x0007) << 2; | |
1050 | value |= ((insn >> 5) & 0x003f) << 5; | |
1051 | ||
1052 | /* Extend the sign. */ | |
1053 | int signbit = 1 << (11 - 1); | |
1054 | value = (value ^ signbit) - signbit; | |
1055 | ||
1056 | return value; | |
1057 | } | |
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. */ | |
bdfe53e3 AB |
1064 | static unsigned long long |
1065 | insert_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
1066 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1067 | const char **errmsg ATTRIBUTE_UNUSED) |
1068 | { | |
1069 | ||
1070 | insn |= ((value >> 0) & 0x0007) << 0; | |
1071 | insn |= ((value >> 3) & 0x000f) << 4; | |
1072 | ||
1073 | return insn; | |
1074 | } | |
1075 | #endif /* INSERT_UIMM7_13_S */ | |
1076 | ||
1077 | #ifndef EXTRACT_UIMM7_13_S | |
1078 | #define EXTRACT_UIMM7_13_S | |
1079 | /* mask = 0000000022220111. */ | |
bdfe53e3 AB |
1080 | static long long int |
1081 | extract_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1082 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1083 | { |
1084 | unsigned value = 0; | |
1085 | ||
1086 | value |= ((insn >> 0) & 0x0007) << 0; | |
1087 | value |= ((insn >> 4) & 0x000f) << 3; | |
1088 | ||
1089 | return value; | |
1090 | } | |
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. */ | |
bdfe53e3 AB |
1097 | static unsigned long long |
1098 | insert_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED, | |
1099 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1100 | const char **errmsg ATTRIBUTE_UNUSED) |
1101 | { | |
1102 | if (value & 0x01) | |
1103 | *errmsg = _("Target address is not 16bit aligned."); | |
1104 | ||
1105 | insn |= ((value >> 1) & 0x001f) << 6; | |
1106 | ||
1107 | return insn; | |
1108 | } | |
1109 | #endif /* INSERT_UIMM6_A16_21 */ | |
1110 | ||
1111 | #ifndef EXTRACT_UIMM6_A16_21 | |
1112 | #define EXTRACT_UIMM6_A16_21 | |
1113 | /* mask = 00000000000000000000011111000000. */ | |
bdfe53e3 AB |
1114 | static long long int |
1115 | extract_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1116 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1117 | { |
1118 | unsigned value = 0; | |
1119 | ||
1120 | value |= ((insn >> 6) & 0x001f) << 1; | |
1121 | ||
1122 | return value; | |
1123 | } | |
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. */ | |
bdfe53e3 AB |
1130 | static unsigned long long |
1131 | insert_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
1132 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1133 | const char **errmsg ATTRIBUTE_UNUSED) |
1134 | { | |
1135 | ||
1136 | insn |= ((value >> 0) & 0x000f) << 1; | |
1137 | insn |= ((value >> 4) & 0x0007) << 8; | |
1138 | ||
1139 | return insn; | |
1140 | } | |
1141 | #endif /* INSERT_UIMM7_11_S */ | |
1142 | ||
1143 | #ifndef EXTRACT_UIMM7_11_S | |
1144 | #define EXTRACT_UIMM7_11_S | |
1145 | /* mask = 0000022200011110. */ | |
bdfe53e3 AB |
1146 | static long long int |
1147 | extract_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1148 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1149 | { |
1150 | unsigned value = 0; | |
1151 | ||
1152 | value |= ((insn >> 1) & 0x000f) << 0; | |
1153 | value |= ((insn >> 8) & 0x0007) << 4; | |
1154 | ||
1155 | return value; | |
1156 | } | |
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. */ | |
bdfe53e3 AB |
1163 | static unsigned long long |
1164 | insert_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
1165 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1166 | const char **errmsg ATTRIBUTE_UNUSED) |
1167 | { | |
1168 | if (value & 0x01) | |
1169 | *errmsg = _("Target address is not 16bit aligned."); | |
1170 | ||
1171 | insn |= ((value >> 1) & 0x003f) << 6; | |
1172 | ||
1173 | return insn; | |
1174 | } | |
1175 | #endif /* INSERT_UIMM7_A16_20 */ | |
1176 | ||
1177 | #ifndef EXTRACT_UIMM7_A16_20 | |
1178 | #define EXTRACT_UIMM7_A16_20 | |
1179 | /* mask = 00000000000000000000111111000000. */ | |
bdfe53e3 AB |
1180 | static long long int |
1181 | extract_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1182 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1183 | { |
1184 | unsigned value = 0; | |
1185 | ||
1186 | value |= ((insn >> 6) & 0x003f) << 1; | |
1187 | ||
1188 | return value; | |
1189 | } | |
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. */ | |
bdfe53e3 AB |
1196 | static unsigned long long |
1197 | insert_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
1198 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1199 | const char **errmsg ATTRIBUTE_UNUSED) |
1200 | { | |
1201 | if (value & 0x01) | |
1202 | *errmsg = _("Target address is not 16bit aligned."); | |
1203 | ||
1204 | insn |= ((value >> 1) & 0x003f) << 6; | |
1205 | insn |= ((value >> 7) & 0x003f) << 0; | |
1206 | ||
1207 | return insn; | |
1208 | } | |
1209 | #endif /* INSERT_SIMM13_A16_20 */ | |
1210 | ||
1211 | #ifndef EXTRACT_SIMM13_A16_20 | |
1212 | #define EXTRACT_SIMM13_A16_20 | |
1213 | /* mask = 00000000000000000000111111222222. */ | |
bdfe53e3 AB |
1214 | static long long int |
1215 | extract_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1216 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1217 | { |
1218 | int value = 0; | |
1219 | ||
1220 | value |= ((insn >> 6) & 0x003f) << 1; | |
1221 | value |= ((insn >> 0) & 0x003f) << 7; | |
1222 | ||
1223 | /* Extend the sign. */ | |
1224 | int signbit = 1 << (13 - 1); | |
1225 | value = (value ^ signbit) - signbit; | |
1226 | ||
1227 | return value; | |
1228 | } | |
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. */ | |
bdfe53e3 AB |
1235 | static unsigned long long |
1236 | insert_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
1237 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1238 | const char **errmsg ATTRIBUTE_UNUSED) |
1239 | { | |
1240 | ||
1241 | insn |= ((value >> 0) & 0x00ff) << 0; | |
1242 | ||
1243 | return insn; | |
1244 | } | |
1245 | #endif /* INSERT_UIMM8_8_S */ | |
1246 | ||
1247 | #ifndef EXTRACT_UIMM8_8_S | |
1248 | #define EXTRACT_UIMM8_8_S | |
1249 | /* mask = 0000000011111111. */ | |
bdfe53e3 AB |
1250 | static long long int |
1251 | extract_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1252 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1253 | { |
1254 | unsigned value = 0; | |
1255 | ||
1256 | value |= ((insn >> 0) & 0x00ff) << 0; | |
1257 | ||
1258 | return value; | |
1259 | } | |
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. */ | |
bdfe53e3 AB |
1266 | static unsigned long long |
1267 | insert_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
1268 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1269 | const char **errmsg ATTRIBUTE_UNUSED) |
1270 | { | |
1271 | ||
1272 | insn |= ((value >> 0) & 0x003f) << 5; | |
1273 | ||
1274 | return insn; | |
1275 | } | |
1276 | #endif /* INSERT_UIMM6_5_S */ | |
1277 | ||
1278 | #ifndef EXTRACT_UIMM6_5_S | |
1279 | #define EXTRACT_UIMM6_5_S | |
1280 | /* mask = 0000011111100000. */ | |
bdfe53e3 AB |
1281 | static long long int |
1282 | extract_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED, | |
78933a4a | 1283 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1284 | { |
1285 | unsigned value = 0; | |
1286 | ||
1287 | value |= ((insn >> 5) & 0x003f) << 0; | |
1288 | ||
1289 | return value; | |
1290 | } | |
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 | |
bdfe53e3 AB |
1298 | insert_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED, |
1299 | long long int value ATTRIBUTE_UNUSED, | |
886a2506 NC |
1300 | const char **errmsg ATTRIBUTE_UNUSED) |
1301 | { | |
1302 | if (value & 0x3f) | |
1303 | *errmsg = _("Target address is not 512bit aligned."); | |
1304 | ||
1305 | return insn; | |
1306 | } | |
1307 | #endif /* INSERT_UIMM6_AXX_ */ | |
1308 | ||
1309 | #ifndef EXTRACT_UIMM6_AXX_ | |
1310 | #define EXTRACT_UIMM6_AXX_ | |
1311 | /* mask = 00000000000000000000000000000000. */ | |
1312 | static ATTRIBUTE_UNUSED int | |
bdfe53e3 | 1313 | extract_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED, |
78933a4a | 1314 | bool *invalid ATTRIBUTE_UNUSED) |
886a2506 NC |
1315 | { |
1316 | unsigned value = 0; | |
1317 | ||
1318 | return value; | |
1319 | } | |
1320 | #endif /* EXTRACT_UIMM6_AXX_ */ |