351 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// REQUIRES: x86-registered-target3// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-- -target-feature +avx -disable-O0-optnone -emit-llvm -o - | opt -S -passes=mem2reg | FileCheck %s4// RUN: %clang_cc1 -ffreestanding %s -triple=i386-- -target-feature +avx -disable-O0-optnone -emit-llvm -o - | opt -S -passes=mem2reg | FileCheck %s5 6 7#include <immintrin.h>8 9//10// Test LLVM IR codegen of shuffle instructions, checking if the masks are correct11//12 13// CHECK-LABEL: define dso_local <8 x float> @x(14// CHECK-SAME: <8 x float> noundef [[A:%.*]], <8 x float> noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {15// CHECK-NEXT: [[ENTRY:.*:]]16// CHECK-NEXT: [[SHUFP:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 3, i32 2, i32 8, i32 11, i32 7, i32 6, i32 12, i32 15>17// CHECK-NEXT: ret <8 x float> [[SHUFP]]18//19__m256 x(__m256 a, __m256 b) {20 return _mm256_shuffle_ps(a, b, 203);21}22 23// CHECK-LABEL: define dso_local <2 x double> @test_mm_permute_pd(24// CHECK-SAME: <2 x double> noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {25// CHECK-NEXT: [[ENTRY:.*:]]26// CHECK-NEXT: [[PERMIL:%.*]] = shufflevector <2 x double> [[A]], <2 x double> poison, <2 x i32> <i32 1, i32 0>27// CHECK-NEXT: ret <2 x double> [[PERMIL]]28//29__m128d test_mm_permute_pd(__m128d a) {30 return _mm_permute_pd(a, 1);31}32 33// CHECK-LABEL: define dso_local <4 x double> @test_mm256_permute_pd(34// CHECK-SAME: <4 x double> noundef [[A:%.*]]) #[[ATTR0]] {35// CHECK-NEXT: [[ENTRY:.*:]]36// CHECK-NEXT: [[PERMIL:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>37// CHECK-NEXT: ret <4 x double> [[PERMIL]]38//39__m256d test_mm256_permute_pd(__m256d a) {40 return _mm256_permute_pd(a, 5);41}42 43// CHECK-LABEL: define dso_local <4 x float> @test_mm_permute_ps(44// CHECK-SAME: <4 x float> noundef [[A:%.*]]) #[[ATTR1]] {45// CHECK-NEXT: [[ENTRY:.*:]]46// CHECK-NEXT: [[PERMIL:%.*]] = shufflevector <4 x float> [[A]], <4 x float> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>47// CHECK-NEXT: ret <4 x float> [[PERMIL]]48//49__m128 test_mm_permute_ps(__m128 a) {50 return _mm_permute_ps(a, 0x1b);51}52 53// CHECK-LABEL: define dso_local <4 x float> @test_mm_permute_ps2(54// CHECK-SAME: <4 x float> noundef [[A:%.*]]) #[[ATTR1]] {55// CHECK-NEXT: [[ENTRY:.*:]]56// CHECK-NEXT: [[PERMIL:%.*]] = shufflevector <4 x float> [[A]], <4 x float> poison, <4 x i32> <i32 2, i32 1, i32 2, i32 3>57// CHECK-NEXT: ret <4 x float> [[PERMIL]]58//59__m128 test_mm_permute_ps2(__m128 a) {60 return _mm_permute_ps(a, 0xe6);61}62 63// CHECK-LABEL: define dso_local <8 x float> @test_mm256_permute_ps(64// CHECK-SAME: <8 x float> noundef [[A:%.*]]) #[[ATTR0]] {65// CHECK-NEXT: [[ENTRY:.*:]]66// CHECK-NEXT: [[PERMIL:%.*]] = shufflevector <8 x float> [[A]], <8 x float> poison, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>67// CHECK-NEXT: ret <8 x float> [[PERMIL]]68//69__m256 test_mm256_permute_ps(__m256 a) {70 return _mm256_permute_ps(a, 0x1b);71}72 73// CHECK-LABEL: define dso_local <4 x double> @test_mm256_permute2f128_pd(74// CHECK-SAME: <4 x double> noundef [[A:%.*]], <4 x double> noundef [[B:%.*]]) #[[ATTR0]] {75// CHECK-NEXT: [[ENTRY:.*:]]76// CHECK-NEXT: [[VPERM:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 2, i32 3, i32 6, i32 7>77// CHECK-NEXT: ret <4 x double> [[VPERM]]78//79__m256d test_mm256_permute2f128_pd(__m256d a, __m256d b) {80 return _mm256_permute2f128_pd(a, b, 0x31);81}82 83// CHECK-LABEL: define dso_local <8 x float> @test_mm256_permute2f128_ps(84// CHECK-SAME: <8 x float> noundef [[A:%.*]], <8 x float> noundef [[B:%.*]]) #[[ATTR0]] {85// CHECK-NEXT: [[ENTRY:.*:]]86// CHECK-NEXT: [[VPERM:%.*]] = shufflevector <8 x float> [[B]], <8 x float> [[A]], <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>87// CHECK-NEXT: ret <8 x float> [[VPERM]]88//89__m256 test_mm256_permute2f128_ps(__m256 a, __m256 b) {90 return _mm256_permute2f128_ps(a, b, 0x13);91}92 93// CHECK-LABEL: define dso_local <4 x i64> @test_mm256_permute2f128_si256(94// CHECK-SAME: <4 x i64> noundef [[A:%.*]], <4 x i64> noundef [[B:%.*]]) #[[ATTR0]] {95// CHECK-NEXT: [[ENTRY:.*:]]96// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>97// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32>98// CHECK-NEXT: [[VPERM:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[TMP1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>99// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[VPERM]] to <4 x i64>100// CHECK-NEXT: ret <4 x i64> [[TMP2]]101//102__m256i test_mm256_permute2f128_si256(__m256i a, __m256i b) {103 return _mm256_permute2f128_si256(a, b, 0x20);104}105 106// CHECK-LABEL: define dso_local <4 x float> @test_mm_broadcast_ss(107// CHECK-SAME: ptr noundef [[__A:%.*]]) #[[ATTR1]] {108// CHECK-NEXT: [[ENTRY:.*:]]109// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[__A]], align 1110// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x float> poison, float [[TMP0]], i32 0111// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <4 x float> [[VECINIT_I]], float [[TMP0]], i32 1112// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <4 x float> [[VECINIT2_I]], float [[TMP0]], i32 2113// CHECK-NEXT: [[VECINIT4_I:%.*]] = insertelement <4 x float> [[VECINIT3_I]], float [[TMP0]], i32 3114// CHECK-NEXT: ret <4 x float> [[VECINIT4_I]]115//116__m128 test_mm_broadcast_ss(float const *__a) {117 return _mm_broadcast_ss(__a);118}119 120// CHECK-LABEL: define dso_local <4 x double> @test_mm256_broadcast_sd(121// CHECK-SAME: ptr noundef [[__A:%.*]]) #[[ATTR0]] {122// CHECK-NEXT: [[ENTRY:.*:]]123// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[__A]], align 1124// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x double> poison, double [[TMP0]], i32 0125// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <4 x double> [[VECINIT_I]], double [[TMP0]], i32 1126// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <4 x double> [[VECINIT2_I]], double [[TMP0]], i32 2127// CHECK-NEXT: [[VECINIT4_I:%.*]] = insertelement <4 x double> [[VECINIT3_I]], double [[TMP0]], i32 3128// CHECK-NEXT: ret <4 x double> [[VECINIT4_I]]129//130__m256d test_mm256_broadcast_sd(double const *__a) {131 return _mm256_broadcast_sd(__a);132}133 134// CHECK-LABEL: define dso_local <8 x float> @test_mm256_broadcast_ss(135// CHECK-SAME: ptr noundef [[__A:%.*]]) #[[ATTR0]] {136// CHECK-NEXT: [[ENTRY:.*:]]137// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[__A]], align 1138// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <8 x float> poison, float [[TMP0]], i32 0139// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <8 x float> [[VECINIT_I]], float [[TMP0]], i32 1140// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <8 x float> [[VECINIT2_I]], float [[TMP0]], i32 2141// CHECK-NEXT: [[VECINIT4_I:%.*]] = insertelement <8 x float> [[VECINIT3_I]], float [[TMP0]], i32 3142// CHECK-NEXT: [[VECINIT5_I:%.*]] = insertelement <8 x float> [[VECINIT4_I]], float [[TMP0]], i32 4143// CHECK-NEXT: [[VECINIT6_I:%.*]] = insertelement <8 x float> [[VECINIT5_I]], float [[TMP0]], i32 5144// CHECK-NEXT: [[VECINIT7_I:%.*]] = insertelement <8 x float> [[VECINIT6_I]], float [[TMP0]], i32 6145// CHECK-NEXT: [[VECINIT8_I:%.*]] = insertelement <8 x float> [[VECINIT7_I]], float [[TMP0]], i32 7146// CHECK-NEXT: ret <8 x float> [[VECINIT8_I]]147//148__m256 test_mm256_broadcast_ss(float const *__a) {149 return _mm256_broadcast_ss(__a);150}151 152// Make sure we have the correct mask for each insertf128 case.153 154// CHECK-LABEL: define dso_local <8 x float> @test_mm256_insertf128_ps_0(155// CHECK-SAME: <8 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {156// CHECK-NEXT: [[ENTRY:.*:]]157// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <4 x float> [[B]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>158// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[WIDEN]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>159// CHECK-NEXT: ret <8 x float> [[INSERT]]160//161__m256 test_mm256_insertf128_ps_0(__m256 a, __m128 b) {162 return _mm256_insertf128_ps(a, b, 0);163}164 165// CHECK-LABEL: define dso_local <4 x double> @test_mm256_insertf128_pd_0(166// CHECK-SAME: <4 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {167// CHECK-NEXT: [[ENTRY:.*:]]168// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <2 x double> [[B]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>169// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[WIDEN]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>170// CHECK-NEXT: ret <4 x double> [[INSERT]]171//172__m256d test_mm256_insertf128_pd_0(__m256d a, __m128d b) {173 return _mm256_insertf128_pd(a, b, 0);174}175 176// CHECK-LABEL: define dso_local <4 x i64> @test_mm256_insertf128_si256_0(177// CHECK-SAME: <4 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {178// CHECK-NEXT: [[ENTRY:.*:]]179// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>180// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <4 x i32>181// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>182// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[WIDEN]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>183// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[INSERT]] to <4 x i64>184// CHECK-NEXT: ret <4 x i64> [[TMP2]]185//186__m256i test_mm256_insertf128_si256_0(__m256i a, __m128i b) {187 return _mm256_insertf128_si256(a, b, 0);188}189 190// CHECK-LABEL: define dso_local <8 x float> @test_mm256_insertf128_ps_1(191// CHECK-SAME: <8 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {192// CHECK-NEXT: [[ENTRY:.*:]]193// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <4 x float> [[B]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>194// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[WIDEN]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>195// CHECK-NEXT: ret <8 x float> [[INSERT]]196//197__m256 test_mm256_insertf128_ps_1(__m256 a, __m128 b) {198 return _mm256_insertf128_ps(a, b, 1);199}200 201// CHECK-LABEL: define dso_local <4 x double> @test_mm256_insertf128_pd_1(202// CHECK-SAME: <4 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {203// CHECK-NEXT: [[ENTRY:.*:]]204// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <2 x double> [[B]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>205// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[WIDEN]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>206// CHECK-NEXT: ret <4 x double> [[INSERT]]207//208__m256d test_mm256_insertf128_pd_1(__m256d a, __m128d b) {209 return _mm256_insertf128_pd(a, b, 1);210}211 212// CHECK-LABEL: define dso_local <4 x i64> @test_mm256_insertf128_si256_1(213// CHECK-SAME: <4 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {214// CHECK-NEXT: [[ENTRY:.*:]]215// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>216// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <4 x i32>217// CHECK-NEXT: [[WIDEN:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>218// CHECK-NEXT: [[INSERT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[WIDEN]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>219// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[INSERT]] to <4 x i64>220// CHECK-NEXT: ret <4 x i64> [[TMP2]]221//222__m256i test_mm256_insertf128_si256_1(__m256i a, __m128i b) {223 return _mm256_insertf128_si256(a, b, 1);224}225 226// Make sure we have the correct mask for each extractf128 case.227 228// CHECK-LABEL: define dso_local <4 x float> @test_mm256_extractf128_ps_0(229// CHECK-SAME: <8 x float> noundef [[A:%.*]]) #[[ATTR0]] {230// CHECK-NEXT: [[ENTRY:.*:]]231// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <8 x float> [[A]], <8 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>232// CHECK-NEXT: ret <4 x float> [[EXTRACT]]233//234__m128 test_mm256_extractf128_ps_0(__m256 a) {235 return _mm256_extractf128_ps(a, 0);236}237 238// CHECK-LABEL: define dso_local <2 x double> @test_mm256_extractf128_pd_0(239// CHECK-SAME: <4 x double> noundef [[A:%.*]]) #[[ATTR0]] {240// CHECK-NEXT: [[ENTRY:.*:]]241// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <2 x i32> <i32 0, i32 1>242// CHECK-NEXT: ret <2 x double> [[EXTRACT]]243//244__m128d test_mm256_extractf128_pd_0(__m256d a) {245 return _mm256_extractf128_pd(a, 0);246}247 248// CHECK-LABEL: define dso_local <2 x i64> @test_mm256_extractf128_si256_0(249// CHECK-SAME: <4 x i64> noundef [[A:%.*]]) #[[ATTR0]] {250// CHECK-NEXT: [[ENTRY:.*:]]251// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>252// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>253// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[EXTRACT]] to <2 x i64>254// CHECK-NEXT: ret <2 x i64> [[TMP1]]255//256__m128i test_mm256_extractf128_si256_0(__m256i a) {257 return _mm256_extractf128_si256(a, 0);258}259 260// CHECK-LABEL: define dso_local <4 x float> @test_mm256_extractf128_ps_1(261// CHECK-SAME: <8 x float> noundef [[A:%.*]]) #[[ATTR0]] {262// CHECK-NEXT: [[ENTRY:.*:]]263// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <8 x float> [[A]], <8 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>264// CHECK-NEXT: ret <4 x float> [[EXTRACT]]265//266__m128 test_mm256_extractf128_ps_1(__m256 a) {267 return _mm256_extractf128_ps(a, 1);268}269 270// CHECK-LABEL: define dso_local <2 x double> @test_mm256_extractf128_pd_1(271// CHECK-SAME: <4 x double> noundef [[A:%.*]]) #[[ATTR0]] {272// CHECK-NEXT: [[ENTRY:.*:]]273// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <2 x i32> <i32 2, i32 3>274// CHECK-NEXT: ret <2 x double> [[EXTRACT]]275//276__m128d test_mm256_extractf128_pd_1(__m256d a) {277 return _mm256_extractf128_pd(a, 1);278}279 280// CHECK-LABEL: define dso_local <2 x i64> @test_mm256_extractf128_si256_1(281// CHECK-SAME: <4 x i64> noundef [[A:%.*]]) #[[ATTR0]] {282// CHECK-NEXT: [[ENTRY:.*:]]283// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>284// CHECK-NEXT: [[EXTRACT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>285// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[EXTRACT]] to <2 x i64>286// CHECK-NEXT: ret <2 x i64> [[TMP1]]287//288__m128i test_mm256_extractf128_si256_1(__m256i a) {289 return _mm256_extractf128_si256(a, 1);290}291 292// CHECK-LABEL: define dso_local <8 x float> @test_mm256_set_m128(293// CHECK-SAME: <4 x float> noundef [[HI:%.*]], <4 x float> noundef [[LO:%.*]]) #[[ATTR0]] {294// CHECK-NEXT: [[ENTRY:.*:]]295// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <4 x float> [[LO]], <4 x float> [[HI]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>296// CHECK-NEXT: ret <8 x float> [[SHUFFLE_I]]297//298__m256 test_mm256_set_m128(__m128 hi, __m128 lo) {299 return _mm256_set_m128(hi, lo);300}301 302// CHECK-LABEL: define dso_local <4 x double> @test_mm256_set_m128d(303// CHECK-SAME: <2 x double> noundef [[HI:%.*]], <2 x double> noundef [[LO:%.*]]) #[[ATTR0]] {304// CHECK-NEXT: [[ENTRY:.*:]]305// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x double> [[LO]], <2 x double> [[HI]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>306// CHECK-NEXT: ret <4 x double> [[SHUFFLE_I]]307//308__m256d test_mm256_set_m128d(__m128d hi, __m128d lo) {309 return _mm256_set_m128d(hi, lo);310}311 312// CHECK-LABEL: define dso_local <4 x i64> @test_mm256_set_m128i(313// CHECK-SAME: <2 x i64> noundef [[HI:%.*]], <2 x i64> noundef [[LO:%.*]]) #[[ATTR0]] {314// CHECK-NEXT: [[ENTRY:.*:]]315// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[LO]], <2 x i64> [[HI]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>316// CHECK-NEXT: ret <4 x i64> [[SHUFFLE_I]]317//318__m256i test_mm256_set_m128i(__m128i hi, __m128i lo) {319 return _mm256_set_m128i(hi, lo);320}321 322// CHECK-LABEL: define dso_local <8 x float> @test_mm256_setr_m128(323// CHECK-SAME: <4 x float> noundef [[HI:%.*]], <4 x float> noundef [[LO:%.*]]) #[[ATTR0]] {324// CHECK-NEXT: [[ENTRY:.*:]]325// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x float> [[LO]], <4 x float> [[HI]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>326// CHECK-NEXT: ret <8 x float> [[SHUFFLE_I_I]]327//328__m256 test_mm256_setr_m128(__m128 hi, __m128 lo) {329 return _mm256_setr_m128(lo, hi);330}331 332// CHECK-LABEL: define dso_local <4 x double> @test_mm256_setr_m128d(333// CHECK-SAME: <2 x double> noundef [[HI:%.*]], <2 x double> noundef [[LO:%.*]]) #[[ATTR0]] {334// CHECK-NEXT: [[ENTRY:.*:]]335// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <2 x double> [[LO]], <2 x double> [[HI]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>336// CHECK-NEXT: ret <4 x double> [[SHUFFLE_I_I]]337//338__m256d test_mm256_setr_m128d(__m128d hi, __m128d lo) {339 return _mm256_setr_m128d(lo, hi);340}341 342// CHECK-LABEL: define dso_local <4 x i64> @test_mm256_setr_m128i(343// CHECK-SAME: <2 x i64> noundef [[HI:%.*]], <2 x i64> noundef [[LO:%.*]]) #[[ATTR0]] {344// CHECK-NEXT: [[ENTRY:.*:]]345// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <2 x i64> [[LO]], <2 x i64> [[HI]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>346// CHECK-NEXT: ret <4 x i64> [[SHUFFLE_I_I]]347//348__m256i test_mm256_setr_m128i(__m128i hi, __m128i lo) {349 return _mm256_setr_m128i(lo, hi);350}351