1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq %ymm 4*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone { 5*9880d681SAndroid Build Coastguard Worker %x = add <4 x i64> %i, %j 6*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %x 7*9880d681SAndroid Build Coastguard Worker} 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddd %ymm 10*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone { 11*9880d681SAndroid Build Coastguard Worker %x = add <8 x i32> %i, %j 12*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %x 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddw %ymm 16*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone { 17*9880d681SAndroid Build Coastguard Worker %x = add <16 x i16> %i, %j 18*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %x 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddb %ymm 22*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @test_vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone { 23*9880d681SAndroid Build Coastguard Worker %x = add <32 x i8> %i, %j 24*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %x 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubq %ymm 28*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @test_vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone { 29*9880d681SAndroid Build Coastguard Worker %x = sub <4 x i64> %i, %j 30*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %x 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubd %ymm 34*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone { 35*9880d681SAndroid Build Coastguard Worker %x = sub <8 x i32> %i, %j 36*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %x 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubw %ymm 40*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone { 41*9880d681SAndroid Build Coastguard Worker %x = sub <16 x i16> %i, %j 42*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %x 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubb %ymm 46*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @test_vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone { 47*9880d681SAndroid Build Coastguard Worker %x = sub <32 x i8> %i, %j 48*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %x 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld %ymm 52*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @test_vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone { 53*9880d681SAndroid Build Coastguard Worker %x = mul <8 x i32> %i, %j 54*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %x 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK: vpmullw %ymm 58*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @test_vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone { 59*9880d681SAndroid Build Coastguard Worker %x = mul <16 x i16> %i, %j 60*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %x 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v16i8 64*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm1, %ymm1 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm0, %ymm0 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmullw %ymm1, %ymm0, %ymm0 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm2, %xmm1, %xmm1 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm2, %xmm0, %xmm0 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vzeroupper 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 75*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @mul-v16i8(<16 x i8> %i, <16 x i8> %j) nounwind readnone { 76*9880d681SAndroid Build Coastguard Worker %x = mul <16 x i8> %i, %j 77*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %x 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v32i8 81*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vextracti128 $1, %ymm1, %xmm2 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm2, %ymm2 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm3 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm3, %ymm3 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmullw %ymm2, %ymm3, %ymm2 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vextracti128 $1, %ymm2, %xmm3 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm4, %xmm3, %xmm3 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm4, %xmm2, %xmm2 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm1, %ymm1 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmovsxbw %xmm0, %ymm0 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmullw %ymm1, %ymm0, %ymm0 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm4, %xmm1, %xmm1 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpshufb %xmm4, %xmm0, %xmm0 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 101*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @mul-v32i8(<32 x i8> %i, <32 x i8> %j) nounwind readnone { 102*9880d681SAndroid Build Coastguard Worker %x = mul <32 x i8> %i, %j 103*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %x 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; CHECK: mul-v4i64 107*9880d681SAndroid Build Coastguard Worker; CHECK: vpmuludq %ymm 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsrlq $32, %ymm 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmuludq %ymm 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsllq $32, %ymm 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpaddq %ymm 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsrlq $32, %ymm 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpmuludq %ymm 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpsllq $32, %ymm 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpaddq %ymm 116*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul-v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone { 117*9880d681SAndroid Build Coastguard Worker %x = mul <4 x i64> %i, %j 118*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %x 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const1 122*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddd 123*9880d681SAndroid Build Coastguard Worker; CHECK: ret 124*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const1(<8 x i32> %x) { 125*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2> 126*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %y 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const2 130*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllq $2 131*9880d681SAndroid Build Coastguard Worker; CHECK: ret 132*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul_const2(<4 x i64> %x) { 133*9880d681SAndroid Build Coastguard Worker %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4> 134*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %y 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const3 138*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw $3 139*9880d681SAndroid Build Coastguard Worker; CHECK: ret 140*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @mul_const3(<16 x i16> %x) { 141*9880d681SAndroid Build Coastguard Worker %y = mul <16 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 142*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %y 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const4 146*9880d681SAndroid Build Coastguard Worker; CHECK: vpxor 147*9880d681SAndroid Build Coastguard Worker; CHECK: vpsubq 148*9880d681SAndroid Build Coastguard Worker; CHECK: ret 149*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @mul_const4(<4 x i64> %x) { 150*9880d681SAndroid Build Coastguard Worker %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1> 151*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %y 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const5 155*9880d681SAndroid Build Coastguard Worker; CHECK: vxorps 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 157*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const5(<8 x i32> %x) { 158*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 159*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %y 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const6 163*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld 164*9880d681SAndroid Build Coastguard Worker; CHECK: ret 165*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const6(<8 x i32> %x) { 166*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0> 167*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %y 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const7 171*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq 172*9880d681SAndroid Build Coastguard Worker; CHECK: vpaddq 173*9880d681SAndroid Build Coastguard Worker; CHECK: ret 174*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @mul_const7(<8 x i64> %x) { 175*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2> 176*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %y 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const8 180*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllw $3 181*9880d681SAndroid Build Coastguard Worker; CHECK: ret 182*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @mul_const8(<8 x i16> %x) { 183*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 184*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %y 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const9 188*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld 189*9880d681SAndroid Build Coastguard Worker; CHECK: ret 190*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @mul_const9(<8 x i32> %x) { 191*9880d681SAndroid Build Coastguard Worker %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 192*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %y 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const10 196*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld 197*9880d681SAndroid Build Coastguard Worker; CHECK: ret 198*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mul_const10(<4 x i32> %x) { 199*9880d681SAndroid Build Coastguard Worker ; %x * 0x01010101 200*9880d681SAndroid Build Coastguard Worker %m = mul <4 x i32> %x, <i32 16843009, i32 16843009, i32 16843009, i32 16843009> 201*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %m 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; CHECK: mul_const11 205*9880d681SAndroid Build Coastguard Worker; CHECK: vpmulld 206*9880d681SAndroid Build Coastguard Worker; CHECK: ret 207*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mul_const11(<4 x i32> %x) { 208*9880d681SAndroid Build Coastguard Worker ; %x * 0x80808080 209*9880d681SAndroid Build Coastguard Worker %m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152> 210*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %m 211*9880d681SAndroid Build Coastguard Worker} 212