From 881ab2f6819de95b125d0ac101698cdc1b6c86cb Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Sat, 6 Jul 2019 12:15:01 +0100 Subject: [PATCH] duplicate FPRound inside fcvt --- src/ieee754/fcvt/pipeline.py | 10 ++++++++-- src/ieee754/fpcommon/test/fpmux.py | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ieee754/fcvt/pipeline.py b/src/ieee754/fcvt/pipeline.py index 632a51c7..129f4de8 100644 --- a/src/ieee754/fcvt/pipeline.py +++ b/src/ieee754/fcvt/pipeline.py @@ -85,7 +85,7 @@ class FPCVTSpecialCasesMod(Elaboratable): # overflow 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-3] != 0) + 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]) # if a zero, return zero (signed) @@ -118,10 +118,16 @@ class FPCVTSpecialCasesMod(Elaboratable): # ok after all that, anything else should fit fine (whew) with m.Else(): + # XXX TODO: this is basically duplicating FPRoundMod. hmmm... print ("alen", a1.e_start, z1.fp.N126, N126) print ("m1", self.o.z.rmw, a1.m[-self.o.z.rmw-1:]) + mo = Signal(self.o.z.m_width-1) + m.d.comb += mo.eq(a1.m[-self.o.z.rmw-1:]) with m.If(self.o.of.roundz): - m.d.comb += self.o.z.create(a1.s, a1.e, a1.m[-self.o.z.rmw-1:]+1) + with m.If((~mo == 0)): # all 1s + m.d.comb += self.o.z.create(a1.s, a1.e+1, mo+1) + with m.Else(): + m.d.comb += self.o.z.create(a1.s, a1.e, mo+1) with m.Else(): m.d.comb += self.o.z.create(a1.s, a1.e, a1.m[-self.o.z.rmw-1:]) m.d.comb += self.o.out_do_z.eq(1) diff --git a/src/ieee754/fpcommon/test/fpmux.py b/src/ieee754/fpcommon/test/fpmux.py index c8869dcf..c604de56 100644 --- a/src/ieee754/fpcommon/test/fpmux.py +++ b/src/ieee754/fpcommon/test/fpmux.py @@ -131,8 +131,10 @@ class InputTestRandom(InputTest): #op1 = 0x889cd8c #op1 = 0xe98646d7 #op1 = 0x3340f2a7 - #op1 = 0x3a05de50 #op1 = 0xfff13f05 + #op1 = 0xc53eb000 + #op1 = 0x3a05de50 + #op1 = 0xc27ff989 vals.append((op1,)) else: op1 = randint(0, (1<