[pypy-commit] pypy arm64: more float ops
fijal
pypy.commits at gmail.com
Tue Jun 18 11:14:20 EDT 2019
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: arm64
Changeset: r96823:8e29d4e40226
Date: 2019-06-18 15:13 +0000
http://bitbucket.org/pypy/pypy/changeset/8e29d4e40226/
Log: more float ops
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
@@ -890,9 +890,15 @@
elif loc.is_stack():
self.mc.LDR_ri(r.ip0.value, r.fp.value, loc.value)
self.mc.STR_ri(r.ip0.value, r.sp.value, pos)
+ elif loc.is_vfp_reg():
+ xxx
else:
assert False, "wrong loc"
+ def _mov_imm_float_to_loc(self, prev_loc, loc):
+ assert loc.is_vfp_reg()
+ self.load(loc, prev_loc)
+
def regalloc_mov(self, prev_loc, loc):
"""Moves a value from a previous location to some other location"""
if prev_loc.is_imm():
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
@@ -343,6 +343,13 @@
assert base_loc.is_core_reg()
if scale == 3:
# WORD size
+ if value_loc.is_float():
+ if ofs_loc.is_imm():
+ self.mc.STR_di(value_loc.value, base_loc.value,
+ ofs_loc.value)
+ else:
+ xxx
+ return
if ofs_loc.is_imm():
self.mc.STR_ri(value_loc.value, base_loc.value,
ofs_loc.value)
@@ -365,6 +372,12 @@
#
if scale == 3:
# WORD
+ if res_loc.is_float():
+ if ofs_loc.is_imm():
+ self.mc.LDR_di(res_loc.value, base_loc.value, ofs_loc.value)
+ else:
+ self.mc.LDR_dr(res_loc.value, base_loc.value, ofs_loc.value)
+ return
if ofs_loc.is_imm():
self.mc.LDR_ri(res_loc.value, base_loc.value, ofs_loc.value)
else:
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
@@ -97,6 +97,9 @@
rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x
return locations.ConstFloatLoc(adr)
+ def call_result_location(self, v):
+ return r.d0
+
def __init__(self, longevity, frame_manager=None, assembler=None):
RegisterManager.__init__(self, longevity, frame_manager, assembler)
diff --git a/rpython/jit/backend/aarch64/registers.py b/rpython/jit/backend/aarch64/registers.py
--- a/rpython/jit/backend/aarch64/registers.py
+++ b/rpython/jit/backend/aarch64/registers.py
@@ -23,6 +23,9 @@
callee_saved_registers = [] # x19, x20, x21, x22]
vfp_argument_regs = caller_vfp_resp = all_vfp_regs[:8]
+[d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14,
+ d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27,
+ d28, d29, d30, d31] = vfpregisters
argument_regs = [x0, x1, x2, x3, x4, x5, x6, x7]
caller_resp = argument_regs + [x8, x9, x10, x11, x12, x13, x14, x15]
More information about the pypy-commit
mailing list