1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; TODO: Add AVX512BW shift support 3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 4 5 ; 6 ; Variable Shifts 7 ; 8 9 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind { 10 ; ALL-LABEL: var_shift_v8i64: 11 ; ALL: ## BB#0: 12 ; ALL-NEXT: vpsrlvq %zmm1, %zmm0, %zmm0 13 ; ALL-NEXT: retq 14 %shift = lshr <8 x i64> %a, %b 15 ret <8 x i64> %shift 16 } 17 18 define <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind { 19 ; ALL-LABEL: var_shift_v16i32: 20 ; ALL: ## BB#0: 21 ; ALL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0 22 ; ALL-NEXT: retq 23 %shift = lshr <16 x i32> %a, %b 24 ret <16 x i32> %shift 25 } 26 27 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 28 ; ALL-LABEL: var_shift_v32i16: 29 ; ALL: ## BB#0: 30 ; ALL-NEXT: vpxor %ymm4, %ymm4, %ymm4 31 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15] 32 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 33 ; ALL-NEXT: vpsrlvd %ymm5, %ymm6, %ymm5 34 ; ALL-NEXT: vpsrld $16, %ymm5, %ymm5 35 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11] 36 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 37 ; ALL-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0 38 ; ALL-NEXT: vpsrld $16, %ymm0, %ymm0 39 ; ALL-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 40 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15] 41 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 42 ; ALL-NEXT: vpsrlvd %ymm2, %ymm5, %ymm2 43 ; ALL-NEXT: vpsrld $16, %ymm2, %ymm2 44 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11] 45 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 46 ; ALL-NEXT: vpsrlvd %ymm3, %ymm1, %ymm1 47 ; ALL-NEXT: vpsrld $16, %ymm1, %ymm1 48 ; ALL-NEXT: vpackusdw %ymm2, %ymm1, %ymm1 49 ; ALL-NEXT: retq 50 %shift = lshr <32 x i16> %a, %b 51 ret <32 x i16> %shift 52 } 53 54 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 55 ; ALL-LABEL: var_shift_v64i8: 56 ; ALL: ## BB#0: 57 ; ALL-NEXT: vpsrlw $4, %ymm0, %ymm4 58 ; ALL-NEXT: vmovdqa {{.*#+}} ymm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 59 ; ALL-NEXT: vpand %ymm5, %ymm4, %ymm4 60 ; ALL-NEXT: vpsllw $5, %ymm2, %ymm2 61 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0 62 ; ALL-NEXT: vpsrlw $2, %ymm0, %ymm4 63 ; ALL-NEXT: vmovdqa {{.*#+}} ymm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 64 ; ALL-NEXT: vpand %ymm6, %ymm4, %ymm4 65 ; ALL-NEXT: vpaddb %ymm2, %ymm2, %ymm2 66 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0 67 ; ALL-NEXT: vpsrlw $1, %ymm0, %ymm4 68 ; ALL-NEXT: vmovdqa {{.*#+}} ymm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 69 ; ALL-NEXT: vpand %ymm7, %ymm4, %ymm4 70 ; ALL-NEXT: vpaddb %ymm2, %ymm2, %ymm2 71 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0 72 ; ALL-NEXT: vpsrlw $4, %ymm1, %ymm2 73 ; ALL-NEXT: vpand %ymm5, %ymm2, %ymm2 74 ; ALL-NEXT: vpsllw $5, %ymm3, %ymm3 75 ; ALL-NEXT: vpblendvb %ymm3, %ymm2, %ymm1, %ymm1 76 ; ALL-NEXT: vpsrlw $2, %ymm1, %ymm2 77 ; ALL-NEXT: vpand %ymm6, %ymm2, %ymm2 78 ; ALL-NEXT: vpaddb %ymm3, %ymm3, %ymm3 79 ; ALL-NEXT: vpblendvb %ymm3, %ymm2, %ymm1, %ymm1 80 ; ALL-NEXT: vpsrlw $1, %ymm1, %ymm2 81 ; ALL-NEXT: vpand %ymm7, %ymm2, %ymm2 82 ; ALL-NEXT: vpaddb %ymm3, %ymm3, %ymm3 83 ; ALL-NEXT: vpblendvb %ymm3, %ymm2, %ymm1, %ymm1 84 ; ALL-NEXT: retq 85 %shift = lshr <64 x i8> %a, %b 86 ret <64 x i8> %shift 87 } 88 89 ; 90 ; Uniform Variable Shifts 91 ; 92 93 define <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind { 94 ; ALL-LABEL: splatvar_shift_v8i64: 95 ; ALL: ## BB#0: 96 ; ALL-NEXT: vpsrlq %xmm1, %zmm0, %zmm0 97 ; ALL-NEXT: retq 98 %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer 99 %shift = lshr <8 x i64> %a, %splat 100 ret <8 x i64> %shift 101 } 102 103 define <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind { 104 ; ALL-LABEL: splatvar_shift_v16i32: 105 ; ALL: ## BB#0: 106 ; ALL-NEXT: vxorps %xmm2, %xmm2, %xmm2 107 ; ALL-NEXT: vmovss %xmm1, %xmm2, %xmm1 108 ; ALL-NEXT: vpsrld %xmm1, %zmm0, %zmm0 109 ; ALL-NEXT: retq 110 %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer 111 %shift = lshr <16 x i32> %a, %splat 112 ret <16 x i32> %shift 113 } 114 115 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 116 ; ALL-LABEL: splatvar_shift_v32i16: 117 ; ALL: ## BB#0: 118 ; ALL-NEXT: vmovd %xmm2, %eax 119 ; ALL-NEXT: movzwl %ax, %eax 120 ; ALL-NEXT: vmovd %eax, %xmm2 121 ; ALL-NEXT: vpsrlw %xmm2, %ymm0, %ymm0 122 ; ALL-NEXT: vpsrlw %xmm2, %ymm1, %ymm1 123 ; ALL-NEXT: retq 124 %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer 125 %shift = lshr <32 x i16> %a, %splat 126 ret <32 x i16> %shift 127 } 128 129 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 130 ; ALL-LABEL: splatvar_shift_v64i8: 131 ; ALL: ## BB#0: 132 ; ALL-NEXT: vpbroadcastb %xmm2, %ymm2 133 ; ALL-NEXT: vpsrlw $4, %ymm0, %ymm3 134 ; ALL-NEXT: vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 135 ; ALL-NEXT: vpand %ymm4, %ymm3, %ymm3 136 ; ALL-NEXT: vpsllw $5, %ymm2, %ymm2 137 ; ALL-NEXT: vpblendvb %ymm2, %ymm3, %ymm0, %ymm0 138 ; ALL-NEXT: vpsrlw $2, %ymm0, %ymm3 139 ; ALL-NEXT: vmovdqa {{.*#+}} ymm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 140 ; ALL-NEXT: vpand %ymm5, %ymm3, %ymm3 141 ; ALL-NEXT: vpaddb %ymm2, %ymm2, %ymm6 142 ; ALL-NEXT: vpblendvb %ymm6, %ymm3, %ymm0, %ymm0 143 ; ALL-NEXT: vpsrlw $1, %ymm0, %ymm3 144 ; ALL-NEXT: vmovdqa {{.*#+}} ymm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 145 ; ALL-NEXT: vpand %ymm7, %ymm3, %ymm3 146 ; ALL-NEXT: vpaddb %ymm6, %ymm6, %ymm8 147 ; ALL-NEXT: vpblendvb %ymm8, %ymm3, %ymm0, %ymm0 148 ; ALL-NEXT: vpsrlw $4, %ymm1, %ymm3 149 ; ALL-NEXT: vpand %ymm4, %ymm3, %ymm3 150 ; ALL-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1 151 ; ALL-NEXT: vpsrlw $2, %ymm1, %ymm2 152 ; ALL-NEXT: vpand %ymm5, %ymm2, %ymm2 153 ; ALL-NEXT: vpblendvb %ymm6, %ymm2, %ymm1, %ymm1 154 ; ALL-NEXT: vpsrlw $1, %ymm1, %ymm2 155 ; ALL-NEXT: vpand %ymm7, %ymm2, %ymm2 156 ; ALL-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 157 ; ALL-NEXT: retq 158 %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer 159 %shift = lshr <64 x i8> %a, %splat 160 ret <64 x i8> %shift 161 } 162 163 ; 164 ; Constant Shifts 165 ; 166 167 define <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind { 168 ; ALL-LABEL: constant_shift_v8i64: 169 ; ALL: ## BB#0: 170 ; ALL-NEXT: vpsrlvq {{.*}}(%rip), %zmm0, %zmm0 171 ; ALL-NEXT: retq 172 %shift = lshr <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62> 173 ret <8 x i64> %shift 174 } 175 176 define <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind { 177 ; ALL-LABEL: constant_shift_v16i32: 178 ; ALL: ## BB#0: 179 ; ALL-NEXT: vpsrlvd {{.*}}(%rip), %zmm0, %zmm0 180 ; ALL-NEXT: retq 181 %shift = lshr <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 182 ret <16 x i32> %shift 183 } 184 185 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind { 186 ; ALL-LABEL: constant_shift_v32i16: 187 ; ALL: ## BB#0: 188 ; ALL-NEXT: vpxor %ymm2, %ymm2, %ymm2 189 ; ALL-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 190 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15] 191 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 192 ; ALL-NEXT: vpsrlvd %ymm4, %ymm5, %ymm5 193 ; ALL-NEXT: vpsrld $16, %ymm5, %ymm5 194 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11] 195 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 196 ; ALL-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0 197 ; ALL-NEXT: vpsrld $16, %ymm0, %ymm0 198 ; ALL-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 199 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 200 ; ALL-NEXT: vpsrlvd %ymm4, %ymm3, %ymm3 201 ; ALL-NEXT: vpsrld $16, %ymm3, %ymm3 202 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 203 ; ALL-NEXT: vpsrlvd %ymm2, %ymm1, %ymm1 204 ; ALL-NEXT: vpsrld $16, %ymm1, %ymm1 205 ; ALL-NEXT: vpackusdw %ymm3, %ymm1, %ymm1 206 ; ALL-NEXT: retq 207 %shift = lshr <32 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, 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> 208 ret <32 x i16> %shift 209 } 210 211 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind { 212 ; ALL-LABEL: constant_shift_v64i8: 213 ; ALL: ## BB#0: 214 ; ALL-NEXT: vpsrlw $4, %ymm0, %ymm2 215 ; ALL-NEXT: vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 216 ; ALL-NEXT: vpand %ymm3, %ymm2, %ymm2 217 ; ALL-NEXT: vmovdqa {{.*#+}} ymm4 = [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] 218 ; ALL-NEXT: vpsllw $5, %ymm4, %ymm4 219 ; ALL-NEXT: vpblendvb %ymm4, %ymm2, %ymm0, %ymm0 220 ; ALL-NEXT: vpsrlw $2, %ymm0, %ymm2 221 ; ALL-NEXT: vmovdqa {{.*#+}} ymm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 222 ; ALL-NEXT: vpand %ymm5, %ymm2, %ymm2 223 ; ALL-NEXT: vpaddb %ymm4, %ymm4, %ymm6 224 ; ALL-NEXT: vpblendvb %ymm6, %ymm2, %ymm0, %ymm0 225 ; ALL-NEXT: vpsrlw $1, %ymm0, %ymm2 226 ; ALL-NEXT: vmovdqa {{.*#+}} ymm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 227 ; ALL-NEXT: vpand %ymm7, %ymm2, %ymm2 228 ; ALL-NEXT: vpaddb %ymm6, %ymm6, %ymm8 229 ; ALL-NEXT: vpblendvb %ymm8, %ymm2, %ymm0, %ymm0 230 ; ALL-NEXT: vpsrlw $4, %ymm1, %ymm2 231 ; ALL-NEXT: vpand %ymm3, %ymm2, %ymm2 232 ; ALL-NEXT: vpblendvb %ymm4, %ymm2, %ymm1, %ymm1 233 ; ALL-NEXT: vpsrlw $2, %ymm1, %ymm2 234 ; ALL-NEXT: vpand %ymm5, %ymm2, %ymm2 235 ; ALL-NEXT: vpblendvb %ymm6, %ymm2, %ymm1, %ymm1 236 ; ALL-NEXT: vpsrlw $1, %ymm1, %ymm2 237 ; ALL-NEXT: vpand %ymm7, %ymm2, %ymm2 238 ; ALL-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 239 ; ALL-NEXT: retq 240 %shift = lshr <64 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, 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> 241 ret <64 x i8> %shift 242 } 243 244 ; 245 ; Uniform Constant Shifts 246 ; 247 248 define <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind { 249 ; ALL-LABEL: splatconstant_shift_v8i64: 250 ; ALL: ## BB#0: 251 ; ALL-NEXT: vpsrlq $7, %zmm0, %zmm0 252 ; ALL-NEXT: retq 253 %shift = lshr <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7> 254 ret <8 x i64> %shift 255 } 256 257 define <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind { 258 ; ALL-LABEL: splatconstant_shift_v16i32: 259 ; ALL: ## BB#0: 260 ; ALL-NEXT: vpsrld $5, %zmm0, %zmm0 261 ; ALL-NEXT: retq 262 %shift = lshr <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 263 ret <16 x i32> %shift 264 } 265 266 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind { 267 ; ALL-LABEL: splatconstant_shift_v32i16: 268 ; ALL: ## BB#0: 269 ; ALL-NEXT: vpsrlw $3, %ymm0, %ymm0 270 ; ALL-NEXT: vpsrlw $3, %ymm1, %ymm1 271 ; ALL-NEXT: retq 272 %shift = lshr <32 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, 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> 273 ret <32 x i16> %shift 274 } 275 276 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind { 277 ; ALL-LABEL: splatconstant_shift_v64i8: 278 ; ALL: ## BB#0: 279 ; ALL-NEXT: vpsrlw $3, %ymm0, %ymm0 280 ; ALL-NEXT: vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 281 ; ALL-NEXT: vpand %ymm2, %ymm0, %ymm0 282 ; ALL-NEXT: vpsrlw $3, %ymm1, %ymm1 283 ; ALL-NEXT: vpand %ymm2, %ymm1, %ymm1 284 ; ALL-NEXT: retq 285 %shift = lshr <64 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, 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> 286 ret <64 x i8> %shift 287 } 288