xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx-basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker@x = common global <8 x float> zeroinitializer, align 32
5*9880d681SAndroid Build Coastguard Worker@y = common global <4 x double> zeroinitializer, align 32
6*9880d681SAndroid Build Coastguard Worker@z = common global <4 x float> zeroinitializer, align 16
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine void @zero128() nounwind ssp {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zero128:
10*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vxorps %xmm0, %xmm0, %xmm0
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movq _z@{{.*}}(%rip), %rax
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps %xmm0, (%rax)
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
15*9880d681SAndroid Build Coastguard Worker  store <4 x float> zeroinitializer, <4 x float>* @z, align 16
16*9880d681SAndroid Build Coastguard Worker  ret void
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine void @zero256() nounwind ssp {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zero256:
21*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movq _x@{{.*}}(%rip), %rax
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vxorps %ymm0, %ymm0, %ymm0
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps %ymm0, (%rax)
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movq _y@{{.*}}(%rip), %rax
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps %ymm0, (%rax)
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
29*9880d681SAndroid Build Coastguard Worker  store <8 x float> zeroinitializer, <8 x float>* @x, align 32
30*9880d681SAndroid Build Coastguard Worker  store <4 x double> zeroinitializer, <4 x double>* @y, align 32
31*9880d681SAndroid Build Coastguard Worker  ret void
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine void @ones([0 x float]* nocapture %RET, [0 x float]* nocapture %aFOO) nounwind {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ones:
36*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0: ## %allocas
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps %ymm0, (%rdi)
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
42*9880d681SAndroid Build Coastguard Workerallocas:
43*9880d681SAndroid Build Coastguard Worker  %ptr2vec615 = bitcast [0 x float]* %RET to <8 x float>*
44*9880d681SAndroid Build Coastguard Worker  store <8 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float
45*9880d681SAndroid Build Coastguard Worker0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float
46*9880d681SAndroid Build Coastguard Worker0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000>, <8 x
47*9880d681SAndroid Build Coastguard Workerfloat>* %ptr2vec615, align 32
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine void @ones2([0 x i32]* nocapture %RET, [0 x i32]* nocapture %aFOO) nounwind {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ones2:
53*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0: ## %allocas
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps %ymm0, (%rdi)
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vzeroupper
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
59*9880d681SAndroid Build Coastguard Workerallocas:
60*9880d681SAndroid Build Coastguard Worker  %ptr2vec615 = bitcast [0 x i32]* %RET to <8 x i32>*
61*9880d681SAndroid Build Coastguard Worker  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
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker;;; Just make sure this doesn't crash
66*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @ISelCrash(<4 x i64> %a) nounwind uwtable readnone ssp {
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ISelCrash:
68*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm0
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
71*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 4, i32 4>
72*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %shuffle
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker;;; Don't crash on movd
76*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @VMOVZQI2PQI([0 x float]* nocapture %aFOO) nounwind {
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: VMOVZQI2PQI:
78*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
82*9880d681SAndroid Build Coastguard Worker  %ptrcast.i33.i = bitcast [0 x float]* %aFOO to i32*
83*9880d681SAndroid Build Coastguard Worker  %val.i34.i = load i32, i32* %ptrcast.i33.i, align 4
84*9880d681SAndroid Build Coastguard Worker  %ptroffset.i22.i992 = getelementptr [0 x float], [0 x float]* %aFOO, i64 0, i64 1
85*9880d681SAndroid Build Coastguard Worker  %ptrcast.i23.i = bitcast float* %ptroffset.i22.i992 to i32*
86*9880d681SAndroid Build Coastguard Worker  %val.i24.i = load i32, i32* %ptrcast.i23.i, align 4
87*9880d681SAndroid Build Coastguard Worker  %updatedret.i30.i = insertelement <8 x i32> undef, i32 %val.i34.i, i32 1
88*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %updatedret.i30.i
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker;;;; Don't crash on fneg
92*9880d681SAndroid Build Coastguard Worker; rdar://10566486
93*9880d681SAndroid Build Coastguard Workerdefine <16 x float> @fneg(<16 x float> %a) nounwind {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fneg:
95*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovaps {{.*#+}} ymm2 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vxorps %ymm2, %ymm0, %ymm0
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vxorps %ymm2, %ymm1, %ymm1
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
100*9880d681SAndroid Build Coastguard Worker  %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>, %a
101*9880d681SAndroid Build Coastguard Worker  ret <16 x float> %1
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker;;; Don't crash on build vector
105*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @build_vec_16x16(i16 %a) nounwind readonly {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: build_vec_16x16:
107*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movzwl %di, %eax
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovd %eax, %xmm0
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
111*9880d681SAndroid Build Coastguard Worker  %res = insertelement <16 x i16> <i16 undef, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, i16 %a, i32 0
112*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %res
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker;;; Check that VMOVPQIto64rr generates the assembly string "vmovq".  Previously
116*9880d681SAndroid Build Coastguard Worker;;; an incorrect mnemonic of "movd" was printed for this instruction.
117*9880d681SAndroid Build Coastguard Workerdefine i64 @VMOVPQIto64rr(<2 x i64> %a) {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: VMOVPQIto64rr:
119*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovq %xmm0, %rax
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
122*9880d681SAndroid Build Coastguard Worker  %vecext.i = extractelement <2 x i64> %a, i32 0
123*9880d681SAndroid Build Coastguard Worker  ret i64 %vecext.i
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; PR22685
127*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @mov00_8f32(float* %ptr) {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mov00_8f32:
129*9880d681SAndroid Build Coastguard Worker; CHECK:       ## BB#0:
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
132*9880d681SAndroid Build Coastguard Worker  %val = load float, float* %ptr
133*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <8 x float> zeroinitializer, float %val, i32 0
134*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vec
135*9880d681SAndroid Build Coastguard Worker}
136