| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package wasm |
| |
| import "cmd/internal/obj" |
| |
| //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p wasm |
| |
| const ( |
| /* mark flags */ |
| DONE = 1 << iota |
| PRESERVEFLAGS // not allowed to clobber flags |
| ) |
| |
| /* |
| * wasm |
| */ |
| const ( |
| ACallImport = obj.ABaseWasm + obj.A_ARCHSPECIFIC + iota |
| AGet |
| ASet |
| ATee |
| ANot // alias for I32Eqz |
| |
| // The following are low-level WebAssembly instructions. |
| // Their order matters, since it matches the opcode encoding. |
| // Gaps in the encoding are indicated by comments. |
| |
| AUnreachable // opcode 0x00 |
| ANop |
| ABlock |
| ALoop |
| AIf |
| AElse |
| |
| AEnd // opcode 0x0B |
| ABr |
| ABrIf |
| ABrTable |
| // ACall and AReturn are WebAssembly instructions. obj.ACALL and obj.ARET are higher level instructions |
| // with Go semantics, e.g. they manipulate the Go stack on the linear memory. |
| AReturn |
| ACall |
| ACallIndirect |
| |
| ADrop // opcode 0x1A |
| ASelect |
| |
| AI32Load // opcode 0x28 |
| AI64Load |
| AF32Load |
| AF64Load |
| AI32Load8S |
| AI32Load8U |
| AI32Load16S |
| AI32Load16U |
| AI64Load8S |
| AI64Load8U |
| AI64Load16S |
| AI64Load16U |
| AI64Load32S |
| AI64Load32U |
| AI32Store |
| AI64Store |
| AF32Store |
| AF64Store |
| AI32Store8 |
| AI32Store16 |
| AI64Store8 |
| AI64Store16 |
| AI64Store32 |
| ACurrentMemory |
| AGrowMemory |
| |
| AI32Const |
| AI64Const |
| AF32Const |
| AF64Const |
| |
| AI32Eqz |
| AI32Eq |
| AI32Ne |
| AI32LtS |
| AI32LtU |
| AI32GtS |
| AI32GtU |
| AI32LeS |
| AI32LeU |
| AI32GeS |
| AI32GeU |
| |
| AI64Eqz |
| AI64Eq |
| AI64Ne |
| AI64LtS |
| AI64LtU |
| AI64GtS |
| AI64GtU |
| AI64LeS |
| AI64LeU |
| AI64GeS |
| AI64GeU |
| |
| AF32Eq |
| AF32Ne |
| AF32Lt |
| AF32Gt |
| AF32Le |
| AF32Ge |
| |
| AF64Eq |
| AF64Ne |
| AF64Lt |
| AF64Gt |
| AF64Le |
| AF64Ge |
| |
| AI32Clz |
| AI32Ctz |
| AI32Popcnt |
| AI32Add |
| AI32Sub |
| AI32Mul |
| AI32DivS |
| AI32DivU |
| AI32RemS |
| AI32RemU |
| AI32And |
| AI32Or |
| AI32Xor |
| AI32Shl |
| AI32ShrS |
| AI32ShrU |
| AI32Rotl |
| AI32Rotr |
| |
| AI64Clz |
| AI64Ctz |
| AI64Popcnt |
| AI64Add |
| AI64Sub |
| AI64Mul |
| AI64DivS |
| AI64DivU |
| AI64RemS |
| AI64RemU |
| AI64And |
| AI64Or |
| AI64Xor |
| AI64Shl |
| AI64ShrS |
| AI64ShrU |
| AI64Rotl |
| AI64Rotr |
| |
| AF32Abs |
| AF32Neg |
| AF32Ceil |
| AF32Floor |
| AF32Trunc |
| AF32Nearest |
| AF32Sqrt |
| AF32Add |
| AF32Sub |
| AF32Mul |
| AF32Div |
| AF32Min |
| AF32Max |
| AF32Copysign |
| |
| AF64Abs |
| AF64Neg |
| AF64Ceil |
| AF64Floor |
| AF64Trunc |
| AF64Nearest |
| AF64Sqrt |
| AF64Add |
| AF64Sub |
| AF64Mul |
| AF64Div |
| AF64Min |
| AF64Max |
| AF64Copysign |
| |
| AI32WrapI64 |
| AI32TruncSF32 |
| AI32TruncUF32 |
| AI32TruncSF64 |
| AI32TruncUF64 |
| AI64ExtendSI32 |
| AI64ExtendUI32 |
| AI64TruncSF32 |
| AI64TruncUF32 |
| AI64TruncSF64 |
| AI64TruncUF64 |
| AF32ConvertSI32 |
| AF32ConvertUI32 |
| AF32ConvertSI64 |
| AF32ConvertUI64 |
| AF32DemoteF64 |
| AF64ConvertSI32 |
| AF64ConvertUI32 |
| AF64ConvertSI64 |
| AF64ConvertUI64 |
| AF64PromoteF32 |
| AI32ReinterpretF32 |
| AI64ReinterpretF64 |
| AF32ReinterpretI32 |
| AF64ReinterpretI64 |
| |
| // End of low-level WebAssembly instructions. |
| |
| ARESUMEPOINT |
| // ACALLNORESUME is a call which is not followed by a resume point. |
| // It is allowed inside of WebAssembly blocks, whereas obj.ACALL is not. |
| // However, it is not allowed to switch goroutines while inside of an ACALLNORESUME call. |
| ACALLNORESUME |
| |
| ARETUNWIND |
| |
| AMOVB |
| AMOVH |
| AMOVW |
| AMOVD |
| |
| AWORD |
| ALAST |
| ) |
| |
| const ( |
| REG_NONE = 0 |
| ) |
| |
| const ( |
| // globals |
| REG_PC_F = obj.RBaseWasm + iota |
| REG_PC_B |
| REG_SP // SP is currently 32-bit, until 64-bit memory operations are available |
| REG_CTXT |
| REG_g |
| // RET* are used by runtime.return0 and runtime.reflectcall. These functions pass return values in registers. |
| REG_RET0 |
| REG_RET1 |
| REG_RET2 |
| REG_RET3 |
| REG_RUN |
| |
| // locals |
| REG_R0 |
| REG_R1 |
| REG_R2 |
| REG_R3 |
| REG_R4 |
| REG_R5 |
| REG_R6 |
| REG_R7 |
| REG_R8 |
| REG_R9 |
| REG_R10 |
| REG_R11 |
| REG_R12 |
| REG_R13 |
| REG_R14 |
| REG_R15 |
| REG_F0 |
| REG_F1 |
| REG_F2 |
| REG_F3 |
| REG_F4 |
| REG_F5 |
| REG_F6 |
| REG_F7 |
| REG_F8 |
| REG_F9 |
| REG_F10 |
| REG_F11 |
| REG_F12 |
| REG_F13 |
| REG_F14 |
| REG_F15 |
| |
| MAXREG |
| |
| MINREG = REG_PC_F |
| REGSP = REG_SP |
| REGCTXT = REG_CTXT |
| REGG = REG_g |
| ) |