1 // REQUIRES: powerpc-registered-target 2 3 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \ 4 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-BE 5 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \ 6 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-LE 7 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \ 8 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-BE 9 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \ 10 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n| FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-LE 11 12 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-freebsd13.0 -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \ 13 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-BE 14 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-freebsd13.0 -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \ 15 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-LE 16 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-freebsd13.0 -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \ 17 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-BE 18 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-freebsd13.0 -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \ 19 // RUN: -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n| FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-LE 20 21 #include <mmintrin.h> 22 23 unsigned long long int ull1, ull2; 24 int i1, i2; 25 short s[4]; 26 signed char c[8]; 27 long long int ll1; 28 __m64 m1, m2, res; 29 30 void __attribute__((noinline)) 31 test_add() { 32 res = _mm_add_pi32(m1, m2); 33 res = _mm_add_pi16(m1, m2); 34 res = _mm_add_pi8(m1, m2); 35 res = _mm_adds_pu16(m1, m2); 36 res = _mm_adds_pu8(m1, m2); 37 res = _mm_adds_pi16(m1, m2); 38 res = _mm_adds_pi8(m1, m2); 39 } 40 41 // CHECK-LABEL: @test_add 42 43 // CHECK-LABEL: define available_externally i64 @_mm_add_pi32 44 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 45 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 46 // CHECK-P9: call <4 x i32> @vec_add(int vector[4], int vector[4]) 47 // CHECK-P8: add nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 48 // CHECK-P8: add nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 49 50 // CHECK-LABEL: define available_externally i64 @_mm_add_pi16 51 // CHECK: call <2 x i64> @vec_splats 52 // CHECK: call <2 x i64> @vec_splats 53 // CHECK: call <8 x i16> @vec_add(short vector[8], short vector[8]) 54 55 // CHECK-LABEL: define available_externally i64 @_mm_add_pi8 56 // CHECK: call <2 x i64> @vec_splats 57 // CHECK: call <2 x i64> @vec_splats 58 // CHECK: call <16 x i8> @vec_add(signed char vector[16], signed char vector[16]) 59 60 // CHECK-LABEL: define available_externally i64 @_mm_adds_pu16 61 // CHECK: call <2 x i64> @vec_splats 62 // CHECK: call <2 x i64> @vec_splats 63 // CHECK: call <8 x i16> @vec_adds(unsigned short vector[8], unsigned short vector[8]) 64 65 // CHECK-LABEL: define available_externally i64 @_mm_adds_pu8 66 // CHECK: call <2 x i64> @vec_splats 67 // CHECK: call <2 x i64> @vec_splats 68 // CHECK: call <16 x i8> @vec_adds(unsigned char vector[16], unsigned char vector[16]) 69 70 // CHECK-LABEL: define available_externally i64 @_mm_adds_pi16 71 // CHECK: call <2 x i64> @vec_splats 72 // CHECK: call <2 x i64> @vec_splats 73 // CHECK: call <8 x i16> @vec_adds(short vector[8], short vector[8]) 74 75 // CHECK-LABEL: define available_externally i64 @_mm_adds_pi8 76 // CHECK: call <2 x i64> @vec_splats 77 // CHECK: call <2 x i64> @vec_splats 78 // CHECK: call <16 x i8> @vec_adds(signed char vector[16], signed char vector[16]) 79 80 void __attribute__((noinline)) 81 test_alt_name_add() { 82 res = _m_paddb(m1, m2); 83 res = _m_paddd(m1, m2); 84 res = _m_paddsb(m1, m2); 85 res = _m_paddsw(m1, m2); 86 res = _m_paddusb(m1, m2); 87 res = _m_paddusw(m1, m2); 88 res = _m_paddw(m1, m2); 89 } 90 91 // CHECK-LABEL: @test_alt_name_add 92 93 // CHECK-LABEL: define available_externally i64 @_m_paddb 94 // CHECK: call i64 @_mm_add_pi8 95 96 // CHECK-LABEL: define available_externally i64 @_m_paddd 97 // CHECK: call i64 @_mm_add_pi32 98 99 // CHECK-LABEL: define available_externally i64 @_m_paddsb 100 // CHECK: call i64 @_mm_adds_pi8 101 102 // CHECK-LABEL: define available_externally i64 @_m_paddsw 103 // CHECK: call i64 @_mm_adds_pi16 104 105 // CHECK-LABEL: define available_externally i64 @_m_paddusb 106 // CHECK: call i64 @_mm_adds_pu8 107 108 // CHECK-LABEL: define available_externally i64 @_m_paddusw 109 // CHECK: call i64 @_mm_adds_pu16 110 111 // CHECK-LABEL: define available_externally i64 @_m_paddw 112 // CHECK: call i64 @_mm_add_pi16 113 114 void __attribute__((noinline)) 115 test_cmp() { 116 res = _mm_cmpeq_pi32(m1, m2); 117 res = _mm_cmpeq_pi16(m1, m2); 118 res = _mm_cmpeq_pi8(m1, m2); 119 res = _mm_cmpgt_pi32(m1, m2); 120 res = _mm_cmpgt_pi16(m1, m2); 121 res = _mm_cmpgt_pi8(m1, m2); 122 } 123 124 // CHECK-LABEL: @test_cmp 125 126 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi32 127 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 128 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 129 // CHECK-P9: call <4 x i32> @vec_cmpeq(int vector[4], int vector[4]) 130 // CHECK-P8: %[[CMP1:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 131 // CHECK-P8: select i1 %[[CMP1]], i32 -1, i32 0 132 // CHECK-P8: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 133 // CHECK-P8: select i1 %[[CMP2]], i32 -1, i32 0 134 135 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi16 136 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 137 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 138 // CHECK: call <8 x i16> @vec_cmpeq(short vector[8], short vector[8]) 139 140 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi8 141 // CHECK: call i64 asm "cmpb $0,$1,$2;\0A", "=r,r,r" 142 143 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi32 144 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 145 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 146 // CHECK-P9: call <4 x i32> @vec_cmpgt(int vector[4], int vector[4]) 147 // CHECK-P8: %[[CMP1:[0-9a-zA-Z_.]+]] = icmp sgt i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 148 // CHECK-P8: select i1 %[[CMP1]], i32 -1, i32 0 149 // CHECK-P8: [[CMP2:[0-9a-zA-Z_.]+]] = icmp sgt i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 150 // CHECK-P8: select i1 %[[CMP2]], i32 -1, i32 0 151 152 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi16 153 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 154 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 155 // CHECK: call <8 x i16> @vec_cmpgt(short vector[8], short vector[8]) 156 157 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi8 158 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 159 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 160 // CHECK: call <16 x i8> @vec_cmpgt(signed char vector[16], signed char vector[16]) 161 162 void __attribute__((noinline)) 163 test_alt_name_cmp() { 164 res = _m_pcmpeqb(m1, m2); 165 res = _m_pcmpeqd(m1, m2); 166 res = _m_pcmpeqw(m1, m2); 167 res = _m_pcmpgtb(m1, m2); 168 res = _m_pcmpgtd(m1, m2); 169 res = _m_pcmpgtw(m1, m2); 170 } 171 172 // CHECK-LABEL: @test_alt_name_cmp 173 174 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqb 175 // CHECK: call i64 @_mm_cmpeq_pi8 176 177 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqd 178 // CHECK: call i64 @_mm_cmpeq_pi32 179 180 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqw 181 // CHECK: call i64 @_mm_cmpeq_pi16 182 183 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtb 184 // CHECK: call i64 @_mm_cmpgt_pi8 185 186 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtd 187 // CHECK: call i64 @_mm_cmpgt_pi32 188 189 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtw 190 // CHECK: call i64 @_mm_cmpgt_pi16 191 192 void __attribute__((noinline)) 193 test_convert() { 194 ll1 = _mm_cvtm64_si64(m1); 195 m1 = _mm_cvtsi32_si64(i1); 196 m1 = _mm_cvtsi64_m64(ll1); 197 i1 = _mm_cvtsi64_si32(m1); 198 } 199 200 // CHECK-LABEL: @test_convert 201 202 // CHECK-LABEL: define available_externally i64 @_mm_cvtm64_si64 203 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 204 // CHECK-NEXT: ret i64 %[[RESULT]] 205 206 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi32_si64 207 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load i32, i32* %{{[0-9a-zA-Z_.]+}} 208 // CHECK-NEXT: %[[RESULT:[0-9a-zA-Z_.]+]] = zext i32 %[[LOAD]] to i64 209 // CHECK-NEXT: ret i64 %[[RESULT]] 210 211 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi64_m64 212 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 213 // CHECK-NEXT: ret i64 %[[RESULT]] 214 215 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsi64_si32 216 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 217 // CHECK-NEXT: %[[RESULT:[0-9a-zA-Z_.]+]] = trunc i64 %[[LOAD]] to i32 218 // CHECK-NEXT: ret i32 %[[RESULT]] 219 220 void __attribute__((noinline)) 221 test_alt_name_convert() { 222 m1 = _m_from_int(i1); 223 m1 = _m_from_int64(ll1); 224 i1 = _m_to_int(m1); 225 ll1 = _m_to_int64(m1); 226 } 227 228 // CHECK-LABEL: @test_alt_name_convert 229 230 // CHECK-LABEL: define available_externally i64 @_m_from_int 231 // CHECK: call i64 @_mm_cvtsi32_si64 232 233 // CHECK-LABEL: define available_externally i64 @_m_from_int64 234 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}} 235 // CHECK-NEXT: ret i64 %[[RESULT]] 236 237 // CHECK-LABEL: define available_externally signext i32 @_m_to_int 238 // CHECK: call signext i32 @_mm_cvtsi64_si32 239 240 // CHECK-LABEL: define available_externally i64 @_m_to_int64 241 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}} 242 // CHECK-NEXT: ret i64 %[[RESULT]] 243 244 void __attribute__((noinline)) 245 test_empty() { 246 _mm_empty(); 247 _m_empty(); 248 } 249 250 // CHECK-LABEL: @test_empty 251 252 // CHECK-LABEL: define available_externally void @_mm_empty 253 // CHECK-NEXT: entry 254 // CHECK-NEXT: ret void 255 256 // CHECK-LABEL: define available_externally void @_m_empty 257 // CHECK-NEXT: entry 258 // CHECK-NEXT: ret void 259 260 void __attribute__((noinline)) 261 test_logic() { 262 res = _mm_and_si64(m1, m2); 263 res = _mm_andnot_si64(m1, m2); 264 res = _mm_or_si64(m1, m2); 265 res = _mm_xor_si64(m1, m2); 266 } 267 268 // CHECK-LABEL: @test_logic 269 270 // CHECK-LABEL: define available_externally i64 @_mm_and_si64 271 // CHECK: and i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 272 273 // CHECK-LABEL: define available_externally i64 @_mm_andnot_si64 274 // CHECK: %[[XOR:[0-9a-zA-Z_.]+]] = xor i64 %{{[0-9a-zA-Z_.]+}}, -1 275 // CHECK: and i64 %[[XOR]], %{{[0-9a-zA-Z_.]+}} 276 277 // CHECK-LABEL: define available_externally i64 @_mm_or_si64 278 // CHECK: or i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 279 280 // CHECK-LABEL: define available_externally i64 @_mm_xor_si64 281 // CHECK: xor i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 282 283 void __attribute__((noinline)) 284 test_alt_name_logic() { 285 res = _m_pand(m1, m2); 286 res = _m_pandn(m1, m2); 287 res = _m_por(m1, m2); 288 res = _m_pxor(m1, m2); 289 } 290 291 // CHECK-LABEL: @test_alt_name_logic 292 293 // CHECK-LABEL: define available_externally i64 @_m_pand 294 // CHECK: call i64 @_mm_and_si64 295 296 // CHECK-LABEL: define available_externally i64 @_m_pandn 297 // CHECK: call i64 @_mm_andnot_si64 298 299 // CHECK-LABEL: define available_externally i64 @_m_por 300 // CHECK: call i64 @_mm_or_si64 301 302 // CHECK-LABEL: define available_externally i64 @_m_pxor 303 // CHECK: call i64 @_mm_xor_si64 304 305 void __attribute__((noinline)) 306 test_madd() { 307 res = _mm_madd_pi16(m1, m2); 308 res = _m_pmaddwd(m1, m2); 309 } 310 311 // CHECK-LABEL: @test_madd 312 313 // CHECK-LABEL: define available_externally i64 @_mm_madd_pi16 314 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 315 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 316 // CHECK: call <4 x i32> @vec_vmsumshm 317 318 // CHECK-LABEL: define available_externally i64 @_m_pmaddwd 319 // CHECK: call i64 @_mm_madd_pi16 320 321 void __attribute__((noinline)) 322 test_mul() { 323 res = _mm_mulhi_pi16(m1, m2); 324 res = _mm_mullo_pi16(m1, m2); 325 } 326 327 // CHECK-LABEL: @test_mul 328 329 // CHECK-LABEL: define available_externally i64 @_mm_mulhi_pi16 330 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21> 331 // CHECK-LE: store <16 x i8> <i8 2, i8 3, i8 18, i8 19, i8 6, i8 7, i8 22, i8 23, i8 10, i8 11, i8 26, i8 27, i8 14, i8 15, i8 30, i8 31> 332 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 333 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 334 // CHECK: call <4 x i32> @vec_vmulesh 335 // CHECK: call <4 x i32> @vec_vmulosh 336 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16]) 337 338 // CHECK-LABEL: define available_externally i64 @_mm_mullo_pi16 339 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 340 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 341 // CHECK: mul <8 x i16> %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 342 343 void __attribute__((noinline)) 344 test_alt_name_mul() { 345 res = _m_pmulhw(m1, m2); 346 res = _m_pmullw(m1, m2); 347 } 348 349 // CHECK-LABEL: @test_alt_name_mul 350 351 // CHECK-LABEL: define available_externally i64 @_m_pmulhw 352 // CHECK: call i64 @_mm_mulhi_pi16 353 354 // CHECK-LABEL: define available_externally i64 @_m_pmullw 355 // CHECK: call i64 @_mm_mullo_pi16 356 357 void __attribute__((noinline)) 358 test_packs() { 359 res = _mm_packs_pu16((__m64)ull1, (__m64)ull2); 360 res = _mm_packs_pi16((__m64)ull1, (__m64)ull2); 361 res = _mm_packs_pi32((__m64)ull1, (__m64)ull2); 362 } 363 364 // CHECK-LABEL: @test_packs 365 366 // CHECK-LABEL: define available_externally i64 @_mm_packs_pu16 367 // CHECK: call <8 x i16> @vec_cmplt 368 // CHECK: call <16 x i8> @vec_packs(unsigned short vector[8], unsigned short vector[8]) 369 // CHECK: call <16 x i8> @vec_pack(bool vector[8], bool vector[8]) 370 // CHECK: call <16 x i8> @vec_sel(unsigned char vector[16], unsigned char vector[16], bool vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}}) 371 372 // CHECK-LABEL: define available_externally i64 @_mm_packs_pi16 373 // CHECK: call <16 x i8> @vec_packs(short vector[8], short vector[8]) 374 375 // CHECK-LABEL: define available_externally i64 @_mm_packs_pi32 376 // CHECK: call <8 x i16> @vec_packs(int vector[4], int vector[4]) 377 378 void __attribute__((noinline)) 379 test_alt_name_packs() { 380 res = _m_packssdw(m1, m2); 381 res = _m_packsswb(m1, m2); 382 res = _m_packuswb(m1, m2); 383 } 384 385 // CHECK-LABEL: @test_alt_name_packs 386 387 // CHECK-LABEL: define available_externally i64 @_m_packssdw 388 // CHECK: call i64 @_mm_packs_pi32 389 390 // CHECK-LABEL: define available_externally i64 @_m_packsswb 391 // CHECK: call i64 @_mm_packs_pi16 392 393 // CHECK-LABEL: define available_externally i64 @_m_packuswb 394 // CHECK: call i64 @_mm_packs_pu16 395 396 void __attribute__((noinline)) 397 test_set() { 398 m1 = _mm_set_pi32(2134, -128); 399 m1 = _mm_set_pi16(2134, -128, 1234, 6354); 400 m1 = _mm_set_pi8(-128, 10, 0, 123, -1, -5, 127, 5); 401 } 402 403 // CHECK-LABEL: @test_set 404 405 // CHECK-LABEL: define available_externally i64 @_mm_set_pi32 406 // CHECK-COUNT-2: store i32 %{{[0-9a-zA-Z_.]+}}, i32* 407 408 // CHECK-LABEL: define available_externally i64 @_mm_set_pi16 409 // CHECK-COUNT-4: store i16 %{{[0-9a-zA-Z_.]+}}, i16* 410 411 // CHECK-LABEL: define available_externally i64 @_mm_set_pi8 412 // CHECK-COUNT-8: store i8 %{{[0-9a-zA-Z_.]+}}, i8* 413 414 void __attribute__((noinline)) 415 test_set1() { 416 res = _mm_set1_pi32(i1); 417 res = _mm_set1_pi16(s[0]); 418 res = _mm_set1_pi8(c[0]); 419 } 420 421 // CHECK-LABEL: @test_set1 422 423 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi32 424 // CHECK-COUNT-2: store i32 %{{[0-9a-zA-Z_.]+}}, i32* 425 426 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi16 427 // CHECK-P9: call <8 x i16> @vec_splats(short) 428 // CHECK-P9: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 429 // CHECK-P8: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 430 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8 431 // CHECK-P8: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 432 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2 433 // CHECK-P8: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2 434 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4 435 // CHECK-P8: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3 436 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2 437 438 439 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi8 440 // CHECK: call <16 x i8> @vec_splats(signed char) 441 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <16 x i8> %{{[0-9a-zA-Z_.]+}} to <2 x i64> 442 // CHECK: extractelement <2 x i64> %[[CAST]], i32 0 443 444 void __attribute__((noinline)) 445 test_setr() { 446 res = _mm_setr_pi32(i1, i2); 447 res = _mm_setr_pi16(s[0], s[1], s[2], s[3]); 448 res = _mm_setr_pi8(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]); 449 } 450 451 // CHECK-LABEL: @test_setr 452 453 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi32 454 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 455 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8 456 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 457 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4 458 459 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi16 460 // CHECK: call i64 @_mm_set_pi16 461 462 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi8 463 // CHECK: call i64 @_mm_set_pi8 464 465 void __attribute__((noinline)) 466 test_setzero() { 467 res = _mm_setzero_si64(); 468 } 469 470 // CHECK-LABEL: @test_setzero 471 472 // CHECK-LABEL: define available_externally i64 @_mm_setzero_si64 473 // CHECK: entry 474 // CHECK-NEXT: ret i64 0 475 476 void __attribute__((noinline)) 477 test_sll() { 478 res = _mm_sll_pi16(m1, m2); 479 res = _mm_sll_pi32(m1, m2); 480 res = _mm_sll_si64(m1, m2); 481 res = _mm_slli_pi16(m1, i1); 482 res = _mm_slli_pi32(m1, i1); 483 res = _mm_slli_si64(m1, i1); 484 } 485 486 // CHECK-LABEL: @test_sll 487 488 // CHECK-LABEL: define available_externally i64 @_mm_sll_pi16 489 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15 490 // CHECK-NEXT: br i1 %[[CMP]] 491 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 492 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i16 493 // CHECK: call <8 x i16> @vec_splats(unsigned short) 494 // CHECK: call <8 x i16> @vec_sl(short vector[8], unsigned short vector[8]) 495 // CHECK: store i64 0, i64* 496 497 // CHECK-LABEL: define available_externally i64 @_mm_sll_pi32 498 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 499 // CHECK: shl i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC]] 500 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 501 // CHECK: shl i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 502 503 // CHECK-LABEL: define available_externally i64 @_mm_sll_si64 504 // CHECK: shl i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 505 506 // CHECK-LABEL: define available_externally i64 @_mm_slli_pi16 507 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 508 // CHECK: call i64 @_mm_sll_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 509 510 // CHECK-LABEL: define available_externally i64 @_mm_slli_pi32 511 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 512 // CHECK: call i64 @_mm_sll_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 513 514 // CHECK-LABEL: define available_externally i64 @_mm_slli_si64 515 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64 516 // CHECK: shl i64 %{{[0-9a-zA-Z_.]+}}, %[[EXT]] 517 518 void __attribute__((noinline)) 519 test_alt_name_sll() { 520 res = _m_pslld(m1, m2); 521 res = _m_pslldi(m1, i1); 522 res = _m_psllq(m1, m2); 523 res = _m_psllqi(m1, i1); 524 res = _m_psllw(m1, m2); 525 res = _m_psllwi(m1, i1); 526 } 527 528 // CHECK-LABEL: @test_alt_name_sll 529 530 // CHECK-LABEL: define available_externally i64 @_m_pslld 531 // CHECK: call i64 @_mm_sll_pi32 532 533 // CHECK-LABEL: define available_externally i64 @_m_pslldi 534 // CHECK: call i64 @_mm_slli_pi32 535 536 // CHECK-LABEL: define available_externally i64 @_m_psllq 537 // CHECK: call i64 @_mm_sll_si64 538 539 // CHECK-LABEL: define available_externally i64 @_m_psllqi 540 // CHECK: call i64 @_mm_slli_si64 541 542 // CHECK-LABEL: define available_externally i64 @_m_psllw 543 // CHECK: call i64 @_mm_sll_pi16 544 545 // CHECK-LABEL: define available_externally i64 @_m_psllwi 546 // CHECK: call i64 @_mm_slli_pi16 547 548 void __attribute__((noinline)) 549 test_sra() { 550 res = _mm_sra_pi32(m1, m2); 551 res = _mm_sra_pi16(m1, m2); 552 res = _mm_srai_pi32(m1, i1); 553 res = _mm_srai_pi16(m1, i1); 554 } 555 556 // CHECK-LABEL: @test_sra 557 558 // CHECK-LABEL: define available_externally i64 @_mm_sra_pi32 559 // CHECK: %[[TRUNC1:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 560 // CHECK: ashr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC1]] 561 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 562 // CHECK: ashr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC2]] 563 564 // CHECK-LABEL: define available_externally i64 @_mm_sra_pi16 565 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15 566 // CHECK: br i1 %[[CMP]] 567 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 568 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i16 569 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC]]) 570 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8]) 571 // CHECK: store i64 0, i64* 572 573 // CHECK-LABEL: define available_externally i64 @_mm_srai_pi32 574 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 575 // CHECK: call i64 @_mm_sra_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 576 577 // CHECK-LABEL: define available_externally i64 @_mm_srai_pi16 578 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 579 // CHECK: call i64 @_mm_sra_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 580 581 void __attribute__((noinline)) 582 test_alt_name_sra() { 583 res = _m_psrad(m1, m2); 584 res = _m_psraw(m1, m2); 585 res = _m_psradi(m1, i1); 586 res = _m_psrawi(m1, i1); 587 } 588 589 // CHECK-LABEL: @test_alt_name_sra 590 591 // CHECK-LABEL: define available_externally i64 @_m_psrad 592 // CHECK: call i64 @_mm_sra_pi32 593 594 // CHECK-LABEL: define available_externally i64 @_m_psraw 595 // CHECK: call i64 @_mm_sra_pi16 596 597 // CHECK-LABEL: define available_externally i64 @_m_psradi 598 // CHECK: call i64 @_mm_srai_pi32 599 600 // CHECK-LABEL: define available_externally i64 @_m_psrawi 601 // CHECK: call i64 @_mm_srai_pi16 602 603 void __attribute__((noinline)) 604 test_srl() { 605 res = _mm_srl_si64(m1, m2); 606 res = _mm_srl_pi32(m1, m2); 607 res = _mm_srl_pi16(m1, m2); 608 res = _mm_srli_si64(m1, i1); 609 res = _mm_srli_pi32(m1, i1); 610 res = _mm_srli_pi16(m1, i1); 611 } 612 613 // CHECK-LABEL: @test_srl 614 615 // CHECK-LABEL: define available_externally i64 @_mm_srl_si64 616 // CHECK: lshr i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 617 618 // CHECK-LABEL: define available_externally i64 @_mm_srl_pi32 619 // CHECK: %[[TRUNC1:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 620 // CHECK: lshr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC1]] 621 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 622 // CHECK: lshr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC2]] 623 624 // CHECK-LABEL: define available_externally i64 @_mm_srl_pi16 625 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15 626 // CHECK: br i1 %[[CMP]] 627 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 628 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i16 629 // CHECK: call <8 x i16> @vec_splats(unsigned short) 630 // CHECK: call <8 x i16> @vec_sr(unsigned short vector[8], unsigned short vector[8]) 631 // CHECK: store i64 0, i64* %{{[0-9a-zA-Z_.]+}}, align 8 632 633 // CHECK-LABEL: define available_externally i64 @_mm_srli_si64 634 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64 635 // CHECK: lshr i64 %{{[0-9a-zA-Z_.]+}}, %[[EXT]] 636 637 // CHECK-LABEL: define available_externally i64 @_mm_srli_pi32 638 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 639 // CHECK: call i64 @_mm_srl_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 640 641 // CHECK-LABEL: define available_externally i64 @_mm_srli_pi16 642 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 643 // CHECK: call i64 @_mm_srl_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]]) 644 645 void __attribute__((noinline)) 646 test_alt_name_srl() { 647 res = _m_psrlq(m1, m2); 648 res = _m_psrld(m1, m2); 649 res = _m_psrlw(m1, m2); 650 res = _m_psrlqi(m1, i1); 651 res = _m_psrldi(m1, i1); 652 res = _m_psrlwi(m1, i1); 653 } 654 655 // CHECK-LABEL: @test_alt_name_srl 656 657 // CHECK-LABEL: define available_externally i64 @_m_psrlq 658 // CHECK: call i64 @_mm_srl_si64 659 660 // CHECK-LABEL: define available_externally i64 @_m_psrld 661 // CHECK: call i64 @_mm_srl_pi32 662 663 // CHECK-LABEL: define available_externally i64 @_m_psrlw 664 // CHECK: call i64 @_mm_srl_pi16 665 666 // CHECK-LABEL: define available_externally i64 @_m_psrlqi 667 // CHECK: call i64 @_mm_srli_si64 668 669 // CHECK-LABEL: define available_externally i64 @_m_psrldi 670 // CHECK: call i64 @_mm_srli_pi32 671 672 // CHECK-LABEL: define available_externally i64 @_m_psrlwi 673 // CHECK: call i64 @_mm_srli_pi16 674 675 void __attribute__((noinline)) 676 test_sub() { 677 res = _mm_sub_pi32(m1, m2); 678 res = _mm_sub_pi16(m1, m2); 679 res = _mm_sub_pi8(m1, m2); 680 res = _mm_subs_pi16(m1, m2); 681 res = _mm_subs_pi8(m1, m2); 682 res = _mm_subs_pu16(m1, m2); 683 res = _mm_subs_pu8(m1, m2); 684 } 685 686 // CHECK-LABEL: @test_sub 687 688 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi32 689 // CHECK-P8-COUNT-2: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 690 // CHECK-P8: sub nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 691 // CHECK-P8-COUNT-2: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 692 // CHECK-P8: sub nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}} 693 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 694 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long) 695 // CHECK-P9: call <4 x i32> @vec_sub(int vector[4], int vector[4]) 696 697 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi16 698 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 699 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 700 // CHECK: call <8 x i16> @vec_sub(short vector[8], short vector[8]) 701 702 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi8 703 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 704 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 705 // CHECK: call <16 x i8> @vec_sub(signed char vector[16], signed char vector[16]) 706 707 // CHECK-LABEL: define available_externally i64 @_mm_subs_pi16 708 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 709 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 710 // CHECK: call <8 x i16> @vec_subs(short vector[8], short vector[8]) 711 712 // CHECK-LABEL: define available_externally i64 @_mm_subs_pi8 713 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 714 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 715 // CHECK: call <16 x i8> @vec_subs(signed char vector[16], signed char vector[16]) 716 717 // CHECK-LABEL: define available_externally i64 @_mm_subs_pu16 718 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 719 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 720 // CHECK: call <8 x i16> @vec_subs(unsigned short vector[8], unsigned short vector[8]) 721 722 // CHECK-LABEL: define available_externally i64 @_mm_subs_pu8 723 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 724 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 725 // CHECK: call <16 x i8> @vec_subs(unsigned char vector[16], unsigned char vector[16]) 726 727 void __attribute__((noinline)) 728 test_alt_name_sub() { 729 res = _m_psubd(m1, m2); 730 res = _m_psubw(m1, m2); 731 res = _m_psubb(m1, m2); 732 res = _m_psubsw(m1, m2); 733 res = _m_psubsb(m1, m2); 734 res = _m_psubusw(m1, m2); 735 res = _m_psubusb(m1, m2); 736 } 737 738 // CHECK-LABEL: @test_alt_name_sub 739 740 // CHECK-LABEL: define available_externally i64 @_m_psubd 741 // CHECK: call i64 @_mm_sub_pi32 742 743 // CHECK-LABEL: define available_externally i64 @_m_psubw 744 // CHECK: call i64 @_mm_sub_pi16 745 746 // CHECK-LABEL: define available_externally i64 @_m_psubb 747 // CHECK: call i64 @_mm_sub_pi8 748 749 // CHECK-LABEL: define available_externally i64 @_m_psubsw 750 // CHECK: call i64 @_mm_subs_pi16 751 752 // CHECK-LABEL: define available_externally i64 @_m_psubsb 753 // CHECK: call i64 @_mm_subs_pi8 754 755 // CHECK-LABEL: define available_externally i64 @_m_psubusw 756 // CHECK: call i64 @_mm_subs_pu16 757 758 // CHECK-LABEL: define available_externally i64 @_m_psubusb 759 // CHECK: call i64 @_mm_subs_pu8 760 761 void __attribute__((noinline)) 762 test_unpack() { 763 res = _mm_unpackhi_pi32(m1, m2); 764 res = _mm_unpackhi_pi16(m1, m2); 765 res = _mm_unpackhi_pi8(m1, m2); 766 res = _mm_unpacklo_pi32(m1, m2); 767 res = _mm_unpacklo_pi16(m1, m2); 768 res = _mm_unpacklo_pi8(m1, m2); 769 } 770 771 // CHECK-LABEL: @test_unpack 772 773 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi32 774 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 775 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 776 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8 777 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 778 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 779 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4 780 781 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi16 782 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2 783 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 784 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8 785 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2 786 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 787 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2 788 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3 789 // CHECK: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2 790 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4 791 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3 792 // CHECK: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3 793 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2 794 795 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi8 796 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 797 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 798 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16]) 799 800 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi32 801 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 802 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 803 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8 804 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 805 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 806 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4 807 808 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi16 809 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 810 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 811 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8 812 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0 813 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 814 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2 815 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 816 // CHECK: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2 817 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4 818 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1 819 // CHECK: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3 820 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2 821 822 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi8 823 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 824 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 825 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16]) 826 827 void __attribute__((noinline)) 828 test_alt_name_unpack() { 829 res = _m_punpckhdq(m1, m2); 830 res = _m_punpckhwd(m1, m2); 831 res = _m_punpckhbw(m1, m2); 832 res = _m_punpckldq(m1, m2); 833 res = _m_punpcklwd(m1, m2); 834 res = _m_punpcklbw(m1, m2); 835 } 836 837 // CHECK-LABEL: @test_alt_name_unpack 838 839 // CHECK-LABEL: define available_externally i64 @_m_punpckhdq 840 // CHECK: call i64 @_mm_unpackhi_pi32 841 842 // CHECK-LABEL: define available_externally i64 @_m_punpckhwd 843 // CHECK: call i64 @_mm_unpackhi_pi16 844 845 // CHECK-LABEL: define available_externally i64 @_m_punpckhbw 846 // CHECK: call i64 @_mm_unpackhi_pi8 847 848 // CHECK-LABEL: define available_externally i64 @_m_punpckldq 849 // CHECK: call i64 @_mm_unpacklo_pi32 850 851 // CHECK-LABEL: define available_externally i64 @_m_punpcklwd 852 // CHECK: call i64 @_mm_unpacklo_pi16 853 854 // CHECK-LABEL: define available_externally i64 @_m_punpcklbw 855 // CHECK: call i64 @_mm_unpacklo_pi8 856