1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-linux -mcpu=corei7-avx | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -instsimplify -disable-output < %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP0: 5*9880d681SAndroid Build Coastguard Workerdefine <4 x i32*> @AGEP0(i32* %ptr) nounwind { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP0 8*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcast 9*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpaddd 10*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: ret 11*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <4 x i32*> undef, i32* %ptr, i32 0 12*9880d681SAndroid Build Coastguard Worker %vecinit2.i = insertelement <4 x i32*> %vecinit.i, i32* %ptr, i32 1 13*9880d681SAndroid Build Coastguard Worker %vecinit4.i = insertelement <4 x i32*> %vecinit2.i, i32* %ptr, i32 2 14*9880d681SAndroid Build Coastguard Worker %vecinit6.i = insertelement <4 x i32*> %vecinit4.i, i32* %ptr, i32 3 15*9880d681SAndroid Build Coastguard Worker %A2 = getelementptr i32, <4 x i32*> %vecinit6.i, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 16*9880d681SAndroid Build Coastguard Worker %A3 = getelementptr i32, <4 x i32*> %A2, <4 x i32> <i32 10, i32 14, i32 19, i32 233> 17*9880d681SAndroid Build Coastguard Worker ret <4 x i32*> %A3 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP1: 21*9880d681SAndroid Build Coastguard Workerdefine i32 @AGEP1(<4 x i32*> %param) nounwind { 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP1 24*9880d681SAndroid Build Coastguard Worker;CHECK: vpaddd 25*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpextrd 26*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: movl 27*9880d681SAndroid Build Coastguard Worker %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 28*9880d681SAndroid Build Coastguard Worker %k = extractelement <4 x i32*> %A2, i32 3 29*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %k 30*9880d681SAndroid Build Coastguard Worker ret i32 %v 31*9880d681SAndroid Build Coastguard Worker;CHECK: ret 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP2: 35*9880d681SAndroid Build Coastguard Workerdefine i32 @AGEP2(<4 x i32*> %param, <4 x i32> %off) nounwind { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP2 38*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld $2 39*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd 40*9880d681SAndroid Build Coastguard Worker %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> %off 41*9880d681SAndroid Build Coastguard Worker %k = extractelement <4 x i32*> %A2, i32 3 42*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %k 43*9880d681SAndroid Build Coastguard Worker ret i32 %v 44*9880d681SAndroid Build Coastguard Worker;CHECK: ret 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP3: 48*9880d681SAndroid Build Coastguard Workerdefine <4 x i32*> @AGEP3(<4 x i32*> %param, <4 x i32> %off) nounwind { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP3 51*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld $2 52*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd 53*9880d681SAndroid Build Coastguard Worker %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> %off 54*9880d681SAndroid Build Coastguard Worker %v = alloca i32 55*9880d681SAndroid Build Coastguard Worker %k = insertelement <4 x i32*> %A2, i32* %v, i32 3 56*9880d681SAndroid Build Coastguard Worker ret <4 x i32*> %k 57*9880d681SAndroid Build Coastguard Worker;CHECK: ret 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP4: 61*9880d681SAndroid Build Coastguard Workerdefine <4 x i16*> @AGEP4(<4 x i16*> %param, <4 x i32> %off) nounwind { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP4 64*9880d681SAndroid Build Coastguard Worker; Multiply offset by two (add it to itself). 65*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd 66*9880d681SAndroid Build Coastguard Worker; add the base to the offset 67*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd 68*9880d681SAndroid Build Coastguard Worker %A = getelementptr i16, <4 x i16*> %param, <4 x i32> %off 69*9880d681SAndroid Build Coastguard Worker ret <4 x i16*> %A 70*9880d681SAndroid Build Coastguard Worker;CHECK: ret 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP5: 74*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP5(<4 x i8*> %param, <4 x i8> %off) nounwind { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP5 77*9880d681SAndroid Build Coastguard Worker;CHECK: vpaddd 78*9880d681SAndroid Build Coastguard Worker %A = getelementptr i8, <4 x i8*> %param, <4 x i8> %off 79*9880d681SAndroid Build Coastguard Worker ret <4 x i8*> %A 80*9880d681SAndroid Build Coastguard Worker;CHECK: ret 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; The size of each element is 1 byte. No need to multiply by element size. 85*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP6: 86*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP6(<4 x i8*> %param, <4 x i32> %off) nounwind { 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP6 89*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: pslld 90*9880d681SAndroid Build Coastguard Worker %A = getelementptr i8, <4 x i8*> %param, <4 x i32> %off 91*9880d681SAndroid Build Coastguard Worker ret <4 x i8*> %A 92*9880d681SAndroid Build Coastguard Worker;CHECK: ret 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP7: 96*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP7(<4 x i8*> %param, i32 %off) nounwind { 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss 99*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd 100*9880d681SAndroid Build Coastguard Worker %A = getelementptr i8, <4 x i8*> %param, i32 %off 101*9880d681SAndroid Build Coastguard Worker ret <4 x i8*> %A 102*9880d681SAndroid Build Coastguard Worker;CHECK: ret 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP8: 106*9880d681SAndroid Build Coastguard Workerdefine <4 x i16*> @AGEP8(i16* %param, <4 x i32> %off) nounwind { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker; Multiply offset by two (add it to itself). 109*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd 110*9880d681SAndroid Build Coastguard Worker; add the base to the offset 111*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss 112*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd 113*9880d681SAndroid Build Coastguard Worker %A = getelementptr i16, i16* %param, <4 x i32> %off 114*9880d681SAndroid Build Coastguard Worker ret <4 x i16*> %A 115*9880d681SAndroid Build Coastguard Worker;CHECK: ret 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP9: 119*9880d681SAndroid Build Coastguard Workerdefine <64 x i16*> @AGEP9(i16* %param, <64 x i32> %off) nounwind { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss 122*9880d681SAndroid Build Coastguard Worker %A = getelementptr i16, i16* %param, <64 x i32> %off 123*9880d681SAndroid Build Coastguard Worker ret <64 x i16*> %A 124*9880d681SAndroid Build Coastguard Worker;CHECK: ret 125*9880d681SAndroid Build Coastguard Worker} 126