def iXX_divs_op(config: Configuration) -> None: """ Common logic function for the integer DIVS opcodes """ instruction = cast(BinOp, config.current_instruction) b, a = config.pop2_u32() b_s = instruction.valtype.to_signed(b) a_s = instruction.valtype.to_signed(a) if config.enable_logic_fn_logging: logger.debug("%s(%s, %s)", instruction.opcode.text, a_s, b_s) if b == 0: raise Trap('DIVISION BY ZERO') raw_result = abs(int(a_s)) // abs(int(b_s)) _, upper_bound = instruction.valtype.signed_bounds if raw_result > upper_bound: raise Trap('UNDEFINED') if (a_s < 0) is not (b_s < 0): signed_result = instruction.valtype.signed_type(-1 * raw_result) else: signed_result = instruction.valtype.signed_type(raw_result) result = instruction.valtype.from_signed(signed_result) config.push_operand(result)
def idivu_op(config: Configuration) -> None: """ Common logic function for the integer DIVU opcodes """ b, a = config.pop2_u32() if config.enable_logic_fn_logging: logger.debug("%s(%s, %s)", config.current_instruction.opcode.text, a, b) if b == 0: raise Trap('DIVISION BY ZERO') config.push_operand(a // b)