[pypy-commit] pypy vecopt: constant expansion in trace now adds the constants to the heap memory (instead of crashing)
plan_rich
noreply at buildbot.pypy.org
Tue May 26 10:42:51 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77562:ab0e626b4c0c
Date: 2015-05-26 10:29 +0200
http://bitbucket.org/pypy/pypy/changeset/ab0e626b4c0c/
Log: constant expansion in trace now adds the constants to the heap
memory (instead of crashing)
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -81,6 +81,31 @@
rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[1] = y
return ConstFloatLoc(adr)
+ def expand_float(self, var, const):
+ assert isinstance(var, BoxVector)
+ if var.getsize() == 4:
+ loc = self.expand_single_float(const)
+ else:
+ loc = self.expand_double_float(const)
+ self.reg_bindings[var] = loc
+ return loc
+
+ def expand_double_float(self, f):
+ adr = self.assembler.datablockwrapper.malloc_aligned(16, 16)
+ fs = f.getfloatstorage()
+ rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = fs
+ rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[1] = fs
+ return ConstFloatLoc(adr)
+
+ def expand_single_float(self, f):
+ adr = self.assembler.datablockwrapper.malloc_aligned(16, 16)
+ fs = f.getfloatstorage()
+ rffi.cast(rffi.CArrayPtr(lltype.SingleFloat), adr)[0] = fs
+ rffi.cast(rffi.CArrayPtr(lltype.SingleFloat), adr)[1] = fs
+ rffi.cast(rffi.CArrayPtr(lltype.SingleFloat), adr)[2] = fs
+ rffi.cast(rffi.CArrayPtr(lltype.SingleFloat), adr)[3] = fs
+ return ConstFloatLoc(adr)
+
def call_result_location(self, v):
return xmm0
@@ -1513,7 +1538,7 @@
assert isinstance(lhs, BoxVector)
size = lhs.item_size
args = op.getarglist()
- loc1 = self.xrm.make_sure_var_in_reg(op.getarg(1), args)
+ loc1 = self.make_sure_var_in_reg(op.getarg(1), args)
loc0 = self.xrm.force_result_in_reg(op.result, op.getarg(0), args)
self.perform(op, [loc0, loc1, imm(size)], loc0)
@@ -1543,8 +1568,8 @@
assert isinstance(lhs, BoxVector)
size = lhs.item_size
args = op.getarglist()
+ loc1 = self.make_sure_var_in_reg(op.getarg(1), args)
loc0 = self.xrm.force_result_in_reg(op.result, op.getarg(0), args)
- loc1 = self.xrm.make_sure_var_in_reg(op.getarg(1), args)
self.perform(op, [loc0, loc1, imm(size)], loc0)
consider_vec_float_eq = consider_vec_logic
@@ -1595,11 +1620,14 @@
consider_vec_float_unpack = consider_vec_int_unpack
def consider_vec_float_expand(self, op):
+ arg = op.getarg(0)
+ if isinstance(arg, Const):
+ resloc = self.xrm.expand_float(op.result, arg)
+ return
args = op.getarglist()
- resloc = self.xrm.force_result_in_reg(op.result, op.getarg(0), args)
- vres = op.result
- assert isinstance(vres, BoxVector)
- size = vres.getsize()
+ resloc = self.xrm.force_result_in_reg(op.result, arg, args)
+ assert isinstance(op.result, BoxVector)
+ size = op.result.getsize()
self.perform(op, [resloc, imm(size)], resloc)
def consider_vec_int_signext(self, op):
More information about the pypy-commit
mailing list