320 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6 7define <2 x half> @vfsub_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp {8; CHECK-LABEL: vfsub_vv_v2f16:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma11; CHECK-NEXT: vfsub.vv v8, v8, v912; CHECK-NEXT: ret13entry:14 %vc = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %va, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")15 ret <2 x half> %vc16}17 18define <2 x half> @vfsub_vf_v2f16(<2 x half> %va, half %b) strictfp {19; CHECK-LABEL: vfsub_vf_v2f16:20; CHECK: # %bb.0:21; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma22; CHECK-NEXT: vfsub.vf v8, v8, fa023; CHECK-NEXT: ret24 %head = insertelement <2 x half> poison, half %b, i32 025 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer26 %vc = call <2 x half> @llvm.experimental.constrained.fsub.v2f16(<2 x half> %va, <2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")27 ret <2 x half> %vc28}29 30define <4 x half> @vfsub_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp {31; CHECK-LABEL: vfsub_vv_v4f16:32; CHECK: # %bb.0: # %entry33; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma34; CHECK-NEXT: vfsub.vv v8, v8, v935; CHECK-NEXT: ret36entry:37 %vc = call <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half> %va, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")38 ret <4 x half> %vc39}40 41define <4 x half> @vfsub_vf_v4f16(<4 x half> %va, half %b) strictfp {42; CHECK-LABEL: vfsub_vf_v4f16:43; CHECK: # %bb.0:44; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma45; CHECK-NEXT: vfsub.vf v8, v8, fa046; CHECK-NEXT: ret47 %head = insertelement <4 x half> poison, half %b, i32 048 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer49 %vc = call <4 x half> @llvm.experimental.constrained.fsub.v4f16(<4 x half> %va, <4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")50 ret <4 x half> %vc51}52 53define <8 x half> @vfsub_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp {54; CHECK-LABEL: vfsub_vv_v8f16:55; CHECK: # %bb.0: # %entry56; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma57; CHECK-NEXT: vfsub.vv v8, v8, v958; CHECK-NEXT: ret59entry:60 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %va, <8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")61 ret <8 x half> %vc62}63 64define <8 x half> @vfsub_vf_v8f16(<8 x half> %va, half %b) strictfp {65; CHECK-LABEL: vfsub_vf_v8f16:66; CHECK: # %bb.0:67; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma68; CHECK-NEXT: vfsub.vf v8, v8, fa069; CHECK-NEXT: ret70 %head = insertelement <8 x half> poison, half %b, i32 071 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer72 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")73 ret <8 x half> %vc74}75 76define <8 x half> @vfsub_fv_v8f16(<8 x half> %va, half %b) strictfp {77; CHECK-LABEL: vfsub_fv_v8f16:78; CHECK: # %bb.0:79; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma80; CHECK-NEXT: vfrsub.vf v8, v8, fa081; CHECK-NEXT: ret82 %head = insertelement <8 x half> poison, half %b, i32 083 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer84 %vc = call <8 x half> @llvm.experimental.constrained.fsub.v8f16(<8 x half> %splat, <8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")85 ret <8 x half> %vc86}87 88define <16 x half> @vfsub_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp {89; CHECK-LABEL: vfsub_vv_v16f16:90; CHECK: # %bb.0: # %entry91; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma92; CHECK-NEXT: vfsub.vv v8, v8, v1093; CHECK-NEXT: ret94entry:95 %vc = call <16 x half> @llvm.experimental.constrained.fsub.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")96 ret <16 x half> %vc97}98 99define <16 x half> @vfsub_vf_v16f16(<16 x half> %va, half %b) strictfp {100; CHECK-LABEL: vfsub_vf_v16f16:101; CHECK: # %bb.0:102; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma103; CHECK-NEXT: vfsub.vf v8, v8, fa0104; CHECK-NEXT: ret105 %head = insertelement <16 x half> poison, half %b, i32 0106 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer107 %vc = call <16 x half> @llvm.experimental.constrained.fsub.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")108 ret <16 x half> %vc109}110 111define <32 x half> @vfsub_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp {112; CHECK-LABEL: vfsub_vv_v32f16:113; CHECK: # %bb.0: # %entry114; CHECK-NEXT: li a0, 32115; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma116; CHECK-NEXT: vfsub.vv v8, v8, v12117; CHECK-NEXT: ret118entry:119 %vc = call <32 x half> @llvm.experimental.constrained.fsub.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")120 ret <32 x half> %vc121}122 123define <32 x half> @vfsub_vf_v32f16(<32 x half> %va, half %b) strictfp {124; CHECK-LABEL: vfsub_vf_v32f16:125; CHECK: # %bb.0:126; CHECK-NEXT: li a0, 32127; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma128; CHECK-NEXT: vfsub.vf v8, v8, fa0129; CHECK-NEXT: ret130 %head = insertelement <32 x half> poison, half %b, i32 0131 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer132 %vc = call <32 x half> @llvm.experimental.constrained.fsub.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")133 ret <32 x half> %vc134}135 136define <2 x float> @vfsub_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp {137; CHECK-LABEL: vfsub_vv_v2f32:138; CHECK: # %bb.0: # %entry139; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma140; CHECK-NEXT: vfsub.vv v8, v8, v9141; CHECK-NEXT: ret142entry:143 %vc = call <2 x float> @llvm.experimental.constrained.fsub.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")144 ret <2 x float> %vc145}146 147define <2 x float> @vfsub_vf_v2f32(<2 x float> %va, float %b) strictfp {148; CHECK-LABEL: vfsub_vf_v2f32:149; CHECK: # %bb.0:150; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma151; CHECK-NEXT: vfsub.vf v8, v8, fa0152; CHECK-NEXT: ret153 %head = insertelement <2 x float> poison, float %b, i32 0154 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer155 %vc = call <2 x float> @llvm.experimental.constrained.fsub.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")156 ret <2 x float> %vc157}158 159define <4 x float> @vfsub_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp {160; CHECK-LABEL: vfsub_vv_v4f32:161; CHECK: # %bb.0: # %entry162; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma163; CHECK-NEXT: vfsub.vv v8, v8, v9164; CHECK-NEXT: ret165entry:166 %vc = call <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")167 ret <4 x float> %vc168}169 170define <4 x float> @vfsub_vf_v4f32(<4 x float> %va, float %b) strictfp {171; CHECK-LABEL: vfsub_vf_v4f32:172; CHECK: # %bb.0:173; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma174; CHECK-NEXT: vfsub.vf v8, v8, fa0175; CHECK-NEXT: ret176 %head = insertelement <4 x float> poison, float %b, i32 0177 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer178 %vc = call <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")179 ret <4 x float> %vc180}181 182define <8 x float> @vfsub_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp {183; CHECK-LABEL: vfsub_vv_v8f32:184; CHECK: # %bb.0: # %entry185; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma186; CHECK-NEXT: vfsub.vv v8, v8, v10187; CHECK-NEXT: ret188entry:189 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")190 ret <8 x float> %vc191}192 193define <8 x float> @vfsub_vf_v8f32(<8 x float> %va, float %b) strictfp {194; CHECK-LABEL: vfsub_vf_v8f32:195; CHECK: # %bb.0:196; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma197; CHECK-NEXT: vfsub.vf v8, v8, fa0198; CHECK-NEXT: ret199 %head = insertelement <8 x float> poison, float %b, i32 0200 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer201 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")202 ret <8 x float> %vc203}204 205define <8 x float> @vfsub_fv_v8f32(<8 x float> %va, float %b) strictfp {206; CHECK-LABEL: vfsub_fv_v8f32:207; CHECK: # %bb.0:208; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma209; CHECK-NEXT: vfrsub.vf v8, v8, fa0210; CHECK-NEXT: ret211 %head = insertelement <8 x float> poison, float %b, i32 0212 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer213 %vc = call <8 x float> @llvm.experimental.constrained.fsub.v8f32(<8 x float> %splat, <8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")214 ret <8 x float> %vc215}216 217define <16 x float> @vfsub_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp {218; CHECK-LABEL: vfsub_vv_v16f32:219; CHECK: # %bb.0: # %entry220; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma221; CHECK-NEXT: vfsub.vv v8, v8, v12222; CHECK-NEXT: ret223entry:224 %vc = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")225 ret <16 x float> %vc226}227 228define <16 x float> @vfsub_vf_v16f32(<16 x float> %va, float %b) strictfp {229; CHECK-LABEL: vfsub_vf_v16f32:230; CHECK: # %bb.0:231; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma232; CHECK-NEXT: vfsub.vf v8, v8, fa0233; CHECK-NEXT: ret234 %head = insertelement <16 x float> poison, float %b, i32 0235 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer236 %vc = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")237 ret <16 x float> %vc238}239 240define <2 x double> @vfsub_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp {241; CHECK-LABEL: vfsub_vv_v2f64:242; CHECK: # %bb.0: # %entry243; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma244; CHECK-NEXT: vfsub.vv v8, v8, v9245; CHECK-NEXT: ret246entry:247 %vc = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")248 ret <2 x double> %vc249}250 251define <2 x double> @vfsub_vf_v2f64(<2 x double> %va, double %b) strictfp {252; CHECK-LABEL: vfsub_vf_v2f64:253; CHECK: # %bb.0:254; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma255; CHECK-NEXT: vfsub.vf v8, v8, fa0256; CHECK-NEXT: ret257 %head = insertelement <2 x double> poison, double %b, i32 0258 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer259 %vc = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")260 ret <2 x double> %vc261}262 263define <4 x double> @vfsub_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp {264; CHECK-LABEL: vfsub_vv_v4f64:265; CHECK: # %bb.0: # %entry266; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma267; CHECK-NEXT: vfsub.vv v8, v8, v10268; CHECK-NEXT: ret269entry:270 %vc = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")271 ret <4 x double> %vc272}273 274define <4 x double> @vfsub_vf_v4f64(<4 x double> %va, double %b) strictfp {275; CHECK-LABEL: vfsub_vf_v4f64:276; CHECK: # %bb.0:277; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma278; CHECK-NEXT: vfsub.vf v8, v8, fa0279; CHECK-NEXT: ret280 %head = insertelement <4 x double> poison, double %b, i32 0281 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer282 %vc = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")283 ret <4 x double> %vc284}285 286define <8 x double> @vfsub_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp {287; CHECK-LABEL: vfsub_vv_v8f64:288; CHECK: # %bb.0: # %entry289; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma290; CHECK-NEXT: vfsub.vv v8, v8, v12291; CHECK-NEXT: ret292entry:293 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")294 ret <8 x double> %vc295}296 297define <8 x double> @vfsub_vf_v8f64(<8 x double> %va, double %b) strictfp {298; CHECK-LABEL: vfsub_vf_v8f64:299; CHECK: # %bb.0:300; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma301; CHECK-NEXT: vfsub.vf v8, v8, fa0302; CHECK-NEXT: ret303 %head = insertelement <8 x double> poison, double %b, i32 0304 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer305 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")306 ret <8 x double> %vc307}308 309define <8 x double> @vfsub_fv_v8f64(<8 x double> %va, double %b) strictfp {310; CHECK-LABEL: vfsub_fv_v8f64:311; CHECK: # %bb.0:312; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma313; CHECK-NEXT: vfrsub.vf v8, v8, fa0314; CHECK-NEXT: ret315 %head = insertelement <8 x double> poison, double %b, i32 0316 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer317 %vc = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %splat, <8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")318 ret <8 x double> %vc319}320