File: regalloc.py

package info (click to toggle)
pypy 5.6.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 97,040 kB
  • ctags: 185,069
  • sloc: python: 1,147,862; ansic: 49,642; cpp: 5,245; asm: 5,169; makefile: 529; sh: 481; xml: 232; lisp: 45
file content (99 lines) | stat: -rw-r--r-- 3,315 bytes parent folder | download | duplicates (8)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from rpython.jit.backend.arm import conditions as c
from rpython.jit.backend.arm import registers as r
from rpython.jit.metainterp.history import Const, ConstInt, FLOAT
from rpython.rlib.objectmodel import we_are_translated

VMEM_imm_size=0x3FC
default_imm_size=0xFF

def check_imm_arg(arg, size=default_imm_size, allow_zero=True):
    assert not isinstance(arg, Const)     # because it must be an int :-)
    if not we_are_translated():
        if not isinstance(arg, int):
            import pdb; pdb.set_trace()
    i = arg
    if allow_zero:
        lower_bound = i >= 0
    else:
        lower_bound = i > 0
    return i <= size and lower_bound

def check_imm_box(arg, size=0xFF, allow_zero=True):
    if isinstance(arg, ConstInt):
        return check_imm_arg(arg.getint(), size, allow_zero)
    return False


def prepare_op_ri(name=None, imm_size=0xFF, commutative=True, allow_zero=True):
    def f(self, op, fcond):
        assert fcond is not None
        a0 = op.getarg(0)
        a1 = op.getarg(1)
        boxes = list(op.getarglist())
        imm_a0 = check_imm_box(a0, imm_size, allow_zero=allow_zero)
        imm_a1 = check_imm_box(a1, imm_size, allow_zero=allow_zero)
        if not imm_a0 and imm_a1:
            l0 = self.make_sure_var_in_reg(a0)
            l1 = self.convert_to_imm(a1)
        elif commutative and imm_a0 and not imm_a1:
            l1 = self.convert_to_imm(a0)
            l0 = self.make_sure_var_in_reg(a1, boxes)
        else:
            l0 = self.make_sure_var_in_reg(a0, boxes)
            l1 = self.make_sure_var_in_reg(a1, boxes)
        self.possibly_free_vars_for_op(op)
        self.free_temp_vars()
        res = self.force_allocate_reg(op, boxes)
        return [l0, l1, res]
    if name:
        f.__name__ = name
    return f

def prepare_unary_op(self, op, fcond):
    loc1 = self.make_sure_var_in_reg(op.getarg(0))
    self.possibly_free_vars_for_op(op)
    self.free_temp_vars()
    res = self.force_allocate_reg(op)
    return [loc1, res]

def prepare_two_regs_op(self, op, fcond):
    loc1 = self.make_sure_var_in_reg(op.getarg(0))
    loc2 = self.make_sure_var_in_reg(op.getarg(1))
    self.possibly_free_vars_for_op(op)
    self.free_temp_vars()
    res = self.force_allocate_reg(op)
    return [loc1, loc2, res]

def prepare_float_cmp(self, op, fcond):
    loc1 = self.make_sure_var_in_reg(op.getarg(0))
    loc2 = self.make_sure_var_in_reg(op.getarg(1))
    self.possibly_free_vars_for_op(op)
    self.free_temp_vars()
    res = self.force_allocate_reg_or_cc(op)
    return [loc1, loc2, res]

def prepare_int_cmp(self, op, fcond):
    assert fcond is not None
    boxes = list(op.getarglist())
    arg0, arg1 = boxes
    imm_a1 = check_imm_box(arg1)

    l0 = self.make_sure_var_in_reg(arg0, forbidden_vars=boxes)
    if imm_a1:
        l1 = self.convert_to_imm(arg1)
    else:
        l1 = self.make_sure_var_in_reg(arg1, forbidden_vars=boxes)

    self.possibly_free_vars_for_op(op)
    self.free_temp_vars()
    res = self.force_allocate_reg_or_cc(op)
    return [l0, l1, res]

def prepare_unary_cmp(self, op, fcond):
    assert fcond is not None
    a0 = op.getarg(0)
    assert not isinstance(a0, Const)
    reg = self.make_sure_var_in_reg(a0)
    self.possibly_free_vars_for_op(op)
    res = self.force_allocate_reg_or_cc(op)
    return [reg, res]