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