X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fopenpower%2Fdecoder%2Fhelpers.py;h=918a409eaf8e57762d7c67f692e6bd16d75dccba;hb=d3c7a0ddc169877e8daf38a347091c366e85624b;hp=6f451972cad194b82908b4bca2b37e7452bc969f;hpb=b024f03c258a7651893f485cc0b7e2d6e6f4c90f;p=openpower-isa.git diff --git a/src/openpower/decoder/helpers.py b/src/openpower/decoder/helpers.py index 6f451972..918a409e 100644 --- a/src/openpower/decoder/helpers.py +++ b/src/openpower/decoder/helpers.py @@ -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