aboutsummaryrefslogtreecommitdiff
path: root/target/sparc/insns.decode
blob: 1150890e4428dc1b2e2a7db1ee08e8dbca176310 (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
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
# SPDX-License-Identifier: LGPL-2.0+
#
# Sparc instruction decode definitions.
# Copyright (c) 2023 Richard Henderson <rth@twiddle.net>

##
## Major Opcodes 00 and 01 -- branches, call, and sethi.
##

&bcc    i a cond cc
BPcc    00 a:1 cond:4   001 cc:1 0 - i:s19                 &bcc
Bicc    00 a:1 cond:4   010          i:s22                 &bcc cc=0
FBPfcc  00 a:1 cond:4   101 cc:2   - i:s19                 &bcc
FBfcc   00 a:1 cond:4   110          i:s22                 &bcc cc=0

%d16    20:s2 0:14
BPr     00 a:1 0 cond:3 011 ..     - rs1:5 ..............  i=%d16

NCP     00 -   ----     111 ----------------------         # CBcc

SETHI   00 rd:5         100 i:22

CALL    01 i:s30

##
## Major Opcode 10 -- integer, floating-point, vis, and system insns.
##

&r_r_ri     rd rs1 rs2_or_imm imm:bool
@n_r_ri     .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri rd=0
@r_r_ri     .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri

&r_r_ri_cc  rd rs1 rs2_or_imm imm:bool cc:bool
@r_r_ri_cc  .. rd:5  . cc:1 .... rs1:5 imm:1 rs2_or_imm:s13    &r_r_ri_cc
@r_r_ri_cc0 .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13         &r_r_ri_cc cc=0
@r_r_ri_cc1 .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13         &r_r_ri_cc cc=1

{
  [
    STBAR           10 00000 101000 01111 0 0000000000000
    MEMBAR          10 00000 101000 01111 1 000000 cmask:3 mmask:4

    RDCCR           10 rd:5  101000 00010 0 0000000000000
    RDASI           10 rd:5  101000 00011 0 0000000000000
    RDTICK          10 rd:5  101000 00100 0 0000000000000
    RDPC            10 rd:5  101000 00101 0 0000000000000
    RDFPRS          10 rd:5  101000 00110 0 0000000000000
    RDASR17         10 rd:5  101000 10001 0 0000000000000
    RDGSR           10 rd:5  101000 10011 0 0000000000000
    RDSOFTINT       10 rd:5  101000 10110 0 0000000000000
    RDTICK_CMPR     10 rd:5  101000 10111 0 0000000000000
    RDSTICK         10 rd:5  101000 11000 0 0000000000000
    RDSTICK_CMPR    10 rd:5  101000 11001 0 0000000000000
    RDSTRAND_STATUS 10 rd:5  101000 11010 0 0000000000000
  ]
  # Before v8, all rs1 accepted; otherwise rs1==0.
  RDY               10 rd:5  101000 rs1:5 0 0000000000000
}

{
  [
    WRY             10 00000 110000 ..... . .............  @n_r_ri
    WRCCR           10 00010 110000 ..... . .............  @n_r_ri
    WRASI           10 00011 110000 ..... . .............  @n_r_ri
    WRFPRS          10 00110 110000 ..... . .............  @n_r_ri
    {
      WRGSR         10 10011 110000 ..... . .............  @n_r_ri
      WRPOWERDOWN   10 10011 110000 ..... . .............  @n_r_ri
    }
    WRSOFTINT_SET   10 10100 110000 ..... . .............  @n_r_ri
    WRSOFTINT_CLR   10 10101 110000 ..... . .............  @n_r_ri
    WRSOFTINT       10 10110 110000 ..... . .............  @n_r_ri
    WRTICK_CMPR     10 10111 110000 ..... . .............  @n_r_ri
    WRSTICK         10 11000 110000 ..... . .............  @n_r_ri
    WRSTICK_CMPR    10 11001 110000 ..... . .............  @n_r_ri
  ]
  # Before v8, rs1==0 was WRY, and the rest executed as nop.
  [
    NOP_v7          10 ----- 110000 ----- 0 00000000 -----
    NOP_v7          10 ----- 110000 ----- 1 -------- -----
  ]
}

{
  RDPSR             10 rd:5  101001 00000 0 0000000000000
  RDHPR_hpstate     10 rd:5  101001 00000 0 0000000000000
}
RDHPR_htstate       10 rd:5  101001 00001 0 0000000000000
RDHPR_hintp         10 rd:5  101001 00011 0 0000000000000
RDHPR_htba          10 rd:5  101001 00101 0 0000000000000
RDHPR_hver          10 rd:5  101001 00110 0 0000000000000
RDHPR_hstick_cmpr   10 rd:5  101001 11111 0 0000000000000

{
  WRPSR             10 00000 110001 ..... . .............  @n_r_ri
  SAVED             10 00000 110001 00000 0 0000000000000
}
RESTORED            10 00001 110001 00000 0 0000000000000
# UA2005 ALLCLEAN
# UA2005 OTHERW
# UA2005 NORMALW
# UA2005 INVALW

{
  RDWIM             10 rd:5  101010 00000 0 0000000000000
  RDPR_tpc          10 rd:5  101010 00000 0 0000000000000
}
RDPR_tnpc           10 rd:5  101010 00001 0 0000000000000
RDPR_tstate         10 rd:5  101010 00010 0 0000000000000
RDPR_tt             10 rd:5  101010 00011 0 0000000000000
RDPR_tick           10 rd:5  101010 00100 0 0000000000000
RDPR_tba            10 rd:5  101010 00101 0 0000000000000
RDPR_pstate         10 rd:5  101010 00110 0 0000000000000
RDPR_tl             10 rd:5  101010 00111 0 0000000000000
RDPR_pil            10 rd:5  101010 01000 0 0000000000000
RDPR_cwp            10 rd:5  101010 01001 0 0000000000000
RDPR_cansave        10 rd:5  101010 01010 0 0000000000000
RDPR_canrestore     10 rd:5  101010 01011 0 0000000000000
RDPR_cleanwin       10 rd:5  101010 01100 0 0000000000000
RDPR_otherwin       10 rd:5  101010 01101 0 0000000000000
RDPR_wstate         10 rd:5  101010 01110 0 0000000000000
RDPR_gl             10 rd:5  101010 10000 0 0000000000000
RDPR_strand_status  10 rd:5  101010 11010 0 0000000000000
RDPR_ver            10 rd:5  101010 11111 0 0000000000000

{
  WRWIM             10 00000 110010 ..... . .............  @n_r_ri
  WRPR_tpc          10 00000 110010 ..... . .............  @n_r_ri
}
WRPR_tnpc           10 00001 110010 ..... . .............  @n_r_ri
WRPR_tstate         10 00010 110010 ..... . .............  @n_r_ri
WRPR_tt             10 00011 110010 ..... . .............  @n_r_ri
WRPR_tick           10 00100 110010 ..... . .............  @n_r_ri
WRPR_tba            10 00101 110010 ..... . .............  @n_r_ri
WRPR_pstate         10 00110 110010 ..... . .............  @n_r_ri
WRPR_tl             10 00111 110010 ..... . .............  @n_r_ri
WRPR_pil            10 01000 110010 ..... . .............  @n_r_ri
WRPR_cwp            10 01001 110010 ..... . .............  @n_r_ri
WRPR_cansave        10 01010 110010 ..... . .............  @n_r_ri
WRPR_canrestore     10 01011 110010 ..... . .............  @n_r_ri
WRPR_cleanwin       10 01100 110010 ..... . .............  @n_r_ri
WRPR_otherwin       10 01101 110010 ..... . .............  @n_r_ri
WRPR_wstate         10 01110 110010 ..... . .............  @n_r_ri
WRPR_gl             10 10000 110010 ..... . .............  @n_r_ri
WRPR_strand_status  10 11010 110010 ..... . .............  @n_r_ri

{
  FLUSHW    10 00000 101011 00000 0 0000000000000
  RDTBR     10 rd:5  101011 00000 0 0000000000000
}

{
  WRTBR             10 00000 110011 ..... . .............  @n_r_ri
  WRHPR_hpstate     10 00000 110011 ..... . .............  @n_r_ri
}
WRHPR_htstate       10 00001 110011 ..... . .............  @n_r_ri
WRHPR_hintp         10 00011 110011 ..... . .............  @n_r_ri
WRHPR_htba          10 00101 110011 ..... . .............  @n_r_ri
WRHPR_hstick_cmpr   10 11111 110011 ..... . .............  @n_r_ri

ADD         10 ..... 0.0000 ..... . .............          @r_r_ri_cc
AND         10 ..... 0.0001 ..... . .............          @r_r_ri_cc
OR          10 ..... 0.0010 ..... . .............          @r_r_ri_cc
XOR         10 ..... 0.0011 ..... . .............          @r_r_ri_cc
SUB         10 ..... 0.0100 ..... . .............          @r_r_ri_cc
ANDN        10 ..... 0.0101 ..... . .............          @r_r_ri_cc
ORN         10 ..... 0.0110 ..... . .............          @r_r_ri_cc
XORN        10 ..... 0.0111 ..... . .............          @r_r_ri_cc
ADDC        10 ..... 0.1000 ..... . .............          @r_r_ri_cc
SUBC        10 ..... 0.1100 ..... . .............          @r_r_ri_cc

MULX        10 ..... 001001 ..... . .............          @r_r_ri_cc0
UMUL        10 ..... 0.1010 ..... . .............          @r_r_ri_cc
SMUL        10 ..... 0.1011 ..... . .............          @r_r_ri_cc
MULScc      10 ..... 100100 ..... . .............          @r_r_ri_cc1

UDIVX       10 ..... 001101 ..... . .............          @r_r_ri_cc0
SDIVX       10 ..... 101101 ..... . .............          @r_r_ri_cc0
UDIV        10 ..... 0.1110 ..... . .............          @r_r_ri_cc
SDIV        10 ..... 0.1111 ..... . .............          @r_r_ri_cc

TADDcc      10 ..... 100000 ..... . .............          @r_r_ri_cc1
TSUBcc      10 ..... 100001 ..... . .............          @r_r_ri_cc1
TADDccTV    10 ..... 100010 ..... . .............          @r_r_ri_cc1
TSUBccTV    10 ..... 100011 ..... . .............          @r_r_ri_cc1

POPC        10 rd:5  101110 00000 imm:1 rs2_or_imm:s13     \
            &r_r_ri_cc rs1=0 cc=0

&shiftr     rd rs1 rs2 x:bool
@shiftr     .. rd:5  ...... rs1:5 . x:1 ....... rs2:5      &shiftr

SLL_r       10 ..... 100101 ..... 0 .   0000000 .....      @shiftr
SRL_r       10 ..... 100110 ..... 0 .   0000000 .....      @shiftr
SRA_r       10 ..... 100111 ..... 0 .   0000000 .....      @shiftr

&shifti     rd rs1 i x:bool
@shifti     .. rd:5  ...... rs1:5 . x:1 ...... i:6         &shifti

SLL_i       10 ..... 100101 ..... 1 .   000000 ......      @shifti
SRL_i       10 ..... 100110 ..... 1 .   000000 ......      @shifti
SRA_i       10 ..... 100111 ..... 1 .   000000 ......      @shifti

Tcc_r       10 0 cond:4 111010 rs1:5 0 cc:1 0000000 rs2:5
{
  # For v7, the entire simm13 field is present, but masked to 7 bits.
  # For v8, [12:7] are reserved.  However, a compatibility note for
  # the Tcc insn in the v9 manual suggests that the v8 reserved field
  # was ignored and did not produce traps.
  Tcc_i_v7  10 0 cond:4 111010 rs1:5 1 ------ i:7

  # For v9, bits [12:11] are cc1 and cc0 (and cc0 must be 0).
  # Bits [10:8] are reserved and the OSA2011 manual says they must be 0.
  Tcc_i_v9  10 0 cond:4 111010 rs1:5 1 cc:1 0 000 i:8
}

MOVcc       10 rd:5  101100 1 cond:4 imm:1 cc:1 0 rs2_or_imm:s11
MOVfcc      10 rd:5  101100 0 cond:4 imm:1 cc:2   rs2_or_imm:s11
MOVR        10 rd:5  101111 rs1:5    imm:1 cond:3 rs2_or_imm:s10

JMPL        10 ..... 111000 ..... . .............          @r_r_ri
{
  RETT      10 00000 111001 ..... . .............          @n_r_ri
  RETURN    10 00000 111001 ..... . .............          @n_r_ri
}
NOP         10 00000 111011 ----- 0 00000000-----          # FLUSH reg+reg
NOP         10 00000 111011 ----- 1 -------------          # FLUSH reg+imm
SAVE        10 ..... 111100 ..... . .............          @r_r_ri
RESTORE     10 ..... 111101 ..... . .............          @r_r_ri

DONE        10 00000 111110 00000 0 0000000000000
RETRY       10 00001 111110 00000 0 0000000000000

NCP         10 ----- 110110 ----- --------- -----          # v8 CPop1
NCP         10 ----- 110111 ----- --------- -----          # v8 CPop2

##
## Major Opcode 11 -- load and store instructions
##

%dfp_rd     25:5 !function=extract_dfpreg
%qfp_rd     25:5 !function=extract_qfpreg

&r_r_ri_asi rd rs1 rs2_or_imm asi imm:bool
@r_r_ri_na  .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri_asi asi=-1
@d_r_ri_na  .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     \
            &r_r_ri_asi rd=%dfp_rd asi=-1
@q_r_ri_na  .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     \
            &r_r_ri_asi rd=%qfp_rd asi=-1

@r_r_r_asi  .. rd:5  ...... rs1:5 0     asi:8 rs2_or_imm:5 &r_r_ri_asi imm=0
@r_r_i_asi  .. rd:5  ...... rs1:5 1     rs2_or_imm:s13     \
            &r_r_ri_asi imm=1 asi=-2
@casa_imm   .. rd:5  ...... rs1:5 1 00000000 rs2_or_imm:5  \
            &r_r_ri_asi imm=1 asi=-2

LDUW        11 ..... 000000 ..... . .............          @r_r_ri_na
LDUB        11 ..... 000001 ..... . .............          @r_r_ri_na
LDUH        11 ..... 000010 ..... . .............          @r_r_ri_na
LDD         11 ..... 000011 ..... . .............          @r_r_ri_na
LDSW        11 ..... 001000 ..... . .............          @r_r_ri_na
LDSB        11 ..... 001001 ..... . .............          @r_r_ri_na
LDSH        11 ..... 001010 ..... . .............          @r_r_ri_na
LDX         11 ..... 001011 ..... . .............          @r_r_ri_na

STW         11 ..... 000100 ..... . .............          @r_r_ri_na
STB         11 ..... 000101 ..... . .............          @r_r_ri_na
STH         11 ..... 000110 ..... . .............          @r_r_ri_na
STD         11 ..... 000111 ..... . .............          @r_r_ri_na
STX         11 ..... 001110 ..... . .............          @r_r_ri_na

LDUW        11 ..... 010000 ..... . .............          @r_r_r_asi # LDUWA
LDUW        11 ..... 010000 ..... . .............          @r_r_i_asi # LDUWA
LDUB        11 ..... 010001 ..... . .............          @r_r_r_asi # LDUBA
LDUB        11 ..... 010001 ..... . .............          @r_r_i_asi # LDUBA
LDUH        11 ..... 010010 ..... . .............          @r_r_r_asi # LDUHA
LDUH        11 ..... 010010 ..... . .............          @r_r_i_asi # LDUHA
LDD         11 ..... 010011 ..... . .............          @r_r_r_asi # LDDA
LDD         11 ..... 010011 ..... . .............          @r_r_i_asi # LDDA
LDX         11 ..... 011011 ..... . .............          @r_r_r_asi # LDXA
LDX         11 ..... 011011 ..... . .............          @r_r_i_asi # LDXA
LDSB        11 ..... 011001 ..... . .............          @r_r_r_asi # LDSBA
LDSB        11 ..... 011001 ..... . .............          @r_r_i_asi # LDSBA
LDSH        11 ..... 011010 ..... . .............          @r_r_r_asi # LDSHA
LDSH        11 ..... 011010 ..... . .............          @r_r_i_asi # LDSHA
LDSW        11 ..... 011000 ..... . .............          @r_r_r_asi # LDSWA
LDSW        11 ..... 011000 ..... . .............          @r_r_i_asi # LDSWA

STW         11 ..... 010100 ..... . .............          @r_r_r_asi # STWA
STW         11 ..... 010100 ..... . .............          @r_r_i_asi # STWA
STB         11 ..... 010101 ..... . .............          @r_r_r_asi # STBA
STB         11 ..... 010101 ..... . .............          @r_r_i_asi # STBA
STH         11 ..... 010110 ..... . .............          @r_r_r_asi # STHA
STH         11 ..... 010110 ..... . .............          @r_r_i_asi # STHA
STD         11 ..... 010111 ..... . .............          @r_r_r_asi # STDA
STD         11 ..... 010111 ..... . .............          @r_r_i_asi # STDA
STX         11 ..... 011110 ..... . .............          @r_r_r_asi # STXA
STX         11 ..... 011110 ..... . .............          @r_r_i_asi # STXA

LDF         11 ..... 100000 ..... . .............          @r_r_ri_na
LDQF        11 ..... 100010 ..... . .............          @q_r_ri_na
LDDF        11 ..... 100011 ..... . .............          @d_r_ri_na

STF         11 ..... 100100 ..... . .............          @r_r_ri_na
{
  STQF      11 ..... 100110 ..... . .............          @q_r_ri_na
  STDFQ     11 ----- 100110 ----- - -------------
}
STDF        11 ..... 100111 ..... . .............          @d_r_ri_na

LDSTUB      11 ..... 001101 ..... . .............          @r_r_ri_na
LDSTUB      11 ..... 011101 ..... . .............          @r_r_r_asi # LDSTUBA
LDSTUB      11 ..... 011101 ..... . .............          @r_r_i_asi # LDSTUBA

SWAP        11 ..... 001111 ..... . .............          @r_r_ri_na
SWAP        11 ..... 011111 ..... . .............          @r_r_r_asi # SWAPA
SWAP        11 ..... 011111 ..... . .............          @r_r_i_asi # SWAPA

CASA        11 ..... 111100 ..... . .............          @r_r_r_asi
CASA        11 ..... 111100 ..... . .............          @casa_imm
CASXA       11 ..... 111110 ..... . .............          @r_r_r_asi
CASXA       11 ..... 111110 ..... . .............          @casa_imm

NOP_v9      11 ----- 101101 ----- 0 00000000 -----         # PREFETCH
NOP_v9      11 ----- 101101 ----- 1 -------------          # PREFETCH
NOP_v9      11 ----- 111101 ----- - -------------          # PREFETCHA

NCP         11 ----- 110000 ----- --------- -----          # v8 LDC
NCP         11 ----- 110001 ----- --------- -----          # v8 LDCSR
NCP         11 ----- 110011 ----- --------- -----          # v8 LDDC
NCP         11 ----- 110100 ----- --------- -----          # v8 STC
NCP         11 ----- 110101 ----- --------- -----          # v8 STCSR
NCP         11 ----- 110110 ----- --------- -----          # v8 STDCQ
NCP         11 ----- 110111 ----- --------- -----          # v8 STDC