346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=ilp32d -riscv-v-vector-bits-min=128 \7; RUN: -verify-machineinstrs < %s | FileCheck %s8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=lp64d -riscv-v-vector-bits-min=128 \9; RUN: -verify-machineinstrs < %s | FileCheck %s10 11define <2 x half> @select_v2f16(i1 zeroext %c, <2 x half> %a, <2 x half> %b) {12; CHECK-LABEL: select_v2f16:13; CHECK: # %bb.0:14; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma15; CHECK-NEXT: vmv.v.x v10, a016; CHECK-NEXT: vmsne.vi v0, v10, 017; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma18; CHECK-NEXT: vmerge.vvm v8, v9, v8, v019; CHECK-NEXT: ret20 %v = select i1 %c, <2 x half> %a, <2 x half> %b21 ret <2 x half> %v22}23 24define <2 x half> @selectcc_v2f16(half %a, half %b, <2 x half> %c, <2 x half> %d) {25; CHECK-LABEL: selectcc_v2f16:26; CHECK: # %bb.0:27; CHECK-NEXT: feq.h a0, fa0, fa128; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma29; CHECK-NEXT: vmv.v.x v10, a030; CHECK-NEXT: vmsne.vi v0, v10, 031; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma32; CHECK-NEXT: vmerge.vvm v8, v9, v8, v033; CHECK-NEXT: ret34 %cmp = fcmp oeq half %a, %b35 %v = select i1 %cmp, <2 x half> %c, <2 x half> %d36 ret <2 x half> %v37}38 39define <4 x half> @select_v4f16(i1 zeroext %c, <4 x half> %a, <4 x half> %b) {40; CHECK-LABEL: select_v4f16:41; CHECK: # %bb.0:42; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma43; CHECK-NEXT: vmv.v.x v10, a044; CHECK-NEXT: vmsne.vi v0, v10, 045; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma46; CHECK-NEXT: vmerge.vvm v8, v9, v8, v047; CHECK-NEXT: ret48 %v = select i1 %c, <4 x half> %a, <4 x half> %b49 ret <4 x half> %v50}51 52define <4 x half> @selectcc_v4f16(half %a, half %b, <4 x half> %c, <4 x half> %d) {53; CHECK-LABEL: selectcc_v4f16:54; CHECK: # %bb.0:55; CHECK-NEXT: feq.h a0, fa0, fa156; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma57; CHECK-NEXT: vmv.v.x v10, a058; CHECK-NEXT: vmsne.vi v0, v10, 059; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma60; CHECK-NEXT: vmerge.vvm v8, v9, v8, v061; CHECK-NEXT: ret62 %cmp = fcmp oeq half %a, %b63 %v = select i1 %cmp, <4 x half> %c, <4 x half> %d64 ret <4 x half> %v65}66 67define <8 x half> @select_v8f16(i1 zeroext %c, <8 x half> %a, <8 x half> %b) {68; CHECK-LABEL: select_v8f16:69; CHECK: # %bb.0:70; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma71; CHECK-NEXT: vmv.v.x v10, a072; CHECK-NEXT: vmsne.vi v0, v10, 073; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma74; CHECK-NEXT: vmerge.vvm v8, v9, v8, v075; CHECK-NEXT: ret76 %v = select i1 %c, <8 x half> %a, <8 x half> %b77 ret <8 x half> %v78}79 80define <8 x half> @selectcc_v8f16(half %a, half %b, <8 x half> %c, <8 x half> %d) {81; CHECK-LABEL: selectcc_v8f16:82; CHECK: # %bb.0:83; CHECK-NEXT: feq.h a0, fa0, fa184; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma85; CHECK-NEXT: vmv.v.x v10, a086; CHECK-NEXT: vmsne.vi v0, v10, 087; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma88; CHECK-NEXT: vmerge.vvm v8, v9, v8, v089; CHECK-NEXT: ret90 %cmp = fcmp oeq half %a, %b91 %v = select i1 %cmp, <8 x half> %c, <8 x half> %d92 ret <8 x half> %v93}94 95define <16 x half> @select_v16f16(i1 zeroext %c, <16 x half> %a, <16 x half> %b) {96; CHECK-LABEL: select_v16f16:97; CHECK: # %bb.0:98; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma99; CHECK-NEXT: vmv.v.x v12, a0100; CHECK-NEXT: vmsne.vi v0, v12, 0101; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma102; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0103; CHECK-NEXT: ret104 %v = select i1 %c, <16 x half> %a, <16 x half> %b105 ret <16 x half> %v106}107 108define <16 x half> @selectcc_v16f16(half %a, half %b, <16 x half> %c, <16 x half> %d) {109; CHECK-LABEL: selectcc_v16f16:110; CHECK: # %bb.0:111; CHECK-NEXT: feq.h a0, fa0, fa1112; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma113; CHECK-NEXT: vmv.v.x v12, a0114; CHECK-NEXT: vmsne.vi v0, v12, 0115; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma116; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0117; CHECK-NEXT: ret118 %cmp = fcmp oeq half %a, %b119 %v = select i1 %cmp, <16 x half> %c, <16 x half> %d120 ret <16 x half> %v121}122 123define <2 x float> @select_v2f32(i1 zeroext %c, <2 x float> %a, <2 x float> %b) {124; CHECK-LABEL: select_v2f32:125; CHECK: # %bb.0:126; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma127; CHECK-NEXT: vmv.v.x v10, a0128; CHECK-NEXT: vmsne.vi v0, v10, 0129; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma130; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0131; CHECK-NEXT: ret132 %v = select i1 %c, <2 x float> %a, <2 x float> %b133 ret <2 x float> %v134}135 136define <2 x float> @selectcc_v2f32(float %a, float %b, <2 x float> %c, <2 x float> %d) {137; CHECK-LABEL: selectcc_v2f32:138; CHECK: # %bb.0:139; CHECK-NEXT: feq.s a0, fa0, fa1140; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma141; CHECK-NEXT: vmv.v.x v10, a0142; CHECK-NEXT: vmsne.vi v0, v10, 0143; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma144; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0145; CHECK-NEXT: ret146 %cmp = fcmp oeq float %a, %b147 %v = select i1 %cmp, <2 x float> %c, <2 x float> %d148 ret <2 x float> %v149}150 151define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %a, <4 x float> %b) {152; CHECK-LABEL: select_v4f32:153; CHECK: # %bb.0:154; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma155; CHECK-NEXT: vmv.v.x v10, a0156; CHECK-NEXT: vmsne.vi v0, v10, 0157; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma158; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0159; CHECK-NEXT: ret160 %v = select i1 %c, <4 x float> %a, <4 x float> %b161 ret <4 x float> %v162}163 164define <4 x float> @selectcc_v4f32(float %a, float %b, <4 x float> %c, <4 x float> %d) {165; CHECK-LABEL: selectcc_v4f32:166; CHECK: # %bb.0:167; CHECK-NEXT: feq.s a0, fa0, fa1168; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma169; CHECK-NEXT: vmv.v.x v10, a0170; CHECK-NEXT: vmsne.vi v0, v10, 0171; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma172; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0173; CHECK-NEXT: ret174 %cmp = fcmp oeq float %a, %b175 %v = select i1 %cmp, <4 x float> %c, <4 x float> %d176 ret <4 x float> %v177}178 179define <8 x float> @select_v8f32(i1 zeroext %c, <8 x float> %a, <8 x float> %b) {180; CHECK-LABEL: select_v8f32:181; CHECK: # %bb.0:182; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma183; CHECK-NEXT: vmv.v.x v12, a0184; CHECK-NEXT: vmsne.vi v0, v12, 0185; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma186; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0187; CHECK-NEXT: ret188 %v = select i1 %c, <8 x float> %a, <8 x float> %b189 ret <8 x float> %v190}191 192define <8 x float> @selectcc_v8f32(float %a, float %b, <8 x float> %c, <8 x float> %d) {193; CHECK-LABEL: selectcc_v8f32:194; CHECK: # %bb.0:195; CHECK-NEXT: feq.s a0, fa0, fa1196; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma197; CHECK-NEXT: vmv.v.x v12, a0198; CHECK-NEXT: vmsne.vi v0, v12, 0199; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma200; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0201; CHECK-NEXT: ret202 %cmp = fcmp oeq float %a, %b203 %v = select i1 %cmp, <8 x float> %c, <8 x float> %d204 ret <8 x float> %v205}206 207define <16 x float> @select_v16f32(i1 zeroext %c, <16 x float> %a, <16 x float> %b) {208; CHECK-LABEL: select_v16f32:209; CHECK: # %bb.0:210; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma211; CHECK-NEXT: vmv.v.x v16, a0212; CHECK-NEXT: vmsne.vi v0, v16, 0213; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma214; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0215; CHECK-NEXT: ret216 %v = select i1 %c, <16 x float> %a, <16 x float> %b217 ret <16 x float> %v218}219 220define <16 x float> @selectcc_v16f32(float %a, float %b, <16 x float> %c, <16 x float> %d) {221; CHECK-LABEL: selectcc_v16f32:222; CHECK: # %bb.0:223; CHECK-NEXT: feq.s a0, fa0, fa1224; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma225; CHECK-NEXT: vmv.v.x v16, a0226; CHECK-NEXT: vmsne.vi v0, v16, 0227; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma228; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0229; CHECK-NEXT: ret230 %cmp = fcmp oeq float %a, %b231 %v = select i1 %cmp, <16 x float> %c, <16 x float> %d232 ret <16 x float> %v233}234 235define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %a, <2 x double> %b) {236; CHECK-LABEL: select_v2f64:237; CHECK: # %bb.0:238; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma239; CHECK-NEXT: vmv.v.x v10, a0240; CHECK-NEXT: vmsne.vi v0, v10, 0241; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma242; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0243; CHECK-NEXT: ret244 %v = select i1 %c, <2 x double> %a, <2 x double> %b245 ret <2 x double> %v246}247 248define <2 x double> @selectcc_v2f64(double %a, double %b, <2 x double> %c, <2 x double> %d) {249; CHECK-LABEL: selectcc_v2f64:250; CHECK: # %bb.0:251; CHECK-NEXT: feq.d a0, fa0, fa1252; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma253; CHECK-NEXT: vmv.v.x v10, a0254; CHECK-NEXT: vmsne.vi v0, v10, 0255; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma256; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0257; CHECK-NEXT: ret258 %cmp = fcmp oeq double %a, %b259 %v = select i1 %cmp, <2 x double> %c, <2 x double> %d260 ret <2 x double> %v261}262 263define <4 x double> @select_v4f64(i1 zeroext %c, <4 x double> %a, <4 x double> %b) {264; CHECK-LABEL: select_v4f64:265; CHECK: # %bb.0:266; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma267; CHECK-NEXT: vmv.v.x v12, a0268; CHECK-NEXT: vmsne.vi v0, v12, 0269; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma270; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0271; CHECK-NEXT: ret272 %v = select i1 %c, <4 x double> %a, <4 x double> %b273 ret <4 x double> %v274}275 276define <4 x double> @selectcc_v4f64(double %a, double %b, <4 x double> %c, <4 x double> %d) {277; CHECK-LABEL: selectcc_v4f64:278; CHECK: # %bb.0:279; CHECK-NEXT: feq.d a0, fa0, fa1280; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma281; CHECK-NEXT: vmv.v.x v12, a0282; CHECK-NEXT: vmsne.vi v0, v12, 0283; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma284; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0285; CHECK-NEXT: ret286 %cmp = fcmp oeq double %a, %b287 %v = select i1 %cmp, <4 x double> %c, <4 x double> %d288 ret <4 x double> %v289}290 291define <8 x double> @select_v8f64(i1 zeroext %c, <8 x double> %a, <8 x double> %b) {292; CHECK-LABEL: select_v8f64:293; CHECK: # %bb.0:294; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma295; CHECK-NEXT: vmv.v.x v16, a0296; CHECK-NEXT: vmsne.vi v0, v16, 0297; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma298; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0299; CHECK-NEXT: ret300 %v = select i1 %c, <8 x double> %a, <8 x double> %b301 ret <8 x double> %v302}303 304define <8 x double> @selectcc_v8f64(double %a, double %b, <8 x double> %c, <8 x double> %d) {305; CHECK-LABEL: selectcc_v8f64:306; CHECK: # %bb.0:307; CHECK-NEXT: feq.d a0, fa0, fa1308; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma309; CHECK-NEXT: vmv.v.x v16, a0310; CHECK-NEXT: vmsne.vi v0, v16, 0311; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma312; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0313; CHECK-NEXT: ret314 %cmp = fcmp oeq double %a, %b315 %v = select i1 %cmp, <8 x double> %c, <8 x double> %d316 ret <8 x double> %v317}318 319define <16 x double> @select_v16f64(i1 zeroext %c, <16 x double> %a, <16 x double> %b) {320; CHECK-LABEL: select_v16f64:321; CHECK: # %bb.0:322; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma323; CHECK-NEXT: vmv.v.x v24, a0324; CHECK-NEXT: vmsne.vi v0, v24, 0325; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma326; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0327; CHECK-NEXT: ret328 %v = select i1 %c, <16 x double> %a, <16 x double> %b329 ret <16 x double> %v330}331 332define <16 x double> @selectcc_v16f64(double %a, double %b, <16 x double> %c, <16 x double> %d) {333; CHECK-LABEL: selectcc_v16f64:334; CHECK: # %bb.0:335; CHECK-NEXT: feq.d a0, fa0, fa1336; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma337; CHECK-NEXT: vmv.v.x v24, a0338; CHECK-NEXT: vmsne.vi v0, v24, 0339; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma340; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0341; CHECK-NEXT: ret342 %cmp = fcmp oeq double %a, %b343 %v = select i1 %cmp, <16 x double> %c, <16 x double> %d344 ret <16 x double> %v345}346