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