ssa

package
v1.21.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 6, 2024 License: BSD-3-Clause Imports: 48 Imported by: 0

README

Introduction to the Go compiler's SSA backend

This package contains the compiler's Static Single Assignment form component. If you're not familiar with SSA, its Wikipedia article is a good starting point.

It is recommended that you first read cmd/compile/README.md if you are not familiar with the Go compiler already. That document gives an overview of the compiler, and explains what is SSA's part and purpose in it.

Key concepts

The names described below may be loosely related to their Go counterparts, but note that they are not equivalent. For example, a Go block statement has a variable scope, yet SSA has no notion of variables nor variable scopes.

It may also be surprising that values and blocks are named after their unique sequential IDs. They rarely correspond to named entities in the original code, such as variables or function parameters. The sequential IDs also allow the compiler to avoid maps, and it is always possible to track back the values to Go code using debug and position information.

Values

Values are the basic building blocks of SSA. Per SSA's very definition, a value is defined exactly once, but it may be used any number of times. A value mainly consists of a unique identifier, an operator, a type, and some arguments.

An operator or Op describes the operation that computes the value. The semantics of each operator can be found in _gen/*Ops.go. For example, OpAdd8 takes two value arguments holding 8-bit integers and results in their addition. Here is a possible SSA representation of the addition of two uint8 values:

// var c uint8 = a + b
v4 = Add8 <uint8> v2 v3

A value's type will usually be a Go type. For example, the value in the example above has a uint8 type, and a constant boolean value will have a bool type. However, certain types don't come from Go and are special; below we will cover memory, the most common of them.

See value.go for more information.

Memory types

memory represents the global memory state. An Op that takes a memory argument depends on that memory state, and an Op which has the memory type impacts the state of memory. This ensures that memory operations are kept in the right order. For example:

// *a = 3
// *b = *a
v10 = Store <mem> {int} v6 v8 v1
v14 = Store <mem> {int} v7 v8 v10

Here, Store stores its second argument (of type int) into the first argument (of type *int). The last argument is the memory state; since the second store depends on the memory value defined by the first store, the two stores cannot be reordered.

See github.com/go-asm/go/cmd/compile/types/type.go for more information.

Blocks

A block represents a basic block in the control flow graph of a function. It is, essentially, a list of values that define the operation of this block. Besides the list of values, blocks mainly consist of a unique identifier, a kind, and a list of successor blocks.

The simplest kind is a plain block; it simply hands the control flow to another block, thus its successors list contains one block.

Another common block kind is the exit block. These have a final value, called control value, which must return a memory state. This is necessary for functions to return some values, for example - the caller needs some memory state to depend on, to ensure that it receives those return values correctly.

The last important block kind we will mention is the if block. It has a single control value that must be a boolean value, and it has exactly two successor blocks. The control flow is handed to the first successor if the bool is true, and to the second otherwise.

Here is a sample if-else control flow represented with basic blocks:

// func(b bool) int {
// 	if b {
// 		return 2
// 	}
// 	return 3
// }
b1:
  v1 = InitMem <mem>
  v2 = SP <uintptr>
  v5 = Addr <*int> {~r1} v2
  v6 = Arg <bool> {b}
  v8 = Const64 <int> [2]
  v12 = Const64 <int> [3]
  If v6 -> b2 b3
b2: <- b1
  v10 = VarDef <mem> {~r1} v1
  v11 = Store <mem> {int} v5 v8 v10
  Ret v11
b3: <- b1
  v14 = VarDef <mem> {~r1} v1
  v15 = Store <mem> {int} v5 v12 v14
  Ret v15

See block.go for more information.

Functions

A function represents a function declaration along with its body. It mainly consists of a name, a type (its signature), a list of blocks that form its body, and the entry block within said list.

When a function is called, the control flow is handed to its entry block. If the function terminates, the control flow will eventually reach an exit block, thus ending the function call.

Note that a function may have zero or multiple exit blocks, just like a Go function can have any number of return points, but it must have exactly one entry point block.

Also note that some SSA functions are autogenerated, such as the hash functions for each type used as a map key.

For example, this is what an empty function can look like in SSA, with a single exit block that returns an uninteresting memory state:

foo func()
  b1:
    v1 = InitMem <mem>
    Ret v1

See func.go for more information.

Compiler passes

Having a program in SSA form is not very useful on its own. Its advantage lies in how easy it is to write optimizations that modify the program to make it better. The way the Go compiler accomplishes this is via a list of passes.

Each pass transforms a SSA function in some way. For example, a dead code elimination pass will remove blocks and values that it can prove will never be executed, and a nil check elimination pass will remove nil checks which it can prove to be redundant.

Compiler passes work on one function at a time, and by default run sequentially and exactly once.

The lower pass is special; it converts the SSA representation from being machine-independent to being machine-dependent. That is, some abstract operators are replaced with their non-generic counterparts, potentially reducing or increasing the final number of values.

See the passes list defined in compile.go for more information.

Playing with SSA

A good way to see and get used to the compiler's SSA in action is via GOSSAFUNC. For example, to see func Foo's initial SSA form and final generated assembly, one can run:

GOSSAFUNC=Foo go build

The generated ssa.html file will also contain the SSA func at each of the compile passes, making it easy to see what each pass does to a particular program. You can also click on values and blocks to highlight them, to help follow the control flow and values.

The value specified in GOSSAFUNC can also be a package-qualified function name, e.g.

GOSSAFUNC=blah.Foo go build

This will match any function named "Foo" within a package whose final suffix is "blah" (e.g. something/blah.Foo, anotherthing/extra/blah.Foo).

If non-HTML dumps are needed, append a "+" to the GOSSAFUNC value and dumps will be written to stdout:

GOSSAFUNC=Bar+ go build

Hacking on SSA

While most compiler passes are implemented directly in Go code, some others are code generated. This is currently done via rewrite rules, which have their own syntax and are maintained in _gen/*.rules. Simpler optimizations can be written easily and quickly this way, but rewrite rules are not suitable for more complex optimizations.

To read more on rewrite rules, have a look at the top comments in _gen/generic.rules and _gen/rulegen.go.

Similarly, the code to manage operators is also code generated from _gen/*Ops.go, as it is easier to maintain a few tables than a lot of code. After changing the rules or operators, run go generate github.com/go-asm/go/cmd/compile/ssa to generate the Go code again.

Documentation

Index

Constants

View Source
const (
	BranchUnlikely = BranchPrediction(-1)
	BranchUnknown  = BranchPrediction(0)
	BranchLikely   = BranchPrediction(+1)
)
View Source
const (
	// Register offsets for fields of built-in aggregate types; the ones not listed are zero.
	RO_complex_imag = 1
	RO_string_len   = 1
	RO_slice_len    = 1
	RO_slice_cap    = 2
	RO_iface_data   = 1
)
View Source
const (
	ScorePhi       = iota // towards top of block
	ScoreArg              // must occur at the top of the entry block
	ScoreInitMem          // after the args - used as mark by debug info generation
	ScoreReadTuple        // must occur immediately after tuple-generating insn (or call)
	ScoreNilCheck
	ScoreMemory
	ScoreReadFlags
	ScoreDefault
	ScoreFlags
	ScoreControl // towards bottom of block
)
View Source
const (
	// When used to lookup up definitions in a sparse tree,
	// these adjustments to a block's entry (+adjust) and
	// exit (-adjust) numbers allow a distinction to be made
	// between assignments (typically branch-dependent
	// conditionals) occurring "before" the block (e.g., as inputs
	// to the block and its phi functions), "within" the block,
	// and "after" the block.
	AdjustBefore = -1 // defined before phi
	AdjustWithin = 0  // defined by phi
	AdjustAfter  = 1  // defined within block
)
View Source
const MaxStruct = 4

MaxStruct is the maximum number of fields a struct can have and still be SSAable.

Variables

View Source
var AuxMark auxMark
View Source
var BlockEnd = &Value{
	ID:  -20000,
	Op:  OpInvalid,
	Aux: StringToAux("BlockEnd"),
}
View Source
var BlockStart = &Value{
	ID:  -10000,
	Op:  OpInvalid,
	Aux: StringToAux("BlockStart"),
}
View Source
var BuildDebug int
View Source
var BuildDump map[string]bool = make(map[string]bool) // names of functions to dump after initial build of ssa
View Source
var BuildStats int
View Source
var BuildTest int
View Source
var FuncEnd = &Value{
	ID:  -30000,
	Op:  OpInvalid,
	Aux: StringToAux("FuncEnd"),
}
View Source
var GenssaDump map[string]bool = make(map[string]bool) // names of functions to dump after ssa has been converted to asm
View Source
var IntrinsicsDebug int

Debug output

View Source
var IntrinsicsDisable bool

Functions

func AutoVar

func AutoVar(v *Value) (*ir.Name, int64)

AutoVar returns a *Name and int64 representing the auto variable and offset within it where v should be spilled.

func BuildFuncDebug

func BuildFuncDebug(ctxt *obj.Link, f *Func, loggingLevel int, stackOffset func(LocalSlot) int32, rval *FuncDebug)

BuildFuncDebug debug information for f, placing the results in "rval". f must be fully processed, so that each Value is where it will be when machine code is emitted.

func BuildFuncDebugNoOptimized

func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, stackOffset func(LocalSlot) int32, rval *FuncDebug)

BuildFuncDebugNoOptimized populates a FuncDebug object "rval" with entries corresponding to the register-resident input parameters for the function "f"; it is used when we are compiling without optimization but the register ABI is enabled. For each reg param, it constructs a 2-element location list: the first element holds the input register, and the second element holds the stack location of the param (the assumption being that when optimization is off, each input param reg will be spilled in the prolog).

func Compile

func Compile(f *Func)

Compile is the main entry point for this package. Compile modifies f so that on return:

  • all Values in f map to 0 or 1 assembly instructions of the target architecture
  • the order of f.Blocks is the order to emit the Blocks
  • the order of b.Values is the order to emit the Values in each Block
  • f has a non-nil regAlloc field

func DecodePPC64RotateMask

func DecodePPC64RotateMask(sauxint int64) (rotate, mb, me int64, mask uint64)

DecodePPC64RotateMask is the inverse operation of encodePPC64RotateMask. The values returned as mb and me satisfy the POWER ISA definition of MASK(x,y) where MASK(mb,me) = mask.

func DivisionNeedsFixUp

func DivisionNeedsFixUp(v *Value) bool

DivisionNeedsFixUp reports whether the division needs fix-up code.

func GetPPC64Shiftmb

func GetPPC64Shiftmb(auxint int64) int64

func GetPPC64Shiftme

func GetPPC64Shiftme(auxint int64) int64

func GetPPC64Shiftsh

func GetPPC64Shiftsh(auxint int64) int64

func IsGlobalAddr

func IsGlobalAddr(v *Value) bool

IsGlobalAddr reports whether v is known to be an address of a global (or nil).

func IsInlinableMemmove

func IsInlinableMemmove(dst, src *Value, sz int64, c *Config) bool

func IsReadOnlyGlobalAddr

func IsReadOnlyGlobalAddr(v *Value) bool

IsReadOnlyGlobalAddr reports whether v is known to be an address of a read-only global.

func IsSanitizerSafeAddr

func IsSanitizerSafeAddr(v *Value) bool

IsSanitizerSafeAddr reports whether v is known to be an address that doesn't need instrumentation.

func IsStackAddr

func IsStackAddr(v *Value) bool

IsStackAddr reports whether v is known to be an address of a stack slot.

func LogLargeCopy

func LogLargeCopy(funcName string, pos src.XPos, s int64)

func ObjRegForAbiReg

func ObjRegForAbiReg(r abi.RegIndex, c *Config) int16

For ABI register index r, returns the register number used in the obj package (assembler).

func ParamAssignmentForArgName

func ParamAssignmentForArgName(f *Func, name *ir.Name) *abi.ABIParamAssignment

ParamAssignmentForArgName returns the ABIParamAssignment for f's arg with matching name.

func PhaseOption

func PhaseOption(phase, flag string, val int, valString string) string

PhaseOption sets the specified flag in the specified ssa phase, returning empty string if this was successful or a string explaining the error if it was not. A version of the phase name with "_" replaced by " " is also checked for a match. If the phase name begins a '~' then the rest of the underscores-replaced-with-blanks version is used as a regular expression to match the phase name(s).

Special cases that have turned out to be useful:

  • ssa/check/on enables checking after each phase
  • ssa/all/time enables time reporting for all phases

See gc/lex.go for dissection of the option string. Example uses:

GO_GCFLAGS=-d=ssa/generic_cse/time,ssa/generic_cse/stats,ssa/generic_cse/debug=3 ./make.bash

BOOT_GO_GCFLAGS=-d='ssa/~^.*scc$/off' GO_GCFLAGS='-d=ssa/~^.*scc$/off' ./make.bash

func PopulateABIInRegArgOps

func PopulateABIInRegArgOps(f *Func)

PopulateABIInRegArgOps examines the entry block of the function and looks for incoming parameters that have missing or partial OpArg{Int,Float}Reg values, inserting additional values in cases where they are missing. Example:

func foo(s string, used int, notused int) int {
  return len(s) + used
}

In the function above, the incoming parameter "used" is fully live, "notused" is not live, and "s" is partially live (only the length field of the string is used). At the point where debug value analysis runs, we might expect to see an entry block with:

b1:
  v4 = ArgIntReg <uintptr> {s+8} [0] : BX
  v5 = ArgIntReg <int> {used} [0] : CX

While this is an accurate picture of the live incoming params, we also want to have debug locations for non-live params (or their non-live pieces), e.g. something like

b1:
  v9 = ArgIntReg <*uint8> {s+0} [0] : AX
  v4 = ArgIntReg <uintptr> {s+8} [0] : BX
  v5 = ArgIntReg <int> {used} [0] : CX
  v10 = ArgIntReg <int> {unused} [0] : DI

This function examines the live OpArg{Int,Float}Reg values and synthesizes new (dead) values for the non-live params or the non-live pieces of partially live params.

func ReachableBlocks

func ReachableBlocks(f *Func) []bool

ReachableBlocks returns the reachable blocks in f.

func StmtString

func StmtString(p src.XPos) string

Types

type Abi1RO

type Abi1RO uint8 // An offset within a parameter's slice of register indices, for abi1.

type Aux

type Aux interface {
	CanBeAnSSAAux()
}

Aux is an interface to hold miscellaneous data in Blocks and Values.

func StringToAux

func StringToAux(s string) Aux

type AuxCall

type AuxCall struct {
	Fn *obj.LSym
	// contains filtered or unexported fields
}

func ClosureAuxCall

func ClosureAuxCall(paramResultInfo *abi.ABIParamResultInfo) *AuxCall

ClosureAuxCall returns an AuxCall for a closure call.

func InterfaceAuxCall

func InterfaceAuxCall(paramResultInfo *abi.ABIParamResultInfo) *AuxCall

InterfaceAuxCall returns an AuxCall for an interface call.

func OwnAuxCall

func OwnAuxCall(fn *obj.LSym, paramResultInfo *abi.ABIParamResultInfo) *AuxCall

OwnAuxCall returns a function's own AuxCall.

func StaticAuxCall

func StaticAuxCall(sym *obj.LSym, paramResultInfo *abi.ABIParamResultInfo) *AuxCall

StaticAuxCall returns an AuxCall for a static call.

func (*AuxCall) ABI

func (a *AuxCall) ABI() *abi.ABIConfig

func (*AuxCall) ABIInfo

func (a *AuxCall) ABIInfo() *abi.ABIParamResultInfo

func (*AuxCall) ArgWidth

func (a *AuxCall) ArgWidth() int64

ArgWidth returns the amount of stack needed for all the inputs and outputs of a function or method, including ABI-defined parameter slots and ABI-defined spill slots for register-resident parameters.

The name is taken from the types package's ArgWidth(<function type>), which predated changes to the ABI; this version handles those changes.

func (*AuxCall) CanBeAnSSAAux

func (*AuxCall) CanBeAnSSAAux()

func (*AuxCall) LateExpansionResultType

func (a *AuxCall) LateExpansionResultType() *types.Type

LateExpansionResultType returns the result type (including trailing mem) for a call that will be expanded later in the SSA phase.

func (*AuxCall) NArgs

func (a *AuxCall) NArgs() int64

NArgs returns the number of arguments (including receiver, if there is one).

func (*AuxCall) NResults

func (a *AuxCall) NResults() int64

NResults returns the number of results.

func (*AuxCall) NameOfResult

func (a *AuxCall) NameOfResult(which int64) *ir.Name

NameOfResult returns the type of result which (indexed 0, 1, etc).

func (*AuxCall) OffsetOfArg

func (a *AuxCall) OffsetOfArg(which int64) int64

OffsetOfArg returns the SP offset of argument which (indexed 0, 1, etc). If the call is to a method, the receiver is the first argument (i.e., index 0)

func (*AuxCall) OffsetOfResult

func (a *AuxCall) OffsetOfResult(which int64) int64

OffsetOfResult returns the SP offset of result which (indexed 0, 1, etc).

func (*AuxCall) ParamAssignmentForResult

func (a *AuxCall) ParamAssignmentForResult(which int64) *abi.ABIParamAssignment

ParamAssignmentForResult returns the ABI Parameter assignment for result which (indexed 0, 1, etc).

func (*AuxCall) Reg

func (a *AuxCall) Reg(i *regInfo, c *Config) *regInfo

Reg returns the regInfo for a given call, combining the derived in/out register masks with the machine-specific register information in the input i. (The machine-specific regInfo is much handier at the call site than it is when the AuxCall is being constructed, therefore do this lazily).

TODO: there is a Clever Hack that allows pre-generation of a small-ish number of the slices of inputInfo and outputInfo used here, provided that we are willing to reorder the inputs and outputs from calls, so that all integer registers come first, then all floating registers. At this point (active development of register ABI) that is very premature, but if this turns out to be a cost, we could do it.

func (*AuxCall) RegsOfArg

func (a *AuxCall) RegsOfArg(which int64) []abi.RegIndex

RegsOfArg returns the register(s) used for argument which (indexed 0, 1, etc). If the call is to a method, the receiver is the first argument (i.e., index 0)

func (*AuxCall) RegsOfResult

func (a *AuxCall) RegsOfResult(which int64) []abi.RegIndex

RegsOfResult returns the register(s) used for result which (indexed 0, 1, etc).

func (*AuxCall) ResultReg

func (a *AuxCall) ResultReg(c *Config) *regInfo

func (*AuxCall) SizeOfArg

func (a *AuxCall) SizeOfArg(which int64) int64

SizeOfArg returns the size of argument which (indexed 0, 1, etc). If the call is to a method, the receiver is the first argument (i.e., index 0)

func (*AuxCall) SizeOfResult

func (a *AuxCall) SizeOfResult(which int64) int64

SizeOfResult returns the size of result which (indexed 0, 1, etc).

func (*AuxCall) String

func (a *AuxCall) String() string

String returns "AuxCall{<fn>}"

func (*AuxCall) TypeOfArg

func (a *AuxCall) TypeOfArg(which int64) *types.Type

TypeOfArg returns the type of argument which (indexed 0, 1, etc). If the call is to a method, the receiver is the first argument (i.e., index 0)

func (*AuxCall) TypeOfResult

func (a *AuxCall) TypeOfResult(which int64) *types.Type

TypeOfResult returns the type of result which (indexed 0, 1, etc).

type AuxNameOffset

type AuxNameOffset struct {
	Name   *ir.Name
	Offset int64
}

func (*AuxNameOffset) CanBeAnSSAAux

func (a *AuxNameOffset) CanBeAnSSAAux()

func (*AuxNameOffset) FrameOffset

func (a *AuxNameOffset) FrameOffset() int64

func (*AuxNameOffset) String

func (a *AuxNameOffset) String() string

type BaseAddress

type BaseAddress struct {
	// contains filtered or unexported fields
}

A BaseAddress represents the address ptr+idx, where ptr is a pointer type and idx is an integer type. idx may be nil, in which case it is treated as 0.

type Block

type Block struct {
	// A unique identifier for the block. The system will attempt to allocate
	// these IDs densely, but no guarantees.
	ID ID

	// Source position for block's control operation
	Pos src.XPos

	// The kind of block this is.
	Kind BlockKind

	// Likely direction for branches.
	// If BranchLikely, Succs[0] is the most likely branch taken.
	// If BranchUnlikely, Succs[1] is the most likely branch taken.
	// Ignored if len(Succs) < 2.
	// Fatal if not BranchUnknown and len(Succs) > 2.
	Likely BranchPrediction

	// After flagalloc, records whether flags are live at the end of the block.
	FlagsLiveAtEnd bool

	// Subsequent blocks, if any. The number and order depend on the block kind.
	Succs []Edge

	// Inverse of successors.
	// The order is significant to Phi nodes in the block.
	// TODO: predecessors is a pain to maintain. Can we somehow order phi
	// arguments by block id and have this field computed explicitly when needed?
	Preds []Edge

	// A list of values that determine how the block is exited. The number
	// and type of control values depends on the Kind of the block. For
	// instance, a BlockIf has a single boolean control value and BlockExit
	// has a single memory control value.
	//
	// The ControlValues() method may be used to get a slice with the non-nil
	// control values that can be ranged over.
	//
	// Controls[1] must be nil if Controls[0] is nil.
	Controls [2]*Value

	// Auxiliary info for the block. Its value depends on the Kind.
	Aux    Aux
	AuxInt int64

	// The unordered set of Values that define the operation of this block.
	// After the scheduling pass, this list is ordered.
	Values []*Value

	// The containing function
	Func *Func
	// contains filtered or unexported fields
}

Block represents a basic block in the control flow graph of a function.

func (*Block) AddControl

func (b *Block) AddControl(v *Value)

AddControl appends a control value to the existing list of control values.

func (*Block) AddEdgeTo

func (b *Block) AddEdgeTo(c *Block)

AddEdgeTo adds an edge from block b to block c. Used during building of the SSA graph; do not use on an already-completed SSA graph.

func (*Block) AuxIntString

func (b *Block) AuxIntString() string

func (*Block) ControlValues

func (b *Block) ControlValues() []*Value

ControlValues returns a slice containing the non-nil control values of the block. The index of each control value will be the same as it is in the Controls property and can be used in ReplaceControl calls.

func (*Block) CopyControls

func (b *Block) CopyControls(from *Block)

CopyControls replaces the controls for this block with those from the provided block. The provided block is not modified.

func (*Block) Fatalf

func (b *Block) Fatalf(msg string, args ...interface{})

func (*Block) FirstPossibleStmtValue

func (b *Block) FirstPossibleStmtValue() *Value

func (*Block) HTML

func (b *Block) HTML() string

func (*Block) LackingPos

func (b *Block) LackingPos() bool

LackingPos indicates whether b is a block whose position should be inherited from its successors. This is true if all the values within it have unreliable positions and if it is "plain", meaning that there is no control flow that is also very likely to correspond to a well-understood source position.

func (*Block) Log

func (b *Block) Log() bool

func (*Block) Logf

func (b *Block) Logf(msg string, args ...interface{})

func (*Block) LongHTML

func (b *Block) LongHTML() string

func (*Block) LongString

func (b *Block) LongString() string

long form print

func (*Block) NewValue0

func (b *Block) NewValue0(pos src.XPos, op Op, t *types.Type) *Value

NewValue0 returns a new value in the block with no arguments and zero aux values.

func (*Block) NewValue0A

func (b *Block) NewValue0A(pos src.XPos, op Op, t *types.Type, aux Aux) *Value

NewValue0A returns a new value in the block with no arguments and an aux value.

func (*Block) NewValue0I

func (b *Block) NewValue0I(pos src.XPos, op Op, t *types.Type, auxint int64) *Value

NewValue0I returns a new value in the block with no arguments and an auxint value.

func (*Block) NewValue0IA

func (b *Block) NewValue0IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux) *Value

NewValue0IA returns a new value in the block with no arguments and both an auxint and aux values.

func (*Block) NewValue1

func (b *Block) NewValue1(pos src.XPos, op Op, t *types.Type, arg *Value) *Value

NewValue1 returns a new value in the block with one argument and zero aux values.

func (*Block) NewValue1A

func (b *Block) NewValue1A(pos src.XPos, op Op, t *types.Type, aux Aux, arg *Value) *Value

NewValue1A returns a new value in the block with one argument and an aux value.

func (*Block) NewValue1I

func (b *Block) NewValue1I(pos src.XPos, op Op, t *types.Type, auxint int64, arg *Value) *Value

NewValue1I returns a new value in the block with one argument and an auxint value.

func (*Block) NewValue1IA

func (b *Block) NewValue1IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux, arg *Value) *Value

NewValue1IA returns a new value in the block with one argument and both an auxint and aux values.

func (*Block) NewValue2

func (b *Block) NewValue2(pos src.XPos, op Op, t *types.Type, arg0, arg1 *Value) *Value

NewValue2 returns a new value in the block with two arguments and zero aux values.

func (*Block) NewValue2A

func (b *Block) NewValue2A(pos src.XPos, op Op, t *types.Type, aux Aux, arg0, arg1 *Value) *Value

NewValue2A returns a new value in the block with two arguments and one aux values.

func (*Block) NewValue2I

func (b *Block) NewValue2I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1 *Value) *Value

NewValue2I returns a new value in the block with two arguments and an auxint value.

func (*Block) NewValue2IA

func (b *Block) NewValue2IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux, arg0, arg1 *Value) *Value

NewValue2IA returns a new value in the block with two arguments and both an auxint and aux values.

func (*Block) NewValue3

func (b *Block) NewValue3(pos src.XPos, op Op, t *types.Type, arg0, arg1, arg2 *Value) *Value

NewValue3 returns a new value in the block with three arguments and zero aux values.

func (*Block) NewValue3A

func (b *Block) NewValue3A(pos src.XPos, op Op, t *types.Type, aux Aux, arg0, arg1, arg2 *Value) *Value

NewValue3A returns a new value in the block with three argument and an aux value.

func (*Block) NewValue3I

func (b *Block) NewValue3I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1, arg2 *Value) *Value

NewValue3I returns a new value in the block with three arguments and an auxint value.

func (*Block) NewValue4

func (b *Block) NewValue4(pos src.XPos, op Op, t *types.Type, arg0, arg1, arg2, arg3 *Value) *Value

NewValue4 returns a new value in the block with four arguments and zero aux values.

func (*Block) NewValue4I

func (b *Block) NewValue4I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1, arg2, arg3 *Value) *Value

NewValue4I returns a new value in the block with four arguments and auxint value.

func (*Block) NumControls

func (b *Block) NumControls() int

NumControls returns the number of non-nil control values the block has.

func (*Block) ReplaceControl

func (b *Block) ReplaceControl(i int, v *Value)

ReplaceControl exchanges the existing control value at the index provided for the new value. The index must refer to a valid control value.

func (*Block) Reset

func (b *Block) Reset(kind BlockKind)

Reset sets the block to the provided kind and clears all the blocks control and auxiliary values. Other properties of the block, such as its successors, predecessors and values are left unmodified.

func (*Block) ResetControls

func (b *Block) ResetControls()

ResetControls sets the number of controls for the block to 0.

func (*Block) SetControl

func (b *Block) SetControl(v *Value)

SetControl removes all existing control values and then adds the control value provided. The number of control values after a call to SetControl will always be 1.

func (*Block) String

func (b *Block) String() string

short form print

type BlockDebug

type BlockDebug struct {
	// contains filtered or unexported fields
}

type BlockKind

type BlockKind int16

BlockKind is the kind of SSA block.

  kind          controls        successors
------------------------------------------
  Exit      [return mem]                []
 Plain                []            [next]
    If   [boolean Value]      [then, else]
 Defer             [mem]  [nopanic, panic]  (control opcode should be OpStaticCall to runtime.deferproc)
const (
	BlockInvalid BlockKind = iota

	Block386EQ
	Block386NE
	Block386LT
	Block386LE
	Block386GT
	Block386GE
	Block386OS
	Block386OC
	Block386ULT
	Block386ULE
	Block386UGT
	Block386UGE
	Block386EQF
	Block386NEF
	Block386ORD
	Block386NAN

	BlockAMD64EQ
	BlockAMD64NE
	BlockAMD64LT
	BlockAMD64LE
	BlockAMD64GT
	BlockAMD64GE
	BlockAMD64OS
	BlockAMD64OC
	BlockAMD64ULT
	BlockAMD64ULE
	BlockAMD64UGT
	BlockAMD64UGE
	BlockAMD64EQF
	BlockAMD64NEF
	BlockAMD64ORD
	BlockAMD64NAN
	BlockAMD64JUMPTABLE

	BlockARMEQ
	BlockARMNE
	BlockARMLT
	BlockARMLE
	BlockARMGT
	BlockARMGE
	BlockARMULT
	BlockARMULE
	BlockARMUGT
	BlockARMUGE
	BlockARMLTnoov
	BlockARMLEnoov
	BlockARMGTnoov
	BlockARMGEnoov

	BlockARM64EQ
	BlockARM64NE
	BlockARM64LT
	BlockARM64LE
	BlockARM64GT
	BlockARM64GE
	BlockARM64ULT
	BlockARM64ULE
	BlockARM64UGT
	BlockARM64UGE
	BlockARM64Z
	BlockARM64NZ
	BlockARM64ZW
	BlockARM64NZW
	BlockARM64TBZ
	BlockARM64TBNZ
	BlockARM64FLT
	BlockARM64FLE
	BlockARM64FGT
	BlockARM64FGE
	BlockARM64LTnoov
	BlockARM64LEnoov
	BlockARM64GTnoov
	BlockARM64GEnoov
	BlockARM64JUMPTABLE

	BlockLOONG64EQ
	BlockLOONG64NE
	BlockLOONG64LTZ
	BlockLOONG64LEZ
	BlockLOONG64GTZ
	BlockLOONG64GEZ
	BlockLOONG64FPT
	BlockLOONG64FPF

	BlockMIPSEQ
	BlockMIPSNE
	BlockMIPSLTZ
	BlockMIPSLEZ
	BlockMIPSGTZ
	BlockMIPSGEZ
	BlockMIPSFPT
	BlockMIPSFPF

	BlockMIPS64EQ
	BlockMIPS64NE
	BlockMIPS64LTZ
	BlockMIPS64LEZ
	BlockMIPS64GTZ
	BlockMIPS64GEZ
	BlockMIPS64FPT
	BlockMIPS64FPF

	BlockPPC64EQ
	BlockPPC64NE
	BlockPPC64LT
	BlockPPC64LE
	BlockPPC64GT
	BlockPPC64GE
	BlockPPC64FLT
	BlockPPC64FLE
	BlockPPC64FGT
	BlockPPC64FGE

	BlockRISCV64BEQ
	BlockRISCV64BNE
	BlockRISCV64BLT
	BlockRISCV64BGE
	BlockRISCV64BLTU
	BlockRISCV64BGEU
	BlockRISCV64BEQZ
	BlockRISCV64BNEZ
	BlockRISCV64BLEZ
	BlockRISCV64BGEZ
	BlockRISCV64BLTZ
	BlockRISCV64BGTZ

	BlockS390XBRC
	BlockS390XCRJ
	BlockS390XCGRJ
	BlockS390XCLRJ
	BlockS390XCLGRJ
	BlockS390XCIJ
	BlockS390XCGIJ
	BlockS390XCLIJ
	BlockS390XCLGIJ

	BlockPlain
	BlockIf
	BlockDefer
	BlockRet
	BlockRetJmp
	BlockExit
	BlockJumpTable
	BlockFirst
)

func (BlockKind) AuxIntType

func (k BlockKind) AuxIntType() string

func (BlockKind) String

func (k BlockKind) String() string

type BoundsKind

type BoundsKind uint8
const (
	BoundsIndex       BoundsKind = iota // indexing operation, 0 <= idx < len failed
	BoundsIndexU                        // ... with unsigned idx
	BoundsSliceAlen                     // 2-arg slicing operation, 0 <= high <= len failed
	BoundsSliceAlenU                    // ... with unsigned high
	BoundsSliceAcap                     // 2-arg slicing operation, 0 <= high <= cap failed
	BoundsSliceAcapU                    // ... with unsigned high
	BoundsSliceB                        // 2-arg slicing operation, 0 <= low <= high failed
	BoundsSliceBU                       // ... with unsigned low
	BoundsSlice3Alen                    // 3-arg slicing operation, 0 <= max <= len failed
	BoundsSlice3AlenU                   // ... with unsigned max
	BoundsSlice3Acap                    // 3-arg slicing operation, 0 <= max <= cap failed
	BoundsSlice3AcapU                   // ... with unsigned max
	BoundsSlice3B                       // 3-arg slicing operation, 0 <= high <= max failed
	BoundsSlice3BU                      // ... with unsigned high
	BoundsSlice3C                       // 3-arg slicing operation, 0 <= low <= high failed
	BoundsSlice3CU                      // ... with unsigned low
	BoundsConvert                       // conversion to array pointer failed
	BoundsKindCount
)

type BranchPrediction

type BranchPrediction int8

type ByTopo

type ByTopo []*FuncLines

ByTopo sorts topologically: target function is on top, followed by inlined functions sorted by filename and line numbers.

func (ByTopo) Len

func (x ByTopo) Len() int

func (ByTopo) Less

func (x ByTopo) Less(i, j int) bool

func (ByTopo) Swap

func (x ByTopo) Swap(i, j int)

type Cache

type Cache struct {
	ValueToProgAfter []*obj.Prog

	Liveness interface{} // *gc.livenessFuncCache
	// contains filtered or unexported fields
}

A Cache holds reusable compiler state. It is intended to be re-used for multiple Func compilations.

func (*Cache) Reset

func (c *Cache) Reset()

type Config

type Config struct {
	PtrSize int64 // 4 or 8; copy of github.com/go-asm/go/cmd/sys.Arch.PtrSize
	RegSize int64 // 4 or 8; copy of github.com/go-asm/go/cmd/sys.Arch.RegSize
	Types   Types

	ABI1     *abi.ABIConfig // "ABIInternal" under development // TODO change comment when this becomes current
	ABI0     *abi.ABIConfig
	GCRegMap []*Register // garbage collector register map, by GC register index
	FPReg    int8        // register number of frame pointer, -1 if not used
	LinkReg  int8        // register number of link register if it is a general purpose register, -1 if not used

	SoftFloat bool //
	Race      bool // race detector enabled
	BigEndian bool //
	UseFMA    bool // Use hardware FMA operation
	// contains filtered or unexported fields
}

A Config holds readonly compilation information. It is created once, early during compilation, and shared across all compilations.

func NewConfig

func NewConfig(arch string, types Types, ctxt *obj.Link, optimize, softfloat bool) *Config

NewConfig returns a new configuration object for the given architecture.

func (*Config) Ctxt

func (c *Config) Ctxt() *obj.Link

type Edge

type Edge struct {
	// contains filtered or unexported fields
}

Edge represents a CFG edge. Example edges for b branching to either c or d. (c and d have other predecessors.)

b.Succs = [{c,3}, {d,1}]
c.Preds = [?, ?, ?, {b,0}]
d.Preds = [?, {b,1}, ?]

These indexes allow us to edit the CFG in constant time. In addition, it informs phi ops in degenerate cases like:

b:
   if k then c else c
c:
   v = Phi(x, y)

Then the indexes tell you whether x is chosen from the if or else branch from b.

b.Succs = [{c,0},{c,1}]
c.Preds = [{b,0},{b,1}]

means x is chosen if k is true.

func (Edge) Block

func (e Edge) Block() *Block

func (Edge) Index

func (e Edge) Index() int

func (Edge) String

func (e Edge) String() string

type Frontend

type Frontend interface {
	Logger

	// CanSSA reports whether variables of type t are SSA-able.
	CanSSA(t *types.Type) bool

	// StringData returns a symbol pointing to the given string's contents.
	StringData(string) *obj.LSym

	// Auto returns a Node for an auto variable of the given type.
	// The SSA compiler uses this function to allocate space for spills.
	Auto(src.XPos, *types.Type) *ir.Name

	// Given the name for a compound type, returns the name we should use
	// for the parts of that compound type.
	SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot

	// AllocFrame assigns frame offsets to all live auto variables.
	AllocFrame(f *Func)

	// Syslook returns a symbol of the runtime function/variable with the
	// given name.
	Syslook(string) *obj.LSym

	// UseWriteBarrier reports whether write barrier is enabled
	UseWriteBarrier() bool

	// MyImportPath provides the import name (roughly, the package) for the function being compiled.
	MyImportPath() string

	// Func returns the ir.Func of the function being compiled.
	Func() *ir.Func
}

type Func

type Func struct {
	Config *Config // architecture information
	Cache  *Cache  // re-usable cache

	Name   string      // e.g. NewFunc or (*Func).NumBlocks (no package prefix)
	Type   *types.Type // type signature of the function.
	Blocks []*Block    // unordered set of all basic blocks (note: not indexable by ID)
	Entry  *Block      // the entry basic block

	HTMLWriter     *HTMLWriter // html writer, for debugging
	PrintOrHtmlSSA bool        // true if GOSSAFUNC matches, true even if fe.Log() (spew phase results to stdout) is false.  There's an odd dependence on this in debug.go for method logf.

	ABI0       *abi.ABIConfig // A copy, for no-sync access
	ABI1       *abi.ABIConfig // A copy, for no-sync access
	ABISelf    *abi.ABIConfig // ABI for function being compiled
	ABIDefault *abi.ABIConfig // ABI for rtcall and other no-parsed-signature/pragma functions.

	NoSplit bool // true if function is marked as nosplit.  Used by schedule check pass.

	// when register allocation is done, maps value ids to locations
	RegAlloc []Location

	// map from LocalSlot to set of Values that we want to store in that slot.
	NamedValues map[LocalSlot][]*Value
	// Names is a copy of NamedValues.Keys. We keep a separate list
	// of keys to make iteration order deterministic.
	Names []*LocalSlot
	// Canonicalize root/top-level local slots, and canonicalize their pieces.
	// Because LocalSlot pieces refer to their parents with a pointer, this ensures that equivalent slots really are equal.
	CanonicalLocalSlots  map[LocalSlot]*LocalSlot
	CanonicalLocalSplits map[LocalSlotSplitKey]*LocalSlot

	// RegArgs is a slice of register-memory pairs that must be spilled and unspilled in the uncommon path of function entry.
	RegArgs []Spill
	// AuxCall describing parameters and results for this function.
	OwnAux *AuxCall
	// contains filtered or unexported fields
}

A Func represents a Go func declaration (or function literal) and its body. This package compiles each Func independently. Funcs are single-use; a new Func must be created for every compiled function.

func NewFunc

func NewFunc(fe Frontend) *Func

NewFunc returns a new, empty function object. Caller must set f.Config and f.Cache before using f.

func (*Func) ConstBool

func (f *Func) ConstBool(t *types.Type, c bool) *Value

ConstBool returns an int constant representing its argument.

func (*Func) ConstEmptyString

func (f *Func) ConstEmptyString(t *types.Type) *Value

func (*Func) ConstFloat32

func (f *Func) ConstFloat32(t *types.Type, c float64) *Value

func (*Func) ConstFloat64

func (f *Func) ConstFloat64(t *types.Type, c float64) *Value

func (*Func) ConstInt16

func (f *Func) ConstInt16(t *types.Type, c int16) *Value

func (*Func) ConstInt32

func (f *Func) ConstInt32(t *types.Type, c int32) *Value

func (*Func) ConstInt64

func (f *Func) ConstInt64(t *types.Type, c int64) *Value

func (*Func) ConstInt8

func (f *Func) ConstInt8(t *types.Type, c int8) *Value

func (*Func) ConstInterface

func (f *Func) ConstInterface(t *types.Type) *Value

func (*Func) ConstNil

func (f *Func) ConstNil(t *types.Type) *Value

func (*Func) ConstOffPtrSP

func (f *Func) ConstOffPtrSP(t *types.Type, c int64, sp *Value) *Value

func (*Func) ConstSlice

func (f *Func) ConstSlice(t *types.Type) *Value

func (*Func) DebugHashMatch

func (f *Func) DebugHashMatch() bool

DebugHashMatch returns

base.DebugHashMatch(this function's package.name)

for use in bug isolation. The return value is true unless environment variable GOSSAHASH is set, in which case "it depends". See base.DebugHashMatch for more information.

func (*Func) DumpFileForPhase

func (f *Func) DumpFileForPhase(phaseName string) io.WriteCloser

DumpFileForPhase creates a file from the function name and phase name, warning and returning nil if this is not possible.

func (*Func) Fatalf

func (f *Func) Fatalf(msg string, args ...interface{})

func (*Func) Frontend

func (f *Func) Frontend() Frontend

func (*Func) HTML

func (f *Func) HTML(phase string, dot *dotWriter) string

func (*Func) Idom

func (f *Func) Idom() []*Block

Idom returns a map from block ID to the immediate dominator of that block. f.Entry.ID maps to nil. Unreachable blocks map to nil as well.

func (*Func) Log

func (f *Func) Log() bool

func (*Func) LogStat

func (f *Func) LogStat(key string, args ...interface{})

LogStat writes a string key and int value as a warning in a tab-separated format easily handled by spreadsheets or awk. file names, lines, and function names are included to provide enough (?) context to allow item-by-item comparisons across runs. For example: awk 'BEGIN {FS="\t"} $3~/TIME/{sum+=$4} END{print "t(ns)=",sum}' t.log

func (*Func) Logf

func (f *Func) Logf(msg string, args ...interface{})

func (*Func) NewBlock

func (f *Func) NewBlock(kind BlockKind) *Block

NewBlock allocates a new Block of the given kind and places it at the end of f.Blocks.

func (*Func) NumBlocks

func (f *Func) NumBlocks() int

NumBlocks returns an integer larger than the id of any Block in the Func.

func (*Func) NumValues

func (f *Func) NumValues() int

NumValues returns an integer larger than the id of any Value in the Func.

func (*Func) Postorder

func (f *Func) Postorder() []*Block

func (*Func) Sdom

func (f *Func) Sdom() SparseTree

Sdom returns a sparse tree representing the dominator relationships among the blocks of f.

func (*Func) SplitArray

func (f *Func) SplitArray(name *LocalSlot) *LocalSlot

func (*Func) SplitComplex

func (f *Func) SplitComplex(name *LocalSlot) (*LocalSlot, *LocalSlot)

func (*Func) SplitInt64

func (f *Func) SplitInt64(name *LocalSlot) (*LocalSlot, *LocalSlot)

func (*Func) SplitInterface

func (f *Func) SplitInterface(name *LocalSlot) (*LocalSlot, *LocalSlot)

func (*Func) SplitSlice

func (f *Func) SplitSlice(name *LocalSlot) (*LocalSlot, *LocalSlot, *LocalSlot)

func (*Func) SplitSlot

func (f *Func) SplitSlot(name *LocalSlot, sfx string, offset int64, t *types.Type) *LocalSlot

func (*Func) SplitString

func (f *Func) SplitString(name *LocalSlot) (*LocalSlot, *LocalSlot)

func (*Func) SplitStruct

func (f *Func) SplitStruct(name *LocalSlot, i int) *LocalSlot

func (*Func) String

func (f *Func) String() string

func (*Func) Warnl

func (f *Func) Warnl(pos src.XPos, msg string, args ...interface{})

type FuncDebug

type FuncDebug struct {
	// Slots is all the slots used in the debug info, indexed by their SlotID.
	Slots []LocalSlot
	// The user variables, indexed by VarID.
	Vars []*ir.Name
	// The slots that make up each variable, indexed by VarID.
	VarSlots [][]SlotID
	// The location list data, indexed by VarID. Must be processed by PutLocationList.
	LocationLists [][]byte
	// Register-resident output parameters for the function. This is filled in at
	// SSA generation time.
	RegOutputParams []*ir.Name
	// Variable declarations that were removed during optimization
	OptDcl []*ir.Name

	// Filled in by the user. Translates Block and Value ID to PC.
	GetPC func(ID, ID) int64
}

A FuncDebug contains all the debug information for the variables in a function. Variables are identified by their LocalSlot, which may be the result of decomposing a larger variable.

func (*FuncDebug) PutLocationList

func (debugInfo *FuncDebug) PutLocationList(list []byte, ctxt *obj.Link, listSym, startPC *obj.LSym)

PutLocationList adds list (a location list in its intermediate representation) to listSym.

type FuncLines

type FuncLines struct {
	Filename    string
	StartLineno uint
	Lines       []string
}

FuncLines contains source code for a function to be displayed in sources column.

type HTMLWriter

type HTMLWriter struct {
	Func *Func
	// contains filtered or unexported fields
}

func NewHTMLWriter

func NewHTMLWriter(path string, f *Func, cfgMask string) *HTMLWriter

func (*HTMLWriter) Close

func (w *HTMLWriter) Close()

func (*HTMLWriter) Fatalf

func (w *HTMLWriter) Fatalf(msg string, args ...interface{})

Fatalf reports an error and exits.

func (*HTMLWriter) Logf

func (w *HTMLWriter) Logf(msg string, args ...interface{})

Logf calls the (w *HTMLWriter).Func's Logf method passing along a msg and args.

func (*HTMLWriter) Printf

func (w *HTMLWriter) Printf(msg string, v ...interface{})

func (*HTMLWriter) WriteAST

func (w *HTMLWriter) WriteAST(phase string, buf *bytes.Buffer)

func (*HTMLWriter) WriteColumn

func (w *HTMLWriter) WriteColumn(phase, title, class, html string)

WriteColumn writes raw HTML in a column headed by title. It is intended for pre- and post-compilation log output.

func (*HTMLWriter) WriteMultiTitleColumn

func (w *HTMLWriter) WriteMultiTitleColumn(phase string, titles []string, class, html string)

func (*HTMLWriter) WritePhase

func (w *HTMLWriter) WritePhase(phase, title string)

WritePhase writes f in a column headed by title. phase is used for collapsing columns and should be unique across the table.

func (*HTMLWriter) WriteSources

func (w *HTMLWriter) WriteSources(phase string, all []*FuncLines)

WriteSources writes lines as source code in a column headed by title. phase is used for collapsing columns and should be unique across the table.

func (*HTMLWriter) WriteString

func (w *HTMLWriter) WriteString(s string)

type ID

type ID int32

type LocPair

type LocPair [2]Location

func (LocPair) String

func (t LocPair) String() string

type LocResults

type LocResults []Location

func (LocResults) String

func (t LocResults) String() string

type LocalSlot

type LocalSlot struct {
	N    *ir.Name    // an ONAME *ir.Name representing a stack location.
	Type *types.Type // type of slot
	Off  int64       // offset of slot in N

	SplitOf     *LocalSlot // slot is a decomposition of SplitOf
	SplitOffset int64      // .. at this offset.
}

A LocalSlot is a location in the stack frame, which identifies and stores part or all of a PPARAM, PPARAMOUT, or PAUTO ONAME node. It can represent a whole variable, part of a larger stack slot, or part of a variable that has been decomposed into multiple stack slots. As an example, a string could have the following configurations:

          stack layout              LocalSlots

Optimizations are disabled. s is on the stack and represented in its entirety.
[ ------- s string ---- ] { N: s, Type: string, Off: 0 }

s was not decomposed, but the SSA operates on its parts individually, so
there is a LocalSlot for each of its fields that points into the single stack slot.
[ ------- s string ---- ] { N: s, Type: *uint8, Off: 0 }, {N: s, Type: int, Off: 8}

s was decomposed. Each of its fields is in its own stack slot and has its own LocalSLot.
[ ptr *uint8 ] [ len int] { N: ptr, Type: *uint8, Off: 0, SplitOf: parent, SplitOffset: 0},
                          { N: len, Type: int, Off: 0, SplitOf: parent, SplitOffset: 8}
                          parent = &{N: s, Type: string}

func (LocalSlot) String

func (s LocalSlot) String() string

type LocalSlotSplitKey

type LocalSlotSplitKey struct {
	Off  int64       // offset of slot in N
	Type *types.Type // type of slot
	// contains filtered or unexported fields
}

type Location

type Location interface {
	String() string // name to use in assembly templates: AX, 16(SP), ...
}

A place that an ssa variable can reside.

type Logger

type Logger interface {
	// Logf logs a message from the compiler.
	Logf(string, ...interface{})

	// Log reports whether logging is not a no-op
	// some logging calls account for more than a few heap allocations.
	Log() bool

	// Fatal reports a compiler error and exits.
	Fatalf(pos src.XPos, msg string, args ...interface{})

	// Warnl writes compiler messages in the form expected by "errorcheck" tests
	Warnl(pos src.XPos, fmt_ string, args ...interface{})

	// Forwards the Debug flags from gc
	Debug_checknil() bool
}

type Op

type Op int32

An Op encodes the specific operation that a Value performs. Opcodes' semantics can be modified by the type and aux fields of the Value. For instance, OpAdd can be 32 or 64 bit, signed or unsigned, float or complex, depending on Value.Type. Semantics of each op are described in the opcode files in _gen/*Ops.go. There is one file for generic (architecture-independent) ops and one file for each architecture.

const (
	OpInvalid Op = iota

	Op386ADDSS
	Op386ADDSD
	Op386SUBSS
	Op386SUBSD
	Op386MULSS
	Op386MULSD
	Op386DIVSS
	Op386DIVSD
	Op386MOVSSload
	Op386MOVSDload
	Op386MOVSSconst
	Op386MOVSDconst
	Op386MOVSSloadidx1
	Op386MOVSSloadidx4
	Op386MOVSDloadidx1
	Op386MOVSDloadidx8
	Op386MOVSSstore
	Op386MOVSDstore
	Op386MOVSSstoreidx1
	Op386MOVSSstoreidx4
	Op386MOVSDstoreidx1
	Op386MOVSDstoreidx8
	Op386ADDSSload
	Op386ADDSDload
	Op386SUBSSload
	Op386SUBSDload
	Op386MULSSload
	Op386MULSDload
	Op386DIVSSload
	Op386DIVSDload
	Op386ADDL
	Op386ADDLconst
	Op386ADDLcarry
	Op386ADDLconstcarry
	Op386ADCL
	Op386ADCLconst
	Op386SUBL
	Op386SUBLconst
	Op386SUBLcarry
	Op386SUBLconstcarry
	Op386SBBL
	Op386SBBLconst
	Op386MULL
	Op386MULLconst
	Op386MULLU
	Op386HMULL
	Op386HMULLU
	Op386MULLQU
	Op386AVGLU
	Op386DIVL
	Op386DIVW
	Op386DIVLU
	Op386DIVWU
	Op386MODL
	Op386MODW
	Op386MODLU
	Op386MODWU
	Op386ANDL
	Op386ANDLconst
	Op386ORL
	Op386ORLconst
	Op386XORL
	Op386XORLconst
	Op386CMPL
	Op386CMPW
	Op386CMPB
	Op386CMPLconst
	Op386CMPWconst
	Op386CMPBconst
	Op386CMPLload
	Op386CMPWload
	Op386CMPBload
	Op386CMPLconstload
	Op386CMPWconstload
	Op386CMPBconstload
	Op386UCOMISS
	Op386UCOMISD
	Op386TESTL
	Op386TESTW
	Op386TESTB
	Op386TESTLconst
	Op386TESTWconst
	Op386TESTBconst
	Op386SHLL
	Op386SHLLconst
	Op386SHRL
	Op386SHRW
	Op386SHRB
	Op386SHRLconst
	Op386SHRWconst
	Op386SHRBconst
	Op386SARL
	Op386SARW
	Op386SARB
	Op386SARLconst
	Op386SARWconst
	Op386SARBconst
	Op386ROLL
	Op386ROLW
	Op386ROLB
	Op386ROLLconst
	Op386ROLWconst
	Op386ROLBconst
	Op386ADDLload
	Op386SUBLload
	Op386MULLload
	Op386ANDLload
	Op386ORLload
	Op386XORLload
	Op386ADDLloadidx4
	Op386SUBLloadidx4
	Op386MULLloadidx4
	Op386ANDLloadidx4
	Op386ORLloadidx4
	Op386XORLloadidx4
	Op386NEGL
	Op386NOTL
	Op386BSFL
	Op386BSFW
	Op386LoweredCtz32
	Op386BSRL
	Op386BSRW
	Op386BSWAPL
	Op386SQRTSD
	Op386SQRTSS
	Op386SBBLcarrymask
	Op386SETEQ
	Op386SETNE
	Op386SETL
	Op386SETLE
	Op386SETG
	Op386SETGE
	Op386SETB
	Op386SETBE
	Op386SETA
	Op386SETAE
	Op386SETO
	Op386SETEQF
	Op386SETNEF
	Op386SETORD
	Op386SETNAN
	Op386SETGF
	Op386SETGEF
	Op386MOVBLSX
	Op386MOVBLZX
	Op386MOVWLSX
	Op386MOVWLZX
	Op386MOVLconst
	Op386CVTTSD2SL
	Op386CVTTSS2SL
	Op386CVTSL2SS
	Op386CVTSL2SD
	Op386CVTSD2SS
	Op386CVTSS2SD
	Op386PXOR
	Op386LEAL
	Op386LEAL1
	Op386LEAL2
	Op386LEAL4
	Op386LEAL8
	Op386MOVBload
	Op386MOVBLSXload
	Op386MOVWload
	Op386MOVWLSXload
	Op386MOVLload
	Op386MOVBstore
	Op386MOVWstore
	Op386MOVLstore
	Op386ADDLmodify
	Op386SUBLmodify
	Op386ANDLmodify
	Op386ORLmodify
	Op386XORLmodify
	Op386ADDLmodifyidx4
	Op386SUBLmodifyidx4
	Op386ANDLmodifyidx4
	Op386ORLmodifyidx4
	Op386XORLmodifyidx4
	Op386ADDLconstmodify
	Op386ANDLconstmodify
	Op386ORLconstmodify
	Op386XORLconstmodify
	Op386ADDLconstmodifyidx4
	Op386ANDLconstmodifyidx4
	Op386ORLconstmodifyidx4
	Op386XORLconstmodifyidx4
	Op386MOVBloadidx1
	Op386MOVWloadidx1
	Op386MOVWloadidx2
	Op386MOVLloadidx1
	Op386MOVLloadidx4
	Op386MOVBstoreidx1
	Op386MOVWstoreidx1
	Op386MOVWstoreidx2
	Op386MOVLstoreidx1
	Op386MOVLstoreidx4
	Op386MOVBstoreconst
	Op386MOVWstoreconst
	Op386MOVLstoreconst
	Op386MOVBstoreconstidx1
	Op386MOVWstoreconstidx1
	Op386MOVWstoreconstidx2
	Op386MOVLstoreconstidx1
	Op386MOVLstoreconstidx4
	Op386DUFFZERO
	Op386REPSTOSL
	Op386CALLstatic
	Op386CALLtail
	Op386CALLclosure
	Op386CALLinter
	Op386DUFFCOPY
	Op386REPMOVSL
	Op386InvertFlags
	Op386LoweredGetG
	Op386LoweredGetClosurePtr
	Op386LoweredGetCallerPC
	Op386LoweredGetCallerSP
	Op386LoweredNilCheck
	Op386LoweredWB
	Op386LoweredPanicBoundsA
	Op386LoweredPanicBoundsB
	Op386LoweredPanicBoundsC
	Op386LoweredPanicExtendA
	Op386LoweredPanicExtendB
	Op386LoweredPanicExtendC
	Op386FlagEQ
	Op386FlagLT_ULT
	Op386FlagLT_UGT
	Op386FlagGT_UGT
	Op386FlagGT_ULT
	Op386MOVSSconst1
	Op386MOVSDconst1
	Op386MOVSSconst2
	Op386MOVSDconst2

	OpAMD64ADDSS
	OpAMD64ADDSD
	OpAMD64SUBSS
	OpAMD64SUBSD
	OpAMD64MULSS
	OpAMD64MULSD
	OpAMD64DIVSS
	OpAMD64DIVSD
	OpAMD64MOVSSload
	OpAMD64MOVSDload
	OpAMD64MOVSSconst
	OpAMD64MOVSDconst
	OpAMD64MOVSSloadidx1
	OpAMD64MOVSSloadidx4
	OpAMD64MOVSDloadidx1
	OpAMD64MOVSDloadidx8
	OpAMD64MOVSSstore
	OpAMD64MOVSDstore
	OpAMD64MOVSSstoreidx1
	OpAMD64MOVSSstoreidx4
	OpAMD64MOVSDstoreidx1
	OpAMD64MOVSDstoreidx8
	OpAMD64ADDSSload
	OpAMD64ADDSDload
	OpAMD64SUBSSload
	OpAMD64SUBSDload
	OpAMD64MULSSload
	OpAMD64MULSDload
	OpAMD64DIVSSload
	OpAMD64DIVSDload
	OpAMD64ADDSSloadidx1
	OpAMD64ADDSSloadidx4
	OpAMD64ADDSDloadidx1
	OpAMD64ADDSDloadidx8
	OpAMD64SUBSSloadidx1
	OpAMD64SUBSSloadidx4
	OpAMD64SUBSDloadidx1
	OpAMD64SUBSDloadidx8
	OpAMD64MULSSloadidx1
	OpAMD64MULSSloadidx4
	OpAMD64MULSDloadidx1
	OpAMD64MULSDloadidx8
	OpAMD64DIVSSloadidx1
	OpAMD64DIVSSloadidx4
	OpAMD64DIVSDloadidx1
	OpAMD64DIVSDloadidx8
	OpAMD64ADDQ
	OpAMD64ADDL
	OpAMD64ADDQconst
	OpAMD64ADDLconst
	OpAMD64ADDQconstmodify
	OpAMD64ADDLconstmodify
	OpAMD64SUBQ
	OpAMD64SUBL
	OpAMD64SUBQconst
	OpAMD64SUBLconst
	OpAMD64MULQ
	OpAMD64MULL
	OpAMD64MULQconst
	OpAMD64MULLconst
	OpAMD64MULLU
	OpAMD64MULQU
	OpAMD64HMULQ
	OpAMD64HMULL
	OpAMD64HMULQU
	OpAMD64HMULLU
	OpAMD64AVGQU
	OpAMD64DIVQ
	OpAMD64DIVL
	OpAMD64DIVW
	OpAMD64DIVQU
	OpAMD64DIVLU
	OpAMD64DIVWU
	OpAMD64NEGLflags
	OpAMD64ADDQcarry
	OpAMD64ADCQ
	OpAMD64ADDQconstcarry
	OpAMD64ADCQconst
	OpAMD64SUBQborrow
	OpAMD64SBBQ
	OpAMD64SUBQconstborrow
	OpAMD64SBBQconst
	OpAMD64MULQU2
	OpAMD64DIVQU2
	OpAMD64ANDQ
	OpAMD64ANDL
	OpAMD64ANDQconst
	OpAMD64ANDLconst
	OpAMD64ANDQconstmodify
	OpAMD64ANDLconstmodify
	OpAMD64ORQ
	OpAMD64ORL
	OpAMD64ORQconst
	OpAMD64ORLconst
	OpAMD64ORQconstmodify
	OpAMD64ORLconstmodify
	OpAMD64XORQ
	OpAMD64XORL
	OpAMD64XORQconst
	OpAMD64XORLconst
	OpAMD64XORQconstmodify
	OpAMD64XORLconstmodify
	OpAMD64CMPQ
	OpAMD64CMPL
	OpAMD64CMPW
	OpAMD64CMPB
	OpAMD64CMPQconst
	OpAMD64CMPLconst
	OpAMD64CMPWconst
	OpAMD64CMPBconst
	OpAMD64CMPQload
	OpAMD64CMPLload
	OpAMD64CMPWload
	OpAMD64CMPBload
	OpAMD64CMPQconstload
	OpAMD64CMPLconstload
	OpAMD64CMPWconstload
	OpAMD64CMPBconstload
	OpAMD64CMPQloadidx8
	OpAMD64CMPQloadidx1
	OpAMD64CMPLloadidx4
	OpAMD64CMPLloadidx1
	OpAMD64CMPWloadidx2
	OpAMD64CMPWloadidx1
	OpAMD64CMPBloadidx1
	OpAMD64CMPQconstloadidx8
	OpAMD64CMPQconstloadidx1
	OpAMD64CMPLconstloadidx4
	OpAMD64CMPLconstloadidx1
	OpAMD64CMPWconstloadidx2
	OpAMD64CMPWconstloadidx1
	OpAMD64CMPBconstloadidx1
	OpAMD64UCOMISS
	OpAMD64UCOMISD
	OpAMD64BTL
	OpAMD64BTQ
	OpAMD64BTCL
	OpAMD64BTCQ
	OpAMD64BTRL
	OpAMD64BTRQ
	OpAMD64BTSL
	OpAMD64BTSQ
	OpAMD64BTLconst
	OpAMD64BTQconst
	OpAMD64BTCLconst
	OpAMD64BTCQconst
	OpAMD64BTRLconst
	OpAMD64BTRQconst
	OpAMD64BTSLconst
	OpAMD64BTSQconst
	OpAMD64TESTQ
	OpAMD64TESTL
	OpAMD64TESTW
	OpAMD64TESTB
	OpAMD64TESTQconst
	OpAMD64TESTLconst
	OpAMD64TESTWconst
	OpAMD64TESTBconst
	OpAMD64SHLQ
	OpAMD64SHLL
	OpAMD64SHLQconst
	OpAMD64SHLLconst
	OpAMD64SHRQ
	OpAMD64SHRL
	OpAMD64SHRW
	OpAMD64SHRB
	OpAMD64SHRQconst
	OpAMD64SHRLconst
	OpAMD64SHRWconst
	OpAMD64SHRBconst
	OpAMD64SARQ
	OpAMD64SARL
	OpAMD64SARW
	OpAMD64SARB
	OpAMD64SARQconst
	OpAMD64SARLconst
	OpAMD64SARWconst
	OpAMD64SARBconst
	OpAMD64SHRDQ
	OpAMD64SHLDQ
	OpAMD64ROLQ
	OpAMD64ROLL
	OpAMD64ROLW
	OpAMD64ROLB
	OpAMD64RORQ
	OpAMD64RORL
	OpAMD64RORW
	OpAMD64RORB
	OpAMD64ROLQconst
	OpAMD64ROLLconst
	OpAMD64ROLWconst
	OpAMD64ROLBconst
	OpAMD64ADDLload
	OpAMD64ADDQload
	OpAMD64SUBQload
	OpAMD64SUBLload
	OpAMD64ANDLload
	OpAMD64ANDQload
	OpAMD64ORQload
	OpAMD64ORLload
	OpAMD64XORQload
	OpAMD64XORLload
	OpAMD64ADDLloadidx1
	OpAMD64ADDLloadidx4
	OpAMD64ADDLloadidx8
	OpAMD64ADDQloadidx1
	OpAMD64ADDQloadidx8
	OpAMD64SUBLloadidx1
	OpAMD64SUBLloadidx4
	OpAMD64SUBLloadidx8
	OpAMD64SUBQloadidx1
	OpAMD64SUBQloadidx8
	OpAMD64ANDLloadidx1
	OpAMD64ANDLloadidx4
	OpAMD64ANDLloadidx8
	OpAMD64ANDQloadidx1
	OpAMD64ANDQloadidx8
	OpAMD64ORLloadidx1
	OpAMD64ORLloadidx4
	OpAMD64ORLloadidx8
	OpAMD64ORQloadidx1
	OpAMD64ORQloadidx8
	OpAMD64XORLloadidx1
	OpAMD64XORLloadidx4
	OpAMD64XORLloadidx8
	OpAMD64XORQloadidx1
	OpAMD64XORQloadidx8
	OpAMD64ADDQmodify
	OpAMD64SUBQmodify
	OpAMD64ANDQmodify
	OpAMD64ORQmodify
	OpAMD64XORQmodify
	OpAMD64ADDLmodify
	OpAMD64SUBLmodify
	OpAMD64ANDLmodify
	OpAMD64ORLmodify
	OpAMD64XORLmodify
	OpAMD64ADDQmodifyidx1
	OpAMD64ADDQmodifyidx8
	OpAMD64SUBQmodifyidx1
	OpAMD64SUBQmodifyidx8
	OpAMD64ANDQmodifyidx1
	OpAMD64ANDQmodifyidx8
	OpAMD64ORQmodifyidx1
	OpAMD64ORQmodifyidx8
	OpAMD64XORQmodifyidx1
	OpAMD64XORQmodifyidx8
	OpAMD64ADDLmodifyidx1
	OpAMD64ADDLmodifyidx4
	OpAMD64ADDLmodifyidx8
	OpAMD64SUBLmodifyidx1
	OpAMD64SUBLmodifyidx4
	OpAMD64SUBLmodifyidx8
	OpAMD64ANDLmodifyidx1
	OpAMD64ANDLmodifyidx4
	OpAMD64ANDLmodifyidx8
	OpAMD64ORLmodifyidx1
	OpAMD64ORLmodifyidx4
	OpAMD64ORLmodifyidx8
	OpAMD64XORLmodifyidx1
	OpAMD64XORLmodifyidx4
	OpAMD64XORLmodifyidx8
	OpAMD64ADDQconstmodifyidx1
	OpAMD64ADDQconstmodifyidx8
	OpAMD64ANDQconstmodifyidx1
	OpAMD64ANDQconstmodifyidx8
	OpAMD64ORQconstmodifyidx1
	OpAMD64ORQconstmodifyidx8
	OpAMD64XORQconstmodifyidx1
	OpAMD64XORQconstmodifyidx8
	OpAMD64ADDLconstmodifyidx1
	OpAMD64ADDLconstmodifyidx4
	OpAMD64ADDLconstmodifyidx8
	OpAMD64ANDLconstmodifyidx1
	OpAMD64ANDLconstmodifyidx4
	OpAMD64ANDLconstmodifyidx8
	OpAMD64ORLconstmodifyidx1
	OpAMD64ORLconstmodifyidx4
	OpAMD64ORLconstmodifyidx8
	OpAMD64XORLconstmodifyidx1
	OpAMD64XORLconstmodifyidx4
	OpAMD64XORLconstmodifyidx8
	OpAMD64NEGQ
	OpAMD64NEGL
	OpAMD64NOTQ
	OpAMD64NOTL
	OpAMD64BSFQ
	OpAMD64BSFL
	OpAMD64BSRQ
	OpAMD64BSRL
	OpAMD64CMOVQEQ
	OpAMD64CMOVQNE
	OpAMD64CMOVQLT
	OpAMD64CMOVQGT
	OpAMD64CMOVQLE
	OpAMD64CMOVQGE
	OpAMD64CMOVQLS
	OpAMD64CMOVQHI
	OpAMD64CMOVQCC
	OpAMD64CMOVQCS
	OpAMD64CMOVLEQ
	OpAMD64CMOVLNE
	OpAMD64CMOVLLT
	OpAMD64CMOVLGT
	OpAMD64CMOVLLE
	OpAMD64CMOVLGE
	OpAMD64CMOVLLS
	OpAMD64CMOVLHI
	OpAMD64CMOVLCC
	OpAMD64CMOVLCS
	OpAMD64CMOVWEQ
	OpAMD64CMOVWNE
	OpAMD64CMOVWLT
	OpAMD64CMOVWGT
	OpAMD64CMOVWLE
	OpAMD64CMOVWGE
	OpAMD64CMOVWLS
	OpAMD64CMOVWHI
	OpAMD64CMOVWCC
	OpAMD64CMOVWCS
	OpAMD64CMOVQEQF
	OpAMD64CMOVQNEF
	OpAMD64CMOVQGTF
	OpAMD64CMOVQGEF
	OpAMD64CMOVLEQF
	OpAMD64CMOVLNEF
	OpAMD64CMOVLGTF
	OpAMD64CMOVLGEF
	OpAMD64CMOVWEQF
	OpAMD64CMOVWNEF
	OpAMD64CMOVWGTF
	OpAMD64CMOVWGEF
	OpAMD64BSWAPQ
	OpAMD64BSWAPL
	OpAMD64POPCNTQ
	OpAMD64POPCNTL
	OpAMD64SQRTSD
	OpAMD64SQRTSS
	OpAMD64ROUNDSD
	OpAMD64VFMADD231SD
	OpAMD64SBBQcarrymask
	OpAMD64SBBLcarrymask
	OpAMD64SETEQ
	OpAMD64SETNE
	OpAMD64SETL
	OpAMD64SETLE
	OpAMD64SETG
	OpAMD64SETGE
	OpAMD64SETB
	OpAMD64SETBE
	OpAMD64SETA
	OpAMD64SETAE
	OpAMD64SETO
	OpAMD64SETEQstore
	OpAMD64SETNEstore
	OpAMD64SETLstore
	OpAMD64SETLEstore
	OpAMD64SETGstore
	OpAMD64SETGEstore
	OpAMD64SETBstore
	OpAMD64SETBEstore
	OpAMD64SETAstore
	OpAMD64SETAEstore
	OpAMD64SETEQF
	OpAMD64SETNEF
	OpAMD64SETORD
	OpAMD64SETNAN
	OpAMD64SETGF
	OpAMD64SETGEF
	OpAMD64MOVBQSX
	OpAMD64MOVBQZX
	OpAMD64MOVWQSX
	OpAMD64MOVWQZX
	OpAMD64MOVLQSX
	OpAMD64MOVLQZX
	OpAMD64MOVLconst
	OpAMD64MOVQconst
	OpAMD64CVTTSD2SL
	OpAMD64CVTTSD2SQ
	OpAMD64CVTTSS2SL
	OpAMD64CVTTSS2SQ
	OpAMD64CVTSL2SS
	OpAMD64CVTSL2SD
	OpAMD64CVTSQ2SS
	OpAMD64CVTSQ2SD
	OpAMD64CVTSD2SS
	OpAMD64CVTSS2SD
	OpAMD64MOVQi2f
	OpAMD64MOVQf2i
	OpAMD64MOVLi2f
	OpAMD64MOVLf2i
	OpAMD64PXOR
	OpAMD64LEAQ
	OpAMD64LEAL
	OpAMD64LEAW
	OpAMD64LEAQ1
	OpAMD64LEAL1
	OpAMD64LEAW1
	OpAMD64LEAQ2
	OpAMD64LEAL2
	OpAMD64LEAW2
	OpAMD64LEAQ4
	OpAMD64LEAL4
	OpAMD64LEAW4
	OpAMD64LEAQ8
	OpAMD64LEAL8
	OpAMD64LEAW8
	OpAMD64MOVBload
	OpAMD64MOVBQSXload
	OpAMD64MOVWload
	OpAMD64MOVWQSXload
	OpAMD64MOVLload
	OpAMD64MOVLQSXload
	OpAMD64MOVQload
	OpAMD64MOVBstore
	OpAMD64MOVWstore
	OpAMD64MOVLstore
	OpAMD64MOVQstore
	OpAMD64MOVOload
	OpAMD64MOVOstore
	OpAMD64MOVBloadidx1
	OpAMD64MOVWloadidx1
	OpAMD64MOVWloadidx2
	OpAMD64MOVLloadidx1
	OpAMD64MOVLloadidx4
	OpAMD64MOVLloadidx8
	OpAMD64MOVQloadidx1
	OpAMD64MOVQloadidx8
	OpAMD64MOVBstoreidx1
	OpAMD64MOVWstoreidx1
	OpAMD64MOVWstoreidx2
	OpAMD64MOVLstoreidx1
	OpAMD64MOVLstoreidx4
	OpAMD64MOVLstoreidx8
	OpAMD64MOVQstoreidx1
	OpAMD64MOVQstoreidx8
	OpAMD64MOVBstoreconst
	OpAMD64MOVWstoreconst
	OpAMD64MOVLstoreconst
	OpAMD64MOVQstoreconst
	OpAMD64MOVOstoreconst
	OpAMD64MOVBstoreconstidx1
	OpAMD64MOVWstoreconstidx1
	OpAMD64MOVWstoreconstidx2
	OpAMD64MOVLstoreconstidx1
	OpAMD64MOVLstoreconstidx4
	OpAMD64MOVQstoreconstidx1
	OpAMD64MOVQstoreconstidx8
	OpAMD64DUFFZERO
	OpAMD64REPSTOSQ
	OpAMD64CALLstatic
	OpAMD64CALLtail
	OpAMD64CALLclosure
	OpAMD64CALLinter
	OpAMD64DUFFCOPY
	OpAMD64REPMOVSQ
	OpAMD64InvertFlags
	OpAMD64LoweredGetG
	OpAMD64LoweredGetClosurePtr
	OpAMD64LoweredGetCallerPC
	OpAMD64LoweredGetCallerSP
	OpAMD64LoweredNilCheck
	OpAMD64LoweredWB
	OpAMD64LoweredHasCPUFeature
	OpAMD64LoweredPanicBoundsA
	OpAMD64LoweredPanicBoundsB
	OpAMD64LoweredPanicBoundsC
	OpAMD64FlagEQ
	OpAMD64FlagLT_ULT
	OpAMD64FlagLT_UGT
	OpAMD64FlagGT_UGT
	OpAMD64FlagGT_ULT
	OpAMD64MOVBatomicload
	OpAMD64MOVLatomicload
	OpAMD64MOVQatomicload
	OpAMD64XCHGB
	OpAMD64XCHGL
	OpAMD64XCHGQ
	OpAMD64XADDLlock
	OpAMD64XADDQlock
	OpAMD64AddTupleFirst32
	OpAMD64AddTupleFirst64
	OpAMD64CMPXCHGLlock
	OpAMD64CMPXCHGQlock
	OpAMD64ANDBlock
	OpAMD64ANDLlock
	OpAMD64ORBlock
	OpAMD64ORLlock
	OpAMD64PrefetchT0
	OpAMD64PrefetchNTA
	OpAMD64ANDNQ
	OpAMD64ANDNL
	OpAMD64BLSIQ
	OpAMD64BLSIL
	OpAMD64BLSMSKQ
	OpAMD64BLSMSKL
	OpAMD64BLSRQ
	OpAMD64BLSRL
	OpAMD64TZCNTQ
	OpAMD64TZCNTL
	OpAMD64LZCNTQ
	OpAMD64LZCNTL
	OpAMD64MOVBEWstore
	OpAMD64MOVBELload
	OpAMD64MOVBELstore
	OpAMD64MOVBEQload
	OpAMD64MOVBEQstore
	OpAMD64MOVBELloadidx1
	OpAMD64MOVBELloadidx4
	OpAMD64MOVBELloadidx8
	OpAMD64MOVBEQloadidx1
	OpAMD64MOVBEQloadidx8
	OpAMD64MOVBEWstoreidx1
	OpAMD64MOVBEWstoreidx2
	OpAMD64MOVBELstoreidx1
	OpAMD64MOVBELstoreidx4
	OpAMD64MOVBELstoreidx8
	OpAMD64MOVBEQstoreidx1
	OpAMD64MOVBEQstoreidx8
	OpAMD64SARXQ
	OpAMD64SARXL
	OpAMD64SHLXQ
	OpAMD64SHLXL
	OpAMD64SHRXQ
	OpAMD64SHRXL
	OpAMD64SARXLload
	OpAMD64SARXQload
	OpAMD64SHLXLload
	OpAMD64SHLXQload
	OpAMD64SHRXLload
	OpAMD64SHRXQload
	OpAMD64SARXLloadidx1
	OpAMD64SARXLloadidx4
	OpAMD64SARXLloadidx8
	OpAMD64SARXQloadidx1
	OpAMD64SARXQloadidx8
	OpAMD64SHLXLloadidx1
	OpAMD64SHLXLloadidx4
	OpAMD64SHLXLloadidx8
	OpAMD64SHLXQloadidx1
	OpAMD64SHLXQloadidx8
	OpAMD64SHRXLloadidx1
	OpAMD64SHRXLloadidx4
	OpAMD64SHRXLloadidx8
	OpAMD64SHRXQloadidx1
	OpAMD64SHRXQloadidx8

	OpARMADD
	OpARMADDconst
	OpARMSUB
	OpARMSUBconst
	OpARMRSB
	OpARMRSBconst
	OpARMMUL
	OpARMHMUL
	OpARMHMULU
	OpARMCALLudiv
	OpARMADDS
	OpARMADDSconst
	OpARMADC
	OpARMADCconst
	OpARMSUBS
	OpARMSUBSconst
	OpARMRSBSconst
	OpARMSBC
	OpARMSBCconst
	OpARMRSCconst
	OpARMMULLU
	OpARMMULA
	OpARMMULS
	OpARMADDF
	OpARMADDD
	OpARMSUBF
	OpARMSUBD
	OpARMMULF
	OpARMMULD
	OpARMNMULF
	OpARMNMULD
	OpARMDIVF
	OpARMDIVD
	OpARMMULAF
	OpARMMULAD
	OpARMMULSF
	OpARMMULSD
	OpARMFMULAD
	OpARMAND
	OpARMANDconst
	OpARMOR
	OpARMORconst
	OpARMXOR
	OpARMXORconst
	OpARMBIC
	OpARMBICconst
	OpARMBFX
	OpARMBFXU
	OpARMMVN
	OpARMNEGF
	OpARMNEGD
	OpARMSQRTD
	OpARMSQRTF
	OpARMABSD
	OpARMCLZ
	OpARMREV
	OpARMREV16
	OpARMRBIT
	OpARMSLL
	OpARMSLLconst
	OpARMSRL
	OpARMSRLconst
	OpARMSRA
	OpARMSRAconst
	OpARMSRR
	OpARMSRRconst
	OpARMADDshiftLL
	OpARMADDshiftRL
	OpARMADDshiftRA
	OpARMSUBshiftLL
	OpARMSUBshiftRL
	OpARMSUBshiftRA
	OpARMRSBshiftLL
	OpARMRSBshiftRL
	OpARMRSBshiftRA
	OpARMANDshiftLL
	OpARMANDshiftRL
	OpARMANDshiftRA
	OpARMORshiftLL
	OpARMORshiftRL
	OpARMORshiftRA
	OpARMXORshiftLL
	OpARMXORshiftRL
	OpARMXORshiftRA
	OpARMXORshiftRR
	OpARMBICshiftLL
	OpARMBICshiftRL
	OpARMBICshiftRA
	OpARMMVNshiftLL
	OpARMMVNshiftRL
	OpARMMVNshiftRA
	OpARMADCshiftLL
	OpARMADCshiftRL
	OpARMADCshiftRA
	OpARMSBCshiftLL
	OpARMSBCshiftRL
	OpARMSBCshiftRA
	OpARMRSCshiftLL
	OpARMRSCshiftRL
	OpARMRSCshiftRA
	OpARMADDSshiftLL
	OpARMADDSshiftRL
	OpARMADDSshiftRA
	OpARMSUBSshiftLL
	OpARMSUBSshiftRL
	OpARMSUBSshiftRA
	OpARMRSBSshiftLL
	OpARMRSBSshiftRL
	OpARMRSBSshiftRA
	OpARMADDshiftLLreg
	OpARMADDshiftRLreg
	OpARMADDshiftRAreg
	OpARMSUBshiftLLreg
	OpARMSUBshiftRLreg
	OpARMSUBshiftRAreg
	OpARMRSBshiftLLreg
	OpARMRSBshiftRLreg
	OpARMRSBshiftRAreg
	OpARMANDshiftLLreg
	OpARMANDshiftRLreg
	OpARMANDshiftRAreg
	OpARMORshiftLLreg
	OpARMORshiftRLreg
	OpARMORshiftRAreg
	OpARMXORshiftLLreg
	OpARMXORshiftRLreg
	OpARMXORshiftRAreg
	OpARMBICshiftLLreg
	OpARMBICshiftRLreg
	OpARMBICshiftRAreg
	OpARMMVNshiftLLreg
	OpARMMVNshiftRLreg
	OpARMMVNshiftRAreg
	OpARMADCshiftLLreg
	OpARMADCshiftRLreg
	OpARMADCshiftRAreg
	OpARMSBCshiftLLreg
	OpARMSBCshiftRLreg
	OpARMSBCshiftRAreg
	OpARMRSCshiftLLreg
	OpARMRSCshiftRLreg
	OpARMRSCshiftRAreg
	OpARMADDSshiftLLreg
	OpARMADDSshiftRLreg
	OpARMADDSshiftRAreg
	OpARMSUBSshiftLLreg
	OpARMSUBSshiftRLreg
	OpARMSUBSshiftRAreg
	OpARMRSBSshiftLLreg
	OpARMRSBSshiftRLreg
	OpARMRSBSshiftRAreg
	OpARMCMP
	OpARMCMPconst
	OpARMCMN
	OpARMCMNconst
	OpARMTST
	OpARMTSTconst
	OpARMTEQ
	OpARMTEQconst
	OpARMCMPF
	OpARMCMPD
	OpARMCMPshiftLL
	OpARMCMPshiftRL
	OpARMCMPshiftRA
	OpARMCMNshiftLL
	OpARMCMNshiftRL
	OpARMCMNshiftRA
	OpARMTSTshiftLL
	OpARMTSTshiftRL
	OpARMTSTshiftRA
	OpARMTEQshiftLL
	OpARMTEQshiftRL
	OpARMTEQshiftRA
	OpARMCMPshiftLLreg
	OpARMCMPshiftRLreg
	OpARMCMPshiftRAreg
	OpARMCMNshiftLLreg
	OpARMCMNshiftRLreg
	OpARMCMNshiftRAreg
	OpARMTSTshiftLLreg
	OpARMTSTshiftRLreg
	OpARMTSTshiftRAreg
	OpARMTEQshiftLLreg
	OpARMTEQshiftRLreg
	OpARMTEQshiftRAreg
	OpARMCMPF0
	OpARMCMPD0
	OpARMMOVWconst
	OpARMMOVFconst
	OpARMMOVDconst
	OpARMMOVWaddr
	OpARMMOVBload
	OpARMMOVBUload
	OpARMMOVHload
	OpARMMOVHUload
	OpARMMOVWload
	OpARMMOVFload
	OpARMMOVDload
	OpARMMOVBstore
	OpARMMOVHstore
	OpARMMOVWstore
	OpARMMOVFstore
	OpARMMOVDstore
	OpARMMOVWloadidx
	OpARMMOVWloadshiftLL
	OpARMMOVWloadshiftRL
	OpARMMOVWloadshiftRA
	OpARMMOVBUloadidx
	OpARMMOVBloadidx
	OpARMMOVHUloadidx
	OpARMMOVHloadidx
	OpARMMOVWstoreidx
	OpARMMOVWstoreshiftLL
	OpARMMOVWstoreshiftRL
	OpARMMOVWstoreshiftRA
	OpARMMOVBstoreidx
	OpARMMOVHstoreidx
	OpARMMOVBreg
	OpARMMOVBUreg
	OpARMMOVHreg
	OpARMMOVHUreg
	OpARMMOVWreg
	OpARMMOVWnop
	OpARMMOVWF
	OpARMMOVWD
	OpARMMOVWUF
	OpARMMOVWUD
	OpARMMOVFW
	OpARMMOVDW
	OpARMMOVFWU
	OpARMMOVDWU
	OpARMMOVFD
	OpARMMOVDF
	OpARMCMOVWHSconst
	OpARMCMOVWLSconst
	OpARMSRAcond
	OpARMCALLstatic
	OpARMCALLtail
	OpARMCALLclosure
	OpARMCALLinter
	OpARMLoweredNilCheck
	OpARMEqual
	OpARMNotEqual
	OpARMLessThan
	OpARMLessEqual
	OpARMGreaterThan
	OpARMGreaterEqual
	OpARMLessThanU
	OpARMLessEqualU
	OpARMGreaterThanU
	OpARMGreaterEqualU
	OpARMDUFFZERO
	OpARMDUFFCOPY
	OpARMLoweredZero
	OpARMLoweredMove
	OpARMLoweredGetClosurePtr
	OpARMLoweredGetCallerSP
	OpARMLoweredGetCallerPC
	OpARMLoweredPanicBoundsA
	OpARMLoweredPanicBoundsB
	OpARMLoweredPanicBoundsC
	OpARMLoweredPanicExtendA
	OpARMLoweredPanicExtendB
	OpARMLoweredPanicExtendC
	OpARMFlagConstant
	OpARMInvertFlags
	OpARMLoweredWB

	OpARM64ADCSflags
	OpARM64ADCzerocarry
	OpARM64ADD
	OpARM64ADDconst
	OpARM64ADDSconstflags
	OpARM64ADDSflags
	OpARM64SUB
	OpARM64SUBconst
	OpARM64SBCSflags
	OpARM64SUBSflags
	OpARM64MUL
	OpARM64MULW
	OpARM64MNEG
	OpARM64MNEGW
	OpARM64MULH
	OpARM64UMULH
	OpARM64MULL
	OpARM64UMULL
	OpARM64DIV
	OpARM64UDIV
	OpARM64DIVW
	OpARM64UDIVW
	OpARM64MOD
	OpARM64UMOD
	OpARM64MODW
	OpARM64UMODW
	OpARM64FADDS
	OpARM64FADDD
	OpARM64FSUBS
	OpARM64FSUBD
	OpARM64FMULS
	OpARM64FMULD
	OpARM64FNMULS
	OpARM64FNMULD
	OpARM64FDIVS
	OpARM64FDIVD
	OpARM64AND
	OpARM64ANDconst
	OpARM64OR
	OpARM64ORconst
	OpARM64XOR
	OpARM64XORconst
	OpARM64BIC
	OpARM64EON
	OpARM64ORN
	OpARM64MVN
	OpARM64NEG
	OpARM64NEGSflags
	OpARM64NGCzerocarry
	OpARM64FABSD
	OpARM64FNEGS
	OpARM64FNEGD
	OpARM64FSQRTD
	OpARM64FSQRTS
	OpARM64REV
	OpARM64REVW
	OpARM64REV16
	OpARM64REV16W
	OpARM64RBIT
	OpARM64RBITW
	OpARM64CLZ
	OpARM64CLZW
	OpARM64VCNT
	OpARM64VUADDLV
	OpARM64LoweredRound32F
	OpARM64LoweredRound64F
	OpARM64FMADDS
	OpARM64FMADDD
	OpARM64FNMADDS
	OpARM64FNMADDD
	OpARM64FMSUBS
	OpARM64FMSUBD
	OpARM64FNMSUBS
	OpARM64FNMSUBD
	OpARM64MADD
	OpARM64MADDW
	OpARM64MSUB
	OpARM64MSUBW
	OpARM64SLL
	OpARM64SLLconst
	OpARM64SRL
	OpARM64SRLconst
	OpARM64SRA
	OpARM64SRAconst
	OpARM64ROR
	OpARM64RORW
	OpARM64RORconst
	OpARM64RORWconst
	OpARM64EXTRconst
	OpARM64EXTRWconst
	OpARM64CMP
	OpARM64CMPconst
	OpARM64CMPW
	OpARM64CMPWconst
	OpARM64CMN
	OpARM64CMNconst
	OpARM64CMNW
	OpARM64CMNWconst
	OpARM64TST
	OpARM64TSTconst
	OpARM64TSTW
	OpARM64TSTWconst
	OpARM64FCMPS
	OpARM64FCMPD
	OpARM64FCMPS0
	OpARM64FCMPD0
	OpARM64MVNshiftLL
	OpARM64MVNshiftRL
	OpARM64MVNshiftRA
	OpARM64MVNshiftRO
	OpARM64NEGshiftLL
	OpARM64NEGshiftRL
	OpARM64NEGshiftRA
	OpARM64ADDshiftLL
	OpARM64ADDshiftRL
	OpARM64ADDshiftRA
	OpARM64SUBshiftLL
	OpARM64SUBshiftRL
	OpARM64SUBshiftRA
	OpARM64ANDshiftLL
	OpARM64ANDshiftRL
	OpARM64ANDshiftRA
	OpARM64ANDshiftRO
	OpARM64ORshiftLL
	OpARM64ORshiftRL
	OpARM64ORshiftRA
	OpARM64ORshiftRO
	OpARM64XORshiftLL
	OpARM64XORshiftRL
	OpARM64XORshiftRA
	OpARM64XORshiftRO
	OpARM64BICshiftLL
	OpARM64BICshiftRL
	OpARM64BICshiftRA
	OpARM64BICshiftRO
	OpARM64EONshiftLL
	OpARM64EONshiftRL
	OpARM64EONshiftRA
	OpARM64EONshiftRO
	OpARM64ORNshiftLL
	OpARM64ORNshiftRL
	OpARM64ORNshiftRA
	OpARM64ORNshiftRO
	OpARM64CMPshiftLL
	OpARM64CMPshiftRL
	OpARM64CMPshiftRA
	OpARM64CMNshiftLL
	OpARM64CMNshiftRL
	OpARM64CMNshiftRA
	OpARM64TSTshiftLL
	OpARM64TSTshiftRL
	OpARM64TSTshiftRA
	OpARM64TSTshiftRO
	OpARM64BFI
	OpARM64BFXIL
	OpARM64SBFIZ
	OpARM64SBFX
	OpARM64UBFIZ
	OpARM64UBFX
	OpARM64MOVDconst
	OpARM64FMOVSconst
	OpARM64FMOVDconst
	OpARM64MOVDaddr
	OpARM64MOVBload
	OpARM64MOVBUload
	OpARM64MOVHload
	OpARM64MOVHUload
	OpARM64MOVWload
	OpARM64MOVWUload
	OpARM64MOVDload
	OpARM64LDP
	OpARM64FMOVSload
	OpARM64FMOVDload
	OpARM64MOVDloadidx
	OpARM64MOVWloadidx
	OpARM64MOVWUloadidx
	OpARM64MOVHloadidx
	OpARM64MOVHUloadidx
	OpARM64MOVBloadidx
	OpARM64MOVBUloadidx
	OpARM64FMOVSloadidx
	OpARM64FMOVDloadidx
	OpARM64MOVHloadidx2
	OpARM64MOVHUloadidx2
	OpARM64MOVWloadidx4
	OpARM64MOVWUloadidx4
	OpARM64MOVDloadidx8
	OpARM64FMOVSloadidx4
	OpARM64FMOVDloadidx8
	OpARM64MOVBstore
	OpARM64MOVHstore
	OpARM64MOVWstore
	OpARM64MOVDstore
	OpARM64STP
	OpARM64FMOVSstore
	OpARM64FMOVDstore
	OpARM64MOVBstoreidx
	OpARM64MOVHstoreidx
	OpARM64MOVWstoreidx
	OpARM64MOVDstoreidx
	OpARM64FMOVSstoreidx
	OpARM64FMOVDstoreidx
	OpARM64MOVHstoreidx2
	OpARM64MOVWstoreidx4
	OpARM64MOVDstoreidx8
	OpARM64FMOVSstoreidx4
	OpARM64FMOVDstoreidx8
	OpARM64MOVBstorezero
	OpARM64MOVHstorezero
	OpARM64MOVWstorezero
	OpARM64MOVDstorezero
	OpARM64MOVQstorezero
	OpARM64MOVBstorezeroidx
	OpARM64MOVHstorezeroidx
	OpARM64MOVWstorezeroidx
	OpARM64MOVDstorezeroidx
	OpARM64MOVHstorezeroidx2
	OpARM64MOVWstorezeroidx4
	OpARM64MOVDstorezeroidx8
	OpARM64FMOVDgpfp
	OpARM64FMOVDfpgp
	OpARM64FMOVSgpfp
	OpARM64FMOVSfpgp
	OpARM64MOVBreg
	OpARM64MOVBUreg
	OpARM64MOVHreg
	OpARM64MOVHUreg
	OpARM64MOVWreg
	OpARM64MOVWUreg
	OpARM64MOVDreg
	OpARM64MOVDnop
	OpARM64SCVTFWS
	OpARM64SCVTFWD
	OpARM64UCVTFWS
	OpARM64UCVTFWD
	OpARM64SCVTFS
	OpARM64SCVTFD
	OpARM64UCVTFS
	OpARM64UCVTFD
	OpARM64FCVTZSSW
	OpARM64FCVTZSDW
	OpARM64FCVTZUSW
	OpARM64FCVTZUDW
	OpARM64FCVTZSS
	OpARM64FCVTZSD
	OpARM64FCVTZUS
	OpARM64FCVTZUD
	OpARM64FCVTSD
	OpARM64FCVTDS
	OpARM64FRINTAD
	OpARM64FRINTMD
	OpARM64FRINTND
	OpARM64FRINTPD
	OpARM64FRINTZD
	OpARM64CSEL
	OpARM64CSEL0
	OpARM64CSINC
	OpARM64CSINV
	OpARM64CSNEG
	OpARM64CSETM
	OpARM64CALLstatic
	OpARM64CALLtail
	OpARM64CALLclosure
	OpARM64CALLinter
	OpARM64LoweredNilCheck
	OpARM64Equal
	OpARM64NotEqual
	OpARM64LessThan
	OpARM64LessEqual
	OpARM64GreaterThan
	OpARM64GreaterEqual
	OpARM64LessThanU
	OpARM64LessEqualU
	OpARM64GreaterThanU
	OpARM64GreaterEqualU
	OpARM64LessThanF
	OpARM64LessEqualF
	OpARM64GreaterThanF
	OpARM64GreaterEqualF
	OpARM64NotLessThanF
	OpARM64NotLessEqualF
	OpARM64NotGreaterThanF
	OpARM64NotGreaterEqualF
	OpARM64LessThanNoov
	OpARM64GreaterEqualNoov
	OpARM64DUFFZERO
	OpARM64LoweredZero
	OpARM64DUFFCOPY
	OpARM64LoweredMove
	OpARM64LoweredGetClosurePtr
	OpARM64LoweredGetCallerSP
	OpARM64LoweredGetCallerPC
	OpARM64FlagConstant
	OpARM64InvertFlags
	OpARM64LDAR
	OpARM64LDARB
	OpARM64LDARW
	OpARM64STLRB
	OpARM64STLR
	OpARM64STLRW
	OpARM64LoweredAtomicExchange64
	OpARM64LoweredAtomicExchange32
	OpARM64LoweredAtomicExchange64Variant
	OpARM64LoweredAtomicExchange32Variant
	OpARM64LoweredAtomicAdd64
	OpARM64LoweredAtomicAdd32
	OpARM64LoweredAtomicAdd64Variant
	OpARM64LoweredAtomicAdd32Variant
	OpARM64LoweredAtomicCas64
	OpARM64LoweredAtomicCas32
	OpARM64LoweredAtomicCas64Variant
	OpARM64LoweredAtomicCas32Variant
	OpARM64LoweredAtomicAnd8
	OpARM64LoweredAtomicAnd32
	OpARM64LoweredAtomicOr8
	OpARM64LoweredAtomicOr32
	OpARM64LoweredAtomicAnd8Variant
	OpARM64LoweredAtomicAnd32Variant
	OpARM64LoweredAtomicOr8Variant
	OpARM64LoweredAtomicOr32Variant
	OpARM64LoweredWB
	OpARM64LoweredPanicBoundsA
	OpARM64LoweredPanicBoundsB
	OpARM64LoweredPanicBoundsC
	OpARM64PRFM
	OpARM64DMB

	OpLOONG64ADDV
	OpLOONG64ADDVconst
	OpLOONG64SUBV
	OpLOONG64SUBVconst
	OpLOONG64MULV
	OpLOONG64MULHV
	OpLOONG64MULHVU
	OpLOONG64DIVV
	OpLOONG64DIVVU
	OpLOONG64REMV
	OpLOONG64REMVU
	OpLOONG64ADDF
	OpLOONG64ADDD
	OpLOONG64SUBF
	OpLOONG64SUBD
	OpLOONG64MULF
	OpLOONG64MULD
	OpLOONG64DIVF
	OpLOONG64DIVD
	OpLOONG64AND
	OpLOONG64ANDconst
	OpLOONG64OR
	OpLOONG64ORconst
	OpLOONG64XOR
	OpLOONG64XORconst
	OpLOONG64NOR
	OpLOONG64NORconst
	OpLOONG64NEGV
	OpLOONG64NEGF
	OpLOONG64NEGD
	OpLOONG64SQRTD
	OpLOONG64SQRTF
	OpLOONG64MASKEQZ
	OpLOONG64MASKNEZ
	OpLOONG64SLLV
	OpLOONG64SLLVconst
	OpLOONG64SRLV
	OpLOONG64SRLVconst
	OpLOONG64SRAV
	OpLOONG64SRAVconst
	OpLOONG64ROTR
	OpLOONG64ROTRV
	OpLOONG64ROTRconst
	OpLOONG64ROTRVconst
	OpLOONG64SGT
	OpLOONG64SGTconst
	OpLOONG64SGTU
	OpLOONG64SGTUconst
	OpLOONG64CMPEQF
	OpLOONG64CMPEQD
	OpLOONG64CMPGEF
	OpLOONG64CMPGED
	OpLOONG64CMPGTF
	OpLOONG64CMPGTD
	OpLOONG64MOVVconst
	OpLOONG64MOVFconst
	OpLOONG64MOVDconst
	OpLOONG64MOVVaddr
	OpLOONG64MOVBload
	OpLOONG64MOVBUload
	OpLOONG64MOVHload
	OpLOONG64MOVHUload
	OpLOONG64MOVWload
	OpLOONG64MOVWUload
	OpLOONG64MOVVload
	OpLOONG64MOVFload
	OpLOONG64MOVDload
	OpLOONG64MOVBstore
	OpLOONG64MOVHstore
	OpLOONG64MOVWstore
	OpLOONG64MOVVstore
	OpLOONG64MOVFstore
	OpLOONG64MOVDstore
	OpLOONG64MOVBstorezero
	OpLOONG64MOVHstorezero
	OpLOONG64MOVWstorezero
	OpLOONG64MOVVstorezero
	OpLOONG64MOVBreg
	OpLOONG64MOVBUreg
	OpLOONG64MOVHreg
	OpLOONG64MOVHUreg
	OpLOONG64MOVWreg
	OpLOONG64MOVWUreg
	OpLOONG64MOVVreg
	OpLOONG64MOVVnop
	OpLOONG64MOVWF
	OpLOONG64MOVWD
	OpLOONG64MOVVF
	OpLOONG64MOVVD
	OpLOONG64TRUNCFW
	OpLOONG64TRUNCDW
	OpLOONG64TRUNCFV
	OpLOONG64TRUNCDV
	OpLOONG64MOVFD
	OpLOONG64MOVDF
	OpLOONG64CALLstatic
	OpLOONG64CALLtail
	OpLOONG64CALLclosure
	OpLOONG64CALLinter
	OpLOONG64DUFFZERO
	OpLOONG64DUFFCOPY
	OpLOONG64LoweredZero
	OpLOONG64LoweredMove
	OpLOONG64LoweredAtomicLoad8
	OpLOONG64LoweredAtomicLoad32
	OpLOONG64LoweredAtomicLoad64
	OpLOONG64LoweredAtomicStore8
	OpLOONG64LoweredAtomicStore32
	OpLOONG64LoweredAtomicStore64
	OpLOONG64LoweredAtomicStorezero32
	OpLOONG64LoweredAtomicStorezero64
	OpLOONG64LoweredAtomicExchange32
	OpLOONG64LoweredAtomicExchange64
	OpLOONG64LoweredAtomicAdd32
	OpLOONG64LoweredAtomicAdd64
	OpLOONG64LoweredAtomicAddconst32
	OpLOONG64LoweredAtomicAddconst64
	OpLOONG64LoweredAtomicCas32
	OpLOONG64LoweredAtomicCas64
	OpLOONG64LoweredNilCheck
	OpLOONG64FPFlagTrue
	OpLOONG64FPFlagFalse
	OpLOONG64LoweredGetClosurePtr
	OpLOONG64LoweredGetCallerSP
	OpLOONG64LoweredGetCallerPC
	OpLOONG64LoweredWB
	OpLOONG64LoweredPanicBoundsA
	OpLOONG64LoweredPanicBoundsB
	OpLOONG64LoweredPanicBoundsC

	OpMIPSADD
	OpMIPSADDconst
	OpMIPSSUB
	OpMIPSSUBconst
	OpMIPSMUL
	OpMIPSMULT
	OpMIPSMULTU
	OpMIPSDIV
	OpMIPSDIVU
	OpMIPSADDF
	OpMIPSADDD
	OpMIPSSUBF
	OpMIPSSUBD
	OpMIPSMULF
	OpMIPSMULD
	OpMIPSDIVF
	OpMIPSDIVD
	OpMIPSAND
	OpMIPSANDconst
	OpMIPSOR
	OpMIPSORconst
	OpMIPSXOR
	OpMIPSXORconst
	OpMIPSNOR
	OpMIPSNORconst
	OpMIPSNEG
	OpMIPSNEGF
	OpMIPSNEGD
	OpMIPSABSD
	OpMIPSSQRTD
	OpMIPSSQRTF
	OpMIPSSLL
	OpMIPSSLLconst
	OpMIPSSRL
	OpMIPSSRLconst
	OpMIPSSRA
	OpMIPSSRAconst
	OpMIPSCLZ
	OpMIPSSGT
	OpMIPSSGTconst
	OpMIPSSGTzero
	OpMIPSSGTU
	OpMIPSSGTUconst
	OpMIPSSGTUzero
	OpMIPSCMPEQF
	OpMIPSCMPEQD
	OpMIPSCMPGEF
	OpMIPSCMPGED
	OpMIPSCMPGTF
	OpMIPSCMPGTD
	OpMIPSMOVWconst
	OpMIPSMOVFconst
	OpMIPSMOVDconst
	OpMIPSMOVWaddr
	OpMIPSMOVBload
	OpMIPSMOVBUload
	OpMIPSMOVHload
	OpMIPSMOVHUload
	OpMIPSMOVWload
	OpMIPSMOVFload
	OpMIPSMOVDload
	OpMIPSMOVBstore
	OpMIPSMOVHstore
	OpMIPSMOVWstore
	OpMIPSMOVFstore
	OpMIPSMOVDstore
	OpMIPSMOVBstorezero
	OpMIPSMOVHstorezero
	OpMIPSMOVWstorezero
	OpMIPSMOVWfpgp
	OpMIPSMOVWgpfp
	OpMIPSMOVBreg
	OpMIPSMOVBUreg
	OpMIPSMOVHreg
	OpMIPSMOVHUreg
	OpMIPSMOVWreg
	OpMIPSMOVWnop
	OpMIPSCMOVZ
	OpMIPSCMOVZzero
	OpMIPSMOVWF
	OpMIPSMOVWD
	OpMIPSTRUNCFW
	OpMIPSTRUNCDW
	OpMIPSMOVFD
	OpMIPSMOVDF
	OpMIPSCALLstatic
	OpMIPSCALLtail
	OpMIPSCALLclosure
	OpMIPSCALLinter
	OpMIPSLoweredAtomicLoad8
	OpMIPSLoweredAtomicLoad32
	OpMIPSLoweredAtomicStore8
	OpMIPSLoweredAtomicStore32
	OpMIPSLoweredAtomicStorezero
	OpMIPSLoweredAtomicExchange
	OpMIPSLoweredAtomicAdd
	OpMIPSLoweredAtomicAddconst
	OpMIPSLoweredAtomicCas
	OpMIPSLoweredAtomicAnd
	OpMIPSLoweredAtomicOr
	OpMIPSLoweredZero
	OpMIPSLoweredMove
	OpMIPSLoweredNilCheck
	OpMIPSFPFlagTrue
	OpMIPSFPFlagFalse
	OpMIPSLoweredGetClosurePtr
	OpMIPSLoweredGetCallerSP
	OpMIPSLoweredGetCallerPC
	OpMIPSLoweredWB
	OpMIPSLoweredPanicBoundsA
	OpMIPSLoweredPanicBoundsB
	OpMIPSLoweredPanicBoundsC
	OpMIPSLoweredPanicExtendA
	OpMIPSLoweredPanicExtendB
	OpMIPSLoweredPanicExtendC

	OpMIPS64ADDV
	OpMIPS64ADDVconst
	OpMIPS64SUBV
	OpMIPS64SUBVconst
	OpMIPS64MULV
	OpMIPS64MULVU
	OpMIPS64DIVV
	OpMIPS64DIVVU
	OpMIPS64ADDF
	OpMIPS64ADDD
	OpMIPS64SUBF
	OpMIPS64SUBD
	OpMIPS64MULF
	OpMIPS64MULD
	OpMIPS64DIVF
	OpMIPS64DIVD
	OpMIPS64AND
	OpMIPS64ANDconst
	OpMIPS64OR
	OpMIPS64ORconst
	OpMIPS64XOR
	OpMIPS64XORconst
	OpMIPS64NOR
	OpMIPS64NORconst
	OpMIPS64NEGV
	OpMIPS64NEGF
	OpMIPS64NEGD
	OpMIPS64ABSD
	OpMIPS64SQRTD
	OpMIPS64SQRTF
	OpMIPS64SLLV
	OpMIPS64SLLVconst
	OpMIPS64SRLV
	OpMIPS64SRLVconst
	OpMIPS64SRAV
	OpMIPS64SRAVconst
	OpMIPS64SGT
	OpMIPS64SGTconst
	OpMIPS64SGTU
	OpMIPS64SGTUconst
	OpMIPS64CMPEQF
	OpMIPS64CMPEQD
	OpMIPS64CMPGEF
	OpMIPS64CMPGED
	OpMIPS64CMPGTF
	OpMIPS64CMPGTD
	OpMIPS64MOVVconst
	OpMIPS64MOVFconst
	OpMIPS64MOVDconst
	OpMIPS64MOVVaddr
	OpMIPS64MOVBload
	OpMIPS64MOVBUload
	OpMIPS64MOVHload
	OpMIPS64MOVHUload
	OpMIPS64MOVWload
	OpMIPS64MOVWUload
	OpMIPS64MOVVload
	OpMIPS64MOVFload
	OpMIPS64MOVDload
	OpMIPS64MOVBstore
	OpMIPS64MOVHstore
	OpMIPS64MOVWstore
	OpMIPS64MOVVstore
	OpMIPS64MOVFstore
	OpMIPS64MOVDstore
	OpMIPS64MOVBstorezero
	OpMIPS64MOVHstorezero
	OpMIPS64MOVWstorezero
	OpMIPS64MOVVstorezero
	OpMIPS64MOVWfpgp
	OpMIPS64MOVWgpfp
	OpMIPS64MOVVfpgp
	OpMIPS64MOVVgpfp
	OpMIPS64MOVBreg
	OpMIPS64MOVBUreg
	OpMIPS64MOVHreg
	OpMIPS64MOVHUreg
	OpMIPS64MOVWreg
	OpMIPS64MOVWUreg
	OpMIPS64MOVVreg
	OpMIPS64MOVVnop
	OpMIPS64MOVWF
	OpMIPS64MOVWD
	OpMIPS64MOVVF
	OpMIPS64MOVVD
	OpMIPS64TRUNCFW
	OpMIPS64TRUNCDW
	OpMIPS64TRUNCFV
	OpMIPS64TRUNCDV
	OpMIPS64MOVFD
	OpMIPS64MOVDF
	OpMIPS64CALLstatic
	OpMIPS64CALLtail
	OpMIPS64CALLclosure
	OpMIPS64CALLinter
	OpMIPS64DUFFZERO
	OpMIPS64DUFFCOPY
	OpMIPS64LoweredZero
	OpMIPS64LoweredMove
	OpMIPS64LoweredAtomicAnd32
	OpMIPS64LoweredAtomicOr32
	OpMIPS64LoweredAtomicLoad8
	OpMIPS64LoweredAtomicLoad32
	OpMIPS64LoweredAtomicLoad64
	OpMIPS64LoweredAtomicStore8
	OpMIPS64LoweredAtomicStore32
	OpMIPS64LoweredAtomicStore64
	OpMIPS64LoweredAtomicStorezero32
	OpMIPS64LoweredAtomicStorezero64
	OpMIPS64LoweredAtomicExchange32
	OpMIPS64LoweredAtomicExchange64
	OpMIPS64LoweredAtomicAdd32
	OpMIPS64LoweredAtomicAdd64
	OpMIPS64LoweredAtomicAddconst32
	OpMIPS64LoweredAtomicAddconst64
	OpMIPS64LoweredAtomicCas32
	OpMIPS64LoweredAtomicCas64
	OpMIPS64LoweredNilCheck
	OpMIPS64FPFlagTrue
	OpMIPS64FPFlagFalse
	OpMIPS64LoweredGetClosurePtr
	OpMIPS64LoweredGetCallerSP
	OpMIPS64LoweredGetCallerPC
	OpMIPS64LoweredWB
	OpMIPS64LoweredPanicBoundsA
	OpMIPS64LoweredPanicBoundsB
	OpMIPS64LoweredPanicBoundsC

	OpPPC64ADD
	OpPPC64ADDconst
	OpPPC64FADD
	OpPPC64FADDS
	OpPPC64SUB
	OpPPC64SUBFCconst
	OpPPC64FSUB
	OpPPC64FSUBS
	OpPPC64MULLD
	OpPPC64MULLW
	OpPPC64MULLDconst
	OpPPC64MULLWconst
	OpPPC64MADDLD
	OpPPC64MULHD
	OpPPC64MULHW
	OpPPC64MULHDU
	OpPPC64MULHWU
	OpPPC64FMUL
	OpPPC64FMULS
	OpPPC64FMADD
	OpPPC64FMADDS
	OpPPC64FMSUB
	OpPPC64FMSUBS
	OpPPC64SRAD
	OpPPC64SRAW
	OpPPC64SRD
	OpPPC64SRW
	OpPPC64SLD
	OpPPC64SLW
	OpPPC64ROTL
	OpPPC64ROTLW
	OpPPC64RLDICL
	OpPPC64CLRLSLWI
	OpPPC64CLRLSLDI
	OpPPC64ADDC
	OpPPC64SUBC
	OpPPC64ADDCconst
	OpPPC64SUBCconst
	OpPPC64ADDE
	OpPPC64SUBE
	OpPPC64ADDZEzero
	OpPPC64SUBZEzero
	OpPPC64SRADconst
	OpPPC64SRAWconst
	OpPPC64SRDconst
	OpPPC64SRWconst
	OpPPC64SLDconst
	OpPPC64SLWconst
	OpPPC64ROTLconst
	OpPPC64ROTLWconst
	OpPPC64EXTSWSLconst
	OpPPC64RLWINM
	OpPPC64RLWNM
	OpPPC64RLWMI
	OpPPC64CNTLZD
	OpPPC64CNTLZW
	OpPPC64CNTTZD
	OpPPC64CNTTZW
	OpPPC64POPCNTD
	OpPPC64POPCNTW
	OpPPC64POPCNTB
	OpPPC64FDIV
	OpPPC64FDIVS
	OpPPC64DIVD
	OpPPC64DIVW
	OpPPC64DIVDU
	OpPPC64DIVWU
	OpPPC64MODUD
	OpPPC64MODSD
	OpPPC64MODUW
	OpPPC64MODSW
	OpPPC64FCTIDZ
	OpPPC64FCTIWZ
	OpPPC64FCFID
	OpPPC64FCFIDS
	OpPPC64FRSP
	OpPPC64MFVSRD
	OpPPC64MTVSRD
	OpPPC64AND
	OpPPC64ANDN
	OpPPC64ANDCC
	OpPPC64OR
	OpPPC64ORN
	OpPPC64ORCC
	OpPPC64NOR
	OpPPC64XOR
	OpPPC64XORCC
	OpPPC64EQV
	OpPPC64NEG
	OpPPC64BRD
	OpPPC64BRW
	OpPPC64BRH
	OpPPC64FNEG
	OpPPC64FSQRT
	OpPPC64FSQRTS
	OpPPC64FFLOOR
	OpPPC64FCEIL
	OpPPC64FTRUNC
	OpPPC64FROUND
	OpPPC64FABS
	OpPPC64FNABS
	OpPPC64FCPSGN
	OpPPC64ORconst
	OpPPC64XORconst
	OpPPC64ANDCCconst
	OpPPC64MOVBreg
	OpPPC64MOVBZreg
	OpPPC64MOVHreg
	OpPPC64MOVHZreg
	OpPPC64MOVWreg
	OpPPC64MOVWZreg
	OpPPC64MOVBZload
	OpPPC64MOVHload
	OpPPC64MOVHZload
	OpPPC64MOVWload
	OpPPC64MOVWZload
	OpPPC64MOVDload
	OpPPC64MOVDBRload
	OpPPC64MOVWBRload
	OpPPC64MOVHBRload
	OpPPC64MOVBZloadidx
	OpPPC64MOVHloadidx
	OpPPC64MOVHZloadidx
	OpPPC64MOVWloadidx
	OpPPC64MOVWZloadidx
	OpPPC64MOVDloadidx
	OpPPC64MOVHBRloadidx
	OpPPC64MOVWBRloadidx
	OpPPC64MOVDBRloadidx
	OpPPC64FMOVDloadidx
	OpPPC64FMOVSloadidx
	OpPPC64DCBT
	OpPPC64MOVDBRstore
	OpPPC64MOVWBRstore
	OpPPC64MOVHBRstore
	OpPPC64FMOVDload
	OpPPC64FMOVSload
	OpPPC64MOVBstore
	OpPPC64MOVHstore
	OpPPC64MOVWstore
	OpPPC64MOVDstore
	OpPPC64FMOVDstore
	OpPPC64FMOVSstore
	OpPPC64MOVBstoreidx
	OpPPC64MOVHstoreidx
	OpPPC64MOVWstoreidx
	OpPPC64MOVDstoreidx
	OpPPC64FMOVDstoreidx
	OpPPC64FMOVSstoreidx
	OpPPC64MOVHBRstoreidx
	OpPPC64MOVWBRstoreidx
	OpPPC64MOVDBRstoreidx
	OpPPC64MOVBstorezero
	OpPPC64MOVHstorezero
	OpPPC64MOVWstorezero
	OpPPC64MOVDstorezero
	OpPPC64MOVDaddr
	OpPPC64MOVDconst
	OpPPC64FMOVDconst
	OpPPC64FMOVSconst
	OpPPC64FCMPU
	OpPPC64CMP
	OpPPC64CMPU
	OpPPC64CMPW
	OpPPC64CMPWU
	OpPPC64CMPconst
	OpPPC64CMPUconst
	OpPPC64CMPWconst
	OpPPC64CMPWUconst
	OpPPC64ISEL
	OpPPC64ISELZ
	OpPPC64SETBC
	OpPPC64SETBCR
	OpPPC64Equal
	OpPPC64NotEqual
	OpPPC64LessThan
	OpPPC64FLessThan
	OpPPC64LessEqual
	OpPPC64FLessEqual
	OpPPC64GreaterThan
	OpPPC64FGreaterThan
	OpPPC64GreaterEqual
	OpPPC64FGreaterEqual
	OpPPC64LoweredGetClosurePtr
	OpPPC64LoweredGetCallerSP
	OpPPC64LoweredGetCallerPC
	OpPPC64LoweredNilCheck
	OpPPC64LoweredRound32F
	OpPPC64LoweredRound64F
	OpPPC64CALLstatic
	OpPPC64CALLtail
	OpPPC64CALLclosure
	OpPPC64CALLinter
	OpPPC64LoweredZero
	OpPPC64LoweredZeroShort
	OpPPC64LoweredQuadZeroShort
	OpPPC64LoweredQuadZero
	OpPPC64LoweredMove
	OpPPC64LoweredMoveShort
	OpPPC64LoweredQuadMove
	OpPPC64LoweredQuadMoveShort
	OpPPC64LoweredAtomicStore8
	OpPPC64LoweredAtomicStore32
	OpPPC64LoweredAtomicStore64
	OpPPC64LoweredAtomicLoad8
	OpPPC64LoweredAtomicLoad32
	OpPPC64LoweredAtomicLoad64
	OpPPC64LoweredAtomicLoadPtr
	OpPPC64LoweredAtomicAdd32
	OpPPC64LoweredAtomicAdd64
	OpPPC64LoweredAtomicExchange32
	OpPPC64LoweredAtomicExchange64
	OpPPC64LoweredAtomicCas64
	OpPPC64LoweredAtomicCas32
	OpPPC64LoweredAtomicAnd8
	OpPPC64LoweredAtomicAnd32
	OpPPC64LoweredAtomicOr8
	OpPPC64LoweredAtomicOr32
	OpPPC64LoweredWB
	OpPPC64LoweredPubBarrier
	OpPPC64LoweredPanicBoundsA
	OpPPC64LoweredPanicBoundsB
	OpPPC64LoweredPanicBoundsC
	OpPPC64InvertFlags
	OpPPC64FlagEQ
	OpPPC64FlagLT
	OpPPC64FlagGT

	OpRISCV64ADD
	OpRISCV64ADDI
	OpRISCV64ADDIW
	OpRISCV64NEG
	OpRISCV64NEGW
	OpRISCV64SUB
	OpRISCV64SUBW
	OpRISCV64MUL
	OpRISCV64MULW
	OpRISCV64MULH
	OpRISCV64MULHU
	OpRISCV64LoweredMuluhilo
	OpRISCV64LoweredMuluover
	OpRISCV64DIV
	OpRISCV64DIVU
	OpRISCV64DIVW
	OpRISCV64DIVUW
	OpRISCV64REM
	OpRISCV64REMU
	OpRISCV64REMW
	OpRISCV64REMUW
	OpRISCV64MOVaddr
	OpRISCV64MOVDconst
	OpRISCV64MOVBload
	OpRISCV64MOVHload
	OpRISCV64MOVWload
	OpRISCV64MOVDload
	OpRISCV64MOVBUload
	OpRISCV64MOVHUload
	OpRISCV64MOVWUload
	OpRISCV64MOVBstore
	OpRISCV64MOVHstore
	OpRISCV64MOVWstore
	OpRISCV64MOVDstore
	OpRISCV64MOVBstorezero
	OpRISCV64MOVHstorezero
	OpRISCV64MOVWstorezero
	OpRISCV64MOVDstorezero
	OpRISCV64MOVBreg
	OpRISCV64MOVHreg
	OpRISCV64MOVWreg
	OpRISCV64MOVDreg
	OpRISCV64MOVBUreg
	OpRISCV64MOVHUreg
	OpRISCV64MOVWUreg
	OpRISCV64MOVDnop
	OpRISCV64SLL
	OpRISCV64SRA
	OpRISCV64SRL
	OpRISCV64SLLI
	OpRISCV64SRAI
	OpRISCV64SRLI
	OpRISCV64XOR
	OpRISCV64XORI
	OpRISCV64OR
	OpRISCV64ORI
	OpRISCV64AND
	OpRISCV64ANDI
	OpRISCV64NOT
	OpRISCV64SEQZ
	OpRISCV64SNEZ
	OpRISCV64SLT
	OpRISCV64SLTI
	OpRISCV64SLTU
	OpRISCV64SLTIU
	OpRISCV64MOVconvert
	OpRISCV64CALLstatic
	OpRISCV64CALLtail
	OpRISCV64CALLclosure
	OpRISCV64CALLinter
	OpRISCV64DUFFZERO
	OpRISCV64DUFFCOPY
	OpRISCV64LoweredZero
	OpRISCV64LoweredMove
	OpRISCV64LoweredAtomicLoad8
	OpRISCV64LoweredAtomicLoad32
	OpRISCV64LoweredAtomicLoad64
	OpRISCV64LoweredAtomicStore8
	OpRISCV64LoweredAtomicStore32
	OpRISCV64LoweredAtomicStore64
	OpRISCV64LoweredAtomicExchange32
	OpRISCV64LoweredAtomicExchange64
	OpRISCV64LoweredAtomicAdd32
	OpRISCV64LoweredAtomicAdd64
	OpRISCV64LoweredAtomicCas32
	OpRISCV64LoweredAtomicCas64
	OpRISCV64LoweredAtomicAnd32
	OpRISCV64LoweredAtomicOr32
	OpRISCV64LoweredNilCheck
	OpRISCV64LoweredGetClosurePtr
	OpRISCV64LoweredGetCallerSP
	OpRISCV64LoweredGetCallerPC
	OpRISCV64LoweredWB
	OpRISCV64LoweredPanicBoundsA
	OpRISCV64LoweredPanicBoundsB
	OpRISCV64LoweredPanicBoundsC
	OpRISCV64FADDS
	OpRISCV64FSUBS
	OpRISCV64FMULS
	OpRISCV64FDIVS
	OpRISCV64FSQRTS
	OpRISCV64FNEGS
	OpRISCV64FMVSX
	OpRISCV64FCVTSW
	OpRISCV64FCVTSL
	OpRISCV64FCVTWS
	OpRISCV64FCVTLS
	OpRISCV64FMOVWload
	OpRISCV64FMOVWstore
	OpRISCV64FEQS
	OpRISCV64FNES
	OpRISCV64FLTS
	OpRISCV64FLES
	OpRISCV64FADDD
	OpRISCV64FSUBD
	OpRISCV64FMULD
	OpRISCV64FDIVD
	OpRISCV64FMADDD
	OpRISCV64FMSUBD
	OpRISCV64FNMADDD
	OpRISCV64FNMSUBD
	OpRISCV64FSQRTD
	OpRISCV64FNEGD
	OpRISCV64FABSD
	OpRISCV64FSGNJD
	OpRISCV64FMVDX
	OpRISCV64FCVTDW
	OpRISCV64FCVTDL
	OpRISCV64FCVTWD
	OpRISCV64FCVTLD
	OpRISCV64FCVTDS
	OpRISCV64FCVTSD
	OpRISCV64FMOVDload
	OpRISCV64FMOVDstore
	OpRISCV64FEQD
	OpRISCV64FNED
	OpRISCV64FLTD
	OpRISCV64FLED

	OpS390XFADDS
	OpS390XFADD
	OpS390XFSUBS
	OpS390XFSUB
	OpS390XFMULS
	OpS390XFMUL
	OpS390XFDIVS
	OpS390XFDIV
	OpS390XFNEGS
	OpS390XFNEG
	OpS390XFMADDS
	OpS390XFMADD
	OpS390XFMSUBS
	OpS390XFMSUB
	OpS390XLPDFR
	OpS390XLNDFR
	OpS390XCPSDR
	OpS390XFIDBR
	OpS390XFMOVSload
	OpS390XFMOVDload
	OpS390XFMOVSconst
	OpS390XFMOVDconst
	OpS390XFMOVSloadidx
	OpS390XFMOVDloadidx
	OpS390XFMOVSstore
	OpS390XFMOVDstore
	OpS390XFMOVSstoreidx
	OpS390XFMOVDstoreidx
	OpS390XADD
	OpS390XADDW
	OpS390XADDconst
	OpS390XADDWconst
	OpS390XADDload
	OpS390XADDWload
	OpS390XSUB
	OpS390XSUBW
	OpS390XSUBconst
	OpS390XSUBWconst
	OpS390XSUBload
	OpS390XSUBWload
	OpS390XMULLD
	OpS390XMULLW
	OpS390XMULLDconst
	OpS390XMULLWconst
	OpS390XMULLDload
	OpS390XMULLWload
	OpS390XMULHD
	OpS390XMULHDU
	OpS390XDIVD
	OpS390XDIVW
	OpS390XDIVDU
	OpS390XDIVWU
	OpS390XMODD
	OpS390XMODW
	OpS390XMODDU
	OpS390XMODWU
	OpS390XAND
	OpS390XANDW
	OpS390XANDconst
	OpS390XANDWconst
	OpS390XANDload
	OpS390XANDWload
	OpS390XOR
	OpS390XORW
	OpS390XORconst
	OpS390XORWconst
	OpS390XORload
	OpS390XORWload
	OpS390XXOR
	OpS390XXORW
	OpS390XXORconst
	OpS390XXORWconst
	OpS390XXORload
	OpS390XXORWload
	OpS390XADDC
	OpS390XADDCconst
	OpS390XADDE
	OpS390XSUBC
	OpS390XSUBE
	OpS390XCMP
	OpS390XCMPW
	OpS390XCMPU
	OpS390XCMPWU
	OpS390XCMPconst
	OpS390XCMPWconst
	OpS390XCMPUconst
	OpS390XCMPWUconst
	OpS390XFCMPS
	OpS390XFCMP
	OpS390XLTDBR
	OpS390XLTEBR
	OpS390XSLD
	OpS390XSLW
	OpS390XSLDconst
	OpS390XSLWconst
	OpS390XSRD
	OpS390XSRW
	OpS390XSRDconst
	OpS390XSRWconst
	OpS390XSRAD
	OpS390XSRAW
	OpS390XSRADconst
	OpS390XSRAWconst
	OpS390XRLLG
	OpS390XRLL
	OpS390XRLLconst
	OpS390XRXSBG
	OpS390XRISBGZ
	OpS390XNEG
	OpS390XNEGW
	OpS390XNOT
	OpS390XNOTW
	OpS390XFSQRT
	OpS390XFSQRTS
	OpS390XLOCGR
	OpS390XMOVBreg
	OpS390XMOVBZreg
	OpS390XMOVHreg
	OpS390XMOVHZreg
	OpS390XMOVWreg
	OpS390XMOVWZreg
	OpS390XMOVDconst
	OpS390XLDGR
	OpS390XLGDR
	OpS390XCFDBRA
	OpS390XCGDBRA
	OpS390XCFEBRA
	OpS390XCGEBRA
	OpS390XCEFBRA
	OpS390XCDFBRA
	OpS390XCEGBRA
	OpS390XCDGBRA
	OpS390XCLFEBR
	OpS390XCLFDBR
	OpS390XCLGEBR
	OpS390XCLGDBR
	OpS390XCELFBR
	OpS390XCDLFBR
	OpS390XCELGBR
	OpS390XCDLGBR
	OpS390XLEDBR
	OpS390XLDEBR
	OpS390XMOVDaddr
	OpS390XMOVDaddridx
	OpS390XMOVBZload
	OpS390XMOVBload
	OpS390XMOVHZload
	OpS390XMOVHload
	OpS390XMOVWZload
	OpS390XMOVWload
	OpS390XMOVDload
	OpS390XMOVWBR
	OpS390XMOVDBR
	OpS390XMOVHBRload
	OpS390XMOVWBRload
	OpS390XMOVDBRload
	OpS390XMOVBstore
	OpS390XMOVHstore
	OpS390XMOVWstore
	OpS390XMOVDstore
	OpS390XMOVHBRstore
	OpS390XMOVWBRstore
	OpS390XMOVDBRstore
	OpS390XMVC
	OpS390XMOVBZloadidx
	OpS390XMOVBloadidx
	OpS390XMOVHZloadidx
	OpS390XMOVHloadidx
	OpS390XMOVWZloadidx
	OpS390XMOVWloadidx
	OpS390XMOVDloadidx
	OpS390XMOVHBRloadidx
	OpS390XMOVWBRloadidx
	OpS390XMOVDBRloadidx
	OpS390XMOVBstoreidx
	OpS390XMOVHstoreidx
	OpS390XMOVWstoreidx
	OpS390XMOVDstoreidx
	OpS390XMOVHBRstoreidx
	OpS390XMOVWBRstoreidx
	OpS390XMOVDBRstoreidx
	OpS390XMOVBstoreconst
	OpS390XMOVHstoreconst
	OpS390XMOVWstoreconst
	OpS390XMOVDstoreconst
	OpS390XCLEAR
	OpS390XCALLstatic
	OpS390XCALLtail
	OpS390XCALLclosure
	OpS390XCALLinter
	OpS390XInvertFlags
	OpS390XLoweredGetG
	OpS390XLoweredGetClosurePtr
	OpS390XLoweredGetCallerSP
	OpS390XLoweredGetCallerPC
	OpS390XLoweredNilCheck
	OpS390XLoweredRound32F
	OpS390XLoweredRound64F
	OpS390XLoweredWB
	OpS390XLoweredPanicBoundsA
	OpS390XLoweredPanicBoundsB
	OpS390XLoweredPanicBoundsC
	OpS390XFlagEQ
	OpS390XFlagLT
	OpS390XFlagGT
	OpS390XFlagOV
	OpS390XSYNC
	OpS390XMOVBZatomicload
	OpS390XMOVWZatomicload
	OpS390XMOVDatomicload
	OpS390XMOVBatomicstore
	OpS390XMOVWatomicstore
	OpS390XMOVDatomicstore
	OpS390XLAA
	OpS390XLAAG
	OpS390XAddTupleFirst32
	OpS390XAddTupleFirst64
	OpS390XLAN
	OpS390XLANfloor
	OpS390XLAO
	OpS390XLAOfloor
	OpS390XLoweredAtomicCas32
	OpS390XLoweredAtomicCas64
	OpS390XLoweredAtomicExchange32
	OpS390XLoweredAtomicExchange64
	OpS390XFLOGR
	OpS390XPOPCNT
	OpS390XMLGR
	OpS390XSumBytes2
	OpS390XSumBytes4
	OpS390XSumBytes8
	OpS390XSTMG2
	OpS390XSTMG3
	OpS390XSTMG4
	OpS390XSTM2
	OpS390XSTM3
	OpS390XSTM4
	OpS390XLoweredMove
	OpS390XLoweredZero

	OpWasmLoweredStaticCall
	OpWasmLoweredTailCall
	OpWasmLoweredClosureCall
	OpWasmLoweredInterCall
	OpWasmLoweredAddr
	OpWasmLoweredMove
	OpWasmLoweredZero
	OpWasmLoweredGetClosurePtr
	OpWasmLoweredGetCallerPC
	OpWasmLoweredGetCallerSP
	OpWasmLoweredNilCheck
	OpWasmLoweredWB
	OpWasmLoweredConvert
	OpWasmSelect
	OpWasmI64Load8U
	OpWasmI64Load8S
	OpWasmI64Load16U
	OpWasmI64Load16S
	OpWasmI64Load32U
	OpWasmI64Load32S
	OpWasmI64Load
	OpWasmI64Store8
	OpWasmI64Store16
	OpWasmI64Store32
	OpWasmI64Store
	OpWasmF32Load
	OpWasmF64Load
	OpWasmF32Store
	OpWasmF64Store
	OpWasmI64Const
	OpWasmF32Const
	OpWasmF64Const
	OpWasmI64Eqz
	OpWasmI64Eq
	OpWasmI64Ne
	OpWasmI64LtS
	OpWasmI64LtU
	OpWasmI64GtS
	OpWasmI64GtU
	OpWasmI64LeS
	OpWasmI64LeU
	OpWasmI64GeS
	OpWasmI64GeU
	OpWasmF32Eq
	OpWasmF32Ne
	OpWasmF32Lt
	OpWasmF32Gt
	OpWasmF32Le
	OpWasmF32Ge
	OpWasmF64Eq
	OpWasmF64Ne
	OpWasmF64Lt
	OpWasmF64Gt
	OpWasmF64Le
	OpWasmF64Ge
	OpWasmI64Add
	OpWasmI64AddConst
	OpWasmI64Sub
	OpWasmI64Mul
	OpWasmI64DivS
	OpWasmI64DivU
	OpWasmI64RemS
	OpWasmI64RemU
	OpWasmI64And
	OpWasmI64Or
	OpWasmI64Xor
	OpWasmI64Shl
	OpWasmI64ShrS
	OpWasmI64ShrU
	OpWasmF32Neg
	OpWasmF32Add
	OpWasmF32Sub
	OpWasmF32Mul
	OpWasmF32Div
	OpWasmF64Neg
	OpWasmF64Add
	OpWasmF64Sub
	OpWasmF64Mul
	OpWasmF64Div
	OpWasmI64TruncSatF64S
	OpWasmI64TruncSatF64U
	OpWasmI64TruncSatF32S
	OpWasmI64TruncSatF32U
	OpWasmF32ConvertI64S
	OpWasmF32ConvertI64U
	OpWasmF64ConvertI64S
	OpWasmF64ConvertI64U
	OpWasmF32DemoteF64
	OpWasmF64PromoteF32
	OpWasmI64Extend8S
	OpWasmI64Extend16S
	OpWasmI64Extend32S
	OpWasmF32Sqrt
	OpWasmF32Trunc
	OpWasmF32Ceil
	OpWasmF32Floor
	OpWasmF32Nearest
	OpWasmF32Abs
	OpWasmF32Copysign
	OpWasmF64Sqrt
	OpWasmF64Trunc
	OpWasmF64Ceil
	OpWasmF64Floor
	OpWasmF64Nearest
	OpWasmF64Abs
	OpWasmF64Copysign
	OpWasmI64Ctz
	OpWasmI64Clz
	OpWasmI32Rotl
	OpWasmI64Rotl
	OpWasmI64Popcnt

	OpAdd8
	OpAdd16
	OpAdd32
	OpAdd64
	OpAddPtr
	OpAdd32F
	OpAdd64F
	OpSub8
	OpSub16
	OpSub32
	OpSub64
	OpSubPtr
	OpSub32F
	OpSub64F
	OpMul8
	OpMul16
	OpMul32
	OpMul64
	OpMul32F
	OpMul64F
	OpDiv32F
	OpDiv64F
	OpHmul32
	OpHmul32u
	OpHmul64
	OpHmul64u
	OpMul32uhilo
	OpMul64uhilo
	OpMul32uover
	OpMul64uover
	OpAvg32u
	OpAvg64u
	OpDiv8
	OpDiv8u
	OpDiv16
	OpDiv16u
	OpDiv32
	OpDiv32u
	OpDiv64
	OpDiv64u
	OpDiv128u
	OpMod8
	OpMod8u
	OpMod16
	OpMod16u
	OpMod32
	OpMod32u
	OpMod64
	OpMod64u
	OpAnd8
	OpAnd16
	OpAnd32
	OpAnd64
	OpOr8
	OpOr16
	OpOr32
	OpOr64
	OpXor8
	OpXor16
	OpXor32
	OpXor64
	OpLsh8x8
	OpLsh8x16
	OpLsh8x32
	OpLsh8x64
	OpLsh16x8
	OpLsh16x16
	OpLsh16x32
	OpLsh16x64
	OpLsh32x8
	OpLsh32x16
	OpLsh32x32
	OpLsh32x64
	OpLsh64x8
	OpLsh64x16
	OpLsh64x32
	OpLsh64x64
	OpRsh8x8
	OpRsh8x16
	OpRsh8x32
	OpRsh8x64
	OpRsh16x8
	OpRsh16x16
	OpRsh16x32
	OpRsh16x64
	OpRsh32x8
	OpRsh32x16
	OpRsh32x32
	OpRsh32x64
	OpRsh64x8
	OpRsh64x16
	OpRsh64x32
	OpRsh64x64
	OpRsh8Ux8
	OpRsh8Ux16
	OpRsh8Ux32
	OpRsh8Ux64
	OpRsh16Ux8
	OpRsh16Ux16
	OpRsh16Ux32
	OpRsh16Ux64
	OpRsh32Ux8
	OpRsh32Ux16
	OpRsh32Ux32
	OpRsh32Ux64
	OpRsh64Ux8
	OpRsh64Ux16
	OpRsh64Ux32
	OpRsh64Ux64
	OpEq8
	OpEq16
	OpEq32
	OpEq64
	OpEqPtr
	OpEqInter
	OpEqSlice
	OpEq32F
	OpEq64F
	OpNeq8
	OpNeq16
	OpNeq32
	OpNeq64
	OpNeqPtr
	OpNeqInter
	OpNeqSlice
	OpNeq32F
	OpNeq64F
	OpLess8
	OpLess8U
	OpLess16
	OpLess16U
	OpLess32
	OpLess32U
	OpLess64
	OpLess64U
	OpLess32F
	OpLess64F
	OpLeq8
	OpLeq8U
	OpLeq16
	OpLeq16U
	OpLeq32
	OpLeq32U
	OpLeq64
	OpLeq64U
	OpLeq32F
	OpLeq64F
	OpCondSelect
	OpAndB
	OpOrB
	OpEqB
	OpNeqB
	OpNot
	OpNeg8
	OpNeg16
	OpNeg32
	OpNeg64
	OpNeg32F
	OpNeg64F
	OpCom8
	OpCom16
	OpCom32
	OpCom64
	OpCtz8
	OpCtz16
	OpCtz32
	OpCtz64
	OpCtz8NonZero
	OpCtz16NonZero
	OpCtz32NonZero
	OpCtz64NonZero
	OpBitLen8
	OpBitLen16
	OpBitLen32
	OpBitLen64
	OpBswap16
	OpBswap32
	OpBswap64
	OpBitRev8
	OpBitRev16
	OpBitRev32
	OpBitRev64
	OpPopCount8
	OpPopCount16
	OpPopCount32
	OpPopCount64
	OpRotateLeft64
	OpRotateLeft32
	OpRotateLeft16
	OpRotateLeft8
	OpSqrt
	OpSqrt32
	OpFloor
	OpCeil
	OpTrunc
	OpRound
	OpRoundToEven
	OpAbs
	OpCopysign
	OpFMA
	OpPhi
	OpCopy
	OpConvert
	OpConstBool
	OpConstString
	OpConstNil
	OpConst8
	OpConst16
	OpConst32
	OpConst64
	OpConst32F
	OpConst64F
	OpConstInterface
	OpConstSlice
	OpInitMem
	OpArg
	OpArgIntReg
	OpArgFloatReg
	OpAddr
	OpLocalAddr
	OpSP
	OpSB
	OpSPanchored
	OpLoad
	OpDereference
	OpStore
	OpMove
	OpZero
	OpStoreWB
	OpMoveWB
	OpZeroWB
	OpWBend
	OpWB
	OpHasCPUFeature
	OpPanicBounds
	OpPanicExtend
	OpClosureCall
	OpStaticCall
	OpInterCall
	OpTailCall
	OpClosureLECall
	OpStaticLECall
	OpInterLECall
	OpTailLECall
	OpSignExt8to16
	OpSignExt8to32
	OpSignExt8to64
	OpSignExt16to32
	OpSignExt16to64
	OpSignExt32to64
	OpZeroExt8to16
	OpZeroExt8to32
	OpZeroExt8to64
	OpZeroExt16to32
	OpZeroExt16to64
	OpZeroExt32to64
	OpTrunc16to8
	OpTrunc32to8
	OpTrunc32to16
	OpTrunc64to8
	OpTrunc64to16
	OpTrunc64to32
	OpCvt32to32F
	OpCvt32to64F
	OpCvt64to32F
	OpCvt64to64F
	OpCvt32Fto32
	OpCvt32Fto64
	OpCvt64Fto32
	OpCvt64Fto64
	OpCvt32Fto64F
	OpCvt64Fto32F
	OpCvtBoolToUint8
	OpRound32F
	OpRound64F
	OpIsNonNil
	OpIsInBounds
	OpIsSliceInBounds
	OpNilCheck
	OpGetG
	OpGetClosurePtr
	OpGetCallerPC
	OpGetCallerSP
	OpPtrIndex
	OpOffPtr
	OpSliceMake
	OpSlicePtr
	OpSliceLen
	OpSliceCap
	OpSlicePtrUnchecked
	OpComplexMake
	OpComplexReal
	OpComplexImag
	OpStringMake
	OpStringPtr
	OpStringLen
	OpIMake
	OpITab
	OpIData
	OpStructMake0
	OpStructMake1
	OpStructMake2
	OpStructMake3
	OpStructMake4
	OpStructSelect
	OpArrayMake0
	OpArrayMake1
	OpArraySelect
	OpStoreReg
	OpLoadReg
	OpFwdRef
	OpUnknown
	OpVarDef
	OpVarLive
	OpKeepAlive
	OpInlMark
	OpInt64Make
	OpInt64Hi
	OpInt64Lo
	OpAdd32carry
	OpAdd32withcarry
	OpSub32carry
	OpSub32withcarry
	OpAdd64carry
	OpSub64borrow
	OpSignmask
	OpZeromask
	OpSlicemask
	OpSpectreIndex
	OpSpectreSliceIndex
	OpCvt32Uto32F
	OpCvt32Uto64F
	OpCvt32Fto32U
	OpCvt64Fto32U
	OpCvt64Uto32F
	OpCvt64Uto64F
	OpCvt32Fto64U
	OpCvt64Fto64U
	OpSelect0
	OpSelect1
	OpSelectN
	OpSelectNAddr
	OpMakeResult
	OpAtomicLoad8
	OpAtomicLoad32
	OpAtomicLoad64
	OpAtomicLoadPtr
	OpAtomicLoadAcq32
	OpAtomicLoadAcq64
	OpAtomicStore8
	OpAtomicStore32
	OpAtomicStore64
	OpAtomicStorePtrNoWB
	OpAtomicStoreRel32
	OpAtomicStoreRel64
	OpAtomicExchange32
	OpAtomicExchange64
	OpAtomicAdd32
	OpAtomicAdd64
	OpAtomicCompareAndSwap32
	OpAtomicCompareAndSwap64
	OpAtomicCompareAndSwapRel32
	OpAtomicAnd8
	OpAtomicAnd32
	OpAtomicOr8
	OpAtomicOr32
	OpAtomicAdd32Variant
	OpAtomicAdd64Variant
	OpAtomicExchange32Variant
	OpAtomicExchange64Variant
	OpAtomicCompareAndSwap32Variant
	OpAtomicCompareAndSwap64Variant
	OpAtomicAnd8Variant
	OpAtomicAnd32Variant
	OpAtomicOr8Variant
	OpAtomicOr32Variant
	OpPubBarrier
	OpClobber
	OpClobberReg
	OpPrefetchCache
	OpPrefetchCacheStreamed
)

func ArgOpAndRegisterFor

func ArgOpAndRegisterFor(r abi.RegIndex, abiConfig *abi.ABIConfig) (Op, int64)

ArgOpAndRegisterFor converts an abi register index into an ssa Op and corresponding arg register index.

func StructMakeOp

func StructMakeOp(nf int) Op

StructMakeOp returns the opcode to construct a struct with the given number of fields.

func (Op) Asm

func (o Op) Asm() obj.As

func (Op) HasSideEffects

func (o Op) HasSideEffects() bool

func (Op) IsCall

func (o Op) IsCall() bool

func (Op) IsTailCall

func (o Op) IsTailCall() bool

func (Op) ResultInArg0

func (o Op) ResultInArg0() bool

func (Op) Scale

func (o Op) Scale() int16

func (Op) String

func (o Op) String() string

func (Op) SymEffect

func (o Op) SymEffect() SymEffect

func (Op) UnsafePoint

func (o Op) UnsafePoint() bool

type Register

type Register struct {
	// contains filtered or unexported fields
}

A Register is a machine register, like AX. They are numbered densely from 0 (for each architecture).

func (*Register) GCNum

func (r *Register) GCNum() int16

GCNum returns the runtime GC register index of r, or -1 if this register can't contain pointers.

func (*Register) ObjNum

func (r *Register) ObjNum() int16

ObjNum returns the register number from github.com/go-asm/go/cmd/obj/$ARCH that corresponds to this register.

func (*Register) String

func (r *Register) String() string

type RegisterSet

type RegisterSet uint64

RegisterSet is a bitmap of registers, indexed by Register.num.

type SlKeyIdx

type SlKeyIdx uint32

type SlotID

type SlotID int32

type SparseTree

type SparseTree []SparseTreeNode

A SparseTree is a tree of Blocks. It allows rapid ancestor queries, such as whether one block dominates another.

func (SparseTree) Child

func (t SparseTree) Child(x *Block) *Block

Child returns a child of x in the dominator tree, or nil if there are none. The choice of first child is arbitrary but repeatable.

func (SparseTree) IsAncestorEq

func (t SparseTree) IsAncestorEq(x, y *Block) bool

IsAncestorEq reports whether x is an ancestor of or equal to y.

func (SparseTree) Parent

func (t SparseTree) Parent(x *Block) *Block

Parent returns the parent of x in the dominator tree, or nil if x is the function's entry.

func (SparseTree) Sibling

func (t SparseTree) Sibling(x *Block) *Block

Sibling returns a sibling of x in the dominator tree (i.e., a node with the same immediate dominator) or nil if there are no remaining siblings in the arbitrary but repeatable order chosen. Because the Child-Sibling order is used to assign entry and exit numbers in the treewalk, those numbers are also consistent with this order (i.e., Sibling(x) has entry number larger than x's exit number).

type SparseTreeNode

type SparseTreeNode struct {
	// contains filtered or unexported fields
}

func (*SparseTreeNode) Entry

func (s *SparseTreeNode) Entry() int32

func (*SparseTreeNode) Exit

func (s *SparseTreeNode) Exit() int32

func (*SparseTreeNode) String

func (s *SparseTreeNode) String() string

type Spill

type Spill struct {
	Type   *types.Type
	Offset int64
	Reg    int16
}

type StackOffset

type StackOffset int32

StackOffset encodes whether a value is on the stack and if so, where. It is a 31-bit integer followed by a presence flag at the low-order bit.

type Sym

type Sym interface {
	CanBeAnSSASym()
	CanBeAnSSAAux()
}

A Sym represents a symbolic offset from a base register. Currently a Sym can be one of 3 things:

  • a *gc.Node, for an offset from SP (the stack pointer)
  • a *obj.LSym, for an offset from SB (the global pointer)
  • nil, for no offset

type SymEffect

type SymEffect int8

A SymEffect describes the effect that an SSA Value has on the variable identified by the symbol in its Aux field.

const (
	SymRead SymEffect = 1 << iota
	SymWrite
	SymAddr

	SymRdWr = SymRead | SymWrite

	SymNone SymEffect = 0
)

type Types

type Types struct {
	Bool       *types.Type
	Int8       *types.Type
	Int16      *types.Type
	Int32      *types.Type
	Int64      *types.Type
	UInt8      *types.Type
	UInt16     *types.Type
	UInt32     *types.Type
	UInt64     *types.Type
	Int        *types.Type
	Float32    *types.Type
	Float64    *types.Type
	UInt       *types.Type
	Uintptr    *types.Type
	String     *types.Type
	BytePtr    *types.Type // TODO: use unsafe.Pointer instead?
	Int32Ptr   *types.Type
	UInt32Ptr  *types.Type
	IntPtr     *types.Type
	UintptrPtr *types.Type
	Float32Ptr *types.Type
	Float64Ptr *types.Type
	BytePtrPtr *types.Type
}

func NewTypes

func NewTypes() *Types

NewTypes creates and populates a Types.

func (*Types) SetTypPtrs

func (t *Types) SetTypPtrs()

SetTypPtrs populates t.

type ValAndOff

type ValAndOff int64

A ValAndOff is used by the several opcodes. It holds both a value and a pointer offset. A ValAndOff is intended to be encoded into an AuxInt field. The zero ValAndOff encodes a value of 0 and an offset of 0. The high 32 bits hold a value. The low 32 bits hold a pointer offset.

func (ValAndOff) Off

func (x ValAndOff) Off() int32

func (ValAndOff) Off64

func (x ValAndOff) Off64() int64

func (ValAndOff) String

func (x ValAndOff) String() string

func (ValAndOff) Val

func (x ValAndOff) Val() int32

func (ValAndOff) Val16

func (x ValAndOff) Val16() int16

func (ValAndOff) Val64

func (x ValAndOff) Val64() int64

func (ValAndOff) Val8

func (x ValAndOff) Val8() int8

type ValHeap

type ValHeap struct {
	// contains filtered or unexported fields
}

func (ValHeap) Len

func (h ValHeap) Len() int

func (ValHeap) Less

func (h ValHeap) Less(i, j int) bool

func (*ValHeap) Pop

func (h *ValHeap) Pop() interface{}

func (*ValHeap) Push

func (h *ValHeap) Push(x interface{})

func (ValHeap) Swap

func (h ValHeap) Swap(i, j int)

type Value

type Value struct {
	// A unique identifier for the value. For performance we allocate these IDs
	// densely starting at 1.  There is no guarantee that there won't be occasional holes, though.
	ID ID

	// The operation that computes this value. See op.go.
	Op Op

	// The type of this value. Normally this will be a Go type, but there
	// are a few other pseudo-types, see ../types/type.go.
	Type *types.Type

	// Auxiliary info for this value. The type of this information depends on the opcode and type.
	// AuxInt is used for integer values, Aux is used for other values.
	// Floats are stored in AuxInt using math.Float64bits(f).
	// Unused portions of AuxInt are filled by sign-extending the used portion,
	// even if the represented value is unsigned.
	// Users of AuxInt which interpret AuxInt as unsigned (e.g. shifts) must be careful.
	// Use Value.AuxUnsigned to get the zero-extended value of AuxInt.
	AuxInt int64
	Aux    Aux

	// Arguments of this value
	Args []*Value

	// Containing basic block
	Block *Block

	// Source position
	Pos src.XPos

	// Use count. Each appearance in Value.Args and Block.Controls counts once.
	Uses int32

	// wasm: Value stays on the WebAssembly stack. This value will not get a "register" (WebAssembly variable)
	// nor a slot on Go stack, and the generation of this value is delayed to its use time.
	OnWasmStack bool

	// Is this value in the per-function constant cache? If so, remove from cache before changing it or recycling it.
	InCache bool
	// contains filtered or unexported fields
}

A Value represents a value in the SSA representation of the program. The ID and Type fields must not be modified. The remainder may be modified if they preserve the value of the Value (e.g. changing a (mul 2 x) to an (add x x)).

func IsNewObject

func IsNewObject(v *Value, select1 []*Value) (mem *Value, ok bool)

IsNewObject reports whether v is a pointer to a freshly allocated & zeroed object, if so, also returns the memory state mem at which v is zero.

func (*Value) AddArg

func (v *Value) AddArg(w *Value)

If/when midstack inlining is enabled (-l=4), the compiler gets both larger and slower. Not-inlining this method is a help (*Value.reset and *Block.NewValue0 are similar).

func (*Value) AddArg2

func (v *Value) AddArg2(w1, w2 *Value)

func (*Value) AddArg3

func (v *Value) AddArg3(w1, w2, w3 *Value)

func (*Value) AddArg4

func (v *Value) AddArg4(w1, w2, w3, w4 *Value)

func (*Value) AddArg5

func (v *Value) AddArg5(w1, w2, w3, w4, w5 *Value)

func (*Value) AddArg6

func (v *Value) AddArg6(w1, w2, w3, w4, w5, w6 *Value)

func (*Value) AddArgs

func (v *Value) AddArgs(a ...*Value)

func (*Value) AuxArm64BitField

func (v *Value) AuxArm64BitField() arm64BitField

func (*Value) AuxFloat

func (v *Value) AuxFloat() float64

func (*Value) AuxInt16

func (v *Value) AuxInt16() int16

func (*Value) AuxInt32

func (v *Value) AuxInt32() int32

func (*Value) AuxInt8

func (v *Value) AuxInt8() int8

func (*Value) AuxUInt8

func (v *Value) AuxUInt8() uint8

func (*Value) AuxUnsigned

func (v *Value) AuxUnsigned() uint64

AuxUnsigned returns v.AuxInt as an unsigned value for OpConst*. v.AuxInt is always sign-extended to 64 bits, even if the represented value is unsigned. This undoes that sign extension.

func (*Value) AuxValAndOff

func (v *Value) AuxValAndOff() ValAndOff

func (*Value) Fatalf

func (v *Value) Fatalf(msg string, args ...interface{})

func (*Value) HTML

func (v *Value) HTML() string

func (*Value) LackingPos

func (v *Value) LackingPos() bool

LackingPos indicates whether v is a value that is unlikely to have a correct position assigned to it. Ignoring such values leads to more user-friendly positions assigned to nearby values and the blocks containing them.

func (*Value) Log

func (v *Value) Log() bool

func (*Value) Logf

func (v *Value) Logf(msg string, args ...interface{})

func (*Value) LongHTML

func (v *Value) LongHTML() string

func (*Value) LongString

func (v *Value) LongString() string

long form print. v# = opcode <type> [aux] args [: reg] (names)

func (*Value) MemoryArg

func (v *Value) MemoryArg() *Value

MemoryArg returns the memory argument for the Value. The returned value, if non-nil, will be memory-typed (or a tuple with a memory-typed second part). Otherwise, nil is returned.

func (*Value) Reg

func (v *Value) Reg() int16

Reg returns the register assigned to v, in github.com/go-asm/go/cmd/obj/$ARCH numbering.

func (*Value) Reg0

func (v *Value) Reg0() int16

Reg0 returns the register assigned to the first output of v, in github.com/go-asm/go/cmd/obj/$ARCH numbering.

func (*Value) Reg1

func (v *Value) Reg1() int16

Reg1 returns the register assigned to the second output of v, in github.com/go-asm/go/cmd/obj/$ARCH numbering.

func (*Value) RegName

func (v *Value) RegName() string

func (*Value) RegTmp

func (v *Value) RegTmp() int16

RegTmp returns the temporary register assigned to v, in github.com/go-asm/go/cmd/obj/$ARCH numbering.

func (*Value) ResultReg

func (v *Value) ResultReg() int16

ResultReg returns the result register assigned to v, in github.com/go-asm/go/cmd/obj/$ARCH numbering. It is similar to Reg and Reg0, except that it is usable interchangeably for all Value Ops. If you know v.Op, using Reg or Reg0 (as appropriate) will be more efficient.

func (*Value) SetArg

func (v *Value) SetArg(i int, w *Value)

func (*Value) SetArgs1

func (v *Value) SetArgs1(a *Value)

func (*Value) SetArgs2

func (v *Value) SetArgs2(a, b *Value)

func (*Value) SetArgs3

func (v *Value) SetArgs3(a, b, c *Value)

func (*Value) String

func (v *Value) String() string

short form print. Just v#.

type VarID

type VarID int32

type VarLoc

type VarLoc struct {
	// The registers this variable is available in. There can be more than
	// one in various situations, e.g. it's being moved between registers.
	Registers RegisterSet

	StackOffset
}

A VarLoc describes the storage for part of a user variable.

type ZeroRegion

type ZeroRegion struct {
	// contains filtered or unexported fields
}

A ZeroRegion records parts of an object which are known to be zero. A ZeroRegion only applies to a single memory state. Each bit in mask is set if the corresponding pointer-sized word of the base object is known to be zero. In other words, if mask & (1<<i) != 0, then [base+i*ptrSize, base+(i+1)*ptrSize) is known to be zero.

Directories

Path Synopsis
The gen command generates Go code (in the parent directory) for all the architecture-specific opcodes, blocks, and rewrites.
The gen command generates Go code (in the parent directory) for all the architecture-specific opcodes, blocks, and rewrites.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL