fix min-range rounding
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 7 Jul 2019 06:00:04 +0000 (07:00 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 7 Jul 2019 06:00:04 +0000 (07:00 +0100)
src/ieee754/fcvt/pipeline.py
src/ieee754/fpcommon/test/fpmux.py

index 787a4bbcd3db76766acd0622f6ab826747633b0a..378855a034f05d428cf14bc8412b2e2afbb7e3e4 100644 (file)
@@ -73,6 +73,10 @@ class FPCVTSpecialCasesMod(Elaboratable):
         z1 = self.o.z
         print ("z1", z1.width, z1.rmw, z1.e_width, z1.e_start, z1.e_end)
 
+        me = a1.rmw
+        ms = a1.rmw - self.o.z.rmw
+        print ("ms-me", ms, me)
+
         # intermediaries
         exp_sub_n126 = Signal((a1.e_width, True), reset_less=True)
         exp_gt127 = Signal(reset_less=True)
@@ -89,17 +93,17 @@ class FPCVTSpecialCasesMod(Elaboratable):
 
         # if a range outside z's min range (-126)
         with m.Elif(exp_sub_n126 < 0):
-            m.d.comb += self.o.of.guard.eq(a1.m[-self.o.z.rmw-2])
-            m.d.comb += self.o.of.round_bit.eq(a1.m[-self.o.z.rmw-3])
-            m.d.comb += self.o.of.sticky.eq(a1.m[:-self.o.z.rmw-1] != 0)
-            m.d.comb += self.o.of.m0.eq(self.o.z.m[0])
+            m.d.comb += self.o.of.guard.eq(a1.m[ms-1])
+            m.d.comb += self.o.of.round_bit.eq(a1.m[ms-2])
+            m.d.comb += self.o.of.sticky.eq(a1.m[:ms-2].bool())
+            m.d.comb += self.o.of.m0.eq(a1.m[ms]) # bit of a1
 
             m.d.comb += self.o.z.s.eq(a1.s)
             m.d.comb += self.o.z.e.eq(a1.e)
             m.d.comb += self.o.z.m.eq(a1.m[-self.o.z.rmw-1:])
             m.d.comb += self.o.z.m[-1].eq(1)
 
-        # if a is inf return inf 
+        # if a is inf return inf
         with m.Elif(a1.is_inf):
             m.d.comb += self.o.z.inf(a1.s)
             m.d.comb += self.o.out_do_z.eq(1)
@@ -117,13 +121,10 @@ class FPCVTSpecialCasesMod(Elaboratable):
 
         # ok after all that, anything else should fit fine (whew)
         with m.Else():
-            me = a1.rmw
-            ms = a1.rmw - self.o.z.rmw
-            print ("ms-me", ms, me)
             m.d.comb += self.o.of.guard.eq(a1.m[ms-1])
             m.d.comb += self.o.of.round_bit.eq(a1.m[ms-2])
             m.d.comb += self.o.of.sticky.eq(a1.m[:ms-2].bool())
-            m.d.comb += self.o.of.m0.eq(a1.m[ms]) # last bit of a1 NOT z
+            m.d.comb += self.o.of.m0.eq(a1.m[ms]) # bit of a1
 
             # XXX TODO: this is basically duplicating FPRoundMod. hmmm...
             print ("alen", a1.e_start, z1.fp.N126, N126)
index 76d52ddbfca2ef57e46eb67cecf3b8378ed33df8..30e86a364dd6be48a230459b6f3a872323c9e3f7 100644 (file)
@@ -137,6 +137,10 @@ class InputTestRandom(InputTest):
                     #op1 = 0xc27ff989
                     #op1 = 0x41689000
                     #op1 = 0xbbc0edec
+                    #op1 = 0x2EDBE6FF
+                    #op1 = 0x358637BD
+                    #op1 = 0x3340f2a7
+                    #op1 = 0x33D6BF95
                     vals.append((op1,))
                 else:
                     op1 = randint(0, (1<<width)-1)