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