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