1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 6 7 ; 8 ; Variable Shifts 9 ; 10 11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 12 ; AVX1-LABEL: var_shift_v4i64: 13 ; AVX1: # BB#0: 14 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 15 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 16 ; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4 17 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1] 18 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6 19 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7] 20 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 21 ; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2 22 ; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5 23 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7] 24 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 25 ; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2 26 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4 27 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] 28 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3 29 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 30 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1 31 ; AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0 32 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 33 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 34 ; AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0 35 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 36 ; AVX1-NEXT: retq 37 ; 38 ; AVX2-LABEL: var_shift_v4i64: 39 ; AVX2: # BB#0: 40 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 41 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 42 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 43 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 44 ; AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 45 ; AVX2-NEXT: retq 46 ; 47 ; XOPAVX1-LABEL: var_shift_v4i64: 48 ; XOPAVX1: # BB#0: 49 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 50 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 51 ; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2 52 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 53 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm4, %xmm2 54 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1 55 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 56 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 57 ; XOPAVX1-NEXT: retq 58 ; 59 ; XOPAVX2-LABEL: var_shift_v4i64: 60 ; XOPAVX2: # BB#0: 61 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 62 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 63 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 64 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 65 ; XOPAVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 66 ; XOPAVX2-NEXT: retq 67 %shift = ashr <4 x i64> %a, %b 68 ret <4 x i64> %shift 69 } 70 71 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 72 ; AVX1-LABEL: var_shift_v8i32: 73 ; AVX1: # BB#0: 74 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 75 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 76 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 77 ; AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4 78 ; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5 79 ; AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5 80 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7] 81 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 82 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3] 83 ; AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6 84 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 85 ; AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2 86 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7] 87 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 88 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 89 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3 90 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 91 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 92 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 93 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3] 94 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 95 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 96 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 97 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7] 98 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 99 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 100 ; AVX1-NEXT: retq 101 ; 102 ; AVX2-LABEL: var_shift_v8i32: 103 ; AVX2: # BB#0: 104 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 105 ; AVX2-NEXT: retq 106 ; 107 ; XOPAVX1-LABEL: var_shift_v8i32: 108 ; XOPAVX1: # BB#0: 109 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 110 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 111 ; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2 112 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 113 ; XOPAVX1-NEXT: vpshad %xmm2, %xmm4, %xmm2 114 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 115 ; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0 116 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 117 ; XOPAVX1-NEXT: retq 118 ; 119 ; XOPAVX2-LABEL: var_shift_v8i32: 120 ; XOPAVX2: # BB#0: 121 ; XOPAVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 122 ; XOPAVX2-NEXT: retq 123 %shift = ashr <8 x i32> %a, %b 124 ret <8 x i32> %shift 125 } 126 127 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 128 ; AVX1-LABEL: var_shift_v16i16: 129 ; AVX1: # BB#0: 130 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 131 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3 132 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2 133 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2 134 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3 135 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 136 ; AVX1-NEXT: vpsraw $8, %xmm4, %xmm5 137 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 138 ; AVX1-NEXT: vpsraw $4, %xmm2, %xmm4 139 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 140 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm4 141 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 142 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 143 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm4 144 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 145 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 146 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3 147 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 148 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 149 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3 150 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm4 151 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 152 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1 153 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 154 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 155 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 156 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 157 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 158 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 159 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 160 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 161 ; AVX1-NEXT: retq 162 ; 163 ; AVX2-LABEL: var_shift_v16i16: 164 ; AVX2: # BB#0: 165 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2 166 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15] 167 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 168 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 169 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 170 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11] 171 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 172 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 173 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 174 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 175 ; AVX2-NEXT: retq 176 ; 177 ; XOPAVX1-LABEL: var_shift_v16i16: 178 ; XOPAVX1: # BB#0: 179 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 180 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 181 ; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2 182 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 183 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm4, %xmm2 184 ; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1 185 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0 186 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 187 ; XOPAVX1-NEXT: retq 188 ; 189 ; XOPAVX2-LABEL: var_shift_v16i16: 190 ; XOPAVX2: # BB#0: 191 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 192 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 193 ; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2 194 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 195 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm4, %xmm2 196 ; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1 197 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0 198 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 199 ; XOPAVX2-NEXT: retq 200 %shift = ashr <16 x i16> %a, %b 201 ret <16 x i16> %shift 202 } 203 204 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 205 ; AVX1-LABEL: var_shift_v32i8: 206 ; AVX1: # BB#0: 207 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 208 ; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2 209 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15] 210 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 211 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15] 212 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 213 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 214 ; AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 215 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 216 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 217 ; AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 218 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 219 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3 220 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 221 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 222 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 223 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 224 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 225 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 226 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 227 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 228 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 229 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 230 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 231 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 232 ; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2 233 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 234 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 235 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 236 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 237 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 238 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 239 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 240 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 241 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 242 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 243 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3 244 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 245 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 246 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 247 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm4 248 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 249 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm4 250 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 251 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 252 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm4 253 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 254 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 255 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 256 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 257 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 258 ; AVX1-NEXT: retq 259 ; 260 ; AVX2-LABEL: var_shift_v32i8: 261 ; AVX2: # BB#0: 262 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 263 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 264 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 265 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 266 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 267 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 268 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 269 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 270 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 271 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 272 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 273 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 274 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 275 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 276 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 277 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 278 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 279 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 280 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 281 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 282 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 283 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 284 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 285 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 286 ; AVX2-NEXT: retq 287 ; 288 ; XOPAVX1-LABEL: var_shift_v32i8: 289 ; XOPAVX1: # BB#0: 290 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 291 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 292 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 293 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 294 ; XOPAVX1-NEXT: vpshab %xmm2, %xmm4, %xmm2 295 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1 296 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 297 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 298 ; XOPAVX1-NEXT: retq 299 ; 300 ; XOPAVX2-LABEL: var_shift_v32i8: 301 ; XOPAVX2: # BB#0: 302 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 303 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 304 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 305 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 306 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 307 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 308 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 309 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 310 ; XOPAVX2-NEXT: retq 311 %shift = ashr <32 x i8> %a, %b 312 ret <32 x i8> %shift 313 } 314 315 ; 316 ; Uniform Variable Shifts 317 ; 318 319 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 320 ; AVX1-LABEL: splatvar_shift_v4i64: 321 ; AVX1: # BB#0: 322 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 323 ; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2 324 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 325 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3 326 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3 327 ; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3 328 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 329 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 330 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 331 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 332 ; AVX1-NEXT: retq 333 ; 334 ; AVX2-LABEL: splatvar_shift_v4i64: 335 ; AVX2: # BB#0: 336 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 337 ; AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 338 ; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 339 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 340 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 341 ; AVX2-NEXT: retq 342 ; 343 ; XOPAVX1-LABEL: splatvar_shift_v4i64: 344 ; XOPAVX1: # BB#0: 345 ; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm1 = xmm1[0,0] 346 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 347 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 348 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 349 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2 350 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 351 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 352 ; XOPAVX1-NEXT: retq 353 ; 354 ; XOPAVX2-LABEL: splatvar_shift_v4i64: 355 ; XOPAVX2: # BB#0: 356 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 357 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 358 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 359 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 360 ; XOPAVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 361 ; XOPAVX2-NEXT: retq 362 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer 363 %shift = ashr <4 x i64> %a, %splat 364 ret <4 x i64> %shift 365 } 366 367 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 368 ; AVX1-LABEL: splatvar_shift_v8i32: 369 ; AVX1: # BB#0: 370 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 371 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 372 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 373 ; AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 374 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 375 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 376 ; AVX1-NEXT: retq 377 ; 378 ; AVX2-LABEL: splatvar_shift_v8i32: 379 ; AVX2: # BB#0: 380 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 381 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 382 ; AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 383 ; AVX2-NEXT: retq 384 ; 385 ; XOPAVX1-LABEL: splatvar_shift_v8i32: 386 ; XOPAVX1: # BB#0: 387 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 388 ; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 389 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 390 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 391 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 392 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 393 ; XOPAVX1-NEXT: retq 394 ; 395 ; XOPAVX2-LABEL: splatvar_shift_v8i32: 396 ; XOPAVX2: # BB#0: 397 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 398 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 399 ; XOPAVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 400 ; XOPAVX2-NEXT: retq 401 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer 402 %shift = ashr <8 x i32> %a, %splat 403 ret <8 x i32> %shift 404 } 405 406 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 407 ; AVX1-LABEL: splatvar_shift_v16i16: 408 ; AVX1: # BB#0: 409 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 410 ; AVX1-NEXT: vmovd %xmm1, %eax 411 ; AVX1-NEXT: movzwl %ax, %eax 412 ; AVX1-NEXT: vmovd %eax, %xmm1 413 ; AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 414 ; AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 415 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 416 ; AVX1-NEXT: retq 417 ; 418 ; AVX2-LABEL: splatvar_shift_v16i16: 419 ; AVX2: # BB#0: 420 ; AVX2-NEXT: vmovd %xmm1, %eax 421 ; AVX2-NEXT: movzwl %ax, %eax 422 ; AVX2-NEXT: vmovd %eax, %xmm1 423 ; AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 424 ; AVX2-NEXT: retq 425 ; 426 ; XOPAVX1-LABEL: splatvar_shift_v16i16: 427 ; XOPAVX1: # BB#0: 428 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 429 ; XOPAVX1-NEXT: vmovd %xmm1, %eax 430 ; XOPAVX1-NEXT: movzwl %ax, %eax 431 ; XOPAVX1-NEXT: vmovd %eax, %xmm1 432 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 433 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 434 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 435 ; XOPAVX1-NEXT: retq 436 ; 437 ; XOPAVX2-LABEL: splatvar_shift_v16i16: 438 ; XOPAVX2: # BB#0: 439 ; XOPAVX2-NEXT: vmovd %xmm1, %eax 440 ; XOPAVX2-NEXT: movzwl %ax, %eax 441 ; XOPAVX2-NEXT: vmovd %eax, %xmm1 442 ; XOPAVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 443 ; XOPAVX2-NEXT: retq 444 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer 445 %shift = ashr <16 x i16> %a, %splat 446 ret <16 x i16> %shift 447 } 448 449 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 450 ; AVX1-LABEL: splatvar_shift_v32i8: 451 ; AVX1: # BB#0: 452 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 453 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 454 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 455 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 456 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 457 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15] 458 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 459 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 460 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 461 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 462 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 463 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 464 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 465 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 466 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 467 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 468 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 469 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 470 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 471 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 472 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 473 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 474 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 475 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 476 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 477 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 478 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 479 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 480 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 481 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 482 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 483 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 484 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 485 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 486 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 487 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 488 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 489 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 490 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 491 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 492 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 493 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 494 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 495 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 496 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 497 ; AVX1-NEXT: retq 498 ; 499 ; AVX2-LABEL: splatvar_shift_v32i8: 500 ; AVX2: # BB#0: 501 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 502 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 503 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 504 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 505 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 506 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 507 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 508 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 509 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 510 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 511 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 512 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 513 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 514 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 515 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 516 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 517 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 518 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 519 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 520 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 521 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 522 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 523 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 524 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 525 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 526 ; AVX2-NEXT: retq 527 ; 528 ; XOPAVX1-LABEL: splatvar_shift_v32i8: 529 ; XOPAVX1: # BB#0: 530 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 531 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 532 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 533 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 534 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 535 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 536 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 537 ; XOPAVX1-NEXT: retq 538 ; 539 ; XOPAVX2-LABEL: splatvar_shift_v32i8: 540 ; XOPAVX2: # BB#0: 541 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1 542 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 543 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 544 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 545 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 546 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 547 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 548 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 549 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 550 ; XOPAVX2-NEXT: retq 551 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer 552 %shift = ashr <32 x i8> %a, %splat 553 ret <32 x i8> %shift 554 } 555 556 ; 557 ; Constant Shifts 558 ; 559 560 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind { 561 ; AVX1-LABEL: constant_shift_v4i64: 562 ; AVX1: # BB#0: 563 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 564 ; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm2 565 ; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm1 566 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 567 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967296,2] 568 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 569 ; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1 570 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm2 571 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 572 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 573 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936] 574 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 575 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 576 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 577 ; AVX1-NEXT: retq 578 ; 579 ; AVX2-LABEL: constant_shift_v4i64: 580 ; AVX2: # BB#0: 581 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 582 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 583 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 584 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 585 ; AVX2-NEXT: retq 586 ; 587 ; XOPAVX1-LABEL: constant_shift_v4i64: 588 ; XOPAVX1: # BB#0: 589 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 590 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm2 591 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 592 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm3, %xmm2 593 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1 594 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 595 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 596 ; XOPAVX1-NEXT: retq 597 ; 598 ; XOPAVX2-LABEL: constant_shift_v4i64: 599 ; XOPAVX2: # BB#0: 600 ; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 601 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 602 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 603 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 604 ; XOPAVX2-NEXT: retq 605 %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62> 606 ret <4 x i64> %shift 607 } 608 609 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind { 610 ; AVX1-LABEL: constant_shift_v8i32: 611 ; AVX1: # BB#0: 612 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1 613 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2 614 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 615 ; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2 616 ; AVX1-NEXT: vpsrad $4, %xmm0, %xmm3 617 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 618 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 619 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 620 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 621 ; AVX1-NEXT: vpsrad $9, %xmm0, %xmm3 622 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 623 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0 624 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 625 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 626 ; AVX1-NEXT: retq 627 ; 628 ; AVX2-LABEL: constant_shift_v8i32: 629 ; AVX2: # BB#0: 630 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 631 ; AVX2-NEXT: retq 632 ; 633 ; XOPAVX1-LABEL: constant_shift_v8i32: 634 ; XOPAVX1: # BB#0: 635 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm1 636 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 637 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0 638 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 639 ; XOPAVX1-NEXT: retq 640 ; 641 ; XOPAVX2-LABEL: constant_shift_v8i32: 642 ; XOPAVX2: # BB#0: 643 ; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 644 ; XOPAVX2-NEXT: retq 645 %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 646 ret <8 x i32> %shift 647 } 648 649 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind { 650 ; AVX1-LABEL: constant_shift_v16i16: 651 ; AVX1: # BB#0: 652 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 653 ; AVX1-NEXT: vpsraw $8, %xmm1, %xmm2 654 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32896,37008,41120,45232,49344,53456,57568,61680] 655 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1 656 ; AVX1-NEXT: vpsraw $4, %xmm1, %xmm2 657 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [256,8480,16704,24928,33152,41376,49600,57824] 658 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1 659 ; AVX1-NEXT: vpsraw $2, %xmm1, %xmm2 660 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [512,16960,33408,49856,768,17216,33664,50112] 661 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1 662 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2 663 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1024,33920,1280,34176,1536,34432,1792,34688] 664 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1 665 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm2 666 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,4112,8224,12336,16448,20560,24672,28784] 667 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0 668 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm2 669 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,8224,16448,24672,32896,41120,49344,57568] 670 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0 671 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2 672 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,16448,32896,49344,256,16704,33152,49600] 673 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0 674 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2 675 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,32896,256,33152,512,33408,768,33664] 676 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0 677 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 678 ; AVX1-NEXT: retq 679 ; 680 ; AVX2-LABEL: constant_shift_v16i16: 681 ; AVX2: # BB#0: 682 ; AVX2-NEXT: vpxor %ymm1, %ymm1, %ymm1 683 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 684 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15] 685 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 686 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 687 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 688 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11] 689 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 690 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 691 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 692 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 693 ; AVX2-NEXT: retq 694 ; 695 ; XOPAVX1-LABEL: constant_shift_v16i16: 696 ; XOPAVX1: # BB#0: 697 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 698 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2 699 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 700 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm3, %xmm2 701 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1 702 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0 703 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 704 ; XOPAVX1-NEXT: retq 705 ; 706 ; XOPAVX2-LABEL: constant_shift_v16i16: 707 ; XOPAVX2: # BB#0: 708 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 709 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2 710 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 711 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm3, %xmm2 712 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1 713 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0 714 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 715 ; XOPAVX2-NEXT: retq 716 %shift = ashr <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15> 717 ret <16 x i16> %shift 718 } 719 720 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind { 721 ; AVX1-LABEL: constant_shift_v32i8: 722 ; AVX1: # BB#0: 723 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 724 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 725 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 726 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 727 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15] 728 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 729 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 730 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 731 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 732 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 733 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 734 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 735 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 736 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 737 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 738 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 739 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 740 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 741 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 742 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 743 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 744 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 745 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 746 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 747 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 748 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 749 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 750 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 751 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 752 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 753 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 754 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 755 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 756 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 757 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 758 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 759 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 760 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 761 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 762 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 763 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 764 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 765 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 766 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 767 ; AVX1-NEXT: retq 768 ; 769 ; AVX2-LABEL: constant_shift_v32i8: 770 ; AVX2: # BB#0: 771 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 772 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 773 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 774 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 775 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 776 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 777 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 778 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 779 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 780 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 781 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 782 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 783 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 784 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 785 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 786 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 787 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 788 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 789 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 790 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 791 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 792 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 793 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 794 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 795 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 796 ; AVX2-NEXT: retq 797 ; 798 ; XOPAVX1-LABEL: constant_shift_v32i8: 799 ; XOPAVX1: # BB#0: 800 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 801 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 802 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 803 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 804 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 805 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 806 ; XOPAVX1-NEXT: retq 807 ; 808 ; XOPAVX2-LABEL: constant_shift_v32i8: 809 ; XOPAVX2: # BB#0: 810 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 811 ; XOPAVX2-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 812 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 813 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm2, %xmm2 814 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 815 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 816 ; XOPAVX2-NEXT: retq 817 %shift = ashr <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0> 818 ret <32 x i8> %shift 819 } 820 821 ; 822 ; Uniform Constant Shifts 823 ; 824 825 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind { 826 ; AVX1-LABEL: splatconstant_shift_v4i64: 827 ; AVX1: # BB#0: 828 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 829 ; AVX1-NEXT: vpsrad $7, %xmm1, %xmm2 830 ; AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1 831 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 832 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 833 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0 834 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 835 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 836 ; AVX1-NEXT: retq 837 ; 838 ; AVX2-LABEL: splatconstant_shift_v4i64: 839 ; AVX2: # BB#0: 840 ; AVX2-NEXT: vpsrad $7, %ymm0, %ymm1 841 ; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 842 ; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 843 ; AVX2-NEXT: retq 844 ; 845 ; XOPAVX1-LABEL: splatconstant_shift_v4i64: 846 ; XOPAVX1: # BB#0: 847 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 848 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1 849 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 850 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2 851 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 852 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 853 ; XOPAVX1-NEXT: retq 854 ; 855 ; XOPAVX2-LABEL: splatconstant_shift_v4i64: 856 ; XOPAVX2: # BB#0: 857 ; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 858 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm1 859 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 860 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 861 ; XOPAVX2-NEXT: retq 862 %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7> 863 ret <4 x i64> %shift 864 } 865 866 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind { 867 ; AVX1-LABEL: splatconstant_shift_v8i32: 868 ; AVX1: # BB#0: 869 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm1 870 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 871 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm0 872 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 873 ; AVX1-NEXT: retq 874 ; 875 ; AVX2-LABEL: splatconstant_shift_v8i32: 876 ; AVX2: # BB#0: 877 ; AVX2-NEXT: vpsrad $5, %ymm0, %ymm0 878 ; AVX2-NEXT: retq 879 ; 880 ; XOPAVX1-LABEL: splatconstant_shift_v8i32: 881 ; XOPAVX1: # BB#0: 882 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm1 883 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 884 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm0 885 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 886 ; XOPAVX1-NEXT: retq 887 ; 888 ; XOPAVX2-LABEL: splatconstant_shift_v8i32: 889 ; XOPAVX2: # BB#0: 890 ; XOPAVX2-NEXT: vpsrad $5, %ymm0, %ymm0 891 ; XOPAVX2-NEXT: retq 892 %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 893 ret <8 x i32> %shift 894 } 895 896 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind { 897 ; AVX1-LABEL: splatconstant_shift_v16i16: 898 ; AVX1: # BB#0: 899 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm1 900 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 901 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm0 902 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 903 ; AVX1-NEXT: retq 904 ; 905 ; AVX2-LABEL: splatconstant_shift_v16i16: 906 ; AVX2: # BB#0: 907 ; AVX2-NEXT: vpsraw $3, %ymm0, %ymm0 908 ; AVX2-NEXT: retq 909 ; 910 ; XOPAVX1-LABEL: splatconstant_shift_v16i16: 911 ; XOPAVX1: # BB#0: 912 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm1 913 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 914 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm0 915 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 916 ; XOPAVX1-NEXT: retq 917 ; 918 ; XOPAVX2-LABEL: splatconstant_shift_v16i16: 919 ; XOPAVX2: # BB#0: 920 ; XOPAVX2-NEXT: vpsraw $3, %ymm0, %ymm0 921 ; XOPAVX2-NEXT: retq 922 %shift = ashr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 923 ret <16 x i16> %shift 924 } 925 926 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind { 927 ; AVX1-LABEL: splatconstant_shift_v32i8: 928 ; AVX1: # BB#0: 929 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 930 ; AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1 931 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 932 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 933 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 934 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 935 ; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1 936 ; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0 937 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 938 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 939 ; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0 940 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 941 ; AVX1-NEXT: retq 942 ; 943 ; AVX2-LABEL: splatconstant_shift_v32i8: 944 ; AVX2: # BB#0: 945 ; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 946 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 947 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 948 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 949 ; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 950 ; AVX2-NEXT: retq 951 ; 952 ; XOPAVX1-LABEL: splatconstant_shift_v32i8: 953 ; XOPAVX1: # BB#0: 954 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 955 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 956 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 957 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 958 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 959 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 960 ; XOPAVX1-NEXT: retq 961 ; 962 ; XOPAVX2-LABEL: splatconstant_shift_v32i8: 963 ; XOPAVX2: # BB#0: 964 ; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 965 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 966 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 967 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 968 ; XOPAVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 969 ; XOPAVX2-NEXT: retq 970 %shift = ashr <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 971 ret <32 x i8> %shift 972 } 973