6 "github.com/vapor/math/checked"
9 func op1Add(vm *virtualMachine) error {
10 err := vm.applyCost(2)
14 n, err := vm.popInt64(true)
18 res, ok := checked.AddInt64(n, 1)
22 return vm.pushInt64(res, true)
25 func op1Sub(vm *virtualMachine) error {
26 err := vm.applyCost(2)
30 n, err := vm.popInt64(true)
34 res, ok := checked.SubInt64(n, 1)
38 return vm.pushInt64(res, true)
41 func op2Mul(vm *virtualMachine) error {
42 err := vm.applyCost(2)
46 n, err := vm.popInt64(true)
50 res, ok := checked.MulInt64(n, 2)
54 return vm.pushInt64(res, true)
57 func op2Div(vm *virtualMachine) error {
58 err := vm.applyCost(2)
62 n, err := vm.popInt64(true)
66 return vm.pushInt64(n>>1, true)
69 func opNegate(vm *virtualMachine) error {
70 err := vm.applyCost(2)
74 n, err := vm.popInt64(true)
78 res, ok := checked.NegateInt64(n)
82 return vm.pushInt64(res, true)
85 func opAbs(vm *virtualMachine) error {
86 err := vm.applyCost(2)
90 n, err := vm.popInt64(true)
94 if n == math.MinInt64 {
100 return vm.pushInt64(n, true)
103 func opNot(vm *virtualMachine) error {
104 err := vm.applyCost(2)
108 n, err := vm.popInt64(true)
112 return vm.pushBool(n == 0, true)
115 func op0NotEqual(vm *virtualMachine) error {
116 err := vm.applyCost(2)
120 n, err := vm.popInt64(true)
124 return vm.pushBool(n != 0, true)
127 func opAdd(vm *virtualMachine) error {
128 err := vm.applyCost(2)
132 y, err := vm.popInt64(true)
136 x, err := vm.popInt64(true)
140 res, ok := checked.AddInt64(x, y)
144 return vm.pushInt64(res, true)
147 func opSub(vm *virtualMachine) error {
148 err := vm.applyCost(2)
152 y, err := vm.popInt64(true)
156 x, err := vm.popInt64(true)
160 res, ok := checked.SubInt64(x, y)
164 return vm.pushInt64(res, true)
167 func opMul(vm *virtualMachine) error {
168 err := vm.applyCost(8)
172 y, err := vm.popInt64(true)
176 x, err := vm.popInt64(true)
180 res, ok := checked.MulInt64(x, y)
184 return vm.pushInt64(res, true)
187 func opDiv(vm *virtualMachine) error {
188 err := vm.applyCost(8)
192 y, err := vm.popInt64(true)
196 x, err := vm.popInt64(true)
203 res, ok := checked.DivInt64(x, y)
207 return vm.pushInt64(res, true)
210 func opMod(vm *virtualMachine) error {
211 err := vm.applyCost(8)
215 y, err := vm.popInt64(true)
219 x, err := vm.popInt64(true)
227 res, ok := checked.ModInt64(x, y)
232 // Go's modulus operator produces the wrong result for mixed-sign
234 if res != 0 && (x >= 0) != (y >= 0) {
238 return vm.pushInt64(res, true)
241 func opLshift(vm *virtualMachine) error {
242 err := vm.applyCost(8)
246 y, err := vm.popInt64(true)
253 x, err := vm.popInt64(true)
257 if x == 0 || y == 0 {
258 return vm.pushInt64(x, true)
261 res, ok := checked.LshiftInt64(x, y)
266 return vm.pushInt64(res, true)
269 func opRshift(vm *virtualMachine) error {
270 err := vm.applyCost(8)
274 y, err := vm.popInt64(true)
278 x, err := vm.popInt64(true)
285 return vm.pushInt64(x>>uint64(y), true)
288 func opBoolAnd(vm *virtualMachine) error {
289 err := vm.applyCost(2)
293 b, err := vm.pop(true)
297 a, err := vm.pop(true)
301 return vm.pushBool(AsBool(a) && AsBool(b), true)
304 func opBoolOr(vm *virtualMachine) error {
305 err := vm.applyCost(2)
309 b, err := vm.pop(true)
313 a, err := vm.pop(true)
317 return vm.pushBool(AsBool(a) || AsBool(b), true)
329 func opNumEqual(vm *virtualMachine) error {
330 return doNumCompare(vm, cmpEqual)
333 func opNumEqualVerify(vm *virtualMachine) error {
334 err := vm.applyCost(2)
338 y, err := vm.popInt64(true)
342 x, err := vm.popInt64(true)
349 return ErrVerifyFailed
352 func opNumNotEqual(vm *virtualMachine) error {
353 return doNumCompare(vm, cmpNotEqual)
356 func opLessThan(vm *virtualMachine) error {
357 return doNumCompare(vm, cmpLess)
360 func opGreaterThan(vm *virtualMachine) error {
361 return doNumCompare(vm, cmpGreater)
364 func opLessThanOrEqual(vm *virtualMachine) error {
365 return doNumCompare(vm, cmpLessEqual)
368 func opGreaterThanOrEqual(vm *virtualMachine) error {
369 return doNumCompare(vm, cmpGreaterEqual)
372 func doNumCompare(vm *virtualMachine, op int) error {
373 err := vm.applyCost(2)
377 y, err := vm.popInt64(true)
381 x, err := vm.popInt64(true)
393 case cmpGreaterEqual:
400 return vm.pushBool(res, true)
403 func opMin(vm *virtualMachine) error {
404 err := vm.applyCost(2)
408 y, err := vm.popInt64(true)
412 x, err := vm.popInt64(true)
419 return vm.pushInt64(x, true)
422 func opMax(vm *virtualMachine) error {
423 err := vm.applyCost(2)
427 y, err := vm.popInt64(true)
431 x, err := vm.popInt64(true)
438 return vm.pushInt64(x, true)
441 func opWithin(vm *virtualMachine) error {
442 err := vm.applyCost(4)
446 max, err := vm.popInt64(true)
450 min, err := vm.popInt64(true)
454 x, err := vm.popInt64(true)
458 return vm.pushBool(x >= min && x < max, true)