% Author M.Ruckert sbit GREG 1<<63 the sign bit exceptions GREG 0 holds the exception bits xt xs xe xf round IS yt IS Y category, zero, denormal, normal, infinite, NaN ys ye yf zt zs IS $ ze zf round IS tmp IS Fsub GET zs,rZZ Floating point subtraction XOR zs,sbit Change sign of operand PUT zs,rZZ Fadd GET return,rJ GET ys,rYY Floating point addition GET zs,rZZ SLU ye,ys,1; SLU ze,zs,1 remove sign bit CMPU tmp,ye,ze \ul{\it A2.~Assume $e_y \ge e_z$} BNP tmp,1F SET tmp,ys; SET ys,zs; SET zs,tmp swap $y$ and $z$ PUT rZZ,zs PUSHJ yt,funpack \ul{\it A1.~Unpack.} GET zs,rZZ PUSHJ zt,funpack Add nonzero nubers and return SET xs,ys SET xe,ye SUB d,ye,ze \ul{\it A5.~Scale right.} CMP tmp,d,2 BP tmp,1F SRU zf,zf,d exact result JMP 2F 1H CMP tmp,d,53 tricky but OK BNP tmp,1F SET zf,1 JMP 2F 1H CMP tmp,ys,zs BZ tmp,1F SUB d,d,1 SUB xe,xe,1 SLU yf,yf,1 1H SET tmp,zf SRU zf,zf,d SLU tmp+1,zf,d CMPU tmp,tmp,tmp+1 CZSNZ tmp,tmp,1 this is different than MMIX-ARITH 49. OR zf,zf,1 2H CMP tmp,ys,yz \ul{\it A6.~Add.} BNZ tmp,subtract ADDU xf,yf,zf SRU tmp,xf,55 BP tmp,3F ADD xe,xe,1 SRU xf,xf,1 JMP 3F subtract SUBU xf,yf,zf SRU tmp,xf,55 BP tmp,3F ADD xe,xe,1 SRU xf,xf,1 JMP 1F ADD xe,xe,1 AND tmp,xf,1 sticky bit SRU xf,xf,1 OR xf,xf,tmp 1H SRU tmp,xf,54 BP tmp,3F SUB xe,xe,1 SLU xf,xf,1 JMP 1B 3H PUSHJ xt,fpack Done GET tmp,rXX OR tmp,tmp,exceptions PUT tmp,rXX PUT rJ,return POP 0,0 ready to \.{RESUME}