Documentation
¶
Index ¶
- Constants
- Variables
- func AddRegisterLink(vart *VariableT, rawNode NodeT)
- func AddStackFrames(proc *CallNodeT, frameType types.Type)
- func AllocateRegisters(top *CallNodeT)
- func Any[T any](predicate func(T) bool, slice []T) bool
- func AttachInput(parent *CallNodeT, index int, child NodeT)
- func AttachNext(parent *CallNodeT, next *CallNodeT, optionalIndex ...int)
- func CallString(call *CallNodeT) string
- func CheckNode(topCall *CallNodeT)
- func Cse(top *CallNodeT)
- func DefaultSimplify(call *CallNodeT)
- func DefinePrimops()
- func Erase(rawNode NodeT)
- func EraseAll(nodes []NodeT)
- func EraseVariable(vart *VariableT)
- func Evaluate(proc *CallNodeT, args []int) []int
- func Every[T any](predicate func(T) bool, slice []T) bool
- func Filter[T any](predicate func(T) bool, slice []T) []T
- func FindBasicBlocks[BB BasicBlockT](top *CallNodeT, makeBlock func() BB) []BB
- func FindLoopBlocks[T any](theirBlocks []*T, next func(*T) []*T, ...) []*T
- func InlineProcedure(call *CallNodeT, proc *CallNodeT)
- func InsertCallParent(child *CallNodeT, newParent *CallNodeT)
- func IsCallNode(node NodeT) bool
- func IsCalledNode(node NodeT) bool
- func IsCalledRef(node *ReferenceNodeT) bool
- func IsJumpLambdaNode(node NodeT) bool
- func IsLiteralNode(node NodeT) bool
- func IsNil(node NodeT) bool
- func IsProcLambdaNode(node NodeT) bool
- func IsReferenceNode(node NodeT) bool
- func IsStackAllocator(rawPrimop PrimopT) bool
- func IsVarReferenceNode(node NodeT, vart *VariableT) bool
- func Last[T any](slice []T) T
- func LinkCallRegisters(call *CallNodeT)
- func LinkJumpRegisters(call *CallNodeT)
- func Map[S any, T any](function func(S) T, slice []S) []T
- func MarkChanged(node NodeT)
- func NodeValue(rawNode NodeT, env EnvT) any
- func PpCps(rawNode NodeT)
- func ProclaimEmpty(node NodeT)
- func Push[T any](slice *[]T, thing T)
- func PushSlice[T any](slice *[]T, things []T)
- func RegEvaluate(proc *CallNodeT, args []int) []int
- func RemoveCall(node *CallNodeT)
- func RemoveNullInputs(node *CallNodeT, inputCount int)
- func RemoveUnusedInputs(top *CallNodeT)
- func RemoveUnusedOutputs(node *CallNodeT)
- func ReplaceInput(oldNode NodeT, newNode NodeT)
- func ReplaceNext(oldNode *CallNodeT, newNode *CallNodeT)
- func SimplifyArithBinop(call *CallNodeT)
- func SimplifyBooleanOp(call *CallNodeT, condPrimop string, negate bool)
- func SimplifyCells(top *CallNodeT)
- func SimplifyJump(call *CallNodeT)
- func SimplifyLet(call *CallNodeT)
- func SimplifyLetrec(call *CallNodeT)
- func SimplifyMakeCell(call *CallNodeT)
- func SimplifyNext(call *CallNodeT)
- func SimplifyProcCall(call *CallNodeT)
- func Substitute(vart *VariableT, val NodeT, detachVal bool)
- type BasicBlockT
- type BinopPrimopT
- func (primop *BinopPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *BinopPrimopT) Name() string
- func (primop *BinopPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *BinopPrimopT) SideEffects() bool
- func (primop *BinopPrimopT) Simplify(call *CallNodeT)
- type BlockT
- type CallNodeT
- type CallTypeT
- type CallsProcPrimopT
- type CallsT
- func (calls *CallsT) AddCall(primop PrimopT, outputs []*VariableT, inputs []NodeT)
- func (calls *CallsT) AddFirst(call *CallNodeT)
- func (calls *CallsT) AddPrimopVarsCall(primopName string, outputs []*VariableT, inputs ...NodeT)
- func (calls *CallsT) AppendCall(call *CallNodeT)
- func (calls *CallsT) AppendCalls(more *CallsT)
- func (calls *CallsT) BuildCall(primopName string, outputName string, outputType types.Type, inputs ...any) *VariableT
- func (calls *CallsT) BuildFinalCall(primopName string, exits int, args ...any) *CallNodeT
- func (calls *CallsT) BuildNoOutputCall(primopName string, inputs ...any)
- func (calls *CallsT) BuildVarCall(primopName string, output *VariableT, inputs ...any)
- func (calls *CallsT) HasFinal() bool
- func (calls *CallsT) SetLast(call *CallNodeT)
- func (calls *CallsT) SetLastSource(source token.Pos)
- type CellRefPrimopT
- func (primop *CellRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CellRefPrimopT) Name() string
- func (primop *CellRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CellRefPrimopT) SideEffects() bool
- func (primop *CellRefPrimopT) Simplify(call *CallNodeT)
- type CellSetPrimopT
- func (primop *CellSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CellSetPrimopT) Name() string
- func (primop *CellSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CellSetPrimopT) SideEffects() bool
- func (primop *CellSetPrimopT) Simplify(call *CallNodeT)
- type CellValuesT
- type CompPrimopT
- func (primop *CompPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CompPrimopT) Name() string
- func (primop *CompPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CompPrimopT) SideEffects() bool
- func (primop *CompPrimopT) Simplify(call *CallNodeT)
- type CompilatorT
- type EnvT
- type EvalPrimopT
- type IfEqPrimopT
- func (primop *IfEqPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfEqPrimopT) Name() string
- func (primop *IfEqPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfEqPrimopT) SideEffects() bool
- func (primop *IfEqPrimopT) Simplify(call *CallNodeT)
- type IfLtPrimopT
- func (primop *IfLtPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfLtPrimopT) Name() string
- func (primop *IfLtPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfLtPrimopT) SideEffects() bool
- func (primop *IfLtPrimopT) Simplify(call *CallNodeT)
- type IfPrimopT
- func (primop *IfPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfPrimopT) Name() string
- func (primop *IfPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfPrimopT) SideEffects() bool
- func (primop *IfPrimopT) Simplify(call *CallNodeT)
- type JumpLambdaPrimopT
- func (primop *JumpLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *JumpLambdaPrimopT) Name() string
- func (primop *JumpLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *JumpLambdaPrimopT) SideEffects() bool
- func (primop *JumpLambdaPrimopT) Simplify(call *CallNodeT)
- type JumpPrimopT
- func (primop *JumpPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *JumpPrimopT) Name() string
- func (primop *JumpPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *JumpPrimopT) SideEffects() bool
- func (primop *JumpPrimopT) Simplify(call *CallNodeT)
- type LenPrimopT
- func (primop *LenPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LenPrimopT) Name() string
- func (primop *LenPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LenPrimopT) SideEffects() bool
- func (primop *LenPrimopT) Simplify(call *CallNodeT)
- type LetPrimopT
- func (primop *LetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LetPrimopT) Name() string
- func (primop *LetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LetPrimopT) SideEffects() bool
- func (primop *LetPrimopT) Simplify(call *CallNodeT)
- type LetrecPrimopT
- func (primop *LetrecPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LetrecPrimopT) Name() string
- func (primop *LetrecPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LetrecPrimopT) SideEffects() bool
- func (primop *LetrecPrimopT) Simplify(call *CallNodeT)
- type LiteralNodeT
- type LoadRegPrimopT
- func (primop *LoadRegPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LoadRegPrimopT) Name() string
- func (primop *LoadRegPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LoadRegPrimopT) SideEffects() bool
- func (primop *LoadRegPrimopT) Simplify(call *CallNodeT)
- type MakeCellPrimopT
- func (primop *MakeCellPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *MakeCellPrimopT) Name() string
- func (primop *MakeCellPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *MakeCellPrimopT) SideEffects() bool
- func (primop *MakeCellPrimopT) Simplify(call *CallNodeT)
- type MakeLiteralPrimopT
- func (primop *MakeLiteralPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *MakeLiteralPrimopT) Name() string
- func (primop *MakeLiteralPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *MakeLiteralPrimopT) SideEffects() bool
- func (primop *MakeLiteralPrimopT) Simplify(call *CallNodeT)
- type NodeBaseT
- func (node *NodeBaseT) Flag() int
- func (node *NodeBaseT) Index() int
- func (node *NodeBaseT) IsSimplified() bool
- func (node *NodeBaseT) Parent() *CallNodeT
- func (node *NodeBaseT) SetFlag(flag int)
- func (node *NodeBaseT) SetIndex(index int)
- func (node *NodeBaseT) SetIsSimplified(isSimplified bool)
- func (node *NodeBaseT) SetParent(parent *CallNodeT)
- func (node *NodeBaseT) SetSource(source token.Pos)
- func (node *NodeBaseT) Source() token.Pos
- type NodeT
- type NodeTypeT
- type NotPrimopT
- func (primop *NotPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *NotPrimopT) Name() string
- func (primop *NotPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *NotPrimopT) SideEffects() bool
- func (primop *NotPrimopT) Simplify(call *CallNodeT)
- type PointerRefPrimopT
- func (primop *PointerRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *PointerRefPrimopT) Name() string
- func (primop *PointerRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *PointerRefPrimopT) SideEffects() bool
- func (primop *PointerRefPrimopT) Simplify(call *CallNodeT)
- type PointerSetPrimopT
- func (primop *PointerSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *PointerSetPrimopT) Name() string
- func (primop *PointerSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *PointerSetPrimopT) SideEffects() bool
- func (primop *PointerSetPrimopT) Simplify(call *CallNodeT)
- type PpCpsWriterT
- type PrimopT
- type ProcCallPrimopT
- func (primop *ProcCallPrimopT) CalledProc(call *CallNodeT) *CallNodeT
- func (primop *ProcCallPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ProcCallPrimopT) Name() string
- func (primop *ProcCallPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ProcCallPrimopT) SideEffects() bool
- func (primop *ProcCallPrimopT) Simplify(call *CallNodeT)
- type ProcLambdaPrimopT
- func (primop *ProcLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ProcLambdaPrimopT) Name() string
- func (primop *ProcLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ProcLambdaPrimopT) SideEffects() bool
- func (primop *ProcLambdaPrimopT) Simplify(call *CallNodeT)
- type QueueT
- type ReferenceNodeT
- type RegEnvT
- type RegUseSpecT
- type RegisterClassT
- type RegisterLinkerT
- type RegisterT
- type ReturnPrimopT
- func (primop *ReturnPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ReturnPrimopT) Name() string
- func (primop *ReturnPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ReturnPrimopT) SideEffects() bool
- func (primop *ReturnPrimopT) Simplify(call *CallNodeT)
- type SliceIndexPrimopT
- func (primop *SliceIndexPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *SliceIndexPrimopT) Name() string
- func (primop *SliceIndexPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *SliceIndexPrimopT) SideEffects() bool
- func (primop *SliceIndexPrimopT) Simplify(call *CallNodeT)
- type StackAllocator
- type VarEnvT
- type VariableT
Constants ¶
View Source
const ( LiteralNode = iota ReferenceNode CallNode )
View Source
const ( CallExit = iota // directly follows some other call ProcLambda // full procedure that is passed a continuation JumpLambda // only called tail-recursively and has no )
View Source
const ( EarlyRegUse = -2 MiddleRegUse = -1 LateRegUse = 0 )
Variables ¶
View Source
var Lambdas = util.SetT[*CallNodeT]{}
Set containing all calls that do not have a single predecessor.
View Source
var NextVariableId = 0
View Source
var PrimopTable = map[string]PrimopT{}
View Source
var TheFileSet *token.FileSet
Wart: We need an interface to replace Go's tokens for source data. token.FileSet is not an interface so we can't create our own.
Functions ¶
func AddRegisterLink ¶ added in v0.1.12
func AddStackFrames ¶ added in v0.1.6
func AllocateRegisters ¶
func AllocateRegisters(top *CallNodeT)
func AttachInput ¶
func AttachNext ¶
func CallString ¶
func DefaultSimplify ¶
func DefaultSimplify(call *CallNodeT)
func DefinePrimops ¶
func DefinePrimops()
func EraseVariable ¶
func EraseVariable(vart *VariableT)
func FindBasicBlocks ¶
func FindBasicBlocks[BB BasicBlockT](top *CallNodeT, makeBlock func() BB) []BB
func FindLoopBlocks ¶ added in v0.1.10
func InlineProcedure ¶
func InsertCallParent ¶
func IsCallNode ¶
func IsCalledNode ¶
func IsCalledRef ¶
func IsCalledRef(node *ReferenceNodeT) bool
func IsJumpLambdaNode ¶
func IsLiteralNode ¶
func IsProcLambdaNode ¶ added in v0.1.1
func IsReferenceNode ¶
func IsStackAllocator ¶ added in v0.1.6
func IsVarReferenceNode ¶
func LinkCallRegisters ¶ added in v0.1.12
func LinkCallRegisters(call *CallNodeT)
Ditto for procedure calls. Disabled until we figure out how to use this.
func LinkJumpRegisters ¶ added in v0.1.12
func LinkJumpRegisters(call *CallNodeT)
Called by the jump primop's RegisterUsage method.
func MarkChanged ¶
func MarkChanged(node NodeT)
func ProclaimEmpty ¶
func ProclaimEmpty(node NodeT)
func RegEvaluate ¶
func RemoveCall ¶
func RemoveCall(node *CallNodeT)
func RemoveNullInputs ¶
func RemoveUnusedInputs ¶
func RemoveUnusedInputs(top *CallNodeT)
func RemoveUnusedOutputs ¶
func RemoveUnusedOutputs(node *CallNodeT)
func ReplaceInput ¶
func ReplaceNext ¶
func SimplifyArithBinop ¶
func SimplifyArithBinop(call *CallNodeT)
func SimplifyBooleanOp ¶
func SimplifyCells ¶
func SimplifyCells(top *CallNodeT)
func SimplifyJump ¶
func SimplifyJump(call *CallNodeT)
func SimplifyLet ¶
func SimplifyLet(call *CallNodeT)
func SimplifyLetrec ¶
func SimplifyLetrec(call *CallNodeT)
func SimplifyMakeCell ¶
func SimplifyMakeCell(call *CallNodeT)
func SimplifyNext ¶
func SimplifyNext(call *CallNodeT)
func SimplifyProcCall ¶ added in v0.1.1
func SimplifyProcCall(call *CallNodeT)
func Substitute ¶
Types ¶
type BasicBlockT ¶
type BasicBlockT interface {
// contains filtered or unexported methods
}
func ContainingBlock ¶
func ContainingBlock(node NodeT) BasicBlockT
type BinopPrimopT ¶
type BinopPrimopT struct {
MyName string
}
func (*BinopPrimopT) Evaluate ¶
func (primop *BinopPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*BinopPrimopT) Name ¶
func (primop *BinopPrimopT) Name() string
func (*BinopPrimopT) RegisterUsage ¶
func (primop *BinopPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*BinopPrimopT) SideEffects ¶
func (primop *BinopPrimopT) SideEffects() bool
func (*BinopPrimopT) Simplify ¶
func (primop *BinopPrimopT) Simplify(call *CallNodeT)
type CallNodeT ¶
type CallNodeT struct {
NodeBaseT
CallType CallTypeT
Primop PrimopT // the primitive operator being called
Inputs []NodeT
Outputs []*VariableT
Next []*CallNodeT // calls that immediately follow this one
Block BasicBlockT // proc and jump lambdas and call exits of conditionals
Name string // for debugging
Id int // ditto
}
var TopLambda *CallNodeT
For debugging. This is the topmost node and has no parent.
func CalledLambda ¶
func DetachNext ¶
func (*CallNodeT) InputVariable ¶
type CallsProcPrimopT ¶ added in v0.1.1
Primops that call a procedure implement this.
type CallsT ¶
type CallsT struct {
First *CallNodeT // The first
Last *CallNodeT // and last calls in a block.
// contains filtered or unexported fields
}
func (*CallsT) AddPrimopVarsCall ¶
func (*CallsT) AppendCall ¶ added in v0.1.2
func (*CallsT) AppendCalls ¶ added in v0.1.2
func (*CallsT) BuildFinalCall ¶
func (*CallsT) BuildNoOutputCall ¶
func (*CallsT) BuildVarCall ¶
func (*CallsT) SetLastSource ¶
type CellRefPrimopT ¶
type CellRefPrimopT struct{}
func (*CellRefPrimopT) Evaluate ¶
func (primop *CellRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CellRefPrimopT) Name ¶
func (primop *CellRefPrimopT) Name() string
func (*CellRefPrimopT) RegisterUsage ¶
func (primop *CellRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CellRefPrimopT) SideEffects ¶
func (primop *CellRefPrimopT) SideEffects() bool
func (*CellRefPrimopT) Simplify ¶
func (primop *CellRefPrimopT) Simplify(call *CallNodeT)
type CellSetPrimopT ¶
type CellSetPrimopT struct{}
func (*CellSetPrimopT) Evaluate ¶
func (primop *CellSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CellSetPrimopT) Name ¶
func (primop *CellSetPrimopT) Name() string
func (*CellSetPrimopT) RegisterUsage ¶
func (primop *CellSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CellSetPrimopT) SideEffects ¶
func (primop *CellSetPrimopT) SideEffects() bool
func (*CellSetPrimopT) Simplify ¶
func (primop *CellSetPrimopT) Simplify(call *CallNodeT)
type CellValuesT ¶
type CellValuesT struct {
// contains filtered or unexported fields
}
type CompPrimopT ¶
func (*CompPrimopT) Evaluate ¶
func (primop *CompPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CompPrimopT) Name ¶
func (primop *CompPrimopT) Name() string
func (*CompPrimopT) RegisterUsage ¶
func (primop *CompPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CompPrimopT) SideEffects ¶
func (primop *CompPrimopT) SideEffects() bool
func (*CompPrimopT) Simplify ¶
func (primop *CompPrimopT) Simplify(call *CallNodeT)
type CompilatorT ¶ added in v0.1.2
type IfEqPrimopT ¶
type IfEqPrimopT struct{}
func (*IfEqPrimopT) Evaluate ¶
func (primop *IfEqPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*IfEqPrimopT) Name ¶
func (primop *IfEqPrimopT) Name() string
func (*IfEqPrimopT) RegisterUsage ¶
func (primop *IfEqPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfEqPrimopT) SideEffects ¶
func (primop *IfEqPrimopT) SideEffects() bool
func (*IfEqPrimopT) Simplify ¶
func (primop *IfEqPrimopT) Simplify(call *CallNodeT)
type IfLtPrimopT ¶
type IfLtPrimopT struct{}
func (*IfLtPrimopT) Evaluate ¶
func (primop *IfLtPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*IfLtPrimopT) Name ¶
func (primop *IfLtPrimopT) Name() string
func (*IfLtPrimopT) RegisterUsage ¶
func (primop *IfLtPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfLtPrimopT) SideEffects ¶
func (primop *IfLtPrimopT) SideEffects() bool
func (*IfLtPrimopT) Simplify ¶
func (primop *IfLtPrimopT) Simplify(call *CallNodeT)
type IfPrimopT ¶
type IfPrimopT struct{}
func (*IfPrimopT) RegisterUsage ¶
func (primop *IfPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfPrimopT) SideEffects ¶
type JumpLambdaPrimopT ¶
type JumpLambdaPrimopT struct {
}
func (*JumpLambdaPrimopT) Evaluate ¶
func (primop *JumpLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*JumpLambdaPrimopT) Name ¶
func (primop *JumpLambdaPrimopT) Name() string
func (*JumpLambdaPrimopT) RegisterUsage ¶
func (primop *JumpLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*JumpLambdaPrimopT) SideEffects ¶
func (primop *JumpLambdaPrimopT) SideEffects() bool
func (*JumpLambdaPrimopT) Simplify ¶
func (primop *JumpLambdaPrimopT) Simplify(call *CallNodeT)
type JumpPrimopT ¶
type JumpPrimopT struct{}
func (*JumpPrimopT) Evaluate ¶
func (primop *JumpPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*JumpPrimopT) Name ¶
func (primop *JumpPrimopT) Name() string
func (*JumpPrimopT) RegisterUsage ¶
func (primop *JumpPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*JumpPrimopT) SideEffects ¶
func (primop *JumpPrimopT) SideEffects() bool
func (*JumpPrimopT) Simplify ¶
func (primop *JumpPrimopT) Simplify(call *CallNodeT)
type LenPrimopT ¶ added in v0.1.1
type LenPrimopT struct{}
func (*LenPrimopT) Evaluate ¶ added in v0.1.1
func (primop *LenPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LenPrimopT) Name ¶ added in v0.1.1
func (primop *LenPrimopT) Name() string
func (*LenPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *LenPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LenPrimopT) SideEffects ¶ added in v0.1.1
func (primop *LenPrimopT) SideEffects() bool
func (*LenPrimopT) Simplify ¶ added in v0.1.1
func (primop *LenPrimopT) Simplify(call *CallNodeT)
type LetPrimopT ¶
type LetPrimopT struct{}
func (*LetPrimopT) Evaluate ¶
func (primop *LetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LetPrimopT) Name ¶
func (primop *LetPrimopT) Name() string
func (*LetPrimopT) RegisterUsage ¶
func (primop *LetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LetPrimopT) SideEffects ¶
func (primop *LetPrimopT) SideEffects() bool
func (*LetPrimopT) Simplify ¶
func (primop *LetPrimopT) Simplify(call *CallNodeT)
type LetrecPrimopT ¶
type LetrecPrimopT struct{}
func (*LetrecPrimopT) Evaluate ¶
func (primop *LetrecPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LetrecPrimopT) Name ¶
func (primop *LetrecPrimopT) Name() string
func (*LetrecPrimopT) RegisterUsage ¶
func (primop *LetrecPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LetrecPrimopT) SideEffects ¶
func (primop *LetrecPrimopT) SideEffects() bool
func (*LetrecPrimopT) Simplify ¶
func (primop *LetrecPrimopT) Simplify(call *CallNodeT)
type LiteralNodeT ¶
type LiteralNodeT struct {
NodeBaseT
Value constant.Value
// types.Type is an easy-to-implement interface, so it's not Go specific.
Type types.Type
}
func CopyLiteralNode ¶
func CopyLiteralNode(node *LiteralNodeT) *LiteralNodeT
func MakeLiteral ¶
func MakeLiteral(value any, typ types.Type) *LiteralNodeT
func (*LiteralNodeT) IsNil ¶
func (node *LiteralNodeT) IsNil() bool
func (*LiteralNodeT) IsValue ¶
func (node *LiteralNodeT) IsValue() bool
func (*LiteralNodeT) NodeType ¶
func (node *LiteralNodeT) NodeType() NodeTypeT
func (*LiteralNodeT) String ¶
func (node *LiteralNodeT) String() string
type LoadRegPrimopT ¶
type LoadRegPrimopT struct{}
Load a register with an immediage value.
func (*LoadRegPrimopT) Evaluate ¶
func (primop *LoadRegPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LoadRegPrimopT) Name ¶
func (primop *LoadRegPrimopT) Name() string
func (*LoadRegPrimopT) RegisterUsage ¶
func (primop *LoadRegPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LoadRegPrimopT) SideEffects ¶
func (primop *LoadRegPrimopT) SideEffects() bool
func (*LoadRegPrimopT) Simplify ¶
func (primop *LoadRegPrimopT) Simplify(call *CallNodeT)
type MakeCellPrimopT ¶
type MakeCellPrimopT struct{}
func (*MakeCellPrimopT) Evaluate ¶
func (primop *MakeCellPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*MakeCellPrimopT) Name ¶
func (primop *MakeCellPrimopT) Name() string
func (*MakeCellPrimopT) RegisterUsage ¶
func (primop *MakeCellPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*MakeCellPrimopT) SideEffects ¶
func (primop *MakeCellPrimopT) SideEffects() bool
func (*MakeCellPrimopT) Simplify ¶
func (primop *MakeCellPrimopT) Simplify(call *CallNodeT)
type MakeLiteralPrimopT ¶ added in v0.1.1
type MakeLiteralPrimopT struct{}
Load a register with an immediage value.
func (*MakeLiteralPrimopT) Evaluate ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*MakeLiteralPrimopT) Name ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Name() string
func (*MakeLiteralPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*MakeLiteralPrimopT) SideEffects ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) SideEffects() bool
func (*MakeLiteralPrimopT) Simplify ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Simplify(call *CallNodeT)
type NodeBaseT ¶
type NodeBaseT struct {
// contains filtered or unexported fields
}
func (*NodeBaseT) IsSimplified ¶
func (*NodeBaseT) SetIsSimplified ¶
type NodeT ¶
type NodeT interface {
NodeType() NodeTypeT
Parent() *CallNodeT
SetParent(parent *CallNodeT)
Index() int // index in parent's inputs
SetIndex(index int)
IsNil() bool
// Is this a literal, variable references, or non-continuation
// lambda.
IsValue() bool
// The simplifier applies a set of optimizing code tranformations.
// Nodes that have been simplified are flagged and any change to a
// node clears that flag. There is an invariant that if a node
// has been simplified then all of its descendents have also been
// simplified.
IsSimplified() bool
SetIsSimplified(isSimplified bool)
// Temporary marker used in analysing the node tree. Must be set
// back to zero upon completion.
Flag() int
SetFlag(flag int)
String() string // So they're easy to print.
}
func CalledNode ¶
func CopyNodeTree ¶ added in v0.1.1
func DetachInput ¶
type NotPrimopT ¶
type NotPrimopT struct{}
func (*NotPrimopT) Evaluate ¶
func (primop *NotPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*NotPrimopT) Name ¶
func (primop *NotPrimopT) Name() string
func (*NotPrimopT) RegisterUsage ¶
func (primop *NotPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*NotPrimopT) SideEffects ¶
func (primop *NotPrimopT) SideEffects() bool
func (*NotPrimopT) Simplify ¶
func (primop *NotPrimopT) Simplify(call *CallNodeT)
type PointerRefPrimopT ¶ added in v0.1.1
type PointerRefPrimopT struct{}
func (*PointerRefPrimopT) Evaluate ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*PointerRefPrimopT) Name ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Name() string
func (*PointerRefPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *PointerRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*PointerRefPrimopT) SideEffects ¶ added in v0.1.1
func (primop *PointerRefPrimopT) SideEffects() bool
func (*PointerRefPrimopT) Simplify ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Simplify(call *CallNodeT)
type PointerSetPrimopT ¶
type PointerSetPrimopT struct{}
func (*PointerSetPrimopT) Evaluate ¶
func (primop *PointerSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*PointerSetPrimopT) Name ¶
func (primop *PointerSetPrimopT) Name() string
func (*PointerSetPrimopT) RegisterUsage ¶
func (primop *PointerSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*PointerSetPrimopT) SideEffects ¶
func (primop *PointerSetPrimopT) SideEffects() bool
func (*PointerSetPrimopT) Simplify ¶
func (primop *PointerSetPrimopT) Simplify(call *CallNodeT)
type PpCpsWriterT ¶
type PpCpsWriterT struct {
Column int
// contains filtered or unexported fields
}
func MakePpCpsWriter ¶
func MakePpCpsWriter(writer io.Writer) *PpCpsWriterT
func (*PpCpsWriterT) Freshline ¶
func (writer *PpCpsWriterT) Freshline()
func (*PpCpsWriterT) IndentTo ¶
func (writer *PpCpsWriterT) IndentTo(column int)
func (*PpCpsWriterT) Newline ¶
func (writer *PpCpsWriterT) Newline()
type PrimopT ¶
type PrimopT interface {
Name() string
SideEffects() bool
Simplify(call *CallNodeT)
// The return values are the inputs' and outputs' register usages.
RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
}
func LookupPrimop ¶
type ProcCallPrimopT ¶ added in v0.1.1
type ProcCallPrimopT struct{}
func (*ProcCallPrimopT) CalledProc ¶ added in v0.1.1
func (primop *ProcCallPrimopT) CalledProc(call *CallNodeT) *CallNodeT
func (*ProcCallPrimopT) Evaluate ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ProcCallPrimopT) Name ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Name() string
func (*ProcCallPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *ProcCallPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ProcCallPrimopT) SideEffects ¶ added in v0.1.1
func (primop *ProcCallPrimopT) SideEffects() bool
func (*ProcCallPrimopT) Simplify ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Simplify(call *CallNodeT)
type ProcLambdaPrimopT ¶
type ProcLambdaPrimopT struct{}
func (*ProcLambdaPrimopT) Evaluate ¶
func (primop *ProcLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ProcLambdaPrimopT) Name ¶
func (primop *ProcLambdaPrimopT) Name() string
func (*ProcLambdaPrimopT) RegisterUsage ¶
func (primop *ProcLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ProcLambdaPrimopT) SideEffects ¶
func (primop *ProcLambdaPrimopT) SideEffects() bool
func (*ProcLambdaPrimopT) Simplify ¶
func (primop *ProcLambdaPrimopT) Simplify(call *CallNodeT)
type ReferenceNodeT ¶
func MakeReferenceNode ¶
func MakeReferenceNode(variable *VariableT) *ReferenceNodeT
func (*ReferenceNodeT) IsNil ¶
func (node *ReferenceNodeT) IsNil() bool
func (*ReferenceNodeT) IsValue ¶
func (node *ReferenceNodeT) IsValue() bool
func (*ReferenceNodeT) NodeType ¶
func (node *ReferenceNodeT) NodeType() NodeTypeT
func (*ReferenceNodeT) String ¶ added in v0.1.1
func (node *ReferenceNodeT) String() string
type RegUseSpecT ¶
type RegUseSpecT struct {
PhaseOffset int // -2, -1, 0 for early, middle, and late use
Class *RegisterClassT
}
type RegisterClassT ¶
type RegisterClassT struct {
Name string
// contains filtered or unexported fields
}
A set of registers.
func (*RegisterClassT) SetRegisters ¶ added in v0.1.13
func (class *RegisterClassT) SetRegisters(allRegisters []RegisterT, usableMask uint64)
type RegisterLinkerT ¶ added in v0.1.12
type RegisterLinkerT interface {
LinkRegisters(call *CallNodeT)
}
Primops can implement this.
type RegisterT ¶
type RegisterT interface {
SetClass(*RegisterClassT) // for initialization
Class() *RegisterClassT
String() string
Number() int
}
type ReturnPrimopT ¶
type ReturnPrimopT struct{}
func (*ReturnPrimopT) Evaluate ¶
func (primop *ReturnPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ReturnPrimopT) Name ¶
func (primop *ReturnPrimopT) Name() string
func (*ReturnPrimopT) RegisterUsage ¶
func (primop *ReturnPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ReturnPrimopT) SideEffects ¶
func (primop *ReturnPrimopT) SideEffects() bool
func (*ReturnPrimopT) Simplify ¶
func (primop *ReturnPrimopT) Simplify(call *CallNodeT)
type SliceIndexPrimopT ¶ added in v0.1.1
type SliceIndexPrimopT struct{}
func (*SliceIndexPrimopT) Evaluate ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*SliceIndexPrimopT) Name ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Name() string
func (*SliceIndexPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*SliceIndexPrimopT) SideEffects ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) SideEffects() bool
func (*SliceIndexPrimopT) Simplify ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Simplify(call *CallNodeT)
type StackAllocator ¶ added in v0.1.6
type StackAllocator interface {
IsStackAllocator() bool
}
How primops tell us that they do stack allocation.
Click to show internal directories.
Click to hide internal directories.