(root)/
binutils-2.41/
opcodes/
arc-fxi.h
       1  /* Insert/extract functions for the ARC opcodes.
       2     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       3  
       4     Contributed by Claudiu Zissulescu (claziss@synopsys.com)
       5  
       6     This file is part of libopcodes.
       7  
       8     This library is free software; you can redistribute it and/or modify
       9     it under the terms of the GNU General Public License as published by
      10     the Free Software Foundation; either version 3, or (at your option)
      11     any later version.
      12  
      13     It is distributed in the hope that it will be useful, but WITHOUT
      14     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      16     License for more details.
      17  
      18     You should have received a copy of the GNU General Public License
      19     along with this program; if not, write to the Free Software Foundation,
      20     Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
      21  
      22  #ifndef INSERT_LIMM
      23  #define INSERT_LIMM
      24  /* mask = 00000000000000000000000000000000
      25     insn = 00100bbb00101111FBBB111110001001.  */
      26  static unsigned long long
      27  insert_limm (unsigned long long insn ATTRIBUTE_UNUSED,
      28  	     long long int value ATTRIBUTE_UNUSED,
      29  	     const char **errmsg ATTRIBUTE_UNUSED)
      30  {
      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
      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
      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
      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
      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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
     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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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_ */