...

Package ssa

import "cmd/compile/internal/ssa"
Overview
Index

Overview ▾

Index ▾

Constants
Variables
func AutoVar(v *Value) (*ir.Name, int64)
func BuildFuncDebug(ctxt *obj.Link, f *Func, loggingLevel int, stackOffset func(LocalSlot) int32, rval *FuncDebug)
func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, stackOffset func(LocalSlot) int32, rval *FuncDebug)
func CanSSA(t *types.Type) bool
func Compile(f *Func)
func DecodePPC64RotateMask(sauxint int64) (rotate, mb, me int64, mask uint64)
func DivisionNeedsFixUp(v *Value) bool
func FuncNameABI(n string, a obj.ABI) string
func GetPPC64Shiftmb(auxint int64) int64
func GetPPC64Shiftme(auxint int64) int64
func GetPPC64Shiftsh(auxint int64) int64
func IsGlobalAddr(v *Value) bool
func IsInlinableMemmove(dst, src *Value, sz int64, c *Config) bool
func IsMergeCandidate(n *ir.Name) bool
func IsReadOnlyGlobalAddr(v *Value) bool
func IsSanitizerSafeAddr(v *Value) bool
func IsStackAddr(v *Value) bool
func IsVarWantedForDebug(n ir.Node) bool
func LogLargeCopy(funcName string, pos src.XPos, s int64)
func ObjRegForAbiReg(r abi.RegIndex, c *Config) int16
func ParamAssignmentForArgName(f *Func, name *ir.Name) *abi.ABIParamAssignment
func PhaseOption(phase, flag string, val int, valString string) string
func PopulateABIInRegArgOps(f *Func)
func ReachableBlocks(f *Func) []bool
func StmtString(p src.XPos) string
type Abi1RO
type Aux
    func StringToAux(s string) Aux
type AuxCall
    func ClosureAuxCall(paramResultInfo *abi.ABIParamResultInfo) *AuxCall
    func InterfaceAuxCall(paramResultInfo *abi.ABIParamResultInfo) *AuxCall
    func OwnAuxCall(fn *obj.LSym, paramResultInfo *abi.ABIParamResultInfo) *AuxCall
    func StaticAuxCall(sym *obj.LSym, paramResultInfo *abi.ABIParamResultInfo) *AuxCall
    func (a *AuxCall) ABI() *abi.ABIConfig
    func (a *AuxCall) ABIInfo() *abi.ABIParamResultInfo
    func (a *AuxCall) ArgWidth() int64
    func (*AuxCall) CanBeAnSSAAux()
    func (a *AuxCall) LateExpansionResultType() *types.Type
    func (a *AuxCall) NArgs() int64
    func (a *AuxCall) NResults() int64
    func (a *AuxCall) NameOfResult(which int64) *ir.Name
    func (a *AuxCall) OffsetOfArg(which int64) int64
    func (a *AuxCall) OffsetOfResult(which int64) int64
    func (a *AuxCall) ParamAssignmentForResult(which int64) *abi.ABIParamAssignment
    func (a *AuxCall) Reg(i *regInfo, c *Config) *regInfo
    func (a *AuxCall) RegsOfArg(which int64) []abi.RegIndex
    func (a *AuxCall) RegsOfResult(which int64) []abi.RegIndex
    func (a *AuxCall) ResultReg(c *Config) *regInfo
    func (a *AuxCall) SizeOfArg(which int64) int64
    func (a *AuxCall) SizeOfResult(which int64) int64
    func (a *AuxCall) String() string
    func (a *AuxCall) TypeOfArg(which int64) *types.Type
    func (a *AuxCall) TypeOfResult(which int64) *types.Type
type AuxNameOffset
    func (a *AuxNameOffset) CanBeAnSSAAux()
    func (a *AuxNameOffset) FrameOffset() int64
    func (a *AuxNameOffset) String() string
type BaseAddress
type Block
    func (b *Block) AddControl(v *Value)
    func (b *Block) AddEdgeTo(c *Block)
    func (b *Block) AuxIntString() string
    func (b *Block) ControlValues() []*Value
    func (b *Block) CopyControls(from *Block)
    func (b *Block) Fatalf(msg string, args ...interface{})
    func (b *Block) FirstPossibleStmtValue() *Value
    func (b *Block) HTML() string
    func (b *Block) LackingPos() bool
    func (b *Block) Log() bool
    func (b *Block) Logf(msg string, args ...interface{})
    func (b *Block) LongHTML() string
    func (b *Block) LongString() string
    func (b *Block) NewValue0(pos src.XPos, op Op, t *types.Type) *Value
    func (b *Block) NewValue0A(pos src.XPos, op Op, t *types.Type, aux Aux) *Value
    func (b *Block) NewValue0I(pos src.XPos, op Op, t *types.Type, auxint int64) *Value
    func (b *Block) NewValue0IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux) *Value
    func (b *Block) NewValue1(pos src.XPos, op Op, t *types.Type, arg *Value) *Value
    func (b *Block) NewValue1A(pos src.XPos, op Op, t *types.Type, aux Aux, arg *Value) *Value
    func (b *Block) NewValue1I(pos src.XPos, op Op, t *types.Type, auxint int64, arg *Value) *Value
    func (b *Block) NewValue1IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux, arg *Value) *Value
    func (b *Block) NewValue2(pos src.XPos, op Op, t *types.Type, arg0, arg1 *Value) *Value
    func (b *Block) NewValue2A(pos src.XPos, op Op, t *types.Type, aux Aux, arg0, arg1 *Value) *Value
    func (b *Block) NewValue2I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1 *Value) *Value
    func (b *Block) NewValue2IA(pos src.XPos, op Op, t *types.Type, auxint int64, aux Aux, arg0, arg1 *Value) *Value
    func (b *Block) NewValue3(pos src.XPos, op Op, t *types.Type, arg0, arg1, arg2 *Value) *Value
    func (b *Block) NewValue3A(pos src.XPos, op Op, t *types.Type, aux Aux, arg0, arg1, arg2 *Value) *Value
    func (b *Block) NewValue3I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1, arg2 *Value) *Value
    func (b *Block) NewValue4(pos src.XPos, op Op, t *types.Type, arg0, arg1, arg2, arg3 *Value) *Value
    func (b *Block) NewValue4I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1, arg2, arg3 *Value) *Value
    func (b *Block) NumControls() int
    func (b *Block) ReplaceControl(i int, v *Value)
    func (b *Block) Reset(kind BlockKind)
    func (b *Block) ResetControls()
    func (b *Block) SetControl(v *Value)
    func (b *Block) String() string
type BlockDebug
type BlockKind
    func (k BlockKind) AuxIntType() string
    func (k BlockKind) String() string
type BoundsKind
type BranchPrediction
type ByTopo
    func (x ByTopo) Len() int
    func (x ByTopo) Less(i, j int) bool
    func (x ByTopo) Swap(i, j int)
type Cache
    func (c *Cache) Reset()
type Config
    func NewConfig(arch string, types Types, ctxt *obj.Link, optimize, softfloat bool) *Config
    func (c *Config) Ctxt() *obj.Link
    func (c *Config) NewFunc(fe Frontend, cache *Cache) *Func
type Edge
    func (e Edge) Block() *Block
    func (e Edge) Index() int
    func (e Edge) String() string
type Frontend
type Func
    func (f *Func) ConstBool(t *types.Type, c bool) *Value
    func (f *Func) ConstEmptyString(t *types.Type) *Value
    func (f *Func) ConstFloat32(t *types.Type, c float64) *Value
    func (f *Func) ConstFloat64(t *types.Type, c float64) *Value
    func (f *Func) ConstInt16(t *types.Type, c int16) *Value
    func (f *Func) ConstInt32(t *types.Type, c int32) *Value
    func (f *Func) ConstInt64(t *types.Type, c int64) *Value
    func (f *Func) ConstInt8(t *types.Type, c int8) *Value
    func (f *Func) ConstInterface(t *types.Type) *Value
    func (f *Func) ConstNil(t *types.Type) *Value
    func (f *Func) ConstOffPtrSP(t *types.Type, c int64, sp *Value) *Value
    func (f *Func) ConstSlice(t *types.Type) *Value
    func (f *Func) DebugHashMatch() bool
    func (f *Func) DumpFileForPhase(phaseName string) io.WriteCloser
    func (f *Func) Fatalf(msg string, args ...interface{})
    func (f *Func) Frontend() Frontend
    func (f *Func) HTML(phase string, dot *dotWriter) string
    func (f *Func) Idom() []*Block
    func (f *Func) Log() bool
    func (f *Func) LogStat(key string, args ...interface{})
    func (f *Func) Logf(msg string, args ...interface{})
    func (f *Func) NameABI() string
    func (f *Func) NewBlock(kind BlockKind) *Block
    func (f *Func) NewLocal(pos src.XPos, typ *types.Type) *ir.Name
    func (f *Func) NumBlocks() int
    func (f *Func) NumValues() int
    func (f *Func) Postorder() []*Block
    func (f *Func) Sdom() SparseTree
    func (f *Func) SplitArray(name *LocalSlot) *LocalSlot
    func (f *Func) SplitComplex(name *LocalSlot) (*LocalSlot, *LocalSlot)
    func (f *Func) SplitInt64(name *LocalSlot) (*LocalSlot, *LocalSlot)
    func (f *Func) SplitInterface(name *LocalSlot) (*LocalSlot, *LocalSlot)
    func (f *Func) SplitSlice(name *LocalSlot) (*LocalSlot, *LocalSlot, *LocalSlot)
    func (f *Func) SplitSlot(name *LocalSlot, sfx string, offset int64, t *types.Type) *LocalSlot
    func (f *Func) SplitString(name *LocalSlot) (*LocalSlot, *LocalSlot)
    func (f *Func) SplitStruct(name *LocalSlot, i int) *LocalSlot
    func (f *Func) String() string
    func (f *Func) Warnl(pos src.XPos, msg string, args ...interface{})
type FuncDebug
    func (debugInfo *FuncDebug) PutLocationList(list []byte, ctxt *obj.Link, listSym, startPC *obj.LSym)
type FuncLines
type HTMLWriter
    func NewHTMLWriter(path string, f *Func, cfgMask string) *HTMLWriter
    func (w *HTMLWriter) Close()
    func (w *HTMLWriter) Fatalf(msg string, args ...interface{})
    func (w *HTMLWriter) Logf(msg string, args ...interface{})
    func (w *HTMLWriter) Printf(msg string, v ...interface{})
    func (w *HTMLWriter) WriteAST(phase string, buf *bytes.Buffer)
    func (w *HTMLWriter) WriteColumn(phase, title, class, html string)
    func (w *HTMLWriter) WriteMultiTitleColumn(phase string, titles []string, class, html string)
    func (w *HTMLWriter) WritePhase(phase, title string)
    func (w *HTMLWriter) WriteSources(phase string, all []*FuncLines)
    func (w *HTMLWriter) WriteString(s string)
type Hotness
type ID
type LocPair
    func (t LocPair) String() string
type LocResults
    func (t LocResults) String() string
type LocalSlot
    func (s LocalSlot) String() string
type LocalSlotSplitKey
type Location
type Logger
type Op
    func ArgOpAndRegisterFor(r abi.RegIndex, abiConfig *abi.ABIConfig) (Op, int64)
    func StructMakeOp(nf int) Op
    func (o Op) Asm() obj.As
    func (o Op) HasSideEffects() bool
    func (o Op) IsCall() bool
    func (o Op) IsTailCall() bool
    func (o Op) ResultInArg0() bool
    func (o Op) Scale() int16
    func (o Op) String() string
    func (o Op) SymEffect() SymEffect
    func (o Op) UnsafePoint() bool
type Register
    func (r *Register) GCNum() int16
    func (r *Register) ObjNum() int16
    func (r *Register) String() string
type RegisterSet
type SlKeyIdx
type SlotID
type SparseTree
    func (t SparseTree) Child(x *Block) *Block
    func (t SparseTree) IsAncestorEq(x, y *Block) bool
    func (t SparseTree) Parent(x *Block) *Block
    func (t SparseTree) Sibling(x *Block) *Block
type SparseTreeNode
    func (s *SparseTreeNode) Entry() int32
    func (s *SparseTreeNode) Exit() int32
    func (s *SparseTreeNode) String() string
type Spill
type StackOffset
type Sym
type SymEffect
type Types
    func NewTypes() *Types
    func (t *Types) SetTypPtrs()
type ValAndOff
    func (x ValAndOff) Off() int32
    func (x ValAndOff) Off64() int64
    func (x ValAndOff) String() string
    func (x ValAndOff) Val() int32
    func (x ValAndOff) Val16() int16
    func (x ValAndOff) Val64() int64
    func (x ValAndOff) Val8() int8
type ValHeap
    func (h ValHeap) Len() int
    func (h ValHeap) Less(i, j int) bool
    func (h *ValHeap) Pop() interface{}
    func (h *ValHeap) Push(x interface{})
    func (h ValHeap) Swap(i, j int)
type Value
    func IsNewObject(v *Value, select1 []*Value) (mem *Value, ok bool)
    func (v *Value) AddArg(w *Value)
    func (v *Value) AddArg2(w1, w2 *Value)
    func (v *Value) AddArg3(w1, w2, w3 *Value)
    func (v *Value) AddArg4(w1, w2, w3, w4 *Value)
    func (v *Value) AddArg5(w1, w2, w3, w4, w5 *Value)
    func (v *Value) AddArg6(w1, w2, w3, w4, w5, w6 *Value)
    func (v *Value) AddArgs(a ...*Value)
    func (v *Value) AuxArm64BitField() arm64BitField
    func (v *Value) AuxFloat() float64
    func (v *Value) AuxInt16() int16
    func (v *Value) AuxInt32() int32
    func (v *Value) AuxInt8() int8
    func (v *Value) AuxUInt8() uint8
    func (v *Value) AuxUnsigned() uint64
    func (v *Value) AuxValAndOff() ValAndOff
    func (v *Value) Fatalf(msg string, args ...interface{})
    func (v *Value) HTML() string
    func (v *Value) LackingPos() bool
    func (v *Value) Log() bool
    func (v *Value) Logf(msg string, args ...interface{})
    func (v *Value) LongHTML() string
    func (v *Value) LongString() string
    func (v *Value) MemoryArg() *Value
    func (v *Value) Reg() int16
    func (v *Value) Reg0() int16
    func (v *Value) Reg1() int16
    func (v *Value) RegName() string
    func (v *Value) RegTmp() int16
    func (v *Value) ResultReg() int16
    func (v *Value) SetArg(i int, w *Value)
    func (v *Value) SetArgs1(a *Value)
    func (v *Value) SetArgs2(a, b *Value)
    func (v *Value) SetArgs3(a, b, c *Value)
    func (v *Value) String() string
type VarID
type VarLoc
type ZeroRegion

Package files

addressingmodes.go allocators.go biasedsparsemap.go block.go branchelim.go cache.go check.go checkbce.go compile.go config.go copyelim.go critical.go cse.go deadcode.go deadstore.go debug.go decompose.go dom.go expand_calls.go flagalloc.go func.go fuse.go fuse_branchredirect.go fuse_comparisons.go html.go id.go layout.go lca.go likelyadjust.go location.go loopbce.go loopreschedchecks.go looprotate.go lower.go magic.go memcombine.go nilcheck.go numberlines.go op.go opGen.go opt.go phiopt.go poset.go print.go prove.go regalloc.go rewrite.go rewrite386.go rewrite386splitload.go rewriteAMD64.go rewriteAMD64latelower.go rewriteAMD64splitload.go rewriteARM.go rewriteARM64.go rewriteARM64latelower.go rewriteLOONG64.go rewriteMIPS.go rewriteMIPS64.go rewritePPC64.go rewritePPC64latelower.go rewriteRISCV64.go rewriteRISCV64latelower.go rewriteS390X.go rewriteWasm.go rewritedec.go rewritedec64.go rewritegeneric.go sccp.go schedule.go shortcircuit.go softfloat.go sparsemap.go sparsemappos.go sparseset.go sparsetree.go stackalloc.go tighten.go trim.go tuple.go value.go writebarrier.go xposmap.go zcse.go

Constants

const (
    BranchUnlikely = BranchPrediction(-1)
    BranchUnknown  = BranchPrediction(0)
    BranchLikely   = BranchPrediction(+1)
)
const (
    // These values are arranged in what seems to be order of increasing alignment importance.
    // Currently only a few are relevant.  Implicitly, they are all in a loop.
    HotNotFlowIn Hotness = 1 << iota // This block is only reached by branches
    HotInitial                       // In the block order, the first one for a given loop.  Not necessarily topological header.
    HotPgo                           // By PGO-based heuristics, this block occurs in a hot loop

    HotNot                 = 0
    HotInitialNotFlowIn    = HotInitial | HotNotFlowIn          // typically first block of a rotated loop, loop is entered with a branch (not to this block).  No PGO
    HotPgoInitial          = HotPgo | HotInitial                // special case; single block loop, initial block is header block has a flow-in entry, but PGO says it is hot
    HotPgoInitialNotFLowIn = HotPgo | HotInitial | HotNotFlowIn // PGO says it is hot, and the loop is rotated so flow enters loop with a branch
)
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
)
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
)

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

const MaxStruct = 4

Variables

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

Debug output

var IntrinsicsDebug int
var IntrinsicsDisable bool

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). In addition to the register params, here we also build location lists (where appropriate for the ".closureptr" compiler-synthesized variable needed by the debugger for range func bodies.

func CanSSA

func CanSSA(t *types.Type) bool

CanSSA reports whether values of type t can be represented as a Value.

func Compile

func Compile(f *Func)

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

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 FuncNameABI

func FuncNameABI(n string, a obj.ABI) string

FuncNameABI returns n followed by a comma and the value of a. This is a separate function to allow a single point encoding of the format, which is used in places where there's not a Func yet.

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 IsMergeCandidate

func IsMergeCandidate(n *ir.Name) bool

IsMergeCandidate returns true if variable n could participate in stack slot merging. For now we're restricting the set to things to items larger than what CanSSA would allow (approximateky, we disallow things marked as open defer slots so as to avoid complicating liveness analysis.

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 IsVarWantedForDebug

func IsVarWantedForDebug(n ir.Node) bool

IsVarWantedForDebug returns true if the debug info for the node should be generated. For example, internal variables for range-over-func loops have little value to users, so we don't generate debug info for them.

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:

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

type Abi1RO

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

type Aux

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

type Aux interface {
    CanBeAnSSAAux()
}

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 ir.Name 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

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 BaseAddress struct {
    // contains filtered or unexported fields
}

type Block

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

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

    // A block that would be good to align (according to the optimizer's guesses)
    Hotness Hotness

    // 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
}

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.

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

BlockKind is the kind of SSA block.

type BlockKind uint8
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

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

type ByTopo []*FuncLines

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

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

type Cache struct {
    ValueToProgAfter []*obj.Prog

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

func (*Cache) Reset

func (c *Cache) Reset()

type Config

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

type Config struct {
    PtrSize int64 // 4 or 8; copy of cmd/internal/sys.Arch.PtrSize
    RegSize int64 // 4 or 8; copy of cmd/internal/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
}

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

func (*Config) NewFunc

func (c *Config) NewFunc(fe Frontend, cache *Cache) *Func

NewFunc returns a new, empty function object. Caller must reset cache before calling NewFunc.

type Edge

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.

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

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

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

    // 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

    // 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

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

type Func

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.

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.

    IsPgoHot bool

    // 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
    // OwnAux describes parameters and results for this function.
    OwnAux *AuxCall
    // CloSlot holds the compiler-synthesized name (".closureptr")
    // where we spill the closure pointer for range func bodies.
    CloSlot *ir.Name
    // contains filtered or unexported fields
}

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) NameABI

func (f *Func) NameABI() string

NameABI returns the function name followed by comma and the ABI number. This is intended for use with GOSSAFUNC and HTML dumps, and differs from the linker's "<1>" convention because "<" and ">" require shell quoting and are not legal file names (for use with GOSSADIR) on Windows.

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) NewLocal

func (f *Func) NewLocal(pos src.XPos, typ *types.Type) *ir.Name

NewLocal returns a new anonymous local variable of the given type.

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

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.

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.
    //
    // NOTE: block is only used if value is BlockStart.ID or BlockEnd.ID.
    // Otherwise, it is ignored.
    GetPC func(block, value ID) int64
}

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

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

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

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 Hotness

type Hotness int8 // Could use negative numbers for specifically non-hot blocks, but don't, yet.

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

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}
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.
}

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

A place that an ssa variable can reside.

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

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

    // Fatalf 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

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.

type Op int32
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
    OpAMD64BTCQconst
    OpAMD64BTRQconst
    OpAMD64BTSQconst
    OpAMD64BTSQconstmodify
    OpAMD64BTRQconstmodify
    OpAMD64BTCQconstmodify
    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
    OpAMD64MINSD
    OpAMD64MINSS
    OpAMD64SBBQcarrymask
    OpAMD64SBBLcarrymask
    OpAMD64SETEQ
    OpAMD64SETNE
    OpAMD64SETL
    OpAMD64SETLE
    OpAMD64SETG
    OpAMD64SETGE
    OpAMD64SETB
    OpAMD64SETBE
    OpAMD64SETA
    OpAMD64SETAE
    OpAMD64SETO
    OpAMD64SETEQstore
    OpAMD64SETNEstore
    OpAMD64SETLstore
    OpAMD64SETLEstore
    OpAMD64SETGstore
    OpAMD64SETGEstore
    OpAMD64SETBstore
    OpAMD64SETBEstore
    OpAMD64SETAstore
    OpAMD64SETAEstore
    OpAMD64SETEQstoreidx1
    OpAMD64SETNEstoreidx1
    OpAMD64SETLstoreidx1
    OpAMD64SETLEstoreidx1
    OpAMD64SETGstoreidx1
    OpAMD64SETGEstoreidx1
    OpAMD64SETBstoreidx1
    OpAMD64SETBEstoreidx1
    OpAMD64SETAstoreidx1
    OpAMD64SETAEstoreidx1
    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
    OpAMD64POR
    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
    OpARM64FMIND
    OpARM64FMINS
    OpARM64FMAXD
    OpARM64FMAXS
    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
    OpARM64LoweredAtomicOr8
    OpARM64LoweredAtomicAnd64
    OpARM64LoweredAtomicOr64
    OpARM64LoweredAtomicAnd32
    OpARM64LoweredAtomicOr32
    OpARM64LoweredAtomicAnd8Variant
    OpARM64LoweredAtomicOr8Variant
    OpARM64LoweredAtomicAnd64Variant
    OpARM64LoweredAtomicOr64Variant
    OpARM64LoweredAtomicAnd32Variant
    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
    OpPPC64ADDCC
    OpPPC64ADDconst
    OpPPC64ADDCCconst
    OpPPC64FADD
    OpPPC64FADDS
    OpPPC64SUB
    OpPPC64SUBCC
    OpPPC64SUBFCconst
    OpPPC64FSUB
    OpPPC64FSUBS
    OpPPC64XSMINJDP
    OpPPC64XSMAXJDP
    OpPPC64MULLD
    OpPPC64MULLW
    OpPPC64MULLDconst
    OpPPC64MULLWconst
    OpPPC64MADDLD
    OpPPC64MULHD
    OpPPC64MULHW
    OpPPC64MULHDU
    OpPPC64MULHWU
    OpPPC64FMUL
    OpPPC64FMULS
    OpPPC64FMADD
    OpPPC64FMADDS
    OpPPC64FMSUB
    OpPPC64FMSUBS
    OpPPC64SRAD
    OpPPC64SRAW
    OpPPC64SRD
    OpPPC64SRW
    OpPPC64SLD
    OpPPC64SLW
    OpPPC64ROTL
    OpPPC64ROTLW
    OpPPC64CLRLSLWI
    OpPPC64CLRLSLDI
    OpPPC64ADDC
    OpPPC64SUBC
    OpPPC64ADDCconst
    OpPPC64SUBCconst
    OpPPC64ADDE
    OpPPC64ADDZE
    OpPPC64SUBE
    OpPPC64ADDZEzero
    OpPPC64SUBZEzero
    OpPPC64SRADconst
    OpPPC64SRAWconst
    OpPPC64SRDconst
    OpPPC64SRWconst
    OpPPC64SLDconst
    OpPPC64SLWconst
    OpPPC64ROTLconst
    OpPPC64ROTLWconst
    OpPPC64EXTSWSLconst
    OpPPC64RLWINM
    OpPPC64RLWNM
    OpPPC64RLWMI
    OpPPC64RLDICL
    OpPPC64RLDICLCC
    OpPPC64RLDICR
    OpPPC64CNTLZD
    OpPPC64CNTLZDCC
    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
    OpPPC64ANDNCC
    OpPPC64ANDCC
    OpPPC64OR
    OpPPC64ORN
    OpPPC64ORCC
    OpPPC64NOR
    OpPPC64NORCC
    OpPPC64XOR
    OpPPC64XORCC
    OpPPC64EQV
    OpPPC64NEG
    OpPPC64NEGCC
    OpPPC64BRD
    OpPPC64BRW
    OpPPC64BRH
    OpPPC64FNEG
    OpPPC64FSQRT
    OpPPC64FSQRTS
    OpPPC64FFLOOR
    OpPPC64FCEIL
    OpPPC64FTRUNC
    OpPPC64FROUND
    OpPPC64FABS
    OpPPC64FNABS
    OpPPC64FCPSGN
    OpPPC64ORconst
    OpPPC64XORconst
    OpPPC64ANDCCconst
    OpPPC64ANDconst
    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
    OpRISCV64SLLW
    OpRISCV64SRA
    OpRISCV64SRAW
    OpRISCV64SRL
    OpRISCV64SRLW
    OpRISCV64SLLI
    OpRISCV64SLLIW
    OpRISCV64SRAI
    OpRISCV64SRAIW
    OpRISCV64SRLI
    OpRISCV64SRLIW
    OpRISCV64AND
    OpRISCV64ANDI
    OpRISCV64NOT
    OpRISCV64OR
    OpRISCV64ORI
    OpRISCV64ROL
    OpRISCV64ROLW
    OpRISCV64ROR
    OpRISCV64RORI
    OpRISCV64RORIW
    OpRISCV64RORW
    OpRISCV64XOR
    OpRISCV64XORI
    OpRISCV64SEQZ
    OpRISCV64SNEZ
    OpRISCV64SLT
    OpRISCV64SLTI
    OpRISCV64SLTU
    OpRISCV64SLTIU
    OpRISCV64LoweredRound32F
    OpRISCV64LoweredRound64F
    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
    OpRISCV64LoweredPubBarrier
    OpRISCV64LoweredPanicBoundsA
    OpRISCV64LoweredPanicBoundsB
    OpRISCV64LoweredPanicBoundsC
    OpRISCV64FADDS
    OpRISCV64FSUBS
    OpRISCV64FMULS
    OpRISCV64FDIVS
    OpRISCV64FMADDS
    OpRISCV64FMSUBS
    OpRISCV64FNMADDS
    OpRISCV64FNMSUBS
    OpRISCV64FSQRTS
    OpRISCV64FNEGS
    OpRISCV64FMVSX
    OpRISCV64FCVTSW
    OpRISCV64FCVTSL
    OpRISCV64FCVTWS
    OpRISCV64FCVTLS
    OpRISCV64FMOVWload
    OpRISCV64FMOVWstore
    OpRISCV64FEQS
    OpRISCV64FNES
    OpRISCV64FLTS
    OpRISCV64FLES
    OpRISCV64LoweredFMAXS
    OpRISCV64LoweredFMINS
    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
    OpRISCV64LoweredFMIND
    OpRISCV64LoweredFMAXD

    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
    OpMin64F
    OpMin32F
    OpMax64F
    OpMax32F
    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
    OpAtomicOr8
    OpAtomicAnd64
    OpAtomicAnd32
    OpAtomicOr64
    OpAtomicOr32
    OpAtomicAdd32Variant
    OpAtomicAdd64Variant
    OpAtomicExchange32Variant
    OpAtomicExchange64Variant
    OpAtomicCompareAndSwap32Variant
    OpAtomicCompareAndSwap64Variant
    OpAtomicAnd8Variant
    OpAtomicOr8Variant
    OpAtomicAnd64Variant
    OpAtomicOr64Variant
    OpAtomicAnd32Variant
    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

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

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

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 cmd/internal/obj/$ARCH that corresponds to this register.

func (*Register) String

func (r *Register) String() string

type RegisterSet

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

type RegisterSet uint64

type SlKeyIdx

type SlKeyIdx uint32

type SlotID

type SlotID int32

type SparseTree

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

type SparseTree []SparseTreeNode

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

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 StackOffset int32

type Sym

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

type Sym interface {
    CanBeAnSSASym()
    CanBeAnSSAAux()
}

type SymEffect

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

type SymEffect int8
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

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.

type ValAndOff int64

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

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)).

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
}

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 cmd/internal/obj/$ARCH numbering.

func (*Value) Reg0

func (v *Value) Reg0() int16

Reg0 returns the register assigned to the first output of v, in cmd/internal/obj/$ARCH numbering.

func (*Value) Reg1

func (v *Value) Reg1() int16

Reg1 returns the register assigned to the second output of v, in cmd/internal/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 cmd/internal/obj/$ARCH numbering.

func (*Value) ResultReg

func (v *Value) ResultReg() int16

ResultReg returns the result register assigned to v, in cmd/internal/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

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

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
}

type ZeroRegion

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.

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