pywriter: support RANGE helper
authorDmitry Selyutin <dmitry.selyutin@3mdeb.com>
Wed, 25 Aug 2021 14:44:23 +0000 (14:44 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 29 Aug 2021 14:40:20 +0000 (15:40 +0100)
src/openpower/decoder/helpers.py
src/openpower/decoder/pseudo/parser.py
src/openpower/decoder/pseudo/pywriter.py

index 87b71d99780046a7643d9cd828779eb53e737bf4..09f2324a256d8feb37fb3360420245de13634104 100644 (file)
@@ -22,6 +22,16 @@ Links:
 """
 
 
+def RANGE(start, end):
+    if start > end:
+        # auto-subtract-one (sigh) due to python range
+        end -= 1
+    else:
+        # auto-add-one (sigh) due to python range
+        end += 1
+    return range(start, end)
+
+
 def exts(value, bits):
     sign = 1 << (bits - 1)
     return (value & (sign - 1)) - (value & sign)
index 72ce61e40ef280f193716fce93ee20f28981c9db..03d0fd5e6aca7128ecfa2d42d36be84e0ca0d353 100644 (file)
@@ -495,20 +495,12 @@ class PowerParser:
         p[0] = ast.Break()
 
     def p_for_stmt(self, p):
-        """for_stmt : FOR atom EQ test TO test COLON suite
-                    | DO atom EQ test TO test COLON suite
+        """for_stmt : FOR atom EQ comparison TO comparison COLON suite
+                    | DO atom EQ comparison TO comparison COLON suite
         """
         start = p[4]
         end = p[6]
-        if start.value > end.value:  # start greater than end, must go -ve
-            # auto-subtract-one (sigh) due to python range
-            end = ast.BinOp(p[6], ast.Add(), ast.Constant(-1))
-            arange = [start, end, ast.Constant(-1)]
-        else:
-            # auto-add-one (sigh) due to python range
-            end = ast.BinOp(p[6], ast.Add(), ast.Constant(1))
-            arange = [start, end]
-        it = ast.Call(ast.Name("range", ast.Load()), arange, [])
+        it = ast.Call(ast.Name("RANGE", ast.Load()), (start, end), [])
         p[0] = ast.For(p[2], it, p[8], [])
 
     def p_while_stmt(self, p):
index efca91c9094a0c473affb50f666901fc968d45a7..1387e89003914b7d58ee467e46b1dabede5abac6 100644 (file)
@@ -26,6 +26,7 @@ from openpower.decoder.helpers import (EXTS, EXTS64, EXTZ64, ROTL64, ROTL32,
                                  trunc_divs, trunc_rems, MULS, DIVS, MODS,
                                  EXTS128, undefined,
                                  bitrev, SHL64,
+                                 RANGE,
                                 )
 from openpower.decoder.selectable_int import SelectableInt
 from openpower.decoder.selectable_int import selectconcat as concat