Files
subcoding/vm/opcode.go
2021-11-21 17:04:58 -08:00

128 lines
4.2 KiB
Go

package vm
type OpCodeType uint32
const (
OpNoOp OpCodeType = 0x00000000
OpNop = OpNoOp
OpMove = 0x00000100
OpMov = OpMove
OpAdd = 0x00000200
OpSubtract = 0x00000201
OpSub = OpSubtract
OpMultiply = 0x00000202
OpMul = OpMultiply
OpDivideUnsigned = 0x00000203
OpDivU = OpDivideUnsigned
OpDivideSigned = 0x00000204
OpDivS = OpDivideSigned
OpNot = 0x00000300
OpAnd = 0x00000301
OpOr = 0x00000302
OpXor = 0x00000303
OpShiftRight = 0x00000400
OpShR = OpShiftRight
OpShiftLeft = 0x00000401
OpShL = OpShiftLeft
OpIsEqual = 0x00000500
OpEq = OpIsEqual
OpIsLessThanUnsigned = 0x00000501
OpLTU = OpIsLessThanUnsigned
OpIsLessThanSigned = 0x00000502
OpLTS = OpIsLessThanSigned
OpIsGreaterThanUnsigned = 0x00000503
OpGTU = OpIsGreaterThanUnsigned
OpIsGreaterThanSigned = 0x00000504
OpGTS = OpIsGreaterThanSigned
OpIsLessThanOrEqualUnsigned = 0x00000505
OpLTEU = OpIsLessThanOrEqualUnsigned
OpIsLessThanOrEqualSigned = 0x00000506
OpLTES = OpIsLessThanOrEqualSigned
OpIsGreaterThanOrEqualUnsigned = 0x00000507
OpGTEU = OpIsGreaterThanOrEqualUnsigned
OpIsGreaterThanOrEqualSigned = 0x00000508
OpGTES = OpIsGreaterThanOrEqualSigned
OpJump = 0x00000600
OpJmp = OpJump
OpJumpIfTrue = 0x00000601
OpJmpT = OpJumpIfTrue
OpJumpIfFalse = 0x00000602
OpJmpF = OpJumpIfFalse
OpCall = 0x00000700
OpCal = OpCall
OpCallIfTrue = 0x00000701
OpCalT = OpCallIfTrue
OpCallIfFalse = 0x00000702
OpCalF = OpCallIfFalse
OpReturn = 0x00000800
OpRet = OpReturn
OpReturnIfTrue = 0x00000801
OpRetT = OpReturnIfTrue
OpReturnIfFalse = 0x00000802
OpRetF = OpReturnIfFalse
OpSquareRoot = 0x00000900
OpSqRt = OpSquareRoot
OpSqrt = OpSquareRoot
)
type OperandNumericType int
const (
OperandUnsigned OperandNumericType = 0
OperandSigned = 1
OperandSignedOrUnsigned = 2
OperandReference = 3
)
var OperandsByOpCode = map[OpCodeType][]OperandNumericType{
OpNop: []OperandNumericType{},
OpMov: []OperandNumericType{OperandReference, OperandSignedOrUnsigned},
OpAdd: []OperandNumericType{OperandReference, OperandSignedOrUnsigned},
OpSub: []OperandNumericType{OperandReference, OperandSignedOrUnsigned},
OpMul: []OperandNumericType{OperandReference, OperandSignedOrUnsigned},
OpDivU: []OperandNumericType{OperandReference, OperandUnsigned},
OpDivS: []OperandNumericType{OperandReference, OperandSigned},
OpNot: []OperandNumericType{OperandReference},
OpAnd: []OperandNumericType{OperandReference, OperandUnsigned},
OpOr: []OperandNumericType{OperandReference, OperandUnsigned},
OpXor: []OperandNumericType{OperandReference, OperandUnsigned},
OpShR: []OperandNumericType{OperandReference, OperandUnsigned},
OpShL: []OperandNumericType{OperandReference, OperandUnsigned},
OpEq: []OperandNumericType{OperandSignedOrUnsigned, OperandSignedOrUnsigned},
OpLTU: []OperandNumericType{OperandUnsigned, OperandUnsigned},
OpLTS: []OperandNumericType{OperandSigned, OperandSigned},
OpGTU: []OperandNumericType{OperandUnsigned, OperandUnsigned},
OpGTS: []OperandNumericType{OperandSigned, OperandSigned},
OpLTEU: []OperandNumericType{OperandUnsigned, OperandUnsigned},
OpLTES: []OperandNumericType{OperandSigned, OperandSigned},
OpGTEU: []OperandNumericType{OperandUnsigned, OperandUnsigned},
OpGTES: []OperandNumericType{OperandSigned, OperandSigned},
OpJmp: []OperandNumericType{OperandSigned},
OpJmpT: []OperandNumericType{OperandSigned},
OpJmpF: []OperandNumericType{OperandSigned},
OpCal: []OperandNumericType{OperandSigned},
OpCalT: []OperandNumericType{OperandSigned},
OpCalF: []OperandNumericType{OperandSigned},
OpRet: []OperandNumericType{},
OpRetT: []OperandNumericType{},
OpRetF: []OperandNumericType{},
OpSqrt: []OperandNumericType{OperandReference},
}