1 // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
3 typedef __attribute__(( ext_vector_type(4) )) float float4
;
4 typedef __attribute__(( ext_vector_type(2) )) float float2
;
5 typedef __attribute__(( ext_vector_type(4) )) int int4
;
6 typedef __attribute__(( ext_vector_type(4) )) unsigned int uint4
;
8 // CHECK: @foo = {{(dso_local )?}}global <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>
9 float4 foo
= (float4
){ 1.0, 2.0, 3.0, 4.0 };
11 // CHECK: @bar = {{(dso_local )?}}constant <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 0x7FF0000000000000>
12 const float4 bar
= (float4
){ 1.0, 2.0, 3.0, __builtin_inff() };
15 // CHECK: fadd <4 x float>
16 float4
test1(float4 V
) {
25 // CHECK: shufflevector {{.*}} <i32 0, i32 1>
26 // CHECK: extractelement
27 // CHECK: shufflevector {{.*}} <i32 1, i32 1, i32 1, i32 1>
28 // CHECK: insertelement
29 // CHECK: shufflevector {{.*}} <i32 1, i32 0>
31 vec2
= vec4
.xy
; // shorten
32 f
= vec2
.x
; // extract elt
33 vec4
= vec4
.yyyy
; // splat
35 vec2
.x
= f
; // insert one.
36 vec2
.yx
= vec2
; // reverse
40 // CHECK: store <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>
41 void test3(float4
*out
) {
42 *out
= ((float4
) {1.0f
, 2.0f
, 3.0f
, 4.0f
});
46 // CHECK: store <4 x float>
47 // CHECK: store <4 x float>
48 void test4(float4
*out
) {
53 *out
= ((float4
) {a
,b
,c
,d
});
57 // CHECK: shufflevector {{.*}} <4 x i32> zeroinitializer
58 // CHECK: fmul <4 x float>
59 // CHECK: fmul <4 x float>
60 // CHECK: shufflevector {{.*}} <4 x i32> zeroinitializer
61 // CHECK: fmul <4 x float>
62 void test5(float4
*out
) {
76 void test6(float4
*ap
, float4
*bp
, float c
) {
80 // CHECK: fadd <4 x float>
81 // CHECK: fsub <4 x float>
82 // CHECK: fmul <4 x float>
83 // CHECK: fdiv <4 x float>
89 // CHECK: fadd <4 x float>
90 // CHECK: fsub <4 x float>
91 // CHECK: fmul <4 x float>
92 // CHECK: fdiv <4 x float>
98 // CHECK: fadd <4 x float>
99 // CHECK: fsub <4 x float>
100 // CHECK: fmul <4 x float>
101 // CHECK: fdiv <4 x float>
107 // CHECK: fadd <4 x float>
108 // CHECK: fsub <4 x float>
109 // CHECK: fmul <4 x float>
110 // CHECK: fdiv <4 x float>
116 // Vector comparisons can sometimes crash the x86 backend, reject them until
117 // the implementation is stable.
130 void test7(int4
*ap
, int4
*bp
, int c
) {
134 // CHECK: add <4 x i32>
135 // CHECK: sub <4 x i32>
136 // CHECK: mul <4 x i32>
137 // CHECK: sdiv <4 x i32>
138 // CHECK: srem <4 x i32>
145 // CHECK: add <4 x i32>
146 // CHECK: sub <4 x i32>
147 // CHECK: mul <4 x i32>
148 // CHECK: sdiv <4 x i32>
149 // CHECK: srem <4 x i32>
156 // CHECK: add <4 x i32>
157 // CHECK: sub <4 x i32>
158 // CHECK: mul <4 x i32>
159 // CHECK: sdiv <4 x i32>
160 // CHECK: srem <4 x i32>
167 // CHECK: add <4 x i32>
168 // CHECK: sub <4 x i32>
169 // CHECK: mul <4 x i32>
170 // CHECK: sdiv <4 x i32>
171 // CHECK: srem <4 x i32>
179 // Vector comparisons.
196 void test8(float4
*ap
, float4
*bp
, int c
) {
200 // Vector comparisons.
217 // CHECK: extractelement <4 x i32>
223 // CHECK: add <4 x i32>
224 // CHECK: extractelement <4 x i32>
230 // CHECK: extractelement <4 x i32>
237 // CHECK: shufflevector {{.*}} <i32 2, i32 1, i32 0>
238 // CHECK: shufflevector {{.*}} <i32 0, i32 1, i32 2, i32 poison>
239 // CHECK: shufflevector {{.*}} <i32 4, i32 5, i32 6, i32 3>
240 int4
test12(int4 V
) {
246 // CHECK: shufflevector {{.*}} <i32 2, i32 1, i32 0, i32 3>
247 int4
test13(int4
*V
) {
252 void test14(uint4
*ap
, uint4
*bp
, unsigned c
) {
257 // CHECK: udiv <4 x i32>
258 // CHECK: urem <4 x i32>
262 // CHECK: udiv <4 x i32>
263 // CHECK: urem <4 x i32>
282 int4
test15(uint4 V0
) {
283 // CHECK: icmp eq <4 x i32>
291 void test16(float2 a
, float2 b
) {
292 float2 t0
= (a
+ b
) / 2;
295 typedef char char16
__attribute__((ext_vector_type(16)));
302 char16 destVal
= valC
? valA
: valB
;
305 typedef __attribute__(( ext_vector_type(16) )) float float16
;
307 float16 vec16
, vec16_2
;
310 void test_rgba(void) {
311 // CHECK: fadd <4 x float>
312 vec4_2
= vec4
.abgr
+ vec4
;
314 // CHECK: shufflevector {{.*}} <i32 0, i32 1>
316 // CHECK: shufflevector {{.*}} <i32 2, i32 3>
318 // CHECK: extractelement {{.*}} 2
320 // CHECK: shufflevector {{.*}} <i32 2, i32 2, i32 2, i32 2>
321 vec4_2
= vec4_2
.bbbb
;
323 // CHECK: insertelement {{.*}} 0
325 // CHECK: shufflevector {{.*}} <i32 1, i32 0>
328 // CHECK: extractelement {{.*}} 0
330 // CHECK: shufflevector {{.*}} <i32 2, i32 1, i32 0>
331 // CHECK: shufflevector {{.*}} <i32 0, i32 1, i32 2, i32 poison>
332 // CHECK: shufflevector {{.*}} <i32 4, i32 5, i32 6, i32 3>
335 // CHECK: extractelement {{.*}} 11
336 // CHECK: insertelement {{.*}} 2
338 // CHECK: shufflevector {{.*}} <i32 10, i32 11, i32 12, i32 13>
339 vec4_2
= vec16
.sabcd
;