xref: /netbsd-src/external/gpl3/binutils.old/dist/opcodes/arc-fxi.h (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1 /* Insert/extract functions for the ARC opcodes.
2    Copyright (C) 2015-2022 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
insert_limm(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)27 insert_limm (unsigned long long insn ATTRIBUTE_UNUSED,
28 	     long long int value ATTRIBUTE_UNUSED,
29 	     const char **errmsg ATTRIBUTE_UNUSED)
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
extract_limm(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)40 extract_limm (unsigned long long insn ATTRIBUTE_UNUSED,
41 	      bool *invalid ATTRIBUTE_UNUSED)
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.  */
53 static unsigned long long
insert_uimm6_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)54 insert_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED,
55 		 long long int value ATTRIBUTE_UNUSED,
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.  */
68 static long long int
extract_uimm6_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)69 extract_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED,
70 		  bool *invalid ATTRIBUTE_UNUSED)
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.  */
84 static unsigned long long
insert_simm12_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)85 insert_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
86 		  long long int value ATTRIBUTE_UNUSED,
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.  */
100 static long long int
extract_simm12_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)101 extract_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
102 		   bool *invalid ATTRIBUTE_UNUSED)
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
insert_simm3_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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
extract_simm3_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)137 extract_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
138 		   bool *invalid ATTRIBUTE_UNUSED)
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
insert_limm_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)157 insert_limm_s (unsigned long long insn ATTRIBUTE_UNUSED,
158 	       long long int value ATTRIBUTE_UNUSED,
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
extract_limm_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)170 extract_limm_s (unsigned long long insn ATTRIBUTE_UNUSED,
171 		bool *invalid ATTRIBUTE_UNUSED)
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.  */
183 static unsigned long long
insert_uimm7_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
200 static long long int
extract_uimm7_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)201 extract_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
202 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
216 static unsigned long long
insert_uimm7_9_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
231 static long long int
extract_uimm7_9_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)232 extract_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
233 		   bool *invalid ATTRIBUTE_UNUSED)
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.  */
247 static unsigned long long
insert_uimm3_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
262 static long long int
extract_uimm3_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)263 extract_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
264 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
278 static unsigned long long
insert_simm11_a32_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
295 static long long int
extract_simm11_a32_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)296 extract_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
297 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
315 static unsigned long long
insert_uimm6_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
331 static long long int
extract_uimm6_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)332 extract_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
333 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
348 static unsigned long long
insert_uimm5_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
363 static long long int
extract_uimm5_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)364 extract_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
365 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
379 static unsigned long long
insert_simm9_a16_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
397 static long long int
extract_simm9_a16_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)398 extract_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED,
399 		     bool *invalid ATTRIBUTE_UNUSED)
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.  */
418 static unsigned long long
insert_uimm6_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)419 insert_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED,
420 		long long int value ATTRIBUTE_UNUSED,
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.  */
433 static long long int
extract_uimm6_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)434 extract_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED,
435 		 bool *invalid ATTRIBUTE_UNUSED)
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.  */
449 static unsigned long long
insert_simm21_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
467 static long long int
extract_simm21_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)468 extract_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
469 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
488 static unsigned long long
insert_simm25_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
507 static long long int
extract_simm25_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)508 extract_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
509 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
529 static unsigned long long
insert_simm10_a16_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
546 static long long int
extract_simm10_a16_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)547 extract_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
548 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
566 static unsigned long long
insert_simm7_a16_10_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
583 static long long int
extract_simm7_a16_10_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)584 extract_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED,
585 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
603 static unsigned long long
insert_simm21_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
621 static long long int
extract_simm21_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)622 extract_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
623 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
642 static unsigned long long
insert_simm25_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
661 static long long int
extract_simm25_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)662 extract_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
663 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
683 static unsigned long long
insert_simm13_a32_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
700 static long long int
extract_simm13_a32_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)701 extract_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
702 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
720 static unsigned long long
insert_simm8_a16_9_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
737 static long long int
extract_simm8_a16_9_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)738 extract_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
739 		       bool *invalid ATTRIBUTE_UNUSED)
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.  */
757 static unsigned long long
insert_uimm3_23(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)758 insert_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED,
759 		 long long int value ATTRIBUTE_UNUSED,
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.  */
772 static long long int
extract_uimm3_23(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)773 extract_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED,
774 		  bool *invalid ATTRIBUTE_UNUSED)
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.  */
788 static unsigned long long
insert_uimm10_6_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
803 static long long int
extract_uimm10_6_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)804 extract_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED,
805 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
819 static unsigned long long
insert_uimm6_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
835 static long long int
extract_uimm6_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)836 extract_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
837 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
852 static unsigned long long
insert_simm9_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)853 insert_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED,
854 		long long int value ATTRIBUTE_UNUSED,
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.  */
868 static long long int
extract_simm9_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)869 extract_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED,
870 		 bool *invalid ATTRIBUTE_UNUSED)
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.  */
889 static unsigned long long
insert_uimm10_a32_8_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
906 static long long int
extract_uimm10_a32_8_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)907 extract_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
908 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
922 static unsigned long long
insert_simm9_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
937 static long long int
extract_simm9_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)938 extract_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
939 		   bool *invalid ATTRIBUTE_UNUSED)
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.  */
957 static unsigned long long
insert_uimm6_a16_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
974 static long long int
extract_uimm6_a16_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)975 extract_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
976 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
990 static unsigned long long
insert_uimm5_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1008 static long long int
extract_uimm5_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1009 extract_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
1010 			bool *invalid ATTRIBUTE_UNUSED)
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.  */
1025 static unsigned long long
insert_simm11_a32_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1043 static long long int
extract_simm11_a32_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1044 extract_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1045 			 bool *invalid ATTRIBUTE_UNUSED)
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.  */
1064 static unsigned long long
insert_uimm7_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1080 static long long int
extract_uimm7_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1081 extract_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1082 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
1097 static unsigned long long
insert_uimm6_a16_21(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1114 static long long int
extract_uimm6_a16_21(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1115 extract_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED,
1116 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
1130 static unsigned long long
insert_uimm7_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1146 static long long int
extract_uimm7_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1147 extract_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
1148 		    bool *invalid ATTRIBUTE_UNUSED)
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.  */
1163 static unsigned long long
insert_uimm7_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1180 static long long int
extract_uimm7_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1181 extract_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1182 		      bool *invalid ATTRIBUTE_UNUSED)
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.  */
1196 static unsigned long long
insert_simm13_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1214 static long long int
extract_simm13_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1215 extract_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1216 		       bool *invalid ATTRIBUTE_UNUSED)
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.  */
1235 static unsigned long long
insert_uimm8_8_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1250 static long long int
extract_uimm8_8_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1251 extract_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
1252 		   bool *invalid ATTRIBUTE_UNUSED)
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.  */
1266 static unsigned long long
insert_uimm6_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)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 {
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.  */
1281 static long long int
extract_uimm6_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1282 extract_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
1283 		   bool *invalid ATTRIBUTE_UNUSED)
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
insert_uimm6_axx_(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1298 insert_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED,
1299 		   long long int value ATTRIBUTE_UNUSED,
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
extract_uimm6_axx_(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1313 extract_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED,
1314 		    bool *invalid ATTRIBUTE_UNUSED)
1315 {
1316   unsigned value = 0;
1317 
1318   return value;
1319 }
1320 #endif /* EXTRACT_UIMM6_AXX_ */
1321