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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } } */
/* { dg-require-effective-target powerpc_vsx_ok } */
/* { dg-options "-O2 -mdejagnu-cpu=power7 -fno-inline-functions" } */
/* Test simple extract/insert/slat operations. Make sure all types are
supported with various options. */
#include <altivec.h>
int c0 = 0;
int c1 = 1;
int c3 = 3;
int c7 = 7;
int c15 = 15;
double extract_df_0_reg (vector double p) { return vec_extract (p, c0); }
double extract_df_1_reg (vector double p) { return vec_extract (p, c1); }
double extract_df_n_reg (vector double p, int n) { return vec_extract (p, n); }
double extract_df_0_mem (vector double *p) { return vec_extract (*p, c0); }
double extract_df_1_mem (vector double *p) { return vec_extract (*p, c1); }
double extract_df_n_mem (vector double *p, int n) { return vec_extract (*p, n); }
vector double insert_df_0 (vector double p, double x) { return vec_insert (x, p, c0); }
vector double insert_df_1 (vector double p, double x) { return vec_insert (x, p, c1); }
vector double insert_df_n (vector double p, double x, int n) { return vec_insert (x, p, n); }
vector double splat_df_reg (double x) { return vec_splats (x); }
vector double splat_df_mem (double *x) { return vec_splats (*x); }
#ifdef _ARCH_PPC64
#define ll long
#else
#define ll long long
#endif
ll extract_di_0_reg (vector ll p) { return vec_extract (p, c0); }
ll extract_di_1_reg (vector ll p) { return vec_extract (p, c1); }
ll extract_di_n_reg (vector ll p, int n) { return vec_extract (p, n); }
ll extract_di_0_mem (vector ll *p) { return vec_extract (*p, c0); }
ll extract_di_1_mem (vector ll *p) { return vec_extract (*p, c1); }
ll extract_di_n_mem (vector ll *p, int n) { return vec_extract (*p, n); }
vector ll insert_di_0 (vector ll p, ll x) { return vec_insert (x, p, c0); }
vector ll insert_di_1 (vector ll p, ll x) { return vec_insert (x, p, c1); }
vector ll insert_di_n (vector ll p, ll x, int n) { return vec_insert (x, p, n); }
vector ll insert_di_0_v2 (vector ll int p, ll int x) { return vec_insert (x, p, c0); }
vector unsigned ll insert_di_0_v3 (vector unsigned ll int p, unsigned ll int x) { return vec_insert (x, p, c0); }
vector ll splat_di_reg (ll x) { return vec_splats (x); }
vector ll splat_di_mem (ll *x) { return vec_splats (*x); }
float extract_sf_0_reg (vector float p) { return vec_extract (p, c0); }
float extract_sf_3_reg (vector float p) { return vec_extract (p, c3); }
float extract_sf_n_reg (vector float p, int n) { return vec_extract (p, n); }
float extract_sf_0_mem (vector float *p) { return vec_extract (*p, c0); }
float extract_sf_3_mem (vector float *p) { return vec_extract (*p, c3); }
float extract_sf_n_mem (vector float *p, int n) { return vec_extract (*p, n); }
vector float insert_sf_0 (vector float p, float x) { return vec_insert (x, p, c0); }
vector float insert_sf_3 (vector float p, float x) { return vec_insert (x, p, c3); }
vector float insert_sf_n (vector float p, float x, int n) { return vec_insert (x, p, n); }
vector float splat_sf_reg (float x) { return vec_splats (x); }
vector float splat_sf_mem (float *x) { return vec_splats (*x); }
int extract_si_0_reg (vector int p) { return vec_extract (p, c0); }
int extract_si_3_reg (vector int p) { return vec_extract (p, c3); }
int extract_si_n_reg (vector int p, int n) { return vec_extract (p, n); }
int extract_si_0_mem (vector int *p) { return vec_extract (*p, c0); }
int extract_si_3_mem (vector int *p) { return vec_extract (*p, c3); }
int extract_si_n_mem (vector int *p, int n) { return vec_extract (*p, n); }
vector int insert_si_0 (vector int p, int x) { return vec_insert (x, p, c0); }
vector int insert_si_3 (vector int p, int x) { return vec_insert (x, p, c3); }
vector int insert_si_n (vector int p, int x, int n) { return vec_insert (x, p, n); }
vector int splat_si_reg (int x) { return vec_splats (x); }
vector int splat_si_mem (int *x) { return vec_splats (*x); }
unsigned int extract_usi_0_reg (vector unsigned int p) { return vec_extract (p, c0); }
unsigned int extract_usi_3_reg (vector unsigned int p) { return vec_extract (p, c3); }
unsigned int extract_usi_n_reg (vector unsigned int p, int n) { return vec_extract (p, n); }
unsigned int extract_usi_0_mem (vector unsigned int *p) { return vec_extract (*p, c0); }
unsigned int extract_usi_3_mem (vector unsigned int *p) { return vec_extract (*p, c3); }
unsigned int extract_usi_n_mem (vector unsigned int *p, int n) { return vec_extract (*p, n); }
vector unsigned int insert_usi_0 (vector unsigned int p, unsigned int x) { return vec_insert (x, p, c0); }
vector unsigned int insert_usi_3 (vector unsigned int p, unsigned int x) { return vec_insert (x, p, c3); }
vector unsigned int insert_usi_n (vector unsigned int p, unsigned int x, int n) { return vec_insert (x, p, n); }
vector unsigned int splat_usi_reg (unsigned int x) { return vec_splats (x); }
vector unsigned int splat_usi_mem (unsigned int *x) { return vec_splats (*x); }
short extract_hi_0_reg (vector short p) { return vec_extract (p, c0); }
short extract_hi_7_reg (vector short p) { return vec_extract (p, c7); }
short extract_hi_n_reg (vector short p, int n) { return vec_extract (p, n); }
short extract_hi_0_mem (vector short *p) { return vec_extract (*p, c0); }
short extract_hi_7_mem (vector short *p) { return vec_extract (*p, c7); }
short extract_hi_n_mem (vector short *p, int n) { return vec_extract (*p, n); }
vector short insert_hi_0 (vector short p, short x) { return vec_insert (x, p, c0); }
vector short insert_hi_7 (vector short p, short x) { return vec_insert (x, p, c7); }
vector short insert_hi_n (vector short p, short x, int n) { return vec_insert (x, p, n); }
vector short splat_hi_reg (short x) { return vec_splats (x); }
vector short splat_hi_mem (short *x) { return vec_splats (*x); }
unsigned short extract_uhi_0_reg (vector unsigned short p) { return vec_extract (p, c0); }
unsigned short extract_uhi_7_reg (vector unsigned short p) { return vec_extract (p, c7); }
unsigned short extract_uhi_n_reg (vector unsigned short p, int n) { return vec_extract (p, n); }
unsigned short extract_uhi_0_mem (vector unsigned short *p) { return vec_extract (*p, c0); }
unsigned short extract_uhi_7_mem (vector unsigned short *p) { return vec_extract (*p, c7); }
unsigned short extract_uhi_n_mem (vector unsigned short *p, int n) { return vec_extract (*p, n); }
vector unsigned short insert_uhi_0 (vector unsigned short p, unsigned short x) { return vec_insert (x, p, c0); }
vector unsigned short insert_uhi_7 (vector unsigned short p, unsigned short x) { return vec_insert (x, p, c7); }
vector unsigned short insert_uhi_n (vector unsigned short p, unsigned short x, int n) { return vec_insert (x, p, n); }
vector unsigned short splat_uhi_reg (unsigned short x) { return vec_splats (x); }
vector unsigned short splat_uhi_mem (unsigned short *x) { return vec_splats (*x); }
signed char extract_qi_0_reg (vector signed char p) { return vec_extract (p, c0); }
unsigned char extract_uqi_0_reg (vector unsigned char p) { return vec_extract (p, c0); }
signed char extract_qi_1_reg5 (vector signed char p) { return vec_extract (p, c15); }
signed char extract_qi_n_reg (vector signed char p, int n) { return vec_extract (p, n); }
signed char extract_qi_0_mem (vector signed char *p) { return vec_extract (*p, c0); }
signed char extract_qi_1_mem5 (vector signed char *p) { return vec_extract (*p, c15); }
signed char extract_qi_n_mem (vector signed char *p, int n) { return vec_extract (*p, n); }
vector signed char insert_qi_0 (vector signed char p, signed char x) { return vec_insert (x, p, c0); }
vector signed char insert_qi_15 (vector signed char p, signed char x) { return vec_insert (x, p, c15); }
vector signed char insert_qi_n (vector signed char p, signed char x, int n) { return vec_insert (x, p, n); }
vector signed char splat_qi_reg (signed char x) { return vec_splats (x); }
vector signed char splat_qi_mem (signed char *x) { return vec_splats (*x); }
unsigned char extract_uqi_1_reg5 (vector unsigned char p) { return vec_extract (p, c15); }
unsigned char extract_uqi_n_reg (vector unsigned char p, int n) { return vec_extract (p, n); }
unsigned char extract_uqi_0_mem (vector unsigned char *p) { return vec_extract (*p, c0); }
unsigned char extract_uqi_1_mem5 (vector unsigned char *p) { return vec_extract (*p, c15); }
unsigned char extract_uqi_n_mem (vector unsigned char *p, int n) { return vec_extract (*p, n); }
vector unsigned char insert_uqi_0 (vector unsigned char p, unsigned char x) { return vec_insert (x, p, c0); }
vector unsigned char insert_uqi_15 (vector unsigned char p, unsigned char x) { return vec_insert (x, p, c15); }
vector unsigned char insert_uqi_n (vector unsigned char p, unsigned char x, int n) { return vec_insert (x, p, n); }
vector unsigned char splat_uqi_reg (unsigned char x) { return vec_splats (x); }
vector unsigned char splat_uqi_mem (unsigned char *x) { return vec_splats (*x); }
vector signed char splat_sc_s8 () { return vec_splat_s8 (2); }
vector unsigned char splat_uc_u8 () { return vec_splat_u8 (3); }
vector signed short int splat_ssi_s16() { return vec_splat_s16 (4); }
vector unsigned short int splat_usi_s16() { return vec_splat_u16 (5); }
vector signed int splat_si_s32() { return vec_splat_s32 (6); }
vector unsigned int splat_ui_u32() { return vec_splat_u32 (7); }
vector signed long long splat_sll (signed long long x)
{ return vec_splats (x); }
vector unsigned long long splat_uc (unsigned long long x)
{ return vec_splats (x); }
#ifdef __SIZEOF_INT128__
/* Note, int128 not supported on 32-bit platforms. */
vector signed __int128 splat_int128 (signed __int128 x) { return vec_splats (x); }
vector unsigned __int128 splat_uint128 (unsigned __int128 x) { return vec_splats (x); }
#endif
/* Expected results:
vec_extract rldic
vec_insert rldicr
vec_splats xxspltd detected as xxpermdi
vec_splat_s8 vspltisb
vec_splat_u8 vspltisb
vec_splat_s16 vspltish
vec_splat_u16 vspltish
vec_splat_s32 vspltisw
vec_splat_u32 vspltisw
return 128 vec_splats vspltisw
*/
/* { dg-final { scan-assembler-times {\mrldic\M} 0 { target { be && ilp32 } } } } */
/* { dg-final { scan-assembler-times {\mrldic\M} 65 { target { be && lp64 } } } } */
/* { dg-final { scan-assembler-times {\mrldic\M} 65 { target le } } } */
/* { dg-final { scan-assembler-times "xxpermdi" 33 { target be } } } */
/* { dg-final { scan-assembler-times "xxpermdi" 35 { target le } } } */
/* { dg-final { scan-assembler-times "vspltisb" 2 } } */
/* { dg-final { scan-assembler-times "vspltish" 2 } } */
/* { dg-final { scan-assembler-times "vspltisw" 2 { target be } } } */
/* { dg-final { scan-assembler-times "vspltisw" 23 { target le } } } */
|