1 /* { dg-do run } */
2 /* { dg-options "-O3 -save-temps" } */
3 #include <stdint.h>
4 #include <string.h>
5
6 #pragma GCC target "+nosve"
7
8 #define ARR_SIZE 1024
9
10 /* Should produce an uaddl */
11 void uadd_opt (uint32_t *foo, uint16_t *a, uint16_t *b)
12 {
13 for( int i = 0; i < ARR_SIZE - 3;i=i+4)
14 {
15 foo[i] = a[i] + b[i];
16 foo[i+1] = a[i+1] + b[i+1];
17 foo[i+2] = a[i+2] + b[i+2];
18 foo[i+3] = a[i+3] + b[i+3];
19 }
20 }
21
22 __attribute__((optimize (0)))
23 void uadd_nonopt (uint32_t *foo, uint16_t *a, uint16_t *b)
24 {
25 for( int i = 0; i < ARR_SIZE - 3;i=i+4)
26 {
27 foo[i] = a[i] + b[i];
28 foo[i+1] = a[i+1] + b[i+1];
29 foo[i+2] = a[i+2] + b[i+2];
30 foo[i+3] = a[i+3] + b[i+3];
31 }
32 }
33
34 /* Should produce an saddl */
35 void sadd_opt (int32_t *foo, int16_t *a, int16_t *b)
36 {
37 for( int i = 0; i < ARR_SIZE - 3;i=i+4)
38 {
39 foo[i] = a[i] + b[i];
40 foo[i+1] = a[i+1] + b[i+1];
41 foo[i+2] = a[i+2] + b[i+2];
42 foo[i+3] = a[i+3] + b[i+3];
43 }
44 }
45
46 __attribute__((optimize (0)))
47 void sadd_nonopt (int32_t *foo, int16_t *a, int16_t *b)
48 {
49 for( int i = 0; i < ARR_SIZE - 3;i=i+4)
50 {
51 foo[i] = a[i] + b[i];
52 foo[i+1] = a[i+1] + b[i+1];
53 foo[i+2] = a[i+2] + b[i+2];
54 foo[i+3] = a[i+3] + b[i+3];
55 }
56 }
57
58
59 void __attribute__((optimize (0)))
60 init(uint16_t *a, uint16_t *b)
61 {
62 for( int i = 0; i < ARR_SIZE;i++)
63 {
64 a[i] = i;
65 b[i] = 2*i;
66 }
67 }
68
69 int __attribute__((optimize (0)))
70 main()
71 {
72 uint32_t foo_arr[ARR_SIZE];
73 uint32_t bar_arr[ARR_SIZE];
74 uint16_t a[ARR_SIZE];
75 uint16_t b[ARR_SIZE];
76
77 init(a, b);
78 uadd_opt(foo_arr, a, b);
79 uadd_nonopt(bar_arr, a, b);
80 if (memcmp(foo_arr, bar_arr, ARR_SIZE) != 0)
81 return 1;
82 sadd_opt((int32_t*) foo_arr, (int16_t*) a, (int16_t*) b);
83 sadd_nonopt((int32_t*) bar_arr, (int16_t*) a, (int16_t*) b);
84 if (memcmp(foo_arr, bar_arr, ARR_SIZE) != 0)
85 return 1;
86 return 0;
87 }
88
89 /* { dg-final { scan-assembler-times {\tuaddl\t} 1} } */
90 /* { dg-final { scan-assembler-times {\tuaddl2\t} 1} } */
91 /* { dg-final { scan-assembler-times {\tsaddl\t} 1} } */
92 /* { dg-final { scan-assembler-times {\tsaddl2\t} 1} } */