1 ; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu \ 2 ; RUN: -verify-machineinstrs < %s | FileCheck %s 3 ; RUN: llc -O0 -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu \ 4 ; RUN: -verify-machineinstrs < %s | FileCheck %s 5 ; RUN: llc -mcpu=pwr9 -mtriple=powerpc64-unknown-linux-gnu \ 6 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE 7 ; RUN: llc -O0 -mcpu=pwr9 -mtriple=powerpc64-unknown-linux-gnu \ 8 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE 9 10 ; The following testcases take one halfword element from the second vector and 11 ; inserts it at various locations in the first vector 12 define <8 x i16> @shuffle_vector_halfword_0_8(<8 x i16> %a, <8 x i16> %b) { 13 entry: 14 ; CHECK-LABEL: shuffle_vector_halfword_0_8 15 ; CHECK: vsldoi 3, 3, 3, 8 16 ; CHECK: vinserth 2, 3, 14 17 ; CHECK-BE-LABEL: shuffle_vector_halfword_0_8 18 ; CHECK-BE: vsldoi 3, 3, 3, 10 19 ; CHECK-BE: vinserth 2, 3, 0 20 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 21 ret <8 x i16> %vecins 22 } 23 24 define <8 x i16> @shuffle_vector_halfword_1_15(<8 x i16> %a, <8 x i16> %b) { 25 entry: 26 ; CHECK-LABEL: shuffle_vector_halfword_1_15 27 ; CHECK: vsldoi 3, 3, 3, 10 28 ; CHECK: vinserth 2, 3, 12 29 ; CHECK-BE-LABEL: shuffle_vector_halfword_1_15 30 ; CHECK-BE: vsldoi 3, 3, 3, 8 31 ; CHECK-BE: vinserth 2, 3, 2 32 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 15, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 33 ret <8 x i16> %vecins 34 } 35 36 define <8 x i16> @shuffle_vector_halfword_2_9(<8 x i16> %a, <8 x i16> %b) { 37 entry: 38 ; CHECK-LABEL: shuffle_vector_halfword_2_9 39 ; CHECK: vsldoi 3, 3, 3, 6 40 ; CHECK: vinserth 2, 3, 10 41 ; CHECK-BE-LABEL: shuffle_vector_halfword_2_9 42 ; CHECK-BE: vsldoi 3, 3, 3, 12 43 ; CHECK-BE: vinserth 2, 3, 4 44 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 9, i32 3, i32 4, i32 5, i32 6, i32 7> 45 ret <8 x i16> %vecins 46 } 47 48 define <8 x i16> @shuffle_vector_halfword_3_13(<8 x i16> %a, <8 x i16> %b) { 49 entry: 50 ; CHECK-LABEL: shuffle_vector_halfword_3_13 51 ; CHECK: vsldoi 3, 3, 3, 14 52 ; CHECK: vinserth 2, 3, 8 53 ; CHECK-BE-LABEL: shuffle_vector_halfword_3_13 54 ; CHECK-BE: vsldoi 3, 3, 3, 4 55 ; CHECK-BE: vinserth 2, 3, 6 56 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 13, i32 4, i32 5, i32 6, i32 7> 57 ret <8 x i16> %vecins 58 } 59 60 define <8 x i16> @shuffle_vector_halfword_4_10(<8 x i16> %a, <8 x i16> %b) { 61 entry: 62 ; CHECK-LABEL: shuffle_vector_halfword_4_10 63 ; CHECK: vsldoi 3, 3, 3, 4 64 ; CHECK: vinserth 2, 3, 6 65 ; CHECK-BE-LABEL: shuffle_vector_halfword_4_10 66 ; CHECK-BE: vsldoi 3, 3, 3, 14 67 ; CHECK-BE: vinserth 2, 3, 8 68 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 10, i32 5, i32 6, i32 7> 69 ret <8 x i16> %vecins 70 } 71 72 define <8 x i16> @shuffle_vector_halfword_5_14(<8 x i16> %a, <8 x i16> %b) { 73 entry: 74 ; CHECK-LABEL: shuffle_vector_halfword_5_14 75 ; CHECK: vsldoi 3, 3, 3, 12 76 ; CHECK: vinserth 2, 3, 4 77 ; CHECK-BE-LABEL: shuffle_vector_halfword_5_14 78 ; CHECK-BE: vsldoi 3, 3, 3, 6 79 ; CHECK-BE: vinserth 2, 3, 10 80 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 14, i32 6, i32 7> 81 ret <8 x i16> %vecins 82 } 83 84 define <8 x i16> @shuffle_vector_halfword_6_11(<8 x i16> %a, <8 x i16> %b) { 85 entry: 86 ; CHECK-LABEL: shuffle_vector_halfword_6_11 87 ; CHECK: vsldoi 3, 3, 3, 2 88 ; CHECK: vinserth 2, 3, 2 89 ; CHECK-BE-LABEL: shuffle_vector_halfword_6_11 90 ; CHECK-BE: vinserth 2, 3, 12 91 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 11, i32 7> 92 ret <8 x i16> %vecins 93 } 94 95 define <8 x i16> @shuffle_vector_halfword_7_12(<8 x i16> %a, <8 x i16> %b) { 96 entry: 97 ; CHECK-LABEL: shuffle_vector_halfword_7_12 98 ; CHECK: vinserth 2, 3, 0 99 ; CHECK-BE-LABEL: shuffle_vector_halfword_7_12 100 ; CHECK-BE: vsldoi 3, 3, 3, 2 101 ; CHECK-BE: vinserth 2, 3, 14 102 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 12> 103 ret <8 x i16> %vecins 104 } 105 106 define <8 x i16> @shuffle_vector_halfword_8_1(<8 x i16> %a, <8 x i16> %b) { 107 entry: 108 ; CHECK-LABEL: shuffle_vector_halfword_8_1 109 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 6 110 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 14 111 ; CHECK-BE-LABEL: shuffle_vector_halfword_8_1 112 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 12 113 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 0 114 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 115 ret <8 x i16> %vecins 116 } 117 118 ; The following testcases take one halfword element from the first vector and 119 ; inserts it at various locations in the second vector 120 define <8 x i16> @shuffle_vector_halfword_9_7(<8 x i16> %a, <8 x i16> %b) { 121 entry: 122 ; CHECK-LABEL: shuffle_vector_halfword_9_7 123 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 10 124 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 12 125 ; CHECK-BE-LABEL: shuffle_vector_halfword_9_7 126 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 8 127 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 2 128 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 7, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 129 ret <8 x i16> %vecins 130 } 131 132 define <8 x i16> @shuffle_vector_halfword_10_4(<8 x i16> %a, <8 x i16> %b) { 133 entry: 134 ; CHECK-LABEL: shuffle_vector_halfword_10_4 135 ; CHECK: vinserth 3, 2, 10 136 ; CHECK: vmr 2, 3 137 ; CHECK-BE-LABEL: shuffle_vector_halfword_10_4 138 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 2 139 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 4 140 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 4, i32 11, i32 12, i32 13, i32 14, i32 15> 141 ret <8 x i16> %vecins 142 } 143 144 define <8 x i16> @shuffle_vector_halfword_11_2(<8 x i16> %a, <8 x i16> %b) { 145 entry: 146 ; CHECK-LABEL: shuffle_vector_halfword_11_2 147 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 4 148 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 8 149 ; CHECK-BE-LABEL: shuffle_vector_halfword_11_2 150 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 14 151 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 6 152 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 2, i32 12, i32 13, i32 14, i32 15> 153 ret <8 x i16> %vecins 154 } 155 156 define <8 x i16> @shuffle_vector_halfword_12_6(<8 x i16> %a, <8 x i16> %b) { 157 entry: 158 ; CHECK-LABEL: shuffle_vector_halfword_12_6 159 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 12 160 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 6 161 ; CHECK-BE-LABEL: shuffle_vector_halfword_12_6 162 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 6 163 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 8 164 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 6, i32 13, i32 14, i32 15> 165 ret <8 x i16> %vecins 166 } 167 168 define <8 x i16> @shuffle_vector_halfword_13_3(<8 x i16> %a, <8 x i16> %b) { 169 entry: 170 ; CHECK-LABEL: shuffle_vector_halfword_13_3 171 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 2 172 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 4 173 ; CHECK-BE-LABEL: shuffle_vector_halfword_13_3 174 ; CHECK-BE: vinserth 3, 2, 10 175 ; CHECK-BE: vmr 2, 3 176 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 3, i32 14, i32 15> 177 ret <8 x i16> %vecins 178 } 179 180 define <8 x i16> @shuffle_vector_halfword_14_5(<8 x i16> %a, <8 x i16> %b) { 181 entry: 182 ; CHECK-LABEL: shuffle_vector_halfword_14_5 183 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 14 184 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 2 185 ; CHECK-BE-LABEL: shuffle_vector_halfword_14_5 186 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 4 187 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 12 188 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 5, i32 15> 189 ret <8 x i16> %vecins 190 } 191 192 define <8 x i16> @shuffle_vector_halfword_15_0(<8 x i16> %a, <8 x i16> %b) { 193 entry: 194 ; CHECK-LABEL: shuffle_vector_halfword_15_0 195 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 8 196 ; CHECK: vinserth {{[0-9]+}}, {{[0-9]+}}, 0 197 ; CHECK-BE-LABEL: shuffle_vector_halfword_15_0 198 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 10 199 ; CHECK-BE: vinserth {{[0-9]+}}, {{[0-9]+}}, 14 200 %vecins = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 0> 201 ret <8 x i16> %vecins 202 } 203 204 ; The following testcases use the same vector in both arguments of the 205 ; shufflevector. If halfword element 3 in BE mode(or 4 in LE mode) is the one 206 ; we're attempting to insert, then we can use the vector insert instruction 207 define <8 x i16> @shuffle_vector_halfword_0_4(<8 x i16> %a) { 208 entry: 209 ; CHECK-LABEL: shuffle_vector_halfword_0_4 210 ; CHECK: vinserth 2, 2, 14 211 ; CHECK-BE-LABEL: shuffle_vector_halfword_0_4 212 ; CHECK-BE-NOT: vinserth 213 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 4, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 214 ret <8 x i16> %vecins 215 } 216 217 define <8 x i16> @shuffle_vector_halfword_1_3(<8 x i16> %a) { 218 entry: 219 ; CHECK-LABEL: shuffle_vector_halfword_1_3 220 ; CHECK-NOT: vinserth 221 ; CHECK-BE-LABEL: shuffle_vector_halfword_1_3 222 ; CHECK-BE: vinserth 2, 2, 2 223 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 3, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 224 ret <8 x i16> %vecins 225 } 226 227 define <8 x i16> @shuffle_vector_halfword_2_3(<8 x i16> %a) { 228 entry: 229 ; CHECK-LABEL: shuffle_vector_halfword_2_3 230 ; CHECK-NOT: vinserth 231 ; CHECK-BE-LABEL: shuffle_vector_halfword_2_3 232 ; CHECK-BE: vinserth 2, 2, 4 233 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7> 234 ret <8 x i16> %vecins 235 } 236 237 define <8 x i16> @shuffle_vector_halfword_3_4(<8 x i16> %a) { 238 entry: 239 ; CHECK-LABEL: shuffle_vector_halfword_3_4 240 ; CHECK: vinserth 2, 2, 8 241 ; CHECK-BE-LABEL: shuffle_vector_halfword_3_4 242 ; CHECK-BE-NOT: vinserth 243 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 4, i32 4, i32 5, i32 6, i32 7> 244 ret <8 x i16> %vecins 245 } 246 247 define <8 x i16> @shuffle_vector_halfword_4_3(<8 x i16> %a) { 248 entry: 249 ; CHECK-LABEL: shuffle_vector_halfword_4_3 250 ; CHECK-NOT: vinserth 251 ; CHECK-BE-LABEL: shuffle_vector_halfword_4_3 252 ; CHECK-BE: vinserth 2, 2, 8 253 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 3, i32 5, i32 6, i32 7> 254 ret <8 x i16> %vecins 255 } 256 257 define <8 x i16> @shuffle_vector_halfword_5_3(<8 x i16> %a) { 258 entry: 259 ; CHECK-LABEL: shuffle_vector_halfword_5_3 260 ; CHECK-NOT: vinserth 261 ; CHECK-BE-LABEL: shuffle_vector_halfword_5_3 262 ; CHECK-BE: vinserth 2, 2, 10 263 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 3, i32 6, i32 7> 264 ret <8 x i16> %vecins 265 } 266 267 define <8 x i16> @shuffle_vector_halfword_6_4(<8 x i16> %a) { 268 entry: 269 ; CHECK-LABEL: shuffle_vector_halfword_6_4 270 ; CHECK: vinserth 2, 2, 2 271 ; CHECK-BE-LABEL: shuffle_vector_halfword_6_4 272 ; CHECK-BE-NOT: vinserth 273 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 4, i32 7> 274 ret <8 x i16> %vecins 275 } 276 277 define <8 x i16> @shuffle_vector_halfword_7_4(<8 x i16> %a) { 278 entry: 279 ; CHECK-LABEL: shuffle_vector_halfword_7_4 280 ; CHECK: vinserth 2, 2, 0 281 ; CHECK-BE-LABEL: shuffle_vector_halfword_7_4 282 ; CHECK-BE-NOT: vinserth 283 %vecins = shufflevector <8 x i16> %a, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 4> 284 ret <8 x i16> %vecins 285 } 286 287 ; The following testcases take one byte element from the second vector and 288 ; inserts it at various locations in the first vector 289 define <16 x i8> @shuffle_vector_byte_0_16(<16 x i8> %a, <16 x i8> %b) { 290 entry: 291 ; CHECK-LABEL: shuffle_vector_byte_0_16 292 ; CHECK: vsldoi 3, 3, 3, 8 293 ; CHECK: vinsertb 2, 3, 15 294 ; CHECK-BE-LABEL: shuffle_vector_byte_0_16 295 ; CHECK-BE: vsldoi 3, 3, 3, 9 296 ; CHECK-BE: vinsertb 2, 3, 0 297 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 298 ret <16 x i8> %vecins 299 } 300 301 define <16 x i8> @shuffle_vector_byte_1_25(<16 x i8> %a, <16 x i8> %b) { 302 entry: 303 ; CHECK-LABEL: shuffle_vector_byte_1_25 304 ; CHECK: vsldoi 3, 3, 3, 15 305 ; CHECK: vinsertb 2, 3, 14 306 ; CHECK-BE-LABEL: shuffle_vector_byte_1_25 307 ; CHECK-BE: vsldoi 3, 3, 3, 2 308 ; CHECK-BE: vinsertb 2, 3, 1 309 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 25, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 310 ret <16 x i8> %vecins 311 } 312 313 define <16 x i8> @shuffle_vector_byte_2_18(<16 x i8> %a, <16 x i8> %b) { 314 entry: 315 ; CHECK-LABEL: shuffle_vector_byte_2_18 316 ; CHECK: vsldoi 3, 3, 3, 6 317 ; CHECK: vinsertb 2, 3, 13 318 ; CHECK-BE-LABEL: shuffle_vector_byte_2_18 319 ; CHECK-BE: vsldoi 3, 3, 3, 11 320 ; CHECK-BE: vinsertb 2, 3, 2 321 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 18, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 322 ret <16 x i8> %vecins 323 } 324 325 define <16 x i8> @shuffle_vector_byte_3_27(<16 x i8> %a, <16 x i8> %b) { 326 entry: 327 ; CHECK-LABEL: shuffle_vector_byte_3_27 328 ; CHECK: vsldoi 3, 3, 3, 13 329 ; CHECK: vinsertb 2, 3, 12 330 ; CHECK-BE-LABEL: shuffle_vector_byte_3_27 331 ; CHECK-BE: vsldoi 3, 3, 3, 4 332 ; CHECK-BE: vinsertb 2, 3, 3 333 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 27, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 334 ret <16 x i8> %vecins 335 } 336 337 define <16 x i8> @shuffle_vector_byte_4_20(<16 x i8> %a, <16 x i8> %b) { 338 entry: 339 ; CHECK-LABEL: shuffle_vector_byte_4_20 340 ; CHECK: vsldoi 3, 3, 3, 4 341 ; CHECK: vinsertb 2, 3, 11 342 ; CHECK-BE-LABEL: shuffle_vector_byte_4_20 343 ; CHECK-BE: vsldoi 3, 3, 3, 13 344 ; CHECK-BE: vinsertb 2, 3, 4 345 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 20, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 346 ret <16 x i8> %vecins 347 } 348 349 define <16 x i8> @shuffle_vector_byte_5_29(<16 x i8> %a, <16 x i8> %b) { 350 entry: 351 ; CHECK-LABEL: shuffle_vector_byte_5_29 352 ; CHECK: vsldoi 3, 3, 3, 11 353 ; CHECK: vinsertb 2, 3, 10 354 ; CHECK-BE-LABEL: shuffle_vector_byte_5_29 355 ; CHECK-BE: vsldoi 3, 3, 3, 6 356 ; CHECK-BE: vinsertb 2, 3, 5 357 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 29, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 358 ret <16 x i8> %vecins 359 } 360 361 define <16 x i8> @shuffle_vector_byte_6_22(<16 x i8> %a, <16 x i8> %b) { 362 entry: 363 ; CHECK-LABEL: shuffle_vector_byte_6_22 364 ; CHECK: vsldoi 3, 3, 3, 2 365 ; CHECK: vinsertb 2, 3, 9 366 ; CHECK-BE-LABEL: shuffle_vector_byte_6_22 367 ; CHECK-BE: vsldoi 3, 3, 3, 15 368 ; CHECK-BE: vinsertb 2, 3, 6 369 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 22, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 370 ret <16 x i8> %vecins 371 } 372 373 define <16 x i8> @shuffle_vector_byte_7_31(<16 x i8> %a, <16 x i8> %b) { 374 entry: 375 ; CHECK-LABEL: shuffle_vector_byte_7_31 376 ; CHECK: vsldoi 3, 3, 3, 9 377 ; CHECK: vinsertb 2, 3, 8 378 ; CHECK-BE-LABEL: shuffle_vector_byte_7_31 379 ; CHECK-BE: vsldoi 3, 3, 3, 8 380 ; CHECK-BE: vinsertb 2, 3, 7 381 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 31, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 382 ret <16 x i8> %vecins 383 } 384 385 define <16 x i8> @shuffle_vector_byte_8_24(<16 x i8> %a, <16 x i8> %b) { 386 entry: 387 ; CHECK-LABEL: shuffle_vector_byte_8_24 388 ; CHECK: vinsertb 2, 3, 7 389 ; CHECK-BE-LABEL: shuffle_vector_byte_8_24 390 ; CHECK-BE: vsldoi 3, 3, 3, 1 391 ; CHECK-BE: vinsertb 2, 3, 8 392 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 393 ret <16 x i8> %vecins 394 } 395 396 define <16 x i8> @shuffle_vector_byte_9_17(<16 x i8> %a, <16 x i8> %b) { 397 entry: 398 ; CHECK-LABEL: shuffle_vector_byte_9_17 399 ; CHECK: vsldoi 3, 3, 3, 7 400 ; CHECK: vinsertb 2, 3, 6 401 ; CHECK-BE-LABEL: shuffle_vector_byte_9_17 402 ; CHECK-BE: vsldoi 3, 3, 3, 10 403 ; CHECK-BE: vinsertb 2, 3, 9 404 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 17, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 405 ret <16 x i8> %vecins 406 } 407 408 define <16 x i8> @shuffle_vector_byte_10_26(<16 x i8> %a, <16 x i8> %b) { 409 entry: 410 ; CHECK-LABEL: shuffle_vector_byte_10_26 411 ; CHECK: vsldoi 3, 3, 3, 14 412 ; CHECK: vinsertb 2, 3, 5 413 ; CHECK-BE-LABEL: shuffle_vector_byte_10_26 414 ; CHECK-BE: vsldoi 3, 3, 3, 3 415 ; CHECK-BE: vinsertb 2, 3, 10 416 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 26, i32 11, i32 12, i32 13, i32 14, i32 15> 417 ret <16 x i8> %vecins 418 } 419 420 define <16 x i8> @shuffle_vector_byte_11_19(<16 x i8> %a, <16 x i8> %b) { 421 entry: 422 ; CHECK-LABEL: shuffle_vector_byte_11_19 423 ; CHECK: vsldoi 3, 3, 3, 5 424 ; CHECK: vinsertb 2, 3, 4 425 ; CHECK-BE-LABEL: shuffle_vector_byte_11_19 426 ; CHECK-BE: vsldoi 3, 3, 3, 12 427 ; CHECK-BE: vinsertb 2, 3, 11 428 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 19, i32 12, i32 13, i32 14, i32 15> 429 ret <16 x i8> %vecins 430 } 431 432 define <16 x i8> @shuffle_vector_byte_12_28(<16 x i8> %a, <16 x i8> %b) { 433 entry: 434 ; CHECK-LABEL: shuffle_vector_byte_12_28 435 ; CHECK: vsldoi 3, 3, 3, 12 436 ; CHECK: vinsertb 2, 3, 3 437 ; CHECK-BE-LABEL: shuffle_vector_byte_12_28 438 ; CHECK-BE: vsldoi 3, 3, 3, 5 439 ; CHECK-BE: vinsertb 2, 3, 12 440 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 28, i32 13, i32 14, i32 15> 441 ret <16 x i8> %vecins 442 } 443 444 define <16 x i8> @shuffle_vector_byte_13_21(<16 x i8> %a, <16 x i8> %b) { 445 entry: 446 ; CHECK-LABEL: shuffle_vector_byte_13_21 447 ; CHECK: vsldoi 3, 3, 3, 3 448 ; CHECK: vinsertb 2, 3, 2 449 ; CHECK-BE-LABEL: shuffle_vector_byte_13_21 450 ; CHECK-BE: vsldoi 3, 3, 3, 14 451 ; CHECK-BE: vinsertb 2, 3, 13 452 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 21, i32 14, i32 15> 453 ret <16 x i8> %vecins 454 } 455 456 define <16 x i8> @shuffle_vector_byte_14_30(<16 x i8> %a, <16 x i8> %b) { 457 entry: 458 ; CHECK-LABEL: shuffle_vector_byte_14_30 459 ; CHECK: vsldoi 3, 3, 3, 10 460 ; CHECK: vinsertb 2, 3, 1 461 ; CHECK-BE-LABEL: shuffle_vector_byte_14_30 462 ; CHECK-BE: vsldoi 3, 3, 3, 7 463 ; CHECK-BE: vinsertb 2, 3, 14 464 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 30, i32 15> 465 ret <16 x i8> %vecins 466 } 467 468 define <16 x i8> @shuffle_vector_byte_15_23(<16 x i8> %a, <16 x i8> %b) { 469 entry: 470 ; CHECK-LABEL: shuffle_vector_byte_15_23 471 ; CHECK: vsldoi 3, 3, 3, 1 472 ; CHECK: vinsertb 2, 3, 0 473 ; CHECK-BE-LABEL: shuffle_vector_byte_15_23 474 ; CHECK-BE: vinsertb 2, 3, 15 475 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 23> 476 ret <16 x i8> %vecins 477 } 478 479 ; The following testcases take one byte element from the first vector and 480 ; inserts it at various locations in the second vector 481 define <16 x i8> @shuffle_vector_byte_16_8(<16 x i8> %a, <16 x i8> %b) { 482 entry: 483 ; CHECK-LABEL: shuffle_vector_byte_16_8 484 ; CHECK: vinsertb 3, 2, 15 485 ; CHECK: vmr 2, 3 486 ; CHECK-BE-LABEL: shuffle_vector_byte_16_8 487 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 1 488 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 0 489 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 8, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 490 ret <16 x i8> %vecins 491 } 492 493 define <16 x i8> @shuffle_vector_byte_17_1(<16 x i8> %a, <16 x i8> %b) { 494 entry: 495 ; CHECK-LABEL: shuffle_vector_byte_17_1 496 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 7 497 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 14 498 ; CHECK-BE-LABEL: shuffle_vector_byte_17_1 499 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 10 500 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 1 501 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 1, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 502 ret <16 x i8> %vecins 503 } 504 505 define <16 x i8> @shuffle_vector_byte_18_10(<16 x i8> %a, <16 x i8> %b) { 506 entry: 507 ; CHECK-LABEL: shuffle_vector_byte_18_10 508 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 14 509 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 13 510 ; CHECK-BE-LABEL: shuffle_vector_byte_18_10 511 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 3 512 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 2 513 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 10, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 514 ret <16 x i8> %vecins 515 } 516 517 define <16 x i8> @shuffle_vector_byte_19_3(<16 x i8> %a, <16 x i8> %b) { 518 entry: 519 ; CHECK-LABEL: shuffle_vector_byte_19_3 520 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 5 521 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 12 522 ; CHECK-BE-LABEL: shuffle_vector_byte_19_3 523 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 12 524 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 3 525 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 3, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 526 ret <16 x i8> %vecins 527 } 528 529 define <16 x i8> @shuffle_vector_byte_20_12(<16 x i8> %a, <16 x i8> %b) { 530 entry: 531 ; CHECK-LABEL: shuffle_vector_byte_20_12 532 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 12 533 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 11 534 ; CHECK-BE-LABEL: shuffle_vector_byte_20_12 535 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 5 536 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 4 537 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 12, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 538 ret <16 x i8> %vecins 539 } 540 541 define <16 x i8> @shuffle_vector_byte_21_5(<16 x i8> %a, <16 x i8> %b) { 542 entry: 543 ; CHECK-LABEL: shuffle_vector_byte_21_5 544 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 3 545 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 10 546 ; CHECK-BE-LABEL: shuffle_vector_byte_21_5 547 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 14 548 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 5 549 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 5, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 550 ret <16 x i8> %vecins 551 } 552 553 define <16 x i8> @shuffle_vector_byte_22_14(<16 x i8> %a, <16 x i8> %b) { 554 entry: 555 ; CHECK-LABEL: shuffle_vector_byte_22_14 556 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 10 557 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 9 558 ; CHECK-BE-LABEL: shuffle_vector_byte_22_14 559 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 7 560 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 6 561 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 14, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 562 ret <16 x i8> %vecins 563 } 564 565 define <16 x i8> @shuffle_vector_byte_23_7(<16 x i8> %a, <16 x i8> %b) { 566 entry: 567 ; CHECK-LABEL: shuffle_vector_byte_23_7 568 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 1 569 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 8 570 ; CHECK-BE-LABEL: shuffle_vector_byte_23_7 571 ; CHECK-BE: vinsertb 3, 2, 7 572 ; CHECK-BE: vmr 2, 3 573 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 574 ret <16 x i8> %vecins 575 } 576 577 define <16 x i8> @shuffle_vector_byte_24_0(<16 x i8> %a, <16 x i8> %b) { 578 entry: 579 ; CHECK-LABEL: shuffle_vector_byte_24_0 580 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 8 581 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 7 582 ; CHECK-BE-LABEL: shuffle_vector_byte_24_0 583 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 9 584 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 8 585 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 586 ret <16 x i8> %vecins 587 } 588 589 define <16 x i8> @shuffle_vector_byte_25_9(<16 x i8> %a, <16 x i8> %b) { 590 entry: 591 ; CHECK-LABEL: shuffle_vector_byte_25_9 592 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 15 593 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 6 594 ; CHECK-BE-LABEL: shuffle_vector_byte_25_9 595 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 2 596 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 9 597 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 9, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 598 ret <16 x i8> %vecins 599 } 600 601 define <16 x i8> @shuffle_vector_byte_26_2(<16 x i8> %a, <16 x i8> %b) { 602 entry: 603 ; CHECK-LABEL: shuffle_vector_byte_26_2 604 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 6 605 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 5 606 ; CHECK-BE-LABEL: shuffle_vector_byte_26_2 607 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 11 608 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 10 609 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 2, i32 27, i32 28, i32 29, i32 30, i32 31> 610 ret <16 x i8> %vecins 611 } 612 613 define <16 x i8> @shuffle_vector_byte_27_11(<16 x i8> %a, <16 x i8> %b) { 614 entry: 615 ; CHECK-LABEL: shuffle_vector_byte_27_11 616 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 13 617 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 4 618 ; CHECK-BE-LABEL: shuffle_vector_byte_27_11 619 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 4 620 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 11 621 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 11, i32 28, i32 29, i32 30, i32 31> 622 ret <16 x i8> %vecins 623 } 624 625 define <16 x i8> @shuffle_vector_byte_28_4(<16 x i8> %a, <16 x i8> %b) { 626 entry: 627 ; CHECK-LABEL: shuffle_vector_byte_28_4 628 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 4 629 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 3 630 ; CHECK-BE-LABEL: shuffle_vector_byte_28_4 631 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 13 632 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 12 633 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 4, i32 29, i32 30, i32 31> 634 ret <16 x i8> %vecins 635 } 636 637 define <16 x i8> @shuffle_vector_byte_29_13(<16 x i8> %a, <16 x i8> %b) { 638 entry: 639 ; CHECK-LABEL: shuffle_vector_byte_29_13 640 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 11 641 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 2 642 ; CHECK-BE-LABEL: shuffle_vector_byte_29_13 643 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 6 644 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 13 645 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 13, i32 30, i32 31> 646 ret <16 x i8> %vecins 647 } 648 649 define <16 x i8> @shuffle_vector_byte_30_6(<16 x i8> %a, <16 x i8> %b) { 650 entry: 651 ; CHECK-LABEL: shuffle_vector_byte_30_6 652 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 2 653 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 1 654 ; CHECK-BE-LABEL: shuffle_vector_byte_30_6 655 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 15 656 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 14 657 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 6, i32 31> 658 ret <16 x i8> %vecins 659 } 660 661 define <16 x i8> @shuffle_vector_byte_31_15(<16 x i8> %a, <16 x i8> %b) { 662 entry: 663 ; CHECK-LABEL: shuffle_vector_byte_31_15 664 ; CHECK: vsldoi {{[0-9]+}}, 2, 2, 9 665 ; CHECK: vinsertb {{[0-9]+}}, {{[0-9]+}}, 0 666 ; CHECK-BE-LABEL: shuffle_vector_byte_31_15 667 ; CHECK-BE: vsldoi {{[0-9]+}}, 2, 2, 8 668 ; CHECK-BE: vinsertb {{[0-9]+}}, {{[0-9]+}}, 15 669 %vecins = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 15> 670 ret <16 x i8> %vecins 671 } 672 673 ; The following testcases use the same vector in both arguments of the 674 ; shufflevector. If byte element 7 in BE mode(or 8 in LE mode) is the one 675 ; we're attempting to insert, then we can use the vector insert instruction 676 define <16 x i8> @shuffle_vector_byte_0_7(<16 x i8> %a) { 677 entry: 678 ; CHECK-LABEL: shuffle_vector_byte_0_7 679 ; CHECK-NOT: vinsertb 680 ; CHECK-BE-LABEL: shuffle_vector_byte_0_7 681 ; CHECK-BE: vinsertb 2, 2, 0 682 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 7, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 683 ret <16 x i8> %vecins 684 } 685 686 define <16 x i8> @shuffle_vector_byte_1_8(<16 x i8> %a) { 687 entry: 688 ; CHECK-LABEL: shuffle_vector_byte_1_8 689 ; CHECK: vinsertb 2, 2, 14 690 ; CHECK-BE-LABEL: shuffle_vector_byte_1_8 691 ; CHECK-BE-NOT: vinsertb 692 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 8, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 693 ret <16 x i8> %vecins 694 } 695 696 define <16 x i8> @shuffle_vector_byte_2_8(<16 x i8> %a) { 697 entry: 698 ; CHECK-LABEL: shuffle_vector_byte_2_8 699 ; CHECK: vinsertb 2, 2, 13 700 ; CHECK-BE-LABEL: shuffle_vector_byte_2_8 701 ; CHECK-BE-NOT: vinsertb 702 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 8, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 703 ret <16 x i8> %vecins 704 } 705 706 define <16 x i8> @shuffle_vector_byte_3_7(<16 x i8> %a) { 707 entry: 708 ; CHECK-LABEL: shuffle_vector_byte_3_7 709 ; CHECK-NOT: vinsertb 710 ; CHECK-BE-LABEL: shuffle_vector_byte_3_7 711 ; CHECK-BE: vinsertb 2, 2, 3 712 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 713 ret <16 x i8> %vecins 714 } 715 716 define <16 x i8> @shuffle_vector_byte_4_7(<16 x i8> %a) { 717 entry: 718 ; CHECK-LABEL: shuffle_vector_byte_4_7 719 ; CHECK-NOT: vinsertb 720 ; CHECK-BE-LABEL: shuffle_vector_byte_4_7 721 ; CHECK-BE: vinsertb 2, 2, 4 722 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 723 ret <16 x i8> %vecins 724 } 725 726 define <16 x i8> @shuffle_vector_byte_5_8(<16 x i8> %a) { 727 entry: 728 ; CHECK-LABEL: shuffle_vector_byte_5_8 729 ; CHECK: vinsertb 2, 2, 10 730 ; CHECK-BE-LABEL: shuffle_vector_byte_5_8 731 ; CHECK-BE-NOT: vinsertb 732 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 8, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 733 ret <16 x i8> %vecins 734 } 735 736 define <16 x i8> @shuffle_vector_byte_6_8(<16 x i8> %a) { 737 entry: 738 ; CHECK-LABEL: shuffle_vector_byte_6_8 739 ; CHECK: vinsertb 2, 2, 9 740 ; CHECK-BE-LABEL: shuffle_vector_byte_6_8 741 ; CHECK-BE-NOT: vinsertb 742 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 8, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 743 ret <16 x i8> %vecins 744 } 745 746 define <16 x i8> @shuffle_vector_byte_7_8(<16 x i8> %a) { 747 entry: 748 ; CHECK-LABEL: shuffle_vector_byte_7_8 749 ; CHECK: vinsertb 2, 2, 8 750 ; CHECK-BE-LABEL: shuffle_vector_byte_7_8 751 ; CHECK-BE-NOT: vinsertb 752 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 8, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 753 ret <16 x i8> %vecins 754 } 755 756 define <16 x i8> @shuffle_vector_byte_8_7(<16 x i8> %a) { 757 entry: 758 ; CHECK-LABEL: shuffle_vector_byte_8_7 759 ; CHECK-NOT: vinsertb 760 ; CHECK-BE-LABEL: shuffle_vector_byte_8_7 761 ; CHECK-BE: vinsertb 2, 2, 8 762 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 7, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 763 ret <16 x i8> %vecins 764 } 765 766 define <16 x i8> @shuffle_vector_byte_9_7(<16 x i8> %a) { 767 entry: 768 ; CHECK-LABEL: shuffle_vector_byte_9_7 769 ; CHECK-NOT: vinsertb 770 ; CHECK-BE-LABEL: shuffle_vector_byte_9_7 771 ; CHECK-BE: vinsertb 2, 2, 9 772 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 7, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 773 ret <16 x i8> %vecins 774 } 775 776 define <16 x i8> @shuffle_vector_byte_10_7(<16 x i8> %a) { 777 entry: 778 ; CHECK-LABEL: shuffle_vector_byte_10_7 779 ; CHECK-NOT: vinsertb 780 ; CHECK-BE-LABEL: shuffle_vector_byte_10_7 781 ; CHECK-BE: vinsertb 2, 2, 10 782 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 7, i32 11, i32 12, i32 13, i32 14, i32 15> 783 ret <16 x i8> %vecins 784 } 785 786 define <16 x i8> @shuffle_vector_byte_11_8(<16 x i8> %a) { 787 entry: 788 ; CHECK-LABEL: shuffle_vector_byte_11_8 789 ; CHECK: vinsertb 2, 2, 4 790 ; CHECK-BE-LABEL: shuffle_vector_byte_11_8 791 ; CHECK-BE-NOT: vinsertb 792 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 8, i32 12, i32 13, i32 14, i32 15> 793 ret <16 x i8> %vecins 794 } 795 796 define <16 x i8> @shuffle_vector_byte_12_8(<16 x i8> %a) { 797 entry: 798 ; CHECK-LABEL: shuffle_vector_byte_12_8 799 ; CHECK: vinsertb 2, 2, 3 800 ; CHECK-BE-LABEL: shuffle_vector_byte_12_8 801 ; CHECK-BE-NOT: vinsertb 802 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 8, i32 13, i32 14, i32 15> 803 ret <16 x i8> %vecins 804 } 805 806 define <16 x i8> @shuffle_vector_byte_13_7(<16 x i8> %a) { 807 entry: 808 ; CHECK-LABEL: shuffle_vector_byte_13_7 809 ; CHECK-NOT: vinsertb 810 ; CHECK-BE-LABEL: shuffle_vector_byte_13_7 811 ; CHECK-BE: vinsertb 2, 2, 13 812 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 7, i32 14, i32 15> 813 ret <16 x i8> %vecins 814 } 815 816 define <16 x i8> @shuffle_vector_byte_14_7(<16 x i8> %a) { 817 entry: 818 ; CHECK-LABEL: shuffle_vector_byte_14_7 819 ; CHECK-NOT: vinsertb 820 ; CHECK-BE-LABEL: shuffle_vector_byte_14_7 821 ; CHECK-BE: vinsertb 2, 2, 14 822 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 7, i32 15> 823 ret <16 x i8> %vecins 824 } 825 826 define <16 x i8> @shuffle_vector_byte_15_8(<16 x i8> %a) { 827 entry: 828 ; CHECK-LABEL: shuffle_vector_byte_15_8 829 ; CHECK: vinsertb 2, 2, 0 830 ; CHECK-BE-LABEL: shuffle_vector_byte_15_8 831 ; CHECK-BE-NOT: vinsertb 832 %vecins = shufflevector <16 x i8> %a, <16 x i8> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 8> 833 ret <16 x i8> %vecins 834 } 835 836 ; The following tests try to insert one halfword element into the vector. We 837 ; should always be using the 'vinserth' instruction. 838 define <8 x i16> @insert_halfword_0(<8 x i16> %a, i16 %b) { 839 entry: 840 ; CHECK-LABEL: insert_halfword_0 841 ; CHECK: vinserth 2, 3, 14 842 ; CHECK-BE-LABEL: insert_halfword_0 843 ; CHECK-BE: vinserth 2, 3, 0 844 %vecins = insertelement <8 x i16> %a, i16 %b, i32 0 845 ret <8 x i16> %vecins 846 } 847 848 define <8 x i16> @insert_halfword_1(<8 x i16> %a, i16 %b) { 849 entry: 850 ; CHECK-LABEL: insert_halfword_1 851 ; CHECK: vinserth 2, 3, 12 852 ; CHECK-BE-LABEL: insert_halfword_1 853 ; CHECK-BE: vinserth 2, 3, 2 854 %vecins = insertelement <8 x i16> %a, i16 %b, i32 1 855 ret <8 x i16> %vecins 856 } 857 858 define <8 x i16> @insert_halfword_2(<8 x i16> %a, i16 %b) { 859 entry: 860 ; CHECK-LABEL: insert_halfword_2 861 ; CHECK: vinserth 2, 3, 10 862 ; CHECK-BE-LABEL: insert_halfword_2 863 ; CHECK-BE: vinserth 2, 3, 4 864 %vecins = insertelement <8 x i16> %a, i16 %b, i32 2 865 ret <8 x i16> %vecins 866 } 867 868 define <8 x i16> @insert_halfword_3(<8 x i16> %a, i16 %b) { 869 entry: 870 ; CHECK-LABEL: insert_halfword_3 871 ; CHECK: vinserth 2, 3, 8 872 ; CHECK-BE-LABEL: insert_halfword_3 873 ; CHECK-BE: vinserth 2, 3, 6 874 %vecins = insertelement <8 x i16> %a, i16 %b, i32 3 875 ret <8 x i16> %vecins 876 } 877 878 define <8 x i16> @insert_halfword_4(<8 x i16> %a, i16 %b) { 879 entry: 880 ; CHECK-LABEL: insert_halfword_4 881 ; CHECK: vinserth 2, 3, 6 882 ; CHECK-BE-LABEL: insert_halfword_4 883 ; CHECK-BE: vinserth 2, 3, 8 884 %vecins = insertelement <8 x i16> %a, i16 %b, i32 4 885 ret <8 x i16> %vecins 886 } 887 888 define <8 x i16> @insert_halfword_5(<8 x i16> %a, i16 %b) { 889 entry: 890 ; CHECK-LABEL: insert_halfword_5 891 ; CHECK: vinserth 2, 3, 4 892 ; CHECK-BE-LABEL: insert_halfword_5 893 ; CHECK-BE: vinserth 2, 3, 10 894 %vecins = insertelement <8 x i16> %a, i16 %b, i32 5 895 ret <8 x i16> %vecins 896 } 897 898 define <8 x i16> @insert_halfword_6(<8 x i16> %a, i16 %b) { 899 entry: 900 ; CHECK-LABEL: insert_halfword_6 901 ; CHECK: vinserth 2, 3, 2 902 ; CHECK-BE-LABEL: insert_halfword_6 903 ; CHECK-BE: vinserth 2, 3, 12 904 %vecins = insertelement <8 x i16> %a, i16 %b, i32 6 905 ret <8 x i16> %vecins 906 } 907 908 define <8 x i16> @insert_halfword_7(<8 x i16> %a, i16 %b) { 909 entry: 910 ; CHECK-LABEL: insert_halfword_7 911 ; CHECK: vinserth 2, 3, 0 912 ; CHECK-BE-LABEL: insert_halfword_7 913 ; CHECK-BE: vinserth 2, 3, 14 914 %vecins = insertelement <8 x i16> %a, i16 %b, i32 7 915 ret <8 x i16> %vecins 916 } 917 918 ; The following tests try to insert one byte element into the vector. We 919 ; should always be using the 'vinsertb' instruction. 920 define <16 x i8> @insert_byte_0(<16 x i8> %a, i8 %b) { 921 entry: 922 ; CHECK-LABEL: insert_byte_0 923 ; CHECK: vinsertb 2, 3, 15 924 ; CHECK-BE-LABEL: insert_byte_0 925 ; CHECK-BE: vinsertb 2, 3, 0 926 %vecins = insertelement <16 x i8> %a, i8 %b, i32 0 927 ret <16 x i8> %vecins 928 } 929 930 define <16 x i8> @insert_byte_1(<16 x i8> %a, i8 %b) { 931 entry: 932 ; CHECK-LABEL: insert_byte_1 933 ; CHECK: vinsertb 2, 3, 14 934 ; CHECK-BE-LABEL: insert_byte_1 935 ; CHECK-BE: vinsertb 2, 3, 1 936 %vecins = insertelement <16 x i8> %a, i8 %b, i32 1 937 ret <16 x i8> %vecins 938 } 939 940 define <16 x i8> @insert_byte_2(<16 x i8> %a, i8 %b) { 941 entry: 942 ; CHECK-LABEL: insert_byte_2 943 ; CHECK: vinsertb 2, 3, 13 944 ; CHECK-BE-LABEL: insert_byte_2 945 ; CHECK-BE: vinsertb 2, 3, 2 946 %vecins = insertelement <16 x i8> %a, i8 %b, i32 2 947 ret <16 x i8> %vecins 948 } 949 950 define <16 x i8> @insert_byte_3(<16 x i8> %a, i8 %b) { 951 entry: 952 ; CHECK-LABEL: insert_byte_3 953 ; CHECK: vinsertb 2, 3, 12 954 ; CHECK-BE-LABEL: insert_byte_3 955 ; CHECK-BE: vinsertb 2, 3, 3 956 %vecins = insertelement <16 x i8> %a, i8 %b, i32 3 957 ret <16 x i8> %vecins 958 } 959 960 define <16 x i8> @insert_byte_4(<16 x i8> %a, i8 %b) { 961 entry: 962 ; CHECK-LABEL: insert_byte_4 963 ; CHECK: vinsertb 2, 3, 11 964 ; CHECK-BE-LABEL: insert_byte_4 965 ; CHECK-BE: vinsertb 2, 3, 4 966 %vecins = insertelement <16 x i8> %a, i8 %b, i32 4 967 ret <16 x i8> %vecins 968 } 969 970 define <16 x i8> @insert_byte_5(<16 x i8> %a, i8 %b) { 971 entry: 972 ; CHECK-LABEL: insert_byte_5 973 ; CHECK: vinsertb 2, 3, 10 974 ; CHECK-BE-LABEL: insert_byte_5 975 ; CHECK-BE: vinsertb 2, 3, 5 976 %vecins = insertelement <16 x i8> %a, i8 %b, i32 5 977 ret <16 x i8> %vecins 978 } 979 980 define <16 x i8> @insert_byte_6(<16 x i8> %a, i8 %b) { 981 entry: 982 ; CHECK-LABEL: insert_byte_6 983 ; CHECK: vinsertb 2, 3, 9 984 ; CHECK-BE-LABEL: insert_byte_6 985 ; CHECK-BE: vinsertb 2, 3, 6 986 %vecins = insertelement <16 x i8> %a, i8 %b, i32 6 987 ret <16 x i8> %vecins 988 } 989 990 define <16 x i8> @insert_byte_7(<16 x i8> %a, i8 %b) { 991 entry: 992 ; CHECK-LABEL: insert_byte_7 993 ; CHECK: vinsertb 2, 3, 8 994 ; CHECK-BE-LABEL: insert_byte_7 995 ; CHECK-BE: vinsertb 2, 3, 7 996 %vecins = insertelement <16 x i8> %a, i8 %b, i32 7 997 ret <16 x i8> %vecins 998 } 999 1000 define <16 x i8> @insert_byte_8(<16 x i8> %a, i8 %b) { 1001 entry: 1002 ; CHECK-LABEL: insert_byte_8 1003 ; CHECK: vinsertb 2, 3, 7 1004 ; CHECK-BE-LABEL: insert_byte_8 1005 ; CHECK-BE: vinsertb 2, 3, 8 1006 %vecins = insertelement <16 x i8> %a, i8 %b, i32 8 1007 ret <16 x i8> %vecins 1008 } 1009 1010 define <16 x i8> @insert_byte_9(<16 x i8> %a, i8 %b) { 1011 entry: 1012 ; CHECK-LABEL: insert_byte_9 1013 ; CHECK: vinsertb 2, 3, 6 1014 ; CHECK-BE-LABEL: insert_byte_9 1015 ; CHECK-BE: vinsertb 2, 3, 9 1016 %vecins = insertelement <16 x i8> %a, i8 %b, i32 9 1017 ret <16 x i8> %vecins 1018 } 1019 1020 define <16 x i8> @insert_byte_10(<16 x i8> %a, i8 %b) { 1021 entry: 1022 ; CHECK-LABEL: insert_byte_10 1023 ; CHECK: vinsertb 2, 3, 5 1024 ; CHECK-BE-LABEL: insert_byte_10 1025 ; CHECK-BE: vinsertb 2, 3, 10 1026 %vecins = insertelement <16 x i8> %a, i8 %b, i32 10 1027 ret <16 x i8> %vecins 1028 } 1029 1030 define <16 x i8> @insert_byte_11(<16 x i8> %a, i8 %b) { 1031 entry: 1032 ; CHECK-LABEL: insert_byte_11 1033 ; CHECK: vinsertb 2, 3, 4 1034 ; CHECK-BE-LABEL: insert_byte_11 1035 ; CHECK-BE: vinsertb 2, 3, 11 1036 %vecins = insertelement <16 x i8> %a, i8 %b, i32 11 1037 ret <16 x i8> %vecins 1038 } 1039 1040 define <16 x i8> @insert_byte_12(<16 x i8> %a, i8 %b) { 1041 entry: 1042 ; CHECK-LABEL: insert_byte_12 1043 ; CHECK: vinsertb 2, 3, 3 1044 ; CHECK-BE-LABEL: insert_byte_12 1045 ; CHECK-BE: vinsertb 2, 3, 12 1046 %vecins = insertelement <16 x i8> %a, i8 %b, i32 12 1047 ret <16 x i8> %vecins 1048 } 1049 1050 define <16 x i8> @insert_byte_13(<16 x i8> %a, i8 %b) { 1051 entry: 1052 ; CHECK-LABEL: insert_byte_13 1053 ; CHECK: vinsertb 2, 3, 2 1054 ; CHECK-BE-LABEL: insert_byte_13 1055 ; CHECK-BE: vinsertb 2, 3, 13 1056 %vecins = insertelement <16 x i8> %a, i8 %b, i32 13 1057 ret <16 x i8> %vecins 1058 } 1059 1060 define <16 x i8> @insert_byte_14(<16 x i8> %a, i8 %b) { 1061 entry: 1062 ; CHECK-LABEL: insert_byte_14 1063 ; CHECK: vinsertb 2, 3, 1 1064 ; CHECK-BE-LABEL: insert_byte_14 1065 ; CHECK-BE: vinsertb 2, 3, 14 1066 %vecins = insertelement <16 x i8> %a, i8 %b, i32 14 1067 ret <16 x i8> %vecins 1068 } 1069 1070 define <16 x i8> @insert_byte_15(<16 x i8> %a, i8 %b) { 1071 entry: 1072 ; CHECK-LABEL: insert_byte_15 1073 ; CHECK: vinsertb 2, 3, 0 1074 ; CHECK-BE-LABEL: insert_byte_15 1075 ; CHECK-BE: vinsertb 2, 3, 15 1076 %vecins = insertelement <16 x i8> %a, i8 %b, i32 15 1077 ret <16 x i8> %vecins 1078 } 1079