1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package wasm
6
7import "cmd/internal/obj"
8
9//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p wasm
10
11const (
12	/* mark flags */
13	DONE          = 1 << iota
14	PRESERVEFLAGS // not allowed to clobber flags
15)
16
17/*
18 *	wasm
19 */
20const (
21	ACallImport = obj.ABaseWasm + obj.A_ARCHSPECIFIC + iota
22	AGet
23	ASet
24	ATee
25	ANot // alias for I32Eqz
26
27	// The following are low-level WebAssembly instructions.
28	// Their order matters, since it matches the opcode encoding.
29	// Gaps in the encoding are indicated by comments.
30
31	AUnreachable // opcode 0x00
32	ANop
33	ABlock
34	ALoop
35	AIf
36	AElse
37
38	AEnd // opcode 0x0B
39	ABr
40	ABrIf
41	ABrTable
42	// ACall and AReturn are WebAssembly instructions. obj.ACALL and obj.ARET are higher level instructions
43	// with Go semantics, e.g. they manipulate the Go stack on the linear memory.
44	AReturn
45	ACall
46	ACallIndirect
47
48	ADrop // opcode 0x1A
49	ASelect
50
51	ALocalGet // opcode 0x20
52	ALocalSet
53	ALocalTee
54	AGlobalGet
55	AGlobalSet
56
57	AI32Load // opcode 0x28
58	AI64Load
59	AF32Load
60	AF64Load
61	AI32Load8S
62	AI32Load8U
63	AI32Load16S
64	AI32Load16U
65	AI64Load8S
66	AI64Load8U
67	AI64Load16S
68	AI64Load16U
69	AI64Load32S
70	AI64Load32U
71	AI32Store
72	AI64Store
73	AF32Store
74	AF64Store
75	AI32Store8
76	AI32Store16
77	AI64Store8
78	AI64Store16
79	AI64Store32
80	ACurrentMemory
81	AGrowMemory
82
83	AI32Const
84	AI64Const
85	AF32Const
86	AF64Const
87
88	AI32Eqz
89	AI32Eq
90	AI32Ne
91	AI32LtS
92	AI32LtU
93	AI32GtS
94	AI32GtU
95	AI32LeS
96	AI32LeU
97	AI32GeS
98	AI32GeU
99
100	AI64Eqz
101	AI64Eq
102	AI64Ne
103	AI64LtS
104	AI64LtU
105	AI64GtS
106	AI64GtU
107	AI64LeS
108	AI64LeU
109	AI64GeS
110	AI64GeU
111
112	AF32Eq
113	AF32Ne
114	AF32Lt
115	AF32Gt
116	AF32Le
117	AF32Ge
118
119	AF64Eq
120	AF64Ne
121	AF64Lt
122	AF64Gt
123	AF64Le
124	AF64Ge
125
126	AI32Clz
127	AI32Ctz
128	AI32Popcnt
129	AI32Add
130	AI32Sub
131	AI32Mul
132	AI32DivS
133	AI32DivU
134	AI32RemS
135	AI32RemU
136	AI32And
137	AI32Or
138	AI32Xor
139	AI32Shl
140	AI32ShrS
141	AI32ShrU
142	AI32Rotl
143	AI32Rotr
144
145	AI64Clz
146	AI64Ctz
147	AI64Popcnt
148	AI64Add
149	AI64Sub
150	AI64Mul
151	AI64DivS
152	AI64DivU
153	AI64RemS
154	AI64RemU
155	AI64And
156	AI64Or
157	AI64Xor
158	AI64Shl
159	AI64ShrS
160	AI64ShrU
161	AI64Rotl
162	AI64Rotr
163
164	AF32Abs
165	AF32Neg
166	AF32Ceil
167	AF32Floor
168	AF32Trunc
169	AF32Nearest
170	AF32Sqrt
171	AF32Add
172	AF32Sub
173	AF32Mul
174	AF32Div
175	AF32Min
176	AF32Max
177	AF32Copysign
178
179	AF64Abs
180	AF64Neg
181	AF64Ceil
182	AF64Floor
183	AF64Trunc
184	AF64Nearest
185	AF64Sqrt
186	AF64Add
187	AF64Sub
188	AF64Mul
189	AF64Div
190	AF64Min
191	AF64Max
192	AF64Copysign
193
194	AI32WrapI64
195	AI32TruncF32S
196	AI32TruncF32U
197	AI32TruncF64S
198	AI32TruncF64U
199	AI64ExtendI32S
200	AI64ExtendI32U
201	AI64TruncF32S
202	AI64TruncF32U
203	AI64TruncF64S
204	AI64TruncF64U
205	AF32ConvertI32S
206	AF32ConvertI32U
207	AF32ConvertI64S
208	AF32ConvertI64U
209	AF32DemoteF64
210	AF64ConvertI32S
211	AF64ConvertI32U
212	AF64ConvertI64S
213	AF64ConvertI64U
214	AF64PromoteF32
215	AI32ReinterpretF32
216	AI64ReinterpretF64
217	AF32ReinterpretI32
218	AF64ReinterpretI64
219	AI32Extend8S
220	AI32Extend16S
221	AI64Extend8S
222	AI64Extend16S
223	AI64Extend32S
224
225	AI32TruncSatF32S // opcode 0xFC 0x00
226	AI32TruncSatF32U
227	AI32TruncSatF64S
228	AI32TruncSatF64U
229	AI64TruncSatF32S
230	AI64TruncSatF32U
231	AI64TruncSatF64S
232	AI64TruncSatF64U
233
234	ALast // Sentinel: End of low-level WebAssembly instructions.
235
236	ARESUMEPOINT
237	// ACALLNORESUME is a call which is not followed by a resume point.
238	// It is allowed inside of WebAssembly blocks, whereas obj.ACALL is not.
239	// However, it is not allowed to switch goroutines while inside of an ACALLNORESUME call.
240	ACALLNORESUME
241
242	ARETUNWIND
243
244	AMOVB
245	AMOVH
246	AMOVW
247	AMOVD
248
249	AWORD
250	ALAST
251)
252
253const (
254	REG_NONE = 0
255)
256
257const (
258	// globals
259	REG_SP = obj.RBaseWasm + iota // SP is currently 32-bit, until 64-bit memory operations are available
260	REG_CTXT
261	REG_g
262	// RET* are used by runtime.return0 and runtime.reflectcall. These functions pass return values in registers.
263	REG_RET0
264	REG_RET1
265	REG_RET2
266	REG_RET3
267	REG_PAUSE
268
269	// i32 locals
270	REG_R0
271	REG_R1
272	REG_R2
273	REG_R3
274	REG_R4
275	REG_R5
276	REG_R6
277	REG_R7
278	REG_R8
279	REG_R9
280	REG_R10
281	REG_R11
282	REG_R12
283	REG_R13
284	REG_R14
285	REG_R15
286
287	// f32 locals
288	REG_F0
289	REG_F1
290	REG_F2
291	REG_F3
292	REG_F4
293	REG_F5
294	REG_F6
295	REG_F7
296	REG_F8
297	REG_F9
298	REG_F10
299	REG_F11
300	REG_F12
301	REG_F13
302	REG_F14
303	REG_F15
304
305	// f64 locals
306	REG_F16
307	REG_F17
308	REG_F18
309	REG_F19
310	REG_F20
311	REG_F21
312	REG_F22
313	REG_F23
314	REG_F24
315	REG_F25
316	REG_F26
317	REG_F27
318	REG_F28
319	REG_F29
320	REG_F30
321	REG_F31
322
323	REG_PC_B // also first parameter, i32
324
325	MAXREG
326
327	MINREG  = REG_SP
328	REGSP   = REG_SP
329	REGCTXT = REG_CTXT
330	REGG    = REG_g
331)
332