[pypy-commit] pypy arm64: basic IMM support in add

fijal pypy.commits at gmail.com
Wed Mar 6 09:32:04 EST 2019


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96217:13d01ec04e4e
Date: 2019-03-06 14:31 +0000
http://bitbucket.org/pypy/pypy/changeset/13d01ec04e4e/

Log:	basic IMM support in add

diff --git a/rpython/jit/backend/aarch64/opassembler.py b/rpython/jit/backend/aarch64/opassembler.py
--- a/rpython/jit/backend/aarch64/opassembler.py
+++ b/rpython/jit/backend/aarch64/opassembler.py
@@ -23,9 +23,9 @@
         else:
             s = 0
         if l0.is_imm():
-            self.mc.ADD_ri(res.value, l1.value, imm=l0.value, s=s)
+            self.mc.ADD_ri(res.value, l1.value, l0.value)
         elif l1.is_imm():
-            self.mc.ADD_ri(res.value, l0.value, imm=l1.value, s=s)
+            self.mc.ADD_ri(res.value, l0.value, l1.value)
         else:
             self.mc.ADD_rr(res.value, l0.value, l1.value)
 
diff --git a/rpython/jit/backend/aarch64/regalloc.py b/rpython/jit/backend/aarch64/regalloc.py
--- a/rpython/jit/backend/aarch64/regalloc.py
+++ b/rpython/jit/backend/aarch64/regalloc.py
@@ -148,6 +148,22 @@
                 continue
             return free_regs[i]
 
+DEFAULT_IMM_SIZE = 4096
+
+def check_imm_arg(arg, size=DEFAULT_IMM_SIZE, allow_zero=True):
+    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=DEFAULT_IMM_SIZE, allow_zero=True):
+    if isinstance(arg, ConstInt):
+        return check_imm_arg(arg.getint(), size, allow_zero)
+    return False
+
+
 class Regalloc(BaseRegalloc):
 
     def __init__(self, assembler):
@@ -280,16 +296,24 @@
         return [base_loc, value_loc]
 
     def prepare_op_int_add(self, op):
-        arg0 = op.getarg(0)
-        arg1 = op.getarg(1)
+        boxes = op.getarglist()
+        a0, a1 = boxes
         # XXX support immediates
-        l0 = self.make_sure_var_in_reg(arg0, op.getarglist())
-        l1 = self.make_sure_var_in_reg(arg1, op.getarglist())
+        imm_a0 = check_imm_box(a0)
+        imm_a1 = check_imm_box(a1)
+        if not imm_a0 and imm_a1:
+            l0 = self.make_sure_var_in_reg(a0, boxes)
+            l1 = self.convert_to_imm(a1)
+        elif imm_a0 and not imm_a1:
+            l0 = self.convert_to_imm(a0)
+            l1 = 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)
         res = self.force_allocate_reg(op)
         return [l0, l1, res]
 
-
     def prepare_int_cmp(self, op, res_in_cc):
         boxes = op.getarglist()
         arg0, arg1 = boxes
diff --git a/rpython/jit/backend/aarch64/test/test_instr_builder.py b/rpython/jit/backend/aarch64/test/test_instr_builder.py
--- a/rpython/jit/backend/aarch64/test/test_instr_builder.py
+++ b/rpython/jit/backend/aarch64/test/test_instr_builder.py
@@ -130,6 +130,15 @@
     @settings(max_examples=20)
     @given(rd=st.sampled_from(r.registers),
            rn=st.sampled_from(r.registers),
+           imm=st.integers(min_value=0, max_value=(1<<12)-1))
+    def test_ADD_ri(self, rd, rn, imm):
+        cb = CodeBuilder()
+        cb.ADD_ri(rd.value, rn.value, imm)
+        assert cb.hexdump() == assemble("ADD %r, %r, %d" % (rd, rn, imm))
+
+    @settings(max_examples=20)
+    @given(rd=st.sampled_from(r.registers),
+           rn=st.sampled_from(r.registers),
            ofs=st.integers(min_value=0, max_value=4095))
     def test_SUB_ri(self, rd, rn, ofs):
         cb = CodeBuilder()


More information about the pypy-commit mailing list