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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/* Make sure that vector comaprison results are not unnecessarily ANDed
with vectors of 1. */
/* { dg-do compile } */
/* { dg-options "-O2 -ftree-vectorize" } */
#pragma GCC target "+nosve"
#define COUNT1(X) if (X) count += 1
#define COUNT2(X) if (X) count -= 1
#define COUNT3(X) count += (X)
#define COUNT4(X) count -= (X)
#define COND1(X) (X)
#define COND2(X) ((X) ? 1 : 0)
#define COND3(X) ((X) ? -1 : 0)
#define COND4(X) ((X) ? 0 : 1)
#define COND5(X) ((X) ? 0 : -1)
#define TEST_LT(X, Y) ((X) < (Y))
#define TEST_LE(X, Y) ((X) <= (Y))
#define TEST_GT(X, Y) ((X) > (Y))
#define TEST_GE(X, Y) ((X) >= (Y))
#define TEST_EQ(X, Y) ((X) == (Y))
#define TEST_NE(X, Y) ((X) != (Y))
#define COUNT_LOOP(ID, TYPE, CMP_ARRAY, TEST, COUNT) \
TYPE \
reduc_##ID (__typeof__ (CMP_ARRAY[0]) x) \
{ \
TYPE count = 0; \
for (unsigned int i = 0; i < 1024; ++i) \
COUNT (TEST (CMP_ARRAY[i], x)); \
return count; \
}
#define COND_LOOP(ID, ARRAY, CMP_ARRAY, TEST, COND) \
void \
plus_##ID (__typeof__ (CMP_ARRAY[0]) x) \
{ \
for (unsigned int i = 0; i < 1024; ++i) \
ARRAY[i] += COND (TEST (CMP_ARRAY[i], x)); \
} \
void \
plusc_##ID (void) \
{ \
for (unsigned int i = 0; i < 1024; ++i) \
ARRAY[i] += COND (TEST (CMP_ARRAY[i], 10)); \
} \
void \
minus_##ID (__typeof__ (CMP_ARRAY[0]) x) \
{ \
for (unsigned int i = 0; i < 1024; ++i) \
ARRAY[i] -= COND (TEST (CMP_ARRAY[i], x)); \
} \
void \
minusc_##ID (void) \
{ \
for (unsigned int i = 0; i < 1024; ++i) \
ARRAY[i] += COND (TEST (CMP_ARRAY[i], 1)); \
}
#define ALL_LOOPS(ID, ARRAY, CMP_ARRAY, TEST) \
typedef __typeof__(ARRAY[0]) ID##_type; \
COUNT_LOOP (ID##_1, ID##_type, CMP_ARRAY, TEST, COUNT1) \
COUNT_LOOP (ID##_2, ID##_type, CMP_ARRAY, TEST, COUNT2) \
COUNT_LOOP (ID##_3, ID##_type, CMP_ARRAY, TEST, COUNT3) \
COUNT_LOOP (ID##_4, ID##_type, CMP_ARRAY, TEST, COUNT4) \
COND_LOOP (ID##_1, ARRAY, CMP_ARRAY, TEST, COND1) \
COND_LOOP (ID##_2, ARRAY, CMP_ARRAY, TEST, COND2) \
COND_LOOP (ID##_3, ARRAY, CMP_ARRAY, TEST, COND3) \
COND_LOOP (ID##_4, ARRAY, CMP_ARRAY, TEST, COND4) \
COND_LOOP (ID##_5, ARRAY, CMP_ARRAY, TEST, COND5)
signed int asi[1024] __attribute__ ((aligned (16)));
unsigned int aui[1024] __attribute__ ((aligned (16)));
signed long long asl[1024] __attribute__ ((aligned (16)));
unsigned long long aul[1024] __attribute__ ((aligned (16)));
float af[1024] __attribute__ ((aligned (16)));
double ad[1024] __attribute__ ((aligned (16)));
ALL_LOOPS (si_si, aui, asi, TEST_LT)
ALL_LOOPS (ui_si, aui, asi, TEST_LE)
ALL_LOOPS (si_ui, aui, asi, TEST_GT)
ALL_LOOPS (ui_ui, aui, asi, TEST_GE)
ALL_LOOPS (sl_sl, asl, asl, TEST_NE)
ALL_LOOPS (ul_ul, aul, aul, TEST_EQ)
ALL_LOOPS (si_f, asi, af, TEST_LE)
ALL_LOOPS (ui_f, aui, af, TEST_GT)
ALL_LOOPS (sl_d, asl, ad, TEST_GE)
ALL_LOOPS (ul_d, aul, ad, TEST_GT)
/* { dg-final { scan-assembler-not "\tand\t" } } */
/* { dg-final { scan-assembler-not "\tld\[^\t\]*\t\[wx\]" } } */
/* { dg-final { scan-assembler-not "\tst\[^\t\]*\t\[wx\]" } } */
/* { dg-final { scan-assembler "\tldr\tq" } } */
/* { dg-final { scan-assembler "\tstr\tq" } } */
|