365 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes='mem2reg,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-LE3// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -DPOLYMORPHIC -emit-llvm -o - %s | opt -S -passes='mem2reg,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-LE4// RUN: %clang_cc1 -triple thumbebv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes='mem2reg,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-BE5// RUN: %clang_cc1 -triple thumbebv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -DPOLYMORPHIC -emit-llvm -o - %s | opt -S -passes='mem2reg,sroa,early-cse<>' | FileCheck %s --check-prefixes=CHECK,CHECK-BE6 7// REQUIRES: aarch64-registered-target || arm-registered-target8 9#include <arm_mve.h>10 11// CHECK-LE-LABEL: @test_vcreateq_f16(12// CHECK-LE-NEXT: entry:13// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 014// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 115// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x half>16// CHECK-LE-NEXT: ret <8 x half> [[TMP2]]17//18// CHECK-BE-LABEL: @test_vcreateq_f16(19// CHECK-BE-NEXT: entry:20// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 021// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 122// CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v2i64(<2 x i64> [[TMP1]])23// CHECK-BE-NEXT: ret <8 x half> [[TMP2]]24//25float16x8_t test_vcreateq_f16(uint64_t a, uint64_t b)26{27 return vcreateq_f16(a, b);28}29 30// CHECK-LE-LABEL: @test_vcreateq_f32(31// CHECK-LE-NEXT: entry:32// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 033// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 134// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x float>35// CHECK-LE-NEXT: ret <4 x float> [[TMP2]]36//37// CHECK-BE-LABEL: @test_vcreateq_f32(38// CHECK-BE-NEXT: entry:39// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 040// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 141// CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v2i64(<2 x i64> [[TMP1]])42// CHECK-BE-NEXT: ret <4 x float> [[TMP2]]43//44float32x4_t test_vcreateq_f32(uint64_t a, uint64_t b)45{46 return vcreateq_f32(a, b);47}48 49// CHECK-LE-LABEL: @test_vcreateq_s16(50// CHECK-LE-NEXT: entry:51// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 052// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 153// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x i16>54// CHECK-LE-NEXT: ret <8 x i16> [[TMP2]]55//56// CHECK-BE-LABEL: @test_vcreateq_s16(57// CHECK-BE-NEXT: entry:58// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 059// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 160// CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[TMP1]])61// CHECK-BE-NEXT: ret <8 x i16> [[TMP2]]62//63int16x8_t test_vcreateq_s16(uint64_t a, uint64_t b)64{65 return vcreateq_s16(a, b);66}67 68// CHECK-LE-LABEL: @test_vcreateq_s32(69// CHECK-LE-NEXT: entry:70// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 071// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 172// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x i32>73// CHECK-LE-NEXT: ret <4 x i32> [[TMP2]]74//75// CHECK-BE-LABEL: @test_vcreateq_s32(76// CHECK-BE-NEXT: entry:77// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 078// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 179// CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[TMP1]])80// CHECK-BE-NEXT: ret <4 x i32> [[TMP2]]81//82int32x4_t test_vcreateq_s32(uint64_t a, uint64_t b)83{84 return vcreateq_s32(a, b);85}86 87// CHECK-LABEL: @test_vcreateq_s64(88// CHECK-NEXT: entry:89// CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 090// CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 191// CHECK-NEXT: ret <2 x i64> [[TMP1]]92//93int64x2_t test_vcreateq_s64(uint64_t a, uint64_t b)94{95 return vcreateq_s64(a, b);96}97 98// CHECK-LE-LABEL: @test_vcreateq_s8(99// CHECK-LE-NEXT: entry:100// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0101// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1102// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <16 x i8>103// CHECK-LE-NEXT: ret <16 x i8> [[TMP2]]104//105// CHECK-BE-LABEL: @test_vcreateq_s8(106// CHECK-BE-NEXT: entry:107// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0108// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1109// CHECK-BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[TMP1]])110// CHECK-BE-NEXT: ret <16 x i8> [[TMP2]]111//112int8x16_t test_vcreateq_s8(uint64_t a, uint64_t b)113{114 return vcreateq_s8(a, b);115}116 117// CHECK-LE-LABEL: @test_vcreateq_u16(118// CHECK-LE-NEXT: entry:119// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0120// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1121// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <8 x i16>122// CHECK-LE-NEXT: ret <8 x i16> [[TMP2]]123//124// CHECK-BE-LABEL: @test_vcreateq_u16(125// CHECK-BE-NEXT: entry:126// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0127// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1128// CHECK-BE-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[TMP1]])129// CHECK-BE-NEXT: ret <8 x i16> [[TMP2]]130//131uint16x8_t test_vcreateq_u16(uint64_t a, uint64_t b)132{133 return vcreateq_u16(a, b);134}135 136// CHECK-LE-LABEL: @test_vcreateq_u32(137// CHECK-LE-NEXT: entry:138// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0139// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1140// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <4 x i32>141// CHECK-LE-NEXT: ret <4 x i32> [[TMP2]]142//143// CHECK-BE-LABEL: @test_vcreateq_u32(144// CHECK-BE-NEXT: entry:145// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0146// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1147// CHECK-BE-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[TMP1]])148// CHECK-BE-NEXT: ret <4 x i32> [[TMP2]]149//150uint32x4_t test_vcreateq_u32(uint64_t a, uint64_t b)151{152 return vcreateq_u32(a, b);153}154 155// CHECK-LABEL: @test_vcreateq_u64(156// CHECK-NEXT: entry:157// CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0158// CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1159// CHECK-NEXT: ret <2 x i64> [[TMP1]]160//161uint64x2_t test_vcreateq_u64(uint64_t a, uint64_t b)162{163 return vcreateq_u64(a, b);164}165 166// CHECK-LE-LABEL: @test_vcreateq_u8(167// CHECK-LE-NEXT: entry:168// CHECK-LE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0169// CHECK-LE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1170// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to <16 x i8>171// CHECK-LE-NEXT: ret <16 x i8> [[TMP2]]172//173// CHECK-BE-LABEL: @test_vcreateq_u8(174// CHECK-BE-NEXT: entry:175// CHECK-BE-NEXT: [[TMP0:%.*]] = insertelement <2 x i64> poison, i64 [[A:%.*]], i64 0176// CHECK-BE-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i64 1177// CHECK-BE-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[TMP1]])178// CHECK-BE-NEXT: ret <16 x i8> [[TMP2]]179//180uint8x16_t test_vcreateq_u8(uint64_t a, uint64_t b)181{182 return vcreateq_u8(a, b);183}184 185// CHECK-LABEL: @test_vuninitializedq_polymorphic_f16(186// CHECK-NEXT: entry:187// CHECK-NEXT: ret <8 x half> undef188//189float16x8_t test_vuninitializedq_polymorphic_f16(float16x8_t (*funcptr)(void))190{191 return vuninitializedq(funcptr());192}193 194// CHECK-LABEL: @test_vuninitializedq_polymorphic_f32(195// CHECK-NEXT: entry:196// CHECK-NEXT: ret <4 x float> undef197//198float32x4_t test_vuninitializedq_polymorphic_f32(float32x4_t (*funcptr)(void))199{200 return vuninitializedq(funcptr());201}202 203// CHECK-LABEL: @test_vuninitializedq_polymorphic_s8(204// CHECK-NEXT: entry:205// CHECK-NEXT: ret <16 x i8> undef206//207int8x16_t test_vuninitializedq_polymorphic_s8(int8x16_t (*funcptr)(void))208{209 return vuninitializedq(funcptr());210}211 212// CHECK-LABEL: @test_vuninitializedq_polymorphic_s16(213// CHECK-NEXT: entry:214// CHECK-NEXT: ret <8 x i16> undef215//216int16x8_t test_vuninitializedq_polymorphic_s16(int16x8_t (*funcptr)(void))217{218 return vuninitializedq(funcptr());219}220 221// CHECK-LABEL: @test_vuninitializedq_polymorphic_s32(222// CHECK-NEXT: entry:223// CHECK-NEXT: ret <4 x i32> undef224//225int32x4_t test_vuninitializedq_polymorphic_s32(int32x4_t (*funcptr)(void))226{227 return vuninitializedq(funcptr());228}229 230// CHECK-LABEL: @test_vuninitializedq_polymorphic_s64(231// CHECK-NEXT: entry:232// CHECK-NEXT: ret <2 x i64> undef233//234int64x2_t test_vuninitializedq_polymorphic_s64(int64x2_t (*funcptr)(void))235{236 return vuninitializedq(funcptr());237}238 239// CHECK-LABEL: @test_vuninitializedq_polymorphic_u8(240// CHECK-NEXT: entry:241// CHECK-NEXT: ret <16 x i8> undef242//243uint8x16_t test_vuninitializedq_polymorphic_u8(uint8x16_t (*funcptr)(void))244{245 return vuninitializedq(funcptr());246}247 248// CHECK-LABEL: @test_vuninitializedq_polymorphic_u16(249// CHECK-NEXT: entry:250// CHECK-NEXT: ret <8 x i16> undef251//252uint16x8_t test_vuninitializedq_polymorphic_u16(uint16x8_t (*funcptr)(void))253{254 return vuninitializedq(funcptr());255}256 257// CHECK-LABEL: @test_vuninitializedq_polymorphic_u32(258// CHECK-NEXT: entry:259// CHECK-NEXT: ret <4 x i32> undef260//261uint32x4_t test_vuninitializedq_polymorphic_u32(uint32x4_t (*funcptr)(void))262{263 return vuninitializedq(funcptr());264}265 266// CHECK-LABEL: @test_vuninitializedq_polymorphic_u64(267// CHECK-NEXT: entry:268// CHECK-NEXT: ret <2 x i64> undef269//270uint64x2_t test_vuninitializedq_polymorphic_u64(uint64x2_t (*funcptr)(void))271{272 return vuninitializedq(funcptr());273}274 275// CHECK-LABEL: @test_vuninitializedq_f16(276// CHECK-NEXT: entry:277// CHECK-NEXT: ret <8 x half> undef278//279float16x8_t test_vuninitializedq_f16(void)280{281 return vuninitializedq_f16();282}283 284// CHECK-LABEL: @test_vuninitializedq_f32(285// CHECK-NEXT: entry:286// CHECK-NEXT: ret <4 x float> undef287//288float32x4_t test_vuninitializedq_f32(void)289{290 return vuninitializedq_f32();291}292 293// CHECK-LABEL: @test_vuninitializedq_s16(294// CHECK-NEXT: entry:295// CHECK-NEXT: ret <8 x i16> undef296//297int16x8_t test_vuninitializedq_s16(void)298{299 return vuninitializedq_s16();300}301 302// CHECK-LABEL: @test_vuninitializedq_s32(303// CHECK-NEXT: entry:304// CHECK-NEXT: ret <4 x i32> undef305//306int32x4_t test_vuninitializedq_s32(void)307{308 return vuninitializedq_s32();309}310 311// CHECK-LABEL: @test_vuninitializedq_s64(312// CHECK-NEXT: entry:313// CHECK-NEXT: ret <2 x i64> undef314//315int64x2_t test_vuninitializedq_s64(void)316{317 return vuninitializedq_s64();318}319 320// CHECK-LABEL: @test_vuninitializedq_s8(321// CHECK-NEXT: entry:322// CHECK-NEXT: ret <16 x i8> undef323//324int8x16_t test_vuninitializedq_s8(void)325{326 return vuninitializedq_s8();327}328 329// CHECK-LABEL: @test_vuninitializedq_u16(330// CHECK-NEXT: entry:331// CHECK-NEXT: ret <8 x i16> undef332//333uint16x8_t test_vuninitializedq_u16(void)334{335 return vuninitializedq_u16();336}337 338// CHECK-LABEL: @test_vuninitializedq_u32(339// CHECK-NEXT: entry:340// CHECK-NEXT: ret <4 x i32> undef341//342uint32x4_t test_vuninitializedq_u32(void)343{344 return vuninitializedq_u32();345}346 347// CHECK-LABEL: @test_vuninitializedq_u64(348// CHECK-NEXT: entry:349// CHECK-NEXT: ret <2 x i64> undef350//351uint64x2_t test_vuninitializedq_u64(void)352{353 return vuninitializedq_u64();354}355 356// CHECK-LABEL: @test_vuninitializedq_u8(357// CHECK-NEXT: entry:358// CHECK-NEXT: ret <16 x i8> undef359//360uint8x16_t test_vuninitializedq_u8(void)361{362 return vuninitializedq_u8();363}364 365