1 // REQUIRES: powerpc-registered-target 2 3 // RUN: %clang -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr8 -ffreestanding -DNO_WARN_X86_INTRINSICS %s \ 4 // RUN: -ffp-contract=off -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK,CHECK-BE 5 // RUN: %clang -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr8 -ffreestanding -DNO_WARN_X86_INTRINSICS %s \ 6 // RUN: -ffp-contract=off -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK,CHECK-LE 7 8 // CHECK-BE-DAG: @_mm_movemask_pd.perm_mask = internal constant <4 x i32> <i32 -2139062144, i32 -2139062144, i32 -2139062144, i32 -2139078656>, align 16 9 // CHECK-BE-DAG: @_mm_shuffle_epi32.permute_selectors = internal constant [4 x i32] [i32 66051, i32 67438087, i32 134810123, i32 202182159], align 4 10 // CHECK-BE-DAG: @_mm_shufflehi_epi16.permute_selectors = internal constant [4 x i16] [i16 2057, i16 2571, i16 3085, i16 3599], align 2 11 // CHECK-BE-DAG: @_mm_shufflelo_epi16.permute_selectors = internal constant [4 x i16] [i16 1, i16 515, i16 1029, i16 1543], align 2 12 13 // CHECK-LE-DAG: @_mm_movemask_pd.perm_mask = internal constant <4 x i32> <i32 -2139094976, i32 -2139062144, i32 -2139062144, i32 -2139062144>, align 16 14 // CHECK-LE-DAG: @_mm_shuffle_epi32.permute_selectors = internal constant [4 x i32] [i32 50462976, i32 117835012, i32 185207048, i32 252579084], align 4 15 // CHECK-LE-DAG: @_mm_shufflehi_epi16.permute_selectors = internal constant [4 x i16] [i16 2312, i16 2826, i16 3340, i16 3854], align 2 16 // CHECK-LE-DAG: @_mm_shufflelo_epi16.permute_selectors = internal constant [4 x i16] [i16 256, i16 770, i16 1284, i16 1798], align 2 17 18 #include <emmintrin.h> 19 20 __m128i resi, mi1, mi2; 21 __m128i *mip; 22 double dp[2]; 23 __m128d resd, md1, md2; 24 __m64 res64, m641, m642; 25 __m128 res, m1; 26 int i; 27 char chs[16]; 28 int is[4]; 29 short ss[8]; 30 long long i64s[2]; 31 32 void __attribute__((noinline)) 33 test_add() { 34 resi = _mm_add_epi64(mi1, mi2); 35 resi = _mm_add_epi32(mi1, mi2); 36 resi = _mm_add_epi16(mi1, mi2); 37 resi = _mm_add_epi8(mi1, mi2); 38 resd = _mm_add_pd(md1, md2); 39 resd = _mm_add_sd(md1, md2); 40 res64 = _mm_add_si64(m641, m642); 41 resi = _mm_adds_epi16(mi1, mi2); 42 resi = _mm_adds_epi8(mi1, mi2); 43 resi = _mm_adds_epu16(mi1, mi2); 44 resi = _mm_adds_epu8(mi1, mi2); 45 } 46 47 // CHECK-LABEL: @test_add 48 49 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi64 50 // CHECK: add <2 x i64> 51 52 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi32 53 // CHECK: add <4 x i32> 54 55 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi16 56 // CHECK: add <8 x i16> 57 58 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi8 59 // CHECK: add <16 x i8> 60 61 // CHECK-LABEL: define available_externally <2 x double> @_mm_add_pd 62 // CHECK: fadd <2 x double> 63 64 // CHECK-LABEL: define available_externally <2 x double> @_mm_add_sd 65 // CHECK: fadd double 66 67 // CHECK-LABEL: define available_externally i64 @_mm_add_si64 68 // CHECK: add i64 69 70 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epi16 71 // CHECK: call <8 x i16> @vec_adds(short vector[8], short vector[8]) 72 73 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epi8 74 // CHECK: call <16 x i8> @vec_adds(signed char vector[16], signed char vector[16]) 75 76 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epu16 77 // CHECK: call <8 x i16> @vec_adds(unsigned short vector[8], unsigned short vector[8]) 78 79 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epu8 80 // CHECK: call <16 x i8> @vec_adds(unsigned char vector[16], unsigned char vector[16]) 81 82 void __attribute__((noinline)) 83 test_avg() { 84 resi = _mm_avg_epu16(mi1, mi2); 85 resi = _mm_avg_epu8(mi1, mi2); 86 } 87 88 // CHECK-LABEL: @test_avg 89 90 // CHECK-LABEL: define available_externally <2 x i64> @_mm_avg_epu16 91 // CHECK: call <8 x i16> @vec_avg(unsigned short vector[8], unsigned short vector[8]) 92 93 // CHECK-LABEL: define available_externally <2 x i64> @_mm_avg_epu8 94 // CHECK: call <16 x i8> @vec_avg(unsigned char vector[16], unsigned char vector[16]) 95 96 void __attribute__((noinline)) 97 test_bs() { 98 resi = _mm_bslli_si128(mi1, i); 99 resi = _mm_bsrli_si128(mi1, i); 100 } 101 102 // CHECK-LABEL: @test_bs 103 104 // CHECK-LABEL: define available_externally <2 x i64> @_mm_bslli_si128 105 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 106 // CHECK: br i1 %[[CMP]] 107 // CHECK: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, i32 noundef zeroext %{{[0-9a-zA-Z_.]+}}) 108 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 109 110 // CHECK-LABEL: define available_externally <2 x i64> @_mm_bsrli_si128 111 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 112 // CHECK: br i1 %[[CMP]] 113 // CHECK-LE: call i1 @llvm.is.constant 114 // CHECK-LE: %[[SUB:[0-9a-zA-Z_.]+]] = sub nsw i32 16, %{{[0-9a-zA-Z_.]+}} 115 // CHECK-LE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext %[[SUB]]) 116 // CHECK-LE: %[[MUL:[0-9a-zA-Z_.]+]] = mul nsw i32 %{{[0-9a-zA-Z_.]+}}, 8 117 // CHECK-LE: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %[[MUL]] to i8 118 // CHECK-LE: call <16 x i8> @vec_splats(unsigned char)(i8 noundef zeroext %[[TRUNC]]) 119 // CHECK-LE: call <16 x i8> @vec_sro(unsigned char vector[16], unsigned char vector[16]) 120 // CHECK-LE: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 121 // CHECK-BE: %[[MUL:[0-9a-zA-Z_.]+]] = mul nsw i32 %{{[0-9a-zA-Z_.]+}}, 8 122 // CHECK-BE: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %[[MUL]] to i8 123 // CHECK-BE: call <16 x i8> @vec_splats(unsigned char)(i8 noundef zeroext %[[TRUNC]]) 124 // CHECK-BE: call <16 x i8> @vec_slo(unsigned char vector[16], unsigned char vector[16]) 125 // CHECK-BE: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 126 127 void __attribute__((noinline)) 128 test_cast() { 129 res = _mm_castpd_ps(md1); 130 resi = _mm_castpd_si128(md1); 131 resd = _mm_castps_pd(m1); 132 resi = _mm_castps_si128(m1); 133 resd = _mm_castsi128_pd(mi1); 134 res = _mm_castsi128_ps(mi1); 135 } 136 137 // CHECK-LABEL: @test_cast 138 139 // CHECK-LABEL: define available_externally <4 x float> @_mm_castpd_ps 140 // CHECK: bitcast <2 x double> %{{[0-9a-zA-Z_.]+}} to <4 x float> 141 142 // CHECK-LABEL: define available_externally <2 x i64> @_mm_castpd_si128 143 // CHECK: bitcast <2 x double> %{{[0-9a-zA-Z_.]+}} to <2 x i64> 144 145 // CHECK-LABEL: define available_externally <2 x double> @_mm_castps_pd 146 // CHECK: bitcast <4 x float> %{{[0-9a-zA-Z_.]+}} to <2 x double> 147 148 // CHECK-LABEL: define available_externally <2 x i64> @_mm_castps_si128 149 // CHECK: bitcast <4 x float> %{{[0-9a-zA-Z_.]+}} to <2 x i64> 150 151 // CHECK-LABEL: define available_externally <2 x double> @_mm_castsi128_pd 152 // CHECK: bitcast <2 x i64> %{{[0-9a-zA-Z_.]+}} to <2 x double> 153 154 // CHECK-LABEL: define available_externally <4 x float> @_mm_castsi128_ps 155 // CHECK: bitcast <2 x i64> %{{[0-9a-zA-Z_.]+}} to <4 x float> 156 157 void __attribute__((noinline)) 158 test_cmp() { 159 resi = _mm_cmpeq_epi32(mi1, mi2); 160 resi = _mm_cmpeq_epi16(mi1, mi2); 161 resi = _mm_cmpeq_epi8(mi1, mi2); 162 resi = _mm_cmpgt_epi32(mi1, mi2); 163 resi = _mm_cmpgt_epi16(mi1, mi2); 164 resi = _mm_cmpgt_epi8(mi1, mi2); 165 resi = _mm_cmplt_epi32(mi1, mi2); 166 resi = _mm_cmplt_epi16(mi1, mi2); 167 resi = _mm_cmplt_epi8(mi1, mi2); 168 resd = _mm_cmpeq_pd(md1, md2); 169 resd = _mm_cmpeq_sd(md1, md2); 170 resd = _mm_cmpge_pd(md1, md2); 171 resd = _mm_cmpge_sd(md1, md2); 172 resd = _mm_cmpgt_pd(md1, md2); 173 resd = _mm_cmpgt_sd(md1, md2); 174 resd = _mm_cmple_pd(md1, md2); 175 resd = _mm_cmple_sd(md1, md2); 176 resd = _mm_cmplt_pd(md1, md2); 177 resd = _mm_cmplt_sd(md1, md2); 178 resd = _mm_cmpneq_pd(md1, md2); 179 resd = _mm_cmpneq_sd(md1, md2); 180 resd = _mm_cmpnge_pd(md1, md2); 181 resd = _mm_cmpnge_sd(md1, md2); 182 resd = _mm_cmpngt_pd(md1, md2); 183 resd = _mm_cmpngt_sd(md1, md2); 184 resd = _mm_cmpnle_pd(md1, md2); 185 resd = _mm_cmpnle_sd(md1, md2); 186 resd = _mm_cmpnlt_pd(md1, md2); 187 resd = _mm_cmpnlt_sd(md1, md2); 188 resd = _mm_cmpord_pd(md1, md2); 189 resd = _mm_cmpord_sd(md1, md2); 190 resd = _mm_cmpunord_pd(md1, md2); 191 resd = _mm_cmpunord_sd(md1, md2); 192 } 193 194 // CHECK-LABEL: @test_cmp 195 196 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi32 197 // CHECK: call <4 x i32> @vec_cmpeq(int vector[4], int vector[4]) 198 199 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi16 200 // CHECK: call <8 x i16> @vec_cmpeq(short vector[8], short vector[8]) 201 202 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi8 203 // CHECK: call <16 x i8> @vec_cmpeq(signed char vector[16], signed char vector[16]) 204 205 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi32 206 // CHECK: call <4 x i32> @vec_cmpgt(int vector[4], int vector[4]) 207 208 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi16 209 // CHECK: call <8 x i16> @vec_cmpgt(short vector[8], short vector[8]) 210 211 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi8 212 // CHECK: call <16 x i8> @vec_cmpgt(signed char vector[16], signed char vector[16]) 213 214 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi32 215 // CHECK: call <4 x i32> @vec_cmplt(int vector[4], int vector[4]) 216 217 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi16 218 // CHECK: call <8 x i16> @vec_cmplt(short vector[8], short vector[8]) 219 220 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi8 221 // CHECK: call <16 x i8> @vec_cmplt(signed char vector[16], signed char vector[16]) 222 223 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpeq_pd 224 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 225 226 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpeq_sd 227 // CHECK: call <2 x double> @vec_splats(double) 228 // CHECK: call <2 x double> @vec_splats(double) 229 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 230 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 231 232 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpge_pd 233 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2]) 234 235 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpge_sd 236 // CHECK: call <2 x double> @vec_splats(double) 237 // CHECK: call <2 x double> @vec_splats(double) 238 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2]) 239 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 240 241 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpgt_pd 242 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2]) 243 244 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpgt_sd 245 // CHECK: call <2 x double> @vec_splats(double) 246 // CHECK: call <2 x double> @vec_splats(double) 247 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2]) 248 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 249 250 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmple_pd 251 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2]) 252 253 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmple_sd 254 // CHECK: call <2 x double> @vec_splats(double) 255 // CHECK: call <2 x double> @vec_splats(double) 256 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2]) 257 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 258 259 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmplt_pd 260 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2]) 261 262 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmplt_sd 263 // CHECK: call <2 x double> @vec_splats(double) 264 // CHECK: call <2 x double> @vec_splats(double) 265 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2]) 266 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 267 268 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpneq_pd 269 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 270 // CHECK: call <2 x double> @vec_nor(double vector[2], double vector[2]) 271 272 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpneq_sd 273 // CHECK: call <2 x double> @vec_splats(double) 274 // CHECK: call <2 x double> @vec_splats(double) 275 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 276 // CHECK: call <2 x double> @vec_nor(double vector[2], double vector[2]) 277 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 278 279 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnge_pd 280 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2]) 281 282 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnge_sd 283 // CHECK: call <2 x double> @vec_splats(double) 284 // CHECK: call <2 x double> @vec_splats(double) 285 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2]) 286 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 287 288 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpngt_pd 289 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2]) 290 291 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpngt_sd 292 // CHECK: call <2 x double> @vec_splats(double) 293 // CHECK: call <2 x double> @vec_splats(double) 294 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2]) 295 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 296 297 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnle_pd 298 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2]) 299 300 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnle_sd 301 // CHECK: call <2 x double> @vec_splats(double) 302 // CHECK: call <2 x double> @vec_splats(double) 303 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2]) 304 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 305 306 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnlt_pd 307 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2]) 308 309 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnlt_sd 310 // CHECK: call <2 x double> @vec_splats(double) 311 // CHECK: call <2 x double> @vec_splats(double) 312 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2]) 313 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 314 315 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpord_pd 316 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 317 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 318 // CHECK: call <2 x i64> @vec_and(unsigned long long vector[2], unsigned long long vector[2]) 319 320 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpord_sd 321 // CHECK: call <2 x double> @vec_splats(double) 322 // CHECK: call <2 x double> @vec_splats(double) 323 // CHECK: call <2 x double> @_mm_cmpord_pd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 324 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 325 326 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpunord_pd 327 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 328 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2]) 329 // CHECK: call <2 x i64> @vec_nor(unsigned long long vector[2], unsigned long long vector[2]) 330 // CHECK: call <2 x i64> @vec_orc(unsigned long long vector[2], unsigned long long vector[2]) 331 332 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpunord_sd 333 // CHECK: call <2 x double> @vec_splats(double) 334 // CHECK: call <2 x double> @vec_splats(double) 335 // CHECK: call <2 x double> @_mm_cmpunord_pd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 336 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 337 338 void __attribute__((noinline)) 339 test_comi() { 340 i = _mm_comieq_sd(md1, md2); 341 i = _mm_comige_sd(md1, md2); 342 i = _mm_comigt_sd(md1, md2); 343 i = _mm_comile_sd(md1, md2); 344 i = _mm_comilt_sd(md1, md2); 345 i = _mm_comineq_sd(md1, md2); 346 } 347 348 // CHECK-LABEL: @test_comi 349 350 // CHECK-LABEL: define available_externally signext i32 @_mm_comieq_sd 351 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp oeq double 352 // CHECK: zext i1 %[[CMP]] to i32 353 354 // CHECK-LABEL: define available_externally signext i32 @_mm_comige_sd 355 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp oge double 356 // CHECK: zext i1 %[[CMP]] to i32 357 358 // CHECK-LABEL: define available_externally signext i32 @_mm_comigt_sd 359 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp ogt double 360 // CHECK: zext i1 %[[CMP]] to i32 361 362 // CHECK-LABEL: define available_externally signext i32 @_mm_comile_sd 363 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp ole double 364 // CHECK: zext i1 %[[CMP]] to i32 365 366 // CHECK-LABEL: define available_externally signext i32 @_mm_comilt_sd 367 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp olt double 368 // CHECK: zext i1 %[[CMP]] to i32 369 370 // CHECK-LABEL: define available_externally signext i32 @_mm_comineq_sd 371 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp une double 372 // CHECK: zext i1 %[[CMP]] to i32 373 374 void __attribute__((noinline)) 375 test_control() { 376 _mm_clflush(dp); 377 _mm_lfence(); 378 _mm_mfence(); 379 _mm_pause(); 380 } 381 382 // CHECK-LABEL: @test_control 383 384 // CHECK-LABEL: define available_externally void @_mm_clflush 385 // CHECK: call void asm sideeffect "dcbf 0,$0", "b,~{memory}"(i8* %{{[0-9a-zA-Z_.]+}}) 386 387 // CHECK-LABEL: define available_externally void @_mm_lfence() 388 // CHECK: fence release 389 390 // CHECK-LABEL: define available_externally void @_mm_mfence() 391 // CHECK: fence seq_cst 392 393 // CHECK-LABEL: define available_externally void @_mm_pause() 394 // CHECK: call i64 asm sideeffect "\09mfppr\09$0; or 31,31,31; isync; lwsync; isync; mtppr\09$0;", "=r,~{memory}"() 395 396 void __attribute__((noinline)) 397 test_converts() { 398 resd = _mm_cvtepi32_pd(mi1); 399 res = _mm_cvtepi32_ps(mi1); 400 resi = _mm_cvtpd_epi32(md1); 401 res64 = _mm_cvtpd_pi32(md1); 402 res = _mm_cvtpd_ps(md1); 403 resd = _mm_cvtpi32_pd(res64); 404 resi = _mm_cvtps_epi32(m1); 405 resd = _mm_cvtps_pd(m1); 406 *dp = _mm_cvtsd_f64(md1); 407 i = _mm_cvtsd_si32(md1); 408 i64s[0] = _mm_cvtsd_si64(md1); 409 i64s[0] = _mm_cvtsd_si64x(md1); 410 res = _mm_cvtsd_ss(m1, md2); 411 i = _mm_cvtsi128_si32(mi1); 412 i64s[0] = _mm_cvtsi128_si64(mi1); 413 i64s[0] = _mm_cvtsi128_si64x(mi1); 414 resd = _mm_cvtsi32_sd(md1, i); 415 resi = _mm_cvtsi32_si128(i); 416 resd = _mm_cvtsi64_sd(md1, i64s[1]); 417 resi = _mm_cvtsi64_si128(i64s[1]); 418 resd = _mm_cvtsi64x_sd(md1, i64s[1]); 419 resi = _mm_cvtsi64x_si128(i64s[1]); 420 resd = _mm_cvtss_sd(md1, m1); 421 resi = _mm_cvttpd_epi32(md1); 422 res64 = _mm_cvttpd_pi32(md1); 423 resi = _mm_cvttps_epi32(m1); 424 i = _mm_cvttsd_si32(md1); 425 i64s[0] = _mm_cvttsd_si64(md1); 426 i64s[0] = _mm_cvttsd_si64x(md1); 427 } 428 429 // CHECK-LABEL: @test_converts 430 431 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtepi32_pd 432 // CHECK: call <2 x i64> @vec_unpackh(int vector[4]) 433 // CHECK: %[[CONV:[0-9a-zA-Z_.]+]] = sitofp <2 x i64> %{{[0-9a-zA-Z_.]+}} to <2 x double> 434 // CHECK: fmul <2 x double> %[[CONV]], <double 1.000000e+00, double 1.000000e+00> 435 436 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtepi32_ps 437 // CHECK: call <4 x float> @llvm.ppc.altivec.vcfsx(<4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 0) 438 439 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtpd_epi32 440 // CHECK: call <2 x double> @vec_rint(double vector[2]) 441 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 442 // CHECK: call <4 x i32> asm "xvcvdpsxws ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}}) 443 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4]) 444 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer) 445 446 // CHECK-LABEL: define available_externally i64 @_mm_cvtpd_pi32 447 // CHECK: call <2 x i64> @_mm_cvtpd_epi32(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 448 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 449 450 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtpd_ps 451 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 452 // CHECK: call <4 x i32> asm "xvcvdpsp ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}}) 453 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4]) 454 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer) 455 456 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtpi32_pd 457 // CHECK: call <2 x i64> @vec_splats(unsigned long long) 458 // CHECK: call <2 x i64> @vec_unpackl(int vector[4]) 459 // CHECK: %[[CONV:[0-9a-zA-Z_.]+]] = sitofp <2 x i64> %{{[0-9a-zA-Z._]+}} to <2 x double> 460 // CHECK: fmul <2 x double> %[[CONV]], <double 1.000000e+00, double 1.000000e+00> 461 462 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtps_epi32 463 // CHECK: call <4 x float> @vec_rint(float vector[4]) 464 // CHECK: call <4 x i32> @llvm.ppc.altivec.vctsxs(<4 x float> %{{[0-9a-zA-Z_.]+}}, i32 0) 465 466 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtps_pd 467 // CHECK-BE: call <4 x float> @vec_vmrghw(float vector[4], float vector[4]) 468 // CHECK-BE: call <2 x double> asm " xvcvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}}) 469 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0> 470 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 471 // CHECK-LE: call <2 x double> asm " xvcvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}}) 472 473 // CHECK-LABEL: define available_externally double @_mm_cvtsd_f64 474 // CHECK: extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0 475 476 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsd_si32 477 // CHECK: call <2 x double> @vec_rint(double vector[2]) 478 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i32 479 480 // CHECK-LABEL: define available_externally i64 @_mm_cvtsd_si64 481 // CHECK: call <2 x double> @vec_rint(double vector[2]) 482 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i64 483 484 // CHECK-LABEL: define available_externally i64 @_mm_cvtsd_si64x 485 // CHECK: call i64 @_mm_cvtsd_si64(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 486 487 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtsd_ss 488 // CHECK-BE: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0 489 // CHECK-BE: %[[TRUNC:[0-9a-zA-Z_.]+]] = fptrunc double %[[EXT]] to float 490 // CHECK-BE: insertelement <4 x float> %{{[0-9a-zA-Z_.]+}}, float %[[TRUNC]], i32 0 491 // CHECK-LE: call <2 x double> @vec_splat(double vector[2], unsigned int)(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 492 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0> 493 // CHECK-LE: call <4 x float> asm "xscvdpsp ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}}) 494 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 7, i32 0, i32 1, i32 2> 495 496 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsi128_si32 497 // CHECK: extractelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 0 498 499 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi128_si64 500 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 501 502 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi128_si64x 503 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 504 505 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi32_sd 506 // CHECK: sitofp i32 %{{[0-9a-zA-Z_.]+}} to double 507 508 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi32_si128 509 // CHECK: call <2 x i64> @_mm_set_epi32(i32 noundef signext 0, i32 noundef signext 0, i32 noundef signext 0, i32 noundef signext %{{[0-9a-zA-Z_.]+}}) 510 511 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi64_sd 512 // CHECK: sitofp i64 %{{[0-9a-zA-Z_.]+}} to double 513 514 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi64_si128 515 // CHECK: %[[INS:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0 516 // CHECK: insertelement <2 x i64> %[[INS]], i64 0, i32 1 517 518 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi64x_sd 519 // CHECK: call <2 x double> @_mm_cvtsi64_sd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %{{[0-9a-zA-Z_.]+}}) 520 521 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi64x_si128 522 // CHECK: %[[INS:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0 523 // CHECK: insertelement <2 x i64> %[[INS]], i64 0, i32 1 524 525 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtss_sd 526 // CHECK-BE: fpext float %{{[0-9a-zA-Z_.]+}} to double 527 // CHECK-LE: call <4 x float> @vec_splat(float vector[4], unsigned int)(<4 x float> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 528 // CHECK-LE: call <2 x double> asm "xscvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}}) 529 // CHECK-LE: call <2 x double> @vec_mergel(double vector[2], double vector[2]) 530 531 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvttpd_epi32 532 // CHECK: call <4 x i32> asm "xvcvdpsxws ${0:x},${1:x}", "=^wa,^wa" 533 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4]) 534 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer) 535 536 // CHECK-LABEL: define available_externally i64 @_mm_cvttpd_pi32 537 // CHECK: call <2 x i64> @_mm_cvttpd_epi32(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 538 539 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvttps_epi32 540 // CHECK: call <4 x i32> @llvm.ppc.altivec.vctsxs(<4 x float> %{{[0-9a-zA-Z_.]+}}, i32 0) 541 542 // CHECK-LABEL: define available_externally signext i32 @_mm_cvttsd_si32 543 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i32 544 545 // CHECK-LABEL: define available_externally i64 @_mm_cvttsd_si64 546 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i64 547 548 // CHECK-LABEL: define available_externally i64 @_mm_cvttsd_si64x 549 // CHECK: call i64 @_mm_cvttsd_si64(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 550 551 void __attribute__((noinline)) 552 test_div() { 553 resd = _mm_div_pd(md1, md2); 554 resd = _mm_div_sd(md1, md2); 555 } 556 557 // CHECK-LABEL: @test_div 558 559 // CHECK-LABEL: define available_externally <2 x double> @_mm_div_pd 560 // CHECK: fdiv <2 x double> 561 562 // CHECK-LABEL: define available_externally <2 x double> @_mm_div_sd 563 // CHECK: fdiv double 564 565 void __attribute__((noinline)) 566 test_extract() { 567 i = _mm_extract_epi16(mi1, i); 568 } 569 570 // CHECK-LABEL: @test_extract 571 572 // CHECK-LABEL: define available_externally signext i32 @_mm_extract_epi16 573 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 7 574 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <8 x i16> %{{[0-9a-zA-Z_.]+}}, i32 %[[AND]] 575 // CHECK: zext i16 %[[EXT]] to i32 576 577 void __attribute__((noinline)) 578 test_insert() { 579 resi = _mm_insert_epi16 (mi1, i, is[0]); 580 } 581 582 // CHECK-LABEL: @test_insert 583 584 // CHECK-LABEL: define available_externally <2 x i64> @_mm_insert_epi16 585 // CHECK: trunc i32 %{{[0-9a-zA-Z_.]+}} to i16 586 // CHECK: and i32 %{{[0-9a-zA-Z_.]+}}, 7 587 588 void __attribute__((noinline)) 589 test_load() { 590 resd = _mm_load_pd(dp); 591 resd = _mm_load_pd1(dp); 592 resd = _mm_load_sd(dp); 593 resi = _mm_load_si128(mip); 594 resd = _mm_load1_pd(dp); 595 resd = _mm_loadh_pd(md1, dp); 596 resi = _mm_loadl_epi64(mip); 597 resd = _mm_loadl_pd(md1, dp); 598 resd = _mm_loadr_pd(dp); 599 resd = _mm_loadu_pd(dp); 600 resi = _mm_loadu_si128(mip); 601 } 602 603 // CHECK-LABEL: @test_load 604 605 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_pd 606 // CHECK: call <16 x i8> @vec_ld(long, unsigned char vector[16] const*)(i64 noundef 0, <16 x i8>* noundef %{{[0-9a-zA-Z_.]+}}) 607 608 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_pd1 609 // CHECK: call <2 x double> @_mm_load1_pd(double* noundef %{{[0-9a-zA-Z_.]+}}) 610 611 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_sd 612 // CHECK: call <2 x double> @_mm_set_sd(double noundef %{{[0-9a-zA-Z_.]+}}) 613 614 // CHECK-LABEL: define available_externally <2 x i64> @_mm_load_si128 615 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8 616 // CHECK: load <2 x i64>, <2 x i64>* %[[ADDR]], align 16 617 618 // CHECK-LABEL: define available_externally <2 x double> @_mm_load1_pd 619 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 620 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load double, double* %[[ADDR]], align 8 621 // CHECK: call <2 x double> @vec_splats(double)(double noundef %[[VAL]]) 622 623 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadh_pd 624 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 625 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load double, double* %{{[0-9a-zA-Z_.]+}}, align 8 626 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16 627 // CHECK: insertelement <2 x double> %[[VEC]], double %[[VAL]], i32 1 628 629 // CHECK-LABEL: define available_externally <2 x i64> @_mm_loadl_epi64 630 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}}) 631 632 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadl_pd 633 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 634 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = load double, double* %[[ADDR]], align 8 635 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16 636 // CHECK: insertelement <2 x double> %[[VEC]], double %[[ADDR2]], i32 0 637 638 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadr_pd 639 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 640 // CHECK: call <2 x double> @_mm_load_pd(double* noundef %[[ADDR]]) 641 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2> 642 643 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadu_pd 644 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 645 // CHECK: call <2 x double> @vec_vsx_ld(int, double const*)(i32 noundef signext 0, double* noundef %[[ADDR]]) 646 647 // CHECK-LABEL: define available_externally <2 x i64> @_mm_loadu_si128 648 // CHECK: load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8 649 // CHECK: call <4 x i32> @vec_vsx_ld(int, int const*)(i32 noundef signext 0, i32* noundef %{{[0-9a-zA-Z_.]+}}) 650 651 void __attribute__((noinline)) 652 test_logical() { 653 resd = _mm_and_pd(md1, md2); 654 resi = _mm_and_si128(mi1, mi2); 655 resd = _mm_andnot_pd(md1, md2); 656 resi = _mm_andnot_si128(mi1, mi2); 657 resd = _mm_xor_pd(md1, md2); 658 resi = _mm_xor_si128(mi1, mi2); 659 resd = _mm_or_pd(md1, md2); 660 resi = _mm_or_si128(mi1, mi2); 661 } 662 663 // CHECK-LABEL: @test_logical 664 665 // CHECK-LABEL: define available_externally <2 x double> @_mm_and_pd 666 // CHECK: call <2 x double> @vec_and(double vector[2], double vector[2]) 667 668 // CHECK-LABEL: define available_externally <2 x i64> @_mm_and_si128 669 // CHECK: call <2 x i64> @vec_and(long long vector[2], long long vector[2]) 670 671 // CHECK-LABEL: define available_externally <2 x double> @_mm_andnot_pd 672 // CHECK: call <2 x double> @vec_andc(double vector[2], double vector[2]) 673 674 // CHECK-LABEL: define available_externally <2 x i64> @_mm_andnot_si128 675 // CHECK: call <2 x i64> @vec_andc(long long vector[2], long long vector[2]) 676 677 // CHECK-LABEL: define available_externally <2 x double> @_mm_xor_pd 678 // CHECK: call <2 x double> @vec_xor(double vector[2], double vector[2]) 679 680 // CHECK-LABEL: define available_externally <2 x i64> @_mm_xor_si128 681 // CHECK: call <2 x i64> @vec_xor(long long vector[2], long long vector[2]) 682 683 // CHECK-LABEL: define available_externally <2 x double> @_mm_or_pd 684 // CHECK: call <2 x double> @vec_or(double vector[2], double vector[2]) 685 686 // CHECK-LABEL: define available_externally <2 x i64> @_mm_or_si128 687 // CHECK: call <2 x i64> @vec_or(long long vector[2], long long vector[2]) 688 689 void __attribute__((noinline)) 690 test_max() { 691 resi = _mm_max_epi16(mi1, mi2); 692 resi = _mm_max_epu8(mi1, mi2); 693 resd = _mm_max_pd(md1, md2); 694 resd = _mm_max_sd(md1, md2); 695 } 696 697 // CHECK-LABEL: @test_max 698 699 // CHECK-LABEL: define available_externally <2 x i64> @_mm_max_epi16 700 // CHECK: call <8 x i16> @vec_max(short vector[8], short vector[8]) 701 702 // CHECK-LABEL: define available_externally <2 x i64> @_mm_max_epu8 703 // CHECK: call <16 x i8> @vec_max(unsigned char vector[16], unsigned char vector[16]) 704 705 // CHECK-LABEL: define available_externally <2 x double> @_mm_max_pd 706 // CHECK: call <2 x double> @vec_max(double vector[2], double vector[2]) 707 708 // CHECK-LABEL: define available_externally <2 x double> @_mm_max_sd 709 // CHECK: call <2 x double> @vec_splats(double) 710 // CHECK: call <2 x double> @vec_splats(double) 711 // CHECK: call <2 x double> @vec_max(double vector[2], double vector[2]) 712 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 713 714 void __attribute__((noinline)) 715 test_min() { 716 resi = _mm_min_epi16(mi1, mi2); 717 resi = _mm_min_epu8(mi1, mi2); 718 resd = _mm_min_pd(md1, md2); 719 resd = _mm_min_sd(md1, md2); 720 } 721 722 // CHECK-LABEL: @test_min 723 724 // CHECK-LABEL: define available_externally <2 x i64> @_mm_min_epi16 725 // CHECK: call <8 x i16> @vec_min(short vector[8], short vector[8]) 726 727 // CHECK-LABEL: define available_externally <2 x i64> @_mm_min_epu8 728 // CHECK: call <16 x i8> @vec_min(unsigned char vector[16], unsigned char vector[16]) 729 730 // CHECK-LABEL: define available_externally <2 x double> @_mm_min_pd 731 // CHECK: call <2 x double> @vec_min(double vector[2], double vector[2]) 732 733 // CHECK-LABEL: define available_externally <2 x double> @_mm_min_sd 734 // CHECK: call <2 x double> @vec_splats(double) 735 // CHECK: call <2 x double> @vec_splats(double) 736 // CHECK: call <2 x double> @vec_min(double vector[2], double vector[2]) 737 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 738 739 void __attribute__((noinline)) 740 test_move() { 741 resi = _mm_move_epi64(mi1); 742 resd = _mm_move_sd(md1, md2); 743 i = _mm_movemask_epi8(mi1); 744 i = _mm_movemask_pd(md1); 745 res64 = _mm_movepi64_pi64(mi1); 746 resi = _mm_movpi64_epi64(m641); 747 _mm_maskmoveu_si128(mi1, mi2, chs); 748 } 749 750 // CHECK-LABEL: @test_move 751 752 // CHECK-LABEL: define available_externally <2 x i64> @_mm_move_epi64 753 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}}) 754 755 // CHECK-LABEL: define available_externally <2 x double> @_mm_move_sd 756 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0 757 // CHECK: insertelement <2 x double> %{{[0-9a-zA-Z_.]+}}, double %[[EXT]], i32 0 758 759 // CHECK-LABEL: define available_externally signext i32 @_mm_movemask_epi8 760 // CHECK: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef <i8 120, i8 112, i8 104, i8 96, i8 88, i8 80, i8 72, i8 64, i8 56, i8 48, i8 40, i8 32, i8 24, i8 16, i8 8, i8 0>) 761 // CHECK-LE: %[[VAL:[0-9a-zA-Z_.]+]] = extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 1 762 // CHECK-BE: %[[VAL:[0-9a-zA-Z_.]+]] = extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 763 // CHECK: trunc i64 %[[VAL]] to i32 764 765 // CHECK-LABEL: define available_externally signext i32 @_mm_movemask_pd 766 // CHECK-LE: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef bitcast (<4 x i32> <i32 -2139094976, i32 -2139062144, i32 -2139062144, i32 -2139062144> to <16 x i8>)) 767 // CHECK-LE: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 1 768 // CHECK-BE: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef bitcast (<4 x i32> <i32 -2139062144, i32 -2139062144, i32 -2139062144, i32 -2139078656> to <16 x i8>)) 769 // CHECK-BE: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 770 771 // CHECK-LABEL: define available_externally i64 @_mm_movepi64_pi64 772 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0 773 774 // CHECK-LABEL: define available_externally <2 x i64> @_mm_movpi64_epi64 775 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}}) 776 777 // CHECK-LABEL: define available_externally void @_mm_maskmoveu_si128 778 // CHECK: call <2 x i64> @_mm_loadu_si128(<2 x i64>* noundef %{{[0-9a-zA-Z_.]+}}) 779 // CHECK: call <16 x i8> @vec_cmpgt(unsigned char vector[16], unsigned char vector[16]) 780 // CHECK: call <16 x i8> @vec_sel(unsigned char vector[16], unsigned char vector[16], unsigned char vector[16]) 781 // CHECK: call void @_mm_storeu_si128(<2 x i64>* noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef %{{[0-9a-zA-Z_.]+}}) 782 783 void __attribute__((noinline)) 784 test_mul() { 785 resi = _mm_mul_epu32(mi1, mi2); 786 resd = _mm_mul_pd(md1, md2); 787 resd = _mm_mul_sd(md1, md2); 788 res64 = _mm_mul_su32(m641, m642); 789 resi = _mm_mulhi_epi16(mi1, mi2); 790 resi = _mm_mulhi_epu16(mi1, mi2); 791 resi = _mm_mullo_epi16(mi1, mi2); 792 } 793 794 // CHECK-LABEL: @test_mul 795 796 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mul_epu32 797 // CHECK-LE: call <2 x i64> asm "vmulouw $0,$1,$2", "=v,v,v"(<2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}) 798 // CHECK-BE: call <2 x i64> asm "vmuleuw $0,$1,$2", "=v,v,v"(<2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}) 799 800 // CHECK-LABEL: define available_externally <2 x double> @_mm_mul_pd 801 // CHECK: fmul <2 x double> 802 803 // CHECK-LABEL: define available_externally <2 x double> @_mm_mul_sd 804 // CHECK: fmul double 805 806 // CHECK-LABEL: define available_externally i64 @_mm_mul_su32 807 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 808 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32 809 // CHECK: %[[EXT1:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64 810 // CHECK: %[[EXT2:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64 811 // CHECK: mul i64 %[[EXT1]], %[[EXT2]] 812 813 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mulhi_epi16 814 // 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>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 815 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 8, i8 9, i8 24, i8 25, i8 12, i8 13, i8 28, i8 29>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 816 // CHECK: call <4 x i32> @vec_vmulesh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}}) 817 // CHECK: call <4 x i32> @vec_vmulosh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}}) 818 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16]) 819 820 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mulhi_epu16 821 // 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>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 822 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 8, i8 9, i8 24, i8 25, i8 12, i8 13, i8 28, i8 29>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 823 // CHECK: call <4 x i32> @vec_vmuleuh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}}) 824 // CHECK: call <4 x i32> @vec_vmulouh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}}) 825 // CHECK: call <4 x i32> @vec_perm(unsigned int vector[4], unsigned int vector[4], unsigned char vector[16]) 826 827 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mullo_epi16 828 // CHECK: mul <8 x i16> 829 830 void __attribute__((noinline)) 831 test_pack() { 832 resi = _mm_packs_epi16(mi1, mi2); 833 resi = _mm_packs_epi32(mi1, mi2); 834 resi = _mm_packus_epi16(mi1, mi2); 835 } 836 837 // CHECK-LABEL: @test_pack 838 839 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packs_epi16 840 // CHECK: call <16 x i8> @vec_packs(short vector[8], short vector[8]) 841 842 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packs_epi32 843 // CHECK: call <8 x i16> @vec_packs(int vector[4], int vector[4]) 844 845 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packus_epi16 846 // CHECK: call <16 x i8> @vec_packsu(short vector[8], short vector[8]) 847 848 void __attribute__((noinline)) 849 test_sad() { 850 resi = _mm_sad_epu8(mi1, mi2); 851 } 852 853 // CHECK-LABEL: @test_sad 854 855 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sad_epu8 856 // CHECK: call <16 x i8> @vec_min(unsigned char vector[16], unsigned char vector[16]) 857 // CHECK: call <16 x i8> @vec_max(unsigned char vector[16], unsigned char vector[16]) 858 // CHECK: call <16 x i8> @vec_sub(unsigned char vector[16], unsigned char vector[16]) 859 // CHECK: call <4 x i32> @vec_sum4s(unsigned char vector[16], unsigned int vector[4])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef zeroinitializer) 860 // CHECK: call <4 x i32> @vec_sum2s(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef zeroinitializer) 861 // CHECK-LE: call <4 x i32> @vec_sld(int vector[4], int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 4) 862 // CHECK-BE: call <4 x i32> @vec_sld(int vector[4], int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 6) 863 864 void __attribute__((noinline)) 865 test_set() { 866 resi = _mm_set_epi16(ss[7], ss[6], ss[5], ss[4], ss[3], ss[2], ss[1], ss[0]); 867 resi = _mm_set_epi32(is[3], is[2], is[1], is[0]); 868 resi = _mm_set_epi64(m641, m642); 869 resi = _mm_set_epi64x(i64s[0], i64s[1]); 870 resi = _mm_set_epi8(chs[15], chs[14], chs[13], chs[12], chs[11], chs[10], chs[9], chs[8], chs[7], chs[6], chs[5], chs[4], chs[3], chs[2], chs[1], chs[0]); 871 resd = _mm_set_pd(dp[0], dp[1]); 872 resd = _mm_set_pd1(dp[0]); 873 resd = _mm_set_sd(dp[0]); 874 resi = _mm_set1_epi16(ss[0]); 875 resi = _mm_set1_epi32(i); 876 resi = _mm_set1_epi64(m641); 877 resi = _mm_set1_epi64x(i64s[0]); 878 resi = _mm_set1_epi8(chs[0]); 879 resd = _mm_set1_pd(dp[0]); 880 resi = _mm_setr_epi16(ss[7], ss[6], ss[5], ss[4], ss[3], ss[2], ss[1], ss[0]); 881 resi = _mm_setr_epi32(is[3], is[2], is[1], is[0]); 882 resi = _mm_setr_epi64(m641, m642); 883 resi = _mm_setr_epi8(chs[15], chs[14], chs[13], chs[12], chs[11], chs[10], chs[9], chs[8], chs[7], chs[6], chs[5], chs[4], chs[3], chs[2], chs[1], chs[0]); 884 resd = _mm_setr_pd(dp[0], dp[1]); 885 resd = _mm_setzero_pd(); 886 resi = _mm_setzero_si128(); 887 } 888 889 // CHECK-LABEL: @test_set 890 891 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi16 892 // CHECK-COUNT-8: store i16 {{[0-9a-zA-Z_%.]+}}, i16* {{[0-9a-zA-Z_%.]+}}, align 2 893 // CHECK: insertelement <8 x i16> undef, i16 {{[0-9a-zA-Z_%.]+}}, i32 0 894 // CHECK-COUNT-7: insertelement <8 x i16> {{[0-9a-zA-Z_%.]+}}, i16 {{[0-9a-zA-Z_%.]+}}, i32 {{[1-7]}} 895 896 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi32 897 // CHECK-COUNT-4: store i32 {{[0-9a-zA-Z_%.]+}}, i32* {{[0-9a-zA-Z_%.]+}}, align 4 898 // CHECK: insertelement <4 x i32> undef, i32 {{[0-9a-zA-Z_%.]+}}, i32 0 899 // CHECK-COUNT-3: insertelement <4 x i32> {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9a-zA-Z_%.]+}}, i32 {{[1-3]}} 900 901 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi64 902 // CHECK: call <2 x i64> @_mm_set_epi64x(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %{{[0-9a-zA-Z_.]+}}) 903 904 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi64x 905 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0 906 // CHECK: insertelement <2 x i64> %[[VEC]], i64 %{{[0-9a-zA-Z_.]+}}, i32 1 907 908 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi8 909 // CHECK-COUNT-16: store i8 {{[0-9a-zA-Z_%.]+}}, i8* {{[0-9a-zA-Z_%.]+}}, align 1 910 // CHECK: insertelement <16 x i8> undef, i8 {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9]+}} 911 // CHECK-COUNT-15: {{[0-9a-zA-Z_%.]+}} = insertelement <16 x i8> {{[0-9a-zA-Z_%.]+}}, i8 {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9]+}} 912 913 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_pd 914 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0 915 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1 916 917 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_pd1 918 // CHECK: call <2 x double> @_mm_set1_pd(double noundef %{{[0-9a-zA-Z_.]+}}) 919 920 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_sd 921 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0 922 // CHECK: insertelement <2 x double> %[[VEC]], double 0.000000e+00, i32 1 923 924 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi16 925 // CHECK-COUNT-8: load i16, i16* %{{[0-9a-zA-Z_.]+}}, align 2 926 // CHECK: call <2 x i64> @_mm_set_epi16 927 928 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi32 929 // CHECK-COUNT-4: load i32, i32* %{{[0-9a-zA-Z_.]+}}, align 4 930 // CHECK: call <2 x i64> @_mm_set_epi32 931 932 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi64 933 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 934 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 935 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]]) 936 937 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi64x 938 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 939 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 940 // CHECK: call <2 x i64> @_mm_set_epi64x(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]]) 941 942 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi8 943 // CHECK-COUNT-16: load i8, i8* %{{[0-9a-zA-Z_.]+}}, align 1 944 // CHECK: call <2 x i64> @_mm_set_epi8 945 946 // CHECK-LABEL: define available_externally <2 x double> @_mm_set1_pd 947 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0 948 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1 949 950 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi16 951 // CHECK-COUNT-8: load i16, i16* {{[0-9a-zA-Z_%.]+}}, align 2 952 // CHECK: call <2 x i64> @_mm_set_epi16 953 954 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi32 955 // CHECK-COUNT-4: load i32, i32* {{[0-9a-zA-Z_%.]+}}, align 4 956 // CHECK: call <2 x i64> @_mm_set_epi32 957 958 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi64 959 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 960 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8 961 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]]) 962 963 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi8 964 // CHECK-COUNT-16: load i8, i8* {{[0-9a-zA-Z_%.]+}}, align 1 965 // CHECK: call <2 x i64> @_mm_set_epi8 966 967 // CHECK-LABEL: define available_externally <2 x double> @_mm_setr_pd 968 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0 969 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1 970 971 // CHECK-LABEL: define available_externally <2 x double> @_mm_setzero_pd() 972 // CHECK: call <4 x i32> @vec_splats(int)(i32 noundef signext 0) 973 974 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setzero_si128() 975 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 976 977 void __attribute__((noinline)) 978 test_shuffle() { 979 resi = _mm_shuffle_epi32(mi1, i); 980 resd = _mm_shuffle_pd(md1, md2, i); 981 resi = _mm_shufflehi_epi16(mi1, i); 982 resi = _mm_shufflelo_epi16(mi1, i); 983 } 984 985 // CHECK-LABEL: @test_shuffle 986 987 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shuffle_epi32 988 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 3 989 // CHECK: sext i32 %[[AND]] to i64 990 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 2 991 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3 992 // CHECK: sext i32 %[[AND2]] to i64 993 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 4 994 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3 995 // CHECK: sext i32 %[[AND3]] to i64 996 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 6 997 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3 998 // CHECK: sext i32 %[[AND4]] to i64 999 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}} 1000 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %{{[0-9a-zA-Z_.]+}}, i32 0 1001 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}} 1002 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %{{[0-9a-zA-Z_.]+}}, i32 1 1003 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}} 1004 // CHECK: %[[ADD:[0-9a-zA-Z_.]+]] = add i32 %{{[0-9a-zA-Z_.]+}}, 269488144 1005 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %[[ADD]], i32 2 1006 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}} 1007 // CHECK: add i32 %{{[0-9a-zA-Z_.]+}}, 269488144 1008 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16]) 1009 1010 // CHECK-LABEL: define available_externally <2 x double> @_mm_shuffle_pd 1011 // CHECK: and i32 %{{[0-9a-zA-Z_.]+}}, 3 1012 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 0 1013 // CHECK: br i1 %[[CMP]] 1014 // CHECK: call <2 x double> @vec_mergeh(double vector[2], double vector[2]) 1015 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 1 1016 // CHECK: br i1 %[[CMP2]] 1017 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2> 1018 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 2 1019 // CHECK: br i1 %[[CMP3]] 1020 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 0, i32 3> 1021 // CHECK: call <2 x double> @vec_mergel(double vector[2], double vector[2]) 1022 1023 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shufflehi_epi16 1024 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 3 1025 // CHECK: sext i32 %[[AND]] to i64 1026 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 2 1027 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3 1028 // CHECK: sext i32 %[[AND2]] to i64 1029 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 4 1030 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3 1031 // CHECK: sext i32 %[[AND3]] to i64 1032 // CHECK: %[[SHR3:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 6 1033 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR3]], 3 1034 // CHECK: sext i32 %[[AND4]] to i64 1035 // CHECK-LE: store <2 x i64> <i64 1663540288323457296, i64 0>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1036 // CHECK-BE: store <2 x i64> <i64 1157726452361532951, i64 0>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1037 // CHECK-COUNT-4: getelementptr inbounds [4 x i16], [4 x i16]* @_mm_shufflehi_epi16.permute_selectors, i64 0, i64 {{[0-9a-zA-Z_%.]+}} 1038 // CHECK: call <2 x i64> @vec_perm(unsigned long long vector[2], unsigned long long vector[2], unsigned char vector[16]) 1039 1040 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shufflelo_epi16 1041 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 {{[0-9a-zA-Z_%.]+}}, 3 1042 // CHECK: sext i32 %[[AND]] to i64 1043 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 2 1044 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3 1045 // CHECK: sext i32 %[[AND2]] to i64 1046 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 4 1047 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3 1048 // CHECK: sext i32 %[[AND3]] to i64 1049 // CHECK: %[[SHR3:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 6 1050 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR3]], 3 1051 // CHECK: sext i32 %[[AND4]] to i64 1052 // CHECK-LE: store <2 x i64> <i64 0, i64 2242261671028070680>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1053 // CHECK-BE: store <2 x i64> <i64 0, i64 1736447835066146335>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1054 // CHECK-COUNT-4: getelementptr inbounds [4 x i16], [4 x i16]* @_mm_shufflelo_epi16.permute_selectors, i64 0, i64 {{[0-9a-zA-Z_%.]+}} 1055 // CHECK: call <2 x i64> @vec_perm(unsigned long long vector[2], unsigned long long vector[2], unsigned char vector[16]) 1056 1057 void __attribute__((noinline)) 1058 test_sll() { 1059 resi = _mm_sll_epi16(mi1, mi2); 1060 resi = _mm_sll_epi32(mi1, mi2); 1061 resi = _mm_sll_epi64(mi1, mi2); 1062 resi = _mm_slli_epi16(mi1, i); 1063 resi = _mm_slli_epi32(mi1, i); 1064 resi = _mm_slli_epi64(mi1, i); 1065 resi = _mm_slli_si128(mi1, i); 1066 } 1067 1068 // CHECK-LABEL: @test_sll 1069 1070 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi16 1071 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1072 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int) 1073 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int) 1074 // CHECK: call <8 x i16> @vec_cmple(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>) 1075 // CHECK: call <8 x i16> @vec_sl(unsigned short vector[8], unsigned short vector[8]) 1076 // CHECK: call <8 x i16> @vec_sel(unsigned short vector[8], unsigned short vector[8], bool vector[8]) 1077 1078 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi32 1079 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1080 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1) 1081 // CHECK: call <4 x i32> @vec_cmplt(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef {{[0-9a-zA-Z_%.]+}}, <4 x i32> noundef <i32 32, i32 32, i32 32, i32 32>) 1082 // CHECK: call <4 x i32> @vec_sl(unsigned int vector[4], unsigned int vector[4]) 1083 // CHECK: call <4 x i32> @vec_sel(unsigned int vector[4], unsigned int vector[4], bool vector[4]) 1084 1085 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi64 1086 // CHECK: call <2 x i64> @vec_splat(unsigned long long vector[2], unsigned int)(<2 x i64> noundef {{[0-9a-zA-Z_%.]+}}, i32 noundef zeroext 0) 1087 // CHECK: call <2 x i64> @vec_cmplt(unsigned long long vector[2], unsigned long long vector[2])(<2 x i64> noundef {{[0-9a-zA-Z_%.]+}}, <2 x i64> noundef <i64 64, i64 64>) 1088 // CHECK: call <2 x i64> @vec_sl(unsigned long long vector[2], unsigned long long vector[2]) 1089 // CHECK: call <2 x double> @vec_sel(double vector[2], double vector[2], bool vector[2]) 1090 1091 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi16 1092 // CHECK: store <8 x i16> zeroinitializer, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1093 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0 1094 // CHECK: br i1 %[[CMP]] 1095 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1096 // CHECK: br i1 %[[CMP2]] 1097 // CHECK: call i1 @llvm.is.constant 1098 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1099 // CHECK: call <8 x i16> @vec_splat_s16(signed char)(i8 noundef signext %[[TRUNC]]) 1100 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16 1101 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC2]]) 1102 // CHECK: call <8 x i16> @vec_sl(short vector[8], unsigned short vector[8]) 1103 1104 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi32 1105 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 1106 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0 1107 // CHECK: br i1 %[[CMP]] 1108 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32 1109 // CHECK: br i1 %[[CMP2]] 1110 // CHECK: call i1 @llvm.is.constant 1111 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1112 // CHECK: br i1 %[[CMP3]] 1113 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1114 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]]) 1115 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1116 // CHECK: call <4 x i32> @vec_sl(int vector[4], unsigned int vector[4]) 1117 1118 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi64 1119 // CHECK: store <2 x i64> zeroinitializer, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1120 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0 1121 // CHECK: br i1 %[[CMP]] 1122 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 64 1123 // CHECK: br i1 %[[CMP2]] 1124 // CHECK: call i1 @llvm.is.constant 1125 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1126 // CHECK: br i1 %[[CMP3]] 1127 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1128 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]]) 1129 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1130 // CHECK: call <2 x i64> @vec_sl(long long vector[2], unsigned long long vector[2]) 1131 1132 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_si128 1133 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 1134 // CHECK-BE: %[[SUB:[0-9a-zA-Z_.]+]] = sub nsw i32 16, %{{[0-9a-zA-Z_.]+}} 1135 // CHECK-BE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext %[[SUB]]) 1136 // CHECK-LE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, i32 noundef zeroext %{{[0-9a-zA-Z_.]+}}) 1137 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16 1138 1139 void __attribute__((noinline)) 1140 test_sqrt() { 1141 resd = _mm_sqrt_pd(md1); 1142 resd = _mm_sqrt_sd(md1, md2); 1143 } 1144 1145 // CHECK-LABEL: @test_sqrt 1146 1147 // CHECK-LABEL: define available_externally <2 x double> @_mm_sqrt_pd 1148 // CHECK: call <2 x double> @vec_sqrt(double vector[2])(<2 x double> noundef {{[0-9a-zA-Z_%.]+}}) 1149 1150 // CHECK-LABEL: define available_externally <2 x double> @_mm_sqrt_sd 1151 // CHECK: %[[CALL:[0-9a-zA-Z_.]+]] = call <2 x double> @_mm_set1_pd(double noundef %{{[0-9a-zA-Z_.]+}}) 1152 // CHECK: call <2 x double> @vec_sqrt(double vector[2])(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 1153 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}}) 1154 1155 void __attribute__((noinline)) 1156 test_sra() { 1157 resi = _mm_sra_epi16(mi1, mi2); 1158 resi = _mm_sra_epi32(mi1, mi2); 1159 resi = _mm_srai_epi16(mi1, i); 1160 resi = _mm_srai_epi32(mi1, i); 1161 } 1162 1163 // CHECK-LABEL: @test_sra 1164 1165 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sra_epi16 1166 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1167 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1168 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 3) 1169 // CHECK: call <8 x i16> @vec_min(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>) 1170 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8]) 1171 1172 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sra_epi32 1173 // CHECK: store <4 x i32> <i32 31, i32 31, i32 31, i32 31>, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 1174 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1175 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1) 1176 // CHECK: call <4 x i32> @vec_min(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef <i32 31, i32 31, i32 31, i32 31>) 1177 // CHECK: call <4 x i32> @vec_sra(int vector[4], unsigned int vector[4]) 1178 1179 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srai_epi16 1180 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1181 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1182 // CHECK: br i1 %[[CMP]] 1183 // CHECK: call i1 @llvm.is.constant 1184 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1185 // CHECK: call <8 x i16> @vec_splat_s16(signed char)(i8 noundef signext %[[TRUNC]]) 1186 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16 1187 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %{{[0-9a-zA-Z_.]+}}) 1188 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8]) 1189 1190 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srai_epi32 1191 // CHECK: store <4 x i32> <i32 31, i32 31, i32 31, i32 31>, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 1192 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32 1193 // CHECK: br i1 %[[CMP]] 1194 // CHECK: call i1 @llvm.is.constant 1195 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1196 // CHECK: br i1 %[[CMP2]] 1197 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1198 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]]) 1199 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1200 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1201 // CHECK: call <4 x i32> @vec_sra(int vector[4], unsigned int vector[4]) 1202 1203 void __attribute__((noinline)) 1204 test_srl() { 1205 resi = _mm_srl_epi16(mi1, mi2); 1206 resi = _mm_srl_epi32(mi1, mi2); 1207 resi = _mm_srl_epi64(mi1, mi2); 1208 resi = _mm_srli_epi16(mi1, i); 1209 resi = _mm_srli_epi32(mi1, i); 1210 resi = _mm_srli_epi64(mi1, i); 1211 resi = _mm_srli_si128(mi1, i); 1212 } 1213 1214 // CHECK-LABEL: @test_srl 1215 1216 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi16 1217 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1218 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1219 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 3) 1220 // CHECK: call <8 x i16> @vec_cmple(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>) 1221 // CHECK: call <8 x i16> @vec_sr(unsigned short vector[8], unsigned short vector[8]) 1222 // CHECK: call <8 x i16> @vec_sel(unsigned short vector[8], unsigned short vector[8], bool vector[8]) 1223 1224 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi32 1225 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1226 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1) 1227 // CHECK: call <4 x i32> @vec_cmplt(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef <i32 32, i32 32, i32 32, i32 32>) 1228 // CHECK: call <4 x i32> @vec_sr(unsigned int vector[4], unsigned int vector[4]) 1229 // CHECK: call <4 x i32> @vec_sel(unsigned int vector[4], unsigned int vector[4], bool vector[4]) 1230 1231 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi64 1232 // CHECK: call <2 x i64> @vec_splat(unsigned long long vector[2], unsigned int)(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0) 1233 // CHECK: call <2 x i64> @vec_cmplt(unsigned long long vector[2], unsigned long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef <i64 64, i64 64>) 1234 // CHECK: call <2 x i64> @vec_sr(unsigned long long vector[2], unsigned long long vector[2]) 1235 // CHECK: call <2 x double> @vec_sel(double vector[2], double vector[2], bool vector[2]) 1236 1237 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi16 1238 // CHECK: store <8 x i16> zeroinitializer, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16 1239 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1240 // CHECK: br i1 %[[CMP]] 1241 // CHECK: call i1 @llvm.is.constant 1242 // CHECK: trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1243 // CHECK: call <8 x i16> @vec_splat_s16(signed char) 1244 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16 1245 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC]]) 1246 // CHECK: call <8 x i16> @vec_sr(short vector[8], unsigned short vector[8]) 1247 1248 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi32 1249 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16 1250 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32 1251 // CHECK: br i1 %[[CMP]] 1252 // CHECK: call i1 @llvm.is.constant 1253 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1254 // CHECK: br i1 %[[CMP2]] 1255 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1256 // CHECK: call <4 x i32> @vec_splat_s32(signed char) 1257 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1258 // CHECK: call <4 x i32> @vec_splats(unsigned int) 1259 // CHECK: call <4 x i32> @vec_sr(int vector[4], unsigned int vector[4]) 1260 1261 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi64 1262 // CHECK: store <2 x i64> zeroinitializer, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16 1263 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 64 1264 // CHECK: br i1 %[[CMP]] 1265 // CHECK: call i1 @llvm.is.constant 1266 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16 1267 // CHECK: br i1 %[[CMP2]] 1268 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8 1269 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]]) 1270 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64 1271 // CHECK: call <2 x i64> @vec_splats(unsigned long long)(i64 noundef %[[EXT]]) 1272 // CHECK: call <4 x i32> @vec_splats(unsigned int)(i32 noundef zeroext %{{[0-9a-zA-Z_.]+}}) 1273 // CHECK: call <2 x i64> @vec_sr(long long vector[2], unsigned long long vector[2]) 1274 1275 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_si128 1276 // CHECK: call <2 x i64> @_mm_bsrli_si128 1277 1278 void __attribute__((noinline)) 1279 test_store() { 1280 _mm_store_pd(dp, md1); 1281 _mm_store_pd1(dp, md1); 1282 _mm_store_sd(dp, md1); 1283 _mm_store_si128(mip, mi1); 1284 _mm_store1_pd(dp, md1); 1285 _mm_storeh_pd(dp, md1); 1286 _mm_storel_epi64(mip, mi1); 1287 _mm_storel_pd(dp, md1); 1288 _mm_storer_pd(dp, md1); 1289 _mm_storeu_pd(dp, md1); 1290 _mm_storeu_si128(mip, mi1); 1291 } 1292 1293 // CHECK-LABEL: @test_store 1294 1295 // CHECK-LABEL: define available_externally void @_mm_store_pd 1296 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1297 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast double* %[[ADDR]] to <16 x i8>* 1298 // CHECK: call void @vec_st(unsigned char vector[16], long, unsigned char vector[16]*)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef 0, <16 x i8>* noundef %[[CAST]]) 1299 1300 // CHECK-LABEL: define available_externally void @_mm_store_pd1 1301 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1302 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16 1303 // CHECK: call void @_mm_store1_pd(double* noundef %[[ADDR]], <2 x double> noundef %[[ADDR2]]) 1304 1305 // CHECK-LABEL: define available_externally void @_mm_store_sd 1306 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1307 // CHECK: store double %{{[0-9a-zA-Z_.]+}}, double* %[[ADDR]], align 8 1308 1309 // CHECK-LABEL: define available_externally void @_mm_store_si128 1310 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8 1311 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <2 x i64>* %[[LOAD]] to <16 x i8>* 1312 // CHECK: call void @vec_st(unsigned char vector[16], long, unsigned char vector[16]*)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef 0, <16 x i8>* noundef %[[CAST]]) 1313 1314 // CHECK-LABEL: define available_externally void @_mm_store1_pd 1315 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1316 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16 1317 // CHECK: %[[CALL:[0-9a-zA-Z_.]+]] = call <2 x double> @vec_splat(double vector[2], unsigned int)(<2 x double> noundef %[[VAL]], i32 noundef zeroext 0) 1318 // CHECK: call void @_mm_store_pd(double* noundef %[[ADDR]], <2 x double> noundef %[[CALL]]) 1319 1320 // CHECK-LABEL: define available_externally void @_mm_storeh_pd 1321 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1322 // CHECK: store double %{{[0-9a-zA-Z_.]+}}, double* %[[ADDR]], align 8 1323 1324 // CHECK-LABEL: define available_externally void @_mm_storel_epi64 1325 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8 1326 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <2 x i64>* %[[ADDR]] to i64* 1327 // CHECK: store i64 %{{[0-9a-zA-Z_.]+}}, i64* %[[CAST]], align 8 1328 1329 // CHECK-LABEL: define available_externally void @_mm_storel_pd 1330 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1331 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16 1332 // CHECK: call void @_mm_store_sd(double* noundef %[[ADDR]], <2 x double> noundef %[[VAL]]) 1333 1334 // CHECK-LABEL: define available_externally void @_mm_storer_pd 1335 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2> 1336 // CHECK: call void @_mm_store_pd(double* noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}}) 1337 1338 // CHECK-LABEL: define available_externally void @_mm_storeu_pd 1339 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8 1340 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast double* %[[ADDR]] to <2 x double>* 1341 // CHECK: store <2 x double> %{{[0-9a-zA-Z_.]+}}, <2 x double>* %[[CAST]], align 1 1342 1343 // CHECK-LABEL: define available_externally void @_mm_storeu_si128 1344 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8 1345 // CHECK: store <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64>* %[[ADDR]], align 1 1346 1347 void __attribute__((noinline)) 1348 test_stream() { 1349 _mm_stream_pd(dp, md1); 1350 _mm_stream_si128(mip, mi1); 1351 _mm_stream_si32(is, i); 1352 _mm_stream_si64(i64s, i64s[1]); 1353 } 1354 1355 // CHECK-LABEL: @test_stream 1356 1357 // CHECK-LABEL: define available_externally void @_mm_stream_pd 1358 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(double* %{{[0-9a-zA-Z_.]+}}) 1359 1360 // CHECK-LABEL: define available_externally void @_mm_stream_si128 1361 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(<2 x i64>* %{{[0-9a-zA-Z_.]+}}) 1362 1363 // CHECK-LABEL: define available_externally void @_mm_stream_si32 1364 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(i32* %{{[0-9a-zA-Z_.]+}}) 1365 1366 // CHECK-LABEL: define available_externally void @_mm_stream_si64 1367 // CHECK: call void asm sideeffect "\09dcbtstt\090,$0", "b,~{memory}"(i64* %{{[0-9a-zA-Z_.]+}}) 1368 1369 void __attribute__((noinline)) 1370 test_sub() { 1371 resi = _mm_sub_epi64(mi1, mi2); 1372 resi = _mm_sub_epi32(mi1, mi2); 1373 resi = _mm_sub_epi16(mi1, mi2); 1374 resi = _mm_sub_epi8(mi1, mi2); 1375 resd = _mm_sub_pd(md1, md2); 1376 resd = _mm_sub_sd(md1, md2); 1377 res64 = _mm_sub_si64(m641, m642); 1378 resi = _mm_subs_epi16(mi1, mi2); 1379 resi = _mm_subs_epi8(mi1, mi2); 1380 resi = _mm_subs_epu16(mi1, mi2); 1381 resi = _mm_subs_epu8(mi1, mi2); 1382 } 1383 1384 // CHECK-LABEL: @test_sub 1385 1386 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi64 1387 // CHECK: sub <2 x i64> 1388 1389 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi32 1390 // CHECK: sub <4 x i32> 1391 1392 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi16 1393 // CHECK: sub <8 x i16> 1394 1395 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi8 1396 // CHECK: sub <16 x i8> 1397 1398 // CHECK-LABEL: define available_externally <2 x double> @_mm_sub_pd 1399 // CHECK: fsub <2 x double> 1400 1401 // CHECK-LABEL: define available_externally <2 x double> @_mm_sub_sd 1402 // CHECK: fsub double 1403 1404 // CHECK-LABEL: define available_externally i64 @_mm_sub_si64 1405 // CHECK: sub i64 1406 1407 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epi16 1408 // CHECK: call <8 x i16> @vec_subs(short vector[8], short vector[8]) 1409 1410 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epi8 1411 // CHECK: call <16 x i8> @vec_subs(signed char vector[16], signed char vector[16]) 1412 1413 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epu16 1414 // CHECK: call <8 x i16> @vec_subs(unsigned short vector[8], unsigned short vector[8]) 1415 1416 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epu8 1417 // CHECK: call <16 x i8> @vec_subs(unsigned char vector[16], unsigned char vector[16]) 1418 1419 void __attribute__((noinline)) 1420 test_ucomi() { 1421 i = _mm_ucomieq_sd(md1, md2); 1422 i = _mm_ucomige_sd(md1, md2); 1423 i = _mm_ucomigt_sd(md1, md2); 1424 i = _mm_ucomile_sd(md1, md2); 1425 i = _mm_ucomilt_sd(md1, md2); 1426 i = _mm_ucomineq_sd(md1, md2); 1427 } 1428 1429 // CHECK-LABEL: @test_ucomi 1430 1431 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomieq_sd 1432 // CHECK: fcmp oeq double 1433 1434 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomige_sd 1435 // CHECK: fcmp oge double 1436 1437 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomigt_sd 1438 // CHECK: fcmp ogt double 1439 1440 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomile_sd 1441 // CHECK: fcmp ole double 1442 1443 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomilt_sd 1444 // CHECK: fcmp olt double 1445 1446 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomineq_sd 1447 // CHECK: fcmp une double 1448 1449 void __attribute__((noinline)) 1450 test_undefined() { 1451 resd = _mm_undefined_pd(); 1452 resi = _mm_undefined_si128(); 1453 } 1454 1455 // CHECK-LABEL: @test_undefined 1456 1457 // CHECK-LABEL: define available_externally <2 x double> @_mm_undefined_pd() 1458 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %[[ADDR:[0-9a-zA-Z_.]+]], align 16 1459 // CHECK: store <2 x double> %[[VAL]], <2 x double>* %[[ADDR]], align 16 1460 // CHECK: load <2 x double>, <2 x double>* %[[ADDR]], align 16 1461 1462 // CHECK-LABEL: define available_externally <2 x i64> @_mm_undefined_si128() 1463 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x i64>, <2 x i64>* %[[ADDR:[0-9a-zA-Z_.]+]], align 16 1464 // CHECK: store <2 x i64> %[[VAL]], <2 x i64>* %[[ADDR]], align 16 1465 // CHECK: load <2 x i64>, <2 x i64>* %[[ADDR]], align 16 1466 1467 void __attribute__((noinline)) 1468 test_unpack() { 1469 resi = _mm_unpackhi_epi16(mi1, mi2); 1470 resi = _mm_unpackhi_epi32(mi1, mi2); 1471 resi = _mm_unpackhi_epi64(mi1, mi2); 1472 resi = _mm_unpackhi_epi8(mi1, mi2); 1473 resd = _mm_unpackhi_pd(md1, md2); 1474 resi = _mm_unpacklo_epi16(mi1, mi2); 1475 resi = _mm_unpacklo_epi32(mi1, mi2); 1476 resi = _mm_unpacklo_epi64(mi1, mi2); 1477 resi = _mm_unpacklo_epi8(mi1, mi2); 1478 resd = _mm_unpacklo_pd(md1, md2); 1479 } 1480 1481 // CHECK-LABEL: @test_unpack 1482 1483 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi16 1484 // CHECK: call <8 x i16> @vec_mergel(unsigned short vector[8], unsigned short vector[8]) 1485 1486 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi32 1487 // CHECK: call <4 x i32> @vec_mergel(unsigned int vector[4], unsigned int vector[4]) 1488 1489 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi64 1490 // CHECK: call <2 x i64> @vec_mergel(long long vector[2], long long vector[2]) 1491 1492 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi8 1493 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16]) 1494 1495 // CHECK-LABEL: define available_externally <2 x double> @_mm_unpackhi_pd 1496 // CHECK: call <2 x double> @vec_mergel(double vector[2], double vector[2]) 1497 1498 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi16 1499 // CHECK: call <8 x i16> @vec_mergeh(short vector[8], short vector[8]) 1500 1501 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi32 1502 // CHECK: call <4 x i32> @vec_mergeh(int vector[4], int vector[4]) 1503 1504 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi64 1505 // CHECK: call <2 x i64> @vec_mergeh(long long vector[2], long long vector[2]) 1506 1507 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi8 1508 // CHECK: call <16 x i8> @vec_mergeh(unsigned char vector[16], unsigned char vector[16]) 1509 1510 // CHECK-LABEL: define available_externally <2 x double> @_mm_unpacklo_pd 1511 // CHECK: call <2 x double> @vec_mergeh(double vector[2], double vector[2]) 1512