[pypy-svn] r14294 - in pypy/dist/pypy/translator/llvm2: . test
hpk at codespeak.net
hpk at codespeak.net
Tue Jul 5 16:30:58 CEST 2005
Author: hpk
Date: Tue Jul 5 16:30:51 2005
New Revision: 14294
Modified:
pypy/dist/pypy/translator/llvm2/database.py
pypy/dist/pypy/translator/llvm2/funcnode.py
pypy/dist/pypy/translator/llvm2/structnode.py
pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
pypy/dist/pypy/translator/llvm2/varsize.py
Log:
(hpk, rxe)
moving and refactoring towards varsize structs
it still doesn't work quite yet.
Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py (original)
+++ pypy/dist/pypy/translator/llvm2/database.py Tue Jul 5 16:30:51 2005
@@ -152,6 +152,10 @@
def repr_arg(self, arg):
if (isinstance(arg, Constant) and
isinstance(arg.concretetype, lltype.Primitive)):
+
+ # XXX generalize and test this
+ if isinstance(arg.value, str) and len(arg.value) == 1:
+ return str(ord(arg.value))
return str(arg.value).lower() #False --> false
elif isinstance(arg, Variable):
return "%" + str(arg)
Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py (original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py Tue Jul 5 16:30:51 2005
@@ -194,6 +194,15 @@
assert meth is not None, "operation %r not found" %(op.opname,)
meth(op)
+ def int_neg(self, op):
+ self.codewriter.binaryop("sub",
+ self.db.repr_arg(op.result),
+ self.db.repr_arg_type(op.args[0]),
+ "0",
+ self.db.repr_arg(op.args[0]),
+ )
+
+
def binaryop(self, op):
name = self.binary_operations[op.opname]
assert len(op.args) == 2
@@ -213,6 +222,7 @@
cast_bool_to_int = cast_primitive
cast_bool_to_uint = uint_is_true = cast_primitive
+ cast_int_to_char = cast_char_to_int = cast_primitive
def int_is_true(self, op):
self.codewriter.binaryop("setne",
@@ -324,6 +334,7 @@
valuevar = self.db.repr_arg(op.args[2])
valuetype = self.db.repr_arg_type(op.args[2])
+ assert valuevar.strip() != '-'
self.codewriter.store(valuetype, valuevar, tmpvar)
def getarraysize(self, op):
Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py (original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py Tue Jul 5 16:30:51 2005
@@ -2,6 +2,7 @@
from pypy.objspace.flow.model import Block, Constant, Variable, Link
from pypy.translator.llvm2.log import log
from pypy.translator.llvm2.node import LLVMNode
+from pypy.translator.llvm2 import varsize
from pypy.rpython import lltype
import itertools
@@ -56,38 +57,19 @@
from pypy.translator.llvm2.atomic import is_atomic
log.writeimpl(self.ref)
- codewriter.openfunc(self.constructor_ref)
- codewriter.label("block0")
+
+ # build up a list of indices to get to the last
+ # var-sized struct (or rather the according array)
indices_to_array = [("int", 0)]
s = self.struct
while isinstance(s, lltype.Struct):
last_pos = len(s._names_without_voids()) - 1
indices_to_array.append(("uint", last_pos))
s = s._flds[s._names_without_voids()[-1]]
-
arraytype = self.db.repr_arg_type(s)
-
- # Into array and length
- indices = indices_to_array + [("uint", 1), ("int", "%len")]
- codewriter.getelementptr("%size", self.ref + "*",
- "null", *indices)
-
- #XXX is this ok for 64bit?
- codewriter.cast("%sizeu", arraytype + "*", "%size", "uint")
- codewriter.malloc("%resulttmp", "sbyte", "%sizeu", atomic=is_atomic(self))
- codewriter.cast("%result", "sbyte*", "%resulttmp", self.ref + "*")
-
- # remember the allocated length for later use.
- indices = indices_to_array + [("uint", 0)]
- codewriter.getelementptr("%size_ptr", self.ref + "*",
- "%result", *indices)
-
- codewriter.cast("%signedsize", "uint", "%sizeu", "int")
- codewriter.store("int", "%signedsize", "%size_ptr")
-
- codewriter.ret(self.ref + "*", "%result")
- codewriter.closefunc()
-
+ varsize.write_constructor(codewriter,
+ self.ref, self.constructor_decl, arraytype,
+ indices_to_array)
def cast_global(toptr, from_, name):
s = "cast(%s* getelementptr (%s* %s, int 0) to %s)" % (from_,
Modified: pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/test/test_genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm2/test/test_genllvm.py Tue Jul 5 16:30:51 2005
@@ -12,7 +12,7 @@
from pypy.rpython.rtyper import RPythonTyper
from pypy.rpython.rarithmetic import r_uint
-py.log.setconsumer("genllvm", py.log.STDOUT)
+#py.log.setconsumer("genllvm", py.log.STDOUT)
py.log.setconsumer("genllvm database prepare", None)
@@ -316,7 +316,7 @@
def xtest_string_simple():
def string_simple(i):
- return str(i)
+ return ord(str(i))
f = compile_function(string_simple, [int], view=False)
assert f(0)
Modified: pypy/dist/pypy/translator/llvm2/varsize.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/varsize.py (original)
+++ pypy/dist/pypy/translator/llvm2/varsize.py Tue Jul 5 16:30:51 2005
@@ -29,11 +29,12 @@
codewriter.cast("%usize", elemtype + "*", "%size", "uint")
codewriter.malloc("%ptr", "sbyte", "%usize", atomic=atomicmalloc)
codewriter.cast("%result", "sbyte*", "%ptr", ref + "*")
-
+
+ indices_to_array = tuple(indices_to_array) + (("uint", 0),)
# the following accesses the length field of the array
codewriter.getelementptr("%arraylength", ref + "*",
"%result",
- indices_to_array + ("uint", 0))
+ *indices_to_array)
codewriter.store("int", "%len", "%arraylength")
codewriter.ret(ref + "*", "%result")
codewriter.closefunc()
More information about the Pypy-commit
mailing list