xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx512vl-vbroadcast.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -mattr=+avx512vl| FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare void @func_f32(float)
5*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @_256_broadcast_ss_spill(float %x) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _256_broadcast_ss_spill:
7*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pushq %rax
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  .Ltmp0:
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    .cfi_def_cfa_offset 16
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vaddss %xmm0, %xmm0, %xmm0
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Folded Spill
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq func_f32
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss {{[0-9]+}}(%rsp), %ymm0 # 4-byte Folded Reload
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    popq %rax
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
17*9880d681SAndroid Build Coastguard Worker  %a  = fadd float %x, %x
18*9880d681SAndroid Build Coastguard Worker  call void @func_f32(float %a)
19*9880d681SAndroid Build Coastguard Worker  %b = insertelement <8 x float> undef, float %a, i32 0
20*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <8 x float> %b, <8 x float> undef, <8 x i32> zeroinitializer
21*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %c
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @_128_broadcast_ss_spill(float %x) {
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _128_broadcast_ss_spill:
26*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pushq %rax
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  .Ltmp1:
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    .cfi_def_cfa_offset 16
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vaddss %xmm0, %xmm0, %xmm0
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Folded Spill
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq func_f32
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Folded Reload
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    popq %rax
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
36*9880d681SAndroid Build Coastguard Worker  %a  = fadd float %x, %x
37*9880d681SAndroid Build Coastguard Worker  call void @func_f32(float %a)
38*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x float> undef, float %a, i32 0
39*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> zeroinitializer
40*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %c
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdeclare void @func_f64(double)
44*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @_256_broadcast_sd_spill(double %x) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _256_broadcast_sd_spill:
46*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pushq %rax
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  .Ltmp2:
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    .cfi_def_cfa_offset 16
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vaddsd %xmm0, %xmm0, %xmm0
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmovsd %xmm0, (%rsp) # 8-byte Folded Spill
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    callq func_f64
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastsd (%rsp), %ymm0 # 8-byte Folded Reload
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    popq %rax
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
56*9880d681SAndroid Build Coastguard Worker  %a  = fadd double %x, %x
57*9880d681SAndroid Build Coastguard Worker  call void @func_f64(double %a)
58*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x double> undef, double %a, i32 0
59*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer
60*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %c
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine   <8 x float> @_inreg8xfloat(float %a) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _inreg8xfloat:
65*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
68*9880d681SAndroid Build Coastguard Worker  %b = insertelement <8 x float> undef, float %a, i32 0
69*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <8 x float> %b, <8 x float> undef, <8 x i32> zeroinitializer
70*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %c
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine   <8 x float> @_ss8xfloat_mask(<8 x float> %i, float %a, <8 x i32> %mask1) {
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss8xfloat_mask:
75*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %ymm3, %ymm3, %ymm3
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %ymm3, %ymm2, %k1
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm1, %ymm0 {%k1}
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
80*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <8 x i32> %mask1, zeroinitializer
81*9880d681SAndroid Build Coastguard Worker  %b = insertelement <8 x float> undef, float %a, i32 0
82*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <8 x float> %b, <8 x float> undef, <8 x i32> zeroinitializer
83*9880d681SAndroid Build Coastguard Worker  %r = select <8 x i1> %mask, <8 x float> %c, <8 x float> %i
84*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %r
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine   <8 x float> @_ss8xfloat_maskz(float %a, <8 x i32> %mask1) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss8xfloat_maskz:
89*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %ymm2, %ymm2, %ymm2
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %ymm2, %ymm1, %k1
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm0, %ymm0 {%k1} {z}
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
94*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <8 x i32> %mask1, zeroinitializer
95*9880d681SAndroid Build Coastguard Worker  %b = insertelement <8 x float> undef, float %a, i32 0
96*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <8 x float> %b, <8 x float> undef, <8 x i32> zeroinitializer
97*9880d681SAndroid Build Coastguard Worker  %r = select <8 x i1> %mask, <8 x float> %c, <8 x float> zeroinitializer
98*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %r
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine   <4 x float> @_inreg4xfloat(float %a) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _inreg4xfloat:
103*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm0, %xmm0
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
106*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x float> undef, float %a, i32 0
107*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> zeroinitializer
108*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %c
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine   <4 x float> @_ss4xfloat_mask(<4 x float> %i, float %a, <4 x i32> %mask1) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss4xfloat_mask:
113*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %xmm3, %xmm3, %xmm3
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %xmm3, %xmm2, %k1
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm1, %xmm0 {%k1}
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
118*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i32> %mask1, zeroinitializer
119*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x float> undef, float %a, i32 0
120*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> zeroinitializer
121*9880d681SAndroid Build Coastguard Worker  %r = select <4 x i1> %mask, <4 x float> %c, <4 x float> %i
122*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine   <4 x float> @_ss4xfloat_maskz(float %a, <4 x i32> %mask1) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss4xfloat_maskz:
127*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %xmm2, %xmm2, %xmm2
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %xmm2, %xmm1, %k1
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastss %xmm0, %xmm0 {%k1} {z}
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
132*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i32> %mask1, zeroinitializer
133*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x float> undef, float %a, i32 0
134*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> zeroinitializer
135*9880d681SAndroid Build Coastguard Worker  %r = select <4 x i1> %mask, <4 x float> %c, <4 x float> zeroinitializer
136*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine   <4 x double> @_inreg4xdouble(double %a) {
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _inreg4xdouble:
141*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
144*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x double> undef, double %a, i32 0
145*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer
146*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %c
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine   <4 x double> @_ss4xdouble_mask(<4 x double> %i, double %a, <4 x i32> %mask1) {
150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss4xdouble_mask:
151*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %xmm3, %xmm3, %xmm3
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %xmm3, %xmm2, %k1
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastsd %xmm1, %ymm0 {%k1}
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
156*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i32> %mask1, zeroinitializer
157*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x double> undef, double %a, i32 0
158*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer
159*9880d681SAndroid Build Coastguard Worker  %r = select <4 x i1> %mask, <4 x double> %c, <4 x double> %i
160*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %r
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine   <4 x double> @_ss4xdouble_maskz(double %a, <4 x i32> %mask1) {
164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ss4xdouble_maskz:
165*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpxord %xmm2, %xmm2, %xmm2
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vpcmpneqd %xmm2, %xmm1, %k1
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vbroadcastsd %xmm0, %ymm0 {%k1} {z}
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
170*9880d681SAndroid Build Coastguard Worker  %mask = icmp ne <4 x i32> %mask1, zeroinitializer
171*9880d681SAndroid Build Coastguard Worker  %b = insertelement <4 x double> undef, double %a, i32 0
172*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer
173*9880d681SAndroid Build Coastguard Worker  %r = select <4 x i1> %mask, <4 x double> %c, <4 x double> zeroinitializer
174*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %r
175*9880d681SAndroid Build Coastguard Worker}
176