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