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
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):
"""
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):
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):
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