]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - include/opcode/ft32.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / include / opcode / ft32.h
CommitLineData
3f8107ab 1/* Definitions for decoding the ft32 opcode table.
250d07de 2 Copyright (C) 2013-2021 Free Software Foundation, Inc.
3f8107ab
AM
3 Contributed by FTDI (support@ftdichip.com)
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation; either version 2 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
1802110-1301, USA. */
19
20typedef struct ft32_opc_info_t
21{
22 const char *name;
23 int dw;
24 unsigned int mask;
25 unsigned int bits;
26 int fields;
27} ft32_opc_info_t;
28
29#define FT32_PAT_ALUOP 0x08
30#define FT32_PAT_LDA 0x18
31#define FT32_PAT_TOCI 0x01
32#define FT32_PAT_CMPOP 0x0b
33#define FT32_PAT_STA 0x17
34#define FT32_PAT_EXA 0x07
35#define FT32_PAT_LDK 0x0c
36#define FT32_PAT_FFUOP 0x1e
37#define FT32_PAT_LDI 0x15
38#define FT32_PAT_STI 0x16
39#define FT32_PAT_EXI 0x1d
40#define FT32_PAT_POP 0x11
41#define FT32_PAT_LPM 0x0d
42#define FT32_PAT_LINK 0x12
43#define FT32_PAT_TOC 0x00
44#define FT32_PAT_PUSH 0x10
45#define FT32_PAT_RETURN 0x14
46#define FT32_PAT_UNLINK 0x13
47#define FT32_PAT_LPMI 0x19
48
49#define FT32_FLD_CBCRCV (1 << 0)
50#define FT32_FLD_INT (1 << 1)
51#define FT32_FLD_INT_BIT 26
52#define FT32_FLD_INT_SIZ 1
53#define FT32_FLD_DW (1 << 2)
54#define FT32_FLD_DW_BIT 25
55#define FT32_FLD_DW_SIZ 2
56#define FT32_FLD_CB (1 << 3)
57#define FT32_FLD_CB_BIT 22
58#define FT32_FLD_CB_SIZ 5
59#define FT32_FLD_R_D (1 << 4)
60#define FT32_FLD_R_D_BIT 20
61#define FT32_FLD_R_D_SIZ 5
62#define FT32_FLD_CR (1 << 5)
63#define FT32_FLD_CR_BIT 20
64#define FT32_FLD_CR_SIZ 2
65#define FT32_FLD_CV (1 << 6)
66#define FT32_FLD_CV_BIT 19
67#define FT32_FLD_CV_SIZ 1
68#define FT32_FLD_BT (1 << 7)
69#define FT32_FLD_BT_BIT 18
70#define FT32_FLD_BT_SIZ 1
71#define FT32_FLD_R_1 (1 << 8)
72#define FT32_FLD_R_1_BIT 15
73#define FT32_FLD_R_1_SIZ 5
74#define FT32_FLD_RIMM (1 << 9)
75#define FT32_FLD_RIMM_BIT 4
76#define FT32_FLD_RIMM_SIZ 11
77#define FT32_FLD_R_2 (1 << 10)
78#define FT32_FLD_R_2_BIT 4
79#define FT32_FLD_R_2_SIZ 5
80#define FT32_FLD_K20 (1 << 11)
81#define FT32_FLD_K20_BIT 0
82#define FT32_FLD_K20_SIZ 20
83#define FT32_FLD_PA (1 << 12)
84#define FT32_FLD_PA_BIT 0
85#define FT32_FLD_PA_SIZ 18
86#define FT32_FLD_AA (1 << 13)
87#define FT32_FLD_AA_BIT 0
88#define FT32_FLD_AA_SIZ 17
89#define FT32_FLD_K16 (1 << 14)
90#define FT32_FLD_K16_BIT 0
91#define FT32_FLD_K16_SIZ 16
3b4b0a62
JB
92#define FT32_FLD_K15 (1 << 15)
93#define FT32_FLD_K15_BIT 0
94#define FT32_FLD_K15_SIZ 15
3f8107ab
AM
95#define FT32_FLD_AL (1 << 16)
96#define FT32_FLD_AL_BIT 0
97#define FT32_FLD_AL_SIZ 4
98
71f4ed30 99#define FT32_IS_CALL(inst) (((inst) & 0xfffc0000) == 0x00340000)
100#define FT32_IS_PUSH(inst) (((inst) & 0xfff00000) == 0x84000000)
101#define FT32_PUSH_REG(inst) (((inst) >> 15) & 0x1f)
102#define FT32_IS_LINK(inst) (((inst) & 0xffff0000) == 0x95d00000)
103#define FT32_LINK_SIZE(inst) ((inst) & 0xffff)
104
3f8107ab
AM
105#define FT32_FLD_R_D_POST (1 << 17)
106#define FT32_FLD_R_1_POST (1 << 18)
3b4b0a62
JB
107
108static const unsigned int sc_form_0[] = {
1090x44000000, 0x44000002, 0x44000004, 0x44000005, 0x4400000b,
1100x44000010, 0x44000012, 0x44000014, 0x44000015, 0x44000018,
1110x4400001b, 0x44000020, 0x44000022, 0x44000024, 0x44000025,
1120x4400002b, 0x44000030, 0x44000032, 0x44000034, 0x44000035,
1130x4400003b, 0x44000040, 0x44000042, 0x44000044, 0x44000045,
1140x4400004b, 0x44000050, 0x44000060, 0x44000062, 0x44000065,
1150x44000070, 0x44000072, 0x44000075, 0x44000080, 0x44000082,
1160x44000090, 0x44000092, 0x440000a0, 0x440000a2, 0x440000b0,
1170x440000d0, 0x440000d2, 0x440000d5, 0x440000e0, 0x440000e2,
1180x440000f0, 0x440000f2, 0x440000f5, 0x44000100, 0x44000102,
1190x44000110, 0x44000120, 0x44000122, 0x44000130, 0x44000140,
1200x44000170, 0x44000180, 0x44000190, 0x440001a0, 0x440001b0,
1210x440001e0, 0x440001f0, 0x44004000, 0x44004003, 0x4400400c,
1220x4400400d, 0x44004010, 0x44004011, 0x44004013, 0x44004014,
1230x44004016, 0x44004019, 0x4400401a, 0x44004020, 0x44004021,
1240x44004028, 0x4400402a, 0x44004034, 0x44004038, 0x44004039,
1250x44004040, 0x44004048, 0x44004058, 0x44004064, 0x44004074,
1260x44004080, 0x44004081, 0x44004088, 0x44004089, 0x44004098,
1270x440040c0, 0x440040ca, 0x440040f4, 0x44004100, 0x44004108,
1280x44004109, 0x4400410a, 0x4400410b, 0x44004180, 0x44004182,
1290x440041c0, 0x440041c2, 0x440041f4, 0x44004200, 0x44004202,
1300x4400420b, 0x4400421b, 0x4400422b, 0x44004240, 0x44004242,
1310x4400424b, 0x4400425b, 0x4400426b, 0x4400427b, 0x44004280,
1320x44004282, 0x440042ab, 0x440042bb, 0x440042c0, 0x440042c2,
1330x44004300, 0x44004340, 0x440043c3, 0x4400440b, 0x44004543,
1340x44004553, 0x440047f4, 0x44004800, 0x44004980, 0x44004a0b,
1350x44004a80, 0x44004dc0, 0x44004ff4, 0x44005003, 0x44005353,
1360x4400537b, 0x440053e3, 0x44005700, 0x4400594b, 0x4400620b,
1370x4400621b, 0x4400622b, 0x4400623b, 0x4400624b, 0x4400625b,
1380x4400626b, 0x4400627b, 0x4400628b, 0x4400629b, 0x440062bb,
1390x440062fb, 0x4400633b, 0x4400637b, 0x44006383, 0x44007f00,
1400x44007f80, 0x44007fc0, 0x44007fe0, 0x44007ff0, 0x44007ff3, 0x44007ff6
141};
142static const unsigned int sc_form_1[] = {
1430x44000002, 0x44008002, 0x44010002, 0x44010008, 0x44018002,
1440x44020002, 0x44030002, 0x44038002
145};
146static const unsigned int sc_form_2[] = {
1470x59e04002, 0x59e04012, 0x59e04022, 0x59e04032, 0x59e04042,
1480x59e04052, 0x59e04072, 0x59e04082, 0x59e07ff2, 0x5de00002,
1490x5de00012, 0x5de00022, 0x5de00032, 0x5de00042, 0x5de00052,
1500x5de00062, 0x5de00072, 0x5de00082, 0x5de000a2, 0x5de000d2,
1510x5de000e2, 0x5de000f2, 0x5de00102, 0x5de00112, 0x5de00122,
1520x5de00132, 0x5de00172, 0x5de04002, 0x5de04012, 0x5de04022,
1530x5de04032, 0x5de04042, 0x5de04052, 0x5de04062, 0x5de04072,
1540x5de04082, 0x5de04092, 0x5de040f2, 0x5de04102, 0x5de04112,
1550x5de04142, 0x5de04162, 0x5de041b2, 0x5de041f2, 0x5de04202,
1560x5de0420c, 0x5de0421c, 0x5de0422c, 0x5de0423c, 0x5de04242,
1570x5de0424c, 0x5de0425c, 0x5de0426c, 0x5de0427c, 0x5de0428c,
1580x5de0429c, 0x5de042ac, 0x5de042cc, 0x5de042dc, 0x5de042ec,
1590x5de042fc, 0x5de0430c, 0x5de0431c, 0x5de0433c, 0x5de0436c,
1600x5de0437c, 0x5de04382, 0x5de043ac, 0x5de043bc, 0x5de043cc,
1610x5de043dc, 0x5de04ff2, 0x5de07ff2, 0x84000000
162};
163static const unsigned int sc_form_3[] = {
1640x44000010, 0x44000024, 0x44000025, 0x44000030, 0x44000034,
1650x44004000, 0x4400400c, 0x4400400d, 0x44004010, 0x44004014,
1660x44004028, 0x44004038, 0x44004040, 0x440040ca, 0x44004109,
1670x44004880, 0x44004ac0, 0x44004e00, 0x44004e80, 0x44004ff4,
1680x4400500c, 0x44005200, 0x44005680, 0x44005700, 0x4400620b,
1690x44007f80, 0x44008020, 0x44008024, 0x4400c000, 0x4400c00c,
1700x4400c00d, 0x4400c010, 0x4400c028, 0x4400c038, 0x4400c1f9,
1710x4400cff4, 0x4400d00c, 0x4400d173, 0x4400ff80, 0x4400fff0,
1720x44010030, 0x44014000, 0x4401400c, 0x4401400d, 0x44014010,
1730x44014028, 0x44014074, 0x44014080, 0x440143f3, 0x44014ff4,
1740x4401500c, 0x44015743, 0x44017ff0, 0x44018030, 0x4401c000,
1750x4401c00c, 0x4401c010, 0x4401cff4, 0x4401d00c, 0x44020100,
1760x44024000, 0x44024014, 0x44027f80, 0x4402c000, 0x44030085,
1770x44034000, 0x44034109, 0x4403c000, 0x44044000, 0x44044109,
1780x4404410b, 0x4404c000, 0x440680e0, 0x4406c000, 0x4406c040,
1790x4406c080, 0x4406c0c0, 0x4406c300, 0x4406c3c0, 0x4406c900,
1800x4406cac0, 0x4406cb40, 0x4406cbc0, 0x4406ce80, 0x4406d5c0,
1810x4406d680, 0x4406d700, 0x4406d740, 0x4406d780, 0x4406dfc0,
1820x44074000, 0x44074010, 0x44074e80, 0x4407c000, 0x4407c00d,
1830x4407c074, 0x44084000, 0x4408c000, 0x44094000, 0x4409c000,
1840x440a4000, 0x440ac000, 0x440b4000, 0x440bc000, 0x440c4000,
1850x440c4040, 0x440cc000, 0x440d4000, 0x440dc000, 0x440ef340,
1860x440ef400, 0x440ef440, 0x440ef4c0, 0x440ef540, 0x440ef5c0,
1870x440ef6b0, 0x440ef700, 0x440ef780, 0x440ef8c0, 0x440f420d,
1880x440f421d, 0x440f426d, 0x440fc180, 0x440fc1a0, 0x440fc1b0,
1890x440fc1c0, 0x440fc200, 0x440fc240, 0x440fc280, 0x440fc380,
1900x440fc840, 0x440fc8c0, 0x440fc900, 0x440fc980, 0x440fcd80,
1910x64000000, 0x64000001, 0x64000002, 0x64000003, 0x64000004,
1920x64000005, 0x64000006, 0x64000007, 0x64000008, 0x64000009,
1930x6400000a, 0x6400000b, 0x6400000c, 0x6400000d, 0x6400000e,
1940x6400000f, 0x64000010, 0x64000011, 0x64000012, 0x64000013,
1950x64000014, 0x64000015, 0x64000017, 0x64000018, 0x64000019,
1960x6400001a, 0x6400001d, 0x64000020, 0x64000023, 0x64000024,
1970x64000027, 0x6400002b, 0x6400002c, 0x6400002d, 0x64000030,
1980x64000035, 0x6400003c, 0x64000040, 0x64000048, 0x64000064,
1990x6400006c, 0x64000080, 0x640000ff, 0x64000100, 0x640001b0,
2000x640001b8, 0x64000200, 0x64000218, 0x64000240, 0x6400024c,
2010x64000250, 0x640003e8, 0x64000400, 0x64000409, 0x64000554,
2020x64000600, 0x64000690, 0x64000730, 0x640007ff, 0x64000800,
2030x64000900, 0x64000fff, 0x64001000, 0x6400182c, 0x64001b70,
2040x64001c1c, 0x64001c24, 0x64001fff, 0x64002000, 0x64003598,
2050x640036ec, 0x64003fff, 0x640052c0, 0x640054e4, 0x64005a3c,
2060x64005fa4, 0x64006468, 0x64006718, 0x64008000, 0x6400c000,
2070x6400ffff, 0x64010000, 0x64010008, 0x640102a0, 0x64014515,
2080x64040000, 0x64050000, 0x6407c000, 0x640ff800, 0x640ffc00,
2090x640ffc01, 0x640ffc02, 0x640fffff, 0x8c000000, 0x94000000,
2100x94000018, 0x9400001c, 0x94000020, 0x98000000, 0xa0000000,
2110xa8000000, 0xa8000001, 0xa8000002, 0xa8000003, 0xa8008000,
2120xa8008002, 0xa8010000, 0xa8018000, 0xa8020000, 0xa8068000,
2130xa8068005, 0xa8068006, 0xa8068007, 0xa806800f, 0xa8068040,
2140xa8068043, 0xa8068054, 0xa8070000, 0xa8078000, 0xa8080000,
2150xa8090000, 0xa80b0000, 0xa80f801b, 0xaa000000, 0xaa008000,
2160xaa008002, 0xaa00800c, 0xaa010000, 0xaa068000, 0xaa068002,
2170xaa068004, 0xaa068006, 0xaa068008, 0xaa06800a, 0xaa06800c,
2180xaa068024, 0xaa070000, 0xaa070002, 0xaa07000c, 0xaa078000,
2190xaa078002, 0xac000000, 0xac000004, 0xac000008, 0xac00000c,
2200xac000010, 0xac000014, 0xac000018, 0xac00001c, 0xac000020,
2210xac000024, 0xac000028, 0xac00002c, 0xac000030, 0xac000038,
2220xac00003c, 0xac000040, 0xac000044, 0xac000058, 0xac00006c,
2230xac008000, 0xac008004, 0xac008008, 0xac00800c, 0xac008010,
2240xac008018, 0xac008020, 0xac008024, 0xac008028, 0xac008030,
2250xac008034, 0xac008038, 0xac00803c, 0xac008044, 0xac008070,
2260xac008078, 0xac010000, 0xac010004, 0xac010008, 0xac01000c,
2270xac010010, 0xac01002c, 0xac018000, 0xac018004, 0xac018008,
2280xac020000, 0xac020004, 0xac020008, 0xac028000, 0xac030000,
2290xac038000, 0xac048000, 0xac050000, 0xac068000, 0xac068004,
2300xac068008, 0xac06800c, 0xac068010, 0xac068014, 0xac068018,
2310xac06801c, 0xac068020, 0xac068024, 0xac068028, 0xac06802c,
2320xac068030, 0xac068034, 0xac068038, 0xac06803c, 0xac068040,
2330xac068044, 0xac068048, 0xac06804c, 0xac068050, 0xac068058,
2340xac070000, 0xac070004, 0xac070008, 0xac07000c, 0xac070010,
2350xac070014, 0xac070018, 0xac07001c, 0xac070024, 0xac070028,
2360xac07002c, 0xac070038, 0xac07003c, 0xac070040, 0xac070044,
2370xac070048, 0xac07004c, 0xac070054, 0xac078000, 0xac078004,
2380xac078008, 0xac07800c, 0xac078024, 0xac07803c, 0xac080000,
2390xac080004, 0xac080008, 0xac08003c, 0xac088000, 0xac088004,
2400xac088008, 0xac08800c, 0xac090000, 0xac098000, 0xac0a0000,
2410xac0a0004, 0xac0a8000, 0xac0b0000, 0xac0c0000, 0xac0d8004,
2420xac0d8008, 0xac0e8090, 0xac0e8094, 0xac0e80fc, 0xac0f8018,
2430xac0f801c, 0xac0f8020, 0xac0f8024, 0xac0f8028, 0xac0f802c,
2440xac0f8030, 0xac0f8034, 0xac0f8038, 0xac0f803c, 0xac0f8040,
2450xac0f8044, 0xac0f8048, 0xac0f804c, 0xac0f8050, 0xac0f8054,
2460xac0f8058, 0xb0000000, 0xb0000006, 0xb0000009, 0xb0000018,
2470xb0000019, 0xb000001b, 0xb0008000, 0xb0010000, 0xb0018000,
2480xb0018087, 0xb0020000, 0xb0030000, 0xb0070000, 0xb0078000,
2490xb0080000, 0xb2000000, 0xb2000006, 0xb200000c, 0xb2008000,
2500xb200800c, 0xb2010000, 0xb2018000, 0xb2020000, 0xb2078000,
2510xb4000000, 0xb4000004, 0xb4000008, 0xb400000c, 0xb4000010,
2520xb4000014, 0xb4000018, 0xb400001c, 0xb4000020, 0xb4000024,
2530xb4000028, 0xb400002c, 0xb4000030, 0xb4000034, 0xb4000038,
2540xb400003c, 0xb4000040, 0xb4000044, 0xb4000048, 0xb4000050,
2550xb4000054, 0xb400006c, 0xb4008000, 0xb4008004, 0xb4008008,
2560xb400800c, 0xb4008010, 0xb4008014, 0xb4008018, 0xb400801c,
2570xb4008020, 0xb4008024, 0xb4008028, 0xb400802c, 0xb4008034,
2580xb4008038, 0xb4008040, 0xb4008044, 0xb400806c, 0xb4008070,
2590xb4010000, 0xb4010004, 0xb4010008, 0xb401000c, 0xb4010010,
2600xb4010018, 0xb401001c, 0xb4010020, 0xb4010024, 0xb4010028,
2610xb401002c, 0xb4018000, 0xb4018004, 0xb4018008, 0xb4018018,
2620xb401801c, 0xb4020000, 0xb4020004, 0xb4020008, 0xb402000c,
2630xb4020018, 0xb4028000, 0xb4028018, 0xb4030000, 0xb4030008,
2640xb4030018, 0xb4038000, 0xb4068000, 0xb4068004, 0xb4068008,
2650xb406800c, 0xb4068018, 0xb406801c, 0xb4068020, 0xb4068024,
2660xb4068028, 0xb4070000, 0xb4070004, 0xb4070008, 0xb4070010,
2670xb4070018, 0xb4070024, 0xb4070028, 0xb4078000, 0xb4078024,
2680xb4080000, 0xb4080004, 0xb4090000, 0xb4098000, 0xb40c8000
269};
270
271#define N_SC_FORM0 (sizeof (sc_form_0) / sizeof (unsigned int))
272#define N_SC_FORM1 (sizeof (sc_form_1) / sizeof (unsigned int))
273#define N_SC_FORM2 (sizeof (sc_form_2) / sizeof (unsigned int))
274#define N_SC_FORM3 (sizeof (sc_form_3) / sizeof (unsigned int))
275
276static int
277sc_compar (const void *va, const void *vb)
278{
279 const unsigned int *a = (unsigned int *) va;
280 const unsigned int *b = (unsigned int *) vb;
281 return (*a - *b);
282}
283
284static int ATTRIBUTE_UNUSED
285ft32_shortcode (unsigned int op32, unsigned int *sc)
286{
287 unsigned int Rd_mask = 31 << 20;
288 unsigned int R1_mask = 31 << 15;
289 unsigned int R2_mask = 2047 << 4;
290 unsigned int Rd = (op32 >> 20) & 31;
291 unsigned int R1 = (op32 >> 15) & 31;
292 unsigned int R2 = (op32 >> 4) & 2047;
293 unsigned int lookup;
294 unsigned int *find = NULL;
295 unsigned int code = 0, r = 0;
296
297 /* Form 0 */
298 if (Rd == R1)
299 {
300 lookup = op32 & ~Rd_mask & ~R1_mask;
301 find = (unsigned int *) bsearch (&lookup, sc_form_0, N_SC_FORM0,
302 sizeof (unsigned int), sc_compar);
303 code = find - sc_form_0;
304 r = Rd;
305 }
306
307 /* Form 1 */
308 if ((find == NULL) && (Rd == R2))
309 {
310 lookup = op32 & ~Rd_mask & ~R2_mask;
311 find = (unsigned int *) bsearch (&lookup, sc_form_1, N_SC_FORM1,
312 sizeof (unsigned int), sc_compar);
313 code = find - sc_form_1 + N_SC_FORM0;
314 r = Rd;
315 }
316
317 /* Form 2 */
318 if (find == NULL)
319 {
320 lookup = op32 & ~R1_mask;
321 find = (unsigned int *) bsearch (&lookup, sc_form_2, N_SC_FORM2,
322 sizeof (unsigned int), sc_compar);
323 code = find - sc_form_2 + (N_SC_FORM0 + N_SC_FORM1);
324 r = R1;
325 }
326
327 /* Form 3 */
328 if (find == NULL)
329 {
330 lookup = op32 & ~Rd_mask;
331 find = (unsigned int *) bsearch (&lookup, sc_form_3, N_SC_FORM3,
332 sizeof (unsigned int), sc_compar);
333 code = find - sc_form_3 + (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2);
334 r = Rd;
335 }
336
337 *sc = (code << 5) | r;
338
339 return (find != NULL);
340}
341
342static int ATTRIBUTE_UNUSED
343ft32_split_shortcode (unsigned int op32, unsigned int code15[2])
344{
345 int code3;
346 unsigned int code30;
347
348 switch (op32 >> 27)
349 {
350 case 2:
351 code3 = 0;
352 break;
353 case 3:
354 code3 = 1;
355 break;
356 case 4:
357 code3 = 2;
358 break;
359 case 5:
360 code3 = 3;
361 break;
362 case 6:
363 code3 = 4;
364 break;
365 case 9:
366 code3 = 5;
367 break;
368 case 10:
369 code3 = 6;
370 break;
371 case 14:
372 code3 = 7;
373 break;
374 default:
375 code3 = -1;
376 break;
377 }
378
379 if (code3 == -1)
380 {
381 code15[0] = 0;
382 code15[1] = 0;
383 return 0;
384 }
385 else
386 {
387 code30 = ((op32 & 0x07ffffff) << 3) | code3;
388 code15[0] = code30 & 0x7fff;
389 code15[1] = (code30 >> 15) & 0x7fff;
390 return 1;
391 }
392}
393
394static unsigned int ATTRIBUTE_UNUSED
395ft32_merge_shortcode (unsigned int code15[2])
396{
397 static const unsigned char pat3[] = { 2, 3, 4, 5, 6, 9, 10, 14 };
398
399 unsigned int code30 = (code15[1] << 15) | code15[0];
400 unsigned int code27 = code30 >> 3;
401 unsigned int code3 = code30 & 7;
402 unsigned int pattern = pat3[code3];
403 return (pattern << 27) | code27;
404}
405
406static int ATTRIBUTE_UNUSED
407ft32_decode_shortcode (unsigned int pc, unsigned int op32, unsigned int *sc)
408{
409 int code3;
410 unsigned int code30;
411 unsigned int code15[2];
412 size_t i;
413
414 switch (op32 >> 27)
415 {
416 case 2:
417 code3 = 0;
418 break;
419 case 3:
420 code3 = 1;
421 break;
422 case 4:
423 code3 = 2;
424 break;
425 case 5:
426 code3 = 3;
427 break;
428 case 6:
429 code3 = 4;
430 break;
431 case 9:
432 code3 = 5;
433 break;
434 case 10:
435 code3 = 6;
436 break;
437 case 14:
438 code3 = 7;
439 break;
440 default:
441 code3 = -1;
442 break;
443 }
444
445 if (code3 == -1)
446 return 0;
447 else
448 {
449 code30 = ((op32 & 0x07ffffff) << 3) | code3;
450 code15[0] = code30 & 0x7fff;
451 code15[1] = (code30 >> 15) & 0x7fff;
452 for (i = 0; i < 2; i++)
453 {
454 unsigned int code = code15[i] >> 5;
455 unsigned int r = code15[i] & 0x1f;
456
457 if (code < 768)
458 {
459 if (code < N_SC_FORM0)
460 sc[i] = sc_form_0[code] | (r << 20) | (r << 15);
461 else if (code < (N_SC_FORM0 + N_SC_FORM1))
462 sc[i] = sc_form_1[code - N_SC_FORM0] | (r << 20) | (r << 4);
463 else if (code < (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2))
464 sc[i] = sc_form_2[code - (N_SC_FORM0 + N_SC_FORM1)]
465 | (r << 15);
466 else
467 sc[i] = sc_form_3[code -
468 (N_SC_FORM0 + N_SC_FORM1 + N_SC_FORM2)]
469 | (r << 20);
470 }
471 else
472 {
473 int jtype = (code15[i] >> 9) & 15;
474 int offset = code15[i] & 511;
475 if (offset & 256)
476 offset -= 512;
477 if (jtype < 14)
478 sc[i] =
479 0x00200000 | ((jtype >> 1) << 22) | ((jtype & 1) << 19);
480 else if (jtype == 14)
481 sc[i] = 0x00300000;
482 else
483 sc[i] = 0x00340000;
484 sc[i] |= ((pc >> 2) + offset);
485 }
486 }
487 return 1;
488 }
489}