[pypy-svn] pypy arm-backed-float: add float support for (get/set)field and (get/set)arrayitem operations
bivab
commits-noreply at bitbucket.org
Fri Apr 1 16:05:10 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backed-float
Changeset: r43085:1fc6793fb908
Date: 2011-04-01 14:06 +0200
http://bitbucket.org/pypy/pypy/changeset/1fc6793fb908/
Log: add float support for (get/set)field and (get/set)arrayitem
operations
diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -394,7 +394,14 @@
def emit_op_setfield_gc(self, op, arglocs, regalloc, fcond):
value_loc, base_loc, ofs, size = arglocs
- if size.value == 4:
+ if size.value == 8:
+ assert value_loc.is_vfp_reg()
+ if ofs.is_reg():
+ base_loc = r.ip
+ ofs = imm(0)
+ self.mc.ADD_rr(r.ip.value, base_loc.value, ofs.value)
+ self.mc.VSTR(value_loc.value, base_loc.value, ofs.value)
+ elif size.value == 4:
if ofs.is_imm():
self.mc.STR_ri(value_loc.value, base_loc.value, ofs.value)
else:
@@ -417,7 +424,14 @@
def emit_op_getfield_gc(self, op, arglocs, regalloc, fcond):
base_loc, ofs, res, size = arglocs
- if size.value == 4:
+ if size.value == 8:
+ assert res.is_vfp_reg()
+ if ofs.is_reg():
+ base_loc = r.ip
+ ofs = imm(0)
+ self.mc.ADD_rr(r.ip.value, base_loc.value, ofs.value)
+ self.mc.VLDR(res.value, base_loc.value, ofs.value)
+ elif size.value == 4:
if ofs.is_imm():
self.mc.LDR_ri(res.value, base_loc.value, ofs.value)
else:
@@ -470,7 +484,10 @@
self.mc.ADD_ri(r.ip.value, scale_loc.value, ofs.value)
scale_loc = r.ip
- if scale.value == 2:
+ if scale.value == 4:
+ assert value_loc.is_vfp_reg()
+ self.mc.VSTR(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
+ elif scale.value == 2:
self.mc.STR_rr(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
elif scale.value == 1:
self.mc.STRH_rr(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
@@ -493,7 +510,10 @@
self.mc.ADD_ri(r.ip.value, scale_loc.value, imm=ofs.value)
scale_loc = r.ip
- if scale.value == 2:
+ if scale.value == 4:
+ assert res.is_vfp_reg()
+ self.mc.VLDR(res.value, base_loc.value, scale_loc.value, cond=fcond)
+ elif scale.value == 2:
self.mc.LDR_rr(res.value, base_loc.value, scale_loc.value, cond=fcond)
elif scale.value == 1:
self.mc.LDRH_rr(res.value, base_loc.value, scale_loc.value, cond=fcond)
More information about the Pypy-commit
mailing list