[pypy-svn] r65654 - in pypy/branch/pyjitpl5-experiments/pypy/jit/backend: llvm test
arigo at codespeak.net
arigo at codespeak.net
Mon Jun 8 11:07:54 CEST 2009
Author: arigo
Date: Mon Jun 8 11:07:52 2009
New Revision: 65654
Modified:
pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py
pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py
Log:
Fields of type Char.
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py Mon Jun 8 11:07:52 2009
@@ -137,6 +137,10 @@
def _make_const_int(self, value):
return llvm_rffi.LLVMConstInt(self.ty_int, value, True)
+ def _make_const_char(self, value):
+ assert (value & ~255) == 0, "value is not in range(256)"
+ return llvm_rffi.LLVMConstInt(self.ty_char, value, True)
+
def _make_const_bit(self, value):
assert (value & ~1) == 0, "value is not 0 or 1"
return llvm_rffi.LLVMConstInt(self.ty_bit, value, True)
@@ -421,7 +425,7 @@
ty = llvm_rffi.LLVMTypeOf(value_ref)
if ty == self.cpu.ty_int:
return value_ref
- elif ty == self.cpu.ty_bit:
+ elif ty == self.cpu.ty_bit or ty == self.cpu.ty_char:
return llvm_rffi.LLVMBuildZExt(self.builder, value_ref,
self.cpu.ty_int, "")
else:
@@ -440,12 +444,34 @@
ty = llvm_rffi.LLVMTypeOf(value_ref)
if ty == self.cpu.ty_bit:
return value_ref
- elif ty == self.cpu.ty_int:
+ elif ty == self.cpu.ty_int or ty == self.cpu.ty_char:
return llvm_rffi.LLVMBuildTrunc(self.builder, value_ref,
self.cpu.ty_bit, "")
else:
raise AssertionError("type is not an int nor a bit")
+ def getchararg(self, v):
+ try:
+ value_ref = self.vars[v]
+ except KeyError:
+ assert isinstance(v, ConstInt)
+ return self.cpu._make_const_char(v.value)
+ else:
+ return self._cast_to_char(value_ref)
+
+ def _cast_to_char(self, value_ref):
+ ty = llvm_rffi.LLVMTypeOf(value_ref)
+ if ty == self.cpu.ty_char:
+ return value_ref
+ elif ty == self.cpu.ty_int:
+ return llvm_rffi.LLVMBuildTrunc(self.builder, value_ref,
+ self.cpu.ty_char, "")
+ elif ty == self.cpu.ty_bit:
+ return llvm_rffi.LLVMBuildZExt(self.builder, value_ref,
+ self.cpu.ty_char, "")
+ else:
+ raise AssertionError("type is not an int nor a bit")
+
def getptrarg(self, v):
try:
value_ref = self.vars[v]
@@ -454,7 +480,9 @@
self.cpu.ty_char_ptr_ptr)
else:
ty = llvm_rffi.LLVMTypeOf(value_ref)
- assert ty != self.cpu.ty_int and ty != self.cpu.ty_bit
+ assert (ty != self.cpu.ty_int and
+ ty != self.cpu.ty_bit and
+ ty != self.cpu.ty_char)
return value_ref
for _opname, _llvmname in [('INT_ADD', 'Add'),
@@ -620,7 +648,8 @@
self._generate_guard(op, equal, False)
def generate_GUARD_CLASS(self, op):
- loc = self._generate_field_gep(op.args[0], self.cpu.fielddescr_vtable)
+ loc, _ = self._generate_field_gep(op.args[0],
+ self.cpu.fielddescr_vtable)
cls = llvm_rffi.LLVMBuildLoad(self.builder, loc, "")
equal = llvm_rffi.LLVMBuildICmp(self.builder,
llvm_rffi.Predicate.EQ,
@@ -717,26 +746,32 @@
indices, 1, "")
lltype.free(indices, flavor='raw')
if fielddescr.size < 0: # pointer field
+ ty_val = self.cpu.ty_char_ptr
ty = self.cpu.ty_char_ptr_ptr
- else:
- assert fielddescr.size == symbolic.get_size(lltype.Signed, # XXX
- self.cpu.translate_support_code)
+ elif fielddescr.size == symbolic.get_size(lltype.Signed,
+ self.cpu.translate_support_code):
+ ty_val = self.cpu.ty_int
ty = self.cpu.ty_int_ptr
- return llvm_rffi.LLVMBuildBitCast(self.builder, location, ty, "")
+ elif fielddescr.size == 1:
+ ty_val = self.cpu.ty_char
+ ty = self.cpu.ty_char_ptr
+ else:
+ raise BadSizeError
+ location = llvm_rffi.LLVMBuildBitCast(self.builder, location, ty, "")
+ return location, ty_val
def generate_GETFIELD_GC(self, op):
- loc = self._generate_field_gep(op.args[0], op.descr)
- # XXX zero-extension for char fields
- self.vars[op.result] = llvm_rffi.LLVMBuildLoad(self.builder,
- loc, "")
+ loc, _ = self._generate_field_gep(op.args[0], op.descr)
+ self.vars[op.result] = llvm_rffi.LLVMBuildLoad(self.builder, loc, "")
def generate_SETFIELD_GC(self, op):
- loc = self._generate_field_gep(op.args[0], op.descr)
- if llvm_rffi.LLVMTypeOf(loc) == self.cpu.ty_char_ptr_ptr:
+ loc, tyval = self._generate_field_gep(op.args[0], op.descr)
+ if tyval == self.cpu.ty_char_ptr:
value_ref = self.getptrarg(op.args[1])
+ elif tyval == self.cpu.ty_char:
+ value_ref = self.getchararg(op.args[1])
else:
value_ref = self.getintarg(op.args[1])
- # XXX mask for char fields
llvm_rffi.LLVMBuildStore(self.builder, value_ref, loc, "")
def generate_CALL(self, op):
@@ -789,6 +824,9 @@
class MissingOperation(Exception):
pass
+class BadSizeError(Exception):
+ pass
+
all_operations = {}
for _key, _value in rop.__dict__.items():
if 'A' <= _key <= 'Z':
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py Mon Jun 8 11:07:52 2009
@@ -291,6 +291,19 @@
'int', descr=fielddescr)
assert res.value == 39082
#
+ fielddescr1 = self.cpu.fielddescrof(self.S, 'chr1')
+ fielddescr2 = self.cpu.fielddescrof(self.S, 'chr2')
+ self.execute_operation(rop.SETFIELD_GC, [t_box, BoxInt(250)],
+ 'void', descr=fielddescr2)
+ self.execute_operation(rop.SETFIELD_GC, [t_box, BoxInt(133)],
+ 'void', descr=fielddescr1)
+ res = self.execute_operation(rop.GETFIELD_GC, [t_box],
+ 'int', descr=fielddescr2)
+ assert res.value == 250
+ res = self.execute_operation(rop.GETFIELD_GC, [t_box],
+ 'int', descr=fielddescr1)
+ assert res.value == 133
+ #
u_box, U_box = self.alloc_instance(self.U)
fielddescr2 = self.cpu.fielddescrof(self.S, 'next')
res = self.execute_operation(rop.SETFIELD_GC, [t_box, u_box],
@@ -357,6 +370,8 @@
S = lltype.GcForwardReference()
S.become(lltype.GcStruct('S', ('parent', rclass.OBJECT),
('value', lltype.Signed),
+ ('chr1', lltype.Char),
+ ('chr2', lltype.Char),
('next', lltype.Ptr(S))))
T = lltype.GcStruct('T', ('parent', S),
('next', lltype.Ptr(S)))
@@ -418,7 +433,9 @@
def get_funcbox(cls, cpu, func_ptr):
return BoxObj(ootype.cast_to_object(func_ptr))
- S = ootype.Instance('S', ootype.ROOT, {'value': ootype.Signed})
+ S = ootype.Instance('S', ootype.ROOT, {'value': ootype.Signed,
+ 'chr1': ootype.Char,
+ 'chr2': ootype.Char})
S._add_fields({'next': S})
T = ootype.Instance('T', S)
U = ootype.Instance('U', T)
More information about the Pypy-commit
mailing list