aboutsummaryrefslogtreecommitdiff
path: root/target/microblaze/insns.decode
blob: fb0f0e68386c338eea1f7ef3fa3367ea0e90ac6b (plain)
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
254
255
256
#
# MicroBlaze instruction decode definitions.
#
# Copyright (c) 2020 Richard Henderson <rth@twiddle.net>
#
# 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.1 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/>.
#

&typea0         rd ra
&typea          rd ra rb
&typea_br       rd rb
&typea_bc       ra rb
&typeb          rd ra imm
&typeb_br       rd imm
&typeb_bc       ra imm
&type_msr       rd imm

# Include any IMM prefix in the value reported.
%extimm         0:s16 !function=typeb_imm

@typea          ...... rd:5 ra:5 rb:5 ... .... ....     &typea
@typeb          ...... rd:5 ra:5 ................       &typeb imm=%extimm

# Officially typea, but with rb==0, which is not used.
@typea0         ...... rd:5 ra:5 ................       &typea0

# Officially typea, but with ra as opcode.
@typea_br       ...... rd:5 ..... rb:5 ...........      &typea_br

# Officially typea, but with rd as opcode.
@typea_bc       ...... ..... ra:5 rb:5 ...........      &typea_bc

# Officially typeb, but any immediate extension is unused.
@typeb_bs       ...... rd:5 ra:5 ..... ...... imm:5     &typeb

# Officially typeb, but with ra as opcode.
@typeb_br       ...... rd:5 ..... ................      &typeb_br imm=%extimm

# Officially typeb, but with rd as opcode.
@typeb_bc       ...... ..... ra:5 ................      &typeb_bc imm=%extimm

# For convenience, extract the two imm_w/imm_s fields, then pack
# them back together as "imm".  Doing this makes it easiest to
# match the required zero at bit 5.
%ieimm          6:5 0:5
@typeb_ie       ...... rd:5 ra:5 ..... ..... . .....    &typeb imm=%ieimm

@type_msr       ...... rd:5 ...... imm:15               &type_msr

###

{
  zero          000000 00000 00000 00000 000 0000 0000
  add           000000 ..... ..... ..... 000 0000 0000  @typea
}
addc            000010 ..... ..... ..... 000 0000 0000  @typea
addk            000100 ..... ..... ..... 000 0000 0000  @typea
addkc           000110 ..... ..... ..... 000 0000 0000  @typea

addi            001000 ..... ..... ................     @typeb
addic           001010 ..... ..... ................     @typeb
addik           001100 ..... ..... ................     @typeb
addikc          001110 ..... ..... ................     @typeb

and             100001 ..... ..... ..... 000 0000 0000  @typea
andi            101001 ..... ..... ................     @typeb

andn            100011 ..... ..... ..... 000 0000 0000  @typea
andni           101011 ..... ..... ................     @typeb

beq             100111 00000 ..... ..... 000 0000 0000  @typea_bc
bge             100111 00101 ..... ..... 000 0000 0000  @typea_bc
bgt             100111 00100 ..... ..... 000 0000 0000  @typea_bc
ble             100111 00011 ..... ..... 000 0000 0000  @typea_bc
blt             100111 00010 ..... ..... 000 0000 0000  @typea_bc
bne             100111 00001 ..... ..... 000 0000 0000  @typea_bc

beqd            100111 10000 ..... ..... 000 0000 0000  @typea_bc
bged            100111 10101 ..... ..... 000 0000 0000  @typea_bc
bgtd            100111 10100 ..... ..... 000 0000 0000  @typea_bc
bled            100111 10011 ..... ..... 000 0000 0000  @typea_bc
bltd            100111 10010 ..... ..... 000 0000 0000  @typea_bc
bned            100111 10001 ..... ..... 000 0000 0000  @typea_bc

beqi            101111 00000 ..... ................     @typeb_bc
bgei            101111 00101 ..... ................     @typeb_bc
bgti            101111 00100 ..... ................     @typeb_bc
blei            101111 00011 ..... ................     @typeb_bc
blti            101111 00010 ..... ................     @typeb_bc
bnei            101111 00001 ..... ................     @typeb_bc

beqid           101111 10000 ..... ................     @typeb_bc
bgeid           101111 10101 ..... ................     @typeb_bc
bgtid           101111 10100 ..... ................     @typeb_bc
bleid           101111 10011 ..... ................     @typeb_bc
bltid           101111 10010 ..... ................     @typeb_bc
bneid           101111 10001 ..... ................     @typeb_bc

br              100110 ..... 00000 ..... 000 0000 0000  @typea_br
bra             100110 ..... 01000 ..... 000 0000 0000  @typea_br
brd             100110 ..... 10000 ..... 000 0000 0000  @typea_br
brad            100110 ..... 11000 ..... 000 0000 0000  @typea_br
brld            100110 ..... 10100 ..... 000 0000 0000  @typea_br
brald           100110 ..... 11100 ..... 000 0000 0000  @typea_br

bri             101110 ..... 00000 ................     @typeb_br
brai            101110 ..... 01000 ................     @typeb_br
brid            101110 ..... 10000 ................     @typeb_br
braid           101110 ..... 11000 ................     @typeb_br
brlid           101110 ..... 10100 ................     @typeb_br
bralid          101110 ..... 11100 ................     @typeb_br

brk             100110 ..... 01100 ..... 000 0000 0000  @typea_br
brki            101110 ..... 01100 ................     @typeb_br

bsrl            010001 ..... ..... ..... 000 0000 0000  @typea
bsra            010001 ..... ..... ..... 010 0000 0000  @typea
bsll            010001 ..... ..... ..... 100 0000 0000  @typea

bsrli           011001 ..... ..... 00000 000000 .....   @typeb_bs
bsrai           011001 ..... ..... 00000 010000 .....   @typeb_bs
bslli           011001 ..... ..... 00000 100000 .....   @typeb_bs

bsefi           011001 ..... ..... 01000 .....0 .....   @typeb_ie
bsifi           011001 ..... ..... 10000 .....0 .....   @typeb_ie

clz             100100 ..... ..... 00000 000 1110 0000  @typea0

cmp             000101 ..... ..... ..... 000 0000 0001  @typea
cmpu            000101 ..... ..... ..... 000 0000 0011  @typea

fadd            010110 ..... ..... ..... 0000 000 0000  @typea
frsub           010110 ..... ..... ..... 0001 000 0000  @typea
fmul            010110 ..... ..... ..... 0010 000 0000  @typea
fdiv            010110 ..... ..... ..... 0011 000 0000  @typea
fcmp_un         010110 ..... ..... ..... 0100 000 0000  @typea
fcmp_lt         010110 ..... ..... ..... 0100 001 0000  @typea
fcmp_eq         010110 ..... ..... ..... 0100 010 0000  @typea
fcmp_le         010110 ..... ..... ..... 0100 011 0000  @typea
fcmp_gt         010110 ..... ..... ..... 0100 100 0000  @typea
fcmp_ne         010110 ..... ..... ..... 0100 101 0000  @typea
fcmp_ge         010110 ..... ..... ..... 0100 110 0000  @typea

# Note that flt and fint, unlike fsqrt, are documented as having the RB
# operand which is unused.  So allow the field to be non-zero but discard
# the value and treat as 2-operand insns.
flt             010110 ..... ..... ----- 0101 000 0000  @typea0
fint            010110 ..... ..... ----- 0110 000 0000  @typea0
fsqrt           010110 ..... ..... 00000 0111 000 0000  @typea0

get             011011 rd:5  00000 0 ctrl:5 000000 imm:4
getd            010011 rd:5  00000 rb:5  0 ctrl:5  00000

idiv            010010 ..... ..... ..... 000 0000 0000  @typea
idivu           010010 ..... ..... ..... 000 0000 0010  @typea

imm             101100 00000 00000 imm:16

lbu             110000 ..... ..... ..... 0000 000 0000  @typea
lbur            110000 ..... ..... ..... 0100 000 0000  @typea
lbuea           110000 ..... ..... ..... 0001 000 0000  @typea
lbui            111000 ..... ..... ................     @typeb

lhu             110001 ..... ..... ..... 0000 000 0000  @typea
lhur            110001 ..... ..... ..... 0100 000 0000  @typea
lhuea           110001 ..... ..... ..... 0001 000 0000  @typea
lhui            111001 ..... ..... ................     @typeb

lw              110010 ..... ..... ..... 0000 000 0000  @typea
lwr             110010 ..... ..... ..... 0100 000 0000  @typea
lwea            110010 ..... ..... ..... 0001 000 0000  @typea
lwx             110010 ..... ..... ..... 1000 000 0000  @typea
lwi             111010 ..... ..... ................     @typeb

mbar            101110 imm:5 00010 0000 0000 0000 0100

mfs             100101 rd:5  0 e:1 000 10 rs:14
mts             100101 0 e:1 000 ra:5  11 rs:14

msrclr          100101 ..... 100010 ...............     @type_msr
msrset          100101 ..... 100000 ...............     @type_msr

mul             010000 ..... ..... ..... 000 0000 0000  @typea
mulh            010000 ..... ..... ..... 000 0000 0001  @typea
mulhu           010000 ..... ..... ..... 000 0000 0011  @typea
mulhsu          010000 ..... ..... ..... 000 0000 0010  @typea
muli            011000 ..... ..... ................     @typeb

or              100000 ..... ..... ..... 000 0000 0000  @typea
ori             101000 ..... ..... ................     @typeb

pcmpbf          100000 ..... ..... ..... 100 0000 0000  @typea
pcmpeq          100010 ..... ..... ..... 100 0000 0000  @typea
pcmpne          100011 ..... ..... ..... 100 0000 0000  @typea

put             011011 00000 ra:5  1 ctrl:5 000000 imm:4
putd            010011 00000 ra:5  rb:5  1 ctrl:5  00000

rsub            000001 ..... ..... ..... 000 0000 0000  @typea
rsubc           000011 ..... ..... ..... 000 0000 0000  @typea
rsubk           000101 ..... ..... ..... 000 0000 0000  @typea
rsubkc          000111 ..... ..... ..... 000 0000 0000  @typea

rsubi           001001 ..... ..... ................     @typeb
rsubic          001011 ..... ..... ................     @typeb
rsubik          001101 ..... ..... ................     @typeb
rsubikc         001111 ..... ..... ................     @typeb

rtbd            101101 10010 ..... ................     @typeb_bc
rtid            101101 10001 ..... ................     @typeb_bc
rted            101101 10100 ..... ................     @typeb_bc
rtsd            101101 10000 ..... ................     @typeb_bc

sb              110100 ..... ..... ..... 0000 000 0000  @typea
sbr             110100 ..... ..... ..... 0100 000 0000  @typea
sbea            110100 ..... ..... ..... 0001 000 0000  @typea
sbi             111100 ..... ..... ................     @typeb

sh              110101 ..... ..... ..... 0000 000 0000  @typea
shr             110101 ..... ..... ..... 0100 000 0000  @typea
shea            110101 ..... ..... ..... 0001 000 0000  @typea
shi             111101 ..... ..... ................     @typeb

sw              110110 ..... ..... ..... 0000 000 0000  @typea
swr             110110 ..... ..... ..... 0100 000 0000  @typea
swea            110110 ..... ..... ..... 0001 000 0000  @typea
swx             110110 ..... ..... ..... 1000 000 0000  @typea
swi             111110 ..... ..... ................     @typeb

sext8           100100 ..... ..... 00000 000 0110 0000  @typea0
sext16          100100 ..... ..... 00000 000 0110 0001  @typea0

sra             100100 ..... ..... 00000 000 0000 0001  @typea0
src             100100 ..... ..... 00000 000 0010 0001  @typea0
srl             100100 ..... ..... 00000 000 0100 0001  @typea0

swapb           100100 ..... ..... 00000 001 1110 0000  @typea0
swaph           100100 ..... ..... 00000 001 1110 0010  @typea0

# Cache operations have no effect in qemu: discard the arguments.
wdic            100100 00000 ----- ----- -00 -11- 01-0  # wdc
wdic            100100 00000 ----- ----- 000 0110 1000  # wic

xor             100010 ..... ..... ..... 000 0000 0000  @typea
xori            101010 ..... ..... ................     @typeb