@@ -1859,6 +1859,48 @@ TEST(APFloatTest, convert) {
1859
1859
EXPECT_EQ (0x7fc00000 , test.bitcastToAPInt ());
1860
1860
EXPECT_TRUE (losesInfo);
1861
1861
EXPECT_EQ (status, APFloat::opOK);
1862
+
1863
+ // Test that subnormals are handled correctly in double to float conversion
1864
+ test = APFloat (APFloat::IEEEdouble (), " 0x0.0000010000000p-1022" );
1865
+ test.convert (APFloat::IEEEsingle (), APFloat::rmNearestTiesToEven, &losesInfo);
1866
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1867
+ EXPECT_TRUE (losesInfo);
1868
+
1869
+ test = APFloat (APFloat::IEEEdouble (), " 0x0.0000010000001p-1022" );
1870
+ test.convert (APFloat::IEEEsingle (), APFloat::rmNearestTiesToEven, &losesInfo);
1871
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1872
+ EXPECT_TRUE (losesInfo);
1873
+
1874
+ test = APFloat (APFloat::IEEEdouble (), " -0x0.0000010000001p-1022" );
1875
+ test.convert (APFloat::IEEEsingle (), APFloat::rmNearestTiesToEven, &losesInfo);
1876
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1877
+ EXPECT_TRUE (losesInfo);
1878
+
1879
+ test = APFloat (APFloat::IEEEdouble (), " 0x0.0000020000000p-1022" );
1880
+ test.convert (APFloat::IEEEsingle (), APFloat::rmNearestTiesToEven, &losesInfo);
1881
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1882
+ EXPECT_TRUE (losesInfo);
1883
+
1884
+ test = APFloat (APFloat::IEEEdouble (), " 0x0.0000020000001p-1022" );
1885
+ test.convert (APFloat::IEEEsingle (), APFloat::rmNearestTiesToEven, &losesInfo);
1886
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1887
+ EXPECT_TRUE (losesInfo);
1888
+
1889
+ // Test subnormal conversion to bfloat
1890
+ test = APFloat (APFloat::IEEEsingle (), " 0x0.01p-126" );
1891
+ test.convert (APFloat::BFloat (), APFloat::rmNearestTiesToEven, &losesInfo);
1892
+ EXPECT_EQ (0 .0f , test.convertToFloat ());
1893
+ EXPECT_TRUE (losesInfo);
1894
+
1895
+ test = APFloat (APFloat::IEEEsingle (), " 0x0.02p-126" );
1896
+ test.convert (APFloat::BFloat (), APFloat::rmNearestTiesToEven, &losesInfo);
1897
+ EXPECT_EQ (0x01 , test.bitcastToAPInt ());
1898
+ EXPECT_FALSE (losesInfo);
1899
+
1900
+ test = APFloat (APFloat::IEEEsingle (), " 0x0.01p-126" );
1901
+ test.convert (APFloat::BFloat (), APFloat::rmNearestTiesToAway, &losesInfo);
1902
+ EXPECT_EQ (0x01 , test.bitcastToAPInt ());
1903
+ EXPECT_TRUE (losesInfo);
1862
1904
}
1863
1905
1864
1906
TEST (APFloatTest, PPCDoubleDouble) {
0 commit comments