IF PhA
THEN {
Active used for Assertions only
active: BOOL ← FPCSLoadBA=load OR FPCSUAluBA=unload OR FPCSUMultBA=unload;
Dragon.Assert[NOT (rejectBA AND active)]; -- IPipe should insure this
Dragon.Assert[
NOT Dragon.MoreThanOneOf[
FPCSLoadBA=load OR FPCSUAluBA=unload OR FPCSUMultBA=unload,
cAddrBA = DragonIFU.PRtoByte[fpMaskFlags],
Lev0BaddrBA = DragonIFU.PRtoByte[fpMaskFlags],
Lev0BaddrBA = DragonIFU.PRtoByte[fpMode] ] ];
csUnload0AB ← FPCSUAluBA=unload OR FPCSUMultBA=unload;
csUnload1AB ← csUnload1BA;
functionAB ←
IF FPCSLoadBA=load
THEN DragonFP.ExtractFunction[KBus]
ELSE 0;
IF Lev0BaddrBA
= DragonIFU.PRtoByte[fpMaskFlags]
THEN {
Dragon.Assert[NOT active];
KBus ← BitOps.ICID[maskBA, [0, 0], 32, 0, 16];
KBus ← BitOps.ICID[flagsBA, KBus, 32, 16, 16] };
IF Lev0BaddrBA
= DragonIFU.PRtoByte[fpMode]
THEN {
Dragon.Assert[NOT active];
KBus ← BitOps.ICID[LOOPHOLE[modeBA], [0, 0], 32, 16, 16]};
IF cAddrBA = DragonIFU.PRtoByte[fpMaskFlags]
THEN {
Dragon.Assert[NOT active];
maskAB ← BitOps.ECFD[KBus,32,0,16];
flagsAB ← BitOps.ECFD[KBus,32,16,16]}
ELSE {
maskAB ← maskBA;
flagsAB ← flagsBA};
flagsAB ←
IF csUnload2BA
THEN BitOps.IBIW[TRUE, BitOps.ICIW[0, flagsBA, 16, 0, 3], 16, LOOPHOLE[statusBA]]
ELSE flagsBA };
IF PhB
THEN {
maskBA ← maskAB;
flagsBA ← flagsAB;
modeBA ←
IF (functionAB / 64) = 3
THEN DragonFP.SetMode[modeAB, functionAB]
ELSE modeAB;
csUnload1BA ← csUnload0AB;
csUnload2BA ← csUnload1AB;
IF csUnload1AB
THEN {
statusBA ← FPStatusB;
IF
NOT BitOps.
EBFW[maskAB, 16,
LOOPHOLE[FPStatusB]]
THEN {EPFaultB𡤏PFault; EPRejectB←TRUE}
ELSE {EPFaultB←None; EPRejectB←FALSE} };
cAddrBA ← BitOps.ECFD[KBus, 32, 16, 8];
rejectBA ← EPRejectB };