[pypy-commit] pypy arm64: more float ops
fijal
pypy.commits at gmail.com
Tue Jun 18 10:03:44 EDT 2019
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96821:aba1d6e3b06a
Date: 2019-06-18 14:02 +0000
http://bitbucket.org/pypy/pypy/changeset/aba1d6e3b06a/
Log: more float ops
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
@@ -187,6 +187,18 @@
base = 0b00011110011
self.write32((base << 21) | (rm << 16) | (0b000110 << 10) | (rn << 5) | rd)
+ def FCMP_dd(self, rn, rm):
+ base = 0b00011110011
+ self.write32((base << 21) | (rm << 16) | (0b001000 << 10) | (rn << 5))
+
+ def FNEG_d(self, rd, rn):
+ base = 0b0001111001100001010000
+ self.write32((base << 10) | (rn << 5) | rd)
+
+ def FABS_d(self, rd, rn):
+ base = 0b0001111001100000110000
+ self.write32((base << 10) | (rn << 5) | rd)
+
def SUB_rr(self, rd, rn, rm, s=0):
base = 0b11001011001 | (s << 8)
self.write32((base << 21) | (rm << 16) | (0b11 << 13) | (rn << 5) | (rd))
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
@@ -24,6 +24,14 @@
emit_op.__name__ = name
return emit_op
+def gen_float_comp_op(name, flag):
+ def emit_op(self, op, arglocs):
+ l0, l1, res = arglocs
+ self.emit_float_comp_op(op, l0, l1)
+ self.mc.CSET_r_flag(res.value, c.get_opposite_of(flag))
+ emit_op.__name__ = name
+ return emit_op
+
class ResOpAssembler(BaseAssembler):
def int_sub_impl(self, op, arglocs, flags=0):
l0, l1, res = arglocs
@@ -107,6 +115,9 @@
else:
self.mc.CMP_rr(l0.value, l1.value)
+ def emit_float_comp_op(self, op, l0, l1):
+ self.mc.FCMP_dd(l0.value, l1.value)
+
def emit_comp_op_int_lt(self, op, arglocs):
self.emit_int_comp_op(op, arglocs[0], arglocs[1])
return c.LT
@@ -227,6 +238,21 @@
arg1, arg2, res = arglocs
self.mc.FDIV_dd(res.value, arg1.value, arg2.value)
+ emit_op_float_lt = gen_float_comp_op('float_lt', c.VFP_LT)
+ emit_op_float_le = gen_float_comp_op('float_le', c.VFP_LE)
+ emit_op_float_eq = gen_float_comp_op('float_eq', c.EQ)
+ emit_op_float_ne = gen_float_comp_op('float_ne', c.NE)
+ emit_op_float_gt = gen_float_comp_op('float_gt', c.GT)
+ emit_op_float_ge = gen_float_comp_op('float_ge', c.GE)
+
+ def emit_op_float_neg(self, op, arglocs):
+ arg, res = arglocs
+ self.mc.FNEG_d(res.value, arg.value)
+
+ def emit_op_float_abs(self, op, arglocs):
+ arg, res = arglocs
+ self.mc.FABS_d(res.value, arg.value)
+
def emit_op_load_from_gc_table(self, op, arglocs):
res_loc, = arglocs
index = op.getarg(0).getint()
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
@@ -455,6 +455,16 @@
prepare_op_float_mul = prepare_two_regs_op
prepare_op_float_truediv = prepare_two_regs_op
+ prepare_op_float_lt = prepare_two_regs_op
+ prepare_op_float_le = prepare_two_regs_op
+ prepare_op_float_eq = prepare_two_regs_op
+ prepare_op_float_ne = prepare_two_regs_op
+ prepare_op_float_gt = prepare_two_regs_op
+ prepare_op_float_ge = prepare_two_regs_op
+
+ prepare_op_float_neg = prepare_unary
+ prepare_op_float_abs = prepare_unary
+
# --------------------------------- fields --------------------------
def prepare_op_gc_store(self, op):
More information about the pypy-commit
mailing list