def optimize_INT_FLOORDIV(self, op): v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) if v2.is_constant() and v2.box.getint() == 1: self.make_equal_to(op.result, v1) return if v1.intbound.known_ge(IntBound(0, 0)) and v2.is_constant(): val = v2.box.getint() if val & (val - 1) == 0 and val > 0: # val == 2**shift op = op.copy_and_change(rop.INT_RSHIFT, args = [op.getarg(0), ConstInt(highest_bit(val))]) self.emit_operation(op)
def optimize_INT_FLOORDIV(self, op): v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) if v2.is_constant() and v2.box.getint() == 1: self.make_equal_to(op.result, v1) return elif v1.is_constant() and v1.box.getint() == 0: self.make_constant_int(op.result, 0) return if v1.intbound.known_ge(IntBound(0, 0)) and v2.is_constant(): val = v2.box.getint() if val & (val - 1) == 0 and val > 0: # val == 2**shift op = op.copy_and_change( rop.INT_RSHIFT, args=[op.getarg(0), ConstInt(highest_bit(val))]) self.emit_operation(op)
def optimize_INT_MUL(self, op): v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) # If one side of the op is 1 the result is the other side. if v1.is_constant() and v1.box.getint() == 1: self.make_equal_to(op.result, v2) elif v2.is_constant() and v2.box.getint() == 1: self.make_equal_to(op.result, v1) elif (v1.is_constant() and v1.box.getint() == 0) or \ (v2.is_constant() and v2.box.getint() == 0): self.make_constant_int(op.result, 0) else: for lhs, rhs in [(v1, v2), (v2, v1)]: if lhs.is_constant(): x = lhs.box.getint() # x & (x - 1) == 0 is a quick test for power of 2 if x & (x - 1) == 0: new_rhs = ConstInt(highest_bit(lhs.box.getint())) op = op.copy_and_change(rop.INT_LSHIFT, args=[rhs.box, new_rhs]) break self.emit_operation(op)