reenable tests
[openpower-isa.git] / src / openpower / decoder / helpers.py
index 6f451972cad194b82908b4bca2b37e7452bc969f..918a409eaf8e57762d7c67f692e6bd16d75dccba 100644 (file)
@@ -3,12 +3,18 @@ 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 operator import floordiv, mod, truediv  # truediv used by bfp_* functions
 from openpower.decoder.selectable_int import selectltu as ltu
 from openpower.decoder.selectable_int import selectgtu as gtu
 from openpower.decoder.selectable_int import check_extsign
 from openpower.fpscr import FPSCRState
+from openpower.xer import XERState
+from openpower.decoder.isa.svshape import SVSHAPE
+from openpower.decoder.isa.svstate import SVP64State
+from openpower.decoder.fp_working_format import (
+    BFPState, SelectableMSB0Fraction)
 
 from openpower.util import log
 import math
@@ -40,19 +46,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):
@@ -84,8 +90,20 @@ def copy_assign_rhs(inp):
     """
     if isinstance(inp, (str, int)):
         return inp
+    if isinstance(inp, FPSCRState):
+        return FPSCRState(inp)
+    if isinstance(inp, XERState):
+        return XERState(inp)
+    if isinstance(inp, SVSHAPE):
+        return SVSHAPE(inp)
+    if isinstance(inp, SVP64State):
+        return SVP64State(inp)
     if isinstance(inp, (SelectableInt, FieldSelectableInt)):
         return SelectableInt(inp)
+    if isinstance(inp, BFPState):
+        return BFPState(inp)
+    if isinstance(inp, SelectableMSB0Fraction):
+        return SelectableMSB0Fraction(inp)
     if isinstance(inp, tuple):
         return tuple(map(copy_assign_rhs, inp))
     if isinstance(inp, dict):
@@ -253,10 +271,6 @@ def _maxmag(a, b):
 
 
 class ISAFPHelpers:
-
-    # XXX stub
-    def reset_xflags(self): pass
-
     # bfp32/64_OP naming mirrors that in the Power ISA spec.
 
     def bfp64_ATAN2PI(self, a, b):
@@ -840,6 +854,53 @@ def log2(val):
     return retval
 
 
+# BFP classification predicates
+# these need to be implemented in python because they work with multiple
+# input types
+def IsInf(v):
+    if isinstance(v, BFPState):
+        return onebit(v.class_.Infinity)
+    # TODO: implement for SelectableInt/int
+    raise NotImplementedError("not yet implemented for non-BFPState values")
+
+
+def IsNaN(v):
+    if isinstance(v, BFPState):
+        return onebit(v.class_.SNaN or v.class_.QNaN)
+    # TODO: implement for SelectableInt/int
+    raise NotImplementedError("not yet implemented for non-BFPState values")
+
+
+def IsNeg(v):
+    if isinstance(v, BFPState):
+        if v.class_.SNaN or v.class_.QNaN or v.class_.Zero:
+            return onebit(0)
+        return onebit(v.sign)
+    # TODO: implement for SelectableInt/int
+    raise NotImplementedError("not yet implemented for non-BFPState values")
+
+
+def IsSNaN(v):
+    if isinstance(v, BFPState):
+        return onebit(v.class_.SNaN)
+    # TODO: implement for SelectableInt/int
+    raise NotImplementedError("not yet implemented for non-BFPState values")
+
+
+def IsZero(v):
+    if isinstance(v, BFPState):
+        return onebit(v.class_.Zero)
+    # TODO: implement for SelectableInt/int
+    raise NotImplementedError("not yet implemented for non-BFPState values")
+
+
+def SetFX(fpscr, field):
+    assert isinstance(fpscr, FPSCRState), "SetFX only works on FPSCR fields"
+    if eq(getattr(fpscr, field), SelectableInt(0, 1)):
+        setattr(fpscr, field, SelectableInt(1, 1))
+        fpscr.FX = SelectableInt(1, 1)
+
+
 class ISACallerHelper:
     def __init__(self, XLEN, FPSCR):
         self.__XLEN = XLEN