xref: /aosp_15_r20/external/skia/tests/SkVxTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2019 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkUtils.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkVx.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker #include <numeric>
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker namespace skvx {
17*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx,r)18*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx, r) {
19*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(float2) ==  8, "");
20*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(float4) == 16, "");
21*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(float8) == 32, "");
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(byte2) == 2, "");
24*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(byte4) == 4, "");
25*c8dee2aaSAndroid Build Coastguard Worker     static_assert(sizeof(byte8) == 8, "");
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker     {
28*c8dee2aaSAndroid Build Coastguard Worker         int4 mask = float4{1,2,3,4} < float4{1,2,4,8};
29*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[0] == int32_t( 0));
30*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[1] == int32_t( 0));
31*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[2] == int32_t(-1));
32*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[3] == int32_t(-1));
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r,  any(mask));
35*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !all(mask));
36*c8dee2aaSAndroid Build Coastguard Worker     }
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     {
39*c8dee2aaSAndroid Build Coastguard Worker         long4 mask = double4{1,2,3,4} < double4{1,2,4,8};
40*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[0] == int64_t( 0));
41*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[1] == int64_t( 0));
42*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[2] == int64_t(-1));
43*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, mask[3] == int64_t(-1));
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r,  any(mask));
46*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !all(mask));
47*c8dee2aaSAndroid Build Coastguard Worker     }
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     {
50*c8dee2aaSAndroid Build Coastguard Worker         // Tests that any/all work with non-zero values, not just full bit lanes.
51*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r,  all(int4{1,2,3,4}));
52*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !all(int4{1,2,3}));
53*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r,  any(int4{1,2}));
54*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !any(int4{}));
55*c8dee2aaSAndroid Build Coastguard Worker     }
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, min(float4{1,2,3,4}) == 1);
58*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, max(float4{1,2,3,4}) == 4);
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{1,2,3,4}   == int4{1,2,3,4}));
61*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{1,2,3}     == int4{1,2,3,0}));
62*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{1,2}       == int4{1,2,0,0}));
63*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{1}         == int4{1,0,0,0}));
64*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4(1)         == int4{1,1,1,1}));
65*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{}          == int4{0,0,0,0}));
66*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4()          == int4{0,0,0,0}));
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{1,2,2,1} == min(int4{1,2,3,4}, int4{4,3,2,1})));
69*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(int4{4,3,3,4} == max(int4{1,2,3,4}, int4{4,3,2,1})));
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(if_then_else(float4{1,2,3,2} <= float4{2,2,2,2}, float4(42), float4(47))
72*c8dee2aaSAndroid Build Coastguard Worker                            == float4{42,42,47,42}));
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(floor(float4{-1.5f,1.5f,1.0f,-1.0f}) == float4{-2.0f,1.0f,1.0f,-1.0f}));
75*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all( ceil(float4{-1.5f,1.5f,1.0f,-1.0f}) == float4{-1.0f,2.0f,1.0f,-1.0f}));
76*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(trunc(float4{-1.5f,1.5f,1.0f,-1.0f}) == float4{-1.0f,1.0f,1.0f,-1.0f}));
77*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(round(float4{-1.5f,1.5f,1.0f,-1.0f}) == float4{-2.0f,2.0f,1.0f,-1.0f}));
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(abs(float4{-2,-1,0,1}) == float4{2,1,0,1}));
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     // TODO(mtklein): these tests could be made less loose.
83*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all( sqrt(float4{2,3,4,5}) < float4{2,2,3,3}));
84*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all( sqrt(float2{2,3}) < float2{2,2}));
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(cast<int>(float4{-1.5f,0.5f,1.0f,1.5f}) == int4{-1,0,1,1}));
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     float buf[] = {1,2,3,4,5,6};
89*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(float4::Load(buf) == float4{1,2,3,4}));
90*c8dee2aaSAndroid Build Coastguard Worker     float4{2,3,4,5}.store(buf);
91*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, buf[0] == 2
92*c8dee2aaSAndroid Build Coastguard Worker                     && buf[1] == 3
93*c8dee2aaSAndroid Build Coastguard Worker                     && buf[2] == 4
94*c8dee2aaSAndroid Build Coastguard Worker                     && buf[3] == 5
95*c8dee2aaSAndroid Build Coastguard Worker                     && buf[4] == 5
96*c8dee2aaSAndroid Build Coastguard Worker                     && buf[5] == 6);
97*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(float4::Load(buf+0) == float4{2,3,4,5}));
98*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(float4::Load(buf+2) == float4{4,5,5,6}));
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(shuffle<2,1,0,3>        (float4{1,2,3,4}) == float4{3,2,1,4}));
101*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(shuffle<2,1>            (float4{1,2,3,4}) == float2{3,2}));
102*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(shuffle<3,3,3,3>        (float4{1,2,3,4}) == float4{4,4,4,4}));
103*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(shuffle<2,1,2,1,2,1,2,1>(float4{1,2,3,4})
104*c8dee2aaSAndroid Build Coastguard Worker                            == float8{3,2,3,2,3,2,3,2}));
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     // Test that mixed types can be used where they make sense.  Mostly about ergonomics.
107*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(float4{1,2,3,4} < 5));
108*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all( byte4{1,2,3,4} < 5));
109*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(  int4{1,2,3,4} < 5.0f));
110*c8dee2aaSAndroid Build Coastguard Worker     float4 five = 5;
111*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(five == 5.0f));
112*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(five == 5));
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(max(2, min(float4{1,2,3,4}, 3)) == float4{2,2,3,3}));
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker     for (int x = 0; x < 256; x++)
117*c8dee2aaSAndroid Build Coastguard Worker     for (int y = 0; y < 256; y++) {
118*c8dee2aaSAndroid Build Coastguard Worker         uint8_t want = (uint8_t)( 255*(x/255.0 * y/255.0) + 0.5 );
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker         {
121*c8dee2aaSAndroid Build Coastguard Worker             uint8_t got = div255(Vec<8, uint16_t>(x) * Vec<8, uint16_t>(y) )[0];
122*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(r, got == want);
123*c8dee2aaSAndroid Build Coastguard Worker         }
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker         {
126*c8dee2aaSAndroid Build Coastguard Worker             uint8_t got = approx_scale(Vec<8,uint8_t>(x), Vec<8,uint8_t>(y))[0];
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(r, got == want-1 ||
129*c8dee2aaSAndroid Build Coastguard Worker                                got == want   ||
130*c8dee2aaSAndroid Build Coastguard Worker                                got == want+1);
131*c8dee2aaSAndroid Build Coastguard Worker             if (x == 0 || y == 0 || x == 255 || y == 255) {
132*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, got == want);
133*c8dee2aaSAndroid Build Coastguard Worker             }
134*c8dee2aaSAndroid Build Coastguard Worker         }
135*c8dee2aaSAndroid Build Coastguard Worker     }
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker     for (int x = 0; x < 256; x++)
138*c8dee2aaSAndroid Build Coastguard Worker     for (int y = 0; y < 256; y++) {
139*c8dee2aaSAndroid Build Coastguard Worker         uint16_t xy = x*y;
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker         // Make sure to cover implementation cases N=8, N<8, and N>8.
142*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(mull(byte2 (x), byte2 (y)) == xy));
143*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(mull(byte4 (x), byte4 (y)) == xy));
144*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(mull(byte8 (x), byte8 (y)) == xy));
145*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(mull(byte16(x), byte16(y)) == xy));
146*c8dee2aaSAndroid Build Coastguard Worker     }
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker     {
149*c8dee2aaSAndroid Build Coastguard Worker         // Intentionally not testing -0, as we don't care if it's 0x0000 or 0x8000.
150*c8dee2aaSAndroid Build Coastguard Worker         float8 fs = {+0.0f,+0.5f,+1.0f,+2.0f,
151*c8dee2aaSAndroid Build Coastguard Worker                      -4.0f,-0.5f,-1.0f,-2.0f};
152*c8dee2aaSAndroid Build Coastguard Worker         Vec<8,uint16_t> hs = {0x0000,0x3800,0x3c00,0x4000,
153*c8dee2aaSAndroid Build Coastguard Worker                               0xc400,0xb800,0xbc00,0xc000};
154*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(  to_half(fs) == hs));
155*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, all(from_half(hs) == fs));
156*c8dee2aaSAndroid Build Coastguard Worker     }
157*c8dee2aaSAndroid Build Coastguard Worker }
158*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_xy,r)159*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_xy, r) {
160*c8dee2aaSAndroid Build Coastguard Worker     float2 f = float2(1,2);
161*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float2{1,2}));
162*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.x() == 1);
163*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.y() == 2);
164*c8dee2aaSAndroid Build Coastguard Worker     f.y() = 9;
165*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float2{1,9}));
166*c8dee2aaSAndroid Build Coastguard Worker     f.x() = 0;
167*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float2(0,9)));
168*c8dee2aaSAndroid Build Coastguard Worker     f[0] = 8;
169*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.x() == 8);
170*c8dee2aaSAndroid Build Coastguard Worker     f[1] = 6;
171*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.y() == 6);
172*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float2(8,6)));
173*c8dee2aaSAndroid Build Coastguard Worker     f = f.yx();
174*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float2(6,8)));
175*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, sk_bit_cast<SkPoint>(f) == SkPoint::Make(6,8));
176*c8dee2aaSAndroid Build Coastguard Worker     SkPoint p;
177*c8dee2aaSAndroid Build Coastguard Worker     f.store(&p);
178*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, p == SkPoint::Make(6,8));
179*c8dee2aaSAndroid Build Coastguard Worker     f.yx().store(&p);
180*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, p == SkPoint::Make(8,6));
181*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.xyxy() == float4(6,8,6,8)));
182*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.xyxy() == float4(f,f)));
183*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(join(f,f) == f.xyxy()));
184*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(join(f.yx(),f) == float4(f.y(),f.x(),f)));
185*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(join(f.yx(),f) == float4(f.yx(),f.x(),f.y())));
186*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(join(f,f.yx()) == float4(f.x(),f.y(),f.yx())));
187*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(join(f.yx(),f.yx()) == float4(f.yx(),f.yx())));
188*c8dee2aaSAndroid Build Coastguard Worker }
189*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_xyzw,r)190*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_xyzw, r) {
191*c8dee2aaSAndroid Build Coastguard Worker     float4 f = float4{1,2,3,4};
192*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(1,2,3,4)));
193*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(1,2,float2(3,4))));
194*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(float2(1,2),3,4)));
195*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(float2(1,2),float2(3,4))));
196*c8dee2aaSAndroid Build Coastguard Worker     f.xy() = float2(9,8);
197*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(9,8,3,4)));
198*c8dee2aaSAndroid Build Coastguard Worker     f.zw().x() = 7;
199*c8dee2aaSAndroid Build Coastguard Worker     f.zw().y() = 6;
200*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(9,8,7,6)));
201*c8dee2aaSAndroid Build Coastguard Worker     f.x() = 5;
202*c8dee2aaSAndroid Build Coastguard Worker     f.y() = 4;
203*c8dee2aaSAndroid Build Coastguard Worker     f.z() = 3;
204*c8dee2aaSAndroid Build Coastguard Worker     f.w() = 2;
205*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(5,4,3,2)));
206*c8dee2aaSAndroid Build Coastguard Worker     f[0] = 0;
207*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.x() == 0);
208*c8dee2aaSAndroid Build Coastguard Worker     f[1] = 1;
209*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.y() == 1);
210*c8dee2aaSAndroid Build Coastguard Worker     f[2] = 2;
211*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.z() == 2);
212*c8dee2aaSAndroid Build Coastguard Worker     f[3] = 3;
213*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.w() == 3);
214*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.xy() == float2(0,1)));
215*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.zw() == float2{2,3}));
216*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f == float4(0,1,2,3)));
217*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.yxwz().lo == shuffle<1,0>(f)));
218*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.yxwz().hi == shuffle<3,2>(f)));
219*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.zwxy().lo.lo == f.z()));
220*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.zwxy().lo.hi == f.w()));
221*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.zwxy().hi.lo == f.x()));
222*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(f.zwxy().hi.hi == f.y()));
223*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.yxwz().lo.lo.val == f.y());
224*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.yxwz().lo.hi.val == f.x());
225*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.yxwz().hi.lo.val == f.w());
226*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, f.yxwz().hi.hi.val == f.z());
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(naive_if_then_else(int2(0,~0),
229*c8dee2aaSAndroid Build Coastguard Worker                                               shuffle<3,2>(float4(0,1,2,3)),
230*c8dee2aaSAndroid Build Coastguard Worker                                               float4(4,5,6,7).xy()) == float2(4,2)));
231*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(if_then_else(int2(0,~0),
232*c8dee2aaSAndroid Build Coastguard Worker                                         shuffle<3,2>(float4(0,1,2,3)),
233*c8dee2aaSAndroid Build Coastguard Worker                                         float4(4,5,6,7).xy()) == float2(4,2)));
234*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(naive_if_then_else(int2(0,~0).xyxy(),
235*c8dee2aaSAndroid Build Coastguard Worker                                               float4(0,1,2,3).zwxy(),
236*c8dee2aaSAndroid Build Coastguard Worker                                               float4(4,5,6,7)) == float4(4,3,6,1)));
237*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(if_then_else(int2(0,~0).xyxy(),
238*c8dee2aaSAndroid Build Coastguard Worker                                         float4(0,1,2,3).zwxy(),
239*c8dee2aaSAndroid Build Coastguard Worker                                         float4(4,5,6,7)) == float4(4,3,6,1)));
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, all(pin(float4(0,1,2,3).yxwz(),
242*c8dee2aaSAndroid Build Coastguard Worker                                float2(1).xyxy(),
243*c8dee2aaSAndroid Build Coastguard Worker                                float2(2).xyxy()) == float4(1,1,2,2)));
244*c8dee2aaSAndroid Build Coastguard Worker }
245*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_cross_dot,r)246*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_cross_dot, r) {
247*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, cross(int2{0,1}, int2{0,1}) == 0);
248*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, cross(int2{1,0}, int2{1,0}) == 0);
249*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, cross(int2{1,1}, int2{1,1}) == 0);
250*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, cross(int2{1,1}, int2{1,-1}) == -2);
251*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, cross(int2{1,1}, int2{-1,1}) == 2);
252*c8dee2aaSAndroid Build Coastguard Worker 
253*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, dot(int2{0,1}, int2{1,0}) == 0);
254*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, dot(int2{1,0}, int2{0,1}) == 0);
255*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, dot(int2{1,1}, int2{1,-1}) == 0);
256*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, dot(int2{1,1}, int2{1,1}) == 2);
257*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, dot(int2{1,1}, int2{-1,-1}) == -2);
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker     SkRandom rand;
260*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 100; ++i) {
261*c8dee2aaSAndroid Build Coastguard Worker         float a=rand.nextRangeF(-1,1), b=rand.nextRangeF(-1,1), c=rand.nextRangeF(-1,1),
262*c8dee2aaSAndroid Build Coastguard Worker               d=rand.nextRangeF(-1,1);
263*c8dee2aaSAndroid Build Coastguard Worker         constexpr static float kTolerance = 1.f / (1 << 20);
264*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(
265*c8dee2aaSAndroid Build Coastguard Worker                 cross(float2{a,b}, float2{c,d}), SkPoint::CrossProduct({a,b}, {c,d}), kTolerance));
266*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(
267*c8dee2aaSAndroid Build Coastguard Worker                 dot(float2{a,b}, float2{c,d}), SkPoint::DotProduct({a,b}, {c,d}), kTolerance));
268*c8dee2aaSAndroid Build Coastguard Worker     }
269*c8dee2aaSAndroid Build Coastguard Worker 
270*c8dee2aaSAndroid Build Coastguard Worker     auto assertDoublesEqual = [&](double left, double right) {
271*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(left, right), "%f != %f", left, right);
272*c8dee2aaSAndroid Build Coastguard Worker     };
273*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(cross(double2{1.2, 3.4}, double2{3.4, -1.2}),          -13.000000);
274*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(cross(double2{12.34, 5.6}, double2{7.8, -9.0}),       -154.740000);
275*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(cross(double2{12.34, 5.6}, double2{7.8, 9.012345678}),  67.532346);
276*c8dee2aaSAndroid Build Coastguard Worker }
277*c8dee2aaSAndroid Build Coastguard Worker 
check_strided_loads(skiatest::Reporter * r)278*c8dee2aaSAndroid Build Coastguard Worker template<int N, typename T> void check_strided_loads(skiatest::Reporter* r) {
279*c8dee2aaSAndroid Build Coastguard Worker     using Vec = Vec<N,T>;
280*c8dee2aaSAndroid Build Coastguard Worker     T values[N*4];
281*c8dee2aaSAndroid Build Coastguard Worker     std::iota(values, values + N*4, 0);
282*c8dee2aaSAndroid Build Coastguard Worker     Vec a, b, c, d;
283*c8dee2aaSAndroid Build Coastguard Worker     strided_load2(values, a, b);
284*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < N; ++i) {
285*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, a[i] == values[i*2]);
286*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, b[i] == values[i*2 + 1]);
287*c8dee2aaSAndroid Build Coastguard Worker     }
288*c8dee2aaSAndroid Build Coastguard Worker     strided_load4(values, a, b, c, d);
289*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < N; ++i) {
290*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, a[i] == values[i*4]);
291*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, b[i] == values[i*4 + 1]);
292*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, c[i] == values[i*4 + 2]);
293*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, d[i] == values[i*4 + 3]);
294*c8dee2aaSAndroid Build Coastguard Worker     }
295*c8dee2aaSAndroid Build Coastguard Worker }
296*c8dee2aaSAndroid Build Coastguard Worker 
check_strided_loads(skiatest::Reporter * r)297*c8dee2aaSAndroid Build Coastguard Worker template<typename T> void check_strided_loads(skiatest::Reporter* r) {
298*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<1,T>(r);
299*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<2,T>(r);
300*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<4,T>(r);
301*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<8,T>(r);
302*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<16,T>(r);
303*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<32,T>(r);
304*c8dee2aaSAndroid Build Coastguard Worker }
305*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_strided_loads,r)306*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_strided_loads, r) {
307*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<uint32_t>(r);
308*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<uint16_t>(r);
309*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<uint8_t>(r);
310*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<int32_t>(r);
311*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<int16_t>(r);
312*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<int8_t>(r);
313*c8dee2aaSAndroid Build Coastguard Worker     check_strided_loads<float>(r);
314*c8dee2aaSAndroid Build Coastguard Worker }
315*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_ScaledDividerU32,r)316*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_ScaledDividerU32, r) {
317*c8dee2aaSAndroid Build Coastguard Worker     static constexpr uint32_t kMax = std::numeric_limits<uint32_t>::max();
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     auto errorBounds = [&](uint32_t actual, uint32_t expected) {
320*c8dee2aaSAndroid Build Coastguard Worker         uint32_t lowerLimit = expected == 0 ? 0 : expected - 1,
321*c8dee2aaSAndroid Build Coastguard Worker                  upperLimit = expected == kMax ? kMax : expected + 1;
322*c8dee2aaSAndroid Build Coastguard Worker         return lowerLimit <= actual && actual <= upperLimit;
323*c8dee2aaSAndroid Build Coastguard Worker     };
324*c8dee2aaSAndroid Build Coastguard Worker 
325*c8dee2aaSAndroid Build Coastguard Worker     auto test = [&](uint32_t denom) {
326*c8dee2aaSAndroid Build Coastguard Worker         // half == 1 so, the max to check is kMax-1
327*c8dee2aaSAndroid Build Coastguard Worker         ScaledDividerU32 d(denom);
328*c8dee2aaSAndroid Build Coastguard Worker         uint32_t maxCheck = static_cast<uint32_t>(
329*c8dee2aaSAndroid Build Coastguard Worker                 std::floor((double)(kMax - d.half()) / denom + 0.5));
330*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, errorBounds(d.divide((kMax))[0], maxCheck));
331*c8dee2aaSAndroid Build Coastguard Worker         for (uint32_t i = 0; i < kMax - d.half(); i += 65535) {
332*c8dee2aaSAndroid Build Coastguard Worker             uint32_t expected = static_cast<uint32_t>(std::floor((double)i / denom + 0.5));
333*c8dee2aaSAndroid Build Coastguard Worker             auto actual = d.divide(i + d.half());
334*c8dee2aaSAndroid Build Coastguard Worker             if (!errorBounds(actual[0], expected)) {
335*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("i: %u expected: %u actual: %u\n", i, expected, actual[0]);
336*c8dee2aaSAndroid Build Coastguard Worker             }
337*c8dee2aaSAndroid Build Coastguard Worker             // Make sure all the lanes are the same.
338*c8dee2aaSAndroid Build Coastguard Worker             for (int e = 1; e < 4; e++) {
339*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(actual[0] == actual[e]);
340*c8dee2aaSAndroid Build Coastguard Worker             }
341*c8dee2aaSAndroid Build Coastguard Worker         }
342*c8dee2aaSAndroid Build Coastguard Worker     };
343*c8dee2aaSAndroid Build Coastguard Worker 
344*c8dee2aaSAndroid Build Coastguard Worker     test(2);
345*c8dee2aaSAndroid Build Coastguard Worker     test(3);
346*c8dee2aaSAndroid Build Coastguard Worker     test(5);
347*c8dee2aaSAndroid Build Coastguard Worker     test(7);
348*c8dee2aaSAndroid Build Coastguard Worker     test(27);
349*c8dee2aaSAndroid Build Coastguard Worker     test(65'535);
350*c8dee2aaSAndroid Build Coastguard Worker     test(15'485'863);
351*c8dee2aaSAndroid Build Coastguard Worker     test(512'927'377);
352*c8dee2aaSAndroid Build Coastguard Worker }
353*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_saturated_add,r)354*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_saturated_add, r) {
355*c8dee2aaSAndroid Build Coastguard Worker     for (int a = 0; a < (1<<8); a++) {
356*c8dee2aaSAndroid Build Coastguard Worker         for (int b = 0; b < (1<<8); b++) {
357*c8dee2aaSAndroid Build Coastguard Worker             int exact = a+b;
358*c8dee2aaSAndroid Build Coastguard Worker             if (exact > 255) { exact = 255; }
359*c8dee2aaSAndroid Build Coastguard Worker             if (exact <   0) { exact =   0; }
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(r, saturated_add(skvx::byte16(a), skvx::byte16(b))[0] == exact);
362*c8dee2aaSAndroid Build Coastguard Worker         }
363*c8dee2aaSAndroid Build Coastguard Worker     }
364*c8dee2aaSAndroid Build Coastguard Worker }
365*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_length,r)366*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_length, r) {
367*c8dee2aaSAndroid Build Coastguard Worker     auto assertFloatsEqual = [&](float left, float right) {
368*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(left, right), "%f != %f", left, right);
369*c8dee2aaSAndroid Build Coastguard Worker     };
370*c8dee2aaSAndroid Build Coastguard Worker     auto assertDoublesEqual = [&](double left, double right) {
371*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(left, right), "%f != %f", left, right);
372*c8dee2aaSAndroid Build Coastguard Worker     };
373*c8dee2aaSAndroid Build Coastguard Worker 
374*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float2{0, 1}),       1.000000f);
375*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float2{2, 0}),       2.000000f);
376*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float2{3, 4}),       5.000000f);
377*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float2{1, 1}),       1.414214f);
378*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float2{2.5f, 2.5f}), 3.535534f);
379*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(length(float4{1, 2, 3, 4}), 5.477226f);
380*c8dee2aaSAndroid Build Coastguard Worker 
381*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(length(double2{2.5, 2.5}),           3.535534);
382*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(length(double4{1.5, 2.5, 3.5, 4.5}), 6.403124);
383*c8dee2aaSAndroid Build Coastguard Worker }
384*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_normalize,r)385*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_normalize, r) {
386*c8dee2aaSAndroid Build Coastguard Worker     auto assertFloatsEqual = [&](float left, float right) {
387*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(left, right), "%f != %f", left, right);
388*c8dee2aaSAndroid Build Coastguard Worker     };
389*c8dee2aaSAndroid Build Coastguard Worker     auto assertDoublesEqual = [&](double left, double right) {
390*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, SkScalarNearlyEqual(left, right), "%f != %f", left, right);
391*c8dee2aaSAndroid Build Coastguard Worker     };
392*c8dee2aaSAndroid Build Coastguard Worker 
393*c8dee2aaSAndroid Build Coastguard Worker     skvx::float2 twoFloats = normalize(skvx::float2{1.2f, 3.4f});
394*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(twoFloats[0], 0.332820f);
395*c8dee2aaSAndroid Build Coastguard Worker     assertFloatsEqual(twoFloats[1], 0.942990f);
396*c8dee2aaSAndroid Build Coastguard Worker 
397*c8dee2aaSAndroid Build Coastguard Worker     skvx::double2 twoDoubles = normalize(skvx::double2{2.3, -4.5});
398*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(twoDoubles[0],  0.455111);
399*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(twoDoubles[1], -0.890435);
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker     skvx::double4 fourDoubles = normalize(skvx::double4{1.2, 3.4, 5.6, 7.8});
402*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(fourDoubles[0],  0.116997);
403*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(fourDoubles[1],  0.331490);
404*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(fourDoubles[2],  0.545984);
405*c8dee2aaSAndroid Build Coastguard Worker     assertDoublesEqual(fourDoubles[3],  0.760478);
406*c8dee2aaSAndroid Build Coastguard Worker }
407*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_normalize_infinity_and_nan,r)408*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_normalize_infinity_and_nan, r) {
409*c8dee2aaSAndroid Build Coastguard Worker     skvx::float2 zeroLenVec = normalize(skvx::float2{0, 0});
410*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, std::isnan(zeroLenVec[0]), "%f is not nan", zeroLenVec[0]);
411*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, std::isnan(zeroLenVec[1]), "%f is not nan", zeroLenVec[1]);
412*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !isfinite(zeroLenVec));
413*c8dee2aaSAndroid Build Coastguard Worker 
414*c8dee2aaSAndroid Build Coastguard Worker     skvx::float2 tooBigVec = normalize(skvx::float2{std::numeric_limits<float>::max(),
415*c8dee2aaSAndroid Build Coastguard Worker                                                     std::numeric_limits<float>::max()});
416*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, tooBigVec[0] == 0, "%f != 0", tooBigVec[0]);
417*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, tooBigVec[1] == 0, "%f != 0", tooBigVec[1]);
418*c8dee2aaSAndroid Build Coastguard Worker 
419*c8dee2aaSAndroid Build Coastguard Worker     skvx::double2 tooBigVecD = normalize(skvx::double2{std::numeric_limits<double>::max(),
420*c8dee2aaSAndroid Build Coastguard Worker                                                        std::numeric_limits<double>::max()});
421*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, tooBigVecD[0] == 0, "%f != 0", tooBigVecD[0]);
422*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, tooBigVecD[1] == 0, "%f != 0", tooBigVecD[1]);
423*c8dee2aaSAndroid Build Coastguard Worker }
424*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkVx_isfinite,r)425*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkVx_isfinite, r) {
426*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, isfinite(skvx::float2{0, 0}));
427*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, isfinite(skvx::double4{1.2, 3.4, 5.6, 7.8}));
428*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, isfinite(skvx::float8{8, 7, 6, 5, 4, 3, 2, 1}));
429*c8dee2aaSAndroid Build Coastguard Worker 
430*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !isfinite(skvx::float2{0, NAN}));
431*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !isfinite(skvx::float2{INFINITY, 10}));
432*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, !isfinite(skvx::float2{NAN, INFINITY}));
433*c8dee2aaSAndroid Build Coastguard Worker 
434*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 4; i++) {
435*c8dee2aaSAndroid Build Coastguard Worker         auto v = skvx::double4{4, 3, 2, 1};
436*c8dee2aaSAndroid Build Coastguard Worker         v[i] = INFINITY;
437*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !isfinite(v), "index %d INFINITY", i);
438*c8dee2aaSAndroid Build Coastguard Worker         v[i] = NAN;
439*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !isfinite(v), "index %d NAN", i);
440*c8dee2aaSAndroid Build Coastguard Worker     }
441*c8dee2aaSAndroid Build Coastguard Worker 
442*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 8; i++) {
443*c8dee2aaSAndroid Build Coastguard Worker         auto v = skvx::float8{8, 7, 6, 5, 4, 3, 2, 1};
444*c8dee2aaSAndroid Build Coastguard Worker         v[i] = INFINITY;
445*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !isfinite(v), "index %d INFINITY", i);
446*c8dee2aaSAndroid Build Coastguard Worker         v[i] = NAN;
447*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(r, !isfinite(v), "index %d NAN", i);
448*c8dee2aaSAndroid Build Coastguard Worker     }
449*c8dee2aaSAndroid Build Coastguard Worker }
450*c8dee2aaSAndroid Build Coastguard Worker 
451*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skvx
452