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