1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_sshll_v8i8(<8 x i8> %a) { 4*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_v8i8: 5*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, #3 6*9880d681SAndroid Build Coastguard Worker %1 = sext <8 x i8> %a to <8 x i16> 7*9880d681SAndroid Build Coastguard Worker %tmp = shl <8 x i16> %1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 8*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sshll_v4i16(<4 x i16> %a) { 12*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_v4i16: 13*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, #9 14*9880d681SAndroid Build Coastguard Worker %1 = sext <4 x i16> %a to <4 x i32> 15*9880d681SAndroid Build Coastguard Worker %tmp = shl <4 x i32> %1, <i32 9, i32 9, i32 9, i32 9> 16*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_sshll_v2i32(<2 x i32> %a) { 20*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_v2i32: 21*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, #19 22*9880d681SAndroid Build Coastguard Worker %1 = sext <2 x i32> %a to <2 x i64> 23*9880d681SAndroid Build Coastguard Worker %tmp = shl <2 x i64> %1, <i64 19, i64 19> 24*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ushll_v8i8(<8 x i8> %a) { 28*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_v8i8: 29*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, #3 30*9880d681SAndroid Build Coastguard Worker %1 = zext <8 x i8> %a to <8 x i16> 31*9880d681SAndroid Build Coastguard Worker %tmp = shl <8 x i16> %1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 32*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ushll_v4i16(<4 x i16> %a) { 36*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_v4i16: 37*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, #9 38*9880d681SAndroid Build Coastguard Worker %1 = zext <4 x i16> %a to <4 x i32> 39*9880d681SAndroid Build Coastguard Worker %tmp = shl <4 x i32> %1, <i32 9, i32 9, i32 9, i32 9> 40*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ushll_v2i32(<2 x i32> %a) { 44*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_v2i32: 45*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, #19 46*9880d681SAndroid Build Coastguard Worker %1 = zext <2 x i32> %a to <2 x i64> 47*9880d681SAndroid Build Coastguard Worker %tmp = shl <2 x i64> %1, <i64 19, i64 19> 48*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_sshll2_v16i8(<16 x i8> %a) { 52*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_v16i8: 53*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, #3 54*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 55*9880d681SAndroid Build Coastguard Worker %2 = sext <8 x i8> %1 to <8 x i16> 56*9880d681SAndroid Build Coastguard Worker %tmp = shl <8 x i16> %2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 57*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sshll2_v8i16(<8 x i16> %a) { 61*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_v8i16: 62*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, #9 63*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 64*9880d681SAndroid Build Coastguard Worker %2 = sext <4 x i16> %1 to <4 x i32> 65*9880d681SAndroid Build Coastguard Worker %tmp = shl <4 x i32> %2, <i32 9, i32 9, i32 9, i32 9> 66*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_sshll2_v4i32(<4 x i32> %a) { 70*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_v4i32: 71*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, #19 72*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3> 73*9880d681SAndroid Build Coastguard Worker %2 = sext <2 x i32> %1 to <2 x i64> 74*9880d681SAndroid Build Coastguard Worker %tmp = shl <2 x i64> %2, <i64 19, i64 19> 75*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ushll2_v16i8(<16 x i8> %a) { 79*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_v16i8: 80*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, #3 81*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 82*9880d681SAndroid Build Coastguard Worker %2 = zext <8 x i8> %1 to <8 x i16> 83*9880d681SAndroid Build Coastguard Worker %tmp = shl <8 x i16> %2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 84*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ushll2_v8i16(<8 x i16> %a) { 88*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_v8i16: 89*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, #9 90*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 91*9880d681SAndroid Build Coastguard Worker %2 = zext <4 x i16> %1 to <4 x i32> 92*9880d681SAndroid Build Coastguard Worker %tmp = shl <4 x i32> %2, <i32 9, i32 9, i32 9, i32 9> 93*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ushll2_v4i32(<4 x i32> %a) { 97*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_v4i32: 98*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, #19 99*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3> 100*9880d681SAndroid Build Coastguard Worker %2 = zext <2 x i32> %1 to <2 x i64> 101*9880d681SAndroid Build Coastguard Worker %tmp = shl <2 x i64> %2, <i64 19, i64 19> 102*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_sshll_shl0_v8i8(<8 x i8> %a) { 106*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_shl0_v8i8: 107*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, #0 108*9880d681SAndroid Build Coastguard Worker %tmp = sext <8 x i8> %a to <8 x i16> 109*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sshll_shl0_v4i16(<4 x i16> %a) { 113*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_shl0_v4i16: 114*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, #0 115*9880d681SAndroid Build Coastguard Worker %tmp = sext <4 x i16> %a to <4 x i32> 116*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_sshll_shl0_v2i32(<2 x i32> %a) { 120*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll_shl0_v2i32: 121*9880d681SAndroid Build Coastguard Worker; CHECK: sshll {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, #0 122*9880d681SAndroid Build Coastguard Worker %tmp = sext <2 x i32> %a to <2 x i64> 123*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ushll_shl0_v8i8(<8 x i8> %a) { 127*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_shl0_v8i8: 128*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, #0 129*9880d681SAndroid Build Coastguard Worker %tmp = zext <8 x i8> %a to <8 x i16> 130*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ushll_shl0_v4i16(<4 x i16> %a) { 134*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_shl0_v4i16: 135*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, #0 136*9880d681SAndroid Build Coastguard Worker %tmp = zext <4 x i16> %a to <4 x i32> 137*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ushll_shl0_v2i32(<2 x i32> %a) { 141*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_shl0_v2i32: 142*9880d681SAndroid Build Coastguard Worker; CHECK: ushll {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, #0 143*9880d681SAndroid Build Coastguard Worker %tmp = zext <2 x i32> %a to <2 x i64> 144*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_sshll2_shl0_v16i8(<16 x i8> %a) { 148*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_shl0_v16i8: 149*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, #0 150*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 151*9880d681SAndroid Build Coastguard Worker %tmp = sext <8 x i8> %1 to <8 x i16> 152*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sshll2_shl0_v8i16(<8 x i16> %a) { 156*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_shl0_v8i16: 157*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, #0 158*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 159*9880d681SAndroid Build Coastguard Worker %tmp = sext <4 x i16> %1 to <4 x i32> 160*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_sshll2_shl0_v4i32(<4 x i32> %a) { 164*9880d681SAndroid Build Coastguard Worker; CHECK: test_sshll2_shl0_v4i32: 165*9880d681SAndroid Build Coastguard Worker; CHECK: sshll2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, #0 166*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3> 167*9880d681SAndroid Build Coastguard Worker %tmp = sext <2 x i32> %1 to <2 x i64> 168*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ushll2_shl0_v16i8(<16 x i8> %a) { 172*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_shl0_v16i8: 173*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, #0 174*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 175*9880d681SAndroid Build Coastguard Worker %tmp = zext <8 x i8> %1 to <8 x i16> 176*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ushll2_shl0_v8i16(<8 x i16> %a) { 180*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_shl0_v8i16: 181*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, #0 182*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 183*9880d681SAndroid Build Coastguard Worker %tmp = zext <4 x i16> %1 to <4 x i32> 184*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ushll2_shl0_v4i32(<4 x i32> %a) { 188*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll2_shl0_v4i32: 189*9880d681SAndroid Build Coastguard Worker; CHECK: ushll2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, #0 190*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3> 191*9880d681SAndroid Build Coastguard Worker %tmp = zext <2 x i32> %1 to <2 x i64> 192*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ushll_cmp(<8 x i8> %a, <8 x i8> %b) #0 { 196*9880d681SAndroid Build Coastguard Worker; CHECK: test_ushll_cmp: 197*9880d681SAndroid Build Coastguard Worker; CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, #0 199*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp eq <8 x i8> %a, %b 200*9880d681SAndroid Build Coastguard Worker %vcgtz.i.i = sext <8 x i1> %cmp.i to <8 x i8> 201*9880d681SAndroid Build Coastguard Worker %vmovl.i.i.i = zext <8 x i8> %vcgtz.i.i to <8 x i16> 202*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %vmovl.i.i.i 203*9880d681SAndroid Build Coastguard Worker} 204