698 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 | FileCheck %s3// 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 %s4 5// REQUIRES: aarch64-registered-target || arm-registered-target6 7#include <arm_mve.h>8 9// CHECK-LABEL: @test_vrev16q_s8(10// CHECK-NEXT: entry:11// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>12// CHECK-NEXT: ret <16 x i8> [[TMP0]]13//14int8x16_t test_vrev16q_s8(int8x16_t a)15{16#ifdef POLYMORPHIC17 return vrev16q(a);18#else /* POLYMORPHIC */19 return vrev16q_s8(a);20#endif /* POLYMORPHIC */21}22 23// CHECK-LABEL: @test_vrev16q_u8(24// CHECK-NEXT: entry:25// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>26// CHECK-NEXT: ret <16 x i8> [[TMP0]]27//28uint8x16_t test_vrev16q_u8(uint8x16_t a)29{30#ifdef POLYMORPHIC31 return vrev16q(a);32#else /* POLYMORPHIC */33 return vrev16q_u8(a);34#endif /* POLYMORPHIC */35}36 37// CHECK-LABEL: @test_vrev32q_s8(38// CHECK-NEXT: entry:39// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>40// CHECK-NEXT: ret <16 x i8> [[TMP0]]41//42int8x16_t test_vrev32q_s8(int8x16_t a)43{44#ifdef POLYMORPHIC45 return vrev32q(a);46#else /* POLYMORPHIC */47 return vrev32q_s8(a);48#endif /* POLYMORPHIC */49}50 51// CHECK-LABEL: @test_vrev32q_u8(52// CHECK-NEXT: entry:53// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>54// CHECK-NEXT: ret <16 x i8> [[TMP0]]55//56uint8x16_t test_vrev32q_u8(uint8x16_t a)57{58#ifdef POLYMORPHIC59 return vrev32q(a);60#else /* POLYMORPHIC */61 return vrev32q_u8(a);62#endif /* POLYMORPHIC */63}64 65// CHECK-LABEL: @test_vrev32q_s16(66// CHECK-NEXT: entry:67// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>68// CHECK-NEXT: ret <8 x i16> [[TMP0]]69//70int16x8_t test_vrev32q_s16(int16x8_t a)71{72#ifdef POLYMORPHIC73 return vrev32q(a);74#else /* POLYMORPHIC */75 return vrev32q_s16(a);76#endif /* POLYMORPHIC */77}78 79// CHECK-LABEL: @test_vrev32q_u16(80// CHECK-NEXT: entry:81// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>82// CHECK-NEXT: ret <8 x i16> [[TMP0]]83//84uint16x8_t test_vrev32q_u16(uint16x8_t a)85{86#ifdef POLYMORPHIC87 return vrev32q(a);88#else /* POLYMORPHIC */89 return vrev32q_u16(a);90#endif /* POLYMORPHIC */91}92 93// CHECK-LABEL: @test_vrev32q_f16(94// CHECK-NEXT: entry:95// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>96// CHECK-NEXT: ret <8 x half> [[TMP0]]97//98float16x8_t test_vrev32q_f16(float16x8_t a)99{100#ifdef POLYMORPHIC101 return vrev32q(a);102#else /* POLYMORPHIC */103 return vrev32q_f16(a);104#endif /* POLYMORPHIC */105}106 107// CHECK-LABEL: @test_vrev64q_s8(108// CHECK-NEXT: entry:109// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>110// CHECK-NEXT: ret <16 x i8> [[TMP0]]111//112int8x16_t test_vrev64q_s8(int8x16_t a)113{114#ifdef POLYMORPHIC115 return vrev64q(a);116#else /* POLYMORPHIC */117 return vrev64q_s8(a);118#endif /* POLYMORPHIC */119}120 121// CHECK-LABEL: @test_vrev64q_u8(122// CHECK-NEXT: entry:123// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x i8> [[A:%.*]], <16 x i8> poison, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>124// CHECK-NEXT: ret <16 x i8> [[TMP0]]125//126uint8x16_t test_vrev64q_u8(uint8x16_t a)127{128#ifdef POLYMORPHIC129 return vrev64q(a);130#else /* POLYMORPHIC */131 return vrev64q_u8(a);132#endif /* POLYMORPHIC */133}134 135// CHECK-LABEL: @test_vrev64q_s16(136// CHECK-NEXT: entry:137// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>138// CHECK-NEXT: ret <8 x i16> [[TMP0]]139//140int16x8_t test_vrev64q_s16(int16x8_t a)141{142#ifdef POLYMORPHIC143 return vrev64q(a);144#else /* POLYMORPHIC */145 return vrev64q_s16(a);146#endif /* POLYMORPHIC */147}148 149// CHECK-LABEL: @test_vrev64q_u16(150// CHECK-NEXT: entry:151// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>152// CHECK-NEXT: ret <8 x i16> [[TMP0]]153//154uint16x8_t test_vrev64q_u16(uint16x8_t a)155{156#ifdef POLYMORPHIC157 return vrev64q(a);158#else /* POLYMORPHIC */159 return vrev64q_u16(a);160#endif /* POLYMORPHIC */161}162 163// CHECK-LABEL: @test_vrev64q_f16(164// CHECK-NEXT: entry:165// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>166// CHECK-NEXT: ret <8 x half> [[TMP0]]167//168float16x8_t test_vrev64q_f16(float16x8_t a)169{170#ifdef POLYMORPHIC171 return vrev64q(a);172#else /* POLYMORPHIC */173 return vrev64q_f16(a);174#endif /* POLYMORPHIC */175}176 177// CHECK-LABEL: @test_vrev64q_f32(178// CHECK-NEXT: entry:179// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>180// CHECK-NEXT: ret <4 x float> [[TMP0]]181//182float32x4_t test_vrev64q_f32(float32x4_t a)183{184#ifdef POLYMORPHIC185 return vrev64q(a);186#else /* POLYMORPHIC */187 return vrev64q_f32(a);188#endif /* POLYMORPHIC */189}190 191// CHECK-LABEL: @test_vrev64q_s32(192// CHECK-NEXT: entry:193// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>194// CHECK-NEXT: ret <4 x i32> [[TMP0]]195//196int32x4_t test_vrev64q_s32(int32x4_t a)197{198#ifdef POLYMORPHIC199 return vrev64q(a);200#else /* POLYMORPHIC */201 return vrev64q_s32(a);202#endif /* POLYMORPHIC */203}204 205// CHECK-LABEL: @test_vrev64q_u32(206// CHECK-NEXT: entry:207// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>208// CHECK-NEXT: ret <4 x i32> [[TMP0]]209//210uint32x4_t test_vrev64q_u32(uint32x4_t a)211{212#ifdef POLYMORPHIC213 return vrev64q(a);214#else /* POLYMORPHIC */215 return vrev64q_u32(a);216#endif /* POLYMORPHIC */217}218 219// CHECK-LABEL: @test_vrev16q_m_s8(220// CHECK-NEXT: entry:221// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32222// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])223// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 16, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])224// CHECK-NEXT: ret <16 x i8> [[TMP2]]225//226int8x16_t test_vrev16q_m_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)227{228#ifdef POLYMORPHIC229 return vrev16q_m(inactive, a, p);230#else /* POLYMORPHIC */231 return vrev16q_m_s8(inactive, a, p);232#endif /* POLYMORPHIC */233}234 235// CHECK-LABEL: @test_vrev16q_m_u8(236// CHECK-NEXT: entry:237// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32238// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])239// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 16, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])240// CHECK-NEXT: ret <16 x i8> [[TMP2]]241//242uint8x16_t test_vrev16q_m_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)243{244#ifdef POLYMORPHIC245 return vrev16q_m(inactive, a, p);246#else /* POLYMORPHIC */247 return vrev16q_m_u8(inactive, a, p);248#endif /* POLYMORPHIC */249}250 251// CHECK-LABEL: @test_vrev32q_m_f16(252// CHECK-NEXT: entry:253// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32254// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])255// CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vrev.predicated.v8f16.v8i1(<8 x half> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x half> [[INACTIVE:%.*]])256// CHECK-NEXT: ret <8 x half> [[TMP2]]257//258float16x8_t test_vrev32q_m_f16(float16x8_t inactive, float16x8_t a, mve_pred16_t p)259{260#ifdef POLYMORPHIC261 return vrev32q_m(inactive, a, p);262#else /* POLYMORPHIC */263 return vrev32q_m_f16(inactive, a, p);264#endif /* POLYMORPHIC */265}266 267// CHECK-LABEL: @test_vrev32q_m_s8(268// CHECK-NEXT: entry:269// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32270// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])271// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 32, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])272// CHECK-NEXT: ret <16 x i8> [[TMP2]]273//274int8x16_t test_vrev32q_m_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)275{276#ifdef POLYMORPHIC277 return vrev32q_m(inactive, a, p);278#else /* POLYMORPHIC */279 return vrev32q_m_s8(inactive, a, p);280#endif /* POLYMORPHIC */281}282 283// CHECK-LABEL: @test_vrev32q_m_s16(284// CHECK-NEXT: entry:285// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32286// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])287// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])288// CHECK-NEXT: ret <8 x i16> [[TMP2]]289//290int16x8_t test_vrev32q_m_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)291{292#ifdef POLYMORPHIC293 return vrev32q_m(inactive, a, p);294#else /* POLYMORPHIC */295 return vrev32q_m_s16(inactive, a, p);296#endif /* POLYMORPHIC */297}298 299// CHECK-LABEL: @test_vrev32q_m_u8(300// CHECK-NEXT: entry:301// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32302// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])303// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 32, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])304// CHECK-NEXT: ret <16 x i8> [[TMP2]]305//306uint8x16_t test_vrev32q_m_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)307{308#ifdef POLYMORPHIC309 return vrev32q_m(inactive, a, p);310#else /* POLYMORPHIC */311 return vrev32q_m_u8(inactive, a, p);312#endif /* POLYMORPHIC */313}314 315// CHECK-LABEL: @test_vrev32q_m_u16(316// CHECK-NEXT: entry:317// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32318// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])319// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])320// CHECK-NEXT: ret <8 x i16> [[TMP2]]321//322uint16x8_t test_vrev32q_m_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)323{324#ifdef POLYMORPHIC325 return vrev32q_m(inactive, a, p);326#else /* POLYMORPHIC */327 return vrev32q_m_u16(inactive, a, p);328#endif /* POLYMORPHIC */329}330 331// CHECK-LABEL: @test_vrev64q_m_f16(332// CHECK-NEXT: entry:333// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32334// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])335// CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vrev.predicated.v8f16.v8i1(<8 x half> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x half> [[INACTIVE:%.*]])336// CHECK-NEXT: ret <8 x half> [[TMP2]]337//338float16x8_t test_vrev64q_m_f16(float16x8_t inactive, float16x8_t a, mve_pred16_t p)339{340#ifdef POLYMORPHIC341 return vrev64q_m(inactive, a, p);342#else /* POLYMORPHIC */343 return vrev64q_m_f16(inactive, a, p);344#endif /* POLYMORPHIC */345}346 347// CHECK-LABEL: @test_vrev64q_m_f32(348// CHECK-NEXT: entry:349// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32350// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])351// CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.vrev.predicated.v4f32.v4i1(<4 x float> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x float> [[INACTIVE:%.*]])352// CHECK-NEXT: ret <4 x float> [[TMP2]]353//354float32x4_t test_vrev64q_m_f32(float32x4_t inactive, float32x4_t a, mve_pred16_t p)355{356#ifdef POLYMORPHIC357 return vrev64q_m(inactive, a, p);358#else /* POLYMORPHIC */359 return vrev64q_m_f32(inactive, a, p);360#endif /* POLYMORPHIC */361}362 363// CHECK-LABEL: @test_vrev64q_m_s8(364// CHECK-NEXT: entry:365// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32366// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])367// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 64, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])368// CHECK-NEXT: ret <16 x i8> [[TMP2]]369//370int8x16_t test_vrev64q_m_s8(int8x16_t inactive, int8x16_t a, mve_pred16_t p)371{372#ifdef POLYMORPHIC373 return vrev64q_m(inactive, a, p);374#else /* POLYMORPHIC */375 return vrev64q_m_s8(inactive, a, p);376#endif /* POLYMORPHIC */377}378 379// CHECK-LABEL: @test_vrev64q_m_s16(380// CHECK-NEXT: entry:381// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32382// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])383// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])384// CHECK-NEXT: ret <8 x i16> [[TMP2]]385//386int16x8_t test_vrev64q_m_s16(int16x8_t inactive, int16x8_t a, mve_pred16_t p)387{388#ifdef POLYMORPHIC389 return vrev64q_m(inactive, a, p);390#else /* POLYMORPHIC */391 return vrev64q_m_s16(inactive, a, p);392#endif /* POLYMORPHIC */393}394 395// CHECK-LABEL: @test_vrev64q_m_s32(396// CHECK-NEXT: entry:397// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32398// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])399// CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrev.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])400// CHECK-NEXT: ret <4 x i32> [[TMP2]]401//402int32x4_t test_vrev64q_m_s32(int32x4_t inactive, int32x4_t a, mve_pred16_t p)403{404#ifdef POLYMORPHIC405 return vrev64q_m(inactive, a, p);406#else /* POLYMORPHIC */407 return vrev64q_m_s32(inactive, a, p);408#endif /* POLYMORPHIC */409}410 411// CHECK-LABEL: @test_vrev64q_m_u8(412// CHECK-NEXT: entry:413// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32414// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])415// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 64, <16 x i1> [[TMP1]], <16 x i8> [[INACTIVE:%.*]])416// CHECK-NEXT: ret <16 x i8> [[TMP2]]417//418uint8x16_t test_vrev64q_m_u8(uint8x16_t inactive, uint8x16_t a, mve_pred16_t p)419{420#ifdef POLYMORPHIC421 return vrev64q_m(inactive, a, p);422#else /* POLYMORPHIC */423 return vrev64q_m_u8(inactive, a, p);424#endif /* POLYMORPHIC */425}426 427// CHECK-LABEL: @test_vrev64q_m_u16(428// CHECK-NEXT: entry:429// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32430// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])431// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x i16> [[INACTIVE:%.*]])432// CHECK-NEXT: ret <8 x i16> [[TMP2]]433//434uint16x8_t test_vrev64q_m_u16(uint16x8_t inactive, uint16x8_t a, mve_pred16_t p)435{436#ifdef POLYMORPHIC437 return vrev64q_m(inactive, a, p);438#else /* POLYMORPHIC */439 return vrev64q_m_u16(inactive, a, p);440#endif /* POLYMORPHIC */441}442 443// CHECK-LABEL: @test_vrev64q_m_u32(444// CHECK-NEXT: entry:445// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32446// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])447// CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrev.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x i32> [[INACTIVE:%.*]])448// CHECK-NEXT: ret <4 x i32> [[TMP2]]449//450uint32x4_t test_vrev64q_m_u32(uint32x4_t inactive, uint32x4_t a, mve_pred16_t p)451{452#ifdef POLYMORPHIC453 return vrev64q_m(inactive, a, p);454#else /* POLYMORPHIC */455 return vrev64q_m_u32(inactive, a, p);456#endif /* POLYMORPHIC */457}458 459// CHECK-LABEL: @test_vrev16q_x_s8(460// CHECK-NEXT: entry:461// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32462// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])463// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 16, <16 x i1> [[TMP1]], <16 x i8> undef)464// CHECK-NEXT: ret <16 x i8> [[TMP2]]465//466int8x16_t test_vrev16q_x_s8(int8x16_t a, mve_pred16_t p)467{468#ifdef POLYMORPHIC469 return vrev16q_x(a, p);470#else /* POLYMORPHIC */471 return vrev16q_x_s8(a, p);472#endif /* POLYMORPHIC */473}474 475// CHECK-LABEL: @test_vrev16q_x_u8(476// CHECK-NEXT: entry:477// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32478// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])479// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 16, <16 x i1> [[TMP1]], <16 x i8> undef)480// CHECK-NEXT: ret <16 x i8> [[TMP2]]481//482uint8x16_t test_vrev16q_x_u8(uint8x16_t a, mve_pred16_t p)483{484#ifdef POLYMORPHIC485 return vrev16q_x(a, p);486#else /* POLYMORPHIC */487 return vrev16q_x_u8(a, p);488#endif /* POLYMORPHIC */489}490 491// CHECK-LABEL: @test_vrev32q_x_f16(492// CHECK-NEXT: entry:493// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32494// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])495// CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vrev.predicated.v8f16.v8i1(<8 x half> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x half> undef)496// CHECK-NEXT: ret <8 x half> [[TMP2]]497//498float16x8_t test_vrev32q_x_f16(float16x8_t a, mve_pred16_t p)499{500#ifdef POLYMORPHIC501 return vrev32q_x(a, p);502#else /* POLYMORPHIC */503 return vrev32q_x_f16(a, p);504#endif /* POLYMORPHIC */505}506 507// CHECK-LABEL: @test_vrev32q_x_s8(508// CHECK-NEXT: entry:509// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32510// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])511// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 32, <16 x i1> [[TMP1]], <16 x i8> undef)512// CHECK-NEXT: ret <16 x i8> [[TMP2]]513//514int8x16_t test_vrev32q_x_s8(int8x16_t a, mve_pred16_t p)515{516#ifdef POLYMORPHIC517 return vrev32q_x(a, p);518#else /* POLYMORPHIC */519 return vrev32q_x_s8(a, p);520#endif /* POLYMORPHIC */521}522 523// CHECK-LABEL: @test_vrev32q_x_s16(524// CHECK-NEXT: entry:525// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32526// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])527// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x i16> undef)528// CHECK-NEXT: ret <8 x i16> [[TMP2]]529//530int16x8_t test_vrev32q_x_s16(int16x8_t a, mve_pred16_t p)531{532#ifdef POLYMORPHIC533 return vrev32q_x(a, p);534#else /* POLYMORPHIC */535 return vrev32q_x_s16(a, p);536#endif /* POLYMORPHIC */537}538 539// CHECK-LABEL: @test_vrev32q_x_u8(540// CHECK-NEXT: entry:541// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32542// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])543// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 32, <16 x i1> [[TMP1]], <16 x i8> undef)544// CHECK-NEXT: ret <16 x i8> [[TMP2]]545//546uint8x16_t test_vrev32q_x_u8(uint8x16_t a, mve_pred16_t p)547{548#ifdef POLYMORPHIC549 return vrev32q_x(a, p);550#else /* POLYMORPHIC */551 return vrev32q_x_u8(a, p);552#endif /* POLYMORPHIC */553}554 555// CHECK-LABEL: @test_vrev32q_x_u16(556// CHECK-NEXT: entry:557// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32558// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])559// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 32, <8 x i1> [[TMP1]], <8 x i16> undef)560// CHECK-NEXT: ret <8 x i16> [[TMP2]]561//562uint16x8_t test_vrev32q_x_u16(uint16x8_t a, mve_pred16_t p)563{564#ifdef POLYMORPHIC565 return vrev32q_x(a, p);566#else /* POLYMORPHIC */567 return vrev32q_x_u16(a, p);568#endif /* POLYMORPHIC */569}570 571// CHECK-LABEL: @test_vrev64q_x_f16(572// CHECK-NEXT: entry:573// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32574// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])575// CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.vrev.predicated.v8f16.v8i1(<8 x half> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x half> undef)576// CHECK-NEXT: ret <8 x half> [[TMP2]]577//578float16x8_t test_vrev64q_x_f16(float16x8_t a, mve_pred16_t p)579{580#ifdef POLYMORPHIC581 return vrev64q_x(a, p);582#else /* POLYMORPHIC */583 return vrev64q_x_f16(a, p);584#endif /* POLYMORPHIC */585}586 587// CHECK-LABEL: @test_vrev64q_x_f32(588// CHECK-NEXT: entry:589// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32590// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])591// CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.vrev.predicated.v4f32.v4i1(<4 x float> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x float> undef)592// CHECK-NEXT: ret <4 x float> [[TMP2]]593//594float32x4_t test_vrev64q_x_f32(float32x4_t a, mve_pred16_t p)595{596#ifdef POLYMORPHIC597 return vrev64q_x(a, p);598#else /* POLYMORPHIC */599 return vrev64q_x_f32(a, p);600#endif /* POLYMORPHIC */601}602 603// CHECK-LABEL: @test_vrev64q_x_s8(604// CHECK-NEXT: entry:605// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32606// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])607// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 64, <16 x i1> [[TMP1]], <16 x i8> undef)608// CHECK-NEXT: ret <16 x i8> [[TMP2]]609//610int8x16_t test_vrev64q_x_s8(int8x16_t a, mve_pred16_t p)611{612#ifdef POLYMORPHIC613 return vrev64q_x(a, p);614#else /* POLYMORPHIC */615 return vrev64q_x_s8(a, p);616#endif /* POLYMORPHIC */617}618 619// CHECK-LABEL: @test_vrev64q_x_s16(620// CHECK-NEXT: entry:621// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32622// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])623// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x i16> undef)624// CHECK-NEXT: ret <8 x i16> [[TMP2]]625//626int16x8_t test_vrev64q_x_s16(int16x8_t a, mve_pred16_t p)627{628#ifdef POLYMORPHIC629 return vrev64q_x(a, p);630#else /* POLYMORPHIC */631 return vrev64q_x_s16(a, p);632#endif /* POLYMORPHIC */633}634 635// CHECK-LABEL: @test_vrev64q_x_s32(636// CHECK-NEXT: entry:637// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32638// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])639// CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrev.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x i32> undef)640// CHECK-NEXT: ret <4 x i32> [[TMP2]]641//642int32x4_t test_vrev64q_x_s32(int32x4_t a, mve_pred16_t p)643{644#ifdef POLYMORPHIC645 return vrev64q_x(a, p);646#else /* POLYMORPHIC */647 return vrev64q_x_s32(a, p);648#endif /* POLYMORPHIC */649}650 651// CHECK-LABEL: @test_vrev64q_x_u8(652// CHECK-NEXT: entry:653// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32654// CHECK-NEXT: [[TMP1:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP0]])655// CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.arm.mve.vrev.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], i32 64, <16 x i1> [[TMP1]], <16 x i8> undef)656// CHECK-NEXT: ret <16 x i8> [[TMP2]]657//658uint8x16_t test_vrev64q_x_u8(uint8x16_t a, mve_pred16_t p)659{660#ifdef POLYMORPHIC661 return vrev64q_x(a, p);662#else /* POLYMORPHIC */663 return vrev64q_x_u8(a, p);664#endif /* POLYMORPHIC */665}666 667// CHECK-LABEL: @test_vrev64q_x_u16(668// CHECK-NEXT: entry:669// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32670// CHECK-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])671// CHECK-NEXT: [[TMP2:%.*]] = call <8 x i16> @llvm.arm.mve.vrev.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], i32 64, <8 x i1> [[TMP1]], <8 x i16> undef)672// CHECK-NEXT: ret <8 x i16> [[TMP2]]673//674uint16x8_t test_vrev64q_x_u16(uint16x8_t a, mve_pred16_t p)675{676#ifdef POLYMORPHIC677 return vrev64q_x(a, p);678#else /* POLYMORPHIC */679 return vrev64q_x_u16(a, p);680#endif /* POLYMORPHIC */681}682 683// CHECK-LABEL: @test_vrev64q_x_u32(684// CHECK-NEXT: entry:685// CHECK-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32686// CHECK-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])687// CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vrev.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], i32 64, <4 x i1> [[TMP1]], <4 x i32> undef)688// CHECK-NEXT: ret <4 x i32> [[TMP2]]689//690uint32x4_t test_vrev64q_x_u32(uint32x4_t a, mve_pred16_t p)691{692#ifdef POLYMORPHIC693 return vrev64q_x(a, p);694#else /* POLYMORPHIC */695 return vrev64q_x_u32(a, p);696#endif /* POLYMORPHIC */697}698