]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - include/opcode/ft32.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / include / opcode / ft32.h
1 /* Definitions for decoding the ft32 opcode table.
2 Copyright (C) 2013-2021 Free Software Foundation, Inc.
3 Contributed by FTDI (support@ftdichip.com)
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
18 02110-1301, USA. */
19
20 typedef struct ft32_opc_info_t
21 {
22 const char *name;
23 int dw;
24 unsigned int mask;
25 unsigned int bits;
26 int fields;
27 } ft32_opc_info_t;
28
29 #define FT32_PAT_ALUOP 0x08
30 #define FT32_PAT_LDA 0x18
31 #define FT32_PAT_TOCI 0x01
32 #define FT32_PAT_CMPOP 0x0b
33 #define FT32_PAT_STA 0x17
34 #define FT32_PAT_EXA 0x07
35 #define FT32_PAT_LDK 0x0c
36 #define FT32_PAT_FFUOP 0x1e
37 #define FT32_PAT_LDI 0x15
38 #define FT32_PAT_STI 0x16
39 #define FT32_PAT_EXI 0x1d
40 #define FT32_PAT_POP 0x11
41 #define FT32_PAT_LPM 0x0d
42 #define FT32_PAT_LINK 0x12
43 #define FT32_PAT_TOC 0x00
44 #define FT32_PAT_PUSH 0x10
45 #define FT32_PAT_RETURN 0x14
46 #define FT32_PAT_UNLINK 0x13
47 #define FT32_PAT_LPMI 0x19
48
49 #define FT32_FLD_CBCRCV (1 << 0)
50 #define FT32_FLD_INT (1 << 1)
51 #define FT32_FLD_INT_BIT 26
52 #define FT32_FLD_INT_SIZ 1
53 #define FT32_FLD_DW (1 << 2)
54 #define FT32_FLD_DW_BIT 25
55 #define FT32_FLD_DW_SIZ 2
56 #define FT32_FLD_CB (1 << 3)
57 #define FT32_FLD_CB_BIT 22
58 #define FT32_FLD_CB_SIZ 5
59 #define FT32_FLD_R_D (1 << 4)
60 #define FT32_FLD_R_D_BIT 20
61 #define FT32_FLD_R_D_SIZ 5
62 #define FT32_FLD_CR (1 << 5)
63 #define FT32_FLD_CR_BIT 20
64 #define FT32_FLD_CR_SIZ 2
65 #define FT32_FLD_CV (1 << 6)
66 #define FT32_FLD_CV_BIT 19
67 #define FT32_FLD_CV_SIZ 1
68 #define FT32_FLD_BT (1 << 7)
69 #define FT32_FLD_BT_BIT 18
70 #define FT32_FLD_BT_SIZ 1
71 #define FT32_FLD_R_1 (1 << 8)
72 #define FT32_FLD_R_1_BIT 15
73 #define FT32_FLD_R_1_SIZ 5
74 #define FT32_FLD_RIMM (1 << 9)
75 #define FT32_FLD_RIMM_BIT 4
76 #define FT32_FLD_RIMM_SIZ 11
77 #define FT32_FLD_R_2 (1 << 10)
78 #define FT32_FLD_R_2_BIT 4
79 #define FT32_FLD_R_2_SIZ 5
80 #define FT32_FLD_K20 (1 << 11)
81 #define FT32_FLD_K20_BIT 0
82 #define FT32_FLD_K20_SIZ 20
83 #define FT32_FLD_PA (1 << 12)
84 #define FT32_FLD_PA_BIT 0
85 #define FT32_FLD_PA_SIZ 18
86 #define FT32_FLD_AA (1 << 13)
87 #define FT32_FLD_AA_BIT 0
88 #define FT32_FLD_AA_SIZ 17
89 #define FT32_FLD_K16 (1 << 14)
90 #define FT32_FLD_K16_BIT 0
91 #define FT32_FLD_K16_SIZ 16
92 #define FT32_FLD_K15 (1 << 15)
93 #define FT32_FLD_K15_BIT 0
94 #define FT32_FLD_K15_SIZ 15
95 #define FT32_FLD_AL (1 << 16)
96 #define FT32_FLD_AL_BIT 0
97 #define FT32_FLD_AL_SIZ 4
98
99 #define FT32_IS_CALL(inst) (((inst) & 0xfffc0000) == 0x00340000)
100 #define FT32_IS_PUSH(inst) (((inst) & 0xfff00000) == 0x84000000)
101 #define FT32_PUSH_REG(inst) (((inst) >> 15) & 0x1f)
102 #define FT32_IS_LINK(inst) (((inst) & 0xffff0000) == 0x95d00000)
103 #define FT32_LINK_SIZE(inst) ((inst) & 0xffff)
104
105 #define FT32_FLD_R_D_POST (1 << 17)
106 #define FT32_FLD_R_1_POST (1 << 18)
107
108 static const unsigned int sc_form_0[] = {
109 0x44000000, 0x44000002, 0x44000004, 0x44000005, 0x4400000b,
110 0x44000010, 0x44000012, 0x44000014, 0x44000015, 0x44000018,
111 0x4400001b, 0x44000020, 0x44000022, 0x44000024, 0x44000025,
112 0x4400002b, 0x44000030, 0x44000032, 0x44000034, 0x44000035,
113 0x4400003b, 0x44000040, 0x44000042, 0x44000044, 0x44000045,
114 0x4400004b, 0x44000050, 0x44000060, 0x44000062, 0x44000065,
115 0x44000070, 0x44000072, 0x44000075, 0x44000080, 0x44000082,
116 0x44000090, 0x44000092, 0x440000a0, 0x440000a2, 0x440000b0,
117 0x440000d0, 0x440000d2, 0x440000d5, 0x440000e0, 0x440000e2,
118 0x440000f0, 0x440000f2, 0x440000f5, 0x44000100, 0x44000102,
119 0x44000110, 0x44000120, 0x44000122, 0x44000130, 0x44000140,
120 0x44000170, 0x44000180, 0x44000190, 0x440001a0, 0x440001b0,
121 0x440001e0, 0x440001f0, 0x44004000, 0x44004003, 0x4400400c,
122 0x4400400d, 0x44004010, 0x44004011, 0x44004013, 0x44004014,
123 0x44004016, 0x44004019, 0x4400401a, 0x44004020, 0x44004021,
124 0x44004028, 0x4400402a, 0x44004034, 0x44004038, 0x44004039,
125 0x44004040, 0x44004048, 0x44004058, 0x44004064, 0x44004074,
126 0x44004080, 0x44004081, 0x44004088, 0x44004089, 0x44004098,
127 0x440040c0, 0x440040ca, 0x440040f4, 0x44004100, 0x44004108,
128 0x44004109, 0x4400410a, 0x4400410b, 0x44004180, 0x44004182,
129 0x440041c0, 0x440041c2, 0x440041f4, 0x44004200, 0x44004202,
130 0x4400420b, 0x4400421b, 0x4400422b, 0x44004240, 0x44004242,
131 0x4400424b, 0x4400425b, 0x4400426b, 0x4400427b, 0x44004280,
132 0x44004282, 0x440042ab, 0x440042bb, 0x440042c0, 0x440042c2,
133 0x44004300, 0x44004340, 0x440043c3, 0x4400440b, 0x44004543,
134 0x44004553, 0x440047f4, 0x44004800, 0x44004980, 0x44004a0b,
135 0x44004a80, 0x44004dc0, 0x44004ff4, 0x44005003, 0x44005353,
136 0x4400537b, 0x440053e3, 0x44005700, 0x4400594b, 0x4400620b,
137 0x4400621b, 0x4400622b, 0x4400623b, 0x4400624b, 0x4400625b,
138 0x4400626b, 0x4400627b, 0x4400628b, 0x4400629b, 0x440062bb,
139 0x440062fb, 0x4400633b, 0x4400637b, 0x44006383, 0x44007f00,
140 0x44007f80, 0x44007fc0, 0x44007fe0, 0x44007ff0, 0x44007ff3, 0x44007ff6
141 };
142 static const unsigned int sc_form_1[] = {
143 0x44000002, 0x44008002, 0x44010002, 0x44010008, 0x44018002,
144 0x44020002, 0x44030002, 0x44038002
145 };
146 static const unsigned int sc_form_2[] = {
147 0x59e04002, 0x59e04012, 0x59e04022, 0x59e04032, 0x59e04042,
148 0x59e04052, 0x59e04072, 0x59e04082, 0x59e07ff2, 0x5de00002,
149 0x5de00012, 0x5de00022, 0x5de00032, 0x5de00042, 0x5de00052,
150 0x5de00062, 0x5de00072, 0x5de00082, 0x5de000a2, 0x5de000d2,
151 0x5de000e2, 0x5de000f2, 0x5de00102, 0x5de00112, 0x5de00122,
152 0x5de00132, 0x5de00172, 0x5de04002, 0x5de04012, 0x5de04022,
153 0x5de04032, 0x5de04042, 0x5de04052, 0x5de04062, 0x5de04072,
154 0x5de04082, 0x5de04092, 0x5de040f2, 0x5de04102, 0x5de04112,
155 0x5de04142, 0x5de04162, 0x5de041b2, 0x5de041f2, 0x5de04202,
156 0x5de0420c, 0x5de0421c, 0x5de0422c, 0x5de0423c, 0x5de04242,
157 0x5de0424c, 0x5de0425c, 0x5de0426c, 0x5de0427c, 0x5de0428c,
158 0x5de0429c, 0x5de042ac, 0x5de042cc, 0x5de042dc, 0x5de042ec,
159 0x5de042fc, 0x5de0430c, 0x5de0431c, 0x5de0433c, 0x5de0436c,
160 0x5de0437c, 0x5de04382, 0x5de043ac, 0x5de043bc, 0x5de043cc,
161 0x5de043dc, 0x5de04ff2, 0x5de07ff2, 0x84000000
162 };
163 static const unsigned int sc_form_3[] = {
164 0x44000010, 0x44000024, 0x44000025, 0x44000030, 0x44000034,
165 0x44004000, 0x4400400c, 0x4400400d, 0x44004010, 0x44004014,
166 0x44004028, 0x44004038, 0x44004040, 0x440040ca, 0x44004109,
167 0x44004880, 0x44004ac0, 0x44004e00, 0x44004e80, 0x44004ff4,
168 0x4400500c, 0x44005200, 0x44005680, 0x44005700, 0x4400620b,
169 0x44007f80, 0x44008020, 0x44008024, 0x4400c000, 0x4400c00c,
170 0x4400c00d, 0x4400c010, 0x4400c028, 0x4400c038, 0x4400c1f9,
171 0x4400cff4, 0x4400d00c, 0x4400d173, 0x4400ff80, 0x4400fff0,
172 0x44010030, 0x44014000, 0x4401400c, 0x4401400d, 0x44014010,
173 0x44014028, 0x44014074, 0x44014080, 0x440143f3, 0x44014ff4,
174 0x4401500c, 0x44015743, 0x44017ff0, 0x44018030, 0x4401c000,
175 0x4401c00c, 0x4401c010, 0x4401cff4, 0x4401d00c, 0x44020100,
176 0x44024000, 0x44024014, 0x44027f80, 0x4402c000, 0x44030085,
177 0x44034000, 0x44034109, 0x4403c000, 0x44044000, 0x44044109,
178 0x4404410b, 0x4404c000, 0x440680e0, 0x4406c000, 0x4406c040,
179 0x4406c080, 0x4406c0c0, 0x4406c300, 0x4406c3c0, 0x4406c900,
180 0x4406cac0, 0x4406cb40, 0x4406cbc0, 0x4406ce80, 0x4406d5c0,
181 0x4406d680, 0x4406d700, 0x4406d740, 0x4406d780, 0x4406dfc0,
182 0x44074000, 0x44074010, 0x44074e80, 0x4407c000, 0x4407c00d,
183 0x4407c074, 0x44084000, 0x4408c000, 0x44094000, 0x4409c000,
184 0x440a4000, 0x440ac000, 0x440b4000, 0x440bc000, 0x440c4000,
185 0x440c4040, 0x440cc000, 0x440d4000, 0x440dc000, 0x440ef340,
186 0x440ef400, 0x440ef440, 0x440ef4c0, 0x440ef540, 0x440ef5c0,
187 0x440ef6b0, 0x440ef700, 0x440ef780, 0x440ef8c0, 0x440f420d,
188 0x440f421d, 0x440f426d, 0x440fc180, 0x440fc1a0, 0x440fc1b0,
189 0x440fc1c0, 0x440fc200, 0x440fc240, 0x440fc280, 0x440fc380,
190 0x440fc840, 0x440fc8c0, 0x440fc900, 0x440fc980, 0x440fcd80,
191 0x64000000, 0x64000001, 0x64000002, 0x64000003, 0x64000004,
192 0x64000005, 0x64000006, 0x64000007, 0x64000008, 0x64000009,
193 0x6400000a, 0x6400000b, 0x6400000c, 0x6400000d, 0x6400000e,
194 0x6400000f, 0x64000010, 0x64000011, 0x64000012, 0x64000013,
195 0x64000014, 0x64000015, 0x64000017, 0x64000018, 0x64000019,
196 0x6400001a, 0x6400001d, 0x64000020, 0x64000023, 0x64000024,
197 0x64000027, 0x6400002b, 0x6400002c, 0x6400002d, 0x64000030,
198 0x64000035, 0x6400003c, 0x64000040, 0x64000048, 0x64000064,
199 0x6400006c, 0x64000080, 0x640000ff, 0x64000100, 0x640001b0,
200 0x640001b8, 0x64000200, 0x64000218, 0x64000240, 0x6400024c,
201 0x64000250, 0x640003e8, 0x64000400, 0x64000409, 0x64000554,
202 0x64000600, 0x64000690, 0x64000730, 0x640007ff, 0x64000800,
203 0x64000900, 0x64000fff, 0x64001000, 0x6400182c, 0x64001b70,
204 0x64001c1c, 0x64001c24, 0x64001fff, 0x64002000, 0x64003598,
205 0x640036ec, 0x64003fff, 0x640052c0, 0x640054e4, 0x64005a3c,
206 0x64005fa4, 0x64006468, 0x64006718, 0x64008000, 0x6400c000,
207 0x6400ffff, 0x64010000, 0x64010008, 0x640102a0, 0x64014515,
208 0x64040000, 0x64050000, 0x6407c000, 0x640ff800, 0x640ffc00,
209 0x640ffc01, 0x640ffc02, 0x640fffff, 0x8c000000, 0x94000000,
210 0x94000018, 0x9400001c, 0x94000020, 0x98000000, 0xa0000000,
211 0xa8000000, 0xa8000001, 0xa8000002, 0xa8000003, 0xa8008000,
212 0xa8008002, 0xa8010000, 0xa8018000, 0xa8020000, 0xa8068000,
213 0xa8068005, 0xa8068006, 0xa8068007, 0xa806800f, 0xa8068040,
214 0xa8068043, 0xa8068054, 0xa8070000, 0xa8078000, 0xa8080000,
215 0xa8090000, 0xa80b0000, 0xa80f801b, 0xaa000000, 0xaa008000,
216 0xaa008002, 0xaa00800c, 0xaa010000, 0xaa068000, 0xaa068002,
217 0xaa068004, 0xaa068006, 0xaa068008, 0xaa06800a, 0xaa06800c,
218 0xaa068024, 0xaa070000, 0xaa070002, 0xaa07000c, 0xaa078000,
219 0xaa078002, 0xac000000, 0xac000004, 0xac000008, 0xac00000c,
220 0xac000010, 0xac000014, 0xac000018, 0xac00001c, 0xac000020,
221 0xac000024, 0xac000028, 0xac00002c, 0xac000030, 0xac000038,
222 0xac00003c, 0xac000040, 0xac000044, 0xac000058, 0xac00006c,
223 0xac008000, 0xac008004, 0xac008008, 0xac00800c, 0xac008010,
224 0xac008018, 0xac008020, 0xac008024, 0xac008028, 0xac008030,
225 0xac008034, 0xac008038, 0xac00803c, 0xac008044, 0xac008070,
226 0xac008078, 0xac010000, 0xac010004, 0xac010008, 0xac01000c,
227 0xac010010, 0xac01002c, 0xac018000, 0xac018004, 0xac018008,
228 0xac020000, 0xac020004, 0xac020008, 0xac028000, 0xac030000,
229 0xac038000, 0xac048000, 0xac050000, 0xac068000, 0xac068004,
230 0xac068008, 0xac06800c, 0xac068010, 0xac068014, 0xac068018,
231 0xac06801c, 0xac068020, 0xac068024, 0xac068028, 0xac06802c,
232 0xac068030, 0xac068034, 0xac068038, 0xac06803c, 0xac068040,
233 0xac068044, 0xac068048, 0xac06804c, 0xac068050, 0xac068058,
234 0xac070000, 0xac070004, 0xac070008, 0xac07000c, 0xac070010,
235 0xac070014, 0xac070018, 0xac07001c, 0xac070024, 0xac070028,
236 0xac07002c, 0xac070038, 0xac07003c, 0xac070040, 0xac070044,
237 0xac070048, 0xac07004c, 0xac070054, 0xac078000, 0xac078004,
238 0xac078008, 0xac07800c, 0xac078024, 0xac07803c, 0xac080000,
239 0xac080004, 0xac080008, 0xac08003c, 0xac088000, 0xac088004,
240 0xac088008, 0xac08800c, 0xac090000, 0xac098000, 0xac0a0000,
241 0xac0a0004, 0xac0a8000, 0xac0b0000, 0xac0c0000, 0xac0d8004,
242 0xac0d8008, 0xac0e8090, 0xac0e8094, 0xac0e80fc, 0xac0f8018,
243 0xac0f801c, 0xac0f8020, 0xac0f8024, 0xac0f8028, 0xac0f802c,
244 0xac0f8030, 0xac0f8034, 0xac0f8038, 0xac0f803c, 0xac0f8040,
245 0xac0f8044, 0xac0f8048, 0xac0f804c, 0xac0f8050, 0xac0f8054,
246 0xac0f8058, 0xb0000000, 0xb0000006, 0xb0000009, 0xb0000018,
247 0xb0000019, 0xb000001b, 0xb0008000, 0xb0010000, 0xb0018000,
248 0xb0018087, 0xb0020000, 0xb0030000, 0xb0070000, 0xb0078000,
249 0xb0080000, 0xb2000000, 0xb2000006, 0xb200000c, 0xb2008000,
250 0xb200800c, 0xb2010000, 0xb2018000, 0xb2020000, 0xb2078000,
251 0xb4000000, 0xb4000004, 0xb4000008, 0xb400000c, 0xb4000010,
252 0xb4000014, 0xb4000018, 0xb400001c, 0xb4000020, 0xb4000024,
253 0xb4000028, 0xb400002c, 0xb4000030, 0xb4000034, 0xb4000038,
254 0xb400003c, 0xb4000040, 0xb4000044, 0xb4000048, 0xb4000050,
255 0xb4000054, 0xb400006c, 0xb4008000, 0xb4008004, 0xb4008008,
256 0xb400800c, 0xb4008010, 0xb4008014, 0xb4008018, 0xb400801c,
257 0xb4008020, 0xb4008024, 0xb4008028, 0xb400802c, 0xb4008034,
258 0xb4008038, 0xb4008040, 0xb4008044, 0xb400806c, 0xb4008070,
259 0xb4010000, 0xb4010004, 0xb4010008, 0xb401000c, 0xb4010010,
260 0xb4010018, 0xb401001c, 0xb4010020, 0xb4010024, 0xb4010028,
261 0xb401002c, 0xb4018000, 0xb4018004, 0xb4018008, 0xb4018018,
262 0xb401801c, 0xb4020000, 0xb4020004, 0xb4020008, 0xb402000c,
263 0xb4020018, 0xb4028000, 0xb4028018, 0xb4030000, 0xb4030008,
264 0xb4030018, 0xb4038000, 0xb4068000, 0xb4068004, 0xb4068008,
265 0xb406800c, 0xb4068018, 0xb406801c, 0xb4068020, 0xb4068024,
266 0xb4068028, 0xb4070000, 0xb4070004, 0xb4070008, 0xb4070010,
267 0xb4070018, 0xb4070024, 0xb4070028, 0xb4078000, 0xb4078024,
268 0xb4080000, 0xb4080004, 0xb4090000, 0xb4098000, 0xb40c8000
269 };
270
271 #define N_SC_FORM0 (sizeof (sc_form_0) / sizeof (unsigned int))
272 #define N_SC_FORM1 (sizeof (sc_form_1) / sizeof (unsigned int))
273 #define N_SC_FORM2 (sizeof (sc_form_2) / sizeof (unsigned int))
274 #define N_SC_FORM3 (sizeof (sc_form_3) / sizeof (unsigned int))
275
276 static int
277 sc_compar (const void *va, const void *vb)
278 {
279 const unsigned int *a = (unsigned int *) va;
280 const unsigned int *b = (unsigned int *) vb;
281 return (*a - *b);
282 }
283
284 static int ATTRIBUTE_UNUSED
285 ft32_shortcode (unsigned int op32, unsigned int *sc)
286 {
287 unsigned int Rd_mask = 31 << 20;
288 unsigned int R1_mask = 31 << 15;
289 unsigned int R2_mask = 2047 << 4;
290 unsigned int Rd = (op32 >> 20) & 31;
291 unsigned int R1 = (op32 >> 15) & 31;
292 unsigned int R2 = (op32 >> 4) & 2047;
293 unsigned int lookup;
294 unsigned int *find = NULL;
295 unsigned int code = 0, r = 0;
296
297 /* Form 0 */
298 if (Rd == R1)
299 {
300 lookup = op32 & ~Rd_mask & ~R1_mask;
301 find = (unsigned int *) bsearch (&lookup, sc_form_0, N_SC_FORM0,
302 sizeof (unsigned int), sc_compar);
303 code = find - sc_form_0;
304 r = Rd;
305 }
306
307 /* Form 1 */
308 if ((find == NULL) && (Rd == R2))
309 {
310 lookup = op32 & ~Rd_mask & ~R2_mask;
311 find = (unsigned int *) bsearch (&lookup, sc_form_1, N_SC_FORM1,
312 sizeof (unsigned int), sc_compar);
313 code = find - sc_form_1 + N_SC_FORM0;
314 r = Rd;
315 }
316
317 /* Form 2 */
318 if (find == NULL)
319 {
320 lookup = op32 & ~R1_mask;
321 find = (unsigned int *) bsearch (&lookup, sc_form_2, N_SC_FORM2,
322 sizeof (unsigned int), sc_compar);
323 code = find - sc_form_2 + (N_SC_FORM0 + N_SC_FORM1);
324 r = R1;
325 }
326
327 /* Form 3 */
328 if (find == NULL)
329 {
330 lookup = op32 & ~Rd_mask;
331 find = (unsigned int *) bsearch (&lookup, sc_form_3, N_SC_FORM3,
332 sizeof (unsigned int), sc_compar);
333 code = find - sc_form_3 + (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2);
334 r = Rd;
335 }
336
337 *sc = (code << 5) | r;
338
339 return (find != NULL);
340 }
341
342 static int ATTRIBUTE_UNUSED
343 ft32_split_shortcode (unsigned int op32, unsigned int code15[2])
344 {
345 int code3;
346 unsigned int code30;
347
348 switch (op32 >> 27)
349 {
350 case 2:
351 code3 = 0;
352 break;
353 case 3:
354 code3 = 1;
355 break;
356 case 4:
357 code3 = 2;
358 break;
359 case 5:
360 code3 = 3;
361 break;
362 case 6:
363 code3 = 4;
364 break;
365 case 9:
366 code3 = 5;
367 break;
368 case 10:
369 code3 = 6;
370 break;
371 case 14:
372 code3 = 7;
373 break;
374 default:
375 code3 = -1;
376 break;
377 }
378
379 if (code3 == -1)
380 {
381 code15[0] = 0;
382 code15[1] = 0;
383 return 0;
384 }
385 else
386 {
387 code30 = ((op32 & 0x07ffffff) << 3) | code3;
388 code15[0] = code30 & 0x7fff;
389 code15[1] = (code30 >> 15) & 0x7fff;
390 return 1;
391 }
392 }
393
394 static unsigned int ATTRIBUTE_UNUSED
395 ft32_merge_shortcode (unsigned int code15[2])
396 {
397 static const unsigned char pat3[] = { 2, 3, 4, 5, 6, 9, 10, 14 };
398
399 unsigned int code30 = (code15[1] << 15) | code15[0];
400 unsigned int code27 = code30 >> 3;
401 unsigned int code3 = code30 & 7;
402 unsigned int pattern = pat3[code3];
403 return (pattern << 27) | code27;
404 }
405
406 static int ATTRIBUTE_UNUSED
407 ft32_decode_shortcode (unsigned int pc, unsigned int op32, unsigned int *sc)
408 {
409 int code3;
410 unsigned int code30;
411 unsigned int code15[2];
412 size_t i;
413
414 switch (op32 >> 27)
415 {
416 case 2:
417 code3 = 0;
418 break;
419 case 3:
420 code3 = 1;
421 break;
422 case 4:
423 code3 = 2;
424 break;
425 case 5:
426 code3 = 3;
427 break;
428 case 6:
429 code3 = 4;
430 break;
431 case 9:
432 code3 = 5;
433 break;
434 case 10:
435 code3 = 6;
436 break;
437 case 14:
438 code3 = 7;
439 break;
440 default:
441 code3 = -1;
442 break;
443 }
444
445 if (code3 == -1)
446 return 0;
447 else
448 {
449 code30 = ((op32 & 0x07ffffff) << 3) | code3;
450 code15[0] = code30 & 0x7fff;
451 code15[1] = (code30 >> 15) & 0x7fff;
452 for (i = 0; i < 2; i++)
453 {
454 unsigned int code = code15[i] >> 5;
455 unsigned int r = code15[i] & 0x1f;
456
457 if (code < 768)
458 {
459 if (code < N_SC_FORM0)
460 sc[i] = sc_form_0[code] | (r << 20) | (r << 15);
461 else if (code < (N_SC_FORM0 + N_SC_FORM1))
462 sc[i] = sc_form_1[code - N_SC_FORM0] | (r << 20) | (r << 4);
463 else if (code < (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2))
464 sc[i] = sc_form_2[code - (N_SC_FORM0 + N_SC_FORM1)]
465 | (r << 15);
466 else
467 sc[i] = sc_form_3[code -
468 (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2)]
469 | (r << 20);
470 }
471 else
472 {
473 int jtype = (code15[i] >> 9) & 15;
474 int offset = code15[i] & 511;
475 if (offset & 256)
476 offset -= 512;
477 if (jtype < 14)
478 sc[i] =
479 0x00200000 | ((jtype >> 1) << 22) | ((jtype & 1) << 19);
480 else if (jtype == 14)
481 sc[i] = 0x00300000;
482 else
483 sc[i] = 0x00340000;
484 sc[i] |= ((pc >> 2) + offset);
485 }
486 }
487 return 1;
488 }
489 }