File: test_intdiv.py

package info (click to toggle)
pypy 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 107,216 kB
  • sloc: python: 1,201,787; ansic: 62,419; asm: 5,169; cpp: 3,017; sh: 2,534; makefile: 545; xml: 243; lisp: 45; awk: 4
file content (68 lines) | stat: -rw-r--r-- 2,409 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import sys
import py
from hypothesis import given, strategies

from rpython.jit.metainterp.optimizeopt.intdiv import magic_numbers, LONG_BIT
from rpython.jit.metainterp.optimizeopt.intdiv import division_operations
from rpython.jit.metainterp.optimizeopt.intdiv import modulo_operations
from rpython.jit.metainterp.optimizeopt.intdiv import unsigned_mul_high
from rpython.jit.metainterp.history import ConstInt
from rpython.jit.metainterp.resoperation import InputArgInt
from rpython.jit.metainterp.executor import execute

not_power_of_two = (strategies.integers(min_value=3, max_value=sys.maxint)
                    .filter(lambda m: (m & (m - 1)) != 0))


@given(strategies.integers(min_value=0, max_value=sys.maxint),
       not_power_of_two)
def test_magic_numbers(n, m):
    k, i = magic_numbers(m)
    k = int(k)    # and no longer r_uint, with wrap-around semantics
    a = (n * k) >> (LONG_BIT + i)
    assert a == n // m


@given(strategies.integers(min_value=0, max_value=2*sys.maxint+1),
       strategies.integers(min_value=0, max_value=2*sys.maxint+1))
def test_unsigned_mul_high(a, b):
    c = unsigned_mul_high(a, b)
    assert c == ((a * b) >> LONG_BIT)


@given(strategies.integers(min_value=-sys.maxint-1, max_value=sys.maxint),
       not_power_of_two,
       strategies.booleans())
def test_division_operations(n, m, known_nonneg):
    if n < 0:
        known_nonneg = False
    n_box = InputArgInt()
    ops = division_operations(n_box, m, known_nonneg)

    constants = {n_box: ConstInt(n)}
    for op in ops:
        argboxes = op.getarglist()
        constantboxes = [constants.get(box, box) for box in argboxes]
        res = execute(None, None, op.getopnum(), None, *constantboxes)
        constants[op] = ConstInt(res)

    assert constants[op].getint() == n // m


@given(strategies.integers(min_value=-sys.maxint-1, max_value=sys.maxint),
       not_power_of_two,
       strategies.booleans())
def test_modulo_operations(n, m, known_nonneg):
    if n < 0:
        known_nonneg = False
    n_box = InputArgInt()
    ops = modulo_operations(n_box, m, known_nonneg)

    constants = {n_box: ConstInt(n)}
    for op in ops:
        argboxes = op.getarglist()
        constantboxes = [constants.get(box, box) for box in argboxes]
        res = execute(None, None, op.getopnum(), None, *constantboxes)
        constants[op] = ConstInt(res)

    assert constants[op].getint() == n % m