class FPSCRState(SelectableInt):
def __init__(self, value=0):
+ self.__do_update_computed_bits = False
SelectableInt.__init__(self, value, 64)
self.fsi = {}
offs = 0
fs = tuple(offs)
v = FieldSelectableInt(self, fs)
self.fsi[field] = v
+ self.__update_computed_bits()
+
+ @property
+ def value(self):
+ return self.__value
+
+ @value.setter
+ def value(self, value):
+ self.__value = value
+ if self.__do_update_computed_bits:
+ self.__update_computed_bits()
+
+ def __update_computed_bits(self):
+ self.__do_update_computed_bits = False
+ try:
+ # update summary bits -- FX is manually handled by pseudo-code,
+ # so we don't update it here
+ self.VX = (self.VXSNAN |
+ self.VXISI |
+ self.VXIDI |
+ self.VXZDZ |
+ self.VXIMZ |
+ self.VXVC |
+ self.VXSOFT |
+ self.VXSQRT |
+ self.VXCVI)
+ self.FEX = ((self.VX & self.VE) |
+ (self.OX & self.OE) |
+ (self.UX & self.UE) |
+ (self.ZX & self.ZE) |
+ (self.XX & self.XE))
+ finally:
+ self.__do_update_computed_bits = True
@property
def DRN(self):
expected = 0x3
self.assertEqual(FPSCR, expected)
self.assertEqual(FPSCR.VXCVI, 0)
+ self.assertEqual(FPSCR.VX, 0)
FPSCR.VXCVI = 1
self.assertEqual(FPSCR.VXCVI, 1)
+ self.assertEqual(FPSCR.VX, 1)
expected |= 1 << (64 - 55 - 1)
+ expected |= 1 << (64 - 34 - 1)
self.assertEqual(FPSCR, expected)
self.assertEqual(FPSCR.FX, 0)
FPSCR.FX = 1
self.assertEqual(FPSCR, expected)
self.assertEqual(FPSCR.FPRF, 0b10010)
self.assertEqual(FPSCR.FPCC, 0b0010)
+ self.assertEqual(FPSCR.VE, 0)
+ self.assertEqual(FPSCR.VX, 1)
+ self.assertEqual(FPSCR.FEX, 0)
+ FPSCR.VE = 1
+ self.assertEqual(FPSCR.VE, 1)
+ self.assertEqual(FPSCR.FEX, 1)
+ expected |= 1 << (64 - 56 - 1)
+ expected |= 1 << (64 - 33 - 1)
+ self.assertEqual(FPSCR, expected)
if __name__ == "__main__":