with m.State("special_cases"):
- # if a is zero and b is NaN return -b
- with m.If(a.is_zero() & (a.s==0) & b.is_nan()):
+ # if a is NaN or b is NaN return NaN
+ with m.If(a.is_nan() | b.is_nan()):
m.next = "put_z"
- m.d.sync += z.create(b.s, b.e, Cat(b.m[3:-2], ~b.m[0]))
-
- # if b is zero and a is NaN return -a
- with m.Elif(b.is_zero() & (b.s==0) & a.is_nan()):
- m.next = "put_z"
- m.d.sync += z.create(a.s, a.e, Cat(a.m[3:-2], ~a.m[0]))
-
- # if a is -zero and b is NaN return -b
- with m.Elif(a.is_zero() & (a.s==1) & b.is_nan()):
- m.next = "put_z"
- m.d.sync += z.create(a.s & b.s, b.e, Cat(b.m[3:-2], 1))
-
- # if b is -zero and a is NaN return -a
- with m.Elif(b.is_zero() & (b.s==1) & a.is_nan()):
- m.next = "put_z"
- m.d.sync += z.create(a.s & b.s, a.e, Cat(a.m[3:-2], 1))
+ m.d.sync += z.nan(1)
+
+ # XXX WEIRDNESS for FP16 non-canonical NaN handling
+ # under review
+
+ ## if a is zero and b is NaN return -b
+ #with m.If(a.is_zero() & (a.s==0) & b.is_nan()):
+ # m.next = "put_z"
+ # m.d.sync += z.create(b.s, b.e, Cat(b.m[3:-2], ~b.m[0]))
+
+ ## if b is zero and a is NaN return -a
+ #with m.Elif(b.is_zero() & (b.s==0) & a.is_nan()):
+ # m.next = "put_z"
+ # m.d.sync += z.create(a.s, a.e, Cat(a.m[3:-2], ~a.m[0]))
+
+ ## if a is -zero and b is NaN return -b
+ #with m.Elif(a.is_zero() & (a.s==1) & b.is_nan()):
+ # m.next = "put_z"
+ # m.d.sync += z.create(a.s & b.s, b.e, Cat(b.m[3:-2], 1))
+
+ ## if b is -zero and a is NaN return -a
+ #with m.Elif(b.is_zero() & (b.s==1) & a.is_nan()):
+ # m.next = "put_z"
+ # m.d.sync += z.create(a.s & b.s, a.e, Cat(a.m[3:-2], 1))
# if a is inf return inf (or NaN)
with m.Elif(a.is_inf()):
run_edge_cases, run_corner_cases)
def testbench(dut):
+ yield from check_case(dut, 0xFFFFFFFF, 0xC63B800A, 0xFFC00000)
yield from check_case(dut, 0xFF800000, 0x7F800000, 0xFFC00000)
#yield from check_case(dut, 0xFF800000, 0x7F800000, 0x7FC00000)
yield from check_case(dut, 0x7F800000, 0xFF800000, 0xFFC00000)
yield from check_case(dut, 0xC2BA8A3D, 0x463B800A, 0x463A0AF6)
yield from check_case(dut, 0xC63B800A, 0x42BA8A3D, 0xC63A0AF6)
yield from check_case(dut, 0x42BA8A3D, 0xC63B800A, 0xC63A0AF6)
- yield from check_case(dut, 0xFFFFFFFF, 0xC63B800A, 0xFFC00000)
yield from check_case(dut, 0x7F800000, 0x00000000, 0x7F800000)
yield from check_case(dut, 0x00000000, 0x7F800000, 0x7F800000)
yield from check_case(dut, 0xFF800000, 0x00000000, 0xFF800000)