@@ -26,22 +26,39 @@ SYCL_ESIMD_FUNCTION auto test_simd_view_bin_ops() {
2626 return ref0 + ref1;
2727}
2828
29- // auto test_simd_view_bitwise_ops() __attribute__((sycl_device)) {
30- // simd<int, 16> v0 = 1;
31- // simd<int, 16> v1 = 2;
32- // auto ref0 = v0.select<8, 2>(0);
33- // auto ref1 = v1.select<8, 2>(0);
34- // simd<int, 8> v2 = (ref0 | ref1) & (ref0 | 3);
35- // ref0 |= 3;
36- // ref0 |= ref1;
37- // simd<int, 8> v3 = (ref0 ^ ref1) & (ref0 ^ 3);
38- // ref0 ^= 3;
39- // ref0 ^= ref1;
40- // simd<int, 8> v4 = (ref0 & ref1) | (ref0 & 3);
41- // ref0 &= 3;
42- // ref0 &= ref1;
43- // return ref0;
44- // }
29+ SYCL_ESIMD_FUNCTION auto test_simd_view_bitwise_ops () {
30+ simd<int , 16 > v0 = 1 ;
31+ simd<int , 16 > v1 = 2 ;
32+ auto ref0 = v0.select <8 , 2 >(0 );
33+ auto ref1 = v1.select <8 , 2 >(0 );
34+ simd<int , 8 > v2 = (ref0 | ref1) & (ref0 | 3 );
35+ ref0 |= 3 ;
36+ ref0 |= ref1;
37+ simd<int , 8 > v3 = (ref0 ^ ref1) & (ref0 ^ 3 );
38+ ref0 ^= 3 ;
39+ ref0 ^= ref1;
40+ simd<int , 8 > v4 = (ref0 & ref1) | (ref0 & 3 );
41+ ref0 &= 3 ;
42+ ref0 &= ref1;
43+ return ref0;
44+ }
45+
46+ SYCL_ESIMD_FUNCTION auto test_simd_mask_view_bitwise_ops () {
47+ simd_mask<16 > v0 = 1 ;
48+ simd_mask<16 > v1 = 2 ;
49+ auto ref0 = v0.select <8 , 2 >(0 );
50+ auto ref1 = v1.select <8 , 2 >(0 );
51+ simd_mask<8 > v2 = (ref0 | ref1) & (ref0 | 3 );
52+ ref0 |= 3 ;
53+ ref0 |= ref1;
54+ simd_mask<8 > v3 = (ref0 ^ ref1) & (ref0 ^ 3 );
55+ ref0 ^= 3 ;
56+ ref0 ^= ref1;
57+ simd_mask<8 > v4 = (ref0 & ref1) | (ref0 & 3 );
58+ ref0 &= 3 ;
59+ ref0 &= ref1;
60+ return ref0;
61+ }
4562
4663SYCL_ESIMD_FUNCTION bool test_simd_view_unary_ops () {
4764 simd<int , 16 > v0 = 1 ;
@@ -224,3 +241,65 @@ void test_simd_view_len1_binop() SYCL_ESIMD_FUNCTION {
224241 auto v2 = s.select <2 , 1 >(0 );
225242 auto x = v1 * v2;
226243}
244+
245+ void test_simd_view_assign_op () SYCL_ESIMD_FUNCTION {
246+ // multiple elements
247+ {
248+ #define N 4
249+ // simd - assign views of different element type
250+ simd<float , 32 > v1 = 0 ;
251+ simd<short , 16 > v2 = 0 ;
252+ // - region is a region type (top-level region)
253+ v1.select <N, 2 >(0 ) = v2.select <N, 2 >(0 );
254+ v2.select <N, 2 >(0 ) = v1.select <N, 2 >(0 );
255+ // - region is a std::pair (nested region)
256+ v1.select <8 , 2 >(0 ).select <N, 1 >(1 ) = v2.select <8 , 2 >(0 ).select <N, 1 >(1 );
257+ v2.select <8 , 2 >(0 ).select <N, 1 >(1 ) = v1.select <8 , 2 >(0 ).select <N, 1 >(1 );
258+ // - first region is top-level, second - nested
259+ v1.select <4 , 2 >(0 ) = v2.select <8 , 2 >(0 ).select <4 , 1 >(1 );
260+ // - first region is nested, second - top-level
261+ v2.select <8 , 2 >(0 ).select <4 , 1 >(1 ) = v1.select <4 , 2 >(0 );
262+
263+ // simd_mask
264+ simd_mask<32 > m1 = 0 ;
265+ simd_mask<16 > m2 = 0 ;
266+ // - region is a region type (top-level region)
267+ m1.select <4 , 2 >(0 ) = m2.select <4 , 2 >(0 );
268+ m2.select <4 , 2 >(0 ) = m1.select <4 , 2 >(0 );
269+ // - region is a std::pair (nested region)
270+ m1.select <8 , 2 >(0 ).select <N, 1 >(1 ) = m2.select <8 , 2 >(0 ).select <N, 1 >(1 );
271+ m2.select <8 , 2 >(0 ).select <N, 1 >(1 ) = m1.select <8 , 2 >(0 ).select <N, 1 >(1 );
272+ // - first region is top-level, second - nested
273+ m1.select <4 , 2 >(0 ) = m2.select <8 , 2 >(0 ).select <4 , 1 >(1 );
274+ // - first region is nested, second - top-level
275+ m2.select <8 , 2 >(0 ).select <4 , 1 >(1 ) = m1.select <4 , 2 >(0 );
276+ #undef N
277+ }
278+ // single element
279+ {
280+ #define N 1
281+ // simd - assign views of different element type
282+ simd<float , 16 > v1 = 0 ;
283+ simd<short , 8 > v2 = 0 ;
284+ // - region is a region type (top-level region)
285+ v1.select <N, 1 >(0 ) = v2.select <N, 1 >(0 );
286+ v2[0 ] = v1[0 ];
287+ v2[1 ] = v1.select <N, 1 >(1 );
288+ // - region is a std::pair (nested region)
289+ v1.select <4 , 2 >(0 ).select <N, 1 >(1 ) = v2.select <4 , 2 >(0 ).select <N, 1 >(1 );
290+ v2.select <4 , 2 >(0 ).select <N, 1 >(1 ) = v1.select <4 , 2 >(0 ).select <N, 1 >(1 );
291+
292+ // simd_mask
293+ simd_mask<16 > m1 = 0 ;
294+ simd_mask<8 > m2 = 0 ;
295+ // - region is a region type (top-level region)
296+ m1.select <N, 1 >(0 ) = m2.select <N, 1 >(0 );
297+ m2[0 ] = m1[0 ];
298+ m2[1 ] = m1.select <N, 1 >(1 );
299+ // - region is a std::pair (nested region)
300+ m1.select <4 , 2 >(0 ).select <N, 1 >(1 ) = m2.select <4 , 2 >(0 ).select <N, 1 >(1 );
301+ m2.select <4 , 2 >(0 )[1 ] = m1.select <4 , 2 >(0 )[1 ];
302+ m2.select <4 , 2 >(0 )[2 ] = m1.select <4 , 2 >(0 ).select <N, 1 >(2 );
303+ #undef N
304+ }
305+ }
0 commit comments