1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; PR12281 4*9880d681SAndroid Build Coastguard Worker; Test generataion of code for vmull instruction when multiplying 128-bit 5*9880d681SAndroid Build Coastguard Worker; vectors that were created by sign-extending smaller vector sizes. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; The vmull operation requires 64-bit vectors, so we must extend the original 8*9880d681SAndroid Build Coastguard Worker; vector size to 64 bits for vmull operation. 9*9880d681SAndroid Build Coastguard Worker; Previously failed with an assertion because the <4 x i8> vector was too small 10*9880d681SAndroid Build Coastguard Worker; for vmull. 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Vector x Constant 13*9880d681SAndroid Build Coastguard Worker; v4i8 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v4i8_c(<4 x i8>* %v) nounwind { 16*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v4i8_c: 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker %0 = load <4 x i8>, <4 x i8>* %v, align 8 19*9880d681SAndroid Build Coastguard Worker %v0 = sext <4 x i8> %0 to <4 x i32> 20*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 21*9880d681SAndroid Build Coastguard Worker %v1 = mul <4 x i32> %v0, <i32 3, i32 3, i32 3, i32 3> 22*9880d681SAndroid Build Coastguard Worker store <4 x i32> %v1, <4 x i32>* undef, align 8 23*9880d681SAndroid Build Coastguard Worker ret void; 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; v2i8 27*9880d681SAndroid Build Coastguard Worker; 28*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i8_c(<2 x i8>* %v) nounwind { 29*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i8_c: 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i8>, <2 x i8>* %v, align 8 32*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i8> %0 to <2 x i64> 33*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 34*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, <i64 3, i64 3> 35*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 36*9880d681SAndroid Build Coastguard Worker ret void; 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; v2i16 40*9880d681SAndroid Build Coastguard Worker; 41*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i16_c(<2 x i16>* %v) nounwind { 42*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i16_c: 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i16>, <2 x i16>* %v, align 8 45*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i16> %0 to <2 x i64> 46*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 47*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, <i64 3, i64 3> 48*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 49*9880d681SAndroid Build Coastguard Worker ret void; 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; Vector x Vector 54*9880d681SAndroid Build Coastguard Worker; v4i8 55*9880d681SAndroid Build Coastguard Worker; 56*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v4i8_v(<4 x i8>* %v, <4 x i8>* %p) nounwind { 57*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v4i8_v: 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker %0 = load <4 x i8>, <4 x i8>* %v, align 8 60*9880d681SAndroid Build Coastguard Worker %v0 = sext <4 x i8> %0 to <4 x i32> 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i8>, <4 x i8>* %p, align 8 63*9880d681SAndroid Build Coastguard Worker %v2 = sext <4 x i8> %1 to <4 x i32> 64*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 65*9880d681SAndroid Build Coastguard Worker %v1 = mul <4 x i32> %v0, %v2 66*9880d681SAndroid Build Coastguard Worker store <4 x i32> %v1, <4 x i32>* undef, align 8 67*9880d681SAndroid Build Coastguard Worker ret void; 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; v2i8 71*9880d681SAndroid Build Coastguard Worker; 72*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i8_v(<2 x i8>* %v, <2 x i8>* %p) nounwind { 73*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i8_v: 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i8>, <2 x i8>* %v, align 8 76*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i8> %0 to <2 x i64> 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i8>, <2 x i8>* %p, align 8 79*9880d681SAndroid Build Coastguard Worker %v2 = sext <2 x i8> %1 to <2 x i64> 80*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 81*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, %v2 82*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 83*9880d681SAndroid Build Coastguard Worker ret void; 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; v2i16 87*9880d681SAndroid Build Coastguard Worker; 88*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i16_v(<2 x i16>* %v, <2 x i16>* %p) nounwind { 89*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i16_v: 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i16>, <2 x i16>* %v, align 8 92*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i16> %0 to <2 x i64> 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i16>, <2 x i16>* %p, align 8 95*9880d681SAndroid Build Coastguard Worker %v2 = sext <2 x i16> %1 to <2 x i64> 96*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 97*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, %v2 98*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 99*9880d681SAndroid Build Coastguard Worker ret void; 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; Vector(small) x Vector(big) 104*9880d681SAndroid Build Coastguard Worker; v4i8 x v4i16 105*9880d681SAndroid Build Coastguard Worker; 106*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v4i8_vs(<4 x i8>* %v, <4 x i16>* %p) nounwind { 107*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v4i8_vs: 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker %0 = load <4 x i8>, <4 x i8>* %v, align 8 110*9880d681SAndroid Build Coastguard Worker %v0 = sext <4 x i8> %0 to <4 x i32> 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i16>, <4 x i16>* %p, align 8 113*9880d681SAndroid Build Coastguard Worker %v2 = sext <4 x i16> %1 to <4 x i32> 114*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 115*9880d681SAndroid Build Coastguard Worker %v1 = mul <4 x i32> %v0, %v2 116*9880d681SAndroid Build Coastguard Worker store <4 x i32> %v1, <4 x i32>* undef, align 8 117*9880d681SAndroid Build Coastguard Worker ret void; 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; v2i8 121*9880d681SAndroid Build Coastguard Worker; v2i8 x v2i16 122*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i8_vs(<2 x i8>* %v, <2 x i16>* %p) nounwind { 123*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i8_vs: 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i8>, <2 x i8>* %v, align 8 126*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i8> %0 to <2 x i64> 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i16>, <2 x i16>* %p, align 8 129*9880d681SAndroid Build Coastguard Worker %v2 = sext <2 x i16> %1 to <2 x i64> 130*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 131*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, %v2 132*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 133*9880d681SAndroid Build Coastguard Worker ret void; 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; v2i16 137*9880d681SAndroid Build Coastguard Worker; v2i16 x v2i32 138*9880d681SAndroid Build Coastguard Workerdefine void @sextload_v2i16_vs(<2 x i16>* %v, <2 x i32>* %p) nounwind { 139*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: sextload_v2i16_vs: 140*9880d681SAndroid Build Coastguard Workerentry: 141*9880d681SAndroid Build Coastguard Worker %0 = load <2 x i16>, <2 x i16>* %v, align 8 142*9880d681SAndroid Build Coastguard Worker %v0 = sext <2 x i16> %0 to <2 x i64> 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i32>, <2 x i32>* %p, align 8 145*9880d681SAndroid Build Coastguard Worker %v2 = sext <2 x i32> %1 to <2 x i64> 146*9880d681SAndroid Build Coastguard Worker;CHECK: vmull 147*9880d681SAndroid Build Coastguard Worker %v1 = mul <2 x i64> %v0, %v2 148*9880d681SAndroid Build Coastguard Worker store <2 x i64> %v1, <2 x i64>* undef, align 8 149*9880d681SAndroid Build Coastguard Worker ret void; 150*9880d681SAndroid Build Coastguard Worker} 151