xref: /netbsd-src/external/gpl3/gdb.old/dist/include/opcode/ft32.h (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
14e00368fSchristos /* Definitions for decoding the ft32 opcode table.
2*6881a400Schristos    Copyright (C) 2013-2022 Free Software Foundation, Inc.
34e00368fSchristos    Contributed by FTDI (support@ftdichip.com)
44e00368fSchristos 
54e00368fSchristos This program is free software; you can redistribute it and/or modify
64e00368fSchristos it under the terms of the GNU General Public License as published by
74e00368fSchristos the Free Software Foundation; either version 2 of the License, or
84e00368fSchristos (at your option) any later version.
94e00368fSchristos 
104e00368fSchristos This program is distributed in the hope that it will be useful,
114e00368fSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of
124e00368fSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
134e00368fSchristos GNU General Public License for more details.
144e00368fSchristos 
154e00368fSchristos You should have received a copy of the GNU General Public License
164e00368fSchristos along with this program; if not, write to the Free Software
174e00368fSchristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
184e00368fSchristos 02110-1301, USA.  */
194e00368fSchristos 
204e00368fSchristos typedef struct ft32_opc_info_t
214e00368fSchristos {
224e00368fSchristos   const char *name;
234e00368fSchristos   int dw;
244e00368fSchristos   unsigned int mask;
254e00368fSchristos   unsigned int bits;
264e00368fSchristos   int fields;
274e00368fSchristos } ft32_opc_info_t;
284e00368fSchristos 
294e00368fSchristos #define FT32_PAT_ALUOP    0x08
304e00368fSchristos #define FT32_PAT_LDA      0x18
314e00368fSchristos #define FT32_PAT_TOCI     0x01
324e00368fSchristos #define FT32_PAT_CMPOP    0x0b
334e00368fSchristos #define FT32_PAT_STA      0x17
344e00368fSchristos #define FT32_PAT_EXA      0x07
354e00368fSchristos #define FT32_PAT_LDK      0x0c
364e00368fSchristos #define FT32_PAT_FFUOP    0x1e
374e00368fSchristos #define FT32_PAT_LDI      0x15
384e00368fSchristos #define FT32_PAT_STI      0x16
394e00368fSchristos #define FT32_PAT_EXI      0x1d
404e00368fSchristos #define FT32_PAT_POP      0x11
414e00368fSchristos #define FT32_PAT_LPM      0x0d
424e00368fSchristos #define FT32_PAT_LINK     0x12
434e00368fSchristos #define FT32_PAT_TOC      0x00
444e00368fSchristos #define FT32_PAT_PUSH     0x10
454e00368fSchristos #define FT32_PAT_RETURN   0x14
464e00368fSchristos #define FT32_PAT_UNLINK   0x13
474e00368fSchristos #define FT32_PAT_LPMI     0x19
484e00368fSchristos 
494e00368fSchristos #define FT32_FLD_CBCRCV (1 << 0)
504e00368fSchristos #define FT32_FLD_INT (1 << 1)
514e00368fSchristos #define FT32_FLD_INT_BIT 26
524e00368fSchristos #define FT32_FLD_INT_SIZ 1
534e00368fSchristos #define FT32_FLD_DW (1 << 2)
544e00368fSchristos #define FT32_FLD_DW_BIT 25
554e00368fSchristos #define FT32_FLD_DW_SIZ 2
564e00368fSchristos #define FT32_FLD_CB (1 << 3)
574e00368fSchristos #define FT32_FLD_CB_BIT 22
584e00368fSchristos #define FT32_FLD_CB_SIZ 5
594e00368fSchristos #define FT32_FLD_R_D (1 << 4)
604e00368fSchristos #define FT32_FLD_R_D_BIT 20
614e00368fSchristos #define FT32_FLD_R_D_SIZ 5
624e00368fSchristos #define FT32_FLD_CR (1 << 5)
634e00368fSchristos #define FT32_FLD_CR_BIT 20
644e00368fSchristos #define FT32_FLD_CR_SIZ 2
654e00368fSchristos #define FT32_FLD_CV (1 << 6)
664e00368fSchristos #define FT32_FLD_CV_BIT 19
674e00368fSchristos #define FT32_FLD_CV_SIZ 1
684e00368fSchristos #define FT32_FLD_BT (1 << 7)
694e00368fSchristos #define FT32_FLD_BT_BIT 18
704e00368fSchristos #define FT32_FLD_BT_SIZ 1
714e00368fSchristos #define FT32_FLD_R_1 (1 << 8)
724e00368fSchristos #define FT32_FLD_R_1_BIT 15
734e00368fSchristos #define FT32_FLD_R_1_SIZ 5
744e00368fSchristos #define FT32_FLD_RIMM (1 << 9)
754e00368fSchristos #define FT32_FLD_RIMM_BIT 4
764e00368fSchristos #define FT32_FLD_RIMM_SIZ 11
774e00368fSchristos #define FT32_FLD_R_2 (1 << 10)
784e00368fSchristos #define FT32_FLD_R_2_BIT 4
794e00368fSchristos #define FT32_FLD_R_2_SIZ 5
804e00368fSchristos #define FT32_FLD_K20 (1 << 11)
814e00368fSchristos #define FT32_FLD_K20_BIT 0
824e00368fSchristos #define FT32_FLD_K20_SIZ 20
834e00368fSchristos #define FT32_FLD_PA (1 << 12)
844e00368fSchristos #define FT32_FLD_PA_BIT 0
854e00368fSchristos #define FT32_FLD_PA_SIZ 18
864e00368fSchristos #define FT32_FLD_AA (1 << 13)
874e00368fSchristos #define FT32_FLD_AA_BIT 0
884e00368fSchristos #define FT32_FLD_AA_SIZ 17
894e00368fSchristos #define FT32_FLD_K16 (1 << 14)
904e00368fSchristos #define FT32_FLD_K16_BIT 0
914e00368fSchristos #define FT32_FLD_K16_SIZ 16
927f2ac410Schristos #define FT32_FLD_K15 (1 << 15)
937f2ac410Schristos #define FT32_FLD_K15_BIT 0
947f2ac410Schristos #define FT32_FLD_K15_SIZ 15
954e00368fSchristos #define FT32_FLD_AL (1 << 16)
964e00368fSchristos #define FT32_FLD_AL_BIT 0
974e00368fSchristos #define FT32_FLD_AL_SIZ 4
984e00368fSchristos 
99ed8eb4c2Schristos #define FT32_IS_CALL(inst)   (((inst) & 0xfffc0000) == 0x00340000)
100ed8eb4c2Schristos #define FT32_IS_PUSH(inst)   (((inst) & 0xfff00000) == 0x84000000)
101ed8eb4c2Schristos #define FT32_PUSH_REG(inst)  (((inst) >> 15) & 0x1f)
102ed8eb4c2Schristos #define FT32_IS_LINK(inst)   (((inst) & 0xffff0000) == 0x95d00000)
103ed8eb4c2Schristos #define FT32_LINK_SIZE(inst) ((inst) & 0xffff)
104ed8eb4c2Schristos 
1054e00368fSchristos #define FT32_FLD_R_D_POST (1 << 17)
1064e00368fSchristos #define FT32_FLD_R_1_POST (1 << 18)
1077f2ac410Schristos 
1087f2ac410Schristos static const unsigned int sc_form_0[] = {
1097f2ac410Schristos 0x44000000, 0x44000002, 0x44000004, 0x44000005, 0x4400000b,
1107f2ac410Schristos 0x44000010, 0x44000012, 0x44000014, 0x44000015, 0x44000018,
1117f2ac410Schristos 0x4400001b, 0x44000020, 0x44000022, 0x44000024, 0x44000025,
1127f2ac410Schristos 0x4400002b, 0x44000030, 0x44000032, 0x44000034, 0x44000035,
1137f2ac410Schristos 0x4400003b, 0x44000040, 0x44000042, 0x44000044, 0x44000045,
1147f2ac410Schristos 0x4400004b, 0x44000050, 0x44000060, 0x44000062, 0x44000065,
1157f2ac410Schristos 0x44000070, 0x44000072, 0x44000075, 0x44000080, 0x44000082,
1167f2ac410Schristos 0x44000090, 0x44000092, 0x440000a0, 0x440000a2, 0x440000b0,
1177f2ac410Schristos 0x440000d0, 0x440000d2, 0x440000d5, 0x440000e0, 0x440000e2,
1187f2ac410Schristos 0x440000f0, 0x440000f2, 0x440000f5, 0x44000100, 0x44000102,
1197f2ac410Schristos 0x44000110, 0x44000120, 0x44000122, 0x44000130, 0x44000140,
1207f2ac410Schristos 0x44000170, 0x44000180, 0x44000190, 0x440001a0, 0x440001b0,
1217f2ac410Schristos 0x440001e0, 0x440001f0, 0x44004000, 0x44004003, 0x4400400c,
1227f2ac410Schristos 0x4400400d, 0x44004010, 0x44004011, 0x44004013, 0x44004014,
1237f2ac410Schristos 0x44004016, 0x44004019, 0x4400401a, 0x44004020, 0x44004021,
1247f2ac410Schristos 0x44004028, 0x4400402a, 0x44004034, 0x44004038, 0x44004039,
1257f2ac410Schristos 0x44004040, 0x44004048, 0x44004058, 0x44004064, 0x44004074,
1267f2ac410Schristos 0x44004080, 0x44004081, 0x44004088, 0x44004089, 0x44004098,
1277f2ac410Schristos 0x440040c0, 0x440040ca, 0x440040f4, 0x44004100, 0x44004108,
1287f2ac410Schristos 0x44004109, 0x4400410a, 0x4400410b, 0x44004180, 0x44004182,
1297f2ac410Schristos 0x440041c0, 0x440041c2, 0x440041f4, 0x44004200, 0x44004202,
1307f2ac410Schristos 0x4400420b, 0x4400421b, 0x4400422b, 0x44004240, 0x44004242,
1317f2ac410Schristos 0x4400424b, 0x4400425b, 0x4400426b, 0x4400427b, 0x44004280,
1327f2ac410Schristos 0x44004282, 0x440042ab, 0x440042bb, 0x440042c0, 0x440042c2,
1337f2ac410Schristos 0x44004300, 0x44004340, 0x440043c3, 0x4400440b, 0x44004543,
1347f2ac410Schristos 0x44004553, 0x440047f4, 0x44004800, 0x44004980, 0x44004a0b,
1357f2ac410Schristos 0x44004a80, 0x44004dc0, 0x44004ff4, 0x44005003, 0x44005353,
1367f2ac410Schristos 0x4400537b, 0x440053e3, 0x44005700, 0x4400594b, 0x4400620b,
1377f2ac410Schristos 0x4400621b, 0x4400622b, 0x4400623b, 0x4400624b, 0x4400625b,
1387f2ac410Schristos 0x4400626b, 0x4400627b, 0x4400628b, 0x4400629b, 0x440062bb,
1397f2ac410Schristos 0x440062fb, 0x4400633b, 0x4400637b, 0x44006383, 0x44007f00,
1407f2ac410Schristos 0x44007f80, 0x44007fc0, 0x44007fe0, 0x44007ff0, 0x44007ff3, 0x44007ff6
1417f2ac410Schristos };
1427f2ac410Schristos static const unsigned int sc_form_1[] = {
1437f2ac410Schristos 0x44000002, 0x44008002, 0x44010002, 0x44010008, 0x44018002,
1447f2ac410Schristos 0x44020002, 0x44030002, 0x44038002
1457f2ac410Schristos };
1467f2ac410Schristos static const unsigned int sc_form_2[] = {
1477f2ac410Schristos 0x59e04002, 0x59e04012, 0x59e04022, 0x59e04032, 0x59e04042,
1487f2ac410Schristos 0x59e04052, 0x59e04072, 0x59e04082, 0x59e07ff2, 0x5de00002,
1497f2ac410Schristos 0x5de00012, 0x5de00022, 0x5de00032, 0x5de00042, 0x5de00052,
1507f2ac410Schristos 0x5de00062, 0x5de00072, 0x5de00082, 0x5de000a2, 0x5de000d2,
1517f2ac410Schristos 0x5de000e2, 0x5de000f2, 0x5de00102, 0x5de00112, 0x5de00122,
1527f2ac410Schristos 0x5de00132, 0x5de00172, 0x5de04002, 0x5de04012, 0x5de04022,
1537f2ac410Schristos 0x5de04032, 0x5de04042, 0x5de04052, 0x5de04062, 0x5de04072,
1547f2ac410Schristos 0x5de04082, 0x5de04092, 0x5de040f2, 0x5de04102, 0x5de04112,
1557f2ac410Schristos 0x5de04142, 0x5de04162, 0x5de041b2, 0x5de041f2, 0x5de04202,
1567f2ac410Schristos 0x5de0420c, 0x5de0421c, 0x5de0422c, 0x5de0423c, 0x5de04242,
1577f2ac410Schristos 0x5de0424c, 0x5de0425c, 0x5de0426c, 0x5de0427c, 0x5de0428c,
1587f2ac410Schristos 0x5de0429c, 0x5de042ac, 0x5de042cc, 0x5de042dc, 0x5de042ec,
1597f2ac410Schristos 0x5de042fc, 0x5de0430c, 0x5de0431c, 0x5de0433c, 0x5de0436c,
1607f2ac410Schristos 0x5de0437c, 0x5de04382, 0x5de043ac, 0x5de043bc, 0x5de043cc,
1617f2ac410Schristos 0x5de043dc, 0x5de04ff2, 0x5de07ff2, 0x84000000
1627f2ac410Schristos };
1637f2ac410Schristos static const unsigned int sc_form_3[] = {
1647f2ac410Schristos 0x44000010, 0x44000024, 0x44000025, 0x44000030, 0x44000034,
1657f2ac410Schristos 0x44004000, 0x4400400c, 0x4400400d, 0x44004010, 0x44004014,
1667f2ac410Schristos 0x44004028, 0x44004038, 0x44004040, 0x440040ca, 0x44004109,
1677f2ac410Schristos 0x44004880, 0x44004ac0, 0x44004e00, 0x44004e80, 0x44004ff4,
1687f2ac410Schristos 0x4400500c, 0x44005200, 0x44005680, 0x44005700, 0x4400620b,
1697f2ac410Schristos 0x44007f80, 0x44008020, 0x44008024, 0x4400c000, 0x4400c00c,
1707f2ac410Schristos 0x4400c00d, 0x4400c010, 0x4400c028, 0x4400c038, 0x4400c1f9,
1717f2ac410Schristos 0x4400cff4, 0x4400d00c, 0x4400d173, 0x4400ff80, 0x4400fff0,
1727f2ac410Schristos 0x44010030, 0x44014000, 0x4401400c, 0x4401400d, 0x44014010,
1737f2ac410Schristos 0x44014028, 0x44014074, 0x44014080, 0x440143f3, 0x44014ff4,
1747f2ac410Schristos 0x4401500c, 0x44015743, 0x44017ff0, 0x44018030, 0x4401c000,
1757f2ac410Schristos 0x4401c00c, 0x4401c010, 0x4401cff4, 0x4401d00c, 0x44020100,
1767f2ac410Schristos 0x44024000, 0x44024014, 0x44027f80, 0x4402c000, 0x44030085,
1777f2ac410Schristos 0x44034000, 0x44034109, 0x4403c000, 0x44044000, 0x44044109,
1787f2ac410Schristos 0x4404410b, 0x4404c000, 0x440680e0, 0x4406c000, 0x4406c040,
1797f2ac410Schristos 0x4406c080, 0x4406c0c0, 0x4406c300, 0x4406c3c0, 0x4406c900,
1807f2ac410Schristos 0x4406cac0, 0x4406cb40, 0x4406cbc0, 0x4406ce80, 0x4406d5c0,
1817f2ac410Schristos 0x4406d680, 0x4406d700, 0x4406d740, 0x4406d780, 0x4406dfc0,
1827f2ac410Schristos 0x44074000, 0x44074010, 0x44074e80, 0x4407c000, 0x4407c00d,
1837f2ac410Schristos 0x4407c074, 0x44084000, 0x4408c000, 0x44094000, 0x4409c000,
1847f2ac410Schristos 0x440a4000, 0x440ac000, 0x440b4000, 0x440bc000, 0x440c4000,
1857f2ac410Schristos 0x440c4040, 0x440cc000, 0x440d4000, 0x440dc000, 0x440ef340,
1867f2ac410Schristos 0x440ef400, 0x440ef440, 0x440ef4c0, 0x440ef540, 0x440ef5c0,
1877f2ac410Schristos 0x440ef6b0, 0x440ef700, 0x440ef780, 0x440ef8c0, 0x440f420d,
1887f2ac410Schristos 0x440f421d, 0x440f426d, 0x440fc180, 0x440fc1a0, 0x440fc1b0,
1897f2ac410Schristos 0x440fc1c0, 0x440fc200, 0x440fc240, 0x440fc280, 0x440fc380,
1907f2ac410Schristos 0x440fc840, 0x440fc8c0, 0x440fc900, 0x440fc980, 0x440fcd80,
1917f2ac410Schristos 0x64000000, 0x64000001, 0x64000002, 0x64000003, 0x64000004,
1927f2ac410Schristos 0x64000005, 0x64000006, 0x64000007, 0x64000008, 0x64000009,
1937f2ac410Schristos 0x6400000a, 0x6400000b, 0x6400000c, 0x6400000d, 0x6400000e,
1947f2ac410Schristos 0x6400000f, 0x64000010, 0x64000011, 0x64000012, 0x64000013,
1957f2ac410Schristos 0x64000014, 0x64000015, 0x64000017, 0x64000018, 0x64000019,
1967f2ac410Schristos 0x6400001a, 0x6400001d, 0x64000020, 0x64000023, 0x64000024,
1977f2ac410Schristos 0x64000027, 0x6400002b, 0x6400002c, 0x6400002d, 0x64000030,
1987f2ac410Schristos 0x64000035, 0x6400003c, 0x64000040, 0x64000048, 0x64000064,
1997f2ac410Schristos 0x6400006c, 0x64000080, 0x640000ff, 0x64000100, 0x640001b0,
2007f2ac410Schristos 0x640001b8, 0x64000200, 0x64000218, 0x64000240, 0x6400024c,
2017f2ac410Schristos 0x64000250, 0x640003e8, 0x64000400, 0x64000409, 0x64000554,
2027f2ac410Schristos 0x64000600, 0x64000690, 0x64000730, 0x640007ff, 0x64000800,
2037f2ac410Schristos 0x64000900, 0x64000fff, 0x64001000, 0x6400182c, 0x64001b70,
2047f2ac410Schristos 0x64001c1c, 0x64001c24, 0x64001fff, 0x64002000, 0x64003598,
2057f2ac410Schristos 0x640036ec, 0x64003fff, 0x640052c0, 0x640054e4, 0x64005a3c,
2067f2ac410Schristos 0x64005fa4, 0x64006468, 0x64006718, 0x64008000, 0x6400c000,
2077f2ac410Schristos 0x6400ffff, 0x64010000, 0x64010008, 0x640102a0, 0x64014515,
2087f2ac410Schristos 0x64040000, 0x64050000, 0x6407c000, 0x640ff800, 0x640ffc00,
2097f2ac410Schristos 0x640ffc01, 0x640ffc02, 0x640fffff, 0x8c000000, 0x94000000,
2107f2ac410Schristos 0x94000018, 0x9400001c, 0x94000020, 0x98000000, 0xa0000000,
2117f2ac410Schristos 0xa8000000, 0xa8000001, 0xa8000002, 0xa8000003, 0xa8008000,
2127f2ac410Schristos 0xa8008002, 0xa8010000, 0xa8018000, 0xa8020000, 0xa8068000,
2137f2ac410Schristos 0xa8068005, 0xa8068006, 0xa8068007, 0xa806800f, 0xa8068040,
2147f2ac410Schristos 0xa8068043, 0xa8068054, 0xa8070000, 0xa8078000, 0xa8080000,
2157f2ac410Schristos 0xa8090000, 0xa80b0000, 0xa80f801b, 0xaa000000, 0xaa008000,
2167f2ac410Schristos 0xaa008002, 0xaa00800c, 0xaa010000, 0xaa068000, 0xaa068002,
2177f2ac410Schristos 0xaa068004, 0xaa068006, 0xaa068008, 0xaa06800a, 0xaa06800c,
2187f2ac410Schristos 0xaa068024, 0xaa070000, 0xaa070002, 0xaa07000c, 0xaa078000,
2197f2ac410Schristos 0xaa078002, 0xac000000, 0xac000004, 0xac000008, 0xac00000c,
2207f2ac410Schristos 0xac000010, 0xac000014, 0xac000018, 0xac00001c, 0xac000020,
2217f2ac410Schristos 0xac000024, 0xac000028, 0xac00002c, 0xac000030, 0xac000038,
2227f2ac410Schristos 0xac00003c, 0xac000040, 0xac000044, 0xac000058, 0xac00006c,
2237f2ac410Schristos 0xac008000, 0xac008004, 0xac008008, 0xac00800c, 0xac008010,
2247f2ac410Schristos 0xac008018, 0xac008020, 0xac008024, 0xac008028, 0xac008030,
2257f2ac410Schristos 0xac008034, 0xac008038, 0xac00803c, 0xac008044, 0xac008070,
2267f2ac410Schristos 0xac008078, 0xac010000, 0xac010004, 0xac010008, 0xac01000c,
2277f2ac410Schristos 0xac010010, 0xac01002c, 0xac018000, 0xac018004, 0xac018008,
2287f2ac410Schristos 0xac020000, 0xac020004, 0xac020008, 0xac028000, 0xac030000,
2297f2ac410Schristos 0xac038000, 0xac048000, 0xac050000, 0xac068000, 0xac068004,
2307f2ac410Schristos 0xac068008, 0xac06800c, 0xac068010, 0xac068014, 0xac068018,
2317f2ac410Schristos 0xac06801c, 0xac068020, 0xac068024, 0xac068028, 0xac06802c,
2327f2ac410Schristos 0xac068030, 0xac068034, 0xac068038, 0xac06803c, 0xac068040,
2337f2ac410Schristos 0xac068044, 0xac068048, 0xac06804c, 0xac068050, 0xac068058,
2347f2ac410Schristos 0xac070000, 0xac070004, 0xac070008, 0xac07000c, 0xac070010,
2357f2ac410Schristos 0xac070014, 0xac070018, 0xac07001c, 0xac070024, 0xac070028,
2367f2ac410Schristos 0xac07002c, 0xac070038, 0xac07003c, 0xac070040, 0xac070044,
2377f2ac410Schristos 0xac070048, 0xac07004c, 0xac070054, 0xac078000, 0xac078004,
2387f2ac410Schristos 0xac078008, 0xac07800c, 0xac078024, 0xac07803c, 0xac080000,
2397f2ac410Schristos 0xac080004, 0xac080008, 0xac08003c, 0xac088000, 0xac088004,
2407f2ac410Schristos 0xac088008, 0xac08800c, 0xac090000, 0xac098000, 0xac0a0000,
2417f2ac410Schristos 0xac0a0004, 0xac0a8000, 0xac0b0000, 0xac0c0000, 0xac0d8004,
2427f2ac410Schristos 0xac0d8008, 0xac0e8090, 0xac0e8094, 0xac0e80fc, 0xac0f8018,
2437f2ac410Schristos 0xac0f801c, 0xac0f8020, 0xac0f8024, 0xac0f8028, 0xac0f802c,
2447f2ac410Schristos 0xac0f8030, 0xac0f8034, 0xac0f8038, 0xac0f803c, 0xac0f8040,
2457f2ac410Schristos 0xac0f8044, 0xac0f8048, 0xac0f804c, 0xac0f8050, 0xac0f8054,
2467f2ac410Schristos 0xac0f8058, 0xb0000000, 0xb0000006, 0xb0000009, 0xb0000018,
2477f2ac410Schristos 0xb0000019, 0xb000001b, 0xb0008000, 0xb0010000, 0xb0018000,
2487f2ac410Schristos 0xb0018087, 0xb0020000, 0xb0030000, 0xb0070000, 0xb0078000,
2497f2ac410Schristos 0xb0080000, 0xb2000000, 0xb2000006, 0xb200000c, 0xb2008000,
2507f2ac410Schristos 0xb200800c, 0xb2010000, 0xb2018000, 0xb2020000, 0xb2078000,
2517f2ac410Schristos 0xb4000000, 0xb4000004, 0xb4000008, 0xb400000c, 0xb4000010,
2527f2ac410Schristos 0xb4000014, 0xb4000018, 0xb400001c, 0xb4000020, 0xb4000024,
2537f2ac410Schristos 0xb4000028, 0xb400002c, 0xb4000030, 0xb4000034, 0xb4000038,
2547f2ac410Schristos 0xb400003c, 0xb4000040, 0xb4000044, 0xb4000048, 0xb4000050,
2557f2ac410Schristos 0xb4000054, 0xb400006c, 0xb4008000, 0xb4008004, 0xb4008008,
2567f2ac410Schristos 0xb400800c, 0xb4008010, 0xb4008014, 0xb4008018, 0xb400801c,
2577f2ac410Schristos 0xb4008020, 0xb4008024, 0xb4008028, 0xb400802c, 0xb4008034,
2587f2ac410Schristos 0xb4008038, 0xb4008040, 0xb4008044, 0xb400806c, 0xb4008070,
2597f2ac410Schristos 0xb4010000, 0xb4010004, 0xb4010008, 0xb401000c, 0xb4010010,
2607f2ac410Schristos 0xb4010018, 0xb401001c, 0xb4010020, 0xb4010024, 0xb4010028,
2617f2ac410Schristos 0xb401002c, 0xb4018000, 0xb4018004, 0xb4018008, 0xb4018018,
2627f2ac410Schristos 0xb401801c, 0xb4020000, 0xb4020004, 0xb4020008, 0xb402000c,
2637f2ac410Schristos 0xb4020018, 0xb4028000, 0xb4028018, 0xb4030000, 0xb4030008,
2647f2ac410Schristos 0xb4030018, 0xb4038000, 0xb4068000, 0xb4068004, 0xb4068008,
2657f2ac410Schristos 0xb406800c, 0xb4068018, 0xb406801c, 0xb4068020, 0xb4068024,
2667f2ac410Schristos 0xb4068028, 0xb4070000, 0xb4070004, 0xb4070008, 0xb4070010,
2677f2ac410Schristos 0xb4070018, 0xb4070024, 0xb4070028, 0xb4078000, 0xb4078024,
2687f2ac410Schristos 0xb4080000, 0xb4080004, 0xb4090000, 0xb4098000, 0xb40c8000
2697f2ac410Schristos };
2707f2ac410Schristos 
2717f2ac410Schristos #define N_SC_FORM0  (sizeof (sc_form_0) / sizeof (unsigned int))
2727f2ac410Schristos #define N_SC_FORM1  (sizeof (sc_form_1) / sizeof (unsigned int))
2737f2ac410Schristos #define N_SC_FORM2  (sizeof (sc_form_2) / sizeof (unsigned int))
2747f2ac410Schristos #define N_SC_FORM3  (sizeof (sc_form_3) / sizeof (unsigned int))
2757f2ac410Schristos 
2767f2ac410Schristos static int
2777f2ac410Schristos sc_compar (const void *va, const void *vb)
2787f2ac410Schristos {
2797f2ac410Schristos   const unsigned int *a = (unsigned int *) va;
2807f2ac410Schristos   const unsigned int *b = (unsigned int *) vb;
2817f2ac410Schristos   return (*a - *b);
2827f2ac410Schristos }
2837f2ac410Schristos 
2847f2ac410Schristos static int ATTRIBUTE_UNUSED
2857f2ac410Schristos ft32_shortcode (unsigned int op32, unsigned int *sc)
2867f2ac410Schristos {
2877f2ac410Schristos   unsigned int Rd_mask = 31 << 20;
2887f2ac410Schristos   unsigned int R1_mask = 31 << 15;
2897f2ac410Schristos   unsigned int R2_mask = 2047 << 4;
2907f2ac410Schristos   unsigned int Rd = (op32 >> 20) & 31;
2917f2ac410Schristos   unsigned int R1 = (op32 >> 15) & 31;
2927f2ac410Schristos   unsigned int R2 = (op32 >> 4) & 2047;
2937f2ac410Schristos   unsigned int lookup;
2947f2ac410Schristos   unsigned int *find = NULL;
2957f2ac410Schristos   unsigned int code = 0, r = 0;
2967f2ac410Schristos 
2977f2ac410Schristos   /* Form 0 */
2987f2ac410Schristos   if (Rd == R1)
2997f2ac410Schristos     {
3007f2ac410Schristos       lookup = op32 & ~Rd_mask & ~R1_mask;
3017f2ac410Schristos       find = (unsigned int *) bsearch (&lookup, sc_form_0, N_SC_FORM0,
3027f2ac410Schristos 				       sizeof (unsigned int), sc_compar);
3037f2ac410Schristos       code = find - sc_form_0;
3047f2ac410Schristos       r = Rd;
3057f2ac410Schristos     }
3067f2ac410Schristos 
3077f2ac410Schristos   /* Form 1 */
3087f2ac410Schristos   if ((find == NULL) && (Rd == R2))
3097f2ac410Schristos     {
3107f2ac410Schristos       lookup = op32 & ~Rd_mask & ~R2_mask;
3117f2ac410Schristos       find = (unsigned int *) bsearch (&lookup, sc_form_1, N_SC_FORM1,
3127f2ac410Schristos 				       sizeof (unsigned int), sc_compar);
3137f2ac410Schristos       code = find - sc_form_1 + N_SC_FORM0;
3147f2ac410Schristos       r = Rd;
3157f2ac410Schristos     }
3167f2ac410Schristos 
3177f2ac410Schristos   /* Form 2 */
3187f2ac410Schristos   if (find == NULL)
3197f2ac410Schristos     {
3207f2ac410Schristos       lookup = op32 & ~R1_mask;
3217f2ac410Schristos       find = (unsigned int *) bsearch (&lookup, sc_form_2, N_SC_FORM2,
3227f2ac410Schristos 				       sizeof (unsigned int), sc_compar);
3237f2ac410Schristos       code = find - sc_form_2 + (N_SC_FORM0 + N_SC_FORM1);
3247f2ac410Schristos       r = R1;
3257f2ac410Schristos     }
3267f2ac410Schristos 
3277f2ac410Schristos   /* Form 3 */
3287f2ac410Schristos   if (find == NULL)
3297f2ac410Schristos     {
3307f2ac410Schristos       lookup = op32 & ~Rd_mask;
3317f2ac410Schristos       find = (unsigned int *) bsearch (&lookup, sc_form_3, N_SC_FORM3,
3327f2ac410Schristos 				       sizeof (unsigned int), sc_compar);
3337f2ac410Schristos       code = find - sc_form_3 + (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2);
3347f2ac410Schristos       r = Rd;
3357f2ac410Schristos     }
3367f2ac410Schristos 
3377f2ac410Schristos   *sc = (code << 5) | r;
3387f2ac410Schristos 
3397f2ac410Schristos   return (find != NULL);
3407f2ac410Schristos }
3417f2ac410Schristos 
3427f2ac410Schristos static int ATTRIBUTE_UNUSED
3437f2ac410Schristos ft32_split_shortcode (unsigned int op32, unsigned int code15[2])
3447f2ac410Schristos {
3457f2ac410Schristos   int code3;
3467f2ac410Schristos   unsigned int code30;
3477f2ac410Schristos 
3487f2ac410Schristos   switch (op32 >> 27)
3497f2ac410Schristos     {
3507f2ac410Schristos     case 2:
3517f2ac410Schristos       code3 = 0;
3527f2ac410Schristos       break;
3537f2ac410Schristos     case 3:
3547f2ac410Schristos       code3 = 1;
3557f2ac410Schristos       break;
3567f2ac410Schristos     case 4:
3577f2ac410Schristos       code3 = 2;
3587f2ac410Schristos       break;
3597f2ac410Schristos     case 5:
3607f2ac410Schristos       code3 = 3;
3617f2ac410Schristos       break;
3627f2ac410Schristos     case 6:
3637f2ac410Schristos       code3 = 4;
3647f2ac410Schristos       break;
3657f2ac410Schristos     case 9:
3667f2ac410Schristos       code3 = 5;
3677f2ac410Schristos       break;
3687f2ac410Schristos     case 10:
3697f2ac410Schristos       code3 = 6;
3707f2ac410Schristos       break;
3717f2ac410Schristos     case 14:
3727f2ac410Schristos       code3 = 7;
3737f2ac410Schristos       break;
3747f2ac410Schristos     default:
3757f2ac410Schristos       code3 = -1;
3767f2ac410Schristos       break;
3777f2ac410Schristos     }
3787f2ac410Schristos 
3797f2ac410Schristos   if (code3 == -1)
3807f2ac410Schristos     {
3817f2ac410Schristos       code15[0] = 0;
3827f2ac410Schristos       code15[1] = 0;
3837f2ac410Schristos       return 0;
3847f2ac410Schristos     }
3857f2ac410Schristos   else
3867f2ac410Schristos     {
3877f2ac410Schristos       code30 = ((op32 & 0x07ffffff) << 3) | code3;
3887f2ac410Schristos       code15[0] = code30 & 0x7fff;
3897f2ac410Schristos       code15[1] = (code30 >> 15) & 0x7fff;
3907f2ac410Schristos       return 1;
3917f2ac410Schristos     }
3927f2ac410Schristos }
3937f2ac410Schristos 
3947f2ac410Schristos static unsigned int ATTRIBUTE_UNUSED
3957f2ac410Schristos ft32_merge_shortcode (unsigned int code15[2])
3967f2ac410Schristos {
3977f2ac410Schristos   static const unsigned char pat3[] = { 2, 3, 4, 5, 6, 9, 10, 14 };
3987f2ac410Schristos 
3997f2ac410Schristos   unsigned int code30 = (code15[1] << 15) | code15[0];
4007f2ac410Schristos   unsigned int code27 = code30 >> 3;
4017f2ac410Schristos   unsigned int code3 = code30 & 7;
4027f2ac410Schristos   unsigned int pattern = pat3[code3];
4037f2ac410Schristos   return (pattern << 27) | code27;
4047f2ac410Schristos }
4057f2ac410Schristos 
4067f2ac410Schristos static int ATTRIBUTE_UNUSED
4077f2ac410Schristos ft32_decode_shortcode (unsigned int pc, unsigned int op32, unsigned int *sc)
4087f2ac410Schristos {
4097f2ac410Schristos   int code3;
4107f2ac410Schristos   unsigned int code30;
4117f2ac410Schristos   unsigned int code15[2];
4127f2ac410Schristos   size_t i;
4137f2ac410Schristos 
4147f2ac410Schristos   switch (op32 >> 27)
4157f2ac410Schristos     {
4167f2ac410Schristos     case 2:
4177f2ac410Schristos       code3 = 0;
4187f2ac410Schristos       break;
4197f2ac410Schristos     case 3:
4207f2ac410Schristos       code3 = 1;
4217f2ac410Schristos       break;
4227f2ac410Schristos     case 4:
4237f2ac410Schristos       code3 = 2;
4247f2ac410Schristos       break;
4257f2ac410Schristos     case 5:
4267f2ac410Schristos       code3 = 3;
4277f2ac410Schristos       break;
4287f2ac410Schristos     case 6:
4297f2ac410Schristos       code3 = 4;
4307f2ac410Schristos       break;
4317f2ac410Schristos     case 9:
4327f2ac410Schristos       code3 = 5;
4337f2ac410Schristos       break;
4347f2ac410Schristos     case 10:
4357f2ac410Schristos       code3 = 6;
4367f2ac410Schristos       break;
4377f2ac410Schristos     case 14:
4387f2ac410Schristos       code3 = 7;
4397f2ac410Schristos       break;
4407f2ac410Schristos     default:
4417f2ac410Schristos       code3 = -1;
4427f2ac410Schristos       break;
4437f2ac410Schristos     }
4447f2ac410Schristos 
4457f2ac410Schristos   if (code3 == -1)
4467f2ac410Schristos     return 0;
4477f2ac410Schristos   else
4487f2ac410Schristos     {
4497f2ac410Schristos       code30 = ((op32 & 0x07ffffff) << 3) | code3;
4507f2ac410Schristos       code15[0] = code30 & 0x7fff;
4517f2ac410Schristos       code15[1] = (code30 >> 15) & 0x7fff;
4527f2ac410Schristos       for (i = 0; i < 2; i++)
4537f2ac410Schristos 	{
4547f2ac410Schristos 	  unsigned int code = code15[i] >> 5;
4557f2ac410Schristos 	  unsigned int r = code15[i] & 0x1f;
4567f2ac410Schristos 
4577f2ac410Schristos 	  if (code < 768)
4587f2ac410Schristos 	    {
4597f2ac410Schristos 	      if (code < N_SC_FORM0)
4607f2ac410Schristos 		sc[i] = sc_form_0[code] | (r << 20) | (r << 15);
4617f2ac410Schristos 	      else if (code < (N_SC_FORM0 + N_SC_FORM1))
4627f2ac410Schristos 		sc[i] = sc_form_1[code - N_SC_FORM0] | (r << 20) | (r << 4);
4637f2ac410Schristos 	      else if (code < (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2))
4647f2ac410Schristos 		sc[i] = sc_form_2[code - (N_SC_FORM0 + N_SC_FORM1)]
4657f2ac410Schristos 		  | (r << 15);
4667f2ac410Schristos 	      else
4677f2ac410Schristos 		sc[i] = sc_form_3[code -
4687f2ac410Schristos 				  (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2)]
4697f2ac410Schristos 		  | (r << 20);
4707f2ac410Schristos 	    }
4717f2ac410Schristos 	  else
4727f2ac410Schristos 	    {
4737f2ac410Schristos 	      int jtype = (code15[i] >> 9) & 15;
4747f2ac410Schristos 	      int offset = code15[i] & 511;
4757f2ac410Schristos 	      if (offset & 256)
4767f2ac410Schristos 		offset -= 512;
4777f2ac410Schristos 	      if (jtype < 14)
4787f2ac410Schristos 		sc[i] =
4797f2ac410Schristos 		  0x00200000 | ((jtype >> 1) << 22) | ((jtype & 1) << 19);
4807f2ac410Schristos 	      else if (jtype == 14)
4817f2ac410Schristos 		sc[i] = 0x00300000;
4827f2ac410Schristos 	      else
4837f2ac410Schristos 		sc[i] = 0x00340000;
4847f2ac410Schristos 	      sc[i] |= ((pc >> 2) + offset);
4857f2ac410Schristos 	    }
4867f2ac410Schristos 	}
4877f2ac410Schristos       return 1;
4887f2ac410Schristos     }
4897f2ac410Schristos }
490