[pypy-commit] pypy arm64: math sqrt

fijal pypy.commits at gmail.com
Tue Jun 25 07:13:32 EDT 2019


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96853:03ea4ff1aa71
Date: 2019-06-24 08:54 +0000
http://bitbucket.org/pypy/pypy/changeset/03ea4ff1aa71/

Log:	math sqrt

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
@@ -246,6 +246,10 @@
         base = 0b1001111001100010
         self.write32((base << 16) | (rn << 5) | rd)
 
+    def FSQRT_dd(self, rd, rn):
+        base = 0b0001111001100001110000
+        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
@@ -273,6 +273,10 @@
         arg, res = arglocs
         self.mc.INS_dr(res.value, arg.value)
 
+    def math_sqrt(self, op, arglocs):
+        arg, res = arglocs
+        self.mc.FSQRT_dd(res.value, arg.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)
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
@@ -485,6 +485,12 @@
     prepare_op_cast_float_to_int = prepare_unary
     prepare_op_cast_int_to_float = prepare_unary
 
+    def _prepare_op_math_sqrt(self, op):
+        loc1 = self.make_sure_var_in_reg(op.getarg(1))
+        self.possibly_free_vars_for_op(op)
+        res = self.force_allocate_reg(op)
+        return [loc1, res]
+
     prepare_op_convert_float_bytes_to_longlong = prepare_unary
     prepare_op_convert_longlong_bytes_to_float = prepare_unary
 
@@ -563,6 +569,7 @@
                             EffectInfo.OS_LLONG_AND,
                             EffectInfo.OS_LLONG_OR,
                             EffectInfo.OS_LLONG_XOR):
+                XXX
                 if self.cpu.cpuinfo.neon:
                     args = self._prepare_llong_binop_xx(op, fcond)
                     self.perform_extra(op, args, fcond)
@@ -572,8 +579,8 @@
                 self.perform_extra(op, args, fcond)
                 return
             elif oopspecindex == EffectInfo.OS_MATH_SQRT:
-                args = self._prepare_op_math_sqrt(op, fcond)
-                self.perform_extra(op, args, fcond)
+                args = self._prepare_op_math_sqrt(op)
+                self.assembler.math_sqrt(op, args)
                 return
             elif oopspecindex == EffectInfo.OS_THREADLOCALREF_GET:
                 args = self._prepare_threadlocalref_get(op, fcond)


More information about the pypy-commit mailing list