From e7c25def6f80b27983b1d4289198089a13c071c6 Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Thu, 25 Jul 2019 09:57:14 +0100 Subject: [PATCH] correct FPRSQRT specialcases --- src/ieee754/fpdiv/specialcases.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/ieee754/fpdiv/specialcases.py b/src/ieee754/fpdiv/specialcases.py index e99a0782..f8469c53 100644 --- a/src/ieee754/fpdiv/specialcases.py +++ b/src/ieee754/fpdiv/specialcases.py @@ -130,25 +130,26 @@ class FPDIVSpecialCasesMod(Elaboratable): with m.If(self.i.ctx.op == 2): # RSQRT - # if a is zero return NaN - with m.If(a1.is_zero): + # if a is NaN return canonical NaN + with m.If(a1.is_nan): m.d.comb += self.o.out_do_z.eq(1) m.d.comb += self.o.z.nan(0) - # -ve number is NaN + # if a is +/- zero return +/- INF + with m.Elif(a1.is_zero): + m.d.comb += self.o.out_do_z.eq(1) + # this includes the "weird" case 1/sqrt(-0) == -Inf + m.d.comb += self.o.z.inf(a1.s) + + # -ve number is canonical NaN with m.Elif(a1.s): m.d.comb += self.o.out_do_z.eq(1) m.d.comb += self.o.z.nan(0) - # if a is inf return zero + # if a is inf return zero (-ve already excluded, above) with m.Elif(a1.is_inf): m.d.comb += self.o.out_do_z.eq(1) - m.d.comb += self.o.z.zero(sabx) - - # if a is NaN return NaN - with m.Elif(a1.is_nan): - m.d.comb += self.o.out_do_z.eq(1) - m.d.comb += self.o.z.nan(0) + m.d.comb += self.o.z.zero(0) # Denormalised Number checks next, so pass a/b data through with m.Else(): -- 2.30.2