7 "github.com/bytom/vapor/math/checked"
10 func op1Add(vm *virtualMachine) error {
11 err := vm.applyCost(2)
15 n, err := vm.popInt64(true)
19 res, ok := checked.AddInt64(n, 1)
23 return vm.pushInt64(res, true)
26 func op1Sub(vm *virtualMachine) error {
27 err := vm.applyCost(2)
31 n, err := vm.popInt64(true)
35 res, ok := checked.SubInt64(n, 1)
39 return vm.pushInt64(res, true)
42 func op2Mul(vm *virtualMachine) error {
43 err := vm.applyCost(2)
47 n, err := vm.popInt64(true)
51 res, ok := checked.MulInt64(n, 2)
55 return vm.pushInt64(res, true)
58 func op2Div(vm *virtualMachine) error {
59 err := vm.applyCost(2)
63 n, err := vm.popInt64(true)
67 return vm.pushInt64(n>>1, true)
70 func opNegate(vm *virtualMachine) error {
71 err := vm.applyCost(2)
75 n, err := vm.popInt64(true)
79 res, ok := checked.NegateInt64(n)
83 return vm.pushInt64(res, true)
86 func opAbs(vm *virtualMachine) error {
87 err := vm.applyCost(2)
91 n, err := vm.popInt64(true)
95 if n == math.MinInt64 {
101 return vm.pushInt64(n, true)
104 func opNot(vm *virtualMachine) error {
105 err := vm.applyCost(2)
109 n, err := vm.popInt64(true)
113 return vm.pushBool(n == 0, true)
116 func op0NotEqual(vm *virtualMachine) error {
117 err := vm.applyCost(2)
121 n, err := vm.popInt64(true)
125 return vm.pushBool(n != 0, true)
128 func opAdd(vm *virtualMachine) error {
129 err := vm.applyCost(2)
133 y, err := vm.popInt64(true)
137 x, err := vm.popInt64(true)
141 res, ok := checked.AddInt64(x, y)
145 return vm.pushInt64(res, true)
148 func opSub(vm *virtualMachine) error {
149 err := vm.applyCost(2)
153 y, err := vm.popInt64(true)
157 x, err := vm.popInt64(true)
161 res, ok := checked.SubInt64(x, y)
165 return vm.pushInt64(res, true)
168 func opMul(vm *virtualMachine) error {
169 err := vm.applyCost(8)
173 y, err := vm.popInt64(true)
177 x, err := vm.popInt64(true)
181 res, ok := checked.MulInt64(x, y)
185 return vm.pushInt64(res, true)
188 func opDiv(vm *virtualMachine) error {
189 err := vm.applyCost(8)
193 y, err := vm.popInt64(true)
197 x, err := vm.popInt64(true)
204 res, ok := checked.DivInt64(x, y)
208 return vm.pushInt64(res, true)
211 func opMod(vm *virtualMachine) error {
212 err := vm.applyCost(8)
216 y, err := vm.popInt64(true)
220 x, err := vm.popInt64(true)
228 res, ok := checked.ModInt64(x, y)
233 // Go's modulus operator produces the wrong result for mixed-sign
235 if res != 0 && (x >= 0) != (y >= 0) {
239 return vm.pushInt64(res, true)
242 func opLshift(vm *virtualMachine) error {
243 err := vm.applyCost(8)
247 y, err := vm.popInt64(true)
254 x, err := vm.popInt64(true)
258 if x == 0 || y == 0 {
259 return vm.pushInt64(x, true)
262 res, ok := checked.LshiftInt64(x, y)
267 return vm.pushInt64(res, true)
270 func opRshift(vm *virtualMachine) error {
271 err := vm.applyCost(8)
275 y, err := vm.popInt64(true)
279 x, err := vm.popInt64(true)
286 return vm.pushInt64(x>>uint64(y), true)
289 func opBoolAnd(vm *virtualMachine) error {
290 err := vm.applyCost(2)
294 b, err := vm.pop(true)
298 a, err := vm.pop(true)
302 return vm.pushBool(AsBool(a) && AsBool(b), true)
305 func opBoolOr(vm *virtualMachine) error {
306 err := vm.applyCost(2)
310 b, err := vm.pop(true)
314 a, err := vm.pop(true)
318 return vm.pushBool(AsBool(a) || AsBool(b), true)
330 func opNumEqual(vm *virtualMachine) error {
331 return doNumCompare(vm, cmpEqual)
334 func opNumEqualVerify(vm *virtualMachine) error {
335 err := vm.applyCost(2)
339 y, err := vm.popInt64(true)
343 x, err := vm.popInt64(true)
350 return ErrVerifyFailed
353 func opNumNotEqual(vm *virtualMachine) error {
354 return doNumCompare(vm, cmpNotEqual)
357 func opLessThan(vm *virtualMachine) error {
358 return doNumCompare(vm, cmpLess)
361 func opGreaterThan(vm *virtualMachine) error {
362 return doNumCompare(vm, cmpGreater)
365 func opLessThanOrEqual(vm *virtualMachine) error {
366 return doNumCompare(vm, cmpLessEqual)
369 func opGreaterThanOrEqual(vm *virtualMachine) error {
370 return doNumCompare(vm, cmpGreaterEqual)
373 func doNumCompare(vm *virtualMachine, op int) error {
374 err := vm.applyCost(2)
378 y, err := vm.popInt64(true)
382 x, err := vm.popInt64(true)
394 case cmpGreaterEqual:
401 return vm.pushBool(res, true)
404 func opMin(vm *virtualMachine) error {
405 err := vm.applyCost(2)
409 y, err := vm.popInt64(true)
413 x, err := vm.popInt64(true)
420 return vm.pushInt64(x, true)
423 func opMax(vm *virtualMachine) error {
424 err := vm.applyCost(2)
428 y, err := vm.popInt64(true)
432 x, err := vm.popInt64(true)
439 return vm.pushInt64(x, true)
442 func opWithin(vm *virtualMachine) error {
443 err := vm.applyCost(4)
447 max, err := vm.popInt64(true)
451 min, err := vm.popInt64(true)
455 x, err := vm.popInt64(true)
459 return vm.pushBool(x >= min && x < max, true)
462 func opMulFraction(vm *virtualMachine) error {
463 if err := vm.applyCost(8); err != nil {
467 z, err := vm.popInt64(true)
476 y, err := vm.popInt64(true)
481 x, err := vm.popInt64(true)
487 res.Mul(res, big.NewInt(y)).Quo(res, big.NewInt(z))
492 return vm.pushInt64(res.Int64(), true)