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)
162 y, err := vm.popBigInt(true)
167 x, err := vm.popBigInt(true)
172 if x.Add(x, y); x.Sign() < 0 {
176 return vm.pushBigInt(x, true)
179 func opSub(vm *virtualMachine) error {
180 err := vm.applyCost(2)
185 y, err := vm.popBigInt(true)
190 x, err := vm.popBigInt(true)
195 if x.Sub(x, y); x.Sign() < 0 {
199 return vm.pushBigInt(x, true)
202 func opMul(vm *virtualMachine) error {
203 err := vm.applyCost(8)
208 y, err := vm.popBigInt(true)
213 x, err := vm.popBigInt(true)
218 if overflow := x.MulOverflow(x, y); overflow || x.Sign() < 0 {
222 return vm.pushBigInt(x, true)
225 func opDiv(vm *virtualMachine) error {
226 err := vm.applyCost(8)
231 y, err := vm.popBigInt(true)
236 x, err := vm.popBigInt(true)
245 return vm.pushBigInt(x.Div(x, y), true)
248 func opMod(vm *virtualMachine) error {
249 err := vm.applyCost(8)
254 y, err := vm.popBigInt(true)
259 x, err := vm.popBigInt(true)
268 return vm.pushBigInt(x.Mod(x, y), true)
271 func opLshift(vm *virtualMachine) error {
272 err := vm.applyCost(8)
276 y, err := vm.popInt64(true)
283 x, err := vm.popInt64(true)
287 if x == 0 || y == 0 {
288 return vm.pushInt64(x, true)
291 res, ok := checked.LshiftInt64(x, y)
296 return vm.pushInt64(res, true)
299 func opRshift(vm *virtualMachine) error {
300 err := vm.applyCost(8)
304 y, err := vm.popInt64(true)
308 x, err := vm.popInt64(true)
315 return vm.pushInt64(x>>uint64(y), true)
318 func opBoolAnd(vm *virtualMachine) error {
319 err := vm.applyCost(2)
323 b, err := vm.pop(true)
327 a, err := vm.pop(true)
331 return vm.pushBool(AsBool(a) && AsBool(b), true)
334 func opBoolOr(vm *virtualMachine) error {
335 err := vm.applyCost(2)
339 b, err := vm.pop(true)
343 a, err := vm.pop(true)
347 return vm.pushBool(AsBool(a) || AsBool(b), true)
359 func opNumEqual(vm *virtualMachine) error {
360 return doNumCompare(vm, cmpEqual)
363 func opNumEqualVerify(vm *virtualMachine) error {
364 err := vm.applyCost(2)
368 y, err := vm.popInt64(true)
372 x, err := vm.popInt64(true)
379 return ErrVerifyFailed
382 func opNumNotEqual(vm *virtualMachine) error {
383 return doNumCompare(vm, cmpNotEqual)
386 func opLessThan(vm *virtualMachine) error {
387 return doNumCompare(vm, cmpLess)
390 func opGreaterThan(vm *virtualMachine) error {
391 return doNumCompare(vm, cmpGreater)
394 func opLessThanOrEqual(vm *virtualMachine) error {
395 return doNumCompare(vm, cmpLessEqual)
398 func opGreaterThanOrEqual(vm *virtualMachine) error {
399 return doNumCompare(vm, cmpGreaterEqual)
402 func doNumCompare(vm *virtualMachine, op int) error {
403 err := vm.applyCost(2)
407 y, err := vm.popBigInt(true)
411 x, err := vm.popBigInt(true)
423 case cmpGreaterEqual:
430 return vm.pushBool(res, true)
433 func opMin(vm *virtualMachine) error {
434 err := vm.applyCost(2)
439 y, err := vm.popBigInt(true)
444 x, err := vm.popBigInt(true)
450 return vm.pushBigInt(y, true)
452 return vm.pushBigInt(x, true)
455 func opMax(vm *virtualMachine) error {
456 err := vm.applyCost(2)
461 y, err := vm.popBigInt(true)
466 x, err := vm.popBigInt(true)
472 return vm.pushBigInt(y, true)
474 return vm.pushBigInt(x, true)
477 func opWithin(vm *virtualMachine) error {
478 err := vm.applyCost(4)
482 max, err := vm.popBigInt(true)
487 min, err := vm.popBigInt(true)
492 x, err := vm.popBigInt(true)
497 return vm.pushBool(x.Cmp(min) >= 0 && x.Cmp(max) < 0, true)