def sdiv_(self, global_state): s0, s1 = util.pop_bitvec(global_state.mstate), util.pop_bitvec(global_state.mstate) if s1 == 0: global_state.mstate.stack.append(BitVecVal(0, 256)) else: global_state.mstate.stack.append(s0 / s1) return [global_state]
def div_(self, global_state): op0, op1 = util.pop_bitvec(global_state.mstate), util.pop_bitvec(global_state.mstate) if op1 == 0: global_state.mstate.stack.append(BitVecVal(0, 256)) else: global_state.mstate.stack.append(UDiv(op0, op1)) return [global_state]
def exp_(self, global_state): state = global_state.mstate base, exponent = util.pop_bitvec(state), util.pop_bitvec(state) if (type(base) != BitVecNumRef) or (type(exponent) != BitVecNumRef): state.stack.append(BitVec("(" + str(simplify(base)) + ")**(" + str(simplify(exponent)) + ")", 256)) else: state.stack.append(pow(base.as_long(), exponent.as_long(), 2**256)) return [global_state]
def exp_(self, global_state): state = global_state.mstate # we only implement 2 ** x base, exponent = util.pop_bitvec(state), util.pop_bitvec(state) if (type(base) != BitVecNumRef) or (type(exponent) != BitVecNumRef): state.stack.append(BitVec("(" + str(simplify(base)) + ")^(" + str(simplify(exponent)) + ")", 256)) elif base.as_long() == 2: if exponent.as_long() == 0: state.stack.append(BitVecVal(1, 256)) else: state.stack.append(base << (exponent - 1)) else: state.stack.append(base) return [global_state]
def sgt_(self, global_state): state = global_state.mstate exp = util.pop_bitvec(state) > util.pop_bitvec(state) state.stack.append(exp) return [global_state]
def gt_(self, global_state): state = global_state.mstate exp = UGT(util.pop_bitvec(state), util.pop_bitvec(state)) state.stack.append(exp) return [global_state]
def mulmod_(self, global_state): s0, s1, s2 = util.pop_bitvec(global_state.mstate), util.pop_bitvec( global_state.mstate), util.pop_bitvec(global_state.mstate) global_state.mstate.stack.append((s0 * s1) % s2 if s2 else 0)
def addmod_(self, global_state): s0, s1, s2 = util.pop_bitvec(global_state.mstate), util.pop_bitvec( global_state.mstate), util.pop_bitvec(global_state.mstate) global_state.mstate.stack.append((s0 + s1) % s2) return [global_state]
def smod_(self, global_state): s0, s1 = util.pop_bitvec(global_state.mstate), util.pop_bitvec( global_state.mstate) global_state.mstate.stack.append(0 if s1 == 0 else s0 % s1) return [global_state]
def sdiv_(self, global_state): s0, s1 = util.pop_bitvec(global_state.mstate), util.pop_bitvec( global_state.mstate) global_state.mstate.stack.append(s0 / s1) return [global_state]
def div_(self, global_state): global_state.mstate.stack.append( UDiv(util.pop_bitvec(global_state.mstate), util.pop_bitvec(global_state.mstate))) return [global_state]
def mul_(self, global_state): global_state.mstate.stack.append( (helper.pop_bitvec(global_state.mstate) * helper.pop_bitvec(global_state.mstate))) return [global_state]
def mulmod_(self, global_state): s0, s1, s2 = util.pop_bitvec(global_state.mstate), util.pop_bitvec(global_state.mstate), util.pop_bitvec( global_state.mstate) global_state.mstate.stack.append(URem(URem(s0, s2) * URem(s1, s2), s2)) return [global_state]