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