1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s 6 7declare <1 x half> @llvm.experimental.constrained.fmul.v1f16(<1 x half>, <1 x half>, metadata, metadata) 8define <1 x half> @vfmul_vv_v1f16(<1 x half> %va, <1 x half> %vb) strictfp { 9; CHECK-LABEL: vfmul_vv_v1f16: 10; CHECK: # %bb.0: # %entry 11; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma 12; CHECK-NEXT: vfmul.vv v8, v8, v9 13; CHECK-NEXT: ret 14entry: 15 %vc = call <1 x half> @llvm.experimental.constrained.fmul.v1f16(<1 x half> %va, <1 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 16 ret <1 x half> %vc 17} 18 19define <1 x half> @vfmul_vf_v1f16(<1 x half> %va, half %b) strictfp { 20; CHECK-LABEL: vfmul_vf_v1f16: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma 23; CHECK-NEXT: vfmul.vf v8, v8, fa0 24; CHECK-NEXT: ret 25 %head = insertelement <1 x half> poison, half %b, i32 0 26 %splat = shufflevector <1 x half> %head, <1 x half> poison, <1 x i32> zeroinitializer 27 %vc = call <1 x half> @llvm.experimental.constrained.fmul.v1f16(<1 x half> %va, <1 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 28 ret <1 x half> %vc 29} 30 31declare <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half>, <2 x half>, metadata, metadata) 32define <2 x half> @vfmul_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp { 33; CHECK-LABEL: vfmul_vv_v2f16: 34; CHECK: # %bb.0: # %entry 35; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 36; CHECK-NEXT: vfmul.vv v8, v8, v9 37; CHECK-NEXT: ret 38entry: 39 %vc = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %va, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 40 ret <2 x half> %vc 41} 42 43define <2 x half> @vfmul_vf_v2f16(<2 x half> %va, half %b) strictfp { 44; CHECK-LABEL: vfmul_vf_v2f16: 45; CHECK: # %bb.0: 46; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 47; CHECK-NEXT: vfmul.vf v8, v8, fa0 48; CHECK-NEXT: ret 49 %head = insertelement <2 x half> poison, half %b, i32 0 50 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer 51 %vc = call <2 x half> @llvm.experimental.constrained.fmul.v2f16(<2 x half> %va, <2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 52 ret <2 x half> %vc 53} 54 55declare <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half>, <4 x half>, metadata, metadata) 56define <4 x half> @vfmul_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp { 57; CHECK-LABEL: vfmul_vv_v4f16: 58; CHECK: # %bb.0: # %entry 59; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 60; CHECK-NEXT: vfmul.vv v8, v8, v9 61; CHECK-NEXT: ret 62entry: 63 %vc = call <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half> %va, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 64 ret <4 x half> %vc 65} 66 67define <4 x half> @vfmul_vf_v4f16(<4 x half> %va, half %b) strictfp { 68; CHECK-LABEL: vfmul_vf_v4f16: 69; CHECK: # %bb.0: 70; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 71; CHECK-NEXT: vfmul.vf v8, v8, fa0 72; CHECK-NEXT: ret 73 %head = insertelement <4 x half> poison, half %b, i32 0 74 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer 75 %vc = call <4 x half> @llvm.experimental.constrained.fmul.v4f16(<4 x half> %va, <4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 76 ret <4 x half> %vc 77} 78 79declare <8 x half> @llvm.experimental.constrained.fmul.v8f16(<8 x half>, <8 x half>, metadata, metadata) 80define <8 x half> @vfmul_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp { 81; CHECK-LABEL: vfmul_vv_v8f16: 82; CHECK: # %bb.0: # %entry 83; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 84; CHECK-NEXT: vfmul.vv v8, v8, v9 85; CHECK-NEXT: ret 86entry: 87 %vc = call <8 x half> @llvm.experimental.constrained.fmul.v8f16(<8 x half> %va, <8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 88 ret <8 x half> %vc 89} 90 91define <8 x half> @vfmul_vf_v8f16(<8 x half> %va, half %b) strictfp { 92; CHECK-LABEL: vfmul_vf_v8f16: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 95; CHECK-NEXT: vfmul.vf v8, v8, fa0 96; CHECK-NEXT: ret 97 %head = insertelement <8 x half> poison, half %b, i32 0 98 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer 99 %vc = call <8 x half> @llvm.experimental.constrained.fmul.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 100 ret <8 x half> %vc 101} 102 103declare <16 x half> @llvm.experimental.constrained.fmul.v16f16(<16 x half>, <16 x half>, metadata, metadata) 104define <16 x half> @vfmul_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp { 105; CHECK-LABEL: vfmul_vv_v16f16: 106; CHECK: # %bb.0: # %entry 107; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 108; CHECK-NEXT: vfmul.vv v8, v8, v10 109; CHECK-NEXT: ret 110entry: 111 %vc = call <16 x half> @llvm.experimental.constrained.fmul.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 112 ret <16 x half> %vc 113} 114 115define <16 x half> @vfmul_vf_v16f16(<16 x half> %va, half %b) strictfp { 116; CHECK-LABEL: vfmul_vf_v16f16: 117; CHECK: # %bb.0: 118; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 119; CHECK-NEXT: vfmul.vf v8, v8, fa0 120; CHECK-NEXT: ret 121 %head = insertelement <16 x half> poison, half %b, i32 0 122 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer 123 %vc = call <16 x half> @llvm.experimental.constrained.fmul.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 124 ret <16 x half> %vc 125} 126 127declare <32 x half> @llvm.experimental.constrained.fmul.v32f16(<32 x half>, <32 x half>, metadata, metadata) 128define <32 x half> @vfmul_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp { 129; CHECK-LABEL: vfmul_vv_v32f16: 130; CHECK: # %bb.0: # %entry 131; CHECK-NEXT: li a0, 32 132; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 133; CHECK-NEXT: vfmul.vv v8, v8, v12 134; CHECK-NEXT: ret 135entry: 136 %vc = call <32 x half> @llvm.experimental.constrained.fmul.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 137 ret <32 x half> %vc 138} 139 140define <32 x half> @vfmul_vf_v32f16(<32 x half> %va, half %b) strictfp { 141; CHECK-LABEL: vfmul_vf_v32f16: 142; CHECK: # %bb.0: 143; CHECK-NEXT: li a0, 32 144; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 145; CHECK-NEXT: vfmul.vf v8, v8, fa0 146; CHECK-NEXT: ret 147 %head = insertelement <32 x half> poison, half %b, i32 0 148 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer 149 %vc = call <32 x half> @llvm.experimental.constrained.fmul.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 150 ret <32 x half> %vc 151} 152 153declare <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float>, <1 x float>, metadata, metadata) 154define <1 x float> @vfmul_vv_v1f32(<1 x float> %va, <1 x float> %vb) strictfp { 155; CHECK-LABEL: vfmul_vv_v1f32: 156; CHECK: # %bb.0: # %entry 157; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 158; CHECK-NEXT: vfmul.vv v8, v8, v9 159; CHECK-NEXT: ret 160entry: 161 %vc = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float> %va, <1 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 162 ret <1 x float> %vc 163} 164 165define <1 x float> @vfmul_vf_v1f32(<1 x float> %va, float %b) strictfp { 166; CHECK-LABEL: vfmul_vf_v1f32: 167; CHECK: # %bb.0: 168; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 169; CHECK-NEXT: vfmul.vf v8, v8, fa0 170; CHECK-NEXT: ret 171 %head = insertelement <1 x float> poison, float %b, i32 0 172 %splat = shufflevector <1 x float> %head, <1 x float> poison, <1 x i32> zeroinitializer 173 %vc = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(<1 x float> %va, <1 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 174 ret <1 x float> %vc 175} 176 177declare <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float>, <2 x float>, metadata, metadata) 178define <2 x float> @vfmul_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp { 179; CHECK-LABEL: vfmul_vv_v2f32: 180; CHECK: # %bb.0: # %entry 181; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 182; CHECK-NEXT: vfmul.vv v8, v8, v9 183; CHECK-NEXT: ret 184entry: 185 %vc = call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 186 ret <2 x float> %vc 187} 188 189define <2 x float> @vfmul_vf_v2f32(<2 x float> %va, float %b) strictfp { 190; CHECK-LABEL: vfmul_vf_v2f32: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 193; CHECK-NEXT: vfmul.vf v8, v8, fa0 194; CHECK-NEXT: ret 195 %head = insertelement <2 x float> poison, float %b, i32 0 196 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer 197 %vc = call <2 x float> @llvm.experimental.constrained.fmul.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 198 ret <2 x float> %vc 199} 200 201declare <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float>, <4 x float>, metadata, metadata) 202define <4 x float> @vfmul_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp { 203; CHECK-LABEL: vfmul_vv_v4f32: 204; CHECK: # %bb.0: # %entry 205; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 206; CHECK-NEXT: vfmul.vv v8, v8, v9 207; CHECK-NEXT: ret 208entry: 209 %vc = call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 210 ret <4 x float> %vc 211} 212 213define <4 x float> @vfmul_vf_v4f32(<4 x float> %va, float %b) strictfp { 214; CHECK-LABEL: vfmul_vf_v4f32: 215; CHECK: # %bb.0: 216; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 217; CHECK-NEXT: vfmul.vf v8, v8, fa0 218; CHECK-NEXT: ret 219 %head = insertelement <4 x float> poison, float %b, i32 0 220 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer 221 %vc = call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 222 ret <4 x float> %vc 223} 224 225declare <8 x float> @llvm.experimental.constrained.fmul.v8f32(<8 x float>, <8 x float>, metadata, metadata) 226define <8 x float> @vfmul_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp { 227; CHECK-LABEL: vfmul_vv_v8f32: 228; CHECK: # %bb.0: # %entry 229; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 230; CHECK-NEXT: vfmul.vv v8, v8, v10 231; CHECK-NEXT: ret 232entry: 233 %vc = call <8 x float> @llvm.experimental.constrained.fmul.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 234 ret <8 x float> %vc 235} 236 237define <8 x float> @vfmul_vf_v8f32(<8 x float> %va, float %b) strictfp { 238; CHECK-LABEL: vfmul_vf_v8f32: 239; CHECK: # %bb.0: 240; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 241; CHECK-NEXT: vfmul.vf v8, v8, fa0 242; CHECK-NEXT: ret 243 %head = insertelement <8 x float> poison, float %b, i32 0 244 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer 245 %vc = call <8 x float> @llvm.experimental.constrained.fmul.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 246 ret <8 x float> %vc 247} 248 249declare <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float>, <16 x float>, metadata, metadata) 250define <16 x float> @vfmul_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp { 251; CHECK-LABEL: vfmul_vv_v16f32: 252; CHECK: # %bb.0: # %entry 253; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 254; CHECK-NEXT: vfmul.vv v8, v8, v12 255; CHECK-NEXT: ret 256entry: 257 %vc = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 258 ret <16 x float> %vc 259} 260 261define <16 x float> @vfmul_vf_v16f32(<16 x float> %va, float %b) strictfp { 262; CHECK-LABEL: vfmul_vf_v16f32: 263; CHECK: # %bb.0: 264; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 265; CHECK-NEXT: vfmul.vf v8, v8, fa0 266; CHECK-NEXT: ret 267 %head = insertelement <16 x float> poison, float %b, i32 0 268 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer 269 %vc = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 270 ret <16 x float> %vc 271} 272 273declare <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double>, <1 x double>, metadata, metadata) 274define <1 x double> @vfmul_vv_v1f64(<1 x double> %va, <1 x double> %vb) strictfp { 275; CHECK-LABEL: vfmul_vv_v1f64: 276; CHECK: # %bb.0: # %entry 277; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma 278; CHECK-NEXT: vfmul.vv v8, v8, v9 279; CHECK-NEXT: ret 280entry: 281 %vc = call <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double> %va, <1 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 282 ret <1 x double> %vc 283} 284 285define <1 x double> @vfmul_vf_v1f64(<1 x double> %va, double %b) strictfp { 286; CHECK-LABEL: vfmul_vf_v1f64: 287; CHECK: # %bb.0: 288; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma 289; CHECK-NEXT: vfmul.vf v8, v8, fa0 290; CHECK-NEXT: ret 291 %head = insertelement <1 x double> poison, double %b, i32 0 292 %splat = shufflevector <1 x double> %head, <1 x double> poison, <1 x i32> zeroinitializer 293 %vc = call <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double> %va, <1 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 294 ret <1 x double> %vc 295} 296 297declare <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double>, <2 x double>, metadata, metadata) 298define <2 x double> @vfmul_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp { 299; CHECK-LABEL: vfmul_vv_v2f64: 300; CHECK: # %bb.0: # %entry 301; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 302; CHECK-NEXT: vfmul.vv v8, v8, v9 303; CHECK-NEXT: ret 304entry: 305 %vc = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 306 ret <2 x double> %vc 307} 308 309define <2 x double> @vfmul_vf_v2f64(<2 x double> %va, double %b) strictfp { 310; CHECK-LABEL: vfmul_vf_v2f64: 311; CHECK: # %bb.0: 312; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 313; CHECK-NEXT: vfmul.vf v8, v8, fa0 314; CHECK-NEXT: ret 315 %head = insertelement <2 x double> poison, double %b, i32 0 316 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer 317 %vc = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 318 ret <2 x double> %vc 319} 320 321declare <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double>, <4 x double>, metadata, metadata) 322define <4 x double> @vfmul_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp { 323; CHECK-LABEL: vfmul_vv_v4f64: 324; CHECK: # %bb.0: # %entry 325; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 326; CHECK-NEXT: vfmul.vv v8, v8, v10 327; CHECK-NEXT: ret 328entry: 329 %vc = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 330 ret <4 x double> %vc 331} 332 333define <4 x double> @vfmul_vf_v4f64(<4 x double> %va, double %b) strictfp { 334; CHECK-LABEL: vfmul_vf_v4f64: 335; CHECK: # %bb.0: 336; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 337; CHECK-NEXT: vfmul.vf v8, v8, fa0 338; CHECK-NEXT: ret 339 %head = insertelement <4 x double> poison, double %b, i32 0 340 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer 341 %vc = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 342 ret <4 x double> %vc 343} 344 345declare <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double>, <8 x double>, metadata, metadata) 346define <8 x double> @vfmul_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp { 347; CHECK-LABEL: vfmul_vv_v8f64: 348; CHECK: # %bb.0: # %entry 349; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 350; CHECK-NEXT: vfmul.vv v8, v8, v12 351; CHECK-NEXT: ret 352entry: 353 %vc = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 354 ret <8 x double> %vc 355} 356 357define <8 x double> @vfmul_vf_v8f64(<8 x double> %va, double %b) strictfp { 358; CHECK-LABEL: vfmul_vf_v8f64: 359; CHECK: # %bb.0: 360; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 361; CHECK-NEXT: vfmul.vf v8, v8, fa0 362; CHECK-NEXT: ret 363 %head = insertelement <8 x double> poison, double %b, i32 0 364 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer 365 %vc = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 366 ret <8 x double> %vc 367} 368