[pypy-svn] r79144 - pypy/branch/arm-backend/pypy/jit/backend/arm

david at codespeak.net david at codespeak.net
Tue Nov 16 13:42:38 CET 2010


Author: david
Date: Tue Nov 16 13:42:36 2010
New Revision: 79144

Modified:
   pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
Log:
(arigo, david) Fix calls from generated machine code to functions which return values smaller than a word by introducing a hack and masking the values correspondingly

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	Tue Nov 16 13:42:36 2010
@@ -16,6 +16,7 @@
 from pypy.jit.metainterp.history import ConstInt, BoxInt, BasicFailDescr
 from pypy.jit.metainterp.resoperation import rop
 from pypy.rlib import rgc
+from pypy.rlib.objectmodel import we_are_translated
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rpython.lltypesystem import lltype, rffi, rstr, llmemory
 
@@ -255,8 +256,19 @@
             regalloc.before_call(r.all_regs, save_all_regs)
         else:
             regalloc.before_call()
-        regalloc.force_allocate_reg(op.result, selected_reg=r.r0)
         self.mc.BL(adr)
+        #XXX Hack, Hack, Hack
+        if not we_are_translated():
+            descr = op.getdescr()
+            # XXX we need descr.get_result_sign here!!!!
+            size = descr.get_result_size(False)
+            # for now just check the size of the value
+            if size == 1: #unsigned char
+                self.mc.AND_ri(r.r0.value, r.r0.value, 255)
+            elif size == 2: # signed short
+                self.mc.LSL_ri(r.r0.value, r.r0.value, 16)
+                self.mc.ASR_ri(r.r0.value, r.r0.value, 16)
+
         regalloc.after_call(op.result)
         # readjust the sp in case we passed some args on the stack
         if op.numargs() > 5:



More information about the Pypy-commit mailing list