1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test efficient codegen of vector extends up from legal type to 128 bit 4*9880d681SAndroid Build Coastguard Worker; and 256 bit vector types. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker;----- 7*9880d681SAndroid Build Coastguard Worker; Vectors of i16. 8*9880d681SAndroid Build Coastguard Worker;----- 9*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @func1(<8 x i8> %v0) nounwind { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func1: 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h v0, v0, #0 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 13*9880d681SAndroid Build Coastguard Worker %r = zext <8 x i8> %v0 to <8 x i16> 14*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %r 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @func2(<8 x i8> %v0) nounwind { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func2: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h v0, v0, #0 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 21*9880d681SAndroid Build Coastguard Worker %r = sext <8 x i8> %v0 to <8 x i16> 22*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %r 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @func3(<16 x i8> %v0) nounwind { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func3: 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.8h v1, v0, #0 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h v0, v0, #0 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 30*9880d681SAndroid Build Coastguard Worker %r = zext <16 x i8> %v0 to <16 x i16> 31*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %r 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @func4(<16 x i8> %v0) nounwind { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func4: 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.8h v1, v0, #0 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h v0, v0, #0 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 39*9880d681SAndroid Build Coastguard Worker %r = sext <16 x i8> %v0 to <16 x i16> 40*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %r 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker;----- 44*9880d681SAndroid Build Coastguard Worker; Vectors of i32. 45*9880d681SAndroid Build Coastguard Worker;----- 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @afunc1(<4 x i16> %v0) nounwind { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc1: 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 51*9880d681SAndroid Build Coastguard Worker %r = zext <4 x i16> %v0 to <4 x i32> 52*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %r 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @afunc2(<4 x i16> %v0) nounwind { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc2: 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 59*9880d681SAndroid Build Coastguard Worker %r = sext <4 x i16> %v0 to <4 x i32> 60*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %r 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @afunc3(<8 x i16> %v0) nounwind { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc3: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.4s v1, v0, #0 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 68*9880d681SAndroid Build Coastguard Worker %r = zext <8 x i16> %v0 to <8 x i32> 69*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %r 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @afunc4(<8 x i16> %v0) nounwind { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc4: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.4s v1, v0, #0 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 77*9880d681SAndroid Build Coastguard Worker %r = sext <8 x i16> %v0 to <8 x i32> 78*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %r 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @bfunc1(<8 x i8> %v0) nounwind { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bfunc1: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h v0, v0, #0 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.4s v1, v0, #0 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 87*9880d681SAndroid Build Coastguard Worker %r = zext <8 x i8> %v0 to <8 x i32> 88*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %r 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @bfunc2(<8 x i8> %v0) nounwind { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bfunc2: 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h v0, v0, #0 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.4s v1, v0, #0 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 97*9880d681SAndroid Build Coastguard Worker %r = sext <8 x i8> %v0 to <8 x i32> 98*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %r 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker;----- 102*9880d681SAndroid Build Coastguard Worker; Vectors of i64. 103*9880d681SAndroid Build Coastguard Worker;----- 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @zfunc1(<4 x i32> %v0) nounwind { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zfunc1: 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.2d v1, v0, #0 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.2d v0, v0, #0 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 110*9880d681SAndroid Build Coastguard Worker %r = zext <4 x i32> %v0 to <4 x i64> 111*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %r 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @zfunc2(<4 x i32> %v0) nounwind { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zfunc2: 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.2d v1, v0, #0 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v0, v0, #0 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 119*9880d681SAndroid Build Coastguard Worker %r = sext <4 x i32> %v0 to <4 x i64> 120*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %r 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @bfunc3(<4 x i16> %v0) nounwind { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func3: 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.2d v1, v0, #0 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.2d v0, v0, #0 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 129*9880d681SAndroid Build Coastguard Worker %r = zext <4 x i16> %v0 to <4 x i64> 130*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %r 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @cfunc4(<4 x i16> %v0) nounwind { 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func4: 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.2d v1, v0, #0 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v0, v0, #0 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 139*9880d681SAndroid Build Coastguard Worker %r = sext <4 x i16> %v0 to <4 x i64> 140*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %r 141*9880d681SAndroid Build Coastguard Worker} 142