blob: 78026069df6e26aaf5f9e5d6239b89e01c26b325 [file] [log] [blame]
Bruno Cardoso Lopes6a32adc2011-07-25 23:05:25 +00001; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
Bruno Cardoso Lopes8c05a852010-08-12 02:06:36 +00002
3@x = common global <8 x float> zeroinitializer, align 32
4@y = common global <4 x double> zeroinitializer, align 32
Bruno Cardoso Lopesb33ea562011-08-09 03:04:23 +00005@z = common global <4 x float> zeroinitializer, align 16
Bruno Cardoso Lopes8c05a852010-08-12 02:06:36 +00006
Bruno Cardoso Lopesb33ea562011-08-09 03:04:23 +00007define void @zero128() nounwind ssp {
8entry:
Jakob Stoklund Olesen3e5d5c52011-11-07 19:15:58 +00009 ; CHECK: vxorps
Bruno Cardoso Lopesb33ea562011-08-09 03:04:23 +000010 ; CHECK: vmovaps
11 store <4 x float> zeroinitializer, <4 x float>* @z, align 16
12 ret void
13}
14
15define void @zero256() nounwind ssp {
Bruno Cardoso Lopes8c05a852010-08-12 02:06:36 +000016entry:
17 ; CHECK: vxorps
18 ; CHECK: vmovaps
19 ; CHECK: vmovaps
20 store <8 x float> zeroinitializer, <8 x float>* @x, align 32
21 store <4 x double> zeroinitializer, <4 x double>* @y, align 32
22 ret void
23}
Bruno Cardoso Lopes863bd9d2011-07-25 23:05:32 +000024
25; CHECK: vpcmpeqd
26; CHECK: vinsertf128 $1
27define void @ones([0 x float]* nocapture %RET, [0 x float]* nocapture %aFOO) nounwind {
28allocas:
29 %ptr2vec615 = bitcast [0 x float]* %RET to <8 x float>*
30 store <8 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float
310xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float
320xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000>, <8 x
33float>* %ptr2vec615, align 32
34 ret void
35}
Bruno Cardoso Lopes531f19f2011-08-01 19:51:53 +000036
37; CHECK: vpcmpeqd
38; CHECK: vinsertf128 $1
39define void @ones2([0 x i32]* nocapture %RET, [0 x i32]* nocapture %aFOO) nounwind {
40allocas:
41 %ptr2vec615 = bitcast [0 x i32]* %RET to <8 x i32>*
42 store <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32>* %ptr2vec615, align 32
43 ret void
44}
Bruno Cardoso Lopes59353b42011-08-11 18:59:13 +000045
46;;; Just make sure this doesn't crash
47; CHECK: _ISelCrash
48define <4 x i64> @ISelCrash(<4 x i64> %a) nounwind uwtable readnone ssp {
49entry:
50 %shuffle = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 4, i32 4>
51 ret <4 x i64> %shuffle
52}
Bruno Cardoso Lopes3b865982011-08-16 18:21:54 +000053
54;;;
55;;; Check that some 256-bit vectors are xformed into 128 ops
56; CHECK: _A
57; CHECK: vshufpd $1
58; CHECK-NEXT: vextractf128 $1
59; CHECK-NEXT: vshufpd $1
60; CHECK-NEXT: vinsertf128 $1
61define <4 x i64> @A(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
62entry:
63 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6>
64 ret <4 x i64> %shuffle
65}
66
Bruno Cardoso Lopes07b7f672011-08-25 02:58:26 +000067; CHECK: _B
68; CHECK: vshufpd $1, %ymm
Bruno Cardoso Lopes3b865982011-08-16 18:21:54 +000069define <4 x i64> @B(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
70entry:
71 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 undef, i32 undef, i32 6>
72 ret <4 x i64> %shuffle
73}
74
75; CHECK: movlhps
76; CHECK-NEXT: vextractf128 $1
77; CHECK-NEXT: movlhps
78; CHECK-NEXT: vinsertf128 $1
79define <4 x i64> @C(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
80entry:
81 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 undef, i32 0, i32 undef, i32 6>
82 ret <4 x i64> %shuffle
83}
84
85; CHECK: vpshufd $-96
86; CHECK: vpshufd $-6
87; CHECK: vinsertf128 $1
88define <8 x i32> @D(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
89entry:
90 %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 10, i32 10, i32 11, i32 11>
91 ret <8 x i32> %shuffle
92}
93
Bruno Cardoso Lopes5fc48102011-09-12 22:59:23 +000094;;; Don't crash on movd
95; CHECK: _VMOVZQI2PQI
96; CHECK: vmovd (%
97define <8 x i32> @VMOVZQI2PQI([0 x float]* nocapture %aFOO) nounwind {
98allocas:
99 %ptrcast.i33.i = bitcast [0 x float]* %aFOO to i32*
100 %val.i34.i = load i32* %ptrcast.i33.i, align 4
101 %ptroffset.i22.i992 = getelementptr [0 x float]* %aFOO, i64 0, i64 1
102 %ptrcast.i23.i = bitcast float* %ptroffset.i22.i992 to i32*
103 %val.i24.i = load i32* %ptrcast.i23.i, align 4
104 %updatedret.i30.i = insertelement <8 x i32> undef, i32 %val.i34.i, i32 1
105 ret <8 x i32> %updatedret.i30.i
106}
107
Chad Rosiera860b182011-12-15 01:02:25 +0000108;;;; Don't crash on fneg
109; rdar://10566486
110; CHECK: fneg
111; CHECK: vxorps
112define <16 x float> @fneg(<16 x float> addrspace(1)* nocapture %out) nounwind {
113 %1 = fsub <16 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
114 ret <16 x float> %1
115}