swar-pragma.c
1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
////A: --has-swar
//C: -daiteq-swar-enable
#define NUMELMS 20
#define BITSZ 8
typedef unsigned int swpack __attribute__((subword(BITSZ)));
typedef unsigned int swelm __attribute__((subword(BITSZ,1)));
#define PACKING (32/BITSZ)
#define ARRAY_SIZE ((NUMELMS+PACKING-1)/PACKING)
//const swpack a[ARRAY_SIZE] = {{1,2,3,4,5,6,7,0,1,2}, {1,3,5,7,0,2,4,6,2,3}};
//const swpack b[ARRAY_SIZE] = {{1,1,1,1,1,1,1,1,1,1}, {7,3,5,1,6,4,2,0,5,3}};
const swpack a[ARRAY_SIZE] = {{1,2,3,4},{5,6,7,0},{1,2,1,3},{5,7,0,2},{4,6,2,3}};
const swpack b[ARRAY_SIZE] = {{1,1,1,1},{1,1,1,1},{1,1,7,3},{5,1,6,4},{2,0,5,3}};
swpack z[ARRAY_SIZE];
void do_add(unsigned n, swpack a[], swpack b[], swpack z[])
{
for(unsigned i=0;i<n;++i) { /* curly braces are necessary for generation of builtin_swarctrl */
z[i] = a[i] + b[i];
}
}
void do_add_sat(unsigned n, swpack *a, swpack *b, swpack *z)
{
#pragma swar saturate
for(unsigned i=0;i<n;++i) {
z[i] = a[i] + b[i];
}
}
void do_add_red(unsigned n, swpack *a, swpack *b, swpack *z)
{
#pragma swar reduce
for(unsigned i=0;i<n;++i) {
z[i] = a[i] + b[i];
}
}
void do_add_sat_red(unsigned n, swpack *a, swpack *b, swpack *z)
{
#pragma swar reduce
#pragma swar saturate
for(unsigned i=0;i<n;++i) {
z[i] = a[i] + b[i];
}
}
int main(void)
{
// unsigned int a;
do_add(10, a, b, z);
do_add_sat(10, a, b, z);
do_add_red(10, a, b, z);
do_add_sat_red(10, a, b, z);
//{
//__builtin_swarctrl(1);
//#pragma swar saturate
//__builtin_swarctrl(8);
//#pragma swar reduce
//__builtin_swarctrl(4);
//{
//#pragma swar normalize
//__builtin_swarctrl(16);
//}
//}
//__builtin_swarctrl(0);
return 0;
}