a.out.go raw

   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  
   5  package wasm
   6  
   7  import "github.com/twitchyliquid64/golang-asm/obj"
   8  
   9  //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p wasm
  10  
  11  const (
  12  	/* mark flags */
  13  	DONE          = 1 << iota
  14  	PRESERVEFLAGS // not allowed to clobber flags
  15  )
  16  
  17  /*
  18   *	wasm
  19   */
  20  const (
  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  
 253  const (
 254  	REG_NONE = 0
 255  )
 256  
 257  const (
 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