xref: /netbsd-src/external/gpl3/gdb/dist/include/opcode/ft32.h (revision 02f41505626a9ceb584d30d0789203495760ac88)
1212397c6Schristos /* Definitions for decoding the ft32 opcode table.
2*02f41505Schristos    Copyright (C) 2013-2024 Free Software Foundation, Inc.
3212397c6Schristos    Contributed by FTDI (support@ftdichip.com)
4212397c6Schristos 
5212397c6Schristos This program is free software; you can redistribute it and/or modify
6212397c6Schristos it under the terms of the GNU General Public License as published by
7212397c6Schristos the Free Software Foundation; either version 2 of the License, or
8212397c6Schristos (at your option) any later version.
9212397c6Schristos 
10212397c6Schristos This program is distributed in the hope that it will be useful,
11212397c6Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of
12212397c6Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13212397c6Schristos GNU General Public License for more details.
14212397c6Schristos 
15212397c6Schristos You should have received a copy of the GNU General Public License
16212397c6Schristos along with this program; if not, write to the Free Software
17212397c6Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
18212397c6Schristos 02110-1301, USA.  */
19212397c6Schristos 
20212397c6Schristos typedef struct ft32_opc_info_t
21212397c6Schristos {
22212397c6Schristos   const char *name;
23212397c6Schristos   int dw;
24212397c6Schristos   unsigned int mask;
25212397c6Schristos   unsigned int bits;
26212397c6Schristos   int fields;
27212397c6Schristos } ft32_opc_info_t;
28212397c6Schristos 
29212397c6Schristos #define FT32_PAT_ALUOP    0x08
30212397c6Schristos #define FT32_PAT_LDA      0x18
31212397c6Schristos #define FT32_PAT_TOCI     0x01
32212397c6Schristos #define FT32_PAT_CMPOP    0x0b
33212397c6Schristos #define FT32_PAT_STA      0x17
34212397c6Schristos #define FT32_PAT_EXA      0x07
35212397c6Schristos #define FT32_PAT_LDK      0x0c
36212397c6Schristos #define FT32_PAT_FFUOP    0x1e
37212397c6Schristos #define FT32_PAT_LDI      0x15
38212397c6Schristos #define FT32_PAT_STI      0x16
39212397c6Schristos #define FT32_PAT_EXI      0x1d
40212397c6Schristos #define FT32_PAT_POP      0x11
41212397c6Schristos #define FT32_PAT_LPM      0x0d
42212397c6Schristos #define FT32_PAT_LINK     0x12
43212397c6Schristos #define FT32_PAT_TOC      0x00
44212397c6Schristos #define FT32_PAT_PUSH     0x10
45212397c6Schristos #define FT32_PAT_RETURN   0x14
46212397c6Schristos #define FT32_PAT_UNLINK   0x13
47212397c6Schristos #define FT32_PAT_LPMI     0x19
48212397c6Schristos 
49212397c6Schristos #define FT32_FLD_CBCRCV (1 << 0)
50212397c6Schristos #define FT32_FLD_INT (1 << 1)
51212397c6Schristos #define FT32_FLD_INT_BIT 26
52212397c6Schristos #define FT32_FLD_INT_SIZ 1
53212397c6Schristos #define FT32_FLD_DW (1 << 2)
54212397c6Schristos #define FT32_FLD_DW_BIT 25
55212397c6Schristos #define FT32_FLD_DW_SIZ 2
56212397c6Schristos #define FT32_FLD_CB (1 << 3)
57212397c6Schristos #define FT32_FLD_CB_BIT 22
58212397c6Schristos #define FT32_FLD_CB_SIZ 5
59212397c6Schristos #define FT32_FLD_R_D (1 << 4)
60212397c6Schristos #define FT32_FLD_R_D_BIT 20
61212397c6Schristos #define FT32_FLD_R_D_SIZ 5
62212397c6Schristos #define FT32_FLD_CR (1 << 5)
63212397c6Schristos #define FT32_FLD_CR_BIT 20
64212397c6Schristos #define FT32_FLD_CR_SIZ 2
65212397c6Schristos #define FT32_FLD_CV (1 << 6)
66212397c6Schristos #define FT32_FLD_CV_BIT 19
67212397c6Schristos #define FT32_FLD_CV_SIZ 1
68212397c6Schristos #define FT32_FLD_BT (1 << 7)
69212397c6Schristos #define FT32_FLD_BT_BIT 18
70212397c6Schristos #define FT32_FLD_BT_SIZ 1
71212397c6Schristos #define FT32_FLD_R_1 (1 << 8)
72212397c6Schristos #define FT32_FLD_R_1_BIT 15
73212397c6Schristos #define FT32_FLD_R_1_SIZ 5
74212397c6Schristos #define FT32_FLD_RIMM (1 << 9)
75212397c6Schristos #define FT32_FLD_RIMM_BIT 4
76212397c6Schristos #define FT32_FLD_RIMM_SIZ 11
77212397c6Schristos #define FT32_FLD_R_2 (1 << 10)
78212397c6Schristos #define FT32_FLD_R_2_BIT 4
79212397c6Schristos #define FT32_FLD_R_2_SIZ 5
80212397c6Schristos #define FT32_FLD_K20 (1 << 11)
81212397c6Schristos #define FT32_FLD_K20_BIT 0
82212397c6Schristos #define FT32_FLD_K20_SIZ 20
83212397c6Schristos #define FT32_FLD_PA (1 << 12)
84212397c6Schristos #define FT32_FLD_PA_BIT 0
85212397c6Schristos #define FT32_FLD_PA_SIZ 18
86212397c6Schristos #define FT32_FLD_AA (1 << 13)
87212397c6Schristos #define FT32_FLD_AA_BIT 0
88212397c6Schristos #define FT32_FLD_AA_SIZ 17
89212397c6Schristos #define FT32_FLD_K16 (1 << 14)
90212397c6Schristos #define FT32_FLD_K16_BIT 0
91212397c6Schristos #define FT32_FLD_K16_SIZ 16
924559860eSchristos #define FT32_FLD_K15 (1 << 15)
934559860eSchristos #define FT32_FLD_K15_BIT 0
944559860eSchristos #define FT32_FLD_K15_SIZ 15
95212397c6Schristos #define FT32_FLD_AL (1 << 16)
96212397c6Schristos #define FT32_FLD_AL_BIT 0
97212397c6Schristos #define FT32_FLD_AL_SIZ 4
98212397c6Schristos 
99ba340e45Schristos #define FT32_IS_CALL(inst)   (((inst) & 0xfffc0000) == 0x00340000)
100ba340e45Schristos #define FT32_IS_PUSH(inst)   (((inst) & 0xfff00000) == 0x84000000)
101ba340e45Schristos #define FT32_PUSH_REG(inst)  (((inst) >> 15) & 0x1f)
102ba340e45Schristos #define FT32_IS_LINK(inst)   (((inst) & 0xffff0000) == 0x95d00000)
103ba340e45Schristos #define FT32_LINK_SIZE(inst) ((inst) & 0xffff)
104ba340e45Schristos 
105212397c6Schristos #define FT32_FLD_R_D_POST (1 << 17)
106212397c6Schristos #define FT32_FLD_R_1_POST (1 << 18)
1074559860eSchristos 
1084559860eSchristos static const unsigned int sc_form_0[] = {
1094559860eSchristos 0x44000000, 0x44000002, 0x44000004, 0x44000005, 0x4400000b,
1104559860eSchristos 0x44000010, 0x44000012, 0x44000014, 0x44000015, 0x44000018,
1114559860eSchristos 0x4400001b, 0x44000020, 0x44000022, 0x44000024, 0x44000025,
1124559860eSchristos 0x4400002b, 0x44000030, 0x44000032, 0x44000034, 0x44000035,
1134559860eSchristos 0x4400003b, 0x44000040, 0x44000042, 0x44000044, 0x44000045,
1144559860eSchristos 0x4400004b, 0x44000050, 0x44000060, 0x44000062, 0x44000065,
1154559860eSchristos 0x44000070, 0x44000072, 0x44000075, 0x44000080, 0x44000082,
1164559860eSchristos 0x44000090, 0x44000092, 0x440000a0, 0x440000a2, 0x440000b0,
1174559860eSchristos 0x440000d0, 0x440000d2, 0x440000d5, 0x440000e0, 0x440000e2,
1184559860eSchristos 0x440000f0, 0x440000f2, 0x440000f5, 0x44000100, 0x44000102,
1194559860eSchristos 0x44000110, 0x44000120, 0x44000122, 0x44000130, 0x44000140,
1204559860eSchristos 0x44000170, 0x44000180, 0x44000190, 0x440001a0, 0x440001b0,
1214559860eSchristos 0x440001e0, 0x440001f0, 0x44004000, 0x44004003, 0x4400400c,
1224559860eSchristos 0x4400400d, 0x44004010, 0x44004011, 0x44004013, 0x44004014,
1234559860eSchristos 0x44004016, 0x44004019, 0x4400401a, 0x44004020, 0x44004021,
1244559860eSchristos 0x44004028, 0x4400402a, 0x44004034, 0x44004038, 0x44004039,
1254559860eSchristos 0x44004040, 0x44004048, 0x44004058, 0x44004064, 0x44004074,
1264559860eSchristos 0x44004080, 0x44004081, 0x44004088, 0x44004089, 0x44004098,
1274559860eSchristos 0x440040c0, 0x440040ca, 0x440040f4, 0x44004100, 0x44004108,
1284559860eSchristos 0x44004109, 0x4400410a, 0x4400410b, 0x44004180, 0x44004182,
1294559860eSchristos 0x440041c0, 0x440041c2, 0x440041f4, 0x44004200, 0x44004202,
1304559860eSchristos 0x4400420b, 0x4400421b, 0x4400422b, 0x44004240, 0x44004242,
1314559860eSchristos 0x4400424b, 0x4400425b, 0x4400426b, 0x4400427b, 0x44004280,
1324559860eSchristos 0x44004282, 0x440042ab, 0x440042bb, 0x440042c0, 0x440042c2,
1334559860eSchristos 0x44004300, 0x44004340, 0x440043c3, 0x4400440b, 0x44004543,
1344559860eSchristos 0x44004553, 0x440047f4, 0x44004800, 0x44004980, 0x44004a0b,
1354559860eSchristos 0x44004a80, 0x44004dc0, 0x44004ff4, 0x44005003, 0x44005353,
1364559860eSchristos 0x4400537b, 0x440053e3, 0x44005700, 0x4400594b, 0x4400620b,
1374559860eSchristos 0x4400621b, 0x4400622b, 0x4400623b, 0x4400624b, 0x4400625b,
1384559860eSchristos 0x4400626b, 0x4400627b, 0x4400628b, 0x4400629b, 0x440062bb,
1394559860eSchristos 0x440062fb, 0x4400633b, 0x4400637b, 0x44006383, 0x44007f00,
1404559860eSchristos 0x44007f80, 0x44007fc0, 0x44007fe0, 0x44007ff0, 0x44007ff3, 0x44007ff6
1414559860eSchristos };
1424559860eSchristos static const unsigned int sc_form_1[] = {
1434559860eSchristos 0x44000002, 0x44008002, 0x44010002, 0x44010008, 0x44018002,
1444559860eSchristos 0x44020002, 0x44030002, 0x44038002
1454559860eSchristos };
1464559860eSchristos static const unsigned int sc_form_2[] = {
1474559860eSchristos 0x59e04002, 0x59e04012, 0x59e04022, 0x59e04032, 0x59e04042,
1484559860eSchristos 0x59e04052, 0x59e04072, 0x59e04082, 0x59e07ff2, 0x5de00002,
1494559860eSchristos 0x5de00012, 0x5de00022, 0x5de00032, 0x5de00042, 0x5de00052,
1504559860eSchristos 0x5de00062, 0x5de00072, 0x5de00082, 0x5de000a2, 0x5de000d2,
1514559860eSchristos 0x5de000e2, 0x5de000f2, 0x5de00102, 0x5de00112, 0x5de00122,
1524559860eSchristos 0x5de00132, 0x5de00172, 0x5de04002, 0x5de04012, 0x5de04022,
1534559860eSchristos 0x5de04032, 0x5de04042, 0x5de04052, 0x5de04062, 0x5de04072,
1544559860eSchristos 0x5de04082, 0x5de04092, 0x5de040f2, 0x5de04102, 0x5de04112,
1554559860eSchristos 0x5de04142, 0x5de04162, 0x5de041b2, 0x5de041f2, 0x5de04202,
1564559860eSchristos 0x5de0420c, 0x5de0421c, 0x5de0422c, 0x5de0423c, 0x5de04242,
1574559860eSchristos 0x5de0424c, 0x5de0425c, 0x5de0426c, 0x5de0427c, 0x5de0428c,
1584559860eSchristos 0x5de0429c, 0x5de042ac, 0x5de042cc, 0x5de042dc, 0x5de042ec,
1594559860eSchristos 0x5de042fc, 0x5de0430c, 0x5de0431c, 0x5de0433c, 0x5de0436c,
1604559860eSchristos 0x5de0437c, 0x5de04382, 0x5de043ac, 0x5de043bc, 0x5de043cc,
1614559860eSchristos 0x5de043dc, 0x5de04ff2, 0x5de07ff2, 0x84000000
1624559860eSchristos };
1634559860eSchristos static const unsigned int sc_form_3[] = {
1644559860eSchristos 0x44000010, 0x44000024, 0x44000025, 0x44000030, 0x44000034,
1654559860eSchristos 0x44004000, 0x4400400c, 0x4400400d, 0x44004010, 0x44004014,
1664559860eSchristos 0x44004028, 0x44004038, 0x44004040, 0x440040ca, 0x44004109,
1674559860eSchristos 0x44004880, 0x44004ac0, 0x44004e00, 0x44004e80, 0x44004ff4,
1684559860eSchristos 0x4400500c, 0x44005200, 0x44005680, 0x44005700, 0x4400620b,
1694559860eSchristos 0x44007f80, 0x44008020, 0x44008024, 0x4400c000, 0x4400c00c,
1704559860eSchristos 0x4400c00d, 0x4400c010, 0x4400c028, 0x4400c038, 0x4400c1f9,
1714559860eSchristos 0x4400cff4, 0x4400d00c, 0x4400d173, 0x4400ff80, 0x4400fff0,
1724559860eSchristos 0x44010030, 0x44014000, 0x4401400c, 0x4401400d, 0x44014010,
1734559860eSchristos 0x44014028, 0x44014074, 0x44014080, 0x440143f3, 0x44014ff4,
1744559860eSchristos 0x4401500c, 0x44015743, 0x44017ff0, 0x44018030, 0x4401c000,
1754559860eSchristos 0x4401c00c, 0x4401c010, 0x4401cff4, 0x4401d00c, 0x44020100,
1764559860eSchristos 0x44024000, 0x44024014, 0x44027f80, 0x4402c000, 0x44030085,
1774559860eSchristos 0x44034000, 0x44034109, 0x4403c000, 0x44044000, 0x44044109,
1784559860eSchristos 0x4404410b, 0x4404c000, 0x440680e0, 0x4406c000, 0x4406c040,
1794559860eSchristos 0x4406c080, 0x4406c0c0, 0x4406c300, 0x4406c3c0, 0x4406c900,
1804559860eSchristos 0x4406cac0, 0x4406cb40, 0x4406cbc0, 0x4406ce80, 0x4406d5c0,
1814559860eSchristos 0x4406d680, 0x4406d700, 0x4406d740, 0x4406d780, 0x4406dfc0,
1824559860eSchristos 0x44074000, 0x44074010, 0x44074e80, 0x4407c000, 0x4407c00d,
1834559860eSchristos 0x4407c074, 0x44084000, 0x4408c000, 0x44094000, 0x4409c000,
1844559860eSchristos 0x440a4000, 0x440ac000, 0x440b4000, 0x440bc000, 0x440c4000,
1854559860eSchristos 0x440c4040, 0x440cc000, 0x440d4000, 0x440dc000, 0x440ef340,
1864559860eSchristos 0x440ef400, 0x440ef440, 0x440ef4c0, 0x440ef540, 0x440ef5c0,
1874559860eSchristos 0x440ef6b0, 0x440ef700, 0x440ef780, 0x440ef8c0, 0x440f420d,
1884559860eSchristos 0x440f421d, 0x440f426d, 0x440fc180, 0x440fc1a0, 0x440fc1b0,
1894559860eSchristos 0x440fc1c0, 0x440fc200, 0x440fc240, 0x440fc280, 0x440fc380,
1904559860eSchristos 0x440fc840, 0x440fc8c0, 0x440fc900, 0x440fc980, 0x440fcd80,
1914559860eSchristos 0x64000000, 0x64000001, 0x64000002, 0x64000003, 0x64000004,
1924559860eSchristos 0x64000005, 0x64000006, 0x64000007, 0x64000008, 0x64000009,
1934559860eSchristos 0x6400000a, 0x6400000b, 0x6400000c, 0x6400000d, 0x6400000e,
1944559860eSchristos 0x6400000f, 0x64000010, 0x64000011, 0x64000012, 0x64000013,
1954559860eSchristos 0x64000014, 0x64000015, 0x64000017, 0x64000018, 0x64000019,
1964559860eSchristos 0x6400001a, 0x6400001d, 0x64000020, 0x64000023, 0x64000024,
1974559860eSchristos 0x64000027, 0x6400002b, 0x6400002c, 0x6400002d, 0x64000030,
1984559860eSchristos 0x64000035, 0x6400003c, 0x64000040, 0x64000048, 0x64000064,
1994559860eSchristos 0x6400006c, 0x64000080, 0x640000ff, 0x64000100, 0x640001b0,
2004559860eSchristos 0x640001b8, 0x64000200, 0x64000218, 0x64000240, 0x6400024c,
2014559860eSchristos 0x64000250, 0x640003e8, 0x64000400, 0x64000409, 0x64000554,
2024559860eSchristos 0x64000600, 0x64000690, 0x64000730, 0x640007ff, 0x64000800,
2034559860eSchristos 0x64000900, 0x64000fff, 0x64001000, 0x6400182c, 0x64001b70,
2044559860eSchristos 0x64001c1c, 0x64001c24, 0x64001fff, 0x64002000, 0x64003598,
2054559860eSchristos 0x640036ec, 0x64003fff, 0x640052c0, 0x640054e4, 0x64005a3c,
2064559860eSchristos 0x64005fa4, 0x64006468, 0x64006718, 0x64008000, 0x6400c000,
2074559860eSchristos 0x6400ffff, 0x64010000, 0x64010008, 0x640102a0, 0x64014515,
2084559860eSchristos 0x64040000, 0x64050000, 0x6407c000, 0x640ff800, 0x640ffc00,
2094559860eSchristos 0x640ffc01, 0x640ffc02, 0x640fffff, 0x8c000000, 0x94000000,
2104559860eSchristos 0x94000018, 0x9400001c, 0x94000020, 0x98000000, 0xa0000000,
2114559860eSchristos 0xa8000000, 0xa8000001, 0xa8000002, 0xa8000003, 0xa8008000,
2124559860eSchristos 0xa8008002, 0xa8010000, 0xa8018000, 0xa8020000, 0xa8068000,
2134559860eSchristos 0xa8068005, 0xa8068006, 0xa8068007, 0xa806800f, 0xa8068040,
2144559860eSchristos 0xa8068043, 0xa8068054, 0xa8070000, 0xa8078000, 0xa8080000,
2154559860eSchristos 0xa8090000, 0xa80b0000, 0xa80f801b, 0xaa000000, 0xaa008000,
2164559860eSchristos 0xaa008002, 0xaa00800c, 0xaa010000, 0xaa068000, 0xaa068002,
2174559860eSchristos 0xaa068004, 0xaa068006, 0xaa068008, 0xaa06800a, 0xaa06800c,
2184559860eSchristos 0xaa068024, 0xaa070000, 0xaa070002, 0xaa07000c, 0xaa078000,
2194559860eSchristos 0xaa078002, 0xac000000, 0xac000004, 0xac000008, 0xac00000c,
2204559860eSchristos 0xac000010, 0xac000014, 0xac000018, 0xac00001c, 0xac000020,
2214559860eSchristos 0xac000024, 0xac000028, 0xac00002c, 0xac000030, 0xac000038,
2224559860eSchristos 0xac00003c, 0xac000040, 0xac000044, 0xac000058, 0xac00006c,
2234559860eSchristos 0xac008000, 0xac008004, 0xac008008, 0xac00800c, 0xac008010,
2244559860eSchristos 0xac008018, 0xac008020, 0xac008024, 0xac008028, 0xac008030,
2254559860eSchristos 0xac008034, 0xac008038, 0xac00803c, 0xac008044, 0xac008070,
2264559860eSchristos 0xac008078, 0xac010000, 0xac010004, 0xac010008, 0xac01000c,
2274559860eSchristos 0xac010010, 0xac01002c, 0xac018000, 0xac018004, 0xac018008,
2284559860eSchristos 0xac020000, 0xac020004, 0xac020008, 0xac028000, 0xac030000,
2294559860eSchristos 0xac038000, 0xac048000, 0xac050000, 0xac068000, 0xac068004,
2304559860eSchristos 0xac068008, 0xac06800c, 0xac068010, 0xac068014, 0xac068018,
2314559860eSchristos 0xac06801c, 0xac068020, 0xac068024, 0xac068028, 0xac06802c,
2324559860eSchristos 0xac068030, 0xac068034, 0xac068038, 0xac06803c, 0xac068040,
2334559860eSchristos 0xac068044, 0xac068048, 0xac06804c, 0xac068050, 0xac068058,
2344559860eSchristos 0xac070000, 0xac070004, 0xac070008, 0xac07000c, 0xac070010,
2354559860eSchristos 0xac070014, 0xac070018, 0xac07001c, 0xac070024, 0xac070028,
2364559860eSchristos 0xac07002c, 0xac070038, 0xac07003c, 0xac070040, 0xac070044,
2374559860eSchristos 0xac070048, 0xac07004c, 0xac070054, 0xac078000, 0xac078004,
2384559860eSchristos 0xac078008, 0xac07800c, 0xac078024, 0xac07803c, 0xac080000,
2394559860eSchristos 0xac080004, 0xac080008, 0xac08003c, 0xac088000, 0xac088004,
2404559860eSchristos 0xac088008, 0xac08800c, 0xac090000, 0xac098000, 0xac0a0000,
2414559860eSchristos 0xac0a0004, 0xac0a8000, 0xac0b0000, 0xac0c0000, 0xac0d8004,
2424559860eSchristos 0xac0d8008, 0xac0e8090, 0xac0e8094, 0xac0e80fc, 0xac0f8018,
2434559860eSchristos 0xac0f801c, 0xac0f8020, 0xac0f8024, 0xac0f8028, 0xac0f802c,
2444559860eSchristos 0xac0f8030, 0xac0f8034, 0xac0f8038, 0xac0f803c, 0xac0f8040,
2454559860eSchristos 0xac0f8044, 0xac0f8048, 0xac0f804c, 0xac0f8050, 0xac0f8054,
2464559860eSchristos 0xac0f8058, 0xb0000000, 0xb0000006, 0xb0000009, 0xb0000018,
2474559860eSchristos 0xb0000019, 0xb000001b, 0xb0008000, 0xb0010000, 0xb0018000,
2484559860eSchristos 0xb0018087, 0xb0020000, 0xb0030000, 0xb0070000, 0xb0078000,
2494559860eSchristos 0xb0080000, 0xb2000000, 0xb2000006, 0xb200000c, 0xb2008000,
2504559860eSchristos 0xb200800c, 0xb2010000, 0xb2018000, 0xb2020000, 0xb2078000,
2514559860eSchristos 0xb4000000, 0xb4000004, 0xb4000008, 0xb400000c, 0xb4000010,
2524559860eSchristos 0xb4000014, 0xb4000018, 0xb400001c, 0xb4000020, 0xb4000024,
2534559860eSchristos 0xb4000028, 0xb400002c, 0xb4000030, 0xb4000034, 0xb4000038,
2544559860eSchristos 0xb400003c, 0xb4000040, 0xb4000044, 0xb4000048, 0xb4000050,
2554559860eSchristos 0xb4000054, 0xb400006c, 0xb4008000, 0xb4008004, 0xb4008008,
2564559860eSchristos 0xb400800c, 0xb4008010, 0xb4008014, 0xb4008018, 0xb400801c,
2574559860eSchristos 0xb4008020, 0xb4008024, 0xb4008028, 0xb400802c, 0xb4008034,
2584559860eSchristos 0xb4008038, 0xb4008040, 0xb4008044, 0xb400806c, 0xb4008070,
2594559860eSchristos 0xb4010000, 0xb4010004, 0xb4010008, 0xb401000c, 0xb4010010,
2604559860eSchristos 0xb4010018, 0xb401001c, 0xb4010020, 0xb4010024, 0xb4010028,
2614559860eSchristos 0xb401002c, 0xb4018000, 0xb4018004, 0xb4018008, 0xb4018018,
2624559860eSchristos 0xb401801c, 0xb4020000, 0xb4020004, 0xb4020008, 0xb402000c,
2634559860eSchristos 0xb4020018, 0xb4028000, 0xb4028018, 0xb4030000, 0xb4030008,
2644559860eSchristos 0xb4030018, 0xb4038000, 0xb4068000, 0xb4068004, 0xb4068008,
2654559860eSchristos 0xb406800c, 0xb4068018, 0xb406801c, 0xb4068020, 0xb4068024,
2664559860eSchristos 0xb4068028, 0xb4070000, 0xb4070004, 0xb4070008, 0xb4070010,
2674559860eSchristos 0xb4070018, 0xb4070024, 0xb4070028, 0xb4078000, 0xb4078024,
2684559860eSchristos 0xb4080000, 0xb4080004, 0xb4090000, 0xb4098000, 0xb40c8000
2694559860eSchristos };
2704559860eSchristos 
2714559860eSchristos #define N_SC_FORM0  (sizeof (sc_form_0) / sizeof (unsigned int))
2724559860eSchristos #define N_SC_FORM1  (sizeof (sc_form_1) / sizeof (unsigned int))
2734559860eSchristos #define N_SC_FORM2  (sizeof (sc_form_2) / sizeof (unsigned int))
2744559860eSchristos #define N_SC_FORM3  (sizeof (sc_form_3) / sizeof (unsigned int))
2754559860eSchristos 
2764559860eSchristos static int
2774559860eSchristos sc_compar (const void *va, const void *vb)
2784559860eSchristos {
2794559860eSchristos   const unsigned int *a = (unsigned int *) va;
2804559860eSchristos   const unsigned int *b = (unsigned int *) vb;
2814559860eSchristos   return (*a - *b);
2824559860eSchristos }
2834559860eSchristos 
2844559860eSchristos static int ATTRIBUTE_UNUSED
2854559860eSchristos ft32_shortcode (unsigned int op32, unsigned int *sc)
2864559860eSchristos {
2874559860eSchristos   unsigned int Rd_mask = 31 << 20;
2884559860eSchristos   unsigned int R1_mask = 31 << 15;
2894559860eSchristos   unsigned int R2_mask = 2047 << 4;
2904559860eSchristos   unsigned int Rd = (op32 >> 20) & 31;
2914559860eSchristos   unsigned int R1 = (op32 >> 15) & 31;
2924559860eSchristos   unsigned int R2 = (op32 >> 4) & 2047;
2934559860eSchristos   unsigned int lookup;
2944559860eSchristos   unsigned int *find = NULL;
2954559860eSchristos   unsigned int code = 0, r = 0;
2964559860eSchristos 
2974559860eSchristos   /* Form 0 */
2984559860eSchristos   if (Rd == R1)
2994559860eSchristos     {
3004559860eSchristos       lookup = op32 & ~Rd_mask & ~R1_mask;
3014559860eSchristos       find = (unsigned int *) bsearch (&lookup, sc_form_0, N_SC_FORM0,
3024559860eSchristos 				       sizeof (unsigned int), sc_compar);
3034559860eSchristos       code = find - sc_form_0;
3044559860eSchristos       r = Rd;
3054559860eSchristos     }
3064559860eSchristos 
3074559860eSchristos   /* Form 1 */
3084559860eSchristos   if ((find == NULL) && (Rd == R2))
3094559860eSchristos     {
3104559860eSchristos       lookup = op32 & ~Rd_mask & ~R2_mask;
3114559860eSchristos       find = (unsigned int *) bsearch (&lookup, sc_form_1, N_SC_FORM1,
3124559860eSchristos 				       sizeof (unsigned int), sc_compar);
3134559860eSchristos       code = find - sc_form_1 + N_SC_FORM0;
3144559860eSchristos       r = Rd;
3154559860eSchristos     }
3164559860eSchristos 
3174559860eSchristos   /* Form 2 */
3184559860eSchristos   if (find == NULL)
3194559860eSchristos     {
3204559860eSchristos       lookup = op32 & ~R1_mask;
3214559860eSchristos       find = (unsigned int *) bsearch (&lookup, sc_form_2, N_SC_FORM2,
3224559860eSchristos 				       sizeof (unsigned int), sc_compar);
3234559860eSchristos       code = find - sc_form_2 + (N_SC_FORM0 + N_SC_FORM1);
3244559860eSchristos       r = R1;
3254559860eSchristos     }
3264559860eSchristos 
3274559860eSchristos   /* Form 3 */
3284559860eSchristos   if (find == NULL)
3294559860eSchristos     {
3304559860eSchristos       lookup = op32 & ~Rd_mask;
3314559860eSchristos       find = (unsigned int *) bsearch (&lookup, sc_form_3, N_SC_FORM3,
3324559860eSchristos 				       sizeof (unsigned int), sc_compar);
3334559860eSchristos       code = find - sc_form_3 + (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2);
3344559860eSchristos       r = Rd;
3354559860eSchristos     }
3364559860eSchristos 
3374559860eSchristos   *sc = (code << 5) | r;
3384559860eSchristos 
3394559860eSchristos   return (find != NULL);
3404559860eSchristos }
3414559860eSchristos 
3424559860eSchristos static int ATTRIBUTE_UNUSED
3434559860eSchristos ft32_split_shortcode (unsigned int op32, unsigned int code15[2])
3444559860eSchristos {
3454559860eSchristos   int code3;
3464559860eSchristos   unsigned int code30;
3474559860eSchristos 
3484559860eSchristos   switch (op32 >> 27)
3494559860eSchristos     {
3504559860eSchristos     case 2:
3514559860eSchristos       code3 = 0;
3524559860eSchristos       break;
3534559860eSchristos     case 3:
3544559860eSchristos       code3 = 1;
3554559860eSchristos       break;
3564559860eSchristos     case 4:
3574559860eSchristos       code3 = 2;
3584559860eSchristos       break;
3594559860eSchristos     case 5:
3604559860eSchristos       code3 = 3;
3614559860eSchristos       break;
3624559860eSchristos     case 6:
3634559860eSchristos       code3 = 4;
3644559860eSchristos       break;
3654559860eSchristos     case 9:
3664559860eSchristos       code3 = 5;
3674559860eSchristos       break;
3684559860eSchristos     case 10:
3694559860eSchristos       code3 = 6;
3704559860eSchristos       break;
3714559860eSchristos     case 14:
3724559860eSchristos       code3 = 7;
3734559860eSchristos       break;
3744559860eSchristos     default:
3754559860eSchristos       code3 = -1;
3764559860eSchristos       break;
3774559860eSchristos     }
3784559860eSchristos 
3794559860eSchristos   if (code3 == -1)
3804559860eSchristos     {
3814559860eSchristos       code15[0] = 0;
3824559860eSchristos       code15[1] = 0;
3834559860eSchristos       return 0;
3844559860eSchristos     }
3854559860eSchristos   else
3864559860eSchristos     {
3874559860eSchristos       code30 = ((op32 & 0x07ffffff) << 3) | code3;
3884559860eSchristos       code15[0] = code30 & 0x7fff;
3894559860eSchristos       code15[1] = (code30 >> 15) & 0x7fff;
3904559860eSchristos       return 1;
3914559860eSchristos     }
3924559860eSchristos }
3934559860eSchristos 
3944559860eSchristos static unsigned int ATTRIBUTE_UNUSED
3954559860eSchristos ft32_merge_shortcode (unsigned int code15[2])
3964559860eSchristos {
3974559860eSchristos   static const unsigned char pat3[] = { 2, 3, 4, 5, 6, 9, 10, 14 };
3984559860eSchristos 
3994559860eSchristos   unsigned int code30 = (code15[1] << 15) | code15[0];
4004559860eSchristos   unsigned int code27 = code30 >> 3;
4014559860eSchristos   unsigned int code3 = code30 & 7;
4024559860eSchristos   unsigned int pattern = pat3[code3];
4034559860eSchristos   return (pattern << 27) | code27;
4044559860eSchristos }
4054559860eSchristos 
4064559860eSchristos static int ATTRIBUTE_UNUSED
4074559860eSchristos ft32_decode_shortcode (unsigned int pc, unsigned int op32, unsigned int *sc)
4084559860eSchristos {
4094559860eSchristos   int code3;
4104559860eSchristos   unsigned int code30;
4114559860eSchristos   unsigned int code15[2];
4124559860eSchristos   size_t i;
4134559860eSchristos 
4144559860eSchristos   switch (op32 >> 27)
4154559860eSchristos     {
4164559860eSchristos     case 2:
4174559860eSchristos       code3 = 0;
4184559860eSchristos       break;
4194559860eSchristos     case 3:
4204559860eSchristos       code3 = 1;
4214559860eSchristos       break;
4224559860eSchristos     case 4:
4234559860eSchristos       code3 = 2;
4244559860eSchristos       break;
4254559860eSchristos     case 5:
4264559860eSchristos       code3 = 3;
4274559860eSchristos       break;
4284559860eSchristos     case 6:
4294559860eSchristos       code3 = 4;
4304559860eSchristos       break;
4314559860eSchristos     case 9:
4324559860eSchristos       code3 = 5;
4334559860eSchristos       break;
4344559860eSchristos     case 10:
4354559860eSchristos       code3 = 6;
4364559860eSchristos       break;
4374559860eSchristos     case 14:
4384559860eSchristos       code3 = 7;
4394559860eSchristos       break;
4404559860eSchristos     default:
4414559860eSchristos       code3 = -1;
4424559860eSchristos       break;
4434559860eSchristos     }
4444559860eSchristos 
4454559860eSchristos   if (code3 == -1)
4464559860eSchristos     return 0;
4474559860eSchristos   else
4484559860eSchristos     {
4494559860eSchristos       code30 = ((op32 & 0x07ffffff) << 3) | code3;
4504559860eSchristos       code15[0] = code30 & 0x7fff;
4514559860eSchristos       code15[1] = (code30 >> 15) & 0x7fff;
4524559860eSchristos       for (i = 0; i < 2; i++)
4534559860eSchristos 	{
4544559860eSchristos 	  unsigned int code = code15[i] >> 5;
4554559860eSchristos 	  unsigned int r = code15[i] & 0x1f;
4564559860eSchristos 
4574559860eSchristos 	  if (code < 768)
4584559860eSchristos 	    {
4594559860eSchristos 	      if (code < N_SC_FORM0)
4604559860eSchristos 		sc[i] = sc_form_0[code] | (r << 20) | (r << 15);
4614559860eSchristos 	      else if (code < (N_SC_FORM0 + N_SC_FORM1))
4624559860eSchristos 		sc[i] = sc_form_1[code - N_SC_FORM0] | (r << 20) | (r << 4);
4634559860eSchristos 	      else if (code < (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2))
4644559860eSchristos 		sc[i] = sc_form_2[code - (N_SC_FORM0 + N_SC_FORM1)]
4654559860eSchristos 		  | (r << 15);
4664559860eSchristos 	      else
4674559860eSchristos 		sc[i] = sc_form_3[code -
4684559860eSchristos 				  (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2)]
4694559860eSchristos 		  | (r << 20);
4704559860eSchristos 	    }
4714559860eSchristos 	  else
4724559860eSchristos 	    {
4734559860eSchristos 	      int jtype = (code15[i] >> 9) & 15;
4744559860eSchristos 	      int offset = code15[i] & 511;
4754559860eSchristos 	      if (offset & 256)
4764559860eSchristos 		offset -= 512;
4774559860eSchristos 	      if (jtype < 14)
4784559860eSchristos 		sc[i] =
4794559860eSchristos 		  0x00200000 | ((jtype >> 1) << 22) | ((jtype & 1) << 19);
4804559860eSchristos 	      else if (jtype == 14)
4814559860eSchristos 		sc[i] = 0x00300000;
4824559860eSchristos 	      else
4834559860eSchristos 		sc[i] = 0x00340000;
4844559860eSchristos 	      sc[i] |= ((pc >> 2) + offset);
4854559860eSchristos 	    }
4864559860eSchristos 	}
4874559860eSchristos       return 1;
4884559860eSchristos     }
4894559860eSchristos }
490