[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