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