summaryrefslogtreecommitdiffstats
path: root/target/arm/t32.decode
blob: be4e5f087cb1f39b64edbb4f9f89ee85a35744a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# Thumb2 instructions
#
#  Copyright (c) 2019 Linaro, Ltd
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, see <http://www.gnu.org/licenses/>.

#
# This file is processed by scripts/decodetree.py
#

&empty           !extern
&s_rrr_shi       !extern s rd rn rm shim shty
&s_rrr_shr       !extern s rn rd rm rs shty
&s_rri_rot       !extern s rn rd imm rot
&s_rrrr          !extern s rd rn rm ra
&rrrr            !extern rd rn rm ra
&rrr             !extern rd rn rm
&rr              !extern rd rm
&ri              !extern rd imm
&r               !extern rm
&i               !extern imm
&msr_reg         !extern rn r mask
&mrs_reg         !extern rd r
&msr_bank        !extern rn r sysm
&mrs_bank        !extern rd r sysm

# Data-processing (register)

%imm5_12_6       12:3 6:2

@s_rrr_shi       ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
                 &s_rrr_shi shim=%imm5_12_6
@s_rxr_shi       ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
                 &s_rrr_shi shim=%imm5_12_6 rn=0
@S_xrr_shi       ....... .... .   rn:4 .... .... .. shty:2 rm:4 \
                 &s_rrr_shi shim=%imm5_12_6 s=1 rd=0

{
  TST_xrri       1110101 0000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
  AND_rrri       1110101 0000 . .... 0 ... .... .... ....     @s_rrr_shi
}
BIC_rrri         1110101 0001 . .... 0 ... .... .... ....     @s_rrr_shi
{
  MOV_rxri       1110101 0010 . 1111 0 ... .... .... ....     @s_rxr_shi
  ORR_rrri       1110101 0010 . .... 0 ... .... .... ....     @s_rrr_shi
}
{
  MVN_rxri       1110101 0011 . 1111 0 ... .... .... ....     @s_rxr_shi
  ORN_rrri       1110101 0011 . .... 0 ... .... .... ....     @s_rrr_shi
}
{
  TEQ_xrri       1110101 0100 1 .... 0 ... 1111 .... ....     @S_xrr_shi
  EOR_rrri       1110101 0100 . .... 0 ... .... .... ....     @s_rrr_shi
}
# PKHBT, PKHTB at opc1 = 0110
{
  CMN_xrri       1110101 1000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
  ADD_rrri       1110101 1000 . .... 0 ... .... .... ....     @s_rrr_shi
}
ADC_rrri         1110101 1010 . .... 0 ... .... .... ....     @s_rrr_shi
SBC_rrri         1110101 1011 . .... 0 ... .... .... ....     @s_rrr_shi
{
  CMP_xrri       1110101 1101 1 .... 0 ... 1111 .... ....     @S_xrr_shi
  SUB_rrri       1110101 1101 . .... 0 ... .... .... ....     @s_rrr_shi
}
RSB_rrri         1110101 1110 . .... 0 ... .... .... ....     @s_rrr_shi

# Data-processing (register-shifted register)

MOV_rxrr         1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
                 &s_rrr_shr rn=0

# Data-processing (immediate)

%t32extrot       26:1 12:3 0:8  !function=t32_expandimm_rot
%t32extimm       26:1 12:3 0:8  !function=t32_expandimm_imm

@s_rri_rot       ....... .... s:1 rn:4 . ... rd:4 ........ \
                 &s_rri_rot imm=%t32extimm rot=%t32extrot
@s_rxi_rot       ....... .... s:1 .... . ... rd:4 ........ \
                 &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0
@S_xri_rot       ....... .... .   rn:4 . ... .... ........ \
                 &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0

{
  TST_xri        1111 0.0 0000 1 .... 0 ... 1111 ........     @S_xri_rot
  AND_rri        1111 0.0 0000 . .... 0 ... .... ........     @s_rri_rot
}
BIC_rri          1111 0.0 0001 . .... 0 ... .... ........     @s_rri_rot
{
  MOV_rxi        1111 0.0 0010 . 1111 0 ... .... ........     @s_rxi_rot
  ORR_rri        1111 0.0 0010 . .... 0 ... .... ........     @s_rri_rot
}
{
  MVN_rxi        1111 0.0 0011 . 1111 0 ... .... ........     @s_rxi_rot
  ORN_rri        1111 0.0 0011 . .... 0 ... .... ........     @s_rri_rot
}
{
  TEQ_xri        1111 0.0 0100 1 .... 0 ... 1111 ........     @S_xri_rot
  EOR_rri        1111 0.0 0100 . .... 0 ... .... ........     @s_rri_rot
}
{
  CMN_xri        1111 0.0 1000 1 .... 0 ... 1111 ........     @S_xri_rot
  ADD_rri        1111 0.0 1000 . .... 0 ... .... ........     @s_rri_rot
}
ADC_rri          1111 0.0 1010 . .... 0 ... .... ........     @s_rri_rot
SBC_rri          1111 0.0 1011 . .... 0 ... .... ........     @s_rri_rot
{
  CMP_xri        1111 0.0 1101 1 .... 0 ... 1111 ........     @S_xri_rot
  SUB_rri        1111 0.0 1101 . .... 0 ... .... ........     @s_rri_rot
}
RSB_rri          1111 0.0 1110 . .... 0 ... .... ........     @s_rri_rot

# Data processing (plain binary immediate)

%imm12_26_12_0   26:1 12:3 0:8
%neg12_26_12_0   26:1 12:3 0:8 !function=negate
@s0_rri_12       .... ... .... . rn:4 . ... rd:4 ........ \
                 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0

{
  ADR            1111 0.1 0000 0 1111 0 ... rd:4 ........ \
                 &ri imm=%imm12_26_12_0
  ADD_rri        1111 0.1 0000 0 .... 0 ... .... ........     @s0_rri_12
}
{
  ADR            1111 0.1 0101 0 1111 0 ... rd:4 ........ \
                 &ri imm=%neg12_26_12_0
  SUB_rri        1111 0.1 0101 0 .... 0 ... .... ........     @s0_rri_12
}

# Multiply and multiply accumulate

@s0_rnadm        .... .... .... rn:4 ra:4 rd:4 .... rm:4      &s_rrrr s=0
@s0_rn0dm        .... .... .... rn:4 .... rd:4 .... rm:4      &s_rrrr ra=0 s=0
@rnadm           .... .... .... rn:4 ra:4 rd:4 .... rm:4      &rrrr
@rn0dm           .... .... .... rn:4 .... rd:4 .... rm:4      &rrrr ra=0
@rndm            .... .... .... rn:4 .... rd:4 .... rm:4      &rrr
@rdm             .... .... .... .... .... rd:4 .... rm:4      &rr

{
  MUL            1111 1011 0000 .... 1111 .... 0000 ....      @s0_rn0dm
  MLA            1111 1011 0000 .... .... .... 0000 ....      @s0_rnadm
}
MLS              1111 1011 0000 .... .... .... 0001 ....      @rnadm
SMULL            1111 1011 1000 .... .... .... 0000 ....      @s0_rnadm
UMULL            1111 1011 1010 .... .... .... 0000 ....      @s0_rnadm
SMLAL            1111 1011 1100 .... .... .... 0000 ....      @s0_rnadm
UMLAL            1111 1011 1110 .... .... .... 0000 ....      @s0_rnadm
UMAAL            1111 1011 1110 .... .... .... 0110 ....      @rnadm
{
  SMULWB         1111 1011 0011 .... 1111 .... 0000 ....      @rn0dm
  SMLAWB         1111 1011 0011 .... .... .... 0000 ....      @rnadm
}
{
  SMULWT         1111 1011 0011 .... 1111 .... 0001 ....      @rn0dm
  SMLAWT         1111 1011 0011 .... .... .... 0001 ....      @rnadm
}
{
  SMULBB         1111 1011 0001 .... 1111 .... 0000 ....      @rn0dm
  SMLABB         1111 1011 0001 .... .... .... 0000 ....      @rnadm
}
{
  SMULBT         1111 1011 0001 .... 1111 .... 0001 ....      @rn0dm
  SMLABT         1111 1011 0001 .... .... .... 0001 ....      @rnadm
}
{
  SMULTB         1111 1011 0001 .... 1111 .... 0010 ....      @rn0dm
  SMLATB         1111 1011 0001 .... .... .... 0010 ....      @rnadm
}
{
  SMULTT         1111 1011 0001 .... 1111 .... 0011 ....      @rn0dm
  SMLATT         1111 1011 0001 .... .... .... 0011 ....      @rnadm
}
SMLALBB          1111 1011 1100 .... .... .... 1000 ....      @rnadm
SMLALBT          1111 1011 1100 .... .... .... 1001 ....      @rnadm
SMLALTB          1111 1011 1100 .... .... .... 1010 ....      @rnadm
SMLALTT          1111 1011 1100 .... .... .... 1011 ....      @rnadm

# Data-processing (two source registers)

QADD             1111 1010 1000 .... 1111 .... 1000 ....      @rndm
QSUB             1111 1010 1000 .... 1111 .... 1010 ....      @rndm
QDADD            1111 1010 1000 .... 1111 .... 1001 ....      @rndm
QDSUB            1111 1010 1000 .... 1111 .... 1011 ....      @rndm

CRC32B           1111 1010 1100 .... 1111 .... 1000 ....      @rndm
CRC32H           1111 1010 1100 .... 1111 .... 1001 ....      @rndm
CRC32W           1111 1010 1100 .... 1111 .... 1010 ....      @rndm
CRC32CB          1111 1010 1101 .... 1111 .... 1000 ....      @rndm
CRC32CH          1111 1010 1101 .... 1111 .... 1001 ....      @rndm
CRC32CW          1111 1010 1101 .... 1111 .... 1010 ....      @rndm

# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm

# Branches and miscellaneous control

%msr_sysm        4:1 8:4
%mrs_sysm        4:1 16:4
%imm16_16_0      16:4 0:12

{
  {
    YIELD        1111 0011 1010 1111 1000 0000 0000 0001
    WFE          1111 0011 1010 1111 1000 0000 0000 0010
    WFI          1111 0011 1010 1111 1000 0000 0000 0011

    # TODO: Implement SEV, SEVL; may help SMP performance.
    # SEV        1111 0011 1010 1111 1000 0000 0000 0100
    # SEVL       1111 0011 1010 1111 1000 0000 0000 0101

    # The canonical nop ends in 0000 0000, but the whole rest
    # of the space is "reserved hint, behaves as nop".
    NOP          1111 0011 1010 1111 1000 0000 ---- ----
  }
  # Note that the v7m insn overlaps both the normal and banked insn.
  {
    MRS_bank     1111 0011 111 r:1 .... 1000 rd:4   001. 0000  \
                 &mrs_bank sysm=%mrs_sysm
    MRS_reg      1111 0011 111 r:1 1111 1000 rd:4   0000 0000  &mrs_reg
    MRS_v7m      1111 0011 111 0   1111 1000 rd:4   sysm:8
  }
  {
    MSR_bank     1111 0011 100 r:1 rn:4 1000 ....   001. 0000  \
                 &msr_bank sysm=%msr_sysm
    MSR_reg      1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000  &msr_reg
    MSR_v7m      1111 0011 100 0   rn:4 1000 mask:2 00 sysm:8
  }
  BXJ            1111 0011 1100 rm:4 1000 1111 0000 0000      &r
  {
    # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
    # every other encoding of SUBS.  With v7VE, IMM=0 is redefined as ERET.
    # The distinction between the two only matters for Hyp mode.
    ERET         1111 0011 1101 1110 1000 1111 0000 0000
    SUB_rri      1111 0011 1101 1110 1000 1111 imm:8 \
                 &s_rri_rot rot=0 s=1 rd=15 rn=14
  }
  SMC            1111 0111 1111 imm:4 1000 0000 0000 0000     &i
  HVC            1111 0111 1110 ....  1000 .... .... ....     \
                 &i imm=%imm16_16_0
}