mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-02 16:52:25 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			331 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			331 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
 | 
						|
)
 |