Home | History | Annotate | Download | only in opcodes
      1 /* Insert/extract functions for the ARC opcodes.
      2    Copyright (C) 2015-2016 Free Software Foundation, Inc.
      3 
      4    Contributed by Claudiu Zissulescu (claziss (at) 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
     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
     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
     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
     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
     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
     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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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