Typed operands
This commit is contained in:
@@ -50,29 +50,38 @@ var opCodeByName = map[string]vm.OpCodeType{
|
||||
"jmpf": vm.OpJmpF,
|
||||
}
|
||||
|
||||
var operandsByOpCode = map[vm.OpCodeType]int{
|
||||
vm.OpNop: 0,
|
||||
vm.OpCal: 1,
|
||||
vm.OpRet: 0,
|
||||
type operandType int
|
||||
|
||||
vm.OpMov: 2,
|
||||
vm.OpAdd: 2,
|
||||
vm.OpSub: 2,
|
||||
vm.OpMul: 2,
|
||||
vm.OpDivU: 2,
|
||||
vm.OpDivS: 2,
|
||||
const (
|
||||
u operandType = 0
|
||||
s = 1
|
||||
us = 2
|
||||
r = 3
|
||||
)
|
||||
|
||||
vm.OpEq: 2,
|
||||
vm.OpLTU: 2,
|
||||
vm.OpLTS: 2,
|
||||
vm.OpGTU: 2,
|
||||
vm.OpGTS: 2,
|
||||
vm.OpLTEU: 2,
|
||||
vm.OpLTES: 2,
|
||||
vm.OpGTEU: 2,
|
||||
vm.OpGTES: 2,
|
||||
var operandsByOpCode = map[vm.OpCodeType][]operandType{
|
||||
vm.OpNop: []operandType{},
|
||||
vm.OpCal: []operandType{s},
|
||||
vm.OpRet: []operandType{},
|
||||
|
||||
vm.OpJmp: 1,
|
||||
vm.OpJmpT: 1,
|
||||
vm.OpJmpF: 1,
|
||||
vm.OpMov: []operandType{r, us},
|
||||
vm.OpAdd: []operandType{r, us},
|
||||
vm.OpSub: []operandType{r, us},
|
||||
vm.OpMul: []operandType{r, us},
|
||||
vm.OpDivU: []operandType{r, u},
|
||||
vm.OpDivS: []operandType{r, s},
|
||||
|
||||
vm.OpEq: []operandType{us, us},
|
||||
vm.OpLTU: []operandType{u, u},
|
||||
vm.OpLTS: []operandType{s, s},
|
||||
vm.OpGTU: []operandType{u, u},
|
||||
vm.OpGTS: []operandType{s, s},
|
||||
vm.OpLTEU: []operandType{u, u},
|
||||
vm.OpLTES: []operandType{s, s},
|
||||
vm.OpGTEU: []operandType{u, u},
|
||||
vm.OpGTES: []operandType{s, s},
|
||||
|
||||
vm.OpJmp: []operandType{s},
|
||||
vm.OpJmpT: []operandType{s},
|
||||
vm.OpJmpF: []operandType{s},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user