6 "github.com/holiman/uint256"
8 "github.com/bytom/bytom/math/checked"
11 func op1Add(vm *virtualMachine) error {
12 err := vm.applyCost(2)
17 n, err := vm.popBigInt(true)
22 num, ok := checked.NewUInt256("1")
27 if num.Add(n, num); num.Sign() < 0 {
31 return vm.pushBigInt(num, true)
34 func op1Sub(vm *virtualMachine) error {
35 err := vm.applyCost(2)
40 n, err := vm.popBigInt(true)
45 num, ok := checked.NewUInt256("1")
50 if num.Sub(n, num); num.Sign() < 0 {
54 return vm.pushBigInt(num, true)
57 func op2Mul(vm *virtualMachine) error {
58 err := vm.applyCost(2)
63 n, err := vm.popBigInt(true)
68 num, ok := checked.NewUInt256("2")
73 if num.Mul(n, num); num.Sign() < 0 {
77 return vm.pushBigInt(num, true)
80 func op2Div(vm *virtualMachine) error {
81 err := vm.applyCost(2)
86 n, err := vm.popBigInt(true)
91 return vm.pushBigInt(n.Rsh(n,1), true)
94 func opNegate(vm *virtualMachine) error {
95 err := vm.applyCost(2)
99 n, err := vm.popInt64(true)
103 res, ok := checked.NegateInt64(n)
107 return vm.pushInt64(res, true)
110 func opAbs(vm *virtualMachine) error {
111 err := vm.applyCost(2)
115 n, err := vm.popInt64(true)
119 if n == math.MinInt64 {
125 return vm.pushInt64(n, true)
128 func opNot(vm *virtualMachine) error {
129 err := vm.applyCost(2)
134 n, err := vm.popBigInt(true)
139 return vm.pushBool(n.Cmp(uint256.NewInt()) == 0, true)
142 func op0NotEqual(vm *virtualMachine) error {
143 err := vm.applyCost(2)
148 n, err := vm.popBigInt(true)
153 return vm.pushBool(n.Cmp(uint256.NewInt()) != 0, true)
156 func opAdd(vm *virtualMachine) error {
157 err := vm.applyCost(2)
161 y, err := vm.popInt64(true)
165 x, err := vm.popInt64(true)
169 res, ok := checked.AddInt64(x, y)
173 return vm.pushInt64(res, true)
176 func opSub(vm *virtualMachine) error {
177 err := vm.applyCost(2)
181 y, err := vm.popInt64(true)
185 x, err := vm.popInt64(true)
189 res, ok := checked.SubInt64(x, y)
193 return vm.pushInt64(res, true)
196 func opMul(vm *virtualMachine) error {
197 err := vm.applyCost(8)
201 y, err := vm.popInt64(true)
205 x, err := vm.popInt64(true)
209 res, ok := checked.MulInt64(x, y)
213 return vm.pushInt64(res, true)
216 func opDiv(vm *virtualMachine) error {
217 err := vm.applyCost(8)
221 y, err := vm.popInt64(true)
225 x, err := vm.popInt64(true)
232 res, ok := checked.DivInt64(x, y)
236 return vm.pushInt64(res, true)
239 func opMod(vm *virtualMachine) error {
240 err := vm.applyCost(8)
244 y, err := vm.popInt64(true)
248 x, err := vm.popInt64(true)
256 res, ok := checked.ModInt64(x, y)
261 // Go's modulus operator produces the wrong result for mixed-sign
263 if res != 0 && (x >= 0) != (y >= 0) {
267 return vm.pushInt64(res, true)
270 func opLshift(vm *virtualMachine) error {
271 err := vm.applyCost(8)
275 y, err := vm.popInt64(true)
282 x, err := vm.popInt64(true)
286 if x == 0 || y == 0 {
287 return vm.pushInt64(x, true)
290 res, ok := checked.LshiftInt64(x, y)
295 return vm.pushInt64(res, true)
298 func opRshift(vm *virtualMachine) error {
299 err := vm.applyCost(8)
303 y, err := vm.popInt64(true)
307 x, err := vm.popInt64(true)
314 return vm.pushInt64(x>>uint64(y), true)
317 func opBoolAnd(vm *virtualMachine) error {
318 err := vm.applyCost(2)
322 b, err := vm.pop(true)
326 a, err := vm.pop(true)
330 return vm.pushBool(AsBool(a) && AsBool(b), true)
333 func opBoolOr(vm *virtualMachine) error {
334 err := vm.applyCost(2)
338 b, err := vm.pop(true)
342 a, err := vm.pop(true)
346 return vm.pushBool(AsBool(a) || AsBool(b), true)
358 func opNumEqual(vm *virtualMachine) error {
359 return doNumCompare(vm, cmpEqual)
362 func opNumEqualVerify(vm *virtualMachine) error {
363 err := vm.applyCost(2)
367 y, err := vm.popInt64(true)
371 x, err := vm.popInt64(true)
378 return ErrVerifyFailed
381 func opNumNotEqual(vm *virtualMachine) error {
382 return doNumCompare(vm, cmpNotEqual)
385 func opLessThan(vm *virtualMachine) error {
386 return doNumCompare(vm, cmpLess)
389 func opGreaterThan(vm *virtualMachine) error {
390 return doNumCompare(vm, cmpGreater)
393 func opLessThanOrEqual(vm *virtualMachine) error {
394 return doNumCompare(vm, cmpLessEqual)
397 func opGreaterThanOrEqual(vm *virtualMachine) error {
398 return doNumCompare(vm, cmpGreaterEqual)
401 func doNumCompare(vm *virtualMachine, op int) error {
402 err := vm.applyCost(2)
406 y, err := vm.popBigInt(true)
410 x, err := vm.popBigInt(true)
422 case cmpGreaterEqual:
429 return vm.pushBool(res, true)
432 func opMin(vm *virtualMachine) error {
433 err := vm.applyCost(2)
437 y, err := vm.popInt64(true)
441 x, err := vm.popInt64(true)
448 return vm.pushInt64(x, true)
451 func opMax(vm *virtualMachine) error {
452 err := vm.applyCost(2)
456 y, err := vm.popInt64(true)
460 x, err := vm.popInt64(true)
467 return vm.pushInt64(x, true)
470 func opWithin(vm *virtualMachine) error {
471 err := vm.applyCost(4)
475 max, err := vm.popInt64(true)
479 min, err := vm.popInt64(true)
483 x, err := vm.popInt64(true)
487 return vm.pushBool(x >= min && x < max, true)