brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.1 KiB · fd47757 Raw
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