extend previous hard-coded magic constant (256) used to indicate
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 10 May 2023 11:33:26 +0000 (12:33 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 2 Jun 2023 18:51:18 +0000 (19:51 +0100)
"effectively unlimited" (see check_extsign) out to 1024. it would be
better to set this at the bare-minimum limit (257, 258) as it requests
that python runtime create massive-large ints

src/openpower/decoder/helpers.py
src/openpower/decoder/isa/caller.py
src/openpower/decoder/selectable_int.py

index 9211e5ab34ed88ece16e7e772176f62d2ef49868..0bdd4f29984c23399118af5bcab4232be65a6b1a 100644 (file)
@@ -3,6 +3,7 @@ import struct
 import sys
 from openpower.decoder.selectable_int import (SelectableInt, onebit,
                                               selectconcat, FieldSelectableInt)
+from openpower.decoder.selectable_int import EFFECTIVELY_UNLIMITED as EU
 from nmutil.divmod import trunc_divs, trunc_rems
 from operator import floordiv, mod
 from openpower.decoder.selectable_int import selectltu as ltu
@@ -39,19 +40,19 @@ def exts(value, bits):
 
 
 def EXTS(value):
-    """ extends sign bit out from current MSB to all 256 bits
+    """ extends sign bit out from current MSB to MAX limit bits
     """
     log("EXTS", value, type(value))
     assert isinstance(value, SelectableInt)
-    return SelectableInt(exts(value.value, value.bits) & ((1 << 256)-1), 256)
+    return SelectableInt(exts(value.value, value.bits) & ((1 << EU)-1), EU)
 
 
 def EXTZ(value):
-    """ zero extend to 256 bits
+    """ zero extend to EFFECTIVELY_UNLIMITED bits
     """
     if isinstance(value, SelectableInt):
         value = value.value
-    return SelectableInt(value & ((1 << 256) - 1), 256)
+    return SelectableInt(value & ((1 << EU) - 1), EU)
 
 
 def EXTS64(value):
index a4c26965f13fd82ab9130c9b90afe59a0a5e3d24..f0c43bc10212169fe1b03d8a5f6c7140be935df7 100644 (file)
@@ -37,7 +37,8 @@ from openpower.decoder.power_enums import (FPTRANS_INSNS, CRInSel, CROutSel,
 from openpower.decoder.power_insn import SVP64Instruction
 from openpower.decoder.power_svp64 import SVP64RM, decode_extra
 from openpower.decoder.selectable_int import (FieldSelectableInt,
-                                              SelectableInt, selectconcat)
+                                              SelectableInt, selectconcat,
+                                              EFFECTIVELY_UNLIMITED)
 from openpower.fpscr import FPSCRState
 from openpower.util import LogKind, log
 
@@ -1226,7 +1227,7 @@ class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
         self.cr_backup = 0  # sigh, dreadful hack: for fail-first (VLi)
 
         # "undefined", just set to variable-bit-width int (use exts "max")
-        # self.undefined = SelectableInt(0, 256)  # TODO, not hard-code 256!
+        # self.undefined = SelectableInt(0, EFFECTIVELY_UNLIMITED)
 
         self.namespace = {}
         self.namespace.update(self.spr)
@@ -2402,7 +2403,7 @@ class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
         if name == 'CR0':  # ignore, done already (above)
             return
         if isinstance(output, int):
-            output = SelectableInt(output, 256)
+            output = SelectableInt(output, EFFECTIVELY_UNLIMITED)
         # write carry flafs
         if name in ['CA', 'CA32']:
             if carry_en:
@@ -2439,7 +2440,7 @@ class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
         # check zeroing due to predicate bit being zero
         if self.is_svp64_mode and self.pred_dst_zero:
             log('zeroing reg %s %s' % (str(regnum), str(output)), is_vec)
-            output = SelectableInt(0, 256)
+            output = SelectableInt(0, EFFECTIVELY_UNLIMITED)
         log("write reg %s%s 0x%x ew %d" % (reg_prefix, str(regnum),
                                            output.value, ew_dst),
             kind=LogKind.InstrInOuts)
index ee50e08142ee6313c4331f5a8b3a2d427c67bc7d..ee8ef7e354a36e3638c1a015af44cfe90f6cbda7 100644 (file)
@@ -7,13 +7,14 @@ from operator import (add, sub, mul, floordiv, truediv, mod, or_, and_, xor,
                       neg, inv, lshift, rshift, lt, eq)
 from openpower.util import log
 
+EFFECTIVELY_UNLIMITED = 1024
 
 def check_extsign(a, b):
     if isinstance(b, FieldSelectableInt):
         b = b.get_range()
     if isinstance(b, int):
         return SelectableInt(b, a.bits)
-    if b.bits != 256:
+    if b.bits != EFFECTIVELY_UNLIMITED:
         return b
     return SelectableInt(b.value, a.bits)
 
@@ -312,7 +313,7 @@ class SelectableInt:
     def __rsub__(self, b):
         log("rsub", b, self.value)
         if isinstance(b, int):
-            b = SelectableInt(b, 256) # max extent
+            b = SelectableInt(b, EFFECTIVELY_UNLIMITED) # max extent
         #b = check_extsign(self, b)
         #assert b.bits == self.bits
         return SelectableInt(b.value - self.value, b.bits)