brintos

brintos / llvm-project-archived public Read only

0
0
Text · 88.8 KiB · ed1ac84 Raw
1988 lines · c
1// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X642// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X643// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X864// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X865// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X646// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X647// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X648// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X869// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X8610// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X6411 12// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6413// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6414// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X8615// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X8616// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6417// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6418// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6419// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X8620// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X8621// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse2 -emit-llvm -o - -Wall -Werror  -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X6422 23 24#include <immintrin.h>25#include "builtin_test_helpers.h"26 27// NOTE: This should match the tests in llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll28 29__m128i test_mm_add_epi8(__m128i A, __m128i B) {30  // CHECK-LABEL: test_mm_add_epi831  // CHECK: add <16 x i8>32  return _mm_add_epi8(A, B);33}34 35TEST_CONSTEXPR(match_v16qi(_mm_add_epi8((__m128i)(__v16qs){ 32, 33, 34, -35, -36, -37, 38, 39, -40, 41, -42, 43, -44, -45, 46, -47}, (__m128i)(__v16qs){ 1, 2, -3, -4, 5, -6, -7, 8, 9, -10, 11, 12, 13, 14, -15, 16}),  33, 35, 31, -39, -31, -43, 31, 47, -31, 31, -31, 55, -31, -31, 31, -31));36 37__m128i test_mm_add_epi16(__m128i A, __m128i B) {38  // CHECK-LABEL: test_mm_add_epi1639  // CHECK: add <8 x i16>40  return _mm_add_epi16(A, B);41}42 43TEST_CONSTEXPR(match_v8hi(_mm_add_epi16((__m128i)(__v8hi){ -16, -17, -18, -19, -20, 21, 22, 23}, (__m128i)(__v8hi){ 1, 2, 3, -4, -5, -6, 7, -8}),  -15, -15, -15, -23, -25, 15, 29, 15));44 45__m128i test_mm_add_epi32(__m128i A, __m128i B) {46  // CHECK-LABEL: test_mm_add_epi3247  // CHECK: add <4 x i32>48  return _mm_add_epi32(A, B);49}50 51TEST_CONSTEXPR(match_v4si(_mm_add_epi32((__m128i)(__v4si){ 8, 9, 10, 11}, (__m128i)(__v4si){ -1, -2, 3, 4}),  7, 7, 13, 15));52 53__m128i test_mm_add_epi64(__m128i A, __m128i B) {54  // CHECK-LABEL: test_mm_add_epi6455  // CHECK: add <2 x i64>56  return _mm_add_epi64(A, B);57}58 59TEST_CONSTEXPR(match_v2di(_mm_add_epi64((__m128i)(__v2di){ 4, -5}, (__m128i)(__v2di){ 1, -2}),  5, -7));60 61__m128d test_mm_add_pd(__m128d A, __m128d B) {62  // CHECK-LABEL: test_mm_add_pd63  // CHECK: fadd <2 x double>64  return _mm_add_pd(A, B);65}66TEST_CONSTEXPR(match_m128d(_mm_add_pd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), +6.0, -8.0));67 68__m128d test_mm_add_sd(__m128d A, __m128d B) {69  // CHECK-LABEL: test_mm_add_sd70  // CHECK: extractelement <2 x double> %{{.*}}, i32 071  // CHECK: extractelement <2 x double> %{{.*}}, i32 072  // CHECK: fadd double73  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 074  return _mm_add_sd(A, B);75}76TEST_CONSTEXPR(match_m128d(_mm_add_sd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), +6.0, -3.0));77 78__m128i test_mm_adds_epi8(__m128i A, __m128i B) {79  // CHECK-LABEL: test_mm_adds_epi880  // CHECK: call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})81  return _mm_adds_epi8(A, B);82}83TEST_CONSTEXPR(match_v16qi(_mm_adds_epi8((__m128i)(__v16qs){+100, +50, -100, +20, +80, -50, +120, -20, -100, -50, +100, -20, -80, +50, -120, +20}, (__m128i)(__v16qs){+50, +80, -50, +110, +60, -30, +20, -10, +50, +80, -50, +110, +60, -30, +20, -10}), +127, +127, -128, +127, +127, -80, +127, -30, -50, +30, +50, +90, -20, +20, -100, +10));84 85__m128i test_mm_adds_epi16(__m128i A, __m128i B) {86  // CHECK-LABEL: test_mm_adds_epi1687  // CHECK: call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})88  return _mm_adds_epi16(A, B);89}90TEST_CONSTEXPR(match_v8hi(_mm_adds_epi16((__m128i)(__v8hi){+32000, -32000, +32000, -32000, +80, -50, +120, -20}, (__m128i)(__v8hi){+800, -800, -800, +800, +60, -30, +20, -10}), +32767, -32768, +31200, -31200, +140, -80, +140, -30));91 92__m128i test_mm_adds_epu8(__m128i A, __m128i B) {93  // CHECK-LABEL: test_mm_adds_epu894  // CHECK-NOT: call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})95  // CHECK: call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})96  return _mm_adds_epu8(A, B);97}98TEST_CONSTEXPR(match_v16qu(_mm_adds_epu8((__m128i)(__v16qu){0, 0, 0, 0, +127, +127, +127, +127, +128, +128, +128, +128, +255, +255, +255, +255}, (__m128i)(__v16qu){0, +127, +128, +255, 0, +127, +128, +255, 0, +127, +128, +255, 0, +127, +128, +255}), 0, +127, +128, +255, +127, +254, +255, +255, +128, +255, +255, +255, +255, +255, +255, +255));99 100__m128i test_mm_adds_epu16(__m128i A, __m128i B) {101  // CHECK-LABEL: test_mm_adds_epu16102  // CHECK-NOT: call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})103  // CHECK: call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})104  return _mm_adds_epu16(A, B);105}106TEST_CONSTEXPR(match_v8hu(_mm_adds_epu16((__m128i)(__v8hu){0, 0, 0, +32767, +32767, +32767, +65535, +65535}, (__m128i)(__v8hu){0, +32767, +65535, 0, +32767, +65535, 0, +32767}), 0, +32767, +65535, +32767, +65534, +65535, +65535, +65535));107 108__m128d test_mm_and_pd(__m128d A, __m128d B) {109  // CHECK-LABEL: test_mm_and_pd110  // CHECK: and <2 x i64>111  return _mm_and_pd(A, B);112}113TEST_CONSTEXPR(match_m128d(_mm_and_pd((__m128d){+1.0, -3.0}, (__m128d){+0.0, -0.0}), +0.0, -0.0));114 115__m128i test_mm_and_si128(__m128i A, __m128i B) {116  // CHECK-LABEL: test_mm_and_si128117  // CHECK: and <2 x i64>118  return _mm_and_si128(A, B);119}120TEST_CONSTEXPR(match_v4si(_mm_and_si128((__m128i)(__v4si){0, -1, 0, -1}, (__m128i)(__v4si){0, 0, -1, -1}), 0, 0, 0, -1));121 122__m128d test_mm_andnot_pd(__m128d A, __m128d B) {123  // CHECK-LABEL: test_mm_andnot_pd124  // CHECK: xor <2 x i64> %{{.*}}, splat (i64 -1)125  // CHECK: and <2 x i64>126  return _mm_andnot_pd(A, B);127}128TEST_CONSTEXPR(match_m128d(_mm_andnot_pd((__m128d){+1.0, -3.0}, (__m128d){-0.0, +0.0}), -0.0, +0.0));129 130__m128i test_mm_andnot_si128(__m128i A, __m128i B) {131  // CHECK-LABEL: test_mm_andnot_si128132  // CHECK: xor <2 x i64> %{{.*}}, splat (i64 -1)133  // CHECK: and <2 x i64>134  return _mm_andnot_si128(A, B);135}136TEST_CONSTEXPR(match_v4si(_mm_andnot_si128((__m128i)(__v4si){0, -1, 0, -1}, (__m128i)(__v4si){0, 0, -1, -1}), 0, 0, -1, 0));137 138__m128i test_mm_avg_epu8(__m128i A, __m128i B) {139  // CHECK-LABEL: test_mm_avg_epu8140  // CHECK: call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})141  return _mm_avg_epu8(A, B);142}143TEST_CONSTEXPR(match_v16qu(_mm_avg_epu8((__m128i)(__v16qu){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, (__m128i)(__v16qu){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16));144 145__m128i test_mm_avg_epu16(__m128i A, __m128i B) {146  // CHECK-LABEL: test_mm_avg_epu16147  // CHECK: call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})148  return _mm_avg_epu16(A, B);149}150TEST_CONSTEXPR(match_v8hu(_mm_avg_epu16((__m128i)(__v8hu){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hu){1, 2, 3, 4, 5, 6, 7, 8}), 1, 2, 3, 4, 5, 6, 7, 8));151 152__m128i test_mm_bslli_si128(__m128i A) {153  // CHECK-LABEL: test_mm_bslli_si128154  // CHECK: shufflevector <16 x i8> zeroinitializer, <16 x i8> %{{.*}}, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>155  return _mm_bslli_si128(A, 5);156}157 158__m128i test_mm_bsrli_si128(__m128i A) {159  // CHECK-LABEL: test_mm_bsrli_si128160  // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> zeroinitializer, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>161  return _mm_bsrli_si128(A, 5);162}163 164__m128 test_mm_castpd_ps(__m128d A) {165  // CHECK-LABEL: test_mm_castpd_ps166  return _mm_castpd_ps(A);167}168TEST_CONSTEXPR(match_m128(_mm_castpd_ps((__m128d){-1.0, +2.0}), +0.0f, -1.875f, +0.0f, +2.0f));169 170__m128i test_mm_castpd_si128(__m128d A) {171  // CHECK-LABEL: test_mm_castpd_si128172  return _mm_castpd_si128(A);173}174TEST_CONSTEXPR(match_m128i(_mm_castpd_si128((__m128d){-1.0, +2.0}), 0xBFF0000000000000ULL, 0x4000000000000000ULL));175 176__m128d test_mm_castps_pd(__m128 A) {177  // CHECK-LABEL: test_mm_castps_pd178  return _mm_castps_pd(A);179}180TEST_CONSTEXPR(match_m128d(_mm_castps_pd((__m128){0.0f, -1.0f, 0.0f, 4.0f}), -0.0078125, 512.0));181 182__m128i test_mm_castps_si128(__m128 A) {183  // CHECK-LABEL: test_mm_castps_si128184  return _mm_castps_si128(A);185}186TEST_CONSTEXPR(match_m128i(_mm_castps_si128((__m128){1.0f, -2.0f, -4.0f, 8.0f}), 0xC00000003F800000ULL, 0x41000000c0800000ULL));187 188__m128d test_mm_castsi128_pd(__m128i A) {189  // CHECK-LABEL: test_mm_castsi128_pd190  return _mm_castsi128_pd(A);191}192TEST_CONSTEXPR(match_m128d(_mm_castsi128_pd((__m128i)(__v2du){0x4070000000000000ULL, 0xC000000000000000ULL}), 256.0, -2.0));193 194__m128 test_mm_castsi128_ps(__m128i A) {195  // CHECK-LABEL: test_mm_castsi128_ps196  return _mm_castsi128_ps(A);197}198TEST_CONSTEXPR(match_m128(_mm_castsi128_ps((__m128i)(__v2du){0x42000000c1800000ULL, 0x43000000c2800000ULL}), -16.0f, 32.0f, -64.0f, 128.0f));199 200void test_mm_clflush(void* A) {201  // CHECK-LABEL: test_mm_clflush202  // CHECK: call void @llvm.x86.sse2.clflush(ptr %{{.*}})203  _mm_clflush(A);204}205 206__m128d test_mm_cmp_pd_eq_oq(__m128d a, __m128d b) {207  // CHECK-LABEL: test_mm_cmp_pd_eq_oq208  // CHECK: fcmp oeq <2 x double> %{{.*}}, %{{.*}}209  return _mm_cmp_pd(a, b, _CMP_EQ_OQ);210}211 212__m128d test_mm_cmp_pd_lt_os(__m128d a, __m128d b) {213  // CHECK-LABEL: test_mm_cmp_pd_lt_os214  // CHECK: fcmp olt <2 x double> %{{.*}}, %{{.*}}215  return _mm_cmp_pd(a, b, _CMP_LT_OS);216}217 218__m128d test_mm_cmp_pd_le_os(__m128d a, __m128d b) {219  // CHECK-LABEL: test_mm_cmp_pd_le_os220  // CHECK: fcmp ole <2 x double> %{{.*}}, %{{.*}}221  return _mm_cmp_pd(a, b, _CMP_LE_OS);222}223 224__m128d test_mm_cmp_pd_unord_q(__m128d a, __m128d b) {225  // CHECK-LABEL: test_mm_cmp_pd_unord_q226  // CHECK: fcmp uno <2 x double> %{{.*}}, %{{.*}}227  return _mm_cmp_pd(a, b, _CMP_UNORD_Q);228}229 230__m128d test_mm_cmp_pd_neq_uq(__m128d a, __m128d b) {231  // CHECK-LABEL: test_mm_cmp_pd_neq_uq232  // CHECK: fcmp une <2 x double> %{{.*}}, %{{.*}}233  return _mm_cmp_pd(a, b, _CMP_NEQ_UQ);234}235 236__m128d test_mm_cmp_pd_nlt_us(__m128d a, __m128d b) {237  // CHECK-LABEL: test_mm_cmp_pd_nlt_us238  // CHECK: fcmp uge <2 x double> %{{.*}}, %{{.*}}239  return _mm_cmp_pd(a, b, _CMP_NLT_US);240}241 242__m128d test_mm_cmp_pd_nle_us(__m128d a, __m128d b) {243  // CHECK-LABEL: test_mm_cmp_pd_nle_us244  // CHECK: fcmp ugt <2 x double> %{{.*}}, %{{.*}}245  return _mm_cmp_pd(a, b, _CMP_NLE_US);246}247 248__m128d test_mm_cmp_pd_ord_q(__m128d a, __m128d b) {249  // CHECK-LABEL: test_mm_cmp_pd_ord_q250  // CHECK: fcmp ord <2 x double> %{{.*}}, %{{.*}}251  return _mm_cmp_pd(a, b, _CMP_ORD_Q);252}253 254__m128d test_mm_cmp_sd(__m128d A, __m128d B) {255  // CHECK-LABEL: test_mm_cmp_sd256  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 7)257  return _mm_cmp_sd(A, B, _CMP_ORD_Q);258}259 260__m128i test_mm_cmpeq_epi8(__m128i A, __m128i B) {261  // CHECK-LABEL: test_mm_cmpeq_epi8262  // CHECK: icmp eq <16 x i8>263  return _mm_cmpeq_epi8(A, B);264}265TEST_CONSTEXPR(match_v16qi(_mm_cmpeq_epi8((__m128i)(__v16qs){1,-2,3,-4,-5,6,-7,8,-9,10,-11,12,-13,14,-15,16}, (__m128i)(__v16qs){10,-2,6,-4,-5,12,-14,8,-9,20,-22,12,-26,14,-30,16}), 0,-1,0,-1,-1,0,0,-1,-1,0,0,-1,0,-1,0,-1));266 267__m128i test_mm_cmpeq_epi16(__m128i A, __m128i B) {268  // CHECK-LABEL: test_mm_cmpeq_epi16269  // CHECK: icmp eq <8 x i16>270  return _mm_cmpeq_epi16(A, B);271}272TEST_CONSTEXPR(match_v8hi(_mm_cmpeq_epi16((__m128i)(__v8hi){+1, -2, +3, -4, +5, -6, +7, -8}, (__m128i)(__v8hi){-10, -2, +6, -4, +5, -12, +14, -8}), 0, -1, 0, -1, -1, 0, 0, -1));273 274__m128i test_mm_cmpeq_epi32(__m128i A, __m128i B) {275  // CHECK-LABEL: test_mm_cmpeq_epi32276  // CHECK: icmp eq <4 x i32>277  return _mm_cmpeq_epi32(A, B);278}279TEST_CONSTEXPR(match_v4si(_mm_cmpeq_epi32((__m128i)(__v4si){+1, -2, +3, -4}, (__m128i)(__v4si){-10, -2, +6, -4}), 0, -1, 0, -1));280 281__m128d test_mm_cmpeq_pd(__m128d A, __m128d B) {282  // CHECK-LABEL: test_mm_cmpeq_pd283  // CHECK:         [[CMP:%.*]] = fcmp oeq <2 x double>284  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>285  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>286  return _mm_cmpeq_pd(A, B);287}288 289__m128d test_mm_cmpeq_sd(__m128d A, __m128d B) {290  // CHECK-LABEL: test_mm_cmpeq_sd291  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 0)292  return _mm_cmpeq_sd(A, B);293}294 295__m128d test_mm_cmpge_pd(__m128d A, __m128d B) {296  // CHECK-LABEL: test_mm_cmpge_pd297  // CHECK:         [[CMP:%.*]] = fcmp ole <2 x double>298  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>299  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>300  return _mm_cmpge_pd(A, B);301}302 303__m128d test_mm_cmpge_sd(__m128d A, __m128d B) {304  // CHECK-LABEL: test_mm_cmpge_sd305  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)306  // CHECK: extractelement <2 x double> %{{.*}}, i32 0307  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0308  // CHECK: extractelement <2 x double> %{{.*}}, i32 1309  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1310  return _mm_cmpge_sd(A, B);311}312 313__m128i test_mm_cmpgt_epi8(__m128i A, __m128i B) {314  // CHECK-LABEL: test_mm_cmpgt_epi8315  // CHECK: icmp sgt <16 x i8>316  return _mm_cmpgt_epi8(A, B);317}318TEST_CONSTEXPR(match_v16qi(_mm_cmpgt_epi8(319    (__m128i)(__v16qs){15,-2,8,-4,12,6,-20,8,25,-10,30,12,-35,14,40,-16},320    (__m128i)(__v16qs){10,-2,6,-4,5,12,-14,8,9,-20,22,12,-26,14,30,-16}),321            -1, 0, -1, 0, -1, 0, 0, 0,-1, -1, -1, 0, 0, 0, -1, 0));322 323__m128i test_mm_cmpgt_epi16(__m128i A, __m128i B) {324  // CHECK-LABEL: test_mm_cmpgt_epi16325  // CHECK: icmp sgt <8 x i16>326  return _mm_cmpgt_epi16(A, B);327}328TEST_CONSTEXPR(match_v8hi(_mm_cmpgt_epi16((__m128i)(__v8hi){15,2,8,4,12,6,20,8}, (__m128i)(__v8hi){10,2,6,4,5,12,14,8}), -1,0,-1,0,-1,0,-1,0));329 330__m128i test_mm_cmpgt_epi32(__m128i A, __m128i B) {331  // CHECK-LABEL: test_mm_cmpgt_epi32332  // CHECK: icmp sgt <4 x i32>333  return _mm_cmpgt_epi32(A, B);334}335TEST_CONSTEXPR(match_v4si(_mm_cmpgt_epi32((__m128i)(__v4si){15,2,8,4}, (__m128i)(__v4si){10,2,6,4}), -1,0,-1,0));336 337__m128d test_mm_cmpgt_pd(__m128d A, __m128d B) {338  // CHECK-LABEL: test_mm_cmpgt_pd339  // CHECK:         [[CMP:%.*]] = fcmp olt <2 x double>340  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>341  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>342  return _mm_cmpgt_pd(A, B);343}344 345__m128d test_mm_cmpgt_sd(__m128d A, __m128d B) {346  // CHECK-LABEL: test_mm_cmpgt_sd347  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)348  // CHECK: extractelement <2 x double> %{{.*}}, i32 0349  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0350  // CHECK: extractelement <2 x double> %{{.*}}, i32 1351  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1352  return _mm_cmpgt_sd(A, B);353}354 355__m128d test_mm_cmple_pd(__m128d A, __m128d B) {356  // CHECK-LABEL: test_mm_cmple_pd357  // CHECK:         [[CMP:%.*]] = fcmp ole <2 x double>358  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>359  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>360  return _mm_cmple_pd(A, B);361}362 363__m128d test_mm_cmple_sd(__m128d A, __m128d B) {364  // CHECK-LABEL: test_mm_cmple_sd365  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)366  return _mm_cmple_sd(A, B);367}368 369__m128i test_mm_cmplt_epi8(__m128i A, __m128i B) {370  // CHECK-LABEL: test_mm_cmplt_epi8371  // CHECK: icmp sgt <16 x i8>372  return _mm_cmplt_epi8(A, B);373}374TEST_CONSTEXPR(match_v16qi(_mm_cmplt_epi8(375    (__m128i)(__v16qs){15,-2,8,-4,12,6,-20,8,25,-10,30,12,-35,14,40,-16},376    (__m128i)(__v16qs){10,-2,6,-4,5,12,-14,8,9,-20,22,12,-26,14,30,-16}),377            0, 0, 0, 0, 0, -1, -1, 0,0, 0, 0, 0, -1, 0, 0, 0));378 379__m128i test_mm_cmplt_epi16(__m128i A, __m128i B) {380  // CHECK-LABEL: test_mm_cmplt_epi16381  // CHECK: icmp sgt <8 x i16>382  return _mm_cmplt_epi16(A, B);383}384TEST_CONSTEXPR(match_v8hi(_mm_cmplt_epi16((__m128i)(__v8hi){5,2,3,4,1,6,7,8}, (__m128i)(__v8hi){10,2,6,4,5,12,14,8}), -1, 0, -1, 0, -1, -1, -1, 0));385 386__m128i test_mm_cmplt_epi32(__m128i A, __m128i B) {387  // CHECK-LABEL: test_mm_cmplt_epi32388  // CHECK: icmp sgt <4 x i32>389  return _mm_cmplt_epi32(A, B);390}391TEST_CONSTEXPR(match_v4si(_mm_cmplt_epi32((__m128i)(__v4si){5,2,3,4}, (__m128i)(__v4si){10,2,6,4}), -1,0,-1,0));392 393__m128d test_mm_cmplt_pd(__m128d A, __m128d B) {394  // CHECK-LABEL: test_mm_cmplt_pd395  // CHECK:         [[CMP:%.*]] = fcmp olt <2 x double>396  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>397  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>398  return _mm_cmplt_pd(A, B);399}400 401__m128d test_mm_cmplt_sd(__m128d A, __m128d B) {402  // CHECK-LABEL: test_mm_cmplt_sd403  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)404  return _mm_cmplt_sd(A, B);405}406 407__m128d test_mm_cmpneq_pd(__m128d A, __m128d B) {408  // CHECK-LABEL: test_mm_cmpneq_pd409  // CHECK:         [[CMP:%.*]] = fcmp une <2 x double>410  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>411  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>412  return _mm_cmpneq_pd(A, B);413}414 415__m128d test_mm_cmpneq_sd(__m128d A, __m128d B) {416  // CHECK-LABEL: test_mm_cmpneq_sd417  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 4)418  return _mm_cmpneq_sd(A, B);419}420 421__m128d test_mm_cmpnge_pd(__m128d A, __m128d B) {422  // CHECK-LABEL: test_mm_cmpnge_pd423  // CHECK:         [[CMP:%.*]] = fcmp ugt <2 x double>424  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>425  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>426  return _mm_cmpnge_pd(A, B);427}428 429__m128d test_mm_cmpnge_sd(__m128d A, __m128d B) {430  // CHECK-LABEL: test_mm_cmpnge_sd431  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)432  // CHECK: extractelement <2 x double> %{{.*}}, i32 0433  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0434  // CHECK: extractelement <2 x double> %{{.*}}, i32 1435  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1436  return _mm_cmpnge_sd(A, B);437}438 439__m128d test_mm_cmpngt_pd(__m128d A, __m128d B) {440  // CHECK-LABEL: test_mm_cmpngt_pd441  // CHECK:         [[CMP:%.*]] = fcmp uge <2 x double>442  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>443  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>444  return _mm_cmpngt_pd(A, B);445}446 447__m128d test_mm_cmpngt_sd(__m128d A, __m128d B) {448  // CHECK-LABEL: test_mm_cmpngt_sd449  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)450  // CHECK: extractelement <2 x double> %{{.*}}, i32 0451  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0452  // CHECK: extractelement <2 x double> %{{.*}}, i32 1453  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1454  return _mm_cmpngt_sd(A, B);455}456 457__m128d test_mm_cmpnle_pd(__m128d A, __m128d B) {458  // CHECK-LABEL: test_mm_cmpnle_pd459  // CHECK:         [[CMP:%.*]] = fcmp ugt <2 x double>460  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>461  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>462  return _mm_cmpnle_pd(A, B);463}464 465__m128d test_mm_cmpnle_sd(__m128d A, __m128d B) {466  // CHECK-LABEL: test_mm_cmpnle_sd467  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)468  return _mm_cmpnle_sd(A, B);469}470 471__m128d test_mm_cmpnlt_pd(__m128d A, __m128d B) {472  // CHECK-LABEL: test_mm_cmpnlt_pd473  // CHECK:         [[CMP:%.*]] = fcmp uge <2 x double>474  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>475  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>476  return _mm_cmpnlt_pd(A, B);477}478 479__m128d test_mm_cmpnlt_sd(__m128d A, __m128d B) {480  // CHECK-LABEL: test_mm_cmpnlt_sd481  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)482  return _mm_cmpnlt_sd(A, B);483}484 485__m128d test_mm_cmpord_pd(__m128d A, __m128d B) {486  // CHECK-LABEL: test_mm_cmpord_pd487  // CHECK:         [[CMP:%.*]] = fcmp ord <2 x double>488  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>489  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>490  return _mm_cmpord_pd(A, B);491}492 493__m128d test_mm_cmpord_sd(__m128d A, __m128d B) {494  // CHECK-LABEL: test_mm_cmpord_sd495  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 7)496  return _mm_cmpord_sd(A, B);497}498 499__m128d test_mm_cmpunord_pd(__m128d A, __m128d B) {500  // CHECK-LABEL: test_mm_cmpunord_pd501  // CHECK:         [[CMP:%.*]] = fcmp uno <2 x double>502  // CHECK-NEXT:    [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>503  // CHECK-NEXT:    [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>504  return _mm_cmpunord_pd(A, B);505}506 507__m128d test_mm_cmpunord_sd(__m128d A, __m128d B) {508  // CHECK-LABEL: test_mm_cmpunord_sd509  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 3)510  return _mm_cmpunord_sd(A, B);511}512 513int test_mm_comieq_sd(__m128d A, __m128d B) {514  // CHECK-LABEL: test_mm_comieq_sd515  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})516  return _mm_comieq_sd(A, B);517}518 519int test_mm_comige_sd(__m128d A, __m128d B) {520  // CHECK-LABEL: test_mm_comige_sd521  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})522  return _mm_comige_sd(A, B);523}524 525int test_mm_comigt_sd(__m128d A, __m128d B) {526  // CHECK-LABEL: test_mm_comigt_sd527  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})528  return _mm_comigt_sd(A, B);529}530 531int test_mm_comile_sd(__m128d A, __m128d B) {532  // CHECK-LABEL: test_mm_comile_sd533  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})534  return _mm_comile_sd(A, B);535}536 537int test_mm_comilt_sd(__m128d A, __m128d B) {538  // CHECK-LABEL: test_mm_comilt_sd539  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})540  return _mm_comilt_sd(A, B);541}542 543int test_mm_comineq_sd(__m128d A, __m128d B) {544  // CHECK-LABEL: test_mm_comineq_sd545  // CHECK: call {{.*}}i32 @llvm.x86.sse2.comineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})546  return _mm_comineq_sd(A, B);547}548 549__m128d test_mm_cvtepi32_pd(__m128i A) {550  // CHECK-LABEL: test_mm_cvtepi32_pd551  // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <2 x i32> <i32 0, i32 1>552  // CHECK: sitofp <2 x i32> %{{.*}} to <2 x double>553  return _mm_cvtepi32_pd(A);554}555TEST_CONSTEXPR(match_m128d(_mm_cvtepi32_pd((__m128i)(__v4si){-9, +8, -6, 0}), -9.0, +8.0));556 557__m128 test_mm_cvtepi32_ps(__m128i A) {558  // CHECK-LABEL: test_mm_cvtepi32_ps559  // CHECK: sitofp <4 x i32> %{{.*}} to <4 x float>560  return _mm_cvtepi32_ps(A);561}562TEST_CONSTEXPR(match_m128(_mm_cvtepi32_ps((__m128i)(__v4si){-3, +2, -1, 0}), -3.0f, +2.0f, -1.0f, +0.0f));563 564__m128i test_mm_cvtpd_epi32(__m128d A) {565  // CHECK-LABEL: test_mm_cvtpd_epi32566  // CHECK: call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %{{.*}})567  return _mm_cvtpd_epi32(A);568}569 570__m128 test_mm_cvtpd_ps(__m128d A) {571  // CHECK-LABEL: test_mm_cvtpd_ps572  // CHECK: call {{.*}}<4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %{{.*}})573  return _mm_cvtpd_ps(A);574}575 576__m128i test_mm_cvtps_epi32(__m128 A) {577  // CHECK-LABEL: test_mm_cvtps_epi32578  // CHECK: call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %{{.*}})579  return _mm_cvtps_epi32(A);580}581 582__m128d test_mm_cvtps_pd(__m128 A) {583  // CHECK-LABEL: test_mm_cvtps_pd584  // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 0, i32 1>585  // CHECK: fpext <2 x float> %{{.*}} to <2 x double>586  return _mm_cvtps_pd(A);587}588TEST_CONSTEXPR(match_m128d(_mm_cvtps_pd((__m128){-1.0f, +2.0f, -3.0f, +4.0f}), -1.0, +2.0));589 590double test_mm_cvtsd_f64(__m128d A) {591  // CHECK-LABEL: test_mm_cvtsd_f64592  // CHECK: extractelement <2 x double> %{{.*}}, i32 0593  return _mm_cvtsd_f64(A);594}595TEST_CONSTEXPR(_mm_cvtsd_f64((__m128d){-4.0, +8.0}) == -4.0);596 597int test_mm_cvtsd_si32(__m128d A) {598  // CHECK-LABEL: test_mm_cvtsd_si32599  // CHECK: call {{.*}}i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %{{.*}})600  return _mm_cvtsd_si32(A);601}602 603#ifdef __x86_64__604long long test_mm_cvtsd_si64(__m128d A) {605  // X64-LABEL: test_mm_cvtsd_si64606  // X64: call {{.*}}i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %{{.*}})607  return _mm_cvtsd_si64(A);608}609#endif610 611__m128 test_mm_cvtsd_ss(__m128 A, __m128d B) {612  // CHECK-LABEL: test_mm_cvtsd_ss613  // CHECK: call {{.*}}<4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %{{.*}}, <2 x double> %{{.*}})614  return _mm_cvtsd_ss(A, B);615}616 617int test_mm_cvtsi128_si32(__m128i A) {618  // CHECK-LABEL: test_mm_cvtsi128_si32619  // CHECK: extractelement <4 x i32> %{{.*}}, i32 0620  return _mm_cvtsi128_si32(A);621}622TEST_CONSTEXPR(_mm_cvtsi128_si32((__m128i)(__v4si){+1, -2, -3, +4}) == +1);623 624long long test_mm_cvtsi128_si64(__m128i A) {625  // CHECK-LABEL: test_mm_cvtsi128_si64626  // CHECK: extractelement <2 x i64> %{{.*}}, i32 0627  return _mm_cvtsi128_si64(A);628}629TEST_CONSTEXPR(_mm_cvtsi128_si64((__m128i)(__v2di){42LL, -42LL}) == 42LL);630 631__m128d test_mm_cvtsi32_sd(__m128d A, int B) {632  // CHECK-LABEL: test_mm_cvtsi32_sd633  // CHECK: sitofp i32 %{{.*}} to double634  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0635  return _mm_cvtsi32_sd(A, B);636}637TEST_CONSTEXPR(match_m128d(_mm_cvtsi32_sd((__m128d){-99.0, +42.0}, 55), +55.0, +42.0));638 639__m128i test_mm_cvtsi32_si128(int A) {640  // CHECK-LABEL: test_mm_cvtsi32_si128641  // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 0642  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 1643  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 2644  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3645  return _mm_cvtsi32_si128(A);646}647TEST_CONSTEXPR(match_v4si(_mm_cvtsi32_si128(55), 55, 0, 0, 0));648 649#ifdef __x86_64__650__m128d test_mm_cvtsi64_sd(__m128d A, long long B) {651  // X64-LABEL: test_mm_cvtsi64_sd652  // X64: sitofp i64 %{{.*}} to double653  // X64: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0654  return _mm_cvtsi64_sd(A, B);655}656TEST_CONSTEXPR(match_m128d(_mm_cvtsi64_sd((__m128d){-42.0, +99.0}, 55), +55.0, +99.0));657#endif658 659__m128i test_mm_cvtsi64_si128(long long A) {660  // CHECK-LABEL: test_mm_cvtsi64_si128661  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 0662  // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1663  return _mm_cvtsi64_si128(A);664}665TEST_CONSTEXPR(match_v2di(_mm_cvtsi64_si128(-99LL), -99LL, 0LL));666 667__m128d test_mm_cvtss_sd(__m128d A, __m128 B) {668  // CHECK-LABEL: test_mm_cvtss_sd669  // CHECK: extractelement <4 x float> %{{.*}}, i32 0670  // CHECK: fpext float %{{.*}} to double671  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0672  return _mm_cvtss_sd(A, B);673}674TEST_CONSTEXPR(match_m128d(_mm_cvtss_sd((__m128d){+32.0, +8.0}, (__m128){-1.0f, +2.0f, -3.0f, +4.0f}), -1.0, +8.0));675 676__m128i test_mm_cvttpd_epi32(__m128d A) {677  // CHECK-LABEL: test_mm_cvttpd_epi32678  // CHECK: call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %{{.*}})679  return _mm_cvttpd_epi32(A);680}681 682__m128i test_mm_cvttps_epi32(__m128 A) {683  // CHECK-LABEL: test_mm_cvttps_epi32684  // CHECK: call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %{{.*}})685  return _mm_cvttps_epi32(A);686}687 688int test_mm_cvttsd_si32(__m128d A) {689  // CHECK-LABEL: test_mm_cvttsd_si32690  // CHECK: call {{.*}}i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %{{.*}})691  return _mm_cvttsd_si32(A);692}693 694#ifdef __x86_64__695long long test_mm_cvttsd_si64(__m128d A) {696  // X64-LABEL: test_mm_cvttsd_si64697  // X64: call {{.*}}i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %{{.*}})698  return _mm_cvttsd_si64(A);699}700#endif701 702__m128d test_mm_div_pd(__m128d A, __m128d B) {703  // CHECK-LABEL: test_mm_div_pd704  // CHECK: fdiv <2 x double>705  return _mm_div_pd(A, B);706}707TEST_CONSTEXPR(match_m128d(_mm_div_pd((__m128d){+2.0, +8.0}, (__m128d){-4.0, +2.0}), -0.5, +4.0));708 709__m128d test_mm_div_sd(__m128d A, __m128d B) {710  // CHECK-LABEL: test_mm_div_sd711  // CHECK: extractelement <2 x double> %{{.*}}, i32 0712  // CHECK: extractelement <2 x double> %{{.*}}, i32 0713  // CHECK: fdiv double714  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0715  return _mm_div_sd(A, B);716}717TEST_CONSTEXPR(match_m128d(_mm_div_sd((__m128d){+2.0, +8.0}, (__m128d){-4.0, +2.0}), -0.5, +8.0));718 719// Lowering to pextrw requires optimization.720int test_mm_extract_epi16(__m128i A) {721  // CHECK-LABEL: test_mm_extract_epi16722  // CHECK: extractelement <8 x i16> %{{.*}}, {{i32|i64}} 1723  // CHECK: zext i16 %{{.*}} to i32724  return _mm_extract_epi16(A, 1);725}726TEST_CONSTEXPR(_mm_extract_epi16(((__m128i)(__v8hi){0, 10, 20, 30, 40, 50, 60, 70}), 25) == 10);727 728__m128i test_mm_insert_epi16(__m128i A, int B) {729  // CHECK-LABEL: test_mm_insert_epi16730  // CHECK: insertelement <8 x i16> %{{.*}}, {{i32|i64}} 0731  return _mm_insert_epi16(A, B, 0);732}733TEST_CONSTEXPR(match_v8hi(_mm_insert_epi16(((__m128i)(__v8hi){0, 10, 20, 30, 40, 50, 60, 70}), 555, 17), 0, 555, 20, 30, 40, 50, 60, 70));734 735void test_mm_lfence(void) {736  // CHECK-LABEL: test_mm_lfence737  // CHECK: call void @llvm.x86.sse2.lfence()738  _mm_lfence();739}740 741__m128d test_mm_load_pd(double const* A) {742  // CHECK-LABEL: test_mm_load_pd743  // CHECK: load <2 x double>, ptr %{{.*}}, align 16744  return _mm_load_pd(A);745}746 747__m128d test_mm_load_pd1(double const* A) {748  // CHECK-LABEL: test_mm_load_pd1749  // CHECK: load double, ptr %{{.*}}, align 8750  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0751  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1752  return _mm_load_pd1(A);753}754 755__m128d test_mm_load_sd(double const* A) {756  // CHECK-LABEL: test_mm_load_sd757  // CHECK: load double, ptr %{{.*}}, align 1{{$}}758  return _mm_load_sd(A);759}760 761__m128i test_mm_load_si128(__m128i const* A) {762  // CHECK-LABEL: test_mm_load_si128763  // CHECK: load <2 x i64>, ptr %{{.*}}, align 16764  return _mm_load_si128(A);765}766 767__m128d test_mm_load1_pd(double const* A) {768  // CHECK-LABEL: test_mm_load1_pd769  // CHECK: load double, ptr %{{.*}}, align 8770  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0771  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1772  return _mm_load1_pd(A);773}774 775__m128d test_mm_loadh_pd(__m128d x, double const* y) {776  // CHECK-LABEL: test_mm_loadh_pd777  // CHECK: load double, ptr %{{.*}}, align 1{{$}}778  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1779  return _mm_loadh_pd(x, y);780}781 782__m128i test_mm_loadl_epi64(__m128i* y) {783  // CHECK: test_mm_loadl_epi64784  // CHECK: load i64, ptr {{.*}}, align 1{{$}}785  // CHECK: insertelement <2 x i64> poison, i64 {{.*}}, i32 0786  // CHECK: insertelement <2 x i64> {{.*}}, i64 0, i32 1787  return _mm_loadl_epi64(y);788}789 790__m128d test_mm_loadl_pd(__m128d x, double const* y) {791  // CHECK-LABEL: test_mm_loadl_pd792  // CHECK: load double, ptr %{{.*}}, align 1{{$}}793  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0794  // CHECK: extractelement <2 x double> %{{.*}}, i32 1795  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1796  return _mm_loadl_pd(x, y);797}798 799__m128d test_mm_loadr_pd(double const* A) {800  // CHECK-LABEL: test_mm_loadr_pd801  // CHECK: load <2 x double>, ptr %{{.*}}, align 16802  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>803  return _mm_loadr_pd(A);804}805 806__m128d test_mm_loadu_pd(double const* A) {807  // CHECK-LABEL: test_mm_loadu_pd808  // CHECK: load <2 x double>, ptr %{{.*}}, align 1{{$}}809  return _mm_loadu_pd(A);810}811 812__m128i test_mm_loadu_si128(__m128i const* A) {813  // CHECK-LABEL: test_mm_loadu_si128814  // CHECK: load <2 x i64>, ptr %{{.*}}, align 1{{$}}815  return _mm_loadu_si128(A);816}817 818__m128i test_mm_loadu_si64(void const* A) {819  // CHECK-LABEL: test_mm_loadu_si64820  // CHECK: load i64, ptr %{{.*}}, align 1{{$}}821  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 0822  // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1823  return _mm_loadu_si64(A);824}825 826__m128i test_mm_loadu_si32(void const* A) {827  // CHECK-LABEL: test_mm_loadu_si32828  // CHECK: load i32, ptr %{{.*}}, align 1{{$}}829  // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 0830  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 1831  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 2832  // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3833  return _mm_loadu_si32(A);834}835 836__m128i test_mm_loadu_si16(void const* A) {837  // CHECK-LABEL: test_mm_loadu_si16838  // CHECK: load i16, ptr %{{.*}}, align 1{{$}}839  // CHECK: insertelement <8 x i16> poison, i16 %{{.*}}, i32 0840  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 1841  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 2842  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 3843  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 4844  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 5845  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 6846  // CHECK: insertelement <8 x i16> %{{.*}}, i16 0, i32 7847  return _mm_loadu_si16(A);848}849 850__m128i test_mm_madd_epi16(__m128i A, __m128i B) {851  // CHECK-LABEL: test_mm_madd_epi16852  // CHECK: call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})853  return _mm_madd_epi16(A, B);854}855TEST_CONSTEXPR(match_v4si(_mm_madd_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){9, 10, 11, 12, 13, 14, 15, 16}), 29, 81, 149, 233));856 857void test_mm_maskmoveu_si128(__m128i A, __m128i B, char* C) {858  // CHECK-LABEL: test_mm_maskmoveu_si128859  // CHECK: call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, ptr %{{.*}})860  _mm_maskmoveu_si128(A, B, C);861}862 863__m128i test_mm_max_epi16(__m128i A, __m128i B) {864  // CHECK-LABEL: test_mm_max_epi16865  // CHECK: call <8 x i16> @llvm.smax.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})866  return _mm_max_epi16(A, B);867}868 869TEST_CONSTEXPR(match_v8hi(_mm_max_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){1, 2, 3, 5, 8, 12, 20, 32}), 1, 2, 3, 5, 8, 12, 20, 32));870 871__m128i test_mm_max_epu8(__m128i A, __m128i B) {872  // CHECK-LABEL: test_mm_max_epu8873  // CHECK: call <16 x i8> @llvm.umax.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})874  return _mm_max_epu8(A, B);875}876 877TEST_CONSTEXPR(match_v16qu(_mm_max_epu8((__m128i)(__v16qu){9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v16qu){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16));878 879__m128d test_mm_max_pd(__m128d A, __m128d B) {880  // CHECK-LABEL: test_mm_max_pd881  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.max.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})882  return _mm_max_pd(A, B);883}884 885__m128d test_mm_max_sd(__m128d A, __m128d B) {886  // CHECK-LABEL: test_mm_max_sd887  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.max.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})888  return _mm_max_sd(A, B);889}890 891void test_mm_mfence(void) {892  // CHECK-LABEL: test_mm_mfence893  // CHECK: call void @llvm.x86.sse2.mfence()894  _mm_mfence();895}896 897__m128i test_mm_min_epi16(__m128i A, __m128i B) {898  // CHECK-LABEL: test_mm_min_epi16899  // CHECK: call <8 x i16> @llvm.smin.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})900  return _mm_min_epi16(A, B);901}902 903TEST_CONSTEXPR(match_v8hi(_mm_min_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){1, 2, 3, 5, 8, 12, 20, 32}), 1, 2, 3, 4, 5, 6, 7, 8));904 905__m128i test_mm_min_epu8(__m128i A, __m128i B) {906  // CHECK-LABEL: test_mm_min_epu8907  // CHECK: call <16 x i8> @llvm.umin.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})908  return _mm_min_epu8(A, B);909}910 911TEST_CONSTEXPR(match_v16qu(_mm_min_epu8((__m128i)(__v16qu){9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v16qu){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8));912 913__m128d test_mm_min_pd(__m128d A, __m128d B) {914  // CHECK-LABEL: test_mm_min_pd915  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.min.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})916  return _mm_min_pd(A, B);917}918 919__m128d test_mm_min_sd(__m128d A, __m128d B) {920  // CHECK-LABEL: test_mm_min_sd921  // CHECK: call {{.*}}<2 x double> @llvm.x86.sse2.min.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})922  return _mm_min_sd(A, B);923}924 925__m64 test_mm_movepi64_pi64(__m128i A) {926  // CHECK-LABEL: test_mm_movepi64_pi64927  // CHECK: [[EXT:%.*]] = extractelement <2 x i64> %1, i32 0928  return _mm_movepi64_pi64(A);929}930TEST_CONSTEXPR(match_m64(_mm_movepi64_pi64((__m128i){8, -8}), 8ULL));931 932__m128i test_mm_movpi64_epi64(__m64 A) {933  // CHECK-LABEL: test_mm_movpi64_epi64934  // CHECK: shufflevector <1 x i64> %{{.*}}, <1 x i64> %{{.*}}, <2 x i32> <i32 0, i32 1>935  return _mm_movpi64_epi64(A);936}937TEST_CONSTEXPR(match_m128i(_mm_movpi64_epi64((__m64){5LL}), 5ULL, 0ULL));938 939__m128i test_mm_move_epi64(__m128i A) {940  // CHECK-LABEL: test_mm_move_epi64941  // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>942  return _mm_move_epi64(A);943}944TEST_CONSTEXPR(match_m128i(_mm_move_epi64((__m128i){16LL, 15LL}), 16ULL, 0ULL));945 946__m128d test_mm_move_sd(__m128d A, __m128d B) {947  // CHECK-LABEL: test_mm_move_sd948  // CHECK: extractelement <2 x double> %{{.*}}, i32 0949  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0950  return _mm_move_sd(A, B);951}952TEST_CONSTEXPR(match_m128d(_mm_move_sd((__m128d){+2.0, +8.0}, (__m128d){-4.0, +2.0}), -4.0, +8.0));953 954int test_mm_movemask_epi8(__m128i A) {955  // CHECK-LABEL: test_mm_movemask_epi8956  // CHECK: call {{.*}}i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %{{.*}})957  return _mm_movemask_epi8(A);958}959TEST_CONSTEXPR(_mm_movemask_epi8((__m128i)(__v16qu){0x7F,0x80,0x01,0xFF,0x00,0xAA,0x55,0xC3,0x12,0x8E,0x00,0xFE,0x7E,0x81,0xFF,0x01}) == 0x6AAA);960TEST_CONSTEXPR(_mm_movemask_epi8((__m128i)(__v4si){(int)0x80FF00AA,(int)0x7F0183E1,(int)0xDEADBEEF,(int)0xC0000001}) == 0x8F3D);961TEST_CONSTEXPR(_mm_movemask_epi8((__m128i)(__v2du){0xFF00000000000080ULL,0x7F010203040506C3ULL}) == 0x181);962 963int test_mm_movemask_pd(__m128d A) {964  // CHECK-LABEL: test_mm_movemask_pd965  // CHECK: call {{.*}}i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %{{.*}})966  return _mm_movemask_pd(A);967}968TEST_CONSTEXPR(_mm_movemask_pd((__m128d)(__v2df){-12345.67890123, 4567.89012345}) == 0x1);969TEST_CONSTEXPR(_mm_movemask_pd((__m128d)(__v2df){0.0000987654321, 09876.5432109876}) == 0x0);970 971__m128i test_mm_mul_epu32(__m128i A, __m128i B) {972  // CHECK-LABEL: test_mm_mul_epu32973  // CHECK: and <2 x i64> %{{.*}}, splat (i64 4294967295)974  // CHECK: and <2 x i64> %{{.*}}, splat (i64 4294967295)975  // CHECK: mul <2 x i64> %{{.*}}, %{{.*}}976  return _mm_mul_epu32(A, B);977}978TEST_CONSTEXPR(match_m128i(_mm_mul_epu32((__m128i)(__v4si){+1, -2, +3, -4}, (__m128i)(__v4si){-16, -14, +12, +10}), 4294967280, 36));979 980__m128d test_mm_mul_pd(__m128d A, __m128d B) {981  // CHECK-LABEL: test_mm_mul_pd982  // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}983  return _mm_mul_pd(A, B);984}985TEST_CONSTEXPR(match_m128d(_mm_mul_pd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), +5.0, +15.0));986 987__m128d test_mm_mul_sd(__m128d A, __m128d B) {988  // CHECK-LABEL: test_mm_mul_sd989  // CHECK: extractelement <2 x double> %{{.*}}, i32 0990  // CHECK: extractelement <2 x double> %{{.*}}, i32 0991  // CHECK: fmul double992  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0993  return _mm_mul_sd(A, B);994}995TEST_CONSTEXPR(match_m128d(_mm_mul_sd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), +5.0, -3.0));996 997__m128i test_mm_mulhi_epi16(__m128i A, __m128i B) {998  // CHECK-LABEL: test_mm_mulhi_epi16999  // CHECK: call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1000  return _mm_mulhi_epi16(A, B);1001}1002TEST_CONSTEXPR(match_v8hi(_mm_mulhi_epi16((__m128i)(__v8hi){+1, -2, +3, -4, +5, -6, +7, -8}, (__m128i)(__v8hi){-16, -14, +12, +10, -8, +6, -4, +2}), -1, 0, 0, -1, -1, -1, -1, -1));1003 1004__m128i test_mm_mulhi_epu16(__m128i A, __m128i B) {1005  // CHECK-LABEL: test_mm_mulhi_epu161006  // CHECK: call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1007  return _mm_mulhi_epu16(A, B);1008}1009TEST_CONSTEXPR(match_v8hi(_mm_mulhi_epu16((__m128i)(__v8hi){+1, -2, +3, -4, +5, -6, +7, -8}, (__m128i)(__v8hi){-16, -14, +12, +10, -8, +6, -4, +2}), 0, -16, 0, 9, 4, 5, 6, 1));1010 1011__m128i test_mm_mullo_epi16(__m128i A, __m128i B) {1012  // CHECK-LABEL: test_mm_mullo_epi161013  // CHECK: mul <8 x i16> %{{.*}}, %{{.*}}1014  return _mm_mullo_epi16(A, B);1015}1016TEST_CONSTEXPR(match_v8hi(_mm_mullo_epi16((__m128i)(__v8hi){+1, -2, +3, -4, +5, -6, +7, -8}, (__m128i)(__v8hi){-16, -14, +12, +10, -8, +6, -4, +2}), -16, 28, 36, -40, -40, -36, -28, -16));1017 1018__m128d test_mm_or_pd(__m128d A, __m128d B) {1019  // CHECK-LABEL: test_mm_or_pd1020  // CHECK: or <2 x i64> %{{.*}}, %{{.*}}1021  return _mm_or_pd(A, B);1022}1023TEST_CONSTEXPR(match_m128d(_mm_or_pd((__m128d){+1.0, -3.0}, (__m128d){-0.0, +0.0}), -1.0, -3.0));1024 1025__m128i test_mm_or_si128(__m128i A, __m128i B) {1026  // CHECK-LABEL: test_mm_or_si1281027  // CHECK: or <2 x i64> %{{.*}}, %{{.*}}1028  return _mm_or_si128(A, B);1029}1030TEST_CONSTEXPR(match_v4si(_mm_or_si128((__m128i)(__v4si){0, -1, 0, -1}, (__m128i)(__v4si){0, 0, -1, -1}), 0, -1, -1, -1));1031 1032__m128i test_mm_packs_epi16(__m128i A, __m128i B) {1033  // CHECK-LABEL: test_mm_packs_epi161034  // CHECK: call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1035  return _mm_packs_epi16(A, B);1036}1037TEST_CONSTEXPR(match_v16qi(_mm_packs_epi16((__m128i)(__v8hi){130, -200, 127, -128, 300, -1000, 42, -42}, (__m128i)(__v8hi){0, 1, -1, 255, -129, 128, 20000, -32768}), 127, -128, 127, -128, 127, -128, 42, -42, 0, 1, -1, 127, -128, 127, 127, -128));1038 1039__m128i test_mm_packs_epi32(__m128i A, __m128i B) {1040  // CHECK-LABEL: test_mm_packs_epi321041  // CHECK: call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})1042  return _mm_packs_epi32(A, B);1043}1044TEST_CONSTEXPR(match_v8hi(_mm_packs_epi32((__m128i)(__v4si){40000, -50000, 32767, -32768}, (__m128i)(__v4si){0, 1, -1, 70000}), 32767, -32768, 32767, -32768, 0, 1, -1, 32767));1045 1046__m128i test_mm_packus_epi16(__m128i A, __m128i B) {1047  // CHECK-LABEL: test_mm_packus_epi161048  // CHECK: call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1049  return _mm_packus_epi16(A, B);1050}1051TEST_CONSTEXPR(match_v16qi(_mm_packus_epi16((__m128i)(__v8hi){-1, 0, 1, 127, 300, -1000, 255, -42}, (__m128i)(__v8hi){0, 1, -1, 255, -129, 128, 20000, -32768}), 0, 0, 1, 127, -1, 0, -1, 0, 0, 1, 0, -1, 0, -128, -1, 0));1052 1053void test_mm_pause(void) {1054  // CHECK-LABEL: test_mm_pause1055  // CHECK: call void @llvm.x86.sse2.pause()1056  return _mm_pause();1057}1058 1059__m128i test_mm_sad_epu8(__m128i A, __m128i B) {1060  // CHECK-LABEL: test_mm_sad_epu81061  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})1062  return _mm_sad_epu8(A, B);1063}1064 1065__m128i test_mm_set_epi8(char A, char B, char C, char D,1066                         char E, char F, char G, char H,1067                         char I, char J, char K, char L,1068                         char M, char N, char O, char P) {1069  // CHECK-LABEL: test_mm_set_epi81070  // CHECK: insertelement <16 x i8> poison, i8 %{{.*}}, i32 01071  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11072  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 21073  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 31074  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 41075  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 51076  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 61077  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 71078  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 81079  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 91080  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 101081  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 111082  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 121083  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 131084  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 141085  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 151086  return _mm_set_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);1087}1088TEST_CONSTEXPR(match_v16qi(_mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));1089 1090__m128i test_mm_set_epi16(short A, short B, short C, short D,1091                          short E, short F, short G, short H) {1092  // CHECK-LABEL: test_mm_set_epi161093  // CHECK: insertelement <8 x i16> poison, i16 %{{.*}}, i32 01094  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 11095  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 21096  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 31097  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 41098  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 51099  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 61100  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 71101  return _mm_set_epi16(A, B, C, D, E, F, G, H);1102}1103TEST_CONSTEXPR(match_v8hi(_mm_set_epi16(0, -1, -2, -3, -4, -5, -6, -7), -7, -6, -5, -4, -3, -2, -1, 0));1104 1105__m128i test_mm_set_epi32(int A, int B, int C, int D) {1106  // CHECK-LABEL: test_mm_set_epi321107  // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 01108  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 11109  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 21110  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 31111  return _mm_set_epi32(A, B, C, D);1112}1113TEST_CONSTEXPR(match_v4si(_mm_set_epi32(1, -3, 5, -7), -7, 5, -3, 1));1114 1115__m128i test_mm_set_epi64(__m64 A, __m64 B) {1116  // CHECK-LABEL: test_mm_set_epi641117  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 01118  // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 11119  return _mm_set_epi64(A, B);1120}1121TEST_CONSTEXPR(match_v2di(_mm_set_epi64((__m64){-1}, (__m64){42}), 42, -1));1122 1123__m128i test_mm_set_epi64x(long long A, long long B) {1124  // CHECK-LABEL: test_mm_set_epi64x1125  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 01126  // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 11127  return _mm_set_epi64x(A, B);1128}1129TEST_CONSTEXPR(match_v2di(_mm_set_epi64x(100, -1000), -1000, 100));1130 1131__m128d test_mm_set_pd(double A, double B) {1132  // CHECK-LABEL: test_mm_set_pd1133  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 01134  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 11135  return _mm_set_pd(A, B);1136}1137TEST_CONSTEXPR(match_m128d(_mm_set_pd(-9.0, +3.0), +3.0, -9.0));1138 1139__m128d test_mm_set_pd1(double A) {1140  // CHECK-LABEL: test_mm_set_pd11141  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 01142  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 11143  return _mm_set_pd1(A);1144}1145TEST_CONSTEXPR(match_m128d(_mm_set_pd1(+5.0), +5.0, +5.0));1146 1147__m128d test_mm_set_sd(double A) {1148  // CHECK-LABEL: test_mm_set_sd1149  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 01150  // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 11151  return _mm_set_sd(A);1152}1153TEST_CONSTEXPR(match_m128d(_mm_set_sd(+1.0), +1.0, +0.0));1154 1155__m128i test_mm_set1_epi8(char A) {1156  // CHECK-LABEL: test_mm_set1_epi81157  // CHECK: insertelement <16 x i8> poison, i8 %{{.*}}, i32 01158  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11159  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 21160  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 31161  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 41162  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 51163  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 61164  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 71165  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 81166  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 91167  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 101168  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 111169  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 121170  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 131171  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 141172  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 151173  return _mm_set1_epi8(A);1174}1175TEST_CONSTEXPR(match_v16qi(_mm_set1_epi8(99), 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99));1176 1177__m128i test_mm_set1_epi16(short A) {1178  // CHECK-LABEL: test_mm_set1_epi161179  // CHECK: insertelement <8 x i16> poison, i16 %{{.*}}, i32 01180  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 11181  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 21182  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 31183  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 41184  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 51185  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 61186  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 71187  return _mm_set1_epi16(A);1188}1189TEST_CONSTEXPR(match_v8hi(_mm_set1_epi16(-128), -128, -128, -128, -128, -128, -128, -128, -128));1190 1191__m128i test_mm_set1_epi32(int A) {1192  // CHECK-LABEL: test_mm_set1_epi321193  // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 01194  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 11195  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 21196  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 31197  return _mm_set1_epi32(A);1198}1199TEST_CONSTEXPR(match_v4si(_mm_set1_epi32(55), 55, 55, 55, 55));1200 1201__m128i test_mm_set1_epi64(__m64 A) {1202  // CHECK-LABEL: test_mm_set1_epi641203  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 01204  // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 11205  return _mm_set1_epi64(A);1206}1207TEST_CONSTEXPR(match_v2di(_mm_set1_epi64((__m64){-65535}), -65535, -65535));1208 1209__m128i test_mm_set1_epi64x(long long A) {1210  // CHECK-LABEL: test_mm_set1_epi64x1211  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 01212  // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 11213  return _mm_set1_epi64x(A);1214}1215TEST_CONSTEXPR(match_v2di(_mm_set1_epi64x(65536), 65536, 65536));1216 1217__m128d test_mm_set1_pd(double A) {1218  // CHECK-LABEL: test_mm_set1_pd1219  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 01220  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 11221  return _mm_set1_pd(A);1222}1223TEST_CONSTEXPR(match_m128d(_mm_set1_pd(-42.0), -42.0, -42.0));1224 1225__m128i test_mm_setr_epi8(char A, char B, char C, char D,1226                          char E, char F, char G, char H,1227                          char I, char J, char K, char L,1228                          char M, char N, char O, char P) {1229  // CHECK-LABEL: test_mm_setr_epi81230  // CHECK: insertelement <16 x i8> poison, i8 %{{.*}}, i32 01231  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11232  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 21233  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 31234  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 41235  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 51236  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 61237  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 71238  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 81239  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 91240  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 101241  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 111242  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 121243  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 131244  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 141245  // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 151246  return _mm_setr_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);1247}1248TEST_CONSTEXPR(match_v16qi(_mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15));1249 1250__m128i test_mm_setr_epi16(short A, short B, short C, short D,1251                           short E, short F, short G, short H) {1252  // CHECK-LABEL: test_mm_setr_epi161253  // CHECK: insertelement <8 x i16> poison, i16 %{{.*}}, i32 01254  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 11255  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 21256  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 31257  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 41258  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 51259  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 61260  // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 71261  return _mm_setr_epi16(A, B, C, D, E, F, G, H);1262}1263TEST_CONSTEXPR(match_v8hi(_mm_setr_epi16(0, -1, -2, -3, -4, -5, -6, -7), 0, -1, -2, -3, -4, -5, -6, -7));1264 1265__m128i test_mm_setr_epi32(int A, int B, int C, int D) {1266  // CHECK-LABEL: test_mm_setr_epi321267  // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 01268  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 11269  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 21270  // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 31271  return _mm_setr_epi32(A, B, C, D);1272}1273TEST_CONSTEXPR(match_v4si(_mm_setr_epi32(1, -3, 5, -7), 1, -3, 5, -7));1274 1275__m128i test_mm_setr_epi64(__m64 A, __m64 B) {1276  // CHECK-LABEL: test_mm_setr_epi641277  // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 01278  // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 11279  return _mm_setr_epi64(A, B);1280}1281TEST_CONSTEXPR(match_v2di(_mm_setr_epi64((__m64){-1}, (__m64){42}), -1, 42));1282 1283__m128d test_mm_setr_pd(double A, double B) {1284  // CHECK-LABEL: test_mm_setr_pd1285  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 01286  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 11287  return _mm_setr_pd(A, B);1288}1289TEST_CONSTEXPR(match_m128d(_mm_setr_pd(-9.0, +3.0), -9.0, +3.0));1290 1291__m128d test_mm_setzero_pd(void) {1292  // CHECK-LABEL: test_mm_setzero_pd1293  // CHECK: store <2 x double> zeroinitializer1294  return _mm_setzero_pd();1295}1296TEST_CONSTEXPR(match_m128d(_mm_setzero_pd(), +0.0, +0.0));1297 1298__m128i test_mm_setzero_si128(void) {1299  // CHECK-LABEL: test_mm_setzero_si1281300  // CHECK: store <2 x i64> zeroinitializer1301  return _mm_setzero_si128();1302}1303TEST_CONSTEXPR(match_m128i(_mm_setzero_si128(), 0, 0));1304 1305__m128i test_mm_shuffle_epi32(__m128i A) {1306  // CHECK-LABEL: test_mm_shuffle_epi321307  // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> poison, <4 x i32> zeroinitializer1308  return _mm_shuffle_epi32(A, 0);1309}1310TEST_CONSTEXPR(match_v4si(_mm_shuffle_epi32(((__m128i)(__v4si){0,1,2,3}), 0), 0,0,0,0));1311__m128d test_mm_shuffle_pd(__m128d A, __m128d B) {1312  // CHECK-LABEL: test_mm_shuffle_pd1313  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 2>1314  return _mm_shuffle_pd(A, B, 1);1315}1316 1317TEST_CONSTEXPR((match_m128d(_mm_shuffle_pd(((__m128d)(__v2df){1.0, 2.0}), ((__m128d)(__v2df){3.0, 4.0}), 3), 2.0, 4.0)));1318TEST_CONSTEXPR((match_m128d(_mm_shuffle_pd(((__m128d)(__v2df){1.0, 2.0}), ((__m128d)(__v2df){3.0, 4.0}), 0), 1.0, 3.0)));1319TEST_CONSTEXPR((match_m128d(_mm_shuffle_pd(((__m128d)(__v2df){1.0, 2.0}), ((__m128d)(__v2df){3.0, 4.0}), 1), 2.0, 3.0)));1320TEST_CONSTEXPR((match_m128d(_mm_shuffle_pd(((__m128d)(__v2df){1.0, 2.0}), ((__m128d)(__v2df){3.0, 4.0}), 2), 1.0, 4.0)));1321 1322__m128i test_mm_shufflehi_epi16(__m128i A) {1323  // CHECK-LABEL: test_mm_shufflehi_epi161324  // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>1325  return _mm_shufflehi_epi16(A, 0);1326}1327TEST_CONSTEXPR(match_v8hi(_mm_shufflehi_epi16(((__m128i)(__v8hi){0,1,2,3,4,5,6,7}), 0), 0,1,2,3, 4,4,4,4));1328__m128i test_mm_shufflelo_epi16(__m128i A) {1329  // CHECK-LABEL: test_mm_shufflelo_epi161330  // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 5, i32 6, i32 7>1331  return _mm_shufflelo_epi16(A, 0);1332}1333TEST_CONSTEXPR(match_v8hi(_mm_shufflelo_epi16(((__m128i)(__v8hi){0,1,2,3,4,5,6,7}), 0), 0,0,0,0, 4,5,6,7));1334__m128i test_mm_sll_epi16(__m128i A, __m128i B) {1335  // CHECK-LABEL: test_mm_sll_epi161336  // CHECK: call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1337  return _mm_sll_epi16(A, B);1338}1339TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){1, 0, 0, 0, 0, 0, 0, 0}), 2, 4, 6, 8, 10, 12, 14, 16));1340TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){16, 0, 0, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1341TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){0, 1, 0, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1342TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){0, 0, 1, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1343TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){0, 0, 0, 1, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1344TEST_CONSTEXPR(match_v8hi(_mm_sll_epi16((__m128i)(__v8hi){1, 2, 3, 4, 5, 6, 7, 8}, (__m128i)(__v8hi){1, 0, 0, 0, 1, 1, 1, 1}), 2, 4, 6, 8, 10, 12, 14, 16));1345 1346__m128i test_mm_sll_epi32(__m128i A, __m128i B) {1347  // CHECK-LABEL: test_mm_sll_epi321348  // CHECK: call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})1349  return _mm_sll_epi32(A, B);1350}1351TEST_CONSTEXPR(match_v4si(_mm_sll_epi32((__m128i)(__v4si){1, 2, 3, 4}, (__m128i)(__v4si){1, 0, 0, 0}), 2, 4, 6, 8));1352TEST_CONSTEXPR(match_v4si(_mm_sll_epi32((__m128i)(__v4si){1, 2, 3, 4}, (__m128i)(__v4si){32, 0, 0, 0}), 0, 0, 0, 0));1353TEST_CONSTEXPR(match_v4si(_mm_sll_epi32((__m128i)(__v4si){1, 2, 3, 4}, (__m128i)(__v4si){0, 1, 0, 0}), 0, 0, 0, 0));1354TEST_CONSTEXPR(match_v4si(_mm_sll_epi32((__m128i)(__v4si){1, 2, 3, 4}, (__m128i)(__v4si){1, 0, 1, 1}), 2, 4, 6, 8));1355 1356__m128i test_mm_sll_epi64(__m128i A, __m128i B) {1357  // CHECK-LABEL: test_mm_sll_epi641358  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})1359  return _mm_sll_epi64(A, B);1360}1361TEST_CONSTEXPR(match_v2di(_mm_sll_epi64((__m128i)(__v2di){1, 2}, (__m128i)(__v2di){1, 0}), 2, 4));1362TEST_CONSTEXPR(match_v2di(_mm_sll_epi64((__m128i)(__v2di){1, 2}, (__m128i)(__v2di){64, 0}), 0, 0));1363TEST_CONSTEXPR(match_v2di(_mm_sll_epi64((__m128i)(__v2di){1, 2}, (__m128i)(__v2di){1, 1}), 2, 4));1364 1365__m128i test_mm_slli_epi16(__m128i A) {1366  // CHECK-LABEL: test_mm_slli_epi161367  // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1368  return _mm_slli_epi16(A, 1);1369}1370TEST_CONSTEXPR(match_v8hi(_mm_slli_epi16((__m128i)(__v8hi){0, 1, 2, 3, 4, 5, 6, 7}, 0), 0, 1, 2, 3, 4, 5, 6, 7));1371TEST_CONSTEXPR(match_v8hi(_mm_slli_epi16((__m128i)(__v8hi){0, 1, 2, 3, 4, 5, 6, 7}, 1), 0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe));1372TEST_CONSTEXPR(match_v8hi(_mm_slli_epi16((__m128i)(__v8hi){0, 8, 2, 3, 4, 5, 6, 7}, 8), 0, 0x800, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700));1373TEST_CONSTEXPR(match_v8hi(_mm_slli_epi16((__m128i)(__v8hi){0, 8, 2, 3, 4, 5, 6, 7}, 16), 0, 0, 0, 0, 0, 0, 0, 0));1374 1375__m128i test_mm_slli_epi16_1(__m128i A) {1376  // CHECK-LABEL: test_mm_slli_epi16_11377  // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1378  return _mm_slli_epi16(A, -1);1379}1380 1381__m128i test_mm_slli_epi16_2(__m128i A, int B) {1382  // CHECK-LABEL: test_mm_slli_epi16_21383  // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1384  return _mm_slli_epi16(A, B);1385}1386 1387__m128i test_mm_slli_epi32(__m128i A) {1388  // CHECK-LABEL: test_mm_slli_epi321389  // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1390  return _mm_slli_epi32(A, 1);1391}1392TEST_CONSTEXPR(match_v4si(_mm_slli_epi32((__m128i)(__v4si){0, 1, 2, 3}, 0), 0, 1, 2, 3));1393TEST_CONSTEXPR(match_v4si(_mm_slli_epi32((__m128i)(__v4si){0, 1, 2, 3}, 1), 0, 0x2, 0x4, 0x6));1394TEST_CONSTEXPR(match_v4su(_mm_slli_epi32((__m128i)(__v4su){0, 1, 2, 3}, 31), 0, 0x80000000, 0x0, 0x80000000));1395TEST_CONSTEXPR(match_v4si(_mm_slli_epi32((__m128i)(__v4si){0, 1, 2, 3}, 32), 0, 0, 0, 0));1396TEST_CONSTEXPR(match_v4si(_mm_slli_epi32((__m128i)(__v4si){0, 1, 2, 3}, 33), 0, 0, 0, 0));1397 1398__m128i test_mm_slli_epi32_1(__m128i A) {1399  // CHECK-LABEL: test_mm_slli_epi32_11400  // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1401  return _mm_slli_epi32(A, -1);1402}1403 1404__m128i test_mm_slli_epi32_2(__m128i A, int B) {1405  // CHECK-LABEL: test_mm_slli_epi32_21406  // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1407  return _mm_slli_epi32(A, B);1408}1409 1410__m128i test_mm_slli_epi64(__m128i A) {1411  // CHECK-LABEL: test_mm_slli_epi641412  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1413  return _mm_slli_epi64(A, 1);1414}1415TEST_CONSTEXPR(match_v2di(_mm_slli_epi64((__m128i)(__v2di){0, 1}, 0), 0, 1));1416TEST_CONSTEXPR(match_v2di(_mm_slli_epi64((__m128i)(__v2di){0, 1}, 1), 0, 0x2));1417TEST_CONSTEXPR(match_v2di(_mm_slli_epi64((__m128i)(__v2di){5, 8}, 6), 0x140, 0x200));1418TEST_CONSTEXPR(match_v2du(_mm_slli_epi64((__m128i)(__v2du){0, 1}, 63), 0, 0x8000000000000000ULL));1419TEST_CONSTEXPR(match_v2di(_mm_slli_epi64((__m128i)(__v2di){0, 1}, 64), 0, 0));1420TEST_CONSTEXPR(match_v2di(_mm_slli_epi64((__m128i)(__v2di){0, 1}, 65), 0, 0));1421 1422__m128i test_mm_slli_epi64_1(__m128i A) {1423  // CHECK-LABEL: test_mm_slli_epi64_11424  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1425  return _mm_slli_epi64(A, -1);1426}1427 1428__m128i test_mm_slli_epi64_2(__m128i A, int B) {1429  // CHECK-LABEL: test_mm_slli_epi64_21430  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1431  return _mm_slli_epi64(A, B);1432}1433 1434__m128i test_mm_slli_si128(__m128i A) {1435  // CHECK-LABEL: test_mm_slli_si1281436  // CHECK: shufflevector <16 x i8> zeroinitializer, <16 x i8> %{{.*}}, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>1437  return _mm_slli_si128(A, 5);1438}1439TEST_CONSTEXPR(match_v16qi(_mm_slli_si128(((__m128i)(__v16qi){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 5), 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11));1440TEST_CONSTEXPR(match_v16qi(_mm_slli_si128(((__m128i)(__v16qi){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 16), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));1441 1442__m128i test_mm_slli_si128_2(__m128i A) {1443  // CHECK-LABEL: test_mm_slli_si128_21444  // CHECK: ret <2 x i64> zeroinitializer1445  return _mm_slli_si128(A, 17);1446}1447 1448__m128d test_mm_sqrt_pd(__m128d A) {1449  // CHECK-LABEL: test_mm_sqrt_pd1450  // CHECK: call {{.*}}<2 x double> @llvm.sqrt.v2f64(<2 x double> %{{.*}})1451  return _mm_sqrt_pd(A);1452}1453 1454__m128d test_mm_sqrt_sd(__m128d A, __m128d B) {1455  // CHECK-LABEL: test_mm_sqrt_sd1456  // CHECK: extractelement <2 x double> %{{.*}}, i32 01457  // CHECK: call double @llvm.sqrt.f64(double {{.*}})1458  // CHECK: %[[sqrt_vec:.*]] = insertelement <2 x double> poison, double %{{.*}}, i32 01459  // CHECK: insertelement <2 x double> %[[sqrt_vec]], double %{{.*}}, i32 11460  return _mm_sqrt_sd(A, B);1461}1462 1463__m128i test_mm_sra_epi16(__m128i A, __m128i B) {1464  // CHECK-LABEL: test_mm_sra_epi161465  // CHECK: call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1466  return _mm_sra_epi16(A, B);1467}1468TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){1, 0, 0, 0, 0, 0, 0, 0}), -8, 8, -4, 4, -2, 2, -1, 1));1469TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){16, 0, 0, 0, 0, 0, 0, 0}), -1, 0, -1, 0, -1, 0, -1, 0));1470TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){0, 1, 0, 0, 0, 0, 0, 0}), -1, 0, -1, 0, -1, 0, -1, 0));1471TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){0, 0, 1, 0, 0, 0, 0, 0}), -1, 0, -1, 0, -1, 0, -1, 0));1472TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){0, 0, 0, 1, 0, 0, 0, 0}), -1, 0, -1, 0, -1, 0, -1, 0));1473TEST_CONSTEXPR(match_v8hi(_mm_sra_epi16((__m128i)(__v8hi){-16, 16, -8, 8, -4, 4, -2, 2}, (__m128i)(__v8hi){1, 0, 0, 0, 1, 1, 1, 1}), -8, 8, -4, 4, -2, 2, -1, 1));1474 1475__m128i test_mm_sra_epi32(__m128i A, __m128i B) {1476  // CHECK-LABEL: test_mm_sra_epi321477  // CHECK: call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})1478  return _mm_sra_epi32(A, B);1479}1480TEST_CONSTEXPR(match_v4si(_mm_sra_epi32((__m128i)(__v4si){-16, 16, -8, 8}, (__m128i)(__v4si){1, 0, 0, 0}), -8, 8, -4, 4));1481TEST_CONSTEXPR(match_v4si(_mm_sra_epi32((__m128i)(__v4si){-16, 16, -8, 8}, (__m128i)(__v4si){32, 0, 0, 0}), -1, 0, -1, 0));1482TEST_CONSTEXPR(match_v4si(_mm_sra_epi32((__m128i)(__v4si){-16, 16, -8, 8}, (__m128i)(__v4si){0, 1, 0, 0}), -1, 0, -1, 0));1483TEST_CONSTEXPR(match_v4si(_mm_sra_epi32((__m128i)(__v4si){-16, 16, -8, 8}, (__m128i)(__v4si){1, 0, 1, 1}), -8, 8, -4, 4));1484 1485__m128i test_mm_srai_epi16(__m128i A) {1486  // CHECK-LABEL: test_mm_srai_epi161487  // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})1488  return _mm_srai_epi16(A, 1);1489}1490TEST_CONSTEXPR(match_v8hi(_mm_srai_epi16((__m128i)(__v8hi){-32768, 32767, -3, -2, -1, 0, 1, 2}, 1), -16384, 16383, -2, -1, -1, 0, 0, 1));1491TEST_CONSTEXPR(match_v8hi(_mm_srai_epi16((__m128i)(__v8hi){-32768, 32767, -3, -2, -1, 0, 1, 2}, 1), -16384, 16383, -2, -1, -1, 0, 0, 1));1492 1493__m128i test_mm_srai_epi16_1(__m128i A) {1494  // CHECK-LABEL: test_mm_srai_epi16_11495  // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})1496  return _mm_srai_epi16(A, -1);1497}1498 1499__m128i test_mm_srai_epi16_2(__m128i A, int B) {1500  // CHECK-LABEL: test_mm_srai_epi16_21501  // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})1502  return _mm_srai_epi16(A, B);1503}1504 1505__m128i test_mm_srai_epi32(__m128i A) {1506  // CHECK-LABEL: test_mm_srai_epi321507  // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})1508  return _mm_srai_epi32(A, 1);1509}1510TEST_CONSTEXPR(match_v4si(_mm_srai_epi32((__m128i)(__v4si){-32768, 32767, -3, 2}, 1), -16384, 16383, -2, 1));1511 1512__m128i test_mm_srai_epi32_1(__m128i A) {1513  // CHECK-LABEL: test_mm_srai_epi32_11514  // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})1515  return _mm_srai_epi32(A, -1);1516}1517 1518__m128i test_mm_srai_epi32_2(__m128i A, int B) {1519  // CHECK-LABEL: test_mm_srai_epi32_21520  // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})1521  return _mm_srai_epi32(A, B);1522}1523 1524__m128i test_mm_srl_epi16(__m128i A, __m128i B) {1525  // CHECK-LABEL: test_mm_srl_epi161526  // CHECK: call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1527  return _mm_srl_epi16(A, B);1528}1529TEST_CONSTEXPR(match_v8hu(_mm_srl_epi16((__m128i)(__v8hu){0x8000, 16, 8, 4, 2, 1, 0, 0xFFFF}, (__m128i)(__v8hi){1, 0, 0, 0, 0, 0, 0, 0}), 0x4000, 8, 4, 2, 1, 0, 0, 0x7FFF));1530TEST_CONSTEXPR(match_v8hi(_mm_srl_epi16((__m128i)(__v8hi){-1, 16, 8, 4, 2, 1, 0, -1}, (__m128i)(__v8hi){16, 0, 0, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1531TEST_CONSTEXPR(match_v8hi(_mm_srl_epi16((__m128i)(__v8hi){-1, 16, 8, 4, 2, 1, 0, -1}, (__m128i)(__v8hi){0, 1, 0, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1532TEST_CONSTEXPR(match_v8hi(_mm_srl_epi16((__m128i)(__v8hi){-1, 16, 8, 4, 2, 1, 0, -1}, (__m128i)(__v8hi){0, 0, 1, 0, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1533TEST_CONSTEXPR(match_v8hi(_mm_srl_epi16((__m128i)(__v8hi){-1, 16, 8, 4, 2, 1, 0, -1}, (__m128i)(__v8hi){0, 0, 0, 1, 0, 0, 0, 0}), 0, 0, 0, 0, 0, 0, 0, 0));1534TEST_CONSTEXPR(match_v8hu(_mm_srl_epi16((__m128i)(__v8hu){0x8000, 16, 8, 4, 2, 1, 0, 0xFFFF}, (__m128i)(__v8hi){1, 0, 0, 0, 1, 1, 1, 1}), 0x4000, 8, 4, 2, 1, 0, 0, 0x7FFF));1535 1536__m128i test_mm_srl_epi32(__m128i A, __m128i B) {1537  // CHECK-LABEL: test_mm_srl_epi321538  // CHECK: call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})1539  return _mm_srl_epi32(A, B);1540}1541TEST_CONSTEXPR(match_v4su(_mm_srl_epi32((__m128i)(__v4su){0x80000000, 16, 8, 4}, (__m128i)(__v4si){1, 0, 0, 0}), 0x40000000, 8, 4, 2));1542TEST_CONSTEXPR(match_v4si(_mm_srl_epi32((__m128i)(__v4si){-1, 16, 8, 4}, (__m128i)(__v4si){32, 0, 0, 0}), 0, 0, 0, 0));1543TEST_CONSTEXPR(match_v4si(_mm_srl_epi32((__m128i)(__v4si){-1, 16, 8, 4}, (__m128i)(__v4si){0, 1, 0, 0}), 0, 0, 0, 0));1544TEST_CONSTEXPR(match_v4su(_mm_srl_epi32((__m128i)(__v4su){0x80000000, 16, 8, 4}, (__m128i)(__v4si){1, 0, 1, 1}), 0x40000000, 8, 4, 2));1545 1546__m128i test_mm_srl_epi64(__m128i A, __m128i B) {1547  // CHECK-LABEL: test_mm_srl_epi641548  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})1549  return _mm_srl_epi64(A, B);1550}1551TEST_CONSTEXPR(match_v2du(_mm_srl_epi64((__m128i)(__v2du){0x8000000000000000ULL, 16}, (__m128i)(__v2di){1, 0}), 0x4000000000000000ULL, 8));1552TEST_CONSTEXPR(match_v2di(_mm_srl_epi64((__m128i)(__v2di){-1, 16}, (__m128i)(__v2di){64, 0}), 0, 0));1553TEST_CONSTEXPR(match_v2du(_mm_srl_epi64((__m128i)(__v2du){0x8000000000000000ULL, 16}, (__m128i)(__v2di){1, 1}), 0x4000000000000000ULL, 8));1554 1555__m128i test_mm_srli_epi16(__m128i A) {1556  // CHECK-LABEL: test_mm_srli_epi161557  // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1558  return _mm_srli_epi16(A, 1);1559}1560TEST_CONSTEXPR(match_v8hi(_mm_srli_epi16((__m128i)(__v8hi){0, 1, 2, 3, 4, 5, 6, 7}, 1), 0, 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0x3));1561 1562__m128i test_mm_srli_epi16_1(__m128i A) {1563  // CHECK-LABEL: test_mm_srli_epi16_11564  // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1565  return _mm_srli_epi16(A, -1);1566}1567 1568__m128i test_mm_srli_epi16_2(__m128i A, int B) {1569  // CHECK-LABEL: test_mm_srli_epi161570  // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})1571  return _mm_srli_epi16(A, B);1572}1573 1574__m128i test_mm_srli_epi32(__m128i A) {1575  // CHECK-LABEL: test_mm_srli_epi321576  // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1577  return _mm_srli_epi32(A, 1);1578}1579TEST_CONSTEXPR(match_v4si(_mm_srli_epi32((__m128i)(__v4si){0, 1, 2, 3}, 8), 0, 0x0, 0x0, 0x0));1580 1581__m128i test_mm_srli_epi32_1(__m128i A) {1582  // CHECK-LABEL: test_mm_srli_epi32_11583  // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1584  return _mm_srli_epi32(A, -1);1585}1586 1587__m128i test_mm_srli_epi32_2(__m128i A, int B) {1588  // CHECK-LABEL: test_mm_srli_epi32_21589  // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})1590  return _mm_srli_epi32(A, B);1591}1592 1593__m128i test_mm_srli_epi64(__m128i A) {1594  // CHECK-LABEL: test_mm_srli_epi641595  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1596  return _mm_srli_epi64(A, 1);1597}1598TEST_CONSTEXPR(match_v2di(_mm_srli_epi64((__m128i)(__v2di){100005, 100008}, 6), 0x61a, 0x61a));1599 1600__m128i test_mm_srli_epi64_1(__m128i A) {1601  // CHECK-LABEL: test_mm_srli_epi64_11602  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1603  return _mm_srli_epi64(A, -1);1604}1605 1606__m128i test_mm_srli_epi64_2(__m128i A, int B) {1607  // CHECK-LABEL: test_mm_srli_epi64_21608  // CHECK: call {{.*}}<2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})1609  return _mm_srli_epi64(A, B);1610}1611 1612__m128i test_mm_srli_si128(__m128i A) {1613  // CHECK-LABEL: test_mm_srli_si1281614  // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> zeroinitializer, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>1615  return _mm_srli_si128(A, 5);1616}1617TEST_CONSTEXPR(match_v16qi(_mm_srli_si128(((__m128i)(__v16qi){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}), 5), 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0));1618TEST_CONSTEXPR(match_v16qi(_mm_srli_si128(((__m128i)(__v16qi){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}), 16), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));1619 1620__m128i test_mm_srli_si128_2(__m128i A) {1621  // CHECK-LABEL: test_mm_srli_si128_21622  // ret <2 x i64> zeroinitializer1623  return _mm_srli_si128(A, 17);1624}1625 1626void test_mm_store_pd(double* A, __m128d B) {1627  // CHECK-LABEL: test_mm_store_pd1628  // CHECK: store <2 x double> %{{.*}}, ptr %{{.*}}, align 161629  _mm_store_pd(A, B);1630}1631 1632void test_mm_store_pd1(double* x, __m128d y) {1633  // CHECK-LABEL: test_mm_store_pd11634  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer1635  // CHECK: store <2 x double> %{{.*}}, ptr {{.*}}, align 161636  _mm_store_pd1(x, y);1637}1638 1639void test_mm_store_sd(double* A, __m128d B) {1640  // CHECK-LABEL: test_mm_store_sd1641  // CHECK: extractelement <2 x double> %{{.*}}, i32 01642  // CHECK: store double %{{.*}}, ptr %{{.*}}, align 1{{$}}1643  _mm_store_sd(A, B);1644}1645 1646void test_mm_store_si128(__m128i* A, __m128i B) {1647  // CHECK-LABEL: test_mm_store_si1281648  // CHECK: store <2 x i64> %{{.*}}, ptr %{{.*}}, align 161649  _mm_store_si128(A, B);1650}1651 1652void test_mm_store1_pd(double* x, __m128d y) {1653  // CHECK-LABEL: test_mm_store1_pd1654  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer1655  // CHECK: store <2 x double> %{{.*}}, ptr %{{.*}}, align 161656  _mm_store1_pd(x, y);1657}1658 1659void test_mm_storeh_pd(double* A, __m128d B) {1660  // CHECK-LABEL: test_mm_storeh_pd1661  // CHECK: extractelement <2 x double> %{{.*}}, i32 11662  // CHECK: store double %{{.*}}, ptr %{{.*}}, align 1{{$}}1663  _mm_storeh_pd(A, B);1664}1665 1666void test_mm_storel_epi64(__m128i x, void* y) {1667  // CHECK-LABEL: test_mm_storel_epi641668  // CHECK: extractelement <2 x i64> %{{.*}}, i32 01669  // CHECK: store {{.*}} ptr {{.*}}, align 1{{$}}1670  _mm_storel_epi64((__m128i_u*)y, x);1671}1672 1673void test_mm_storel_pd(double* A, __m128d B) {1674  // CHECK-LABEL: test_mm_storel_pd1675  // CHECK: extractelement <2 x double> %{{.*}}, i32 01676  // CHECK: store double %{{.*}}, ptr %{{.*}}, align 1{{$}}1677  _mm_storel_pd(A, B);1678}1679 1680void test_mm_storer_pd(__m128d A, double* B) {1681  // CHECK-LABEL: test_mm_storer_pd1682  // CHECK: shufflevector <2 x double> {{.*}}, <2 x double> {{.*}}, <2 x i32> <i32 1, i32 0>1683  // CHECK: store {{.*}} ptr {{.*}}, align 16{{$}}1684  _mm_storer_pd(B, A);1685}1686 1687void test_mm_storeu_pd(double* A, __m128d B) {1688  // CHECK-LABEL: test_mm_storeu_pd1689  // CHECK: store {{.*}} ptr {{.*}}, align 1{{$}}1690  // CHECK-NEXT: ret void1691  _mm_storeu_pd(A, B);1692}1693 1694void test_mm_storeu_si128(__m128i* A, __m128i B) {1695  // CHECK-LABEL: test_mm_storeu_si1281696  // CHECK: store <2 x i64> %{{.*}}, ptr %{{.*}}, align 1{{$}}1697  // CHECK-NEXT: ret void1698  _mm_storeu_si128(A, B);1699}1700 1701void test_mm_storeu_si64(void* A, __m128i B) {1702  // CHECK-LABEL: test_mm_storeu_si641703  // CHECK: [[EXT:%.*]] = extractelement <2 x i64> %{{.*}}, i32 01704  // CHECK: store i64 [[EXT]], ptr %{{.*}}, align 1{{$}}1705  // CHECK-NEXT: ret void1706  _mm_storeu_si64(A, B);1707}1708 1709void test_mm_storeu_si32(void* A, __m128i B) {1710  // CHECK-LABEL: test_mm_storeu_si321711  // CHECK: [[EXT:%.*]] = extractelement <4 x i32> %{{.*}}, i32 01712  // CHECK: store i32 [[EXT]], ptr %{{.*}}, align 1{{$}}1713  // CHECK-NEXT: ret void1714  _mm_storeu_si32(A, B);1715}1716 1717void test_mm_storeu_si16(void* A, __m128i B) {1718  // CHECK-LABEL: test_mm_storeu_si161719  // CHECK: [[EXT:%.*]] = extractelement <8 x i16> %{{.*}}, i32 01720  // CHECK: store i16 [[EXT]], ptr %{{.*}}, align 1{{$}}1721  // CHECK-NEXT: ret void1722  _mm_storeu_si16(A, B);1723}1724 1725void test_mm_stream_pd(double *A, __m128d B) {1726  // CHECK-LABEL: test_mm_stream_pd1727  // CHECK: store <2 x double> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal1728  _mm_stream_pd(A, B);1729}1730 1731void test_mm_stream_pd_void(void *A, __m128d B) {1732  // CHECK-LABEL: test_mm_stream_pd_void1733  // CHECK: store <2 x double> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal1734  _mm_stream_pd(A, B);1735}1736 1737void test_mm_stream_si32(int *A, int B) {1738  // CHECK-LABEL: test_mm_stream_si321739  // CHECK: store i32 %{{.*}}, ptr %{{.*}}, align 1, !nontemporal1740  _mm_stream_si32(A, B);1741}1742 1743void test_mm_stream_si32_void(void *A, int B) {1744  // CHECK-LABEL: test_mm_stream_si32_void1745  // CHECK: store i32 %{{.*}}, ptr %{{.*}}, align 1, !nontemporal1746  _mm_stream_si32(A, B);1747}1748 1749#ifdef __x86_64__1750void test_mm_stream_si64(long long *A, long long B) {1751  // X64-LABEL: test_mm_stream_si641752  // X64: store i64 %{{.*}}, ptr %{{.*}}, align 1, !nontemporal1753  _mm_stream_si64(A, B);1754}1755 1756void test_mm_stream_si64_void(void *A, long long B) {1757  // X64-LABEL: test_mm_stream_si64_void1758  // X64: store i64 %{{.*}}, ptr %{{.*}}, align 1, !nontemporal1759  _mm_stream_si64(A, B);1760}1761#endif1762 1763void test_mm_stream_si128(__m128i *A, __m128i B) {1764  // CHECK-LABEL: test_mm_stream_si1281765  // CHECK: store <2 x i64> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal1766  _mm_stream_si128(A, B);1767}1768 1769void test_mm_stream_si128_void(void *A, __m128i B) {1770  // CHECK-LABEL: test_mm_stream_si128_void1771  // CHECK: store <2 x i64> %{{.*}}, ptr %{{.*}}, align 16, !nontemporal1772  _mm_stream_si128(A, B);1773}1774 1775__m128i test_mm_sub_epi8(__m128i A, __m128i B) {1776  // CHECK-LABEL: test_mm_sub_epi81777  // CHECK: sub <16 x i8>1778  return _mm_sub_epi8(A, B);1779}1780 1781TEST_CONSTEXPR(match_v16qi(_mm_sub_epi8((__m128i)(__v16qs){ 32, 33, 34, -35, -36, -37, 38, 39, -40, 41, -42, 43, -44, -45, 46, -47}, (__m128i)(__v16qs){ 1, 2, -3, -4, 5, -6, -7, 8, 9, -10, 11, 12, 13, 14, -15, 16}),  31, 31, 37, -31, -41, -31, 45, 31, -49, 51, -53, 31, -57, -59, 61, -63));1782 1783__m128i test_mm_sub_epi16(__m128i A, __m128i B) {1784  // CHECK-LABEL: test_mm_sub_epi161785  // CHECK: sub <8 x i16>1786  return _mm_sub_epi16(A, B);1787}1788 1789TEST_CONSTEXPR(match_v8hi(_mm_sub_epi16((__m128i)(__v8hi){ -16, -17, -18, -19, -20, 21, 22, 23}, (__m128i)(__v8hi){ 1, 2, 3, -4, -5, -6, 7, -8}),  -17, -19, -21, -15, -15, 27, 15, 31));1790 1791__m128i test_mm_sub_epi32(__m128i A, __m128i B) {1792  // CHECK-LABEL: test_mm_sub_epi321793  // CHECK: sub <4 x i32>1794  return _mm_sub_epi32(A, B);1795}1796 1797TEST_CONSTEXPR(match_v4si(_mm_sub_epi32((__m128i)(__v4si){ 8, 9, 10, 11}, (__m128i)(__v4si){ -1, -2, 3, 4}),  9, 11, 7, 7));1798 1799__m128i test_mm_sub_epi64(__m128i A, __m128i B) {1800  // CHECK-LABEL: test_mm_sub_epi641801  // CHECK: sub <2 x i64>1802  return _mm_sub_epi64(A, B);1803}1804 1805TEST_CONSTEXPR(match_v2di(_mm_sub_epi64((__m128i)(__v2di){ 4, -5}, (__m128i)(__v2di){ 1, -2}),  3, -3));1806 1807__m128d test_mm_sub_pd(__m128d A, __m128d B) {1808  // CHECK-LABEL: test_mm_sub_pd1809  // CHECK: fsub <2 x double>1810  return _mm_sub_pd(A, B);1811}1812TEST_CONSTEXPR(match_m128d(_mm_sub_pd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), -4.0, +2.0));1813 1814__m128d test_mm_sub_sd(__m128d A, __m128d B) {1815  // CHECK-LABEL: test_mm_sub_sd1816  // CHECK: extractelement <2 x double> %{{.*}}, i32 01817  // CHECK: extractelement <2 x double> %{{.*}}, i32 01818  // CHECK: fsub double1819  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 01820  return _mm_sub_sd(A, B);1821}1822TEST_CONSTEXPR(match_m128d(_mm_sub_sd((__m128d){+1.0, -3.0}, (__m128d){+5.0, -5.0}), -4.0, -3.0));1823 1824__m128i test_mm_subs_epi8(__m128i A, __m128i B) {1825  // CHECK-LABEL: test_mm_subs_epi81826  // CHECK: call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})1827  return _mm_subs_epi8(A, B);1828}1829TEST_CONSTEXPR(match_v16qi(_mm_subs_epi8((__m128i)(__v16qs){+100, +50, -100, +20, +80, -50, +120, -20, -100, -50, +100, -20, -80, +50, -120, +20}, (__m128i)(__v16qs){-50, -80, +50, -110, -60, +30, -20, +10, -50, -80, +50, -110, -60, +30, -20, +10}), +127, +127, -128, +127, +127, -80, +127, -30, -50, +30, +50, +90, -20, +20, -100, +10));1830 1831__m128i test_mm_subs_epi16(__m128i A, __m128i B) {1832  // CHECK-LABEL: test_mm_subs_epi161833  // CHECK: call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1834  return _mm_subs_epi16(A, B);1835}1836TEST_CONSTEXPR(match_v8hi(_mm_subs_epi16((__m128i)(__v8hi){+32000, -32000, +32000, -32000, +80, -50, +120, -20}, (__m128i)(__v8hi){-800, +800, +800, -800, -60, +30, -20, +10}), +32767, -32768, +31200, -31200, +140, -80, +140, -30));1837 1838__m128i test_mm_subs_epu8(__m128i A, __m128i B) {1839  // CHECK-LABEL: test_mm_subs_epu81840  // CHECK-NOT: call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})1841  // CHECK: call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})1842  return _mm_subs_epu8(A, B);1843}1844TEST_CONSTEXPR(match_v16qu(_mm_subs_epu8((__m128i)(__v16qu){0, 0, 0, 0, +127, +127, +127, +127, +128, +128, +128, +128, +255, +255, +255, +255}, (__m128i)(__v16qu){0, +127, +128, +255, 0, +127, +128, +255, 0, +127, +128, +255, 0, +127, +128, +255}), 0, 0, 0, 0, +127, 0, 0, 0, +128, +1, 0, 0, +255, +128, +127, 0));1845 1846__m128i test_mm_subs_epu16(__m128i A, __m128i B) {1847  // CHECK-LABEL: test_mm_subs_epu161848  // CHECK-NOT: call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1849  // CHECK: call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})1850  return _mm_subs_epu16(A, B);1851}1852TEST_CONSTEXPR(match_v8hu(_mm_subs_epu16((__m128i)(__v8hu){0, 0, 0, +32767, +32767, +32767, +65535, +65535}, (__m128i)(__v8hu){0, +32767, +65535, 0, +32767, +65535, 0, +32767}), 0, 0, 0, +32767, 0, 0, +65535, +32768));1853 1854int test_mm_ucomieq_sd(__m128d A, __m128d B) {1855  // CHECK-LABEL: test_mm_ucomieq_sd1856  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1857  return _mm_ucomieq_sd(A, B);1858}1859 1860int test_mm_ucomige_sd(__m128d A, __m128d B) {1861  // CHECK-LABEL: test_mm_ucomige_sd1862  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1863  return _mm_ucomige_sd(A, B);1864}1865 1866int test_mm_ucomigt_sd(__m128d A, __m128d B) {1867  // CHECK-LABEL: test_mm_ucomigt_sd1868  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1869  return _mm_ucomigt_sd(A, B);1870}1871 1872int test_mm_ucomile_sd(__m128d A, __m128d B) {1873  // CHECK-LABEL: test_mm_ucomile_sd1874  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1875  return _mm_ucomile_sd(A, B);1876}1877 1878int test_mm_ucomilt_sd(__m128d A, __m128d B) {1879  // CHECK-LABEL: test_mm_ucomilt_sd1880  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1881  return _mm_ucomilt_sd(A, B);1882}1883 1884int test_mm_ucomineq_sd(__m128d A, __m128d B) {1885  // CHECK-LABEL: test_mm_ucomineq_sd1886  // CHECK: call {{.*}}i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})1887  return _mm_ucomineq_sd(A, B);1888}1889 1890__m128d test_mm_undefined_pd(void) {1891  // X64-LABEL: test_mm_undefined_pd1892  // X64: ret <2 x double> zeroinitializer1893  //1894  // X86-LABEL: test_mm_undefined_pd1895  // X86: store <2 x double> zeroinitializer1896  return _mm_undefined_pd();1897}1898 1899__m128i test_mm_undefined_si128(void) {1900  // CHECK-LABEL: test_mm_undefined_si1281901  // CHECK: ret <2 x i64> zeroinitializer1902  return _mm_undefined_si128();1903}1904 1905__m128i test_mm_unpackhi_epi8(__m128i A, __m128i B) {1906  // CHECK-LABEL: test_mm_unpackhi_epi81907  // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>1908  return _mm_unpackhi_epi8(A, B);1909}1910TEST_CONSTEXPR(match_v16qi(_mm_unpackhi_epi8((__m128i)(__v16qi){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, (__m128i)(__v16qi){16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}), 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31));1911 1912__m128i test_mm_unpackhi_epi16(__m128i A, __m128i B) {1913  // CHECK-LABEL: test_mm_unpackhi_epi161914  // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>1915  return _mm_unpackhi_epi16(A, B);1916}1917TEST_CONSTEXPR(match_v8hi(_mm_unpackhi_epi16((__m128i)(__v8hi){0, 1, 2, 3, 4, 5, 6, 7}, (__m128i)(__v8hi){8, 9, 10, 11, 12, 13, 14, 15}), 4, 12, 5, 13, 6, 14, 7, 15));1918 1919__m128i test_mm_unpackhi_epi32(__m128i A, __m128i B) {1920  // CHECK-LABEL: test_mm_unpackhi_epi321921  // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 6, i32 3, i32 7>1922  return _mm_unpackhi_epi32(A, B);1923}1924TEST_CONSTEXPR(match_v4si(_mm_unpackhi_epi32((__m128i)(__v4si){0, 1, 2, 3}, (__m128i)(__v4si){ 4, 5, 6, 7}), 2, 6, 3, 7));1925 1926__m128i test_mm_unpackhi_epi64(__m128i A, __m128i B) {1927  // CHECK-LABEL: test_mm_unpackhi_epi641928  // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 3>1929  return _mm_unpackhi_epi64(A, B);1930}1931TEST_CONSTEXPR(match_v2di(_mm_unpackhi_epi64((__m128i)(__v2di){0, 1}, (__m128i)(__v2di){2, 3}), 1, 3));1932 1933__m128d test_mm_unpackhi_pd(__m128d A, __m128d B) {1934  // CHECK-LABEL: test_mm_unpackhi_pd1935  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 3>1936  return _mm_unpackhi_pd(A, B);1937}1938TEST_CONSTEXPR(match_m128d(_mm_unpackhi_pd((__m128d){+2.0, +8.0}, (__m128d){-4.0, -2.0}), +8.0, -2.0));1939 1940__m128i test_mm_unpacklo_epi8(__m128i A, __m128i B) {1941  // CHECK-LABEL: test_mm_unpacklo_epi81942  // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>1943  return _mm_unpacklo_epi8(A, B);1944}1945TEST_CONSTEXPR(match_v16qi(_mm_unpacklo_epi8((__m128i)(__v16qi){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, (__m128i)(__v16qi){16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}), 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23));1946 1947__m128i test_mm_unpacklo_epi16(__m128i A, __m128i B) {1948  // CHECK-LABEL: test_mm_unpacklo_epi161949  // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>1950  return _mm_unpacklo_epi16(A, B);1951}1952TEST_CONSTEXPR(match_v8hi(_mm_unpacklo_epi16((__m128i)(__v8hi){0, 1, 2, 3, 4, 5, 6, 7}, (__m128i)(__v8hi){8, 9, 10, 11, 12, 13, 14, 15}), 0, 8, 1, 9, 2, 10, 3, 11));1953 1954__m128i test_mm_unpacklo_epi32(__m128i A, __m128i B) {1955  // CHECK-LABEL: test_mm_unpacklo_epi321956  // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>1957  return _mm_unpacklo_epi32(A, B);1958}1959TEST_CONSTEXPR(match_v4si(_mm_unpacklo_epi32((__m128i)(__v4si){0, 1, 2, 3}, (__m128i)(__v4si){ 4, 5, 6, 7}), 0, 4, 1, 5));1960 1961__m128i test_mm_unpacklo_epi64(__m128i A, __m128i B) {1962  // CHECK-LABEL: test_mm_unpacklo_epi641963  // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>1964  return _mm_unpacklo_epi64(A, B);1965}1966TEST_CONSTEXPR(match_v2di(_mm_unpacklo_epi64((__m128i)(__v2di){0, 1}, (__m128i)(__v2di){2, 3}), 0, 2));1967 1968__m128d test_mm_unpacklo_pd(__m128d A, __m128d B) {1969  // CHECK-LABEL: test_mm_unpacklo_pd1970  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>1971  return _mm_unpacklo_pd(A, B);1972}1973TEST_CONSTEXPR(match_m128d(_mm_unpacklo_pd((__m128d){+2.0, +8.0}, (__m128d){-4.0, -2.0}), +2.0, -4.0));1974 1975__m128d test_mm_xor_pd(__m128d A, __m128d B) {1976  // CHECK-LABEL: test_mm_xor_pd1977  // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}1978  return _mm_xor_pd(A, B);1979}1980TEST_CONSTEXPR(match_m128d(_mm_xor_pd((__m128d){+1.0, -3.0}, (__m128d){+0.0, -0.0}), +1.0, +3.0));1981 1982__m128i test_mm_xor_si128(__m128i A, __m128i B) {1983  // CHECK-LABEL: test_mm_xor_si1281984  // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}1985  return _mm_xor_si128(A, B);1986}1987TEST_CONSTEXPR(match_v4si(_mm_xor_si128((__m128i)(__v4si){0, -1, 0, -1}, (__m128i)(__v4si){0, 0, -1, -1}), 0, -1, -1, 0));1988