175fd0b74Schristos /* Insert/extract functions for the ARC opcodes.
2*e992f068Schristos Copyright (C) 2015-2022 Free Software Foundation, Inc.
375fd0b74Schristos
475fd0b74Schristos Contributed by Claudiu Zissulescu (claziss@synopsys.com)
575fd0b74Schristos
675fd0b74Schristos This file is part of libopcodes.
775fd0b74Schristos
875fd0b74Schristos This library is free software; you can redistribute it and/or modify
975fd0b74Schristos it under the terms of the GNU General Public License as published by
1075fd0b74Schristos the Free Software Foundation; either version 3, or (at your option)
1175fd0b74Schristos any later version.
1275fd0b74Schristos
1375fd0b74Schristos It is distributed in the hope that it will be useful, but WITHOUT
1475fd0b74Schristos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1575fd0b74Schristos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
1675fd0b74Schristos License for more details.
1775fd0b74Schristos
1875fd0b74Schristos You should have received a copy of the GNU General Public License
1975fd0b74Schristos along with this program; if not, write to the Free Software Foundation,
2075fd0b74Schristos Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
2175fd0b74Schristos
2275fd0b74Schristos #ifndef INSERT_LIMM
2375fd0b74Schristos #define INSERT_LIMM
2475fd0b74Schristos /* mask = 00000000000000000000000000000000
2575fd0b74Schristos insn = 00100bbb00101111FBBB111110001001. */
26ede78133Schristos static unsigned long long
insert_limm(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)27ede78133Schristos insert_limm (unsigned long long insn ATTRIBUTE_UNUSED,
28*e992f068Schristos long long int value ATTRIBUTE_UNUSED,
29*e992f068Schristos const char **errmsg ATTRIBUTE_UNUSED)
3075fd0b74Schristos {
3175fd0b74Schristos
3275fd0b74Schristos return insn;
3375fd0b74Schristos }
3475fd0b74Schristos #endif /* INSERT_LIMM */
3575fd0b74Schristos
3675fd0b74Schristos #ifndef EXTRACT_LIMM
3775fd0b74Schristos #define EXTRACT_LIMM
3875fd0b74Schristos /* mask = 00000000000000000000000000000000. */
3975fd0b74Schristos static ATTRIBUTE_UNUSED int
extract_limm(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)40*e992f068Schristos extract_limm (unsigned long long insn ATTRIBUTE_UNUSED,
41*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
4275fd0b74Schristos {
4375fd0b74Schristos unsigned value = 0;
4475fd0b74Schristos
4575fd0b74Schristos return value;
4675fd0b74Schristos }
4775fd0b74Schristos #endif /* EXTRACT_LIMM */
4875fd0b74Schristos
4975fd0b74Schristos #ifndef INSERT_UIMM6_20
5075fd0b74Schristos #define INSERT_UIMM6_20
5175fd0b74Schristos /* mask = 00000000000000000000111111000000
5275fd0b74Schristos insn = 00100bbb01101111FBBBuuuuuu001001. */
53ede78133Schristos static unsigned long long
insert_uimm6_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)54ede78133Schristos insert_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED,
55ede78133Schristos long long int value ATTRIBUTE_UNUSED,
5675fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
5775fd0b74Schristos {
5875fd0b74Schristos
5975fd0b74Schristos insn |= ((value >> 0) & 0x003f) << 6;
6075fd0b74Schristos
6175fd0b74Schristos return insn;
6275fd0b74Schristos }
6375fd0b74Schristos #endif /* INSERT_UIMM6_20 */
6475fd0b74Schristos
6575fd0b74Schristos #ifndef EXTRACT_UIMM6_20
6675fd0b74Schristos #define EXTRACT_UIMM6_20
6775fd0b74Schristos /* mask = 00000000000000000000111111000000. */
68ede78133Schristos static long long int
extract_uimm6_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)69ede78133Schristos extract_uimm6_20 (unsigned long long insn ATTRIBUTE_UNUSED,
70*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
7175fd0b74Schristos {
7275fd0b74Schristos unsigned value = 0;
7375fd0b74Schristos
7475fd0b74Schristos value |= ((insn >> 6) & 0x003f) << 0;
7575fd0b74Schristos
7675fd0b74Schristos return value;
7775fd0b74Schristos }
7875fd0b74Schristos #endif /* EXTRACT_UIMM6_20 */
7975fd0b74Schristos
8075fd0b74Schristos #ifndef INSERT_SIMM12_20
8175fd0b74Schristos #define INSERT_SIMM12_20
8275fd0b74Schristos /* mask = 00000000000000000000111111222222
8375fd0b74Schristos insn = 00110bbb10101000FBBBssssssSSSSSS. */
84ede78133Schristos static unsigned long long
insert_simm12_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)85ede78133Schristos insert_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
86ede78133Schristos long long int value ATTRIBUTE_UNUSED,
8775fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
8875fd0b74Schristos {
8975fd0b74Schristos
9075fd0b74Schristos insn |= ((value >> 0) & 0x003f) << 6;
9175fd0b74Schristos insn |= ((value >> 6) & 0x003f) << 0;
9275fd0b74Schristos
9375fd0b74Schristos return insn;
9475fd0b74Schristos }
9575fd0b74Schristos #endif /* INSERT_SIMM12_20 */
9675fd0b74Schristos
9775fd0b74Schristos #ifndef EXTRACT_SIMM12_20
9875fd0b74Schristos #define EXTRACT_SIMM12_20
9975fd0b74Schristos /* mask = 00000000000000000000111111222222. */
100ede78133Schristos static long long int
extract_simm12_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)101ede78133Schristos extract_simm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
102*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
10375fd0b74Schristos {
10475fd0b74Schristos int value = 0;
10575fd0b74Schristos
10675fd0b74Schristos value |= ((insn >> 6) & 0x003f) << 0;
10775fd0b74Schristos value |= ((insn >> 0) & 0x003f) << 6;
10875fd0b74Schristos
10975fd0b74Schristos /* Extend the sign. */
11075fd0b74Schristos int signbit = 1 << (12 - 1);
11175fd0b74Schristos value = (value ^ signbit) - signbit;
11275fd0b74Schristos
11375fd0b74Schristos return value;
11475fd0b74Schristos }
11575fd0b74Schristos #endif /* EXTRACT_SIMM12_20 */
11675fd0b74Schristos
11775fd0b74Schristos #ifndef INSERT_SIMM3_5_S
11875fd0b74Schristos #define INSERT_SIMM3_5_S
11975fd0b74Schristos /* mask = 0000011100000000
12075fd0b74Schristos insn = 01110ssshhh001HH. */
12175fd0b74Schristos static ATTRIBUTE_UNUSED unsigned
insert_simm3_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)122ede78133Schristos insert_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
123ede78133Schristos long long int value ATTRIBUTE_UNUSED,
12475fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
12575fd0b74Schristos {
12675fd0b74Schristos
12775fd0b74Schristos insn |= ((value >> 0) & 0x0007) << 8;
12875fd0b74Schristos
12975fd0b74Schristos return insn;
13075fd0b74Schristos }
13175fd0b74Schristos #endif /* INSERT_SIMM3_5_S */
13275fd0b74Schristos
13375fd0b74Schristos #ifndef EXTRACT_SIMM3_5_S
13475fd0b74Schristos #define EXTRACT_SIMM3_5_S
13575fd0b74Schristos /* mask = 0000011100000000. */
13675fd0b74Schristos static ATTRIBUTE_UNUSED int
extract_simm3_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)137ede78133Schristos extract_simm3_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
138*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
13975fd0b74Schristos {
14075fd0b74Schristos int value = 0;
14175fd0b74Schristos
14275fd0b74Schristos value |= ((insn >> 8) & 0x0007) << 0;
14375fd0b74Schristos
14475fd0b74Schristos /* Extend the sign. */
14575fd0b74Schristos int signbit = 1 << (3 - 1);
14675fd0b74Schristos value = (value ^ signbit) - signbit;
14775fd0b74Schristos
14875fd0b74Schristos return value;
14975fd0b74Schristos }
15075fd0b74Schristos #endif /* EXTRACT_SIMM3_5_S */
15175fd0b74Schristos
15275fd0b74Schristos #ifndef INSERT_LIMM_S
15375fd0b74Schristos #define INSERT_LIMM_S
15475fd0b74Schristos /* mask = 0000000000000000
15575fd0b74Schristos insn = 01110sss11000111. */
15675fd0b74Schristos static ATTRIBUTE_UNUSED unsigned
insert_limm_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)157ede78133Schristos insert_limm_s (unsigned long long insn ATTRIBUTE_UNUSED,
158ede78133Schristos long long int value ATTRIBUTE_UNUSED,
15975fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
16075fd0b74Schristos {
16175fd0b74Schristos
16275fd0b74Schristos return insn;
16375fd0b74Schristos }
16475fd0b74Schristos #endif /* INSERT_LIMM_S */
16575fd0b74Schristos
16675fd0b74Schristos #ifndef EXTRACT_LIMM_S
16775fd0b74Schristos #define EXTRACT_LIMM_S
16875fd0b74Schristos /* mask = 0000000000000000. */
16975fd0b74Schristos static ATTRIBUTE_UNUSED int
extract_limm_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)170*e992f068Schristos extract_limm_s (unsigned long long insn ATTRIBUTE_UNUSED,
171*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
17275fd0b74Schristos {
17375fd0b74Schristos unsigned value = 0;
17475fd0b74Schristos
17575fd0b74Schristos return value;
17675fd0b74Schristos }
17775fd0b74Schristos #endif /* EXTRACT_LIMM_S */
17875fd0b74Schristos
17975fd0b74Schristos #ifndef INSERT_UIMM7_A32_11_S
18075fd0b74Schristos #define INSERT_UIMM7_A32_11_S
18175fd0b74Schristos /* mask = 0000000000011111
18275fd0b74Schristos insn = 11000bbb100uuuuu. */
183ede78133Schristos static unsigned long long
insert_uimm7_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)184ede78133Schristos insert_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
185ede78133Schristos long long int value ATTRIBUTE_UNUSED,
18675fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
18775fd0b74Schristos {
18875fd0b74Schristos if (value & 0x03)
18975fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
19075fd0b74Schristos
19175fd0b74Schristos insn |= ((value >> 2) & 0x001f) << 0;
19275fd0b74Schristos
19375fd0b74Schristos return insn;
19475fd0b74Schristos }
19575fd0b74Schristos #endif /* INSERT_UIMM7_A32_11_S */
19675fd0b74Schristos
19775fd0b74Schristos #ifndef EXTRACT_UIMM7_A32_11_S
19875fd0b74Schristos #define EXTRACT_UIMM7_A32_11_S
19975fd0b74Schristos /* mask = 0000000000011111. */
200ede78133Schristos static long long int
extract_uimm7_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)201ede78133Schristos extract_uimm7_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
202*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
20375fd0b74Schristos {
20475fd0b74Schristos unsigned value = 0;
20575fd0b74Schristos
20675fd0b74Schristos value |= ((insn >> 0) & 0x001f) << 2;
20775fd0b74Schristos
20875fd0b74Schristos return value;
20975fd0b74Schristos }
21075fd0b74Schristos #endif /* EXTRACT_UIMM7_A32_11_S */
21175fd0b74Schristos
21275fd0b74Schristos #ifndef INSERT_UIMM7_9_S
21375fd0b74Schristos #define INSERT_UIMM7_9_S
21475fd0b74Schristos /* mask = 0000000001111111
21575fd0b74Schristos insn = 11100bbb0uuuuuuu. */
216ede78133Schristos static unsigned long long
insert_uimm7_9_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)217ede78133Schristos insert_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
218ede78133Schristos long long int value ATTRIBUTE_UNUSED,
21975fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
22075fd0b74Schristos {
22175fd0b74Schristos
22275fd0b74Schristos insn |= ((value >> 0) & 0x007f) << 0;
22375fd0b74Schristos
22475fd0b74Schristos return insn;
22575fd0b74Schristos }
22675fd0b74Schristos #endif /* INSERT_UIMM7_9_S */
22775fd0b74Schristos
22875fd0b74Schristos #ifndef EXTRACT_UIMM7_9_S
22975fd0b74Schristos #define EXTRACT_UIMM7_9_S
23075fd0b74Schristos /* mask = 0000000001111111. */
231ede78133Schristos static long long int
extract_uimm7_9_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)232ede78133Schristos extract_uimm7_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
233*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
23475fd0b74Schristos {
23575fd0b74Schristos unsigned value = 0;
23675fd0b74Schristos
23775fd0b74Schristos value |= ((insn >> 0) & 0x007f) << 0;
23875fd0b74Schristos
23975fd0b74Schristos return value;
24075fd0b74Schristos }
24175fd0b74Schristos #endif /* EXTRACT_UIMM7_9_S */
24275fd0b74Schristos
24375fd0b74Schristos #ifndef INSERT_UIMM3_13_S
24475fd0b74Schristos #define INSERT_UIMM3_13_S
24575fd0b74Schristos /* mask = 0000000000000111
24675fd0b74Schristos insn = 01101bbbccc00uuu. */
247ede78133Schristos static unsigned long long
insert_uimm3_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)248ede78133Schristos insert_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
249ede78133Schristos long long int value ATTRIBUTE_UNUSED,
25075fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
25175fd0b74Schristos {
25275fd0b74Schristos
25375fd0b74Schristos insn |= ((value >> 0) & 0x0007) << 0;
25475fd0b74Schristos
25575fd0b74Schristos return insn;
25675fd0b74Schristos }
25775fd0b74Schristos #endif /* INSERT_UIMM3_13_S */
25875fd0b74Schristos
25975fd0b74Schristos #ifndef EXTRACT_UIMM3_13_S
26075fd0b74Schristos #define EXTRACT_UIMM3_13_S
26175fd0b74Schristos /* mask = 0000000000000111. */
262ede78133Schristos static long long int
extract_uimm3_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)263ede78133Schristos extract_uimm3_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
264*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
26575fd0b74Schristos {
26675fd0b74Schristos unsigned value = 0;
26775fd0b74Schristos
26875fd0b74Schristos value |= ((insn >> 0) & 0x0007) << 0;
26975fd0b74Schristos
27075fd0b74Schristos return value;
27175fd0b74Schristos }
27275fd0b74Schristos #endif /* EXTRACT_UIMM3_13_S */
27375fd0b74Schristos
27475fd0b74Schristos #ifndef INSERT_SIMM11_A32_7_S
27575fd0b74Schristos #define INSERT_SIMM11_A32_7_S
27675fd0b74Schristos /* mask = 0000000111111111
27775fd0b74Schristos insn = 1100111sssssssss. */
278ede78133Schristos static unsigned long long
insert_simm11_a32_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)279ede78133Schristos insert_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
280ede78133Schristos long long int value ATTRIBUTE_UNUSED,
28175fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
28275fd0b74Schristos {
28375fd0b74Schristos if (value & 0x03)
28475fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
28575fd0b74Schristos
28675fd0b74Schristos insn |= ((value >> 2) & 0x01ff) << 0;
28775fd0b74Schristos
28875fd0b74Schristos return insn;
28975fd0b74Schristos }
29075fd0b74Schristos #endif /* INSERT_SIMM11_A32_7_S */
29175fd0b74Schristos
29275fd0b74Schristos #ifndef EXTRACT_SIMM11_A32_7_S
29375fd0b74Schristos #define EXTRACT_SIMM11_A32_7_S
29475fd0b74Schristos /* mask = 0000000111111111. */
295ede78133Schristos static long long int
extract_simm11_a32_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)296ede78133Schristos extract_simm11_a32_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
297*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
29875fd0b74Schristos {
29975fd0b74Schristos int value = 0;
30075fd0b74Schristos
30175fd0b74Schristos value |= ((insn >> 0) & 0x01ff) << 2;
30275fd0b74Schristos
30375fd0b74Schristos /* Extend the sign. */
30475fd0b74Schristos int signbit = 1 << (11 - 1);
30575fd0b74Schristos value = (value ^ signbit) - signbit;
30675fd0b74Schristos
30775fd0b74Schristos return value;
30875fd0b74Schristos }
30975fd0b74Schristos #endif /* EXTRACT_SIMM11_A32_7_S */
31075fd0b74Schristos
31175fd0b74Schristos #ifndef INSERT_UIMM6_13_S
31275fd0b74Schristos #define INSERT_UIMM6_13_S
31375fd0b74Schristos /* mask = 0000000002220111
31475fd0b74Schristos insn = 01001bbb0UUU1uuu. */
315ede78133Schristos static unsigned long long
insert_uimm6_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)316ede78133Schristos insert_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
317ede78133Schristos long long int value ATTRIBUTE_UNUSED,
31875fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
31975fd0b74Schristos {
32075fd0b74Schristos
32175fd0b74Schristos insn |= ((value >> 0) & 0x0007) << 0;
32275fd0b74Schristos insn |= ((value >> 3) & 0x0007) << 4;
32375fd0b74Schristos
32475fd0b74Schristos return insn;
32575fd0b74Schristos }
32675fd0b74Schristos #endif /* INSERT_UIMM6_13_S */
32775fd0b74Schristos
32875fd0b74Schristos #ifndef EXTRACT_UIMM6_13_S
32975fd0b74Schristos #define EXTRACT_UIMM6_13_S
33075fd0b74Schristos /* mask = 0000000002220111. */
331ede78133Schristos static long long int
extract_uimm6_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)332ede78133Schristos extract_uimm6_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
333*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
33475fd0b74Schristos {
33575fd0b74Schristos unsigned value = 0;
33675fd0b74Schristos
33775fd0b74Schristos value |= ((insn >> 0) & 0x0007) << 0;
33875fd0b74Schristos value |= ((insn >> 4) & 0x0007) << 3;
33975fd0b74Schristos
34075fd0b74Schristos return value;
34175fd0b74Schristos }
34275fd0b74Schristos #endif /* EXTRACT_UIMM6_13_S */
34375fd0b74Schristos
34475fd0b74Schristos #ifndef INSERT_UIMM5_11_S
34575fd0b74Schristos #define INSERT_UIMM5_11_S
34675fd0b74Schristos /* mask = 0000000000011111
34775fd0b74Schristos insn = 10111bbb000uuuuu. */
348ede78133Schristos static unsigned long long
insert_uimm5_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)349ede78133Schristos insert_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
350ede78133Schristos long long int value ATTRIBUTE_UNUSED,
35175fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
35275fd0b74Schristos {
35375fd0b74Schristos
35475fd0b74Schristos insn |= ((value >> 0) & 0x001f) << 0;
35575fd0b74Schristos
35675fd0b74Schristos return insn;
35775fd0b74Schristos }
35875fd0b74Schristos #endif /* INSERT_UIMM5_11_S */
35975fd0b74Schristos
36075fd0b74Schristos #ifndef EXTRACT_UIMM5_11_S
36175fd0b74Schristos #define EXTRACT_UIMM5_11_S
36275fd0b74Schristos /* mask = 0000000000011111. */
363ede78133Schristos static long long int
extract_uimm5_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)364ede78133Schristos extract_uimm5_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
365*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
36675fd0b74Schristos {
36775fd0b74Schristos unsigned value = 0;
36875fd0b74Schristos
36975fd0b74Schristos value |= ((insn >> 0) & 0x001f) << 0;
37075fd0b74Schristos
37175fd0b74Schristos return value;
37275fd0b74Schristos }
37375fd0b74Schristos #endif /* EXTRACT_UIMM5_11_S */
37475fd0b74Schristos
37575fd0b74Schristos #ifndef INSERT_SIMM9_A16_8
37675fd0b74Schristos #define INSERT_SIMM9_A16_8
37775fd0b74Schristos /* mask = 00000000111111102000000000000000
37875fd0b74Schristos insn = 00001bbbsssssss1SBBBCCCCCCN01110. */
379ede78133Schristos static unsigned long long
insert_simm9_a16_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)380ede78133Schristos insert_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED,
381ede78133Schristos long long int value ATTRIBUTE_UNUSED,
38275fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
38375fd0b74Schristos {
38475fd0b74Schristos if (value & 0x01)
38575fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
38675fd0b74Schristos
38775fd0b74Schristos insn |= ((value >> 1) & 0x007f) << 17;
38875fd0b74Schristos insn |= ((value >> 8) & 0x0001) << 15;
38975fd0b74Schristos
39075fd0b74Schristos return insn;
39175fd0b74Schristos }
39275fd0b74Schristos #endif /* INSERT_SIMM9_A16_8 */
39375fd0b74Schristos
39475fd0b74Schristos #ifndef EXTRACT_SIMM9_A16_8
39575fd0b74Schristos #define EXTRACT_SIMM9_A16_8
39675fd0b74Schristos /* mask = 00000000111111102000000000000000. */
397ede78133Schristos static long long int
extract_simm9_a16_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)398ede78133Schristos extract_simm9_a16_8 (unsigned long long insn ATTRIBUTE_UNUSED,
399*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
40075fd0b74Schristos {
40175fd0b74Schristos int value = 0;
40275fd0b74Schristos
40375fd0b74Schristos value |= ((insn >> 17) & 0x007f) << 1;
40475fd0b74Schristos value |= ((insn >> 15) & 0x0001) << 8;
40575fd0b74Schristos
40675fd0b74Schristos /* Extend the sign. */
40775fd0b74Schristos int signbit = 1 << (9 - 1);
40875fd0b74Schristos value = (value ^ signbit) - signbit;
40975fd0b74Schristos
41075fd0b74Schristos return value;
41175fd0b74Schristos }
41275fd0b74Schristos #endif /* EXTRACT_SIMM9_A16_8 */
41375fd0b74Schristos
41475fd0b74Schristos #ifndef INSERT_UIMM6_8
41575fd0b74Schristos #define INSERT_UIMM6_8
41675fd0b74Schristos /* mask = 00000000000000000000111111000000
41775fd0b74Schristos insn = 00001bbbsssssss1SBBBuuuuuuN11110. */
418ede78133Schristos static unsigned long long
insert_uimm6_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)419ede78133Schristos insert_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED,
420ede78133Schristos long long int value ATTRIBUTE_UNUSED,
42175fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
42275fd0b74Schristos {
42375fd0b74Schristos
42475fd0b74Schristos insn |= ((value >> 0) & 0x003f) << 6;
42575fd0b74Schristos
42675fd0b74Schristos return insn;
42775fd0b74Schristos }
42875fd0b74Schristos #endif /* INSERT_UIMM6_8 */
42975fd0b74Schristos
43075fd0b74Schristos #ifndef EXTRACT_UIMM6_8
43175fd0b74Schristos #define EXTRACT_UIMM6_8
43275fd0b74Schristos /* mask = 00000000000000000000111111000000. */
433ede78133Schristos static long long int
extract_uimm6_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)434ede78133Schristos extract_uimm6_8 (unsigned long long insn ATTRIBUTE_UNUSED,
435*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
43675fd0b74Schristos {
43775fd0b74Schristos unsigned value = 0;
43875fd0b74Schristos
43975fd0b74Schristos value |= ((insn >> 6) & 0x003f) << 0;
44075fd0b74Schristos
44175fd0b74Schristos return value;
44275fd0b74Schristos }
44375fd0b74Schristos #endif /* EXTRACT_UIMM6_8 */
44475fd0b74Schristos
44575fd0b74Schristos #ifndef INSERT_SIMM21_A16_5
44675fd0b74Schristos #define INSERT_SIMM21_A16_5
44775fd0b74Schristos /* mask = 00000111111111102222222222000000
44875fd0b74Schristos insn = 00000ssssssssss0SSSSSSSSSSNQQQQQ. */
449ede78133Schristos static unsigned long long
insert_simm21_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)450ede78133Schristos insert_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
451ede78133Schristos long long int value ATTRIBUTE_UNUSED,
45275fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
45375fd0b74Schristos {
45475fd0b74Schristos if (value & 0x01)
45575fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
45675fd0b74Schristos
45775fd0b74Schristos insn |= ((value >> 1) & 0x03ff) << 17;
45875fd0b74Schristos insn |= ((value >> 11) & 0x03ff) << 6;
45975fd0b74Schristos
46075fd0b74Schristos return insn;
46175fd0b74Schristos }
46275fd0b74Schristos #endif /* INSERT_SIMM21_A16_5 */
46375fd0b74Schristos
46475fd0b74Schristos #ifndef EXTRACT_SIMM21_A16_5
46575fd0b74Schristos #define EXTRACT_SIMM21_A16_5
46675fd0b74Schristos /* mask = 00000111111111102222222222000000. */
467ede78133Schristos static long long int
extract_simm21_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)468ede78133Schristos extract_simm21_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
469*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
47075fd0b74Schristos {
47175fd0b74Schristos int value = 0;
47275fd0b74Schristos
47375fd0b74Schristos value |= ((insn >> 17) & 0x03ff) << 1;
47475fd0b74Schristos value |= ((insn >> 6) & 0x03ff) << 11;
47575fd0b74Schristos
47675fd0b74Schristos /* Extend the sign. */
47775fd0b74Schristos int signbit = 1 << (21 - 1);
47875fd0b74Schristos value = (value ^ signbit) - signbit;
47975fd0b74Schristos
48075fd0b74Schristos return value;
48175fd0b74Schristos }
48275fd0b74Schristos #endif /* EXTRACT_SIMM21_A16_5 */
48375fd0b74Schristos
48475fd0b74Schristos #ifndef INSERT_SIMM25_A16_5
48575fd0b74Schristos #define INSERT_SIMM25_A16_5
48675fd0b74Schristos /* mask = 00000111111111102222222222003333
48775fd0b74Schristos insn = 00000ssssssssss1SSSSSSSSSSNRtttt. */
488ede78133Schristos static unsigned long long
insert_simm25_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)489ede78133Schristos insert_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
490ede78133Schristos long long int value ATTRIBUTE_UNUSED,
49175fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
49275fd0b74Schristos {
49375fd0b74Schristos if (value & 0x01)
49475fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
49575fd0b74Schristos
49675fd0b74Schristos insn |= ((value >> 1) & 0x03ff) << 17;
49775fd0b74Schristos insn |= ((value >> 11) & 0x03ff) << 6;
49875fd0b74Schristos insn |= ((value >> 21) & 0x000f) << 0;
49975fd0b74Schristos
50075fd0b74Schristos return insn;
50175fd0b74Schristos }
50275fd0b74Schristos #endif /* INSERT_SIMM25_A16_5 */
50375fd0b74Schristos
50475fd0b74Schristos #ifndef EXTRACT_SIMM25_A16_5
50575fd0b74Schristos #define EXTRACT_SIMM25_A16_5
50675fd0b74Schristos /* mask = 00000111111111102222222222003333. */
507ede78133Schristos static long long int
extract_simm25_a16_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)508ede78133Schristos extract_simm25_a16_5 (unsigned long long insn ATTRIBUTE_UNUSED,
509*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
51075fd0b74Schristos {
51175fd0b74Schristos int value = 0;
51275fd0b74Schristos
51375fd0b74Schristos value |= ((insn >> 17) & 0x03ff) << 1;
51475fd0b74Schristos value |= ((insn >> 6) & 0x03ff) << 11;
51575fd0b74Schristos value |= ((insn >> 0) & 0x000f) << 21;
51675fd0b74Schristos
51775fd0b74Schristos /* Extend the sign. */
51875fd0b74Schristos int signbit = 1 << (25 - 1);
51975fd0b74Schristos value = (value ^ signbit) - signbit;
52075fd0b74Schristos
52175fd0b74Schristos return value;
52275fd0b74Schristos }
52375fd0b74Schristos #endif /* EXTRACT_SIMM25_A16_5 */
52475fd0b74Schristos
52575fd0b74Schristos #ifndef INSERT_SIMM10_A16_7_S
52675fd0b74Schristos #define INSERT_SIMM10_A16_7_S
52775fd0b74Schristos /* mask = 0000000111111111
52875fd0b74Schristos insn = 1111001sssssssss. */
529ede78133Schristos static unsigned long long
insert_simm10_a16_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)530ede78133Schristos insert_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
531ede78133Schristos long long int value ATTRIBUTE_UNUSED,
53275fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
53375fd0b74Schristos {
53475fd0b74Schristos if (value & 0x01)
53575fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
53675fd0b74Schristos
53775fd0b74Schristos insn |= ((value >> 1) & 0x01ff) << 0;
53875fd0b74Schristos
53975fd0b74Schristos return insn;
54075fd0b74Schristos }
54175fd0b74Schristos #endif /* INSERT_SIMM10_A16_7_S */
54275fd0b74Schristos
54375fd0b74Schristos #ifndef EXTRACT_SIMM10_A16_7_S
54475fd0b74Schristos #define EXTRACT_SIMM10_A16_7_S
54575fd0b74Schristos /* mask = 0000000111111111. */
546ede78133Schristos static long long int
extract_simm10_a16_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)547ede78133Schristos extract_simm10_a16_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
548*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
54975fd0b74Schristos {
55075fd0b74Schristos int value = 0;
55175fd0b74Schristos
55275fd0b74Schristos value |= ((insn >> 0) & 0x01ff) << 1;
55375fd0b74Schristos
55475fd0b74Schristos /* Extend the sign. */
55575fd0b74Schristos int signbit = 1 << (10 - 1);
55675fd0b74Schristos value = (value ^ signbit) - signbit;
55775fd0b74Schristos
55875fd0b74Schristos return value;
55975fd0b74Schristos }
56075fd0b74Schristos #endif /* EXTRACT_SIMM10_A16_7_S */
56175fd0b74Schristos
56275fd0b74Schristos #ifndef INSERT_SIMM7_A16_10_S
56375fd0b74Schristos #define INSERT_SIMM7_A16_10_S
56475fd0b74Schristos /* mask = 0000000000111111
56575fd0b74Schristos insn = 1111011000ssssss. */
566ede78133Schristos static unsigned long long
insert_simm7_a16_10_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)567ede78133Schristos insert_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED,
568ede78133Schristos long long int value ATTRIBUTE_UNUSED,
56975fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
57075fd0b74Schristos {
57175fd0b74Schristos if (value & 0x01)
57275fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
57375fd0b74Schristos
57475fd0b74Schristos insn |= ((value >> 1) & 0x003f) << 0;
57575fd0b74Schristos
57675fd0b74Schristos return insn;
57775fd0b74Schristos }
57875fd0b74Schristos #endif /* INSERT_SIMM7_A16_10_S */
57975fd0b74Schristos
58075fd0b74Schristos #ifndef EXTRACT_SIMM7_A16_10_S
58175fd0b74Schristos #define EXTRACT_SIMM7_A16_10_S
58275fd0b74Schristos /* mask = 0000000000111111. */
583ede78133Schristos static long long int
extract_simm7_a16_10_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)584ede78133Schristos extract_simm7_a16_10_s (unsigned long long insn ATTRIBUTE_UNUSED,
585*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
58675fd0b74Schristos {
58775fd0b74Schristos int value = 0;
58875fd0b74Schristos
58975fd0b74Schristos value |= ((insn >> 0) & 0x003f) << 1;
59075fd0b74Schristos
59175fd0b74Schristos /* Extend the sign. */
59275fd0b74Schristos int signbit = 1 << (7 - 1);
59375fd0b74Schristos value = (value ^ signbit) - signbit;
59475fd0b74Schristos
59575fd0b74Schristos return value;
59675fd0b74Schristos }
59775fd0b74Schristos #endif /* EXTRACT_SIMM7_A16_10_S */
59875fd0b74Schristos
59975fd0b74Schristos #ifndef INSERT_SIMM21_A32_5
60075fd0b74Schristos #define INSERT_SIMM21_A32_5
60175fd0b74Schristos /* mask = 00000111111111002222222222000000
60275fd0b74Schristos insn = 00001sssssssss00SSSSSSSSSSNQQQQQ. */
603ede78133Schristos static unsigned long long
insert_simm21_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)604ede78133Schristos insert_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
605ede78133Schristos long long int value ATTRIBUTE_UNUSED,
60675fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
60775fd0b74Schristos {
60875fd0b74Schristos if (value & 0x03)
60975fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
61075fd0b74Schristos
61175fd0b74Schristos insn |= ((value >> 2) & 0x01ff) << 18;
61275fd0b74Schristos insn |= ((value >> 11) & 0x03ff) << 6;
61375fd0b74Schristos
61475fd0b74Schristos return insn;
61575fd0b74Schristos }
61675fd0b74Schristos #endif /* INSERT_SIMM21_A32_5 */
61775fd0b74Schristos
61875fd0b74Schristos #ifndef EXTRACT_SIMM21_A32_5
61975fd0b74Schristos #define EXTRACT_SIMM21_A32_5
62075fd0b74Schristos /* mask = 00000111111111002222222222000000. */
621ede78133Schristos static long long int
extract_simm21_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)622ede78133Schristos extract_simm21_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
623*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
62475fd0b74Schristos {
62575fd0b74Schristos int value = 0;
62675fd0b74Schristos
62775fd0b74Schristos value |= ((insn >> 18) & 0x01ff) << 2;
62875fd0b74Schristos value |= ((insn >> 6) & 0x03ff) << 11;
62975fd0b74Schristos
63075fd0b74Schristos /* Extend the sign. */
63175fd0b74Schristos int signbit = 1 << (21 - 1);
63275fd0b74Schristos value = (value ^ signbit) - signbit;
63375fd0b74Schristos
63475fd0b74Schristos return value;
63575fd0b74Schristos }
63675fd0b74Schristos #endif /* EXTRACT_SIMM21_A32_5 */
63775fd0b74Schristos
63875fd0b74Schristos #ifndef INSERT_SIMM25_A32_5
63975fd0b74Schristos #define INSERT_SIMM25_A32_5
64075fd0b74Schristos /* mask = 00000111111111002222222222003333
64175fd0b74Schristos insn = 00001sssssssss10SSSSSSSSSSNRtttt. */
642ede78133Schristos static unsigned long long
insert_simm25_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)643ede78133Schristos insert_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
644ede78133Schristos long long int value ATTRIBUTE_UNUSED,
64575fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
64675fd0b74Schristos {
64775fd0b74Schristos if (value & 0x03)
64875fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
64975fd0b74Schristos
65075fd0b74Schristos insn |= ((value >> 2) & 0x01ff) << 18;
65175fd0b74Schristos insn |= ((value >> 11) & 0x03ff) << 6;
65275fd0b74Schristos insn |= ((value >> 21) & 0x000f) << 0;
65375fd0b74Schristos
65475fd0b74Schristos return insn;
65575fd0b74Schristos }
65675fd0b74Schristos #endif /* INSERT_SIMM25_A32_5 */
65775fd0b74Schristos
65875fd0b74Schristos #ifndef EXTRACT_SIMM25_A32_5
65975fd0b74Schristos #define EXTRACT_SIMM25_A32_5
66075fd0b74Schristos /* mask = 00000111111111002222222222003333. */
661ede78133Schristos static long long int
extract_simm25_a32_5(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)662ede78133Schristos extract_simm25_a32_5 (unsigned long long insn ATTRIBUTE_UNUSED,
663*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
66475fd0b74Schristos {
66575fd0b74Schristos int value = 0;
66675fd0b74Schristos
66775fd0b74Schristos value |= ((insn >> 18) & 0x01ff) << 2;
66875fd0b74Schristos value |= ((insn >> 6) & 0x03ff) << 11;
66975fd0b74Schristos value |= ((insn >> 0) & 0x000f) << 21;
67075fd0b74Schristos
67175fd0b74Schristos /* Extend the sign. */
67275fd0b74Schristos int signbit = 1 << (25 - 1);
67375fd0b74Schristos value = (value ^ signbit) - signbit;
67475fd0b74Schristos
67575fd0b74Schristos return value;
67675fd0b74Schristos }
67775fd0b74Schristos #endif /* EXTRACT_SIMM25_A32_5 */
67875fd0b74Schristos
67975fd0b74Schristos #ifndef INSERT_SIMM13_A32_5_S
68075fd0b74Schristos #define INSERT_SIMM13_A32_5_S
68175fd0b74Schristos /* mask = 0000011111111111
68275fd0b74Schristos insn = 11111sssssssssss. */
683ede78133Schristos static unsigned long long
insert_simm13_a32_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)684ede78133Schristos insert_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
685ede78133Schristos long long int value ATTRIBUTE_UNUSED,
68675fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
68775fd0b74Schristos {
68875fd0b74Schristos if (value & 0x03)
68975fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
69075fd0b74Schristos
69175fd0b74Schristos insn |= ((value >> 2) & 0x07ff) << 0;
69275fd0b74Schristos
69375fd0b74Schristos return insn;
69475fd0b74Schristos }
69575fd0b74Schristos #endif /* INSERT_SIMM13_A32_5_S */
69675fd0b74Schristos
69775fd0b74Schristos #ifndef EXTRACT_SIMM13_A32_5_S
69875fd0b74Schristos #define EXTRACT_SIMM13_A32_5_S
69975fd0b74Schristos /* mask = 0000011111111111. */
700ede78133Schristos static long long int
extract_simm13_a32_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)701ede78133Schristos extract_simm13_a32_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
702*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
70375fd0b74Schristos {
70475fd0b74Schristos int value = 0;
70575fd0b74Schristos
70675fd0b74Schristos value |= ((insn >> 0) & 0x07ff) << 2;
70775fd0b74Schristos
70875fd0b74Schristos /* Extend the sign. */
70975fd0b74Schristos int signbit = 1 << (13 - 1);
71075fd0b74Schristos value = (value ^ signbit) - signbit;
71175fd0b74Schristos
71275fd0b74Schristos return value;
71375fd0b74Schristos }
71475fd0b74Schristos #endif /* EXTRACT_SIMM13_A32_5_S */
71575fd0b74Schristos
71675fd0b74Schristos #ifndef INSERT_SIMM8_A16_9_S
71775fd0b74Schristos #define INSERT_SIMM8_A16_9_S
71875fd0b74Schristos /* mask = 0000000001111111
71975fd0b74Schristos insn = 11101bbb1sssssss. */
720ede78133Schristos static unsigned long long
insert_simm8_a16_9_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)721ede78133Schristos insert_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
722ede78133Schristos long long int value ATTRIBUTE_UNUSED,
72375fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
72475fd0b74Schristos {
72575fd0b74Schristos if (value & 0x01)
72675fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
72775fd0b74Schristos
72875fd0b74Schristos insn |= ((value >> 1) & 0x007f) << 0;
72975fd0b74Schristos
73075fd0b74Schristos return insn;
73175fd0b74Schristos }
73275fd0b74Schristos #endif /* INSERT_SIMM8_A16_9_S */
73375fd0b74Schristos
73475fd0b74Schristos #ifndef EXTRACT_SIMM8_A16_9_S
73575fd0b74Schristos #define EXTRACT_SIMM8_A16_9_S
73675fd0b74Schristos /* mask = 0000000001111111. */
737ede78133Schristos static long long int
extract_simm8_a16_9_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)738ede78133Schristos extract_simm8_a16_9_s (unsigned long long insn ATTRIBUTE_UNUSED,
739*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
74075fd0b74Schristos {
74175fd0b74Schristos int value = 0;
74275fd0b74Schristos
74375fd0b74Schristos value |= ((insn >> 0) & 0x007f) << 1;
74475fd0b74Schristos
74575fd0b74Schristos /* Extend the sign. */
74675fd0b74Schristos int signbit = 1 << (8 - 1);
74775fd0b74Schristos value = (value ^ signbit) - signbit;
74875fd0b74Schristos
74975fd0b74Schristos return value;
75075fd0b74Schristos }
75175fd0b74Schristos #endif /* EXTRACT_SIMM8_A16_9_S */
75275fd0b74Schristos
75375fd0b74Schristos #ifndef INSERT_UIMM3_23
75475fd0b74Schristos #define INSERT_UIMM3_23
75575fd0b74Schristos /* mask = 00000000000000000000000111000000
75675fd0b74Schristos insn = 00100011011011110001RRRuuu111111. */
757ede78133Schristos static unsigned long long
insert_uimm3_23(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)758ede78133Schristos insert_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED,
759ede78133Schristos long long int value ATTRIBUTE_UNUSED,
76075fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
76175fd0b74Schristos {
76275fd0b74Schristos
76375fd0b74Schristos insn |= ((value >> 0) & 0x0007) << 6;
76475fd0b74Schristos
76575fd0b74Schristos return insn;
76675fd0b74Schristos }
76775fd0b74Schristos #endif /* INSERT_UIMM3_23 */
76875fd0b74Schristos
76975fd0b74Schristos #ifndef EXTRACT_UIMM3_23
77075fd0b74Schristos #define EXTRACT_UIMM3_23
77175fd0b74Schristos /* mask = 00000000000000000000000111000000. */
772ede78133Schristos static long long int
extract_uimm3_23(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)773ede78133Schristos extract_uimm3_23 (unsigned long long insn ATTRIBUTE_UNUSED,
774*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
77575fd0b74Schristos {
77675fd0b74Schristos unsigned value = 0;
77775fd0b74Schristos
77875fd0b74Schristos value |= ((insn >> 6) & 0x0007) << 0;
77975fd0b74Schristos
78075fd0b74Schristos return value;
78175fd0b74Schristos }
78275fd0b74Schristos #endif /* EXTRACT_UIMM3_23 */
78375fd0b74Schristos
78475fd0b74Schristos #ifndef INSERT_UIMM10_6_S
78575fd0b74Schristos #define INSERT_UIMM10_6_S
78675fd0b74Schristos /* mask = 0000001111111111
78775fd0b74Schristos insn = 010111uuuuuuuuuu. */
788ede78133Schristos static unsigned long long
insert_uimm10_6_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)789ede78133Schristos insert_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED,
790ede78133Schristos long long int value ATTRIBUTE_UNUSED,
79175fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
79275fd0b74Schristos {
79375fd0b74Schristos
79475fd0b74Schristos insn |= ((value >> 0) & 0x03ff) << 0;
79575fd0b74Schristos
79675fd0b74Schristos return insn;
79775fd0b74Schristos }
79875fd0b74Schristos #endif /* INSERT_UIMM10_6_S */
79975fd0b74Schristos
80075fd0b74Schristos #ifndef EXTRACT_UIMM10_6_S
80175fd0b74Schristos #define EXTRACT_UIMM10_6_S
80275fd0b74Schristos /* mask = 0000001111111111. */
803ede78133Schristos static long long int
extract_uimm10_6_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)804ede78133Schristos extract_uimm10_6_s (unsigned long long insn ATTRIBUTE_UNUSED,
805*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
80675fd0b74Schristos {
80775fd0b74Schristos unsigned value = 0;
80875fd0b74Schristos
80975fd0b74Schristos value |= ((insn >> 0) & 0x03ff) << 0;
81075fd0b74Schristos
81175fd0b74Schristos return value;
81275fd0b74Schristos }
81375fd0b74Schristos #endif /* EXTRACT_UIMM10_6_S */
81475fd0b74Schristos
81575fd0b74Schristos #ifndef INSERT_UIMM6_11_S
81675fd0b74Schristos #define INSERT_UIMM6_11_S
81775fd0b74Schristos /* mask = 0000002200011110
81875fd0b74Schristos insn = 110000UU111uuuu0. */
819ede78133Schristos static unsigned long long
insert_uimm6_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)820ede78133Schristos insert_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
821ede78133Schristos long long int value ATTRIBUTE_UNUSED,
82275fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
82375fd0b74Schristos {
82475fd0b74Schristos
82575fd0b74Schristos insn |= ((value >> 0) & 0x000f) << 1;
82675fd0b74Schristos insn |= ((value >> 4) & 0x0003) << 8;
82775fd0b74Schristos
82875fd0b74Schristos return insn;
82975fd0b74Schristos }
83075fd0b74Schristos #endif /* INSERT_UIMM6_11_S */
83175fd0b74Schristos
83275fd0b74Schristos #ifndef EXTRACT_UIMM6_11_S
83375fd0b74Schristos #define EXTRACT_UIMM6_11_S
83475fd0b74Schristos /* mask = 0000002200011110. */
835ede78133Schristos static long long int
extract_uimm6_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)836ede78133Schristos extract_uimm6_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
837*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
83875fd0b74Schristos {
83975fd0b74Schristos unsigned value = 0;
84075fd0b74Schristos
84175fd0b74Schristos value |= ((insn >> 1) & 0x000f) << 0;
84275fd0b74Schristos value |= ((insn >> 8) & 0x0003) << 4;
84375fd0b74Schristos
84475fd0b74Schristos return value;
84575fd0b74Schristos }
84675fd0b74Schristos #endif /* EXTRACT_UIMM6_11_S */
84775fd0b74Schristos
84875fd0b74Schristos #ifndef INSERT_SIMM9_8
84975fd0b74Schristos #define INSERT_SIMM9_8
85075fd0b74Schristos /* mask = 00000000111111112000000000000000
85175fd0b74Schristos insn = 00010bbbssssssssSBBBDaaZZXAAAAAA. */
852ede78133Schristos static unsigned long long
insert_simm9_8(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)853ede78133Schristos insert_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED,
854ede78133Schristos long long int value ATTRIBUTE_UNUSED,
85575fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
85675fd0b74Schristos {
85775fd0b74Schristos
85875fd0b74Schristos insn |= ((value >> 0) & 0x00ff) << 16;
85975fd0b74Schristos insn |= ((value >> 8) & 0x0001) << 15;
86075fd0b74Schristos
86175fd0b74Schristos return insn;
86275fd0b74Schristos }
86375fd0b74Schristos #endif /* INSERT_SIMM9_8 */
86475fd0b74Schristos
86575fd0b74Schristos #ifndef EXTRACT_SIMM9_8
86675fd0b74Schristos #define EXTRACT_SIMM9_8
86775fd0b74Schristos /* mask = 00000000111111112000000000000000. */
868ede78133Schristos static long long int
extract_simm9_8(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)869ede78133Schristos extract_simm9_8 (unsigned long long insn ATTRIBUTE_UNUSED,
870*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
87175fd0b74Schristos {
87275fd0b74Schristos int value = 0;
87375fd0b74Schristos
87475fd0b74Schristos value |= ((insn >> 16) & 0x00ff) << 0;
87575fd0b74Schristos value |= ((insn >> 15) & 0x0001) << 8;
87675fd0b74Schristos
87775fd0b74Schristos /* Extend the sign. */
87875fd0b74Schristos int signbit = 1 << (9 - 1);
87975fd0b74Schristos value = (value ^ signbit) - signbit;
88075fd0b74Schristos
88175fd0b74Schristos return value;
88275fd0b74Schristos }
88375fd0b74Schristos #endif /* EXTRACT_SIMM9_8 */
88475fd0b74Schristos
88575fd0b74Schristos #ifndef INSERT_UIMM10_A32_8_S
88675fd0b74Schristos #define INSERT_UIMM10_A32_8_S
88775fd0b74Schristos /* mask = 0000000011111111
88875fd0b74Schristos insn = 11010bbbuuuuuuuu. */
889ede78133Schristos static unsigned long long
insert_uimm10_a32_8_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)890ede78133Schristos insert_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
891ede78133Schristos long long int value ATTRIBUTE_UNUSED,
89275fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
89375fd0b74Schristos {
89475fd0b74Schristos if (value & 0x03)
89575fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
89675fd0b74Schristos
89775fd0b74Schristos insn |= ((value >> 2) & 0x00ff) << 0;
89875fd0b74Schristos
89975fd0b74Schristos return insn;
90075fd0b74Schristos }
90175fd0b74Schristos #endif /* INSERT_UIMM10_A32_8_S */
90275fd0b74Schristos
90375fd0b74Schristos #ifndef EXTRACT_UIMM10_A32_8_S
90475fd0b74Schristos #define EXTRACT_UIMM10_A32_8_S
90575fd0b74Schristos /* mask = 0000000011111111. */
906ede78133Schristos static long long int
extract_uimm10_a32_8_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)907ede78133Schristos extract_uimm10_a32_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
908*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
90975fd0b74Schristos {
91075fd0b74Schristos unsigned value = 0;
91175fd0b74Schristos
91275fd0b74Schristos value |= ((insn >> 0) & 0x00ff) << 2;
91375fd0b74Schristos
91475fd0b74Schristos return value;
91575fd0b74Schristos }
91675fd0b74Schristos #endif /* EXTRACT_UIMM10_A32_8_S */
91775fd0b74Schristos
91875fd0b74Schristos #ifndef INSERT_SIMM9_7_S
91975fd0b74Schristos #define INSERT_SIMM9_7_S
92075fd0b74Schristos /* mask = 0000000111111111
92175fd0b74Schristos insn = 1100101sssssssss. */
922ede78133Schristos static unsigned long long
insert_simm9_7_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)923ede78133Schristos insert_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
924ede78133Schristos long long int value ATTRIBUTE_UNUSED,
92575fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
92675fd0b74Schristos {
92775fd0b74Schristos
92875fd0b74Schristos insn |= ((value >> 0) & 0x01ff) << 0;
92975fd0b74Schristos
93075fd0b74Schristos return insn;
93175fd0b74Schristos }
93275fd0b74Schristos #endif /* INSERT_SIMM9_7_S */
93375fd0b74Schristos
93475fd0b74Schristos #ifndef EXTRACT_SIMM9_7_S
93575fd0b74Schristos #define EXTRACT_SIMM9_7_S
93675fd0b74Schristos /* mask = 0000000111111111. */
937ede78133Schristos static long long int
extract_simm9_7_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)938ede78133Schristos extract_simm9_7_s (unsigned long long insn ATTRIBUTE_UNUSED,
939*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
94075fd0b74Schristos {
94175fd0b74Schristos int value = 0;
94275fd0b74Schristos
94375fd0b74Schristos value |= ((insn >> 0) & 0x01ff) << 0;
94475fd0b74Schristos
94575fd0b74Schristos /* Extend the sign. */
94675fd0b74Schristos int signbit = 1 << (9 - 1);
94775fd0b74Schristos value = (value ^ signbit) - signbit;
94875fd0b74Schristos
94975fd0b74Schristos return value;
95075fd0b74Schristos }
95175fd0b74Schristos #endif /* EXTRACT_SIMM9_7_S */
95275fd0b74Schristos
95375fd0b74Schristos #ifndef INSERT_UIMM6_A16_11_S
95475fd0b74Schristos #define INSERT_UIMM6_A16_11_S
95575fd0b74Schristos /* mask = 0000000000011111
95675fd0b74Schristos insn = 10010bbbcccuuuuu. */
957ede78133Schristos static unsigned long long
insert_uimm6_a16_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)958ede78133Schristos insert_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
959ede78133Schristos long long int value ATTRIBUTE_UNUSED,
96075fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
96175fd0b74Schristos {
96275fd0b74Schristos if (value & 0x01)
96375fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
96475fd0b74Schristos
96575fd0b74Schristos insn |= ((value >> 1) & 0x001f) << 0;
96675fd0b74Schristos
96775fd0b74Schristos return insn;
96875fd0b74Schristos }
96975fd0b74Schristos #endif /* INSERT_UIMM6_A16_11_S */
97075fd0b74Schristos
97175fd0b74Schristos #ifndef EXTRACT_UIMM6_A16_11_S
97275fd0b74Schristos #define EXTRACT_UIMM6_A16_11_S
97375fd0b74Schristos /* mask = 0000000000011111. */
974ede78133Schristos static long long int
extract_uimm6_a16_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)975ede78133Schristos extract_uimm6_a16_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
976*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
97775fd0b74Schristos {
97875fd0b74Schristos unsigned value = 0;
97975fd0b74Schristos
98075fd0b74Schristos value |= ((insn >> 0) & 0x001f) << 1;
98175fd0b74Schristos
98275fd0b74Schristos return value;
98375fd0b74Schristos }
98475fd0b74Schristos #endif /* EXTRACT_UIMM6_A16_11_S */
98575fd0b74Schristos
98675fd0b74Schristos #ifndef INSERT_UIMM5_A32_11_S
98775fd0b74Schristos #define INSERT_UIMM5_A32_11_S
98875fd0b74Schristos /* mask = 0000020000011000
98975fd0b74Schristos insn = 01000U00hhhuu1HH. */
990ede78133Schristos static unsigned long long
insert_uimm5_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)991ede78133Schristos insert_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
992ede78133Schristos long long int value ATTRIBUTE_UNUSED,
99375fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
99475fd0b74Schristos {
99575fd0b74Schristos if (value & 0x03)
99675fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
99775fd0b74Schristos
99875fd0b74Schristos insn |= ((value >> 2) & 0x0003) << 3;
99975fd0b74Schristos insn |= ((value >> 4) & 0x0001) << 10;
100075fd0b74Schristos
100175fd0b74Schristos return insn;
100275fd0b74Schristos }
100375fd0b74Schristos #endif /* INSERT_UIMM5_A32_11_S */
100475fd0b74Schristos
100575fd0b74Schristos #ifndef EXTRACT_UIMM5_A32_11_S
100675fd0b74Schristos #define EXTRACT_UIMM5_A32_11_S
100775fd0b74Schristos /* mask = 0000020000011000. */
1008ede78133Schristos static long long int
extract_uimm5_a32_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1009ede78133Schristos extract_uimm5_a32_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
1010*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
101175fd0b74Schristos {
101275fd0b74Schristos unsigned value = 0;
101375fd0b74Schristos
101475fd0b74Schristos value |= ((insn >> 3) & 0x0003) << 2;
101575fd0b74Schristos value |= ((insn >> 10) & 0x0001) << 4;
101675fd0b74Schristos
101775fd0b74Schristos return value;
101875fd0b74Schristos }
101975fd0b74Schristos #endif /* EXTRACT_UIMM5_A32_11_S */
102075fd0b74Schristos
102175fd0b74Schristos #ifndef INSERT_SIMM11_A32_13_S
102275fd0b74Schristos #define INSERT_SIMM11_A32_13_S
102375fd0b74Schristos /* mask = 0000022222200111
102475fd0b74Schristos insn = 01010SSSSSS00sss. */
1025ede78133Schristos static unsigned long long
insert_simm11_a32_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1026ede78133Schristos insert_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1027ede78133Schristos long long int value ATTRIBUTE_UNUSED,
102875fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
102975fd0b74Schristos {
103075fd0b74Schristos if (value & 0x03)
103175fd0b74Schristos *errmsg = _("Target address is not 32bit aligned.");
103275fd0b74Schristos
103375fd0b74Schristos insn |= ((value >> 2) & 0x0007) << 0;
103475fd0b74Schristos insn |= ((value >> 5) & 0x003f) << 5;
103575fd0b74Schristos
103675fd0b74Schristos return insn;
103775fd0b74Schristos }
103875fd0b74Schristos #endif /* INSERT_SIMM11_A32_13_S */
103975fd0b74Schristos
104075fd0b74Schristos #ifndef EXTRACT_SIMM11_A32_13_S
104175fd0b74Schristos #define EXTRACT_SIMM11_A32_13_S
104275fd0b74Schristos /* mask = 0000022222200111. */
1043ede78133Schristos static long long int
extract_simm11_a32_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1044ede78133Schristos extract_simm11_a32_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1045*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
104675fd0b74Schristos {
104775fd0b74Schristos int value = 0;
104875fd0b74Schristos
104975fd0b74Schristos value |= ((insn >> 0) & 0x0007) << 2;
105075fd0b74Schristos value |= ((insn >> 5) & 0x003f) << 5;
105175fd0b74Schristos
105275fd0b74Schristos /* Extend the sign. */
105375fd0b74Schristos int signbit = 1 << (11 - 1);
105475fd0b74Schristos value = (value ^ signbit) - signbit;
105575fd0b74Schristos
105675fd0b74Schristos return value;
105775fd0b74Schristos }
105875fd0b74Schristos #endif /* EXTRACT_SIMM11_A32_13_S */
105975fd0b74Schristos
106075fd0b74Schristos #ifndef INSERT_UIMM7_13_S
106175fd0b74Schristos #define INSERT_UIMM7_13_S
106275fd0b74Schristos /* mask = 0000000022220111
106375fd0b74Schristos insn = 01010bbbUUUU1uuu. */
1064ede78133Schristos static unsigned long long
insert_uimm7_13_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1065ede78133Schristos insert_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1066ede78133Schristos long long int value ATTRIBUTE_UNUSED,
106775fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
106875fd0b74Schristos {
106975fd0b74Schristos
107075fd0b74Schristos insn |= ((value >> 0) & 0x0007) << 0;
107175fd0b74Schristos insn |= ((value >> 3) & 0x000f) << 4;
107275fd0b74Schristos
107375fd0b74Schristos return insn;
107475fd0b74Schristos }
107575fd0b74Schristos #endif /* INSERT_UIMM7_13_S */
107675fd0b74Schristos
107775fd0b74Schristos #ifndef EXTRACT_UIMM7_13_S
107875fd0b74Schristos #define EXTRACT_UIMM7_13_S
107975fd0b74Schristos /* mask = 0000000022220111. */
1080ede78133Schristos static long long int
extract_uimm7_13_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1081ede78133Schristos extract_uimm7_13_s (unsigned long long insn ATTRIBUTE_UNUSED,
1082*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
108375fd0b74Schristos {
108475fd0b74Schristos unsigned value = 0;
108575fd0b74Schristos
108675fd0b74Schristos value |= ((insn >> 0) & 0x0007) << 0;
108775fd0b74Schristos value |= ((insn >> 4) & 0x000f) << 3;
108875fd0b74Schristos
108975fd0b74Schristos return value;
109075fd0b74Schristos }
109175fd0b74Schristos #endif /* EXTRACT_UIMM7_13_S */
109275fd0b74Schristos
109375fd0b74Schristos #ifndef INSERT_UIMM6_A16_21
109475fd0b74Schristos #define INSERT_UIMM6_A16_21
109575fd0b74Schristos /* mask = 00000000000000000000011111000000
109675fd0b74Schristos insn = 00101bbb01001100RBBBRuuuuuAAAAAA. */
1097ede78133Schristos static unsigned long long
insert_uimm6_a16_21(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1098ede78133Schristos insert_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED,
1099ede78133Schristos long long int value ATTRIBUTE_UNUSED,
110075fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
110175fd0b74Schristos {
110275fd0b74Schristos if (value & 0x01)
110375fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
110475fd0b74Schristos
110575fd0b74Schristos insn |= ((value >> 1) & 0x001f) << 6;
110675fd0b74Schristos
110775fd0b74Schristos return insn;
110875fd0b74Schristos }
110975fd0b74Schristos #endif /* INSERT_UIMM6_A16_21 */
111075fd0b74Schristos
111175fd0b74Schristos #ifndef EXTRACT_UIMM6_A16_21
111275fd0b74Schristos #define EXTRACT_UIMM6_A16_21
111375fd0b74Schristos /* mask = 00000000000000000000011111000000. */
1114ede78133Schristos static long long int
extract_uimm6_a16_21(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1115ede78133Schristos extract_uimm6_a16_21 (unsigned long long insn ATTRIBUTE_UNUSED,
1116*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
111775fd0b74Schristos {
111875fd0b74Schristos unsigned value = 0;
111975fd0b74Schristos
112075fd0b74Schristos value |= ((insn >> 6) & 0x001f) << 1;
112175fd0b74Schristos
112275fd0b74Schristos return value;
112375fd0b74Schristos }
112475fd0b74Schristos #endif /* EXTRACT_UIMM6_A16_21 */
112575fd0b74Schristos
112675fd0b74Schristos #ifndef INSERT_UIMM7_11_S
112775fd0b74Schristos #define INSERT_UIMM7_11_S
112875fd0b74Schristos /* mask = 0000022200011110
112975fd0b74Schristos insn = 11000UUU110uuuu0. */
1130ede78133Schristos static unsigned long long
insert_uimm7_11_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1131ede78133Schristos insert_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
1132ede78133Schristos long long int value ATTRIBUTE_UNUSED,
113375fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
113475fd0b74Schristos {
113575fd0b74Schristos
113675fd0b74Schristos insn |= ((value >> 0) & 0x000f) << 1;
113775fd0b74Schristos insn |= ((value >> 4) & 0x0007) << 8;
113875fd0b74Schristos
113975fd0b74Schristos return insn;
114075fd0b74Schristos }
114175fd0b74Schristos #endif /* INSERT_UIMM7_11_S */
114275fd0b74Schristos
114375fd0b74Schristos #ifndef EXTRACT_UIMM7_11_S
114475fd0b74Schristos #define EXTRACT_UIMM7_11_S
114575fd0b74Schristos /* mask = 0000022200011110. */
1146ede78133Schristos static long long int
extract_uimm7_11_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1147ede78133Schristos extract_uimm7_11_s (unsigned long long insn ATTRIBUTE_UNUSED,
1148*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
114975fd0b74Schristos {
115075fd0b74Schristos unsigned value = 0;
115175fd0b74Schristos
115275fd0b74Schristos value |= ((insn >> 1) & 0x000f) << 0;
115375fd0b74Schristos value |= ((insn >> 8) & 0x0007) << 4;
115475fd0b74Schristos
115575fd0b74Schristos return value;
115675fd0b74Schristos }
115775fd0b74Schristos #endif /* EXTRACT_UIMM7_11_S */
115875fd0b74Schristos
115975fd0b74Schristos #ifndef INSERT_UIMM7_A16_20
116075fd0b74Schristos #define INSERT_UIMM7_A16_20
116175fd0b74Schristos /* mask = 00000000000000000000111111000000
116275fd0b74Schristos insn = 00100RRR111010000RRRuuuuuu1QQQQQ. */
1163ede78133Schristos static unsigned long long
insert_uimm7_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1164ede78133Schristos insert_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1165ede78133Schristos long long int value ATTRIBUTE_UNUSED,
116675fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
116775fd0b74Schristos {
116875fd0b74Schristos if (value & 0x01)
116975fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
117075fd0b74Schristos
117175fd0b74Schristos insn |= ((value >> 1) & 0x003f) << 6;
117275fd0b74Schristos
117375fd0b74Schristos return insn;
117475fd0b74Schristos }
117575fd0b74Schristos #endif /* INSERT_UIMM7_A16_20 */
117675fd0b74Schristos
117775fd0b74Schristos #ifndef EXTRACT_UIMM7_A16_20
117875fd0b74Schristos #define EXTRACT_UIMM7_A16_20
117975fd0b74Schristos /* mask = 00000000000000000000111111000000. */
1180ede78133Schristos static long long int
extract_uimm7_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1181ede78133Schristos extract_uimm7_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1182*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
118375fd0b74Schristos {
118475fd0b74Schristos unsigned value = 0;
118575fd0b74Schristos
118675fd0b74Schristos value |= ((insn >> 6) & 0x003f) << 1;
118775fd0b74Schristos
118875fd0b74Schristos return value;
118975fd0b74Schristos }
119075fd0b74Schristos #endif /* EXTRACT_UIMM7_A16_20 */
119175fd0b74Schristos
119275fd0b74Schristos #ifndef INSERT_SIMM13_A16_20
119375fd0b74Schristos #define INSERT_SIMM13_A16_20
119475fd0b74Schristos /* mask = 00000000000000000000111111222222
119575fd0b74Schristos insn = 00100RRR101010000RRRssssssSSSSSS. */
1196ede78133Schristos static unsigned long long
insert_simm13_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1197ede78133Schristos insert_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1198ede78133Schristos long long int value ATTRIBUTE_UNUSED,
119975fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
120075fd0b74Schristos {
120175fd0b74Schristos if (value & 0x01)
120275fd0b74Schristos *errmsg = _("Target address is not 16bit aligned.");
120375fd0b74Schristos
120475fd0b74Schristos insn |= ((value >> 1) & 0x003f) << 6;
120575fd0b74Schristos insn |= ((value >> 7) & 0x003f) << 0;
120675fd0b74Schristos
120775fd0b74Schristos return insn;
120875fd0b74Schristos }
120975fd0b74Schristos #endif /* INSERT_SIMM13_A16_20 */
121075fd0b74Schristos
121175fd0b74Schristos #ifndef EXTRACT_SIMM13_A16_20
121275fd0b74Schristos #define EXTRACT_SIMM13_A16_20
121375fd0b74Schristos /* mask = 00000000000000000000111111222222. */
1214ede78133Schristos static long long int
extract_simm13_a16_20(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1215ede78133Schristos extract_simm13_a16_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1216*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
121775fd0b74Schristos {
121875fd0b74Schristos int value = 0;
121975fd0b74Schristos
122075fd0b74Schristos value |= ((insn >> 6) & 0x003f) << 1;
122175fd0b74Schristos value |= ((insn >> 0) & 0x003f) << 7;
122275fd0b74Schristos
122375fd0b74Schristos /* Extend the sign. */
122475fd0b74Schristos int signbit = 1 << (13 - 1);
122575fd0b74Schristos value = (value ^ signbit) - signbit;
122675fd0b74Schristos
122775fd0b74Schristos return value;
122875fd0b74Schristos }
122975fd0b74Schristos #endif /* EXTRACT_SIMM13_A16_20 */
123075fd0b74Schristos
123175fd0b74Schristos #ifndef INSERT_UIMM8_8_S
123275fd0b74Schristos #define INSERT_UIMM8_8_S
123375fd0b74Schristos /* mask = 0000000011111111
123475fd0b74Schristos insn = 11011bbbuuuuuuuu. */
1235ede78133Schristos static unsigned long long
insert_uimm8_8_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1236ede78133Schristos insert_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
1237ede78133Schristos long long int value ATTRIBUTE_UNUSED,
123875fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
123975fd0b74Schristos {
124075fd0b74Schristos
124175fd0b74Schristos insn |= ((value >> 0) & 0x00ff) << 0;
124275fd0b74Schristos
124375fd0b74Schristos return insn;
124475fd0b74Schristos }
124575fd0b74Schristos #endif /* INSERT_UIMM8_8_S */
124675fd0b74Schristos
124775fd0b74Schristos #ifndef EXTRACT_UIMM8_8_S
124875fd0b74Schristos #define EXTRACT_UIMM8_8_S
124975fd0b74Schristos /* mask = 0000000011111111. */
1250ede78133Schristos static long long int
extract_uimm8_8_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1251ede78133Schristos extract_uimm8_8_s (unsigned long long insn ATTRIBUTE_UNUSED,
1252*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
125375fd0b74Schristos {
125475fd0b74Schristos unsigned value = 0;
125575fd0b74Schristos
125675fd0b74Schristos value |= ((insn >> 0) & 0x00ff) << 0;
125775fd0b74Schristos
125875fd0b74Schristos return value;
125975fd0b74Schristos }
126075fd0b74Schristos #endif /* EXTRACT_UIMM8_8_S */
126175fd0b74Schristos
126275fd0b74Schristos #ifndef INSERT_UIMM6_5_S
126375fd0b74Schristos #define INSERT_UIMM6_5_S
126475fd0b74Schristos /* mask = 0000011111100000
126575fd0b74Schristos insn = 01111uuuuuu11111. */
1266ede78133Schristos static unsigned long long
insert_uimm6_5_s(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1267ede78133Schristos insert_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
1268ede78133Schristos long long int value ATTRIBUTE_UNUSED,
126975fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
127075fd0b74Schristos {
127175fd0b74Schristos
127275fd0b74Schristos insn |= ((value >> 0) & 0x003f) << 5;
127375fd0b74Schristos
127475fd0b74Schristos return insn;
127575fd0b74Schristos }
127675fd0b74Schristos #endif /* INSERT_UIMM6_5_S */
127775fd0b74Schristos
127875fd0b74Schristos #ifndef EXTRACT_UIMM6_5_S
127975fd0b74Schristos #define EXTRACT_UIMM6_5_S
128075fd0b74Schristos /* mask = 0000011111100000. */
1281ede78133Schristos static long long int
extract_uimm6_5_s(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1282ede78133Schristos extract_uimm6_5_s (unsigned long long insn ATTRIBUTE_UNUSED,
1283*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
128475fd0b74Schristos {
128575fd0b74Schristos unsigned value = 0;
128675fd0b74Schristos
128775fd0b74Schristos value |= ((insn >> 5) & 0x003f) << 0;
128875fd0b74Schristos
128975fd0b74Schristos return value;
129075fd0b74Schristos }
129175fd0b74Schristos #endif /* EXTRACT_UIMM6_5_S */
129275fd0b74Schristos
129375fd0b74Schristos #ifndef INSERT_UIMM6_AXX_
129475fd0b74Schristos #define INSERT_UIMM6_AXX_
129575fd0b74Schristos /* mask = 00000000000000000000000000000000
129675fd0b74Schristos insn = 00110bbb11100001100001100001QQQQ. */
129775fd0b74Schristos static ATTRIBUTE_UNUSED unsigned
insert_uimm6_axx_(unsigned long long insn ATTRIBUTE_UNUSED,long long int value ATTRIBUTE_UNUSED,const char ** errmsg ATTRIBUTE_UNUSED)1298ede78133Schristos insert_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED,
1299ede78133Schristos long long int value ATTRIBUTE_UNUSED,
130075fd0b74Schristos const char **errmsg ATTRIBUTE_UNUSED)
130175fd0b74Schristos {
130275fd0b74Schristos if (value & 0x3f)
130375fd0b74Schristos *errmsg = _("Target address is not 512bit aligned.");
130475fd0b74Schristos
130575fd0b74Schristos return insn;
130675fd0b74Schristos }
130775fd0b74Schristos #endif /* INSERT_UIMM6_AXX_ */
130875fd0b74Schristos
130975fd0b74Schristos #ifndef EXTRACT_UIMM6_AXX_
131075fd0b74Schristos #define EXTRACT_UIMM6_AXX_
131175fd0b74Schristos /* mask = 00000000000000000000000000000000. */
131275fd0b74Schristos static ATTRIBUTE_UNUSED int
extract_uimm6_axx_(unsigned long long insn ATTRIBUTE_UNUSED,bool * invalid ATTRIBUTE_UNUSED)1313ede78133Schristos extract_uimm6_axx_ (unsigned long long insn ATTRIBUTE_UNUSED,
1314*e992f068Schristos bool *invalid ATTRIBUTE_UNUSED)
131575fd0b74Schristos {
131675fd0b74Schristos unsigned value = 0;
131775fd0b74Schristos
131875fd0b74Schristos return value;
131975fd0b74Schristos }
132075fd0b74Schristos #endif /* EXTRACT_UIMM6_AXX_ */
1321