353 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 <1 x half> @vfmul_vv_v1f16(<1 x half> %va, <1 x half> %vb) strictfp {8; CHECK-LABEL: vfmul_vv_v1f16:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma11; CHECK-NEXT: vfmul.vv v8, v8, v912; CHECK-NEXT: ret13entry:14 %vc = call <1 x half> @llvm.experimental.constrained.fmul.v1f16(<1 x half> %va, <1 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")15 ret <1 x half> %vc16}17 18define <1 x half> @vfmul_vf_v1f16(<1 x half> %va, half %b) strictfp {19; CHECK-LABEL: vfmul_vf_v1f16:20; CHECK: # %bb.0:21; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma22; CHECK-NEXT: vfmul.vf v8, v8, fa023; CHECK-NEXT: ret24 %head = insertelement <1 x half> poison, half %b, i32 025 %splat = shufflevector <1 x half> %head, <1 x half> poison, <1 x i32> zeroinitializer26 %vc = call <1 x half> @llvm.experimental.constrained.fmul.v1f16(<1 x half> %va, <1 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")27 ret <1 x half> %vc28}29 30define <2 x half> @vfmul_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp {31; CHECK-LABEL: vfmul_vv_v2f16:32; CHECK: # %bb.0: # %entry33; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma34; CHECK-NEXT: vfmul.vv v8, v8, v935; CHECK-NEXT: ret36entry:37 %vc = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %va, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")38 ret <2 x half> %vc39}40 41define <2 x half> @vfmul_vf_v2f16(<2 x half> %va, half %b) strictfp {42; CHECK-LABEL: vfmul_vf_v2f16:43; CHECK: # %bb.0:44; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma45; CHECK-NEXT: vfmul.vf v8, v8, fa046; CHECK-NEXT: ret47 %head = insertelement <2 x half> poison, half %b, i32 048 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer49 %vc = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %va, <2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")50 ret <2 x half> %vc51}52 53define <4 x half> @vfmul_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp {54; CHECK-LABEL: vfmul_vv_v4f16:55; CHECK: # %bb.0: # %entry56; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma57; CHECK-NEXT: vfmul.vv v8, v8, v958; CHECK-NEXT: ret59entry:60 %vc = call <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half> %va, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")61 ret <4 x half> %vc62}63 64define <4 x half> @vfmul_vf_v4f16(<4 x half> %va, half %b) strictfp {65; CHECK-LABEL: vfmul_vf_v4f16:66; CHECK: # %bb.0:67; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma68; CHECK-NEXT: vfmul.vf v8, v8, fa069; CHECK-NEXT: ret70 %head = insertelement <4 x half> poison, half %b, i32 071 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer72 %vc = call <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half> %va, <4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")73 ret <4 x half> %vc74}75 76define <8 x half> @vfmul_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp {77; CHECK-LABEL: vfmul_vv_v8f16:78; CHECK: # %bb.0: # %entry79; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma80; CHECK-NEXT: vfmul.vv v8, v8, v981; CHECK-NEXT: ret82entry:83 %vc = call <8 x half> @llvm.experimental.constrained.fmul.v8f16(<8 x half> %va, <8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")84 ret <8 x half> %vc85}86 87define <8 x half> @vfmul_vf_v8f16(<8 x half> %va, half %b) strictfp {88; CHECK-LABEL: vfmul_vf_v8f16:89; CHECK: # %bb.0:90; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma91; CHECK-NEXT: vfmul.vf v8, v8, fa092; CHECK-NEXT: ret93 %head = insertelement <8 x half> poison, half %b, i32 094 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer95 %vc = call <8 x half> @llvm.experimental.constrained.fmul.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")96 ret <8 x half> %vc97}98 99define <16 x half> @vfmul_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp {100; CHECK-LABEL: vfmul_vv_v16f16:101; CHECK: # %bb.0: # %entry102; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma103; CHECK-NEXT: vfmul.vv v8, v8, v10104; CHECK-NEXT: ret105entry:106 %vc = call <16 x half> @llvm.experimental.constrained.fmul.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")107 ret <16 x half> %vc108}109 110define <16 x half> @vfmul_vf_v16f16(<16 x half> %va, half %b) strictfp {111; CHECK-LABEL: vfmul_vf_v16f16:112; CHECK: # %bb.0:113; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma114; CHECK-NEXT: vfmul.vf v8, v8, fa0115; CHECK-NEXT: ret116 %head = insertelement <16 x half> poison, half %b, i32 0117 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer118 %vc = call <16 x half> @llvm.experimental.constrained.fmul.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")119 ret <16 x half> %vc120}121 122define <32 x half> @vfmul_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp {123; CHECK-LABEL: vfmul_vv_v32f16:124; CHECK: # %bb.0: # %entry125; CHECK-NEXT: li a0, 32126; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma127; CHECK-NEXT: vfmul.vv v8, v8, v12128; CHECK-NEXT: ret129entry:130 %vc = call <32 x half> @llvm.experimental.constrained.fmul.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")131 ret <32 x half> %vc132}133 134define <32 x half> @vfmul_vf_v32f16(<32 x half> %va, half %b) strictfp {135; CHECK-LABEL: vfmul_vf_v32f16:136; CHECK: # %bb.0:137; CHECK-NEXT: li a0, 32138; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma139; CHECK-NEXT: vfmul.vf v8, v8, fa0140; CHECK-NEXT: ret141 %head = insertelement <32 x half> poison, half %b, i32 0142 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer143 %vc = call <32 x half> @llvm.experimental.constrained.fmul.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")144 ret <32 x half> %vc145}146 147define <1 x float> @vfmul_vv_v1f32(<1 x float> %va, <1 x float> %vb) strictfp {148; CHECK-LABEL: vfmul_vv_v1f32:149; CHECK: # %bb.0: # %entry150; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma151; CHECK-NEXT: vfmul.vv v8, v8, v9152; CHECK-NEXT: ret153entry:154 %vc = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float> %va, <1 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")155 ret <1 x float> %vc156}157 158define <1 x float> @vfmul_vf_v1f32(<1 x float> %va, float %b) strictfp {159; CHECK-LABEL: vfmul_vf_v1f32:160; CHECK: # %bb.0:161; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma162; CHECK-NEXT: vfmul.vf v8, v8, fa0163; CHECK-NEXT: ret164 %head = insertelement <1 x float> poison, float %b, i32 0165 %splat = shufflevector <1 x float> %head, <1 x float> poison, <1 x i32> zeroinitializer166 %vc = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float> %va, <1 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")167 ret <1 x float> %vc168}169 170define <2 x float> @vfmul_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp {171; CHECK-LABEL: vfmul_vv_v2f32:172; CHECK: # %bb.0: # %entry173; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma174; CHECK-NEXT: vfmul.vv v8, v8, v9175; CHECK-NEXT: ret176entry:177 %vc = call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")178 ret <2 x float> %vc179}180 181define <2 x float> @vfmul_vf_v2f32(<2 x float> %va, float %b) strictfp {182; CHECK-LABEL: vfmul_vf_v2f32:183; CHECK: # %bb.0:184; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma185; CHECK-NEXT: vfmul.vf v8, v8, fa0186; CHECK-NEXT: ret187 %head = insertelement <2 x float> poison, float %b, i32 0188 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer189 %vc = call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")190 ret <2 x float> %vc191}192 193define <4 x float> @vfmul_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp {194; CHECK-LABEL: vfmul_vv_v4f32:195; CHECK: # %bb.0: # %entry196; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma197; CHECK-NEXT: vfmul.vv v8, v8, v9198; CHECK-NEXT: ret199entry:200 %vc = call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")201 ret <4 x float> %vc202}203 204define <4 x float> @vfmul_vf_v4f32(<4 x float> %va, float %b) strictfp {205; CHECK-LABEL: vfmul_vf_v4f32:206; CHECK: # %bb.0:207; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma208; CHECK-NEXT: vfmul.vf v8, v8, fa0209; CHECK-NEXT: ret210 %head = insertelement <4 x float> poison, float %b, i32 0211 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer212 %vc = call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")213 ret <4 x float> %vc214}215 216define <8 x float> @vfmul_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp {217; CHECK-LABEL: vfmul_vv_v8f32:218; CHECK: # %bb.0: # %entry219; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma220; CHECK-NEXT: vfmul.vv v8, v8, v10221; CHECK-NEXT: ret222entry:223 %vc = call <8 x float> @llvm.experimental.constrained.fmul.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")224 ret <8 x float> %vc225}226 227define <8 x float> @vfmul_vf_v8f32(<8 x float> %va, float %b) strictfp {228; CHECK-LABEL: vfmul_vf_v8f32:229; CHECK: # %bb.0:230; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma231; CHECK-NEXT: vfmul.vf v8, v8, fa0232; CHECK-NEXT: ret233 %head = insertelement <8 x float> poison, float %b, i32 0234 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer235 %vc = call <8 x float> @llvm.experimental.constrained.fmul.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")236 ret <8 x float> %vc237}238 239define <16 x float> @vfmul_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp {240; CHECK-LABEL: vfmul_vv_v16f32:241; CHECK: # %bb.0: # %entry242; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma243; CHECK-NEXT: vfmul.vv v8, v8, v12244; CHECK-NEXT: ret245entry:246 %vc = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")247 ret <16 x float> %vc248}249 250define <16 x float> @vfmul_vf_v16f32(<16 x float> %va, float %b) strictfp {251; CHECK-LABEL: vfmul_vf_v16f32:252; CHECK: # %bb.0:253; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma254; CHECK-NEXT: vfmul.vf v8, v8, fa0255; CHECK-NEXT: ret256 %head = insertelement <16 x float> poison, float %b, i32 0257 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer258 %vc = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")259 ret <16 x float> %vc260}261 262define <1 x double> @vfmul_vv_v1f64(<1 x double> %va, <1 x double> %vb) strictfp {263; CHECK-LABEL: vfmul_vv_v1f64:264; CHECK: # %bb.0: # %entry265; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma266; CHECK-NEXT: vfmul.vv v8, v8, v9267; CHECK-NEXT: ret268entry:269 %vc = call <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double> %va, <1 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")270 ret <1 x double> %vc271}272 273define <1 x double> @vfmul_vf_v1f64(<1 x double> %va, double %b) strictfp {274; CHECK-LABEL: vfmul_vf_v1f64:275; CHECK: # %bb.0:276; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma277; CHECK-NEXT: vfmul.vf v8, v8, fa0278; CHECK-NEXT: ret279 %head = insertelement <1 x double> poison, double %b, i32 0280 %splat = shufflevector <1 x double> %head, <1 x double> poison, <1 x i32> zeroinitializer281 %vc = call <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double> %va, <1 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")282 ret <1 x double> %vc283}284 285define <2 x double> @vfmul_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp {286; CHECK-LABEL: vfmul_vv_v2f64:287; CHECK: # %bb.0: # %entry288; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma289; CHECK-NEXT: vfmul.vv v8, v8, v9290; CHECK-NEXT: ret291entry:292 %vc = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")293 ret <2 x double> %vc294}295 296define <2 x double> @vfmul_vf_v2f64(<2 x double> %va, double %b) strictfp {297; CHECK-LABEL: vfmul_vf_v2f64:298; CHECK: # %bb.0:299; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma300; CHECK-NEXT: vfmul.vf v8, v8, fa0301; CHECK-NEXT: ret302 %head = insertelement <2 x double> poison, double %b, i32 0303 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer304 %vc = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")305 ret <2 x double> %vc306}307 308define <4 x double> @vfmul_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp {309; CHECK-LABEL: vfmul_vv_v4f64:310; CHECK: # %bb.0: # %entry311; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma312; CHECK-NEXT: vfmul.vv v8, v8, v10313; CHECK-NEXT: ret314entry:315 %vc = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")316 ret <4 x double> %vc317}318 319define <4 x double> @vfmul_vf_v4f64(<4 x double> %va, double %b) strictfp {320; CHECK-LABEL: vfmul_vf_v4f64:321; CHECK: # %bb.0:322; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma323; CHECK-NEXT: vfmul.vf v8, v8, fa0324; CHECK-NEXT: ret325 %head = insertelement <4 x double> poison, double %b, i32 0326 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer327 %vc = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")328 ret <4 x double> %vc329}330 331define <8 x double> @vfmul_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp {332; CHECK-LABEL: vfmul_vv_v8f64:333; CHECK: # %bb.0: # %entry334; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma335; CHECK-NEXT: vfmul.vv v8, v8, v12336; CHECK-NEXT: ret337entry:338 %vc = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")339 ret <8 x double> %vc340}341 342define <8 x double> @vfmul_vf_v8f64(<8 x double> %va, double %b) strictfp {343; CHECK-LABEL: vfmul_vf_v8f64:344; CHECK: # %bb.0:345; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma346; CHECK-NEXT: vfmul.vf v8, v8, fa0347; CHECK-NEXT: ret348 %head = insertelement <8 x double> poison, double %b, i32 0349 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer350 %vc = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")351 ret <8 x double> %vc352}353