[pypy-commit] pypy arm64: some progress

fijal pypy.commits at gmail.com
Wed May 15 08:59:40 EDT 2019


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96618:98c1f7b37259
Date: 2019-05-15 12:58 +0000
http://bitbucket.org/pypy/pypy/changeset/98c1f7b37259/

Log:	some progress

diff --git a/rpython/jit/backend/aarch64/assembler.py b/rpython/jit/backend/aarch64/assembler.py
--- a/rpython/jit/backend/aarch64/assembler.py
+++ b/rpython/jit/backend/aarch64/assembler.py
@@ -628,8 +628,10 @@
                 regalloc.possibly_free_vars_for_op(op)
             elif not we_are_translated() and op.getopnum() == rop.FORCE_SPILL:
                 regalloc.prepare_force_spill(op)
-            elif i < len(operations) - 1 and (regalloc.next_op_can_accept_cc(operations, i) or
-                                              operations[i].is_ovf()):
+            elif ((rop.returns_bool_result(opnum) or op.is_ovf()) and 
+                  i < len(operations) - 1 and
+                  regalloc.next_op_can_accept_cc(operations, i) or
+                                               operations[i].is_ovf()):
                 if operations[i].is_ovf():
                     assert operations[i + 1].getopnum() in [rop.GUARD_OVERFLOW,
                                                             rop.GUARD_NO_OVERFLOW]
@@ -639,6 +641,8 @@
                 if arglocs is not None:
                     asm_guard_operations[guard_num](self, guard_op, fcond, arglocs)
                 regalloc.next_instruction() # advance one more
+                regalloc.possibly_free_vars(guard_op.getfailargs())
+                regalloc.possibly_free_vars_for_op(guard_op)
             else:
                 arglocs = regalloc_operations[opnum](regalloc, op)
                 if arglocs is not None:
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
@@ -111,6 +111,14 @@
         self.emit_int_comp_op(op, arglocs[0], arglocs[1])
         return c.LE
 
+    def emit_comp_op_int_gt(self, op, arglocs):
+        self.emit_int_comp_op(op, arglocs[0], arglocs[1])
+        return c.GT
+
+    def emit_comp_op_int_ge(self, op, arglocs):
+        self.emit_int_comp_op(op, arglocs[0], arglocs[1])
+        return c.GE
+
     def emit_comp_op_int_eq(self, op, arglocs):
         self.emit_int_comp_op(op, arglocs[0], arglocs[1])
         return c.EQ
@@ -168,6 +176,11 @@
     emit_op_cast_ptr_to_int = _genop_same_as
     emit_op_cast_int_to_ptr = _genop_same_as
 
+    def emit_op_load_from_gc_table(self, op, arglocs):
+        res_loc, = arglocs
+        index = op.getarg(0).getint()
+        self.load_from_gc_table(res_loc.value, index)
+
     # -------------------------------- fields -------------------------------
 
     def emit_op_gc_store(self, op, arglocs):
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
@@ -207,6 +207,12 @@
         else:
             self.rm.possibly_free_var(var)
 
+    def force_spill_var(self, var):
+        if var.type == FLOAT:
+            self.vfprm.force_spill_var(var)
+        else:
+            self.rm.force_spill_var(var)
+
     def possibly_free_vars_for_op(self, op):
         for i in range(op.numargs()):
             var = op.getarg(i)
@@ -385,6 +391,8 @@
     prepare_comp_op_int_lt = prepare_int_cmp
     prepare_comp_op_int_le = prepare_int_cmp
     prepare_comp_op_int_eq = prepare_int_cmp
+    prepare_comp_op_int_ge = prepare_int_cmp
+    prepare_comp_op_int_gt = prepare_int_cmp
 
     def prepare_op_int_le(self, op):
         return self.prepare_int_cmp(op, False)
@@ -693,6 +701,10 @@
     prepare_op_same_as_r = _prepare_op_same_as
     prepare_op_same_as_f = _prepare_op_same_as
 
+    def prepare_op_load_from_gc_table(self, op):
+        resloc = self.force_allocate_reg(op)
+        return [resloc]
+
     def prepare_op_jump(self, op):
         assert self.jump_target_descr is None
         descr = op.getdescr()


More information about the pypy-commit mailing list