[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