Author: Maciej Fijalkowski <[email protected]>
Branch: arm64
Changeset: r96838:eaa56e09349e
Date: 2019-06-22 11:12 +0000
http://bitbucket.org/pypy/pypy/changeset/eaa56e09349e/

Log:    finish cond_call

diff --git a/rpython/jit/backend/aarch64/TODO b/rpython/jit/backend/aarch64/TODO
--- a/rpython/jit/backend/aarch64/TODO
+++ b/rpython/jit/backend/aarch64/TODO
@@ -1,4 +1,4 @@
 * int_add - IMM
 * int_cmp - IMM
 * guard_nonnull_class - think about a better way
-* cond_call and following guard_exception
\ No newline at end of file
+* cond_call and following guard_exception
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
@@ -793,7 +793,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())
+                if guard_op.is_guard(): # can be also cond_call
+                    regalloc.possibly_free_vars(guard_op.getfailargs())
                 regalloc.possibly_free_vars_for_op(guard_op)
             else:
                 arglocs = regalloc_operations[opnum](regalloc, op)
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
@@ -596,7 +596,7 @@
         self._write_barrier_fastpath(self.mc, op.getdescr(), arglocs,
                                      array=True)
 
-    def emit_op_cond_call(self, op, arglocs):
+    def _emit_op_cond_call(self, op, arglocs, fcond):
         #if len(arglocs) == 2:
         #    res_loc = arglocs[1]     # cond_call_value
         #else:
@@ -604,7 +604,8 @@
         # see x86.regalloc for why we skip res_loc in the gcmap
         res_loc = None
 
-        self.mc.CMP_ri(arglocs[0].value, 0)
+        if arglocs[0] is not None: # otherwise result already in CC
+            self.mc.CMP_ri(arglocs[0].value, 0)
 
         gcmap = self._regalloc.get_gcmap([res_loc])
 
@@ -637,7 +638,16 @@
         #
         self.pop_gcmap(self.mc)
         pmc = OverwritingBuilder(self.mc, jmp_adr, WORD)
-        pmc.B_ofs_cond(self.mc.currpos() - jmp_adr, c.EQ)
+        pmc.B_ofs_cond(self.mc.currpos() - jmp_adr, fcond)
+        # might be overridden again to skip over the following
+        # guard_no_exception too
+        self.previous_cond_call_jcond = jmp_adr, fcond
+
+    def emit_op_cond_call(self, op, arglocs):
+        self._emit_op_cond_call(op, arglocs, c.EQ)
+
+    def emit_guard_op_cond_call(self, op, fcond, arglocs):
+        self._emit_op_cond_call(op, arglocs, c.get_opposite_of(fcond))
 
     def _write_barrier_fastpath(self, mc, descr, arglocs, array=False, 
is_frame=False):
         # Write code equivalent to write_barrier() in the GC: it checks
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
@@ -674,7 +674,7 @@
             self._compute_hint_frame_locations_from_descr(descr)
         return []
 
-    def prepare_op_cond_call(self, op):
+    def _prepare_op_cond_call(self, op, res_in_cc):
         assert 2 <= op.numargs() <= 4 + 2
         v = op.getarg(1)
         assert isinstance(v, Const)
@@ -684,7 +684,10 @@
             arg = op.getarg(i)
             self.make_sure_var_in_reg(arg, args_so_far, selected_reg=reg)
             args_so_far.append(arg)
-        argloc = self.make_sure_var_in_reg(op.getarg(0), args_so_far)
+        if res_in_cc:
+            argloc = None
+        else:
+            argloc = self.make_sure_var_in_reg(op.getarg(0), args_so_far)
 
         if op.type == 'v':
             # a plain COND_CALL.  Calls the function when args[0] is
@@ -710,6 +713,13 @@
             self.assembler.guard_success_cc = c.EQ
             return [tmpreg, resloc]
 
+    def prepare_op_cond_call(self, op):
+        return self._prepare_op_cond_call(op, False)
+
+    def prepare_guard_op_cond_call(self, op, prevop):
+        fcond = self.assembler.dispatch_comparison(prevop)
+        locs = self._prepare_op_cond_call(op, True)
+        return locs, fcond
 
     def prepare_op_finish(self, op):
         # the frame is in fp, but we have to point where in the frame is
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to