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