1358 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=sroa | FileCheck %s --check-prefixes=CHECK,CHECK-NOSTRICT3// 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=sroa | FileCheck %s --check-prefixes=CHECK,CHECK-NOSTRICT4// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -frounding-math -fexperimental-strict-floating-point -emit-llvm -o - %s | opt -S -passes=sroa | FileCheck %s --check-prefixes=CHECK,CHECK-STRICT5// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -mfloat-abi hard -O0 -disable-O0-optnone -frounding-math -fexperimental-strict-floating-point -DPOLYMORPHIC -emit-llvm -o - %s | opt -S -passes=sroa | FileCheck %s --check-prefixes=CHECK,CHECK-STRICT6 7// REQUIRES: aarch64-registered-target || arm-registered-target8 9#include <arm_mve.h>10 11// CHECK-NOSTRICT-LABEL: @test_vfmaq_f16(12// CHECK-NOSTRICT-NEXT: entry:13// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[C:%.*]], <8 x half> [[A:%.*]])14// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP0]]15//16// CHECK-STRICT-LABEL: @test_vfmaq_f16(17// CHECK-STRICT-NEXT: entry:18// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[C:%.*]], <8 x half> [[A:%.*]]) #[[ATTR2:[0-9]+]]19// CHECK-STRICT-NEXT: ret <8 x half> [[TMP0]]20//21float16x8_t test_vfmaq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {22#ifdef POLYMORPHIC23 return vfmaq(a, b, c);24#else /* POLYMORPHIC */25 return vfmaq_f16(a, b, c);26#endif /* POLYMORPHIC */27}28 29// CHECK-NOSTRICT-LABEL: @test_vfmaq_f32(30// CHECK-NOSTRICT-NEXT: entry:31// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[C:%.*]], <4 x float> [[A:%.*]])32// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP0]]33//34// CHECK-STRICT-LABEL: @test_vfmaq_f32(35// CHECK-STRICT-NEXT: entry:36// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[C:%.*]], <4 x float> [[A:%.*]]) #[[ATTR2]]37// CHECK-STRICT-NEXT: ret <4 x float> [[TMP0]]38//39float32x4_t test_vfmaq_f32(float32x4_t a, float32x4_t b, float32x4_t c) {40#ifdef POLYMORPHIC41 return vfmaq(a, b, c);42#else /* POLYMORPHIC */43 return vfmaq_f32(a, b, c);44#endif /* POLYMORPHIC */45}46 47// CHECK-NOSTRICT-LABEL: @test_vfmaq_n_f16(48// CHECK-NOSTRICT-NEXT: entry:49// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 050// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer51// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]], <8 x half> [[A:%.*]])52// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP0]]53//54// CHECK-STRICT-LABEL: @test_vfmaq_n_f16(55// CHECK-STRICT-NEXT: entry:56// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 057// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer58// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]], <8 x half> [[A:%.*]]) #[[ATTR2]]59// CHECK-STRICT-NEXT: ret <8 x half> [[TMP0]]60//61float16x8_t test_vfmaq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {62#ifdef POLYMORPHIC63 return vfmaq(a, b, c);64#else /* POLYMORPHIC */65 return vfmaq_n_f16(a, b, c);66#endif /* POLYMORPHIC */67}68 69// CHECK-NOSTRICT-LABEL: @test_vfmaq_n_f32(70// CHECK-NOSTRICT-NEXT: entry:71// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 072// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer73// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]], <4 x float> [[A:%.*]])74// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP0]]75//76// CHECK-STRICT-LABEL: @test_vfmaq_n_f32(77// CHECK-STRICT-NEXT: entry:78// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 079// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer80// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]], <4 x float> [[A:%.*]]) #[[ATTR2]]81// CHECK-STRICT-NEXT: ret <4 x float> [[TMP0]]82//83float32x4_t test_vfmaq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {84#ifdef POLYMORPHIC85 return vfmaq(a, b, c);86#else /* POLYMORPHIC */87 return vfmaq_n_f32(a, b, c);88#endif /* POLYMORPHIC */89}90 91// CHECK-NOSTRICT-LABEL: @test_vfmasq_n_f16(92// CHECK-NOSTRICT-NEXT: entry:93// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 094// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer95// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[A:%.*]], <8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]])96// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP0]]97//98// CHECK-STRICT-LABEL: @test_vfmasq_n_f16(99// CHECK-STRICT-NEXT: entry:100// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 0101// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer102// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.fma.v8f16(<8 x half> [[A:%.*]], <8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]]) #[[ATTR2]]103// CHECK-STRICT-NEXT: ret <8 x half> [[TMP0]]104//105float16x8_t test_vfmasq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {106#ifdef POLYMORPHIC107 return vfmasq(a, b, c);108#else /* POLYMORPHIC */109 return vfmasq_n_f16(a, b, c);110#endif /* POLYMORPHIC */111}112 113// CHECK-NOSTRICT-LABEL: @test_vfmasq_n_f32(114// CHECK-NOSTRICT-NEXT: entry:115// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0116// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer117// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.fma.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]])118// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP0]]119//120// CHECK-STRICT-LABEL: @test_vfmasq_n_f32(121// CHECK-STRICT-NEXT: entry:122// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0123// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer124// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.fma.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]]) #[[ATTR2]]125// CHECK-STRICT-NEXT: ret <4 x float> [[TMP0]]126//127float32x4_t test_vfmasq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {128#ifdef POLYMORPHIC129 return vfmasq(a, b, c);130#else /* POLYMORPHIC */131 return vfmasq_n_f32(a, b, c);132#endif /* POLYMORPHIC */133}134 135// CHECK-NOSTRICT-LABEL: @test_vfmsq_f16(136// CHECK-NOSTRICT-NEXT: entry:137// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = fneg <8 x half> [[C:%.*]]138// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[TMP0]], <8 x half> [[A:%.*]])139// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP1]]140//141// CHECK-STRICT-LABEL: @test_vfmsq_f16(142// CHECK-STRICT-NEXT: entry:143// CHECK-STRICT-NEXT: [[TMP0:%.*]] = fneg <8 x half> [[C:%.*]]144// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x half> @llvm.arm.mve.fma.v8f16(<8 x half> [[B:%.*]], <8 x half> [[TMP0]], <8 x half> [[A:%.*]]) #[[ATTR2]]145// CHECK-STRICT-NEXT: ret <8 x half> [[TMP1]]146//147float16x8_t test_vfmsq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {148#ifdef POLYMORPHIC149 return vfmsq(a, b, c);150#else /* POLYMORPHIC */151 return vfmsq_f16(a, b, c);152#endif /* POLYMORPHIC */153}154 155// CHECK-NOSTRICT-LABEL: @test_vfmsq_f32(156// CHECK-NOSTRICT-NEXT: entry:157// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = fneg <4 x float> [[C:%.*]]158// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x float> @llvm.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[TMP0]], <4 x float> [[A:%.*]])159// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP1]]160//161// CHECK-STRICT-LABEL: @test_vfmsq_f32(162// CHECK-STRICT-NEXT: entry:163// CHECK-STRICT-NEXT: [[TMP0:%.*]] = fneg <4 x float> [[C:%.*]]164// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x float> @llvm.arm.mve.fma.v4f32(<4 x float> [[B:%.*]], <4 x float> [[TMP0]], <4 x float> [[A:%.*]]) #[[ATTR2]]165// CHECK-STRICT-NEXT: ret <4 x float> [[TMP1]]166//167float32x4_t test_vfmsq_f32(float32x4_t a, float32x4_t b, float32x4_t c) {168#ifdef POLYMORPHIC169 return vfmsq(a, b, c);170#else /* POLYMORPHIC */171 return vfmsq_f32(a, b, c);172#endif /* POLYMORPHIC */173}174 175// CHECK-LABEL: @test_vmlaq_n_s8(176// CHECK-NEXT: entry:177// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[C:%.*]], i64 0178// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <16 x i8> [[DOTSPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer179// CHECK-NEXT: [[TMP0:%.*]] = mul <16 x i8> [[B:%.*]], [[DOTSPLAT]]180// CHECK-NEXT: [[TMP1:%.*]] = add <16 x i8> [[TMP0]], [[A:%.*]]181// CHECK-NEXT: ret <16 x i8> [[TMP1]]182//183int8x16_t test_vmlaq_n_s8(int8x16_t a, int8x16_t b, int8_t c) {184#ifdef POLYMORPHIC185 return vmlaq(a, b, c);186#else /* POLYMORPHIC */187 return vmlaq_n_s8(a, b, c);188#endif /* POLYMORPHIC */189}190 191// CHECK-LABEL: @test_vmlaq_n_s16(192// CHECK-NEXT: entry:193// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[C:%.*]], i64 0194// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i16> [[DOTSPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer195// CHECK-NEXT: [[TMP0:%.*]] = mul <8 x i16> [[B:%.*]], [[DOTSPLAT]]196// CHECK-NEXT: [[TMP1:%.*]] = add <8 x i16> [[TMP0]], [[A:%.*]]197// CHECK-NEXT: ret <8 x i16> [[TMP1]]198//199int16x8_t test_vmlaq_n_s16(int16x8_t a, int16x8_t b, int16_t c) {200#ifdef POLYMORPHIC201 return vmlaq(a, b, c);202#else /* POLYMORPHIC */203 return vmlaq_n_s16(a, b, c);204#endif /* POLYMORPHIC */205}206 207// CHECK-LABEL: @test_vmlaq_n_s32(208// CHECK-NEXT: entry:209// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[C:%.*]], i64 0210// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer211// CHECK-NEXT: [[TMP0:%.*]] = mul <4 x i32> [[B:%.*]], [[DOTSPLAT]]212// CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[TMP0]], [[A:%.*]]213// CHECK-NEXT: ret <4 x i32> [[TMP1]]214//215int32x4_t test_vmlaq_n_s32(int32x4_t a, int32x4_t b, int32_t c) {216#ifdef POLYMORPHIC217 return vmlaq(a, b, c);218#else /* POLYMORPHIC */219 return vmlaq_n_s32(a, b, c);220#endif /* POLYMORPHIC */221}222 223// CHECK-LABEL: @test_vmlaq_n_u8(224// CHECK-NEXT: entry:225// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[C:%.*]], i64 0226// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <16 x i8> [[DOTSPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer227// CHECK-NEXT: [[TMP0:%.*]] = mul <16 x i8> [[B:%.*]], [[DOTSPLAT]]228// CHECK-NEXT: [[TMP1:%.*]] = add <16 x i8> [[TMP0]], [[A:%.*]]229// CHECK-NEXT: ret <16 x i8> [[TMP1]]230//231uint8x16_t test_vmlaq_n_u8(uint8x16_t a, uint8x16_t b, uint8_t c) {232#ifdef POLYMORPHIC233 return vmlaq(a, b, c);234#else /* POLYMORPHIC */235 return vmlaq_n_u8(a, b, c);236#endif /* POLYMORPHIC */237}238 239// CHECK-LABEL: @test_vmlaq_n_u16(240// CHECK-NEXT: entry:241// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[C:%.*]], i64 0242// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i16> [[DOTSPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer243// CHECK-NEXT: [[TMP0:%.*]] = mul <8 x i16> [[B:%.*]], [[DOTSPLAT]]244// CHECK-NEXT: [[TMP1:%.*]] = add <8 x i16> [[TMP0]], [[A:%.*]]245// CHECK-NEXT: ret <8 x i16> [[TMP1]]246//247uint16x8_t test_vmlaq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c) {248#ifdef POLYMORPHIC249 return vmlaq(a, b, c);250#else /* POLYMORPHIC */251 return vmlaq_n_u16(a, b, c);252#endif /* POLYMORPHIC */253}254 255// CHECK-LABEL: @test_vmlaq_n_u32(256// CHECK-NEXT: entry:257// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[C:%.*]], i64 0258// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer259// CHECK-NEXT: [[TMP0:%.*]] = mul <4 x i32> [[B:%.*]], [[DOTSPLAT]]260// CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[TMP0]], [[A:%.*]]261// CHECK-NEXT: ret <4 x i32> [[TMP1]]262//263uint32x4_t test_vmlaq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c) {264#ifdef POLYMORPHIC265 return vmlaq(a, b, c);266#else /* POLYMORPHIC */267 return vmlaq_n_u32(a, b, c);268#endif /* POLYMORPHIC */269}270 271// CHECK-LABEL: @test_vmlasq_n_s8(272// CHECK-NEXT: entry:273// CHECK-NEXT: [[TMP0:%.*]] = mul <16 x i8> [[A:%.*]], [[B:%.*]]274// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[C:%.*]], i64 0275// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <16 x i8> [[DOTSPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer276// CHECK-NEXT: [[TMP1:%.*]] = add <16 x i8> [[TMP0]], [[DOTSPLAT]]277// CHECK-NEXT: ret <16 x i8> [[TMP1]]278//279int8x16_t test_vmlasq_n_s8(int8x16_t a, int8x16_t b, int8_t c) {280#ifdef POLYMORPHIC281 return vmlasq(a, b, c);282#else /* POLYMORPHIC */283 return vmlasq_n_s8(a, b, c);284#endif /* POLYMORPHIC */285}286 287// CHECK-LABEL: @test_vmlasq_n_s16(288// CHECK-NEXT: entry:289// CHECK-NEXT: [[TMP0:%.*]] = mul <8 x i16> [[A:%.*]], [[B:%.*]]290// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[C:%.*]], i64 0291// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i16> [[DOTSPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer292// CHECK-NEXT: [[TMP1:%.*]] = add <8 x i16> [[TMP0]], [[DOTSPLAT]]293// CHECK-NEXT: ret <8 x i16> [[TMP1]]294//295int16x8_t test_vmlasq_n_s16(int16x8_t a, int16x8_t b, int16_t c) {296#ifdef POLYMORPHIC297 return vmlasq(a, b, c);298#else /* POLYMORPHIC */299 return vmlasq_n_s16(a, b, c);300#endif /* POLYMORPHIC */301}302 303// CHECK-LABEL: @test_vmlasq_n_s32(304// CHECK-NEXT: entry:305// CHECK-NEXT: [[TMP0:%.*]] = mul <4 x i32> [[A:%.*]], [[B:%.*]]306// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[C:%.*]], i64 0307// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer308// CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[TMP0]], [[DOTSPLAT]]309// CHECK-NEXT: ret <4 x i32> [[TMP1]]310//311int32x4_t test_vmlasq_n_s32(int32x4_t a, int32x4_t b, int32_t c) {312#ifdef POLYMORPHIC313 return vmlasq(a, b, c);314#else /* POLYMORPHIC */315 return vmlasq_n_s32(a, b, c);316#endif /* POLYMORPHIC */317}318 319// CHECK-LABEL: @test_vmlasq_n_u8(320// CHECK-NEXT: entry:321// CHECK-NEXT: [[TMP0:%.*]] = mul <16 x i8> [[A:%.*]], [[B:%.*]]322// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[C:%.*]], i64 0323// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <16 x i8> [[DOTSPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer324// CHECK-NEXT: [[TMP1:%.*]] = add <16 x i8> [[TMP0]], [[DOTSPLAT]]325// CHECK-NEXT: ret <16 x i8> [[TMP1]]326//327uint8x16_t test_vmlasq_n_u8(uint8x16_t a, uint8x16_t b, uint8_t c) {328#ifdef POLYMORPHIC329 return vmlasq(a, b, c);330#else /* POLYMORPHIC */331 return vmlasq_n_u8(a, b, c);332#endif /* POLYMORPHIC */333}334 335// CHECK-LABEL: @test_vmlasq_n_u16(336// CHECK-NEXT: entry:337// CHECK-NEXT: [[TMP0:%.*]] = mul <8 x i16> [[A:%.*]], [[B:%.*]]338// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[C:%.*]], i64 0339// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i16> [[DOTSPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer340// CHECK-NEXT: [[TMP1:%.*]] = add <8 x i16> [[TMP0]], [[DOTSPLAT]]341// CHECK-NEXT: ret <8 x i16> [[TMP1]]342//343uint16x8_t test_vmlasq_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c) {344#ifdef POLYMORPHIC345 return vmlasq(a, b, c);346#else /* POLYMORPHIC */347 return vmlasq_n_u16(a, b, c);348#endif /* POLYMORPHIC */349}350 351// CHECK-LABEL: @test_vmlasq_n_u32(352// CHECK-NEXT: entry:353// CHECK-NEXT: [[TMP0:%.*]] = mul <4 x i32> [[A:%.*]], [[B:%.*]]354// CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[C:%.*]], i64 0355// CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer356// CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[TMP0]], [[DOTSPLAT]]357// CHECK-NEXT: ret <4 x i32> [[TMP1]]358//359uint32x4_t test_vmlasq_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c) {360#ifdef POLYMORPHIC361 return vmlasq(a, b, c);362#else /* POLYMORPHIC */363 return vmlasq_n_u32(a, b, c);364#endif /* POLYMORPHIC */365}366 367// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_n_s8(368// CHECK-NOSTRICT-NEXT: entry:369// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32370// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlah.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]])371// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP1]]372//373// CHECK-STRICT-LABEL: @test_vqdmlahq_n_s8(374// CHECK-STRICT-NEXT: entry:375// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32376// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlah.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]377// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP1]]378//379int8x16_t test_vqdmlahq_n_s8(int8x16_t a, int8x16_t b, int8_t c) {380#ifdef POLYMORPHIC381 return vqdmlahq(a, b, c);382#else /* POLYMORPHIC */383 return vqdmlahq_n_s8(a, b, c);384#endif /* POLYMORPHIC */385}386 387// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_n_s16(388// CHECK-NOSTRICT-NEXT: entry:389// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32390// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlah.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]])391// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP1]]392//393// CHECK-STRICT-LABEL: @test_vqdmlahq_n_s16(394// CHECK-STRICT-NEXT: entry:395// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32396// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlah.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]397// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP1]]398//399int16x8_t test_vqdmlahq_n_s16(int16x8_t a, int16x8_t b, int16_t c) {400#ifdef POLYMORPHIC401 return vqdmlahq(a, b, c);402#else /* POLYMORPHIC */403 return vqdmlahq_n_s16(a, b, c);404#endif /* POLYMORPHIC */405}406 407// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_n_s32(408// CHECK-NOSTRICT-NEXT: entry:409// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlah.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]])410// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP0]]411//412// CHECK-STRICT-LABEL: @test_vqdmlahq_n_s32(413// CHECK-STRICT-NEXT: entry:414// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlah.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]]) #[[ATTR2]]415// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP0]]416//417int32x4_t test_vqdmlahq_n_s32(int32x4_t a, int32x4_t b, int32_t c) {418#ifdef POLYMORPHIC419 return vqdmlahq(a, b, c);420#else /* POLYMORPHIC */421 return vqdmlahq_n_s32(a, b, c);422#endif /* POLYMORPHIC */423}424 425// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_n_s8(426// CHECK-NOSTRICT-NEXT: entry:427// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[ADD:%.*]] to i32428// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlash.v16i8(<16 x i8> [[M1:%.*]], <16 x i8> [[M2:%.*]], i32 [[TMP0]])429// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP1]]430//431// CHECK-STRICT-LABEL: @test_vqdmlashq_n_s8(432// CHECK-STRICT-NEXT: entry:433// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[ADD:%.*]] to i32434// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlash.v16i8(<16 x i8> [[M1:%.*]], <16 x i8> [[M2:%.*]], i32 [[TMP0]]) #[[ATTR2]]435// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP1]]436//437int8x16_t test_vqdmlashq_n_s8(int8x16_t m1, int8x16_t m2, int8_t add) {438#ifdef POLYMORPHIC439 return vqdmlashq(m1, m2, add);440#else /* POLYMORPHIC */441 return vqdmlashq_n_s8(m1, m2, add);442#endif /* POLYMORPHIC */443}444 445// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_n_s16(446// CHECK-NOSTRICT-NEXT: entry:447// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[ADD:%.*]] to i32448// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlash.v8i16(<8 x i16> [[M1:%.*]], <8 x i16> [[M2:%.*]], i32 [[TMP0]])449// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP1]]450//451// CHECK-STRICT-LABEL: @test_vqdmlashq_n_s16(452// CHECK-STRICT-NEXT: entry:453// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[ADD:%.*]] to i32454// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlash.v8i16(<8 x i16> [[M1:%.*]], <8 x i16> [[M2:%.*]], i32 [[TMP0]]) #[[ATTR2]]455// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP1]]456//457int16x8_t test_vqdmlashq_n_s16(int16x8_t m1, int16x8_t m2, int16_t add) {458#ifdef POLYMORPHIC459 return vqdmlashq(m1, m2, add);460#else /* POLYMORPHIC */461 return vqdmlashq_n_s16(m1, m2, add);462#endif /* POLYMORPHIC */463}464 465// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_n_s32(466// CHECK-NOSTRICT-NEXT: entry:467// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlash.v4i32(<4 x i32> [[M1:%.*]], <4 x i32> [[M2:%.*]], i32 [[ADD:%.*]])468// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP0]]469//470// CHECK-STRICT-LABEL: @test_vqdmlashq_n_s32(471// CHECK-STRICT-NEXT: entry:472// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlash.v4i32(<4 x i32> [[M1:%.*]], <4 x i32> [[M2:%.*]], i32 [[ADD:%.*]]) #[[ATTR2]]473// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP0]]474//475int32x4_t test_vqdmlashq_n_s32(int32x4_t m1, int32x4_t m2, int32_t add) {476#ifdef POLYMORPHIC477 return vqdmlashq(m1, m2, add);478#else /* POLYMORPHIC */479 return vqdmlashq_n_s32(m1, m2, add);480#endif /* POLYMORPHIC */481}482 483// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_n_s8(484// CHECK-NOSTRICT-NEXT: entry:485// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32486// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlah.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]])487// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP1]]488//489// CHECK-STRICT-LABEL: @test_vqrdmlahq_n_s8(490// CHECK-STRICT-NEXT: entry:491// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32492// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlah.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]493// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP1]]494//495int8x16_t test_vqrdmlahq_n_s8(int8x16_t a, int8x16_t b, int8_t c) {496#ifdef POLYMORPHIC497 return vqrdmlahq(a, b, c);498#else /* POLYMORPHIC */499 return vqrdmlahq_n_s8(a, b, c);500#endif /* POLYMORPHIC */501}502 503// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_n_s16(504// CHECK-NOSTRICT-NEXT: entry:505// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32506// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlah.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]])507// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP1]]508//509// CHECK-STRICT-LABEL: @test_vqrdmlahq_n_s16(510// CHECK-STRICT-NEXT: entry:511// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32512// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlah.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]513// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP1]]514//515int16x8_t test_vqrdmlahq_n_s16(int16x8_t a, int16x8_t b, int16_t c) {516#ifdef POLYMORPHIC517 return vqrdmlahq(a, b, c);518#else /* POLYMORPHIC */519 return vqrdmlahq_n_s16(a, b, c);520#endif /* POLYMORPHIC */521}522 523// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_n_s32(524// CHECK-NOSTRICT-NEXT: entry:525// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlah.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]])526// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP0]]527//528// CHECK-STRICT-LABEL: @test_vqrdmlahq_n_s32(529// CHECK-STRICT-NEXT: entry:530// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlah.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]]) #[[ATTR2]]531// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP0]]532//533int32x4_t test_vqrdmlahq_n_s32(int32x4_t a, int32x4_t b, int32_t c) {534#ifdef POLYMORPHIC535 return vqrdmlahq(a, b, c);536#else /* POLYMORPHIC */537 return vqrdmlahq_n_s32(a, b, c);538#endif /* POLYMORPHIC */539}540 541// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_n_s8(542// CHECK-NOSTRICT-NEXT: entry:543// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32544// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlash.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]])545// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP1]]546//547// CHECK-STRICT-LABEL: @test_vqrdmlashq_n_s8(548// CHECK-STRICT-NEXT: entry:549// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32550// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlash.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]551// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP1]]552//553int8x16_t test_vqrdmlashq_n_s8(int8x16_t a, int8x16_t b, int8_t c) {554#ifdef POLYMORPHIC555 return vqrdmlashq(a, b, c);556#else /* POLYMORPHIC */557 return vqrdmlashq_n_s8(a, b, c);558#endif /* POLYMORPHIC */559}560 561// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_n_s16(562// CHECK-NOSTRICT-NEXT: entry:563// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32564// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlash.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]])565// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP1]]566//567// CHECK-STRICT-LABEL: @test_vqrdmlashq_n_s16(568// CHECK-STRICT-NEXT: entry:569// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32570// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlash.v8i16(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]]) #[[ATTR2]]571// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP1]]572//573int16x8_t test_vqrdmlashq_n_s16(int16x8_t a, int16x8_t b, int16_t c) {574#ifdef POLYMORPHIC575 return vqrdmlashq(a, b, c);576#else /* POLYMORPHIC */577 return vqrdmlashq_n_s16(a, b, c);578#endif /* POLYMORPHIC */579}580 581// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_n_s32(582// CHECK-NOSTRICT-NEXT: entry:583// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlash.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]])584// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP0]]585//586// CHECK-STRICT-LABEL: @test_vqrdmlashq_n_s32(587// CHECK-STRICT-NEXT: entry:588// CHECK-STRICT-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlash.v4i32(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]]) #[[ATTR2]]589// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP0]]590//591int32x4_t test_vqrdmlashq_n_s32(int32x4_t a, int32x4_t b, int32_t c) {592#ifdef POLYMORPHIC593 return vqrdmlashq(a, b, c);594#else /* POLYMORPHIC */595 return vqrdmlashq_n_s32(a, b, c);596#endif /* POLYMORPHIC */597}598 599// CHECK-NOSTRICT-LABEL: @test_vfmaq_m_f16(600// CHECK-NOSTRICT-NEXT: entry:601// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32602// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])603// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[C:%.*]], <8 x half> [[A:%.*]], <8 x i1> [[TMP1]])604// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP2]]605//606// CHECK-STRICT-LABEL: @test_vfmaq_m_f16(607// CHECK-STRICT-NEXT: entry:608// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32609// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) #[[ATTR2]]610// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[C:%.*]], <8 x half> [[A:%.*]], <8 x i1> [[TMP1]]) #[[ATTR2]]611// CHECK-STRICT-NEXT: ret <8 x half> [[TMP2]]612//613float16x8_t test_vfmaq_m_f16(float16x8_t a, float16x8_t b, float16x8_t c, mve_pred16_t p) {614#ifdef POLYMORPHIC615 return vfmaq_m(a, b, c, p);616#else /* POLYMORPHIC */617 return vfmaq_m_f16(a, b, c, p);618#endif /* POLYMORPHIC */619}620 621// CHECK-NOSTRICT-LABEL: @test_vfmaq_m_f32(622// CHECK-NOSTRICT-NEXT: entry:623// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32624// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])625// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[C:%.*]], <4 x float> [[A:%.*]], <4 x i1> [[TMP1]])626// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP2]]627//628// CHECK-STRICT-LABEL: @test_vfmaq_m_f32(629// CHECK-STRICT-NEXT: entry:630// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32631// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]632// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[C:%.*]], <4 x float> [[A:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]633// CHECK-STRICT-NEXT: ret <4 x float> [[TMP2]]634//635float32x4_t test_vfmaq_m_f32(float32x4_t a, float32x4_t b, float32x4_t c, mve_pred16_t p) {636#ifdef POLYMORPHIC637 return vfmaq_m(a, b, c, p);638#else /* POLYMORPHIC */639 return vfmaq_m_f32(a, b, c, p);640#endif /* POLYMORPHIC */641}642 643// CHECK-NOSTRICT-LABEL: @test_vfmaq_m_n_f16(644// CHECK-NOSTRICT-NEXT: entry:645// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 0646// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer647// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32648// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])649// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]], <8 x half> [[A:%.*]], <8 x i1> [[TMP1]])650// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP2]]651//652// CHECK-STRICT-LABEL: @test_vfmaq_m_n_f16(653// CHECK-STRICT-NEXT: entry:654// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 0655// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer656// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32657// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) #[[ATTR2]]658// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]], <8 x half> [[A:%.*]], <8 x i1> [[TMP1]]) #[[ATTR2]]659// CHECK-STRICT-NEXT: ret <8 x half> [[TMP2]]660//661float16x8_t test_vfmaq_m_n_f16(float16x8_t a, float16x8_t b, float16_t c, mve_pred16_t p) {662#ifdef POLYMORPHIC663 return vfmaq_m(a, b, c, p);664#else /* POLYMORPHIC */665 return vfmaq_m_n_f16(a, b, c, p);666#endif /* POLYMORPHIC */667}668 669// CHECK-NOSTRICT-LABEL: @test_vfmaq_m_n_f32(670// CHECK-NOSTRICT-NEXT: entry:671// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0672// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer673// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32674// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])675// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]], <4 x float> [[A:%.*]], <4 x i1> [[TMP1]])676// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP2]]677//678// CHECK-STRICT-LABEL: @test_vfmaq_m_n_f32(679// CHECK-STRICT-NEXT: entry:680// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0681// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer682// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32683// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]684// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]], <4 x float> [[A:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]685// CHECK-STRICT-NEXT: ret <4 x float> [[TMP2]]686//687float32x4_t test_vfmaq_m_n_f32(float32x4_t a, float32x4_t b, float32_t c, mve_pred16_t p) {688#ifdef POLYMORPHIC689 return vfmaq_m(a, b, c, p);690#else /* POLYMORPHIC */691 return vfmaq_m_n_f32(a, b, c, p);692#endif /* POLYMORPHIC */693}694 695// CHECK-NOSTRICT-LABEL: @test_vfmasq_m_n_f16(696// CHECK-NOSTRICT-NEXT: entry:697// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32698// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]])699// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 0700// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer701// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[A:%.*]], <8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]])702// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = select <8 x i1> [[TMP1]], <8 x half> [[TMP2]], <8 x half> [[A]]703// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP3]]704//705// CHECK-STRICT-LABEL: @test_vfmasq_m_n_f16(706// CHECK-STRICT-NEXT: entry:707// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32708// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP0]]) #[[ATTR2]]709// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[C:%.*]], i64 0710// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x half> [[DOTSPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer711// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.arm.mve.fma.v8f16(<8 x half> [[A:%.*]], <8 x half> [[B:%.*]], <8 x half> [[DOTSPLAT]]) #[[ATTR2]]712// CHECK-STRICT-NEXT: [[TMP3:%.*]] = select <8 x i1> [[TMP1]], <8 x half> [[TMP2]], <8 x half> [[A]]713// CHECK-STRICT-NEXT: ret <8 x half> [[TMP3]]714//715float16x8_t test_vfmasq_m_n_f16(float16x8_t a, float16x8_t b, float16_t c, mve_pred16_t p) {716#ifdef POLYMORPHIC717 return vfmasq_m(a, b, c, p);718#else /* POLYMORPHIC */719 return vfmasq_m_n_f16(a, b, c, p);720#endif /* POLYMORPHIC */721}722 723// CHECK-NOSTRICT-LABEL: @test_vfmasq_m_n_f32(724// CHECK-NOSTRICT-NEXT: entry:725// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32726// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])727// CHECK-NOSTRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0728// CHECK-NOSTRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer729// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.fma.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]])730// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = select <4 x i1> [[TMP1]], <4 x float> [[TMP2]], <4 x float> [[A]]731// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP3]]732//733// CHECK-STRICT-LABEL: @test_vfmasq_m_n_f32(734// CHECK-STRICT-NEXT: entry:735// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32736// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]737// CHECK-STRICT-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[C:%.*]], i64 0738// CHECK-STRICT-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x float> [[DOTSPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer739// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.arm.mve.fma.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[DOTSPLAT]]) #[[ATTR2]]740// CHECK-STRICT-NEXT: [[TMP3:%.*]] = select <4 x i1> [[TMP1]], <4 x float> [[TMP2]], <4 x float> [[A]]741// CHECK-STRICT-NEXT: ret <4 x float> [[TMP3]]742//743float32x4_t test_vfmasq_m_n_f32(float32x4_t a, float32x4_t b, float32_t c, mve_pred16_t p) {744#ifdef POLYMORPHIC745 return vfmasq_m(a, b, c, p);746#else /* POLYMORPHIC */747 return vfmasq_m_n_f32(a, b, c, p);748#endif /* POLYMORPHIC */749}750 751// CHECK-NOSTRICT-LABEL: @test_vfmsq_m_f16(752// CHECK-NOSTRICT-NEXT: entry:753// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = fneg <8 x half> [[C:%.*]]754// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32755// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])756// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[TMP0]], <8 x half> [[A:%.*]], <8 x i1> [[TMP2]])757// CHECK-NOSTRICT-NEXT: ret <8 x half> [[TMP3]]758//759// CHECK-STRICT-LABEL: @test_vfmsq_m_f16(760// CHECK-STRICT-NEXT: entry:761// CHECK-STRICT-NEXT: [[TMP0:%.*]] = fneg <8 x half> [[C:%.*]]762// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32763// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]764// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.arm.mve.fma.predicated.v8f16.v8i1(<8 x half> [[B:%.*]], <8 x half> [[TMP0]], <8 x half> [[A:%.*]], <8 x i1> [[TMP2]]) #[[ATTR2]]765// CHECK-STRICT-NEXT: ret <8 x half> [[TMP3]]766//767float16x8_t test_vfmsq_m_f16(float16x8_t a, float16x8_t b, float16x8_t c, mve_pred16_t p) {768#ifdef POLYMORPHIC769 return vfmsq_m(a, b, c, p);770#else /* POLYMORPHIC */771 return vfmsq_m_f16(a, b, c, p);772#endif /* POLYMORPHIC */773}774 775// CHECK-NOSTRICT-LABEL: @test_vfmsq_m_f32(776// CHECK-NOSTRICT-NEXT: entry:777// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = fneg <4 x float> [[C:%.*]]778// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32779// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP1]])780// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[TMP0]], <4 x float> [[A:%.*]], <4 x i1> [[TMP2]])781// CHECK-NOSTRICT-NEXT: ret <4 x float> [[TMP3]]782//783// CHECK-STRICT-LABEL: @test_vfmsq_m_f32(784// CHECK-STRICT-NEXT: entry:785// CHECK-STRICT-NEXT: [[TMP0:%.*]] = fneg <4 x float> [[C:%.*]]786// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32787// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP1]]) #[[ATTR2]]788// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> [[B:%.*]], <4 x float> [[TMP0]], <4 x float> [[A:%.*]], <4 x i1> [[TMP2]]) #[[ATTR2]]789// CHECK-STRICT-NEXT: ret <4 x float> [[TMP3]]790//791float32x4_t test_vfmsq_m_f32(float32x4_t a, float32x4_t b, float32x4_t c, mve_pred16_t p) {792#ifdef POLYMORPHIC793 return vfmsq_m(a, b, c, p);794#else /* POLYMORPHIC */795 return vfmsq_m_f32(a, b, c, p);796#endif /* POLYMORPHIC */797}798 799// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_s8(800// CHECK-NOSTRICT-NEXT: entry:801// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32802// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32803// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])804// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmla.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])805// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]806//807// CHECK-STRICT-LABEL: @test_vmlaq_m_n_s8(808// CHECK-STRICT-NEXT: entry:809// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32810// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32811// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]812// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmla.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]813// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]814//815int8x16_t test_vmlaq_m_n_s8(int8x16_t a, int8x16_t b, int8_t c, mve_pred16_t p) {816#ifdef POLYMORPHIC817 return vmlaq_m(a, b, c, p);818#else /* POLYMORPHIC */819 return vmlaq_m_n_s8(a, b, c, p);820#endif /* POLYMORPHIC */821}822 823// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_s16(824// CHECK-NOSTRICT-NEXT: entry:825// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32826// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32827// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])828// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmla.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])829// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]830//831// CHECK-STRICT-LABEL: @test_vmlaq_m_n_s16(832// CHECK-STRICT-NEXT: entry:833// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32834// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32835// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]836// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmla.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]837// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]838//839int16x8_t test_vmlaq_m_n_s16(int16x8_t a, int16x8_t b, int16_t c, mve_pred16_t p) {840#ifdef POLYMORPHIC841 return vmlaq_m(a, b, c, p);842#else /* POLYMORPHIC */843 return vmlaq_m_n_s16(a, b, c, p);844#endif /* POLYMORPHIC */845}846 847// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_s32(848// CHECK-NOSTRICT-NEXT: entry:849// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32850// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])851// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])852// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]853//854// CHECK-STRICT-LABEL: @test_vmlaq_m_n_s32(855// CHECK-STRICT-NEXT: entry:856// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32857// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]858// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]859// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]860//861int32x4_t test_vmlaq_m_n_s32(int32x4_t a, int32x4_t b, int32_t c, mve_pred16_t p) {862#ifdef POLYMORPHIC863 return vmlaq_m(a, b, c, p);864#else /* POLYMORPHIC */865 return vmlaq_m_n_s32(a, b, c, p);866#endif /* POLYMORPHIC */867}868 869// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_u8(870// CHECK-NOSTRICT-NEXT: entry:871// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32872// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32873// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])874// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmla.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])875// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]876//877// CHECK-STRICT-LABEL: @test_vmlaq_m_n_u8(878// CHECK-STRICT-NEXT: entry:879// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32880// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32881// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]882// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmla.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]883// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]884//885uint8x16_t test_vmlaq_m_n_u8(uint8x16_t a, uint8x16_t b, uint8_t c, mve_pred16_t p) {886#ifdef POLYMORPHIC887 return vmlaq_m(a, b, c, p);888#else /* POLYMORPHIC */889 return vmlaq_m_n_u8(a, b, c, p);890#endif /* POLYMORPHIC */891}892 893// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_u16(894// CHECK-NOSTRICT-NEXT: entry:895// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32896// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32897// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])898// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmla.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])899// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]900//901// CHECK-STRICT-LABEL: @test_vmlaq_m_n_u16(902// CHECK-STRICT-NEXT: entry:903// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32904// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32905// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]906// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmla.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]907// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]908//909uint16x8_t test_vmlaq_m_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c, mve_pred16_t p) {910#ifdef POLYMORPHIC911 return vmlaq_m(a, b, c, p);912#else /* POLYMORPHIC */913 return vmlaq_m_n_u16(a, b, c, p);914#endif /* POLYMORPHIC */915}916 917// CHECK-NOSTRICT-LABEL: @test_vmlaq_m_n_u32(918// CHECK-NOSTRICT-NEXT: entry:919// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32920// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])921// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])922// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]923//924// CHECK-STRICT-LABEL: @test_vmlaq_m_n_u32(925// CHECK-STRICT-NEXT: entry:926// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32927// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]928// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]929// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]930//931uint32x4_t test_vmlaq_m_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c, mve_pred16_t p) {932#ifdef POLYMORPHIC933 return vmlaq_m(a, b, c, p);934#else /* POLYMORPHIC */935 return vmlaq_m_n_u32(a, b, c, p);936#endif /* POLYMORPHIC */937}938 939// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_s8(940// CHECK-NOSTRICT-NEXT: entry:941// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32942// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32943// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])944// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmlas.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])945// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]946//947// CHECK-STRICT-LABEL: @test_vmlasq_m_n_s8(948// CHECK-STRICT-NEXT: entry:949// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i32950// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32951// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]952// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmlas.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]953// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]954//955int8x16_t test_vmlasq_m_n_s8(int8x16_t a, int8x16_t b, int8_t c, mve_pred16_t p) {956#ifdef POLYMORPHIC957 return vmlasq_m(a, b, c, p);958#else /* POLYMORPHIC */959 return vmlasq_m_n_s8(a, b, c, p);960#endif /* POLYMORPHIC */961}962 963// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_s16(964// CHECK-NOSTRICT-NEXT: entry:965// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32966// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32967// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])968// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmlas.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])969// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]970//971// CHECK-STRICT-LABEL: @test_vmlasq_m_n_s16(972// CHECK-STRICT-NEXT: entry:973// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i32974// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i32975// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]976// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmlas.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]977// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]978//979int16x8_t test_vmlasq_m_n_s16(int16x8_t a, int16x8_t b, int16_t c, mve_pred16_t p) {980#ifdef POLYMORPHIC981 return vmlasq_m(a, b, c, p);982#else /* POLYMORPHIC */983 return vmlasq_m_n_s16(a, b, c, p);984#endif /* POLYMORPHIC */985}986 987// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_s32(988// CHECK-NOSTRICT-NEXT: entry:989// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32990// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])991// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])992// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]993//994// CHECK-STRICT-LABEL: @test_vmlasq_m_n_s32(995// CHECK-STRICT-NEXT: entry:996// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i32997// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]998// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]999// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1000//1001int32x4_t test_vmlasq_m_n_s32(int32x4_t a, int32x4_t b, int32_t c, mve_pred16_t p) {1002#ifdef POLYMORPHIC1003 return vmlasq_m(a, b, c, p);1004#else /* POLYMORPHIC */1005 return vmlasq_m_n_s32(a, b, c, p);1006#endif /* POLYMORPHIC */1007}1008 1009// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_u8(1010// CHECK-NOSTRICT-NEXT: entry:1011// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321012// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321013// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])1014// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmlas.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])1015// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]1016//1017// CHECK-STRICT-LABEL: @test_vmlasq_m_n_u8(1018// CHECK-STRICT-NEXT: entry:1019// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321020// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321021// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]1022// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vmlas.n.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]1023// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]1024//1025uint8x16_t test_vmlasq_m_n_u8(uint8x16_t a, uint8x16_t b, uint8_t c, mve_pred16_t p) {1026#ifdef POLYMORPHIC1027 return vmlasq_m(a, b, c, p);1028#else /* POLYMORPHIC */1029 return vmlasq_m_n_u8(a, b, c, p);1030#endif /* POLYMORPHIC */1031}1032 1033// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_u16(1034// CHECK-NOSTRICT-NEXT: entry:1035// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321036// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321037// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])1038// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmlas.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])1039// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]1040//1041// CHECK-STRICT-LABEL: @test_vmlasq_m_n_u16(1042// CHECK-STRICT-NEXT: entry:1043// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321044// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321045// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]1046// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vmlas.n.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]1047// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]1048//1049uint16x8_t test_vmlasq_m_n_u16(uint16x8_t a, uint16x8_t b, uint16_t c, mve_pred16_t p) {1050#ifdef POLYMORPHIC1051 return vmlasq_m(a, b, c, p);1052#else /* POLYMORPHIC */1053 return vmlasq_m_n_u16(a, b, c, p);1054#endif /* POLYMORPHIC */1055}1056 1057// CHECK-NOSTRICT-LABEL: @test_vmlasq_m_n_u32(1058// CHECK-NOSTRICT-NEXT: entry:1059// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321060// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])1061// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])1062// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]1063//1064// CHECK-STRICT-LABEL: @test_vmlasq_m_n_u32(1065// CHECK-STRICT-NEXT: entry:1066// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321067// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]1068// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]1069// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1070//1071uint32x4_t test_vmlasq_m_n_u32(uint32x4_t a, uint32x4_t b, uint32_t c, mve_pred16_t p) {1072#ifdef POLYMORPHIC1073 return vmlasq_m(a, b, c, p);1074#else /* POLYMORPHIC */1075 return vmlasq_m_n_u32(a, b, c, p);1076#endif /* POLYMORPHIC */1077}1078 1079// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_m_n_s8(1080// CHECK-NOSTRICT-NEXT: entry:1081// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321082// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321083// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])1084// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlah.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])1085// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]1086//1087// CHECK-STRICT-LABEL: @test_vqdmlahq_m_n_s8(1088// CHECK-STRICT-NEXT: entry:1089// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321090// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321091// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]1092// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlah.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]1093// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]1094//1095int8x16_t test_vqdmlahq_m_n_s8(int8x16_t a, int8x16_t b, int8_t c, mve_pred16_t p) {1096#ifdef POLYMORPHIC1097 return vqdmlahq_m(a, b, c, p);1098#else /* POLYMORPHIC */1099 return vqdmlahq_m_n_s8(a, b, c, p);1100#endif /* POLYMORPHIC */1101}1102 1103// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_m_n_s16(1104// CHECK-NOSTRICT-NEXT: entry:1105// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321106// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321107// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])1108// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlah.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])1109// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]1110//1111// CHECK-STRICT-LABEL: @test_vqdmlahq_m_n_s16(1112// CHECK-STRICT-NEXT: entry:1113// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321114// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321115// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]1116// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlah.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]1117// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]1118//1119int16x8_t test_vqdmlahq_m_n_s16(int16x8_t a, int16x8_t b, int16_t c, mve_pred16_t p) {1120#ifdef POLYMORPHIC1121 return vqdmlahq_m(a, b, c, p);1122#else /* POLYMORPHIC */1123 return vqdmlahq_m_n_s16(a, b, c, p);1124#endif /* POLYMORPHIC */1125}1126 1127// CHECK-NOSTRICT-LABEL: @test_vqdmlahq_m_n_s32(1128// CHECK-NOSTRICT-NEXT: entry:1129// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321130// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])1131// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlah.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])1132// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]1133//1134// CHECK-STRICT-LABEL: @test_vqdmlahq_m_n_s32(1135// CHECK-STRICT-NEXT: entry:1136// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321137// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]1138// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlah.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]1139// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1140//1141int32x4_t test_vqdmlahq_m_n_s32(int32x4_t a, int32x4_t b, int32_t c, mve_pred16_t p) {1142#ifdef POLYMORPHIC1143 return vqdmlahq_m(a, b, c, p);1144#else /* POLYMORPHIC */1145 return vqdmlahq_m_n_s32(a, b, c, p);1146#endif /* POLYMORPHIC */1147}1148 1149// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_m_n_s8(1150// CHECK-NOSTRICT-NEXT: entry:1151// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[ADD:%.*]] to i321152// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321153// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])1154// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlash.predicated.v16i8.v16i1(<16 x i8> [[M1:%.*]], <16 x i8> [[M2:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])1155// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]1156//1157// CHECK-STRICT-LABEL: @test_vqdmlashq_m_n_s8(1158// CHECK-STRICT-NEXT: entry:1159// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[ADD:%.*]] to i321160// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321161// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]1162// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqdmlash.predicated.v16i8.v16i1(<16 x i8> [[M1:%.*]], <16 x i8> [[M2:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]1163// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]1164//1165int8x16_t test_vqdmlashq_m_n_s8(int8x16_t m1, int8x16_t m2, int8_t add, mve_pred16_t p) {1166#ifdef POLYMORPHIC1167 return vqdmlashq_m(m1, m2, add, p);1168#else /* POLYMORPHIC */1169 return vqdmlashq_m_n_s8(m1, m2, add, p);1170#endif /* POLYMORPHIC */1171}1172 1173// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_m_n_s16(1174// CHECK-NOSTRICT-NEXT: entry:1175// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[ADD:%.*]] to i321176// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321177// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])1178// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlash.predicated.v8i16.v8i1(<8 x i16> [[M1:%.*]], <8 x i16> [[M2:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])1179// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]1180//1181// CHECK-STRICT-LABEL: @test_vqdmlashq_m_n_s16(1182// CHECK-STRICT-NEXT: entry:1183// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[ADD:%.*]] to i321184// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321185// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]1186// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqdmlash.predicated.v8i16.v8i1(<8 x i16> [[M1:%.*]], <8 x i16> [[M2:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]1187// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]1188//1189int16x8_t test_vqdmlashq_m_n_s16(int16x8_t m1, int16x8_t m2, int16_t add, mve_pred16_t p) {1190#ifdef POLYMORPHIC1191 return vqdmlashq_m(m1, m2, add, p);1192#else /* POLYMORPHIC */1193 return vqdmlashq_m_n_s16(m1, m2, add, p);1194#endif /* POLYMORPHIC */1195}1196 1197// CHECK-NOSTRICT-LABEL: @test_vqdmlashq_m_n_s32(1198// CHECK-NOSTRICT-NEXT: entry:1199// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321200// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])1201// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlash.predicated.v4i32.v4i1(<4 x i32> [[M1:%.*]], <4 x i32> [[M2:%.*]], i32 [[ADD:%.*]], <4 x i1> [[TMP1]])1202// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]1203//1204// CHECK-STRICT-LABEL: @test_vqdmlashq_m_n_s32(1205// CHECK-STRICT-NEXT: entry:1206// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321207// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]1208// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqdmlash.predicated.v4i32.v4i1(<4 x i32> [[M1:%.*]], <4 x i32> [[M2:%.*]], i32 [[ADD:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]1209// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1210//1211int32x4_t test_vqdmlashq_m_n_s32(int32x4_t m1, int32x4_t m2, int32_t add, mve_pred16_t p) {1212#ifdef POLYMORPHIC1213 return vqdmlashq_m(m1, m2, add, p);1214#else /* POLYMORPHIC */1215 return vqdmlashq_m_n_s32(m1, m2, add, p);1216#endif /* POLYMORPHIC */1217}1218 1219// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_m_n_s8(1220// CHECK-NOSTRICT-NEXT: entry:1221// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321222// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321223// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])1224// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlah.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])1225// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]1226//1227// CHECK-STRICT-LABEL: @test_vqrdmlahq_m_n_s8(1228// CHECK-STRICT-NEXT: entry:1229// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321230// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321231// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]1232// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlah.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]1233// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]1234//1235int8x16_t test_vqrdmlahq_m_n_s8(int8x16_t a, int8x16_t b, int8_t c, mve_pred16_t p) {1236#ifdef POLYMORPHIC1237 return vqrdmlahq_m(a, b, c, p);1238#else /* POLYMORPHIC */1239 return vqrdmlahq_m_n_s8(a, b, c, p);1240#endif /* POLYMORPHIC */1241}1242 1243// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_m_n_s16(1244// CHECK-NOSTRICT-NEXT: entry:1245// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321246// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321247// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])1248// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlah.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])1249// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]1250//1251// CHECK-STRICT-LABEL: @test_vqrdmlahq_m_n_s16(1252// CHECK-STRICT-NEXT: entry:1253// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321254// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321255// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]1256// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlah.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]1257// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]1258//1259int16x8_t test_vqrdmlahq_m_n_s16(int16x8_t a, int16x8_t b, int16_t c, mve_pred16_t p) {1260#ifdef POLYMORPHIC1261 return vqrdmlahq_m(a, b, c, p);1262#else /* POLYMORPHIC */1263 return vqrdmlahq_m_n_s16(a, b, c, p);1264#endif /* POLYMORPHIC */1265}1266 1267// CHECK-NOSTRICT-LABEL: @test_vqrdmlahq_m_n_s32(1268// CHECK-NOSTRICT-NEXT: entry:1269// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321270// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])1271// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlah.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])1272// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]1273//1274// CHECK-STRICT-LABEL: @test_vqrdmlahq_m_n_s32(1275// CHECK-STRICT-NEXT: entry:1276// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321277// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]1278// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlah.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]1279// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1280//1281int32x4_t test_vqrdmlahq_m_n_s32(int32x4_t a, int32x4_t b, int32_t c, mve_pred16_t p) {1282#ifdef POLYMORPHIC1283 return vqrdmlahq_m(a, b, c, p);1284#else /* POLYMORPHIC */1285 return vqrdmlahq_m_n_s32(a, b, c, p);1286#endif /* POLYMORPHIC */1287}1288 1289// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_m_n_s8(1290// CHECK-NOSTRICT-NEXT: entry:1291// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321292// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321293// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]])1294// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlash.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]])1295// CHECK-NOSTRICT-NEXT: ret <16 x i8> [[TMP3]]1296//1297// CHECK-STRICT-LABEL: @test_vqrdmlashq_m_n_s8(1298// CHECK-STRICT-NEXT: entry:1299// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i8 [[C:%.*]] to i321300// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321301// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 [[TMP1]]) #[[ATTR2]]1302// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.arm.mve.vqrdmlash.predicated.v16i8.v16i1(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], i32 [[TMP0]], <16 x i1> [[TMP2]]) #[[ATTR2]]1303// CHECK-STRICT-NEXT: ret <16 x i8> [[TMP3]]1304//1305int8x16_t test_vqrdmlashq_m_n_s8(int8x16_t a, int8x16_t b, int8_t c, mve_pred16_t p) {1306#ifdef POLYMORPHIC1307 return vqrdmlashq_m(a, b, c, p);1308#else /* POLYMORPHIC */1309 return vqrdmlashq_m_n_s8(a, b, c, p);1310#endif /* POLYMORPHIC */1311}1312 1313// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_m_n_s16(1314// CHECK-NOSTRICT-NEXT: entry:1315// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321316// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321317// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]])1318// CHECK-NOSTRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlash.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]])1319// CHECK-NOSTRICT-NEXT: ret <8 x i16> [[TMP3]]1320//1321// CHECK-STRICT-LABEL: @test_vqrdmlashq_m_n_s16(1322// CHECK-STRICT-NEXT: entry:1323// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[C:%.*]] to i321324// CHECK-STRICT-NEXT: [[TMP1:%.*]] = zext i16 [[P:%.*]] to i321325// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 [[TMP1]]) #[[ATTR2]]1326// CHECK-STRICT-NEXT: [[TMP3:%.*]] = call <8 x i16> @llvm.arm.mve.vqrdmlash.predicated.v8i16.v8i1(<8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], i32 [[TMP0]], <8 x i1> [[TMP2]]) #[[ATTR2]]1327// CHECK-STRICT-NEXT: ret <8 x i16> [[TMP3]]1328//1329int16x8_t test_vqrdmlashq_m_n_s16(int16x8_t a, int16x8_t b, int16_t c, mve_pred16_t p) {1330#ifdef POLYMORPHIC1331 return vqrdmlashq_m(a, b, c, p);1332#else /* POLYMORPHIC */1333 return vqrdmlashq_m_n_s16(a, b, c, p);1334#endif /* POLYMORPHIC */1335}1336 1337// CHECK-NOSTRICT-LABEL: @test_vqrdmlashq_m_n_s32(1338// CHECK-NOSTRICT-NEXT: entry:1339// CHECK-NOSTRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321340// CHECK-NOSTRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]])1341// CHECK-NOSTRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlash.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]])1342// CHECK-NOSTRICT-NEXT: ret <4 x i32> [[TMP2]]1343//1344// CHECK-STRICT-LABEL: @test_vqrdmlashq_m_n_s32(1345// CHECK-STRICT-NEXT: entry:1346// CHECK-STRICT-NEXT: [[TMP0:%.*]] = zext i16 [[P:%.*]] to i321347// CHECK-STRICT-NEXT: [[TMP1:%.*]] = call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 [[TMP0]]) #[[ATTR2]]1348// CHECK-STRICT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vqrdmlash.predicated.v4i32.v4i1(<4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], i32 [[C:%.*]], <4 x i1> [[TMP1]]) #[[ATTR2]]1349// CHECK-STRICT-NEXT: ret <4 x i32> [[TMP2]]1350//1351int32x4_t test_vqrdmlashq_m_n_s32(int32x4_t a, int32x4_t b, int32_t c, mve_pred16_t p) {1352#ifdef POLYMORPHIC1353 return vqrdmlashq_m(a, b, c, p);1354#else /* POLYMORPHIC */1355 return vqrdmlashq_m_n_s32(a, b, c, p);1356#endif /* POLYMORPHIC */1357}1358