@@ -25,14 +25,14 @@ public Scalar8x32(uint u)
25
25
{
26
26
b0 = u ;
27
27
b1 = 0 ; b1 = 0 ; b2 = 0 ; b3 = 0 ; b4 = 0 ; b5 = 0 ; b6 = 0 ; b7 = 0 ;
28
- Debug . Assert ( CheckOverflow ( ) == 0 ) ;
28
+ Debug . Assert ( Verify ( ) ) ;
29
29
}
30
30
31
31
/// <summary>
32
32
/// Initializes a new instance of <see cref="Scalar8x32"/> using the given parameters.
33
33
/// </summary>
34
34
/// <remarks>
35
- /// Assumes there is no overflow
35
+ /// Assumes caller handles overflow
36
36
/// </remarks>
37
37
/// <param name="u0">1st 32 bits</param>
38
38
/// <param name="u1">2nd 32 bits</param>
@@ -46,14 +46,13 @@ public Scalar8x32(uint u0, uint u1, uint u2, uint u3, uint u4, uint u5, uint u6,
46
46
{
47
47
b0 = u0 ; b1 = u1 ; b2 = u2 ; b3 = u3 ;
48
48
b4 = u4 ; b5 = u5 ; b6 = u6 ; b7 = u7 ;
49
- Debug . Assert ( CheckOverflow ( ) == 0 ) ;
50
49
}
51
50
52
51
/// <summary>
53
52
/// Initializes a new instance of <see cref="Scalar8x32"/> using the given array.
54
53
/// </summary>
55
54
/// <remarks>
56
- /// Assumes there is no overflow
55
+ /// Assumes caller handles overflow
57
56
/// </remarks>
58
57
/// <exception cref="ArgumentNullException"/>
59
58
/// <exception cref="ArgumentOutOfRangeException"/>
@@ -67,7 +66,6 @@ public Scalar8x32(Span<uint> array)
67
66
68
67
b0 = array [ 0 ] ; b1 = array [ 1 ] ; b2 = array [ 2 ] ; b3 = array [ 3 ] ;
69
68
b4 = array [ 4 ] ; b5 = array [ 5 ] ; b6 = array [ 6 ] ; b7 = array [ 7 ] ;
70
- Debug . Assert ( CheckOverflow ( ) == 0 ) ;
71
69
}
72
70
73
71
/// <summary>
@@ -350,11 +348,18 @@ public Scalar8x32 Half()
350
348
// in full 64 bits to make sure the top 32 bits are indeed zero.
351
349
Debug . Assert ( ( t + ( b7 >> 1 ) + ( NH7 & mask ) ) >> 32 == 0 ) ;
352
350
353
- return new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
351
+ Scalar8x32 result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
352
+ Debug . Assert ( result . Verify ( ) ) ;
353
+ return result ;
354
354
}
355
355
356
356
357
- public uint CheckOverflow ( )
357
+ public bool Verify ( )
358
+ {
359
+ return CheckOverflow ( ) == 0 ;
360
+ }
361
+
362
+ private uint CheckOverflow ( )
358
363
{
359
364
uint yes = 0U ;
360
365
uint no = 0U ;
@@ -507,7 +512,9 @@ public Scalar8x32 CAddBit(uint bit, uint flag)
507
512
508
513
Debug . Assert ( ( t >> 32 ) == 0 ) ;
509
514
510
- return new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
515
+ Scalar8x32 result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
516
+ Debug . Assert ( result . Verify ( ) ) ;
517
+ return result ;
511
518
}
512
519
513
520
@@ -1112,7 +1119,10 @@ private static Scalar8x32 Reduce(in Scalar8x32 r, uint overflow)
1112
1119
uint r6 = ( uint ) t ; t >>= 32 ;
1113
1120
t += r . b7 ;
1114
1121
uint r7 = ( uint ) t ;
1115
- return new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1122
+
1123
+ Scalar8x32 result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1124
+ Debug . Assert ( result . Verify ( ) ) ;
1125
+ return result ;
1116
1126
}
1117
1127
1118
1128
@@ -1148,6 +1158,7 @@ public static unsafe Scalar8x32 MulShiftVar(in Scalar8x32 a, in Scalar8x32 b, in
1148
1158
uint r7 = shift < 288 ? ( l [ 7 + shLimbs ] >> shiftlow ) : 0 ;
1149
1159
1150
1160
Scalar8x32 r = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1161
+ Debug . Assert ( r . Verify ( ) ) ;
1151
1162
return r . CAddBit ( 0 , ( l [ ( shift - 1 ) >> 5 ] >> ( ( shift - 1 ) & 0x1f ) ) & 1 ) ;
1152
1163
}
1153
1164
@@ -1180,7 +1191,9 @@ public Scalar8x32 Negate()
1180
1191
t += ( ulong ) ( ~ b7 ) + N7 ;
1181
1192
uint r7 = ( uint ) ( t & nonzero ) ;
1182
1193
1183
- return new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1194
+ Scalar8x32 result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1195
+ Debug . Assert ( result . Verify ( ) ) ;
1196
+ return result ;
1184
1197
}
1185
1198
1186
1199
/// <summary>
@@ -1214,7 +1227,9 @@ public int NegateConditional(int flag, out Scalar8x32 result)
1214
1227
uint r6 = ( uint ) ( t & nonzero ) ; t >>= 32 ;
1215
1228
t += ( ulong ) ( b7 ^ mask ) + ( N7 & mask ) ;
1216
1229
uint r7 = ( uint ) ( t & nonzero ) ;
1230
+
1217
1231
result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1232
+ Debug . Assert ( result . Verify ( ) ) ;
1218
1233
// return 2 * (mask == 0) - 1;
1219
1234
return mask == 0 ? 1 : - 1 ;
1220
1235
}
@@ -1243,7 +1258,9 @@ public static Scalar8x32 CMov(in Scalar8x32 r, in Scalar8x32 a, uint flag)
1243
1258
uint r6 = ( r . b6 & mask0 ) | ( a . b6 & mask1 ) ;
1244
1259
uint r7 = ( r . b7 & mask0 ) | ( a . b7 & mask1 ) ;
1245
1260
1246
- return new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1261
+ Scalar8x32 result = new Scalar8x32 ( r0 , r1 , r2 , r3 , r4 , r5 , r6 , r7 ) ;
1262
+ Debug . Assert ( result . Verify ( ) ) ;
1263
+ return result ;
1247
1264
}
1248
1265
1249
1266
@@ -1259,6 +1276,9 @@ internal static void Split128(in Scalar8x32 k, out Scalar8x32 r1, out Scalar8x32
1259
1276
1260
1277
r1 = new Scalar8x32 ( k . b0 , k . b1 , k . b2 , k . b3 , 0 , 0 , 0 , 0 ) ;
1261
1278
r2 = new Scalar8x32 ( k . b4 , k . b5 , k . b6 , k . b7 , 0 , 0 , 0 , 0 ) ;
1279
+
1280
+ Debug . Assert ( r1 . Verify ( ) ) ;
1281
+ Debug . Assert ( r2 . Verify ( ) ) ;
1262
1282
}
1263
1283
1264
1284
/// <summary>
0 commit comments