@@ -1743,6 +1743,8 @@ fn copy_sign() {
1743
1743
#[ test]
1744
1744
fn convert ( ) {
1745
1745
let mut loses_info = false ;
1746
+ let mut status;
1747
+
1746
1748
let test = "1.0" . parse :: < Double > ( ) . unwrap ( ) ;
1747
1749
let test: Single = test. convert ( & mut loses_info) . value ;
1748
1750
assert_eq ! ( 1.0 , test. to_f32( ) ) ;
@@ -1768,26 +1770,45 @@ fn convert() {
1768
1770
assert ! ( !loses_info) ;
1769
1771
1770
1772
let test = Single :: snan ( None ) ;
1771
- let x87_snan = X87DoubleExtended :: snan ( None ) ;
1772
- let test : X87DoubleExtended = test . convert ( & mut loses_info ) . value ;
1773
- assert ! ( test. bitwise_eq( x87_snan ) ) ;
1773
+ let test : X87DoubleExtended = unpack ! ( status= , test . convert ( & mut loses_info ) ) ;
1774
+ // Conversion quiets the SNAN, so now 2 bits of the 64-bit significand should be set.
1775
+ assert ! ( test. bitwise_eq( X87DoubleExtended :: qnan ( Some ( 0x6000000000000000 ) ) ) ) ;
1774
1776
assert ! ( !loses_info) ;
1777
+ assert_eq ! ( status, Status :: INVALID_OP ) ;
1775
1778
1776
1779
let test = Single :: qnan ( None ) ;
1777
1780
let x87_qnan = X87DoubleExtended :: qnan ( None ) ;
1778
1781
let test: X87DoubleExtended = test. convert ( & mut loses_info) . value ;
1779
1782
assert ! ( test. bitwise_eq( x87_qnan) ) ;
1780
1783
assert ! ( !loses_info) ;
1781
1784
1782
- let test = X87DoubleExtended :: snan ( None ) ;
1785
+ // NOTE(eddyb) these were mistakenly noops upstream, here they're already
1786
+ // fixed (by instead converting from `Double` to `X87DoubleExtended`),
1787
+ // see also upstream issue https://github.com/llvm/llvm-project/issues/63842.
1788
+ let test = Double :: snan ( None ) ;
1783
1789
let test: X87DoubleExtended = test. convert ( & mut loses_info) . value ;
1784
- assert ! ( test. bitwise_eq( x87_snan) ) ;
1790
+ // Conversion quiets the SNAN, so now 2 bits of the 64-bit significand should be set.
1791
+ assert ! ( test. bitwise_eq( X87DoubleExtended :: qnan( Some ( 0x6000000000000000 ) ) ) ) ;
1785
1792
assert ! ( !loses_info) ;
1786
1793
1787
- let test = X87DoubleExtended :: qnan ( None ) ;
1794
+ let test = Double :: qnan ( None ) ;
1788
1795
let test: X87DoubleExtended = test. convert ( & mut loses_info) . value ;
1789
1796
assert ! ( test. bitwise_eq( x87_qnan) ) ;
1790
1797
assert ! ( !loses_info) ;
1798
+
1799
+ // The payload is lost in truncation, but we retain NaN by setting the quiet bit.
1800
+ let test = Double :: snan ( Some ( 1 ) ) ;
1801
+ let test: Single = unpack ! ( status=, test. convert( & mut loses_info) ) ;
1802
+ assert_eq ! ( 0x7fc00000 , test. to_bits( ) ) ;
1803
+ assert ! ( loses_info) ;
1804
+ assert_eq ! ( status, Status :: INVALID_OP ) ;
1805
+
1806
+ // The payload is lost in truncation. QNaN remains QNaN.
1807
+ let test = Double :: qnan ( Some ( 1 ) ) ;
1808
+ let test: Single = unpack ! ( status=, test. convert( & mut loses_info) ) ;
1809
+ assert_eq ! ( 0x7fc00000 , test. to_bits( ) ) ;
1810
+ assert ! ( loses_info) ;
1811
+ assert_eq ! ( status, Status :: OK ) ;
1791
1812
}
1792
1813
1793
1814
#[ test]
@@ -3978,3 +3999,13 @@ fn remainder() {
3978
3999
assert_eq ! ( status, Status :: OK ) ;
3979
4000
}
3980
4001
}
4002
+
4003
+ #[ test]
4004
+ fn x87_largest ( ) {
4005
+ assert ! ( X87DoubleExtended :: largest( ) . is_largest( ) ) ;
4006
+ }
4007
+
4008
+ #[ test]
4009
+ fn x87_next ( ) {
4010
+ assert_eq ! ( "-1.0" . parse:: <X87DoubleExtended >( ) . unwrap( ) . next_up( ) . value. ilogb( ) , -1 ) ;
4011
+ }
0 commit comments