@@ -26,22 +26,39 @@ SYCL_ESIMD_FUNCTION auto test_simd_view_bin_ops() {
26
26
return ref0 + ref1;
27
27
}
28
28
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
+ }
45
62
46
63
SYCL_ESIMD_FUNCTION bool test_simd_view_unary_ops () {
47
64
simd<int , 16 > v0 = 1 ;
@@ -224,3 +241,65 @@ void test_simd_view_len1_binop() SYCL_ESIMD_FUNCTION {
224
241
auto v2 = s.select <2 , 1 >(0 );
225
242
auto x = v1 * v2;
226
243
}
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