@@ -12,53 +12,54 @@ import 'dart:typed_data';
1212import 'package:expect/expect.dart' ;
1313
1414void testImmediates () {
15- var f = Float32x4 (1.0 , 2.0 , 3.0 , 4.0 );
16- var m = f.signMask;
17- Expect .equals (0x0 , m);
18- f = Float32x4 (- 1.0 , - 2.0 , - 3.0 , - 0.0 );
19- m = f.signMask;
20- Expect .equals (0xf , m);
21- f = Float32x4 (- 1.0 , 2.0 , 3.0 , 4.0 );
22- m = f.signMask;
23- Expect .equals (0x1 , m);
24- f = Float32x4 (1.0 , - 2.0 , 3.0 , 4.0 );
25- m = f.signMask;
26- Expect .equals (0x2 , m);
27- f = Float32x4 (1.0 , 2.0 , - 3.0 , 4.0 );
28- m = f.signMask;
29- Expect .equals (0x4 , m);
30- f = Float32x4 (1.0 , 2.0 , 3.0 , - 4.0 );
31- m = f.signMask;
32- Expect .equals (0x8 , m);
15+ Expect .equals (0x0 , Float32x4 (1.0 , 2.0 , 3.0 , 4.0 ).signMask);
16+ Expect .equals (0xf , Float32x4 (- 1.0 , - 2.0 , - 3.0 , - 0.0 ).signMask);
17+ Expect .equals (0x1 , Float32x4 (- 1.0 , 2.0 , 3.0 , 4.0 ).signMask);
18+ Expect .equals (0x2 , Float32x4 (1.0 , - 2.0 , 3.0 , 4.0 ).signMask);
19+ Expect .equals (0x4 , Float32x4 (1.0 , 2.0 , - 3.0 , 4.0 ).signMask);
20+ Expect .equals (0x8 , Float32x4 (1.0 , 2.0 , 3.0 , - 4.0 ).signMask);
3321}
3422
3523void testZero () {
36- var f = Float32x4 (0.0 , 0.0 , 0.0 , 0.0 );
37- var m = f.signMask;
38- Expect .equals (0x0 , m);
39- f = Float32x4 (- 0.0 , - 0.0 , - 0.0 , - 0.0 );
40- m = f.signMask;
41- Expect .equals (0xf , m);
24+ Expect .equals (0x0 , Float32x4 (0.0 , 0.0 , 0.0 , 0.0 ).signMask);
25+ Expect .equals (0xf , Float32x4 (- 0.0 , - 0.0 , - 0.0 , - 0.0 ).signMask);
4226}
4327
4428void testArithmetic () {
45- var a = Float32x4 (1.0 , 1.0 , 1.0 , 1.0 );
46- var b = Float32x4 (2.0 , 2.0 , 2.0 , 2.0 );
47- var c = Float32x4 (- 1.0 , - 1.0 , - 1.0 , - 1.0 );
48- var m1 = (a - b).signMask;
49- Expect .equals (0xf , m1);
50- var m2 = (b - a).signMask;
51- Expect .equals (0x0 , m2);
52- var m3 = (c * c).signMask;
53- Expect .equals (0x0 , m3);
54- var m4 = (a * c).signMask;
55- Expect .equals (0xf , m4);
29+ final a = Float32x4 (1.0 , 1.0 , 1.0 , 1.0 );
30+ final b = Float32x4 (2.0 , 2.0 , 2.0 , 2.0 );
31+ final c = Float32x4 (- 1.0 , - 1.0 , - 1.0 , - 1.0 );
32+ Expect .equals (0xf , (a - b).signMask);
33+ Expect .equals (0x0 , (b - a).signMask);
34+ Expect .equals (0x0 , (c * c).signMask);
35+ Expect .equals (0xf , (a * c).signMask);
36+ }
37+
38+ // Check every one of the 16 sign-bit patterns: lane i is negative when bit i of
39+ // `mask` is set, so signMask should return `mask`.
40+ void testExhaustive () {
41+ for (int mask = 0 ; mask < 16 ; mask++ ) {
42+ double lane (int i) => (mask & (1 << i)) != 0 ? - 1.0 : 1.0 ;
43+ Expect .equals (mask, Float32x4 (lane (0 ), lane (1 ), lane (2 ), lane (3 )).signMask);
44+ }
45+ }
46+
47+ void testSpecialValues () {
48+ const inf = double .infinity;
49+ Expect .equals (0x0 , Float32x4 (inf, inf, inf, inf).signMask);
50+ Expect .equals (0xf , Float32x4 (- inf, - inf, - inf, - inf).signMask);
51+ Expect .equals (0x5 , Float32x4 (- inf, 1.0 , - inf, 1.0 ).signMask);
52+ // NaN is intentionally not tested. The sign bit of a NaN is not portable
53+ // across architectures or the web backends.
54+ Expect .equals (0xf , Float32x4 (- 1e-40 , - 1e-40 , - 1e-40 , - 1e-40 ).signMask);
5655}
5756
5857main () {
5958 for (int i = 0 ; i < 2000 ; i++ ) {
6059 testImmediates ();
6160 testZero ();
6261 testArithmetic ();
62+ testExhaustive ();
63+ testSpecialValues ();
6364 }
6465}
0 commit comments