[pypy-svn] r74818 - pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86

jcreigh at codespeak.net jcreigh at codespeak.net
Thu May 27 17:22:37 CEST 2010


Author: jcreigh
Date: Thu May 27 17:22:35 2010
New Revision: 74818

Modified:
   pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/regloc.py
Log:
try to replace mess of if statements with unrolling_iterable

Modified: pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/regloc.py
==============================================================================
--- pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/regloc.py	(original)
+++ pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/regloc.py	Thu May 27 17:22:35 2010
@@ -1,5 +1,6 @@
 from pypy.jit.metainterp.history import AbstractValue, ConstInt
 from pypy.jit.backend.x86 import rx86
+from pypy.rlib.unroll import unrolling_iterable
 
 #
 # This module adds support for "locations", which can be either in a Const,
@@ -126,6 +127,7 @@
 eax, ecx, edx, ebx, esp, ebp, esi, edi = REGLOCS
 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 = XMMREGLOCS
 
+unrolling_possible_location_codes = unrolling_iterable(list("rbsmajix"))
 
 class LocationCodeBuilder(object):
     _mixin_ = True
@@ -134,163 +136,28 @@
         def INSN(self, loc1, loc2):
             code1 = loc1.location_code()
             code2 = loc2.location_code()
-            # XXX: All possible combinations are given, even those that are
-            # impossible
-            if code1 == 'r' and code2 == 'r':
-                getattr(self, name + "_rr")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'b':
-                getattr(self, name + "_rb")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 's':
-                getattr(self, name + "_rs")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'm':
-                getattr(self, name + "_rm")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'a':
-                getattr(self, name + "_ra")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'j':
-                getattr(self, name + "_rj")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'i':
-                getattr(self, name + "_ri")(loc1.value, loc2.value)
-            elif code1 == 'r' and code2 == 'x':
-                getattr(self, name + "_rx")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'r':
-                getattr(self, name + "_br")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'b':
-                getattr(self, name + "_bb")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 's':
-                getattr(self, name + "_bs")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'm':
-                getattr(self, name + "_bm")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'a':
-                getattr(self, name + "_ba")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'j':
-                getattr(self, name + "_bj")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'i':
-                getattr(self, name + "_bi")(loc1.value, loc2.value)
-            elif code1 == 'b' and code2 == 'x':
-                getattr(self, name + "_bx")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'r':
-                getattr(self, name + "_sr")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'b':
-                getattr(self, name + "_sb")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 's':
-                getattr(self, name + "_ss")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'm':
-                getattr(self, name + "_sm")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'a':
-                getattr(self, name + "_sa")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'j':
-                getattr(self, name + "_sj")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'i':
-                getattr(self, name + "_si")(loc1.value, loc2.value)
-            elif code1 == 's' and code2 == 'x':
-                getattr(self, name + "_sx")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'r':
-                getattr(self, name + "_mr")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'b':
-                getattr(self, name + "_mb")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 's':
-                getattr(self, name + "_ms")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'm':
-                getattr(self, name + "_mm")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'a':
-                getattr(self, name + "_ma")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'j':
-                getattr(self, name + "_mj")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'i':
-                getattr(self, name + "_mi")(loc1.value, loc2.value)
-            elif code1 == 'm' and code2 == 'x':
-                getattr(self, name + "_mx")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'r':
-                getattr(self, name + "_ar")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'b':
-                getattr(self, name + "_ab")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 's':
-                getattr(self, name + "_as")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'm':
-                getattr(self, name + "_am")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'a':
-                getattr(self, name + "_aa")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'j':
-                getattr(self, name + "_aj")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'i':
-                getattr(self, name + "_ai")(loc1.value, loc2.value)
-            elif code1 == 'a' and code2 == 'x':
-                getattr(self, name + "_ax")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'r':
-                getattr(self, name + "_jr")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'b':
-                getattr(self, name + "_jb")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 's':
-                getattr(self, name + "_js")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'm':
-                getattr(self, name + "_jm")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'a':
-                getattr(self, name + "_ja")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'j':
-                getattr(self, name + "_jj")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'i':
-                getattr(self, name + "_ji")(loc1.value, loc2.value)
-            elif code1 == 'j' and code2 == 'x':
-                getattr(self, name + "_jx")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'r':
-                getattr(self, name + "_ir")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'b':
-                getattr(self, name + "_ib")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 's':
-                getattr(self, name + "_is")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'm':
-                getattr(self, name + "_im")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'a':
-                getattr(self, name + "_ia")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'j':
-                getattr(self, name + "_ij")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'i':
-                getattr(self, name + "_ii")(loc1.value, loc2.value)
-            elif code1 == 'i' and code2 == 'x':
-                getattr(self, name + "_ix")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'r':
-                getattr(self, name + "_xr")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'b':
-                getattr(self, name + "_xb")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 's':
-                getattr(self, name + "_xs")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'm':
-                getattr(self, name + "_xm")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'a':
-                getattr(self, name + "_xa")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'j':
-                getattr(self, name + "_xj")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'i':
-                getattr(self, name + "_xi")(loc1.value, loc2.value)
-            elif code1 == 'x' and code2 == 'x':
-                getattr(self, name + "_xx")(loc1.value, loc2.value)
-            else:
-                raise AssertionError("Invalid location codes")
+            for possible_code1 in unrolling_possible_location_codes:
+                for possible_code2 in unrolling_possible_location_codes:
+                    if code1 == possible_code1 and code2 == possible_code2:
+                        methname = name + "_" + code1 + code2
+                        if hasattr(rx86.AbstractX86CodeBuilder, methname):
+                            getattr(self, methname)(loc1.value, loc2.value)
+                        else:
+                            raise AssertionError("Instruction not defined: " + methname)
 
         return INSN
 
     def _unaryop(name):
         def INSN(self, loc):
             code = loc.location_code()
-            # "if" is unrolled for RPython
-            if code == 'r':
-                getattr(self, name + '_r')(loc.value)
-            elif code == 'b':
-                getattr(self, name + '_b')(loc.value)
-            elif code == 's':
-                getattr(self, name + '_s')(loc.value)
-            elif code == 'm':
-                getattr(self, name + '_m')(loc.value)
-            elif code == 'a':
-                getattr(self, name + '_a')(loc.value)
-            elif code == 'j':
-                getattr(self, name + '_j')(loc.value)
-            elif code == 'i':
-                getattr(self, name + '_i')(loc.value)
-            elif code == 'x':
-                getattr(self, name + '_x')(loc.value)
-            else:
-                raise AssertionError("Unknown code")
+            for possible_code in unrolling_possible_location_codes:
+                if code == possible_code:
+                    methname = name + "_" + code
+                    if hasattr(rx86.AbstractX86CodeBuilder, methname):
+                        getattr(self, methname)(loc.value)
+                    else:
+                        raise AssertionError("Instruction not defined: " + methname)
+
         return INSN
 
     AND = _binaryop('AND')



More information about the Pypy-commit mailing list