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