weirdness on INT32->FP32 detected. ui32/i32->f32 test added
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Jul 2019 11:45:56 +0000 (12:45 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Jul 2019 11:45:56 +0000 (12:45 +0100)
src/ieee754/fcvt/pipeline.py
src/ieee754/fcvt/test/test_fcvt_int_pipe.py
src/ieee754/fpcommon/test/fpmux.py

index c22f9fbf327f6f960e77803bd8180e421a8ae2d3..85432ca7e9112fd7a8277b573361e07a4e90f96a 100644 (file)
@@ -107,10 +107,16 @@ class FPCVTIntToFloatMod(Elaboratable):
         m.d.comb += msb.m_in.eq(Cat(0, 0, 0, mantissa)) # g/r/s + input
         m.d.comb += msb.e_in.eq(me)                     # exp = int width
 
-        if ms < 0:
-            # larger int to smaller FP (uint32/64 -> fp16 most likely)
+        # to do with FP16... not yet resolved why
+        alternative = ms < 0
+
+        if alternative:
             m.d.comb += z1.e.eq(msb.e_out-1)
-            m.d.comb += z1.m[ms-1:].eq(msb.m_out[-mz-1:])
+            if mz == 16:
+                # larger int to smaller FP (uint32/64 -> fp16 most likely)
+                m.d.comb += z1.m[ms-1:].eq(msb.m_out[-mz-1:])
+            else: # 32? XXX weirdness...
+                m.d.comb += z1.m.eq(msb.m_out[-mz-1:])
         else:
             # smaller int to larger FP
             m.d.comb += z1.e.eq(msb.e_out)
@@ -128,7 +134,7 @@ class FPCVTIntToFloatMod(Elaboratable):
         # is even necessary.  it probably isn't
 
         # initialise rounding (but only activate if needed)
-        if ms < 0:
+        if alternative:
             # larger int to smaller FP (uint32/64 -> fp16 most likely)
             m.d.comb += self.o.of.guard.eq(msb.m_out[-mz-2])
             m.d.comb += self.o.of.round_bit.eq(msb.m_out[-mz-3])
index 4f72f83aa852e09ee5eaf33fd02dad4c393d246f..857432b09cae9d77eaec09720dfbdacac877c878 100644 (file)
@@ -39,6 +39,10 @@ def fcvt_i16_f32(x):
     print ("fcvt i16_f32", hex(x))
     return sfpy.float.i32_to_f32(x) # XXX no i16_to_f32, it's ok though
 
+def fcvt_i32_f32(x):
+    print ("fcvt i32_f32", hex(x))
+    return sfpy.float.i32_to_f32(x)
+
 def fcvt_i32_f64(x):
     print ("fcvt i32_f64", hex(x))
     return sfpy.float.i32_to_f64(x)
@@ -68,6 +72,11 @@ def test_int_pipe_i32_f64():
     runfp(dut, 32, "test_fcvt_int_pipe_i32_f64", to_int32, fcvt_i32_f64, True,
           n_vals=100, opcode=0x1)
 
+def test_int_pipe_i32_f32():
+    dut = FPCVTIntMuxInOut(32, 32, 4, op_wid=1)
+    runfp(dut, 32, "test_fcvt_int_pipe_i32_f32", to_int32, fcvt_i32_f32, True,
+          n_vals=100, opcode=0x1)
+
 ######################
 # unsigned int to fp
 ######################
@@ -84,6 +93,11 @@ def test_int_pipe_ui16_f64():
     runfp(dut, 16, "test_fcvt_int_pipe_ui16_f64", to_uint16, fcvt_64, True,
           n_vals=100)
 
+def test_int_pipe_ui32_f32():
+    dut = FPCVTIntMuxInOut(32, 32, 4, op_wid=1)
+    runfp(dut, 32, "test_fcvt_int_pipe_ui32_32", to_uint32, fcvt_32, True,
+          n_vals=100)
+
 def test_int_pipe_ui32_f64():
     dut = FPCVTIntMuxInOut(32, 64, 4, op_wid=1)
     runfp(dut, 32, "test_fcvt_int_pipe_ui32_64", to_uint32, fcvt_64, True,
@@ -115,9 +129,12 @@ def test_int_pipe_ui32_f16():
 
 if __name__ == '__main__':
     for i in range(200):
-        test_int_pipe_i32_f64()
+        test_int_pipe_ui32_f32()
+        test_int_pipe_i32_f32()
         continue
         test_int_pipe_i16_f32()
+        test_int_pipe_i32_f64()
+        continue
         test_int_pipe_ui16_f32()
         test_int_pipe_ui64_f32()
         test_int_pipe_ui32_f16()
index c294f159252fe26d02ad727b58dbdf26fa61cefe..181e57a2dac5e8c9e9cfeb338968c1330726fb30 100644 (file)
@@ -161,6 +161,8 @@ def create_random(num_rows, width, single_op=False, n_vals=10):
 
                 #op1 = 0x1841
 
+                #op1 = 0x3449f9a9
+
                 vals.append((op1,))
             else:
                 op1 = randint(0, (1<<width)-1)