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

david at codespeak.net david at codespeak.net
Thu Dec 9 13:43:59 CET 2010


Author: david
Date: Thu Dec  9 13:43:57 2010
New Revision: 79918

Modified:
   pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
Log:
(arigo, david) fix copying of unicode strings

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	Thu Dec  9 13:43:57 2010
@@ -741,8 +741,8 @@
             bytes_loc = regalloc.force_allocate_reg(bytes_box, forbidden_vars)
             scale = self._get_unicode_item_scale()
             assert length_loc.is_reg()
-            self.mc.MOV_rr(bytes_loc.value, length_loc.value)
-            self._load_address(length_loc, 0, scale, bytes_loc)
+            self.mc.MOV_ri(r.ip.value, 1<<scale)
+            self.mc.MUL(bytes_loc.value, r.ip.value, length_loc.value)
             length_box = bytes_box
             length_loc = bytes_loc
         # call memcpy()
@@ -753,19 +753,6 @@
         regalloc.possibly_free_var(dstaddr_box)
         regalloc.possibly_free_var(srcaddr_box)
 
-    def _load_address(self, sizereg, baseofs, scale, result, baseloc=None):
-        if baseloc is not None:
-            assert baseloc.is_reg()
-            self.mc.MOV_rr(result.value, baseloc.value)
-        else:
-            self.mc.MOV_ri(result.value, 0)
-        assert sizereg.is_reg()
-        if scale > 0:
-            self.mc.LSL_ri(r.ip.value, sizereg.value, scale)
-        else:
-            self.mc.MOV_rr(r.ip.value, sizereg.value)
-        self.mc.ADD_rr(result.value, result.value, r.ip.value)
-        self.mc.ADD_ri(result.value, result.value, baseofs)
 
     def _gen_address_inside_string(self, baseloc, ofsloc, resloc, is_unicode):
         cpu = self.cpu
@@ -778,7 +765,21 @@
                                                   self.cpu.translate_support_code)
             assert itemsize == 1
             scale = 0
-        self._load_address(ofsloc, ofs_items, scale, resloc, baseloc)
+        self._gen_address(ofsloc, ofs_items, scale, resloc, baseloc)
+
+    def _gen_address(self, sizereg, baseofs, scale, result, baseloc=None):
+        assert sizereg.is_reg()
+        if scale > 0:
+            scaled_loc = r.ip
+            self.mc.LSL_ri(r.ip.value, sizereg.value, scale)
+        else:
+            scaled_loc = sizereg
+        if baseloc is not None:
+            assert baseloc.is_reg()
+            self.mc.ADD_rr(result.value, baseloc.value, scaled_loc.value)
+            self.mc.ADD_ri(result.value, result.value, baseofs)
+        else:
+            self.mc.ADD_ri(result.value, scaled_loc.value, baseofs)
 
     def _get_unicode_item_scale(self):
         _, itemsize, _ = symbolic.get_array_token(rstr.UNICODE,



More information about the Pypy-commit mailing list