[pypy-commit] pypy vecopt: int expand 64 bit working
plan_rich
noreply at buildbot.pypy.org
Thu Jun 4 18:37:32 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77868:812b3caa438c
Date: 2015-06-04 18:37 +0200
http://bitbucket.org/pypy/pypy/changeset/812b3caa438c/
Log: int expand 64 bit working
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -196,6 +196,21 @@
assert int(result) == 7+1+8+1+11+2+12+2
self.check_vectorized(2, 2)
+ def define_int_expand():
+ return """
+ a = astype(|30|, int)
+ c = astype(|1|, int)
+ c[0] = 16
+ b = a + c
+ x1 = b -> 7
+ x2 = b -> 8
+ x1 + x2
+ """
+ def test_int_expand(self):
+ result = self.run("int_expand")
+ assert int(result) == 7+16+8+16
+ self.check_vectorized(2, 2)
+
def define_int32_add_const():
return """
a = astype(|30|, int32)
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -2638,8 +2638,13 @@
def genop_vec_int_expand(self, op, arglocs, resloc):
srcloc, sizeloc = arglocs
+ assert not srcloc.is_xmm
size = sizeloc.value
- raise NotImplementedError
+ if size == 8:
+ self.mc.PINSRQ_xri(resloc.value, srcloc.value, 0)
+ self.mc.PINSRQ_xri(resloc.value, srcloc.value, 1)
+ else:
+ raise NotImplementedError("missing size %d for int expand" % (size,))
def genop_vec_int_pack(self, op, arglocs, resloc):
resultloc, sourceloc, residxloc, srcidxloc, countloc, sizeloc = arglocs
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,20 +81,6 @@
rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[1] = y
return ConstFloatLoc(adr)
- def expand_int(self, var, const):
- assert isinstance(var, BoxVector)
- if var.getsize() == 4:
- loc = self.expand_single_float(const)
- else:
- loc = self.expand_double_float(const)
- adr = self.assembler.datablockwrapper.malloc_aligned(16, 16)
- x = c.getfloatstorage()
- y = longlong.ZEROF
- rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x
- rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[1] = y
- self.reg_bindings[var] = loc
- return loc
-
def expand_float(self, var, const):
assert isinstance(var, BoxVector)
if var.getsize() == 4:
@@ -1639,6 +1625,7 @@
arg = op.getarg(0)
if isinstance(arg, Const):
resloc = self.xrm.expand_float(op.result, arg)
+ # TODO consider this
return
args = op.getarglist()
resloc = self.xrm.force_result_in_reg(op.result, arg, args)
@@ -1649,13 +1636,14 @@
def consider_vec_int_expand(self, op):
arg = op.getarg(0)
if isinstance(arg, Const):
- resloc = self.xrm.expand_int(op.result, arg)
- return
- args = op.getarglist()
- resloc = self.xrm.force_result_in_reg(op.result, arg, args)
+ srcloc = self.rm.convert_to_imm(arg)
+ else:
+ args = op.getarglist()
+ srcloc = self.make_sure_var_in_reg(arg, args)
+ resloc = self.xrm.force_allocate_reg(op.result, args)
assert isinstance(op.result, BoxVector)
size = op.result.getsize()
- self.perform(op, [resloc, imm(size)], resloc)
+ self.perform(op, [srcloc, imm(size)], resloc)
def consider_vec_int_signext(self, op):
args = op.getarglist()
More information about the pypy-commit
mailing list