332 lines
4.3 KiB
Go
332 lines
4.3 KiB
Go
// 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 "github.com/twitchyliquid64/golang-asm/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
|
|
|
|
ALocalGet // opcode 0x20
|
|
ALocalSet
|
|
ALocalTee
|
|
AGlobalGet
|
|
AGlobalSet
|
|
|
|
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
|
|
AI32TruncF32S
|
|
AI32TruncF32U
|
|
AI32TruncF64S
|
|
AI32TruncF64U
|
|
AI64ExtendI32S
|
|
AI64ExtendI32U
|
|
AI64TruncF32S
|
|
AI64TruncF32U
|
|
AI64TruncF64S
|
|
AI64TruncF64U
|
|
AF32ConvertI32S
|
|
AF32ConvertI32U
|
|
AF32ConvertI64S
|
|
AF32ConvertI64U
|
|
AF32DemoteF64
|
|
AF64ConvertI32S
|
|
AF64ConvertI32U
|
|
AF64ConvertI64S
|
|
AF64ConvertI64U
|
|
AF64PromoteF32
|
|
AI32ReinterpretF32
|
|
AI64ReinterpretF64
|
|
AF32ReinterpretI32
|
|
AF64ReinterpretI64
|
|
AI32Extend8S
|
|
AI32Extend16S
|
|
AI64Extend8S
|
|
AI64Extend16S
|
|
AI64Extend32S
|
|
|
|
AI32TruncSatF32S // opcode 0xFC 0x00
|
|
AI32TruncSatF32U
|
|
AI32TruncSatF64S
|
|
AI32TruncSatF64U
|
|
AI64TruncSatF32S
|
|
AI64TruncSatF32U
|
|
AI64TruncSatF64S
|
|
AI64TruncSatF64U
|
|
|
|
ALast // Sentinel: 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_SP = obj.RBaseWasm + iota // 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_PAUSE
|
|
|
|
// i32 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
|
|
|
|
// f32 locals
|
|
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
|
|
|
|
// f64 locals
|
|
REG_F16
|
|
REG_F17
|
|
REG_F18
|
|
REG_F19
|
|
REG_F20
|
|
REG_F21
|
|
REG_F22
|
|
REG_F23
|
|
REG_F24
|
|
REG_F25
|
|
REG_F26
|
|
REG_F27
|
|
REG_F28
|
|
REG_F29
|
|
REG_F30
|
|
REG_F31
|
|
|
|
REG_PC_B // also first parameter, i32
|
|
|
|
MAXREG
|
|
|
|
MINREG = REG_SP
|
|
REGSP = REG_SP
|
|
REGCTXT = REG_CTXT
|
|
REGG = REG_g
|
|
)
|