- with m.If(abnan):
- comb += self.o.oz.eq(z_nan.v)
-
- # if a is inf return inf (or NaN)
- with m.Elif(a1.is_inf):
- comb += self.o.oz.eq(z_infa.v)
- # if a is inf and signs don't match return NaN
- with m.If(bexp128s):
- comb += self.o.oz.eq(z_nan.v)
-
- # if b is inf return inf
- with m.Elif(b1.is_inf):
- comb += self.o.oz.eq(z_infb.v)
-
- # if a is zero and b zero return signed-a/b
- with m.Elif(abz):
- comb += self.o.oz.eq(self.i.b)
- comb += self.o.oz[-1].eq(absa)
-
- # if a is zero return b
- with m.Elif(a1.is_zero):
- comb += self.o.oz.eq(b1.v)
-
- # if b is zero return a
- with m.Elif(b1.is_zero):
- comb += self.o.oz.eq(a1.v)
-
- # if a equal to -b return zero (+ve zero)
- with m.Elif(aeqmb):
- comb += self.o.oz.eq(z_zero.v)
-
- # Denormalised Number checks next, so pass a/b data through
- with m.Else():
- comb += self.o.out_do_z.eq(0)
+ # elif a is inf return inf (or NaN)
+ # if a is inf and signs don't match return NaN
+ # else return inf(a)
+ # elif b is inf return inf(b)
+ # elif a is zero and b zero return signed-a/b
+ # elif a is zero return b
+ # elif b is zero return a
+ # elif a equal to -b return zero (+ve zero)
+
+ # XXX *sigh* there are better ways to do this...
+ # one of them: use a priority-picker!
+ # in reverse-order, accumulate Muxing
+
+ oz = 0
+ oz = Mux(t_aeqmb, z_zero.v, oz)
+ oz = Mux(t_b1zero, a1.v, oz)
+ oz = Mux(t_a1zero, b1.v, oz)
+ oz = Mux(t_abz, Cat(self.i.b[:-1], absa), oz)
+ oz = Mux(t_b1inf, z_infb.v, oz)
+ oz = Mux(t_a1inf, Mux(bexp128s, z_nan.v, z_infa.v), oz)
+ oz = Mux(t_abnan, z_nan.v, oz)
+
+ comb += self.o.oz.eq(oz)