@@ -17,22 +17,62 @@ public partial class Program
1717 public static unsafe void AddEmbeddedRounding ( )
1818 {
1919 int testResult = 1 ;
20+ ulong [ ] answerTable_ToNegativeInfinity = new ulong [ 8 ] { 0x3fe0000000000000 , 0x3fe0000000000000 , 0x3fdfffffffffffff , 0x3fe0000000000000 ,
21+ 0xbfe0000000000000 , 0xbfe0000000000000 , 0xbfe0000000000000 , 0xbfe0000000000001 } ;
22+ ulong [ ] answerTable_ToPositiveInfinity = new ulong [ 8 ] { 0x3fe0000000000001 , 0x3fe0000000000001 , 0x3fe0000000000000 , 0x3fe0000000000000 ,
23+ 0xbfe0000000000000 , 0xbfe0000000000000 , 0xbfdfffffffffffff , 0xbfe0000000000000 } ;
24+ ulong [ ] answerTable_ToZero = new ulong [ 8 ] { 0x3fe0000000000000 , 0x3fe0000000000000 , 0x3fdfffffffffffff , 0x3fe0000000000000 ,
25+ 0xbfe0000000000000 , 0xbfe0000000000000 , 0xbfdfffffffffffff , 0xbfe0000000000000 } ;
2026
2127 if ( Avx512F . IsSupported )
2228 {
23- using ( TestTable_2Input < double > doubleTable = new TestTable_2Input < double > ( new double [ 8 ] { 1 , - 5 , 100 , 0 , 1 , - 5 , 100 , 0 } , new double [ 8 ] { 1 , 1 , 50 , 0 , 1 , 1 , 50 , 0 } , new double [ 8 ] ) )
29+ using ( TestTable_2Input < double > doubleTable = new TestTable_2Input < double > ( new double [ 8 ] { 0.05 , 0.10 , 0.15 , 0.20 , - 0.25 , - 0.30 , - 0.35 , - 0.40 } , new double [ 8 ] { 0.45 , 0.40 , 0.35 , 0.30 , - 0.25 , - 0.20 , - 0.15 , - 0.10 } , new double [ 8 ] ) )
2430 {
2531
2632 var vd1 = Unsafe . Read < Vector512 < double > > ( doubleTable . inArray1Ptr ) ;
2733 var vd2 = Unsafe . Read < Vector512 < double > > ( doubleTable . inArray2Ptr ) ;
28- var vd3 = Avx512F . Add ( vd1 , vd2 , FloatRoundingMode . ToEven ) ;
34+ var vd3 = Avx512F . Add ( vd1 , vd2 , FloatRoundingMode . ToNegativeInfinity ) ;
2935 Unsafe . Write ( doubleTable . outArrayPtr , vd3 ) ;
30-
36+
37+ for ( int i = 0 ; i < doubleTable . outArray . Length ; i ++ )
38+ {
39+ if ( BitConverter . DoubleToUInt64Bits ( doubleTable . outArray [ i ] ) != answerTable_ToNegativeInfinity [ i ] )
40+ {
41+ Console . WriteLine ( "Avx512 Add Embedded rounding failed on double with ToNegativeInfinity:" ) ;
42+ foreach ( var item in doubleTable . outArray )
43+ {
44+ Console . Write ( item + ", " ) ;
45+ }
46+ Console . WriteLine ( ) ;
47+ Assert . Fail ( "" ) ;
48+ }
49+ }
50+
51+ vd3 = Avx512F . Add ( vd1 , vd2 , FloatRoundingMode . ToPositiveInfinity ) ;
52+ Unsafe . Write ( doubleTable . outArrayPtr , vd3 ) ;
53+
54+ for ( int i = 0 ; i < doubleTable . outArray . Length ; i ++ )
55+ {
56+ if ( BitConverter . DoubleToUInt64Bits ( doubleTable . outArray [ i ] ) != answerTable_ToPositiveInfinity [ i ] )
57+ {
58+ Console . WriteLine ( "Avx512 Add Embedded rounding failed on double with ToPositiveInfinity:" ) ;
59+ foreach ( var item in doubleTable . outArray )
60+ {
61+ Console . Write ( item + ", " ) ;
62+ }
63+ Console . WriteLine ( ) ;
64+ Assert . Fail ( "" ) ;
65+ }
66+ }
67+
68+ vd3 = Avx512F . Add ( vd1 , vd2 , FloatRoundingMode . ToZero ) ;
69+ Unsafe . Write ( doubleTable . outArrayPtr , vd3 ) ;
70+
3171 for ( int i = 0 ; i < doubleTable . outArray . Length ; i ++ )
3272 {
33- if ( BitConverter . DoubleToInt64Bits ( doubleTable . outArray [ i ] ) != BitConverter . DoubleToInt64Bits ( doubleTable . inArray1 [ i ] + doubleTable . inArray2 [ i ] ) )
73+ if ( BitConverter . DoubleToUInt64Bits ( doubleTable . outArray [ i ] ) != answerTable_ToZero [ i ] )
3474 {
35- Console . WriteLine ( "Avx512 Add Embedded rounding failed on double:" ) ;
75+ Console . WriteLine ( "Avx512 Add Embedded rounding failed on double with ToZero :" ) ;
3676 foreach ( var item in doubleTable . outArray )
3777 {
3878 Console . Write ( item + ", " ) ;
0 commit comments