919 lines · c
1// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s2// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s3// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s4// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s5 6// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s7// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s8// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s9// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s10 11 12#include <immintrin.h>13#include "builtin_test_helpers.h"14 15// NOTE: This should match the tests in llvm/test/CodeGen/X86/sse-intrinsics-fast-isel.ll16 17__m128 test_mm_add_ps(__m128 A, __m128 B) {18 // CHECK-LABEL: test_mm_add_ps19 // CHECK: fadd <4 x float>20 return _mm_add_ps(A, B);21}22TEST_CONSTEXPR(match_m128(_mm_add_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +9.0f, +4.0f, +4.0f, +5.0f));23 24__m128 test_mm_add_ss(__m128 A, __m128 B) {25 // CHECK-LABEL: test_mm_add_ss26 // CHECK: extractelement <4 x float> %{{.*}}, i32 027 // CHECK: extractelement <4 x float> %{{.*}}, i32 028 // CHECK: fadd float29 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 030 return _mm_add_ss(A, B);31}32TEST_CONSTEXPR(match_m128(_mm_add_ss((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +9.0f, +0.0f, +2.0f, +4.0f));33 34__m128 test_mm_and_ps(__m128 A, __m128 B) {35 // CHECK-LABEL: test_mm_and_ps36 // CHECK: and <4 x i32>37 return _mm_and_ps(A, B);38}39TEST_CONSTEXPR(match_m128(_mm_and_ps((__m128){-4.0f, -5.0f, +6.0f, +7.0f}, (__m128){+0.0f, -0.0f, -0.0f, +7.0f}), +0.0f, -0.0f, +0.0f, +7.0f));40 41__m128 test_mm_andnot_ps(__m128 A, __m128 B) {42 // CHECK-LABEL: test_mm_andnot_ps43 // CHECK: xor <4 x i32> %{{.*}}, splat (i32 -1)44 // CHECK: and <4 x i32>45 return _mm_andnot_ps(A, B);46}47TEST_CONSTEXPR(match_m128(_mm_andnot_ps((__m128){-4.0f, -5.0f, +6.0f, +7.0f}, (__m128){+0.0f, -0.0f, -0.0f, +7.0f}), +0.0f, +0.0f, -0.0f, +0.0f));48 49__m128 test_mm_cmp_ps_eq_oq(__m128 a, __m128 b) {50 // CHECK-LABEL: test_mm_cmp_ps_eq_oq51 // CHECK: fcmp oeq <4 x float> %{{.*}}, %{{.*}}52 return _mm_cmp_ps(a, b, _CMP_EQ_OQ);53}54 55__m128 test_mm_cmp_ps_lt_os(__m128 a, __m128 b) {56 // CHECK-LABEL: test_mm_cmp_ps_lt_os57 // CHECK: fcmp olt <4 x float> %{{.*}}, %{{.*}}58 return _mm_cmp_ps(a, b, _CMP_LT_OS);59}60 61__m128 test_mm_cmp_ps_le_os(__m128 a, __m128 b) {62 // CHECK-LABEL: test_mm_cmp_ps_le_os63 // CHECK: fcmp ole <4 x float> %{{.*}}, %{{.*}}64 return _mm_cmp_ps(a, b, _CMP_LE_OS);65}66 67__m128 test_mm_cmp_ps_unord_q(__m128 a, __m128 b) {68 // CHECK-LABEL: test_mm_cmp_ps_unord_q69 // CHECK: fcmp uno <4 x float> %{{.*}}, %{{.*}}70 return _mm_cmp_ps(a, b, _CMP_UNORD_Q);71}72 73__m128 test_mm_cmp_ps_neq_uq(__m128 a, __m128 b) {74 // CHECK-LABEL: test_mm_cmp_ps_neq_uq75 // CHECK: fcmp une <4 x float> %{{.*}}, %{{.*}}76 return _mm_cmp_ps(a, b, _CMP_NEQ_UQ);77}78 79__m128 test_mm_cmp_ps_nlt_us(__m128 a, __m128 b) {80 // CHECK-LABEL: test_mm_cmp_ps_nlt_us81 // CHECK: fcmp uge <4 x float> %{{.*}}, %{{.*}}82 return _mm_cmp_ps(a, b, _CMP_NLT_US);83}84 85__m128 test_mm_cmp_ps_nle_us(__m128 a, __m128 b) {86 // CHECK-LABEL: test_mm_cmp_ps_nle_us87 // CHECK: fcmp ugt <4 x float> %{{.*}}, %{{.*}}88 return _mm_cmp_ps(a, b, _CMP_NLE_US);89}90 91__m128 test_mm_cmp_ps_ord_q(__m128 a, __m128 b) {92 // CHECK-LABEL: test_mm_cmp_ps_ord_q93 // CHECK: fcmp ord <4 x float> %{{.*}}, %{{.*}}94 return _mm_cmp_ps(a, b, _CMP_ORD_Q);95}96 97__m128 test_mm_cmp_ss(__m128 A, __m128 B) {98 // CHECK-LABEL: test_mm_cmp_ss99 // CHECK: call {{.*}}<4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 7)100 return _mm_cmp_ss(A, B, _CMP_ORD_Q);101}102 103__m128 test_mm_cmpeq_ps(__m128 __a, __m128 __b) {104 // CHECK-LABEL: test_mm_cmpeq_ps105 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x float>106 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>107 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>108 // CHECK-NEXT: ret <4 x float> [[BC]]109 return _mm_cmpeq_ps(__a, __b);110}111 112__m128 test_mm_cmpeq_ss(__m128 __a, __m128 __b) {113 // CHECK-LABEL: test_mm_cmpeq_ss114 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 0)115 return _mm_cmpeq_ss(__a, __b);116}117 118__m128 test_mm_cmpge_ps(__m128 __a, __m128 __b) {119 // CHECK-LABEL: test_mm_cmpge_ps120 // CHECK: [[CMP:%.*]] = fcmp ole <4 x float>121 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>122 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>123 // CHECK-NEXT: ret <4 x float> [[BC]]124 return _mm_cmpge_ps(__a, __b);125}126 127__m128 test_mm_cmpge_ss(__m128 __a, __m128 __b) {128 // CHECK-LABEL: test_mm_cmpge_ss129 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 2)130 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>131 return _mm_cmpge_ss(__a, __b);132}133 134__m128 test_mm_cmpgt_ps(__m128 __a, __m128 __b) {135 // CHECK-LABEL: test_mm_cmpgt_ps136 // CHECK: [[CMP:%.*]] = fcmp olt <4 x float>137 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>138 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>139 // CHECK-NEXT: ret <4 x float> [[BC]]140 return _mm_cmpgt_ps(__a, __b);141}142 143__m128 test_mm_cmpgt_ss(__m128 __a, __m128 __b) {144 // CHECK-LABEL: test_mm_cmpgt_ss145 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 1)146 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>147 return _mm_cmpgt_ss(__a, __b);148}149 150__m128 test_mm_cmple_ps(__m128 __a, __m128 __b) {151 // CHECK-LABEL: test_mm_cmple_ps152 // CHECK: [[CMP:%.*]] = fcmp ole <4 x float>153 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>154 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>155 // CHECK-NEXT: ret <4 x float> [[BC]]156 return _mm_cmple_ps(__a, __b);157}158 159__m128 test_mm_cmple_ss(__m128 __a, __m128 __b) {160 // CHECK-LABEL: test_mm_cmple_ss161 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 2)162 return _mm_cmple_ss(__a, __b);163}164 165__m128 test_mm_cmplt_ps(__m128 __a, __m128 __b) {166 // CHECK-LABEL: test_mm_cmplt_ps167 // CHECK: [[CMP:%.*]] = fcmp olt <4 x float>168 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>169 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>170 // CHECK-NEXT: ret <4 x float> [[BC]]171 return _mm_cmplt_ps(__a, __b);172}173 174__m128 test_mm_cmplt_ss(__m128 __a, __m128 __b) {175 // CHECK-LABEL: test_mm_cmplt_ss176 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 1)177 return _mm_cmplt_ss(__a, __b);178}179 180__m128 test_mm_cmpneq_ps(__m128 __a, __m128 __b) {181 // CHECK-LABEL: test_mm_cmpneq_ps182 // CHECK: [[CMP:%.*]] = fcmp une <4 x float>183 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>184 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>185 // CHECK-NEXT: ret <4 x float> [[BC]]186 return _mm_cmpneq_ps(__a, __b);187}188 189__m128 test_mm_cmpneq_ss(__m128 __a, __m128 __b) {190 // CHECK-LABEL: test_mm_cmpneq_ss191 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 4)192 return _mm_cmpneq_ss(__a, __b);193}194 195__m128 test_mm_cmpnge_ps(__m128 __a, __m128 __b) {196 // CHECK-LABEL: test_mm_cmpnge_ps197 // CHECK: [[CMP:%.*]] = fcmp ugt <4 x float>198 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>199 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>200 // CHECK-NEXT: ret <4 x float> [[BC]]201 return _mm_cmpnge_ps(__a, __b);202}203 204__m128 test_mm_cmpnge_ss(__m128 __a, __m128 __b) {205 // CHECK-LABEL: test_mm_cmpnge_ss206 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 6)207 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>208 return _mm_cmpnge_ss(__a, __b);209}210 211__m128 test_mm_cmpngt_ps(__m128 __a, __m128 __b) {212 // CHECK-LABEL: test_mm_cmpngt_ps213 // CHECK: [[CMP:%.*]] = fcmp uge <4 x float>214 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>215 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>216 // CHECK-NEXT: ret <4 x float> [[BC]]217 return _mm_cmpngt_ps(__a, __b);218}219 220__m128 test_mm_cmpngt_ss(__m128 __a, __m128 __b) {221 // CHECK-LABEL: test_mm_cmpngt_ss222 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 5)223 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>224 return _mm_cmpngt_ss(__a, __b);225}226 227__m128 test_mm_cmpnle_ps(__m128 __a, __m128 __b) {228 // CHECK-LABEL: test_mm_cmpnle_ps229 // CHECK: [[CMP:%.*]] = fcmp ugt <4 x float>230 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>231 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>232 // CHECK-NEXT: ret <4 x float> [[BC]]233 return _mm_cmpnle_ps(__a, __b);234}235 236__m128 test_mm_cmpnle_ss(__m128 __a, __m128 __b) {237 // CHECK-LABEL: test_mm_cmpnle_ss238 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 6)239 return _mm_cmpnle_ss(__a, __b);240}241 242__m128 test_mm_cmpnlt_ps(__m128 __a, __m128 __b) {243 // CHECK-LABEL: test_mm_cmpnlt_ps244 // CHECK: [[CMP:%.*]] = fcmp uge <4 x float>245 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>246 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>247 // CHECK-NEXT: ret <4 x float> [[BC]]248 return _mm_cmpnlt_ps(__a, __b);249}250 251__m128 test_mm_cmpnlt_ss(__m128 __a, __m128 __b) {252 // CHECK-LABEL: test_mm_cmpnlt_ss253 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 5)254 return _mm_cmpnlt_ss(__a, __b);255}256 257__m128 test_mm_cmpord_ps(__m128 __a, __m128 __b) {258 // CHECK-LABEL: test_mm_cmpord_ps259 // CHECK: [[CMP:%.*]] = fcmp ord <4 x float>260 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>261 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>262 // CHECK-NEXT: ret <4 x float> [[BC]]263 return _mm_cmpord_ps(__a, __b);264}265 266__m128 test_mm_cmpord_ss(__m128 __a, __m128 __b) {267 // CHECK-LABEL: test_mm_cmpord_ss268 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 7)269 return _mm_cmpord_ss(__a, __b);270}271 272__m128 test_mm_cmpunord_ps(__m128 __a, __m128 __b) {273 // CHECK-LABEL: test_mm_cmpunord_ps274 // CHECK: [[CMP:%.*]] = fcmp uno <4 x float>275 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>276 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>277 // CHECK-NEXT: ret <4 x float> [[BC]]278 return _mm_cmpunord_ps(__a, __b);279}280 281__m128 test_mm_cmpunord_ss(__m128 __a, __m128 __b) {282 // CHECK-LABEL: test_mm_cmpunord_ss283 // CHECK: @llvm.x86.sse.cmp.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i8 3)284 return _mm_cmpunord_ss(__a, __b);285}286 287int test_mm_comieq_ss(__m128 A, __m128 B) {288 // CHECK-LABEL: test_mm_comieq_ss289 // CHECK: call {{.*}}i32 @llvm.x86.sse.comieq.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})290 return _mm_comieq_ss(A, B);291}292 293int test_mm_comige_ss(__m128 A, __m128 B) {294 // CHECK-LABEL: test_mm_comige_ss295 // CHECK: call {{.*}}i32 @llvm.x86.sse.comige.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})296 return _mm_comige_ss(A, B);297}298 299int test_mm_comigt_ss(__m128 A, __m128 B) {300 // CHECK-LABEL: test_mm_comigt_ss301 // CHECK: call {{.*}}i32 @llvm.x86.sse.comigt.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})302 return _mm_comigt_ss(A, B);303}304 305int test_mm_comile_ss(__m128 A, __m128 B) {306 // CHECK-LABEL: test_mm_comile_ss307 // CHECK: call {{.*}}i32 @llvm.x86.sse.comile.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})308 return _mm_comile_ss(A, B);309}310 311int test_mm_comilt_ss(__m128 A, __m128 B) {312 // CHECK-LABEL: test_mm_comilt_ss313 // CHECK: call {{.*}}i32 @llvm.x86.sse.comilt.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})314 return _mm_comilt_ss(A, B);315}316 317int test_mm_comineq_ss(__m128 A, __m128 B) {318 // CHECK-LABEL: test_mm_comineq_ss319 // CHECK: call {{.*}}i32 @llvm.x86.sse.comineq.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})320 return _mm_comineq_ss(A, B);321}322 323int test_mm_cvt_ss2si(__m128 A) {324 // CHECK-LABEL: test_mm_cvt_ss2si325 // CHECK: call {{.*}}i32 @llvm.x86.sse.cvtss2si(<4 x float> %{{.*}})326 return _mm_cvt_ss2si(A);327}328 329__m128 test_mm_cvtsi32_ss(__m128 A, int B) {330 // CHECK-LABEL: test_mm_cvtsi32_ss331 // CHECK: sitofp i32 %{{.*}} to float332 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0333 return _mm_cvtsi32_ss(A, B);334}335TEST_CONSTEXPR(match_m128(_mm_cvtsi32_ss((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, 42), +42.0f, +0.0f, +2.0f, +4.0f));336 337__m128 test_mm_cvt_si2ss(__m128 A, int B) {338 // CHECK-LABEL: test_mm_cvt_si2ss339 // CHECK: sitofp i32 %{{.*}} to float340 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0341 return _mm_cvt_si2ss(A, B);342}343TEST_CONSTEXPR(match_m128(_mm_cvt_si2ss((__m128){+4.0f, +2.0f, +0.0f, +4.0f}, -99), -99.0f, +2.0f, +0.0f, +4.0f));344 345#ifdef __x86_64__346__m128 test_mm_cvtsi64_ss(__m128 A, long long B) {347 // CHECK-LABEL: test_mm_cvtsi64_ss348 // CHECK: sitofp i64 %{{.*}} to float349 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0350 return _mm_cvtsi64_ss(A, B);351}352TEST_CONSTEXPR(match_m128(_mm_cvtsi64_ss((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, 555), +555.0f, +0.0f, +2.0f, +4.0f));353#endif354 355float test_mm_cvtss_f32(__m128 A) {356 // CHECK-LABEL: test_mm_cvtss_f32357 // CHECK: extractelement <4 x float> %{{.*}}, i32 0358 return _mm_cvtss_f32(A);359}360TEST_CONSTEXPR(_mm_cvtss_f32((__m128){+8.0f, +4.0f, +2.0f, +1.0f}) == +8.0f);361 362int test_mm_cvtss_si32(__m128 A) {363 // CHECK-LABEL: test_mm_cvtss_si32364 // CHECK: call {{.*}}i32 @llvm.x86.sse.cvtss2si(<4 x float> %{{.*}})365 return _mm_cvtss_si32(A);366}367 368#ifdef __x86_64__369long long test_mm_cvtss_si64(__m128 A) {370 // CHECK-LABEL: test_mm_cvtss_si64371 // CHECK: call {{.*}}i64 @llvm.x86.sse.cvtss2si64(<4 x float> %{{.*}})372 return _mm_cvtss_si64(A);373}374#endif375 376int test_mm_cvtt_ss2si(__m128 A) {377 // CHECK-LABEL: test_mm_cvtt_ss2si378 // CHECK: call {{.*}}i32 @llvm.x86.sse.cvttss2si(<4 x float> %{{.*}})379 return _mm_cvtt_ss2si(A);380}381 382int test_mm_cvttss_si32(__m128 A) {383 // CHECK-LABEL: test_mm_cvttss_si32384 // CHECK: call {{.*}}i32 @llvm.x86.sse.cvttss2si(<4 x float> %{{.*}})385 return _mm_cvttss_si32(A);386}387 388#ifdef __x86_64__389long long test_mm_cvttss_si64(__m128 A) {390 // CHECK-LABEL: test_mm_cvttss_si64391 // CHECK: call {{.*}}i64 @llvm.x86.sse.cvttss2si64(<4 x float> %{{.*}})392 return _mm_cvttss_si64(A);393}394#endif395 396__m128 test_mm_div_ps(__m128 A, __m128 B) {397 // CHECK-LABEL: test_mm_div_ps398 // CHECK: fdiv <4 x float>399 return _mm_div_ps(A, B);400}401TEST_CONSTEXPR(match_m128(_mm_div_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +0.125f, +0.0f, +1.0f, +4.0f));402 403__m128 test_mm_div_ss(__m128 A, __m128 B) {404 // CHECK-LABEL: test_mm_div_ss405 // CHECK: extractelement <4 x float> %{{.*}}, i32 0406 // CHECK: extractelement <4 x float> %{{.*}}, i32 0407 // CHECK: fdiv float408 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0409 return _mm_div_ss(A, B);410}411TEST_CONSTEXPR(match_m128(_mm_div_ss((__m128){+1.0f, +5.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +0.125f, +5.0f, +2.0f, +4.0f));412 413unsigned int test_MM_GET_EXCEPTION_MASK(void) {414 // CHECK-LABEL: test_MM_GET_EXCEPTION_MASK415 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})416 // CHECK: and i32 %{{.*}}, 8064417 return _MM_GET_EXCEPTION_MASK();418}419 420unsigned int test_MM_GET_EXCEPTION_STATE(void) {421 // CHECK-LABEL: test_MM_GET_EXCEPTION_STATE422 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})423 // CHECK: and i32 %{{.*}}, 63424 return _MM_GET_EXCEPTION_STATE();425}426 427unsigned int test_MM_GET_FLUSH_ZERO_MODE(void) {428 // CHECK-LABEL: test_MM_GET_FLUSH_ZERO_MODE429 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})430 // CHECK: and i32 %{{.*}}, 32768431 return _MM_GET_FLUSH_ZERO_MODE();432}433 434unsigned int test_MM_GET_ROUNDING_MODE(void) {435 // CHECK-LABEL: test_MM_GET_ROUNDING_MODE436 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})437 // CHECK: and i32 %{{.*}}, 24576438 return _MM_GET_ROUNDING_MODE();439}440 441unsigned int test_mm_getcsr(void) {442 // CHECK-LABEL: test_mm_getcsr443 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})444 // CHECK: load i32445 return _mm_getcsr();446}447 448__m128 test_mm_load_ps(float* y) {449 // CHECK-LABEL: test_mm_load_ps450 // CHECK: load <4 x float>, ptr {{.*}}, align 16451 return _mm_load_ps(y);452}453 454__m128 test_mm_load_ps1(float* y) {455 // CHECK-LABEL: test_mm_load_ps1456 // CHECK: load float, ptr %{{.*}}, align 4457 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 0458 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 1459 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 2460 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 3461 return _mm_load_ps1(y);462}463 464__m128 test_mm_load_ss(float* y) {465 // CHECK-LABEL: test_mm_load_ss466 // CHECK: load float, ptr {{.*}}, align 1{{$}}467 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 0468 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 1469 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 2470 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 3471 return _mm_load_ss(y);472}473 474__m128 test_mm_load1_ps(float* y) {475 // CHECK-LABEL: test_mm_load1_ps476 // CHECK: load float, ptr %{{.*}}, align 4477 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 0478 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 1479 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 2480 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 3481 return _mm_load1_ps(y);482}483 484__m128 test_mm_loadh_pi(__m128 x, __m64* y) {485 // CHECK-LABEL: test_mm_loadh_pi486 // CHECK: load <2 x float>, ptr {{.*}}, align 1{{$}}487 // CHECK: shufflevector {{.*}} <4 x i32> <i32 0, i32 1488 // CHECK: shufflevector {{.*}} <4 x i32> <i32 0, i32 1, i32 4, i32 5>489 return _mm_loadh_pi(x,y);490}491 492__m128 test_mm_loadl_pi(__m128 x, __m64* y) {493 // CHECK-LABEL: test_mm_loadl_pi494 // CHECK: load <2 x float>, ptr {{.*}}, align 1{{$}}495 // CHECK: shufflevector {{.*}} <4 x i32> <i32 0, i32 1496 // CHECK: shufflevector {{.*}} <4 x i32> <i32 4, i32 5, i32 2, i32 3>497 return _mm_loadl_pi(x,y);498}499 500__m128 test_mm_loadr_ps(float* A) {501 // CHECK-LABEL: test_mm_loadr_ps502 // CHECK: load <4 x float>, ptr %{{.*}}, align 16503 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 3, i32 2, i32 1, i32 0>504 return _mm_loadr_ps(A);505}506 507__m128 test_mm_loadu_ps(float* A) {508 // CHECK-LABEL: test_mm_loadu_ps509 // CHECK: load <4 x float>, ptr %{{.*}}, align 1{{$}}510 return _mm_loadu_ps(A);511}512 513__m128 test_mm_max_ps(__m128 A, __m128 B) {514 // CHECK-LABEL: test_mm_max_ps515 // CHECK: @llvm.x86.sse.max.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}})516 return _mm_max_ps(A, B);517}518 519__m128 test_mm_max_ss(__m128 A, __m128 B) {520 // CHECK-LABEL: test_mm_max_ss521 // CHECK: @llvm.x86.sse.max.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})522 return _mm_max_ss(A, B);523}524 525__m128 test_mm_min_ps(__m128 A, __m128 B) {526 // CHECK-LABEL: test_mm_min_ps527 // CHECK: @llvm.x86.sse.min.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}})528 return _mm_min_ps(A, B);529}530 531__m128 test_mm_min_ss(__m128 A, __m128 B) {532 // CHECK-LABEL: test_mm_min_ss533 // CHECK: @llvm.x86.sse.min.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})534 return _mm_min_ss(A, B);535}536 537__m128 test_mm_move_ss(__m128 A, __m128 B) {538 // CHECK-LABEL: test_mm_move_ss539 // CHECK: extractelement <4 x float> %{{.*}}, i32 0540 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0541 return _mm_move_ss(A, B);542}543TEST_CONSTEXPR(match_m128(_mm_move_ss((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +8.0f, +0.0f, +2.0f, +4.0f));544 545__m128 test_mm_movehl_ps(__m128 A, __m128 B) {546 // CHECK-LABEL: test_mm_movehl_ps547 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 6, i32 7, i32 2, i32 3>548 return _mm_movehl_ps(A, B);549}550TEST_CONSTEXPR(match_m128(_mm_movehl_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +2.0f, +1.0f, +2.0f, +4.0f));551 552__m128 test_mm_movelh_ps(__m128 A, __m128 B) {553 // CHECK-LABEL: test_mm_movelh_ps554 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 4, i32 5>555 return _mm_movelh_ps(A, B);556}557TEST_CONSTEXPR(match_m128(_mm_movelh_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +1.0f, +0.0f, +8.0f, +4.0f));558 559int test_mm_movemask_ps(__m128 A) {560 // CHECK-LABEL: test_mm_movemask_ps561 // CHECK: call {{.*}}i32 @llvm.x86.sse.movmsk.ps(<4 x float> %{{.*}})562 return _mm_movemask_ps(A);563}564TEST_CONSTEXPR(_mm_movemask_ps((__m128)(__v4sf){-2.0f, 3.0f, -5.5f, -0.0f}) == 0xD);565TEST_CONSTEXPR(_mm_movemask_ps((__m128)(__v4sf){-7.348215e5, 0.00314159, -12.789, 2.7182818}) == 0x5);566 567__m128 test_mm_mul_ps(__m128 A, __m128 B) {568 // CHECK-LABEL: test_mm_mul_ps569 // CHECK: fmul <4 x float>570 return _mm_mul_ps(A, B);571}572TEST_CONSTEXPR(match_m128(_mm_mul_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +8.0f, +0.0f, +4.0f, +4.0f));573 574__m128 test_mm_mul_ss(__m128 A, __m128 B) {575 // CHECK-LABEL: test_mm_mul_ss576 // CHECK: extractelement <4 x float> %{{.*}}, i32 0577 // CHECK: extractelement <4 x float> %{{.*}}, i32 0578 // CHECK: fmul float579 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0580 return _mm_mul_ss(A, B);581}582TEST_CONSTEXPR(match_m128(_mm_mul_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +8.0f, +0.0f, +4.0f, +4.0f));583 584__m128 test_mm_or_ps(__m128 A, __m128 B) {585 // CHECK-LABEL: test_mm_or_ps586 // CHECK: or <4 x i32>587 return _mm_or_ps(A, B);588}589TEST_CONSTEXPR(match_m128(_mm_or_ps((__m128){-4.0f, -5.0f, +6.0f, +7.0f}, (__m128){+0.0f, -0.0f, -0.0f, +7.0f}), -4.0f, -5.0f, -6.0f, +7.0f));590 591void test_mm_prefetch(char const* p) {592 // CHECK-LABEL: test_mm_prefetch593 // CHECK: call void @llvm.prefetch.p0(ptr {{.*}}, i32 0, i32 0, i32 1)594 _mm_prefetch(p, 0);595}596 597__m128 test_mm_rcp_ps(__m128 x) {598 // CHECK-LABEL: test_mm_rcp_ps599 // CHECK: call {{.*}}<4 x float> @llvm.x86.sse.rcp.ps(<4 x float> {{.*}})600 return _mm_rcp_ps(x);601}602 603__m128 test_mm_rcp_ss(__m128 x) {604 // CHECK-LABEL: test_mm_rcp_ss605 // CHECK: call {{.*}}<4 x float> @llvm.x86.sse.rcp.ss(<4 x float> {{.*}})606 return _mm_rcp_ss(x);607}608 609__m128 test_mm_rsqrt_ps(__m128 x) {610 // CHECK-LABEL: test_mm_rsqrt_ps611 // CHECK: call {{.*}}<4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> {{.*}})612 return _mm_rsqrt_ps(x);613}614 615__m128 test_mm_rsqrt_ss(__m128 x) {616 // CHECK-LABEL: test_mm_rsqrt_ss617 // CHECK: call {{.*}}<4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> {{.*}})618 return _mm_rsqrt_ss(x);619}620 621void test_MM_SET_EXCEPTION_MASK(unsigned int A) {622 // CHECK-LABEL: test_MM_SET_EXCEPTION_MASK623 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr {{.*}})624 // CHECK: load i32625 // CHECK: and i32 {{.*}}, -8065626 // CHECK: or i32627 // CHECK: store i32628 // CHECK: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})629 _MM_SET_EXCEPTION_MASK(A);630}631 632void test_MM_SET_EXCEPTION_STATE(unsigned int A) {633 // CHECK-LABEL: test_MM_SET_EXCEPTION_STATE634 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr {{.*}})635 // CHECK: load i32636 // CHECK: and i32 {{.*}}, -64637 // CHECK: or i32638 // CHECK: store i32639 // CHECK: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})640 _MM_SET_EXCEPTION_STATE(A);641}642 643void test_MM_SET_FLUSH_ZERO_MODE(unsigned int A) {644 // CHECK-LABEL: test_MM_SET_FLUSH_ZERO_MODE645 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr {{.*}})646 // CHECK: load i32647 // CHECK: and i32 {{.*}}, -32769648 // CHECK: or i32649 // CHECK: store i32650 // CHECK: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})651 _MM_SET_FLUSH_ZERO_MODE(A);652}653 654__m128 test_mm_set_ps(float A, float B, float C, float D) {655 // CHECK-LABEL: test_mm_set_ps656 // CHECK: insertelement <4 x float> poison, float {{.*}}, i32 0657 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 1658 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 2659 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 3660 return _mm_set_ps(A, B, C, D);661}662TEST_CONSTEXPR(match_m128(_mm_set_ps(+0.0f, +1.0f, +2.0f, +3.0f), +3.0f, +2.0f, +1.0f, +.0f));663 664__m128 test_mm_set_ps1(float A) {665 // CHECK-LABEL: test_mm_set_ps1666 // CHECK: insertelement <4 x float> poison, float {{.*}}, i32 0667 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 1668 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 2669 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 3670 return _mm_set_ps1(A);671}672TEST_CONSTEXPR(match_m128(_mm_set_ps1(-2.0f), -2.0f, -2.0f, -2.0f, -2.0f));673 674void test_MM_SET_ROUNDING_MODE(unsigned int A) {675 // CHECK-LABEL: test_MM_SET_ROUNDING_MODE676 // CHECK: call void @llvm.x86.sse.stmxcsr(ptr {{.*}})677 // CHECK: load i32678 // CHECK: and i32 {{.*}}, -24577679 // CHECK: or i32680 // CHECK: store i32681 // CHECK: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})682 _MM_SET_ROUNDING_MODE(A);683}684 685__m128 test_mm_set_ss(float A) {686 // CHECK-LABEL: test_mm_set_ss687 // CHECK: insertelement <4 x float> poison, float {{.*}}, i32 0688 // CHECK: insertelement <4 x float> {{.*}}, float 0.000000e+00, i32 1689 // CHECK: insertelement <4 x float> {{.*}}, float 0.000000e+00, i32 2690 // CHECK: insertelement <4 x float> {{.*}}, float 0.000000e+00, i32 3691 return _mm_set_ss(A);692}693TEST_CONSTEXPR(match_m128(_mm_set_ss(1.0f), +1.0f, +0.0f, +0.0f, +0.0f));694 695__m128 test_mm_set1_ps(float A) {696 // CHECK-LABEL: test_mm_set1_ps697 // CHECK: insertelement <4 x float> poison, float {{.*}}, i32 0698 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 1699 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 2700 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 3701 return _mm_set1_ps(A);702}703TEST_CONSTEXPR(match_m128(_mm_set1_ps(2.0f), +2.0f, +2.0f, +2.0f, +2.0f));704 705void test_mm_setcsr(unsigned int A) {706 // CHECK-LABEL: test_mm_setcsr707 // CHECK: store i32708 // CHECK: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})709 _mm_setcsr(A);710}711 712__m128 test_mm_setr_ps(float A, float B, float C, float D) {713 // CHECK-LABEL: test_mm_setr_ps714 // CHECK: insertelement <4 x float> poison, float {{.*}}, i32 0715 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 1716 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 2717 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 3718 return _mm_setr_ps(A, B, C, D);719}720TEST_CONSTEXPR(match_m128(_mm_setr_ps(+0.0f, +1.0f, +2.0f, +3.0f), +0.0f, +1.0f, +2.0f, +3.0f));721 722__m128 test_mm_setzero_ps(void) {723 // CHECK-LABEL: test_mm_setzero_ps724 // CHECK: store <4 x float> zeroinitializer725 return _mm_setzero_ps();726}727TEST_CONSTEXPR(match_m128(_mm_setzero_ps(), +0.0f, +0.0f, +0.0f, +0.0f));728 729void test_mm_sfence(void) {730 // CHECK-LABEL: test_mm_sfence731 // CHECK: call void @llvm.x86.sse.sfence()732 _mm_sfence();733}734 735__m128 test_mm_shuffle_ps(__m128 A, __m128 B) {736 // CHECK-LABEL: test_mm_shuffle_ps737 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 0, i32 0, i32 4, i32 4>738 return _mm_shuffle_ps(A, B, 0);739}740 741TEST_CONSTEXPR((match_m128(_mm_shuffle_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){5.0f, 6.0f, 7.0f, 8.0f}), 4), 1.0f, 2.0f, 5.0f, 5.0f)));742TEST_CONSTEXPR((match_m128(_mm_shuffle_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){5.0f, 6.0f, 7.0f, 8.0f}), 0), 1.0f, 1.0f, 5.0f, 5.0f)));743TEST_CONSTEXPR((match_m128(_mm_shuffle_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){5.0f, 6.0f, 7.0f, 8.0f}), 255), 4.0f, 4.0f, 8.0f, 8.0f)));744TEST_CONSTEXPR((match_m128(_mm_shuffle_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){5.0f, 6.0f, 7.0f, 8.0f}), 27), 4.0f, 3.0f, 6.0f, 5.0f)));745 746__m128 test_mm_sqrt_ps(__m128 x) {747 // CHECK-LABEL: test_mm_sqrt_ps748 // CHECK: call {{.*}}<4 x float> @llvm.sqrt.v4f32(<4 x float> {{.*}})749 return _mm_sqrt_ps(x);750}751 752__m128 test_mm_sqrt_ss(__m128 x) {753 // CHECK-LABEL: test_mm_sqrt_ss754 // CHECK: extractelement <4 x float> {{.*}}, i32 0755 // CHECK: call float @llvm.sqrt.f32(float {{.*}})756 // CHECK: insertelement <4 x float> {{.*}}, float {{.*}}, i32 0757 return _mm_sqrt_ss(x);758}759 760void test_mm_store_ps(float* x, __m128 y) {761 // CHECK-LABEL: test_mm_store_ps762 // CHECK: store <4 x float> %{{.*}}, ptr {{.*}}, align 16763 _mm_store_ps(x, y);764}765 766void test_mm_store_ps1(float* x, __m128 y) {767 // CHECK-LABEL: test_mm_store_ps1768 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> zeroinitializer769 // CHECK: store <4 x float> %{{.*}}, ptr %{{.*}}, align 16770 _mm_store_ps1(x, y);771}772 773void test_mm_store_ss(float* x, __m128 y) {774 // CHECK-LABEL: test_mm_store_ss775 // CHECK: extractelement <4 x float> {{.*}}, i32 0776 // CHECK: store float %{{.*}}, ptr {{.*}}, align 1{{$}}777 _mm_store_ss(x, y);778}779 780void test_mm_store1_ps(float* x, __m128 y) {781 // CHECK-LABEL: test_mm_store1_ps782 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> zeroinitializer783 // CHECK: store <4 x float> %{{.*}}, ptr %{{.*}}, align 16784 _mm_store1_ps(x, y);785}786 787void test_mm_storeh_pi(__m64* x, __m128 y) {788 // CHECK-LABEL: test_mm_storeh_pi789 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 2, i32 3>790 // CHECK: store <2 x float> %{{.*}}, ptr %{{.*}}, align 1{{$}}791 _mm_storeh_pi(x, y);792}793 794void test_mm_storel_pi(__m64* x, __m128 y) {795 // CHECK-LABEL: test_mm_storel_pi796 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 0, i32 1>797 // CHECK: store <2 x float> %{{.*}}, ptr %{{.*}}, align 1{{$}}798 _mm_storel_pi(x, y);799}800 801void test_mm_storer_ps(float* x, __m128 y) {802 // CHECK-LABEL: test_mm_storer_ps803 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 3, i32 2, i32 1, i32 0>804 // CHECK: store <4 x float> %{{.*}}, ptr {{.*}}, align 16805 _mm_storer_ps(x, y);806}807 808void test_mm_storeu_ps(float* x, __m128 y) {809 // CHECK-LABEL: test_mm_storeu_ps810 // CHECK: store <4 x float> %{{.*}}, ptr %{{.*}}, align 1{{$}}811 // CHECK-NEXT: ret void812 _mm_storeu_ps(x, y);813}814 815void test_mm_stream_ps(float*A, __m128 B) {816 // CHECK-LABEL: test_mm_stream_ps817 // CHECK: store <4 x float> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal818 _mm_stream_ps(A, B);819}820 821void test_mm_stream_ps_void(void *A, __m128 B) {822 // CHECK-LABEL: test_mm_stream_ps_void823 // CHECK: store <4 x float> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal824 _mm_stream_ps(A, B);825}826 827__m128 test_mm_sub_ps(__m128 A, __m128 B) {828 // CHECK-LABEL: test_mm_sub_ps829 // CHECK: fsub <4 x float>830 return _mm_sub_ps(A, B);831}832TEST_CONSTEXPR(match_m128(_mm_sub_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), -7.0f, -4.0f, +0.0f, +3.0f));833 834__m128 test_mm_sub_ss(__m128 A, __m128 B) {835 // CHECK-LABEL: test_mm_sub_ss836 // CHECK: extractelement <4 x float> %{{.*}}, i32 0837 // CHECK: extractelement <4 x float> %{{.*}}, i32 0838 // CHECK: fsub float839 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0840 return _mm_sub_ss(A, B);841}842TEST_CONSTEXPR(match_m128(_mm_sub_ss((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), -7.0f, +0.0f, +2.0f, +4.0f));843 844void test_MM_TRANSPOSE4_PS(__m128 *A, __m128 *B, __m128 *C, __m128 *D) {845 // CHECK-LABEL: test_MM_TRANSPOSE4_PS846 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>847 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>848 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 2, i32 6, i32 3, i32 7>849 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 2, i32 6, i32 3, i32 7>850 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 0, i32 1, i32 4, i32 5>851 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 6, i32 7, i32 2, i32 3>852 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 0, i32 1, i32 4, i32 5>853 // CHECK: shufflevector <4 x float> {{.*}}, <4 x float> {{.*}}, <4 x i32> <i32 6, i32 7, i32 2, i32 3>854 _MM_TRANSPOSE4_PS(*A, *B, *C, *D);855}856 857int test_mm_ucomieq_ss(__m128 A, __m128 B) {858 // CHECK-LABEL: test_mm_ucomieq_ss859 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})860 return _mm_ucomieq_ss(A, B);861}862 863int test_mm_ucomige_ss(__m128 A, __m128 B) {864 // CHECK-LABEL: test_mm_ucomige_ss865 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomige.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})866 return _mm_ucomige_ss(A, B);867}868 869int test_mm_ucomigt_ss(__m128 A, __m128 B) {870 // CHECK-LABEL: test_mm_ucomigt_ss871 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomigt.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})872 return _mm_ucomigt_ss(A, B);873}874 875int test_mm_ucomile_ss(__m128 A, __m128 B) {876 // CHECK-LABEL: test_mm_ucomile_ss877 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomile.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})878 return _mm_ucomile_ss(A, B);879}880 881int test_mm_ucomilt_ss(__m128 A, __m128 B) {882 // CHECK-LABEL: test_mm_ucomilt_ss883 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomilt.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})884 return _mm_ucomilt_ss(A, B);885}886 887int test_mm_ucomineq_ss(__m128 A, __m128 B) {888 // CHECK-LABEL: test_mm_ucomineq_ss889 // CHECK: call {{.*}}i32 @llvm.x86.sse.ucomineq.ss(<4 x float> %{{.*}}, <4 x float> %{{.*}})890 return _mm_ucomineq_ss(A, B);891}892 893__m128 test_mm_undefined_ps(void) {894 // CHECK-LABEL: test_mm_undefined_ps895 // CHECK: ret <4 x float> zeroinitializer896 return _mm_undefined_ps();897}898 899__m128 test_mm_unpackhi_ps(__m128 A, __m128 B) {900 // CHECK-LABEL: test_mm_unpackhi_ps901 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 2, i32 6, i32 3, i32 7>902 return _mm_unpackhi_ps(A, B);903}904TEST_CONSTEXPR(match_m128(_mm_unpackhi_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +2.0f, +2.0f, +4.0f, +1.0f));905 906__m128 test_mm_unpacklo_ps(__m128 A, __m128 B) {907 // CHECK-LABEL: test_mm_unpacklo_ps908 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>909 return _mm_unpacklo_ps(A, B);910}911TEST_CONSTEXPR(match_m128(_mm_unpacklo_ps((__m128){+1.0f, +0.0f, +2.0f, +4.0f}, (__m128){+8.0f, +4.0f, +2.0f, +1.0f}), +1.0f, +8.0f, +0.0f, +4.0f));912 913__m128 test_mm_xor_ps(__m128 A, __m128 B) {914 // CHECK-LABEL: test_mm_xor_ps915 // CHECK: xor <4 x i32>916 return _mm_xor_ps(A, B);917}918TEST_CONSTEXPR(match_m128(_mm_xor_ps((__m128){-4.0f, -5.0f, +6.0f, +7.0f}, (__m128){+0.0f, -0.0f, -0.0f, +7.0f}), -4.0f, +5.0f, -6.0f, +0.0f));919