[pypy-commit] pypy arm64: in progress
fijal
pypy.commits at gmail.com
Wed Mar 6 10:05:17 EST 2019
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96220:d301852919b9
Date: 2019-03-06 15:04 +0000
http://bitbucket.org/pypy/pypy/changeset/d301852919b9/
Log: in progress
diff --git a/rpython/jit/backend/aarch64/codebuilder.py b/rpython/jit/backend/aarch64/codebuilder.py
--- a/rpython/jit/backend/aarch64/codebuilder.py
+++ b/rpython/jit/backend/aarch64/codebuilder.py
@@ -114,6 +114,11 @@
base = 0b11101011000
self.write32((base << 21) | (rm << 16) | (rn << 5) | 0b11111)
+ def CMP_ri(self, rn, imm):
+ base = 0b1111000100
+ assert 0 <= imm <= 4095
+ self.write32((base << 22) | (imm << 10) | (rn << 5) | 0b11111)
+
def B_ofs(self, ofs):
base = 0b000101
assert ofs & 0x3 == 0
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
@@ -110,6 +110,20 @@
def emit_guard_op_guard_true(self, guard_op, fcond, arglocs):
self._emit_guard(guard_op, fcond, arglocs)
+ def emit_guard_op_guard_false(self, guard_op, fcond, arglocs):
+ self._emit_guard(guard_op, c.get_opposite_of(fcond), arglocs)
+
+ def load_condition_into_cc(self, loc):
+ if not loc.is_core_reg():
+ assert loc.is_stack()
+ self.regalloc_mov(loc, r.ip0)
+ loc = r.ip0
+ self.mc.CMP_ri(loc.value, 0)
+
+ def emit_op_guard_false(self, op, arglocs):
+ self.load_condition_into_cc(arglocs[1])
+ self._emit_guard(op, c.NE, arglocs)
+
def emit_op_label(self, op, arglocs):
pass
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
@@ -392,17 +392,25 @@
locs = []
return locs
- def prepare_guard_op_guard_true(self, op, prevop):
+ def guard_impl(self, op, prevop):
fcond = self.assembler.dispatch_comparison(prevop)
# result is in CC
+ return self._guard_impl(op), fcond
+ def _guard_impl(self, op):
arglocs = [None] * (len(op.getfailargs()) + 1)
arglocs[0] = imm(self.frame_manager.get_frame_depth())
failargs = op.getfailargs()
for i in range(len(failargs)):
if failargs[i]:
arglocs[i + 1] = self.loc(failargs[i])
- return arglocs, fcond
+ return arglocs
+
+ prepare_guard_op_guard_true = guard_impl
+ prepare_guard_op_guard_false = guard_impl
+
+ prepare_op_guard_true = _guard_impl
+ prepare_op_guard_false = _guard_impl
prepare_op_nursery_ptr_increment = prepare_op_int_add
More information about the pypy-commit
mailing list