1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \ 3; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \ 4; RUN: --check-prefixes=CHECK,ZVFH 5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \ 6; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \ 7; RUN: --check-prefixes=CHECK,ZVFH 8; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \ 9; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \ 10; RUN: --check-prefixes=CHECK,ZVFHMIN 11; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \ 12; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \ 13; RUN: --check-prefixes=CHECK,ZVFHMIN 14 15define <vscale x 1 x bfloat> @vfadd_vv_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb) strictfp { 16; CHECK-LABEL: vfadd_vv_nxv1bf16: 17; CHECK: # %bb.0: # %entry 18; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 19; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 20; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8 21; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 22; CHECK-NEXT: vfadd.vv v9, v9, v10 23; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 24; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 25; CHECK-NEXT: ret 26entry: 27 %vc = call <vscale x 1 x bfloat> @llvm.experimental.constrained.fadd.nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 28 ret <vscale x 1 x bfloat> %vc 29} 30 31define <vscale x 1 x bfloat> @vfadd_vf_nxv1bf16(<vscale x 1 x bfloat> %va, bfloat %b) strictfp { 32; CHECK-LABEL: vfadd_vf_nxv1bf16: 33; CHECK: # %bb.0: 34; CHECK-NEXT: fmv.x.h a0, fa0 35; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 36; CHECK-NEXT: vmv.v.x v9, a0 37; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 38; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v9 39; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 40; CHECK-NEXT: vfadd.vv v9, v10, v8 41; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 42; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 43; CHECK-NEXT: ret 44 %head = insertelement <vscale x 1 x bfloat> poison, bfloat %b, i32 0 45 %splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer 46 %vc = call <vscale x 1 x bfloat> @llvm.experimental.constrained.fadd.nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 47 ret <vscale x 1 x bfloat> %vc 48} 49 50define <vscale x 2 x bfloat> @vfadd_vv_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb) strictfp { 51; CHECK-LABEL: vfadd_vv_nxv2bf16: 52; CHECK: # %bb.0: # %entry 53; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 54; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 55; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8 56; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 57; CHECK-NEXT: vfadd.vv v9, v9, v10 58; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 59; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 60; CHECK-NEXT: ret 61entry: 62 %vc = call <vscale x 2 x bfloat> @llvm.experimental.constrained.fadd.nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 63 ret <vscale x 2 x bfloat> %vc 64} 65 66define <vscale x 2 x bfloat> @vfadd_vf_nxv2bf16(<vscale x 2 x bfloat> %va, bfloat %b) strictfp { 67; CHECK-LABEL: vfadd_vf_nxv2bf16: 68; CHECK: # %bb.0: 69; CHECK-NEXT: fmv.x.h a0, fa0 70; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 71; CHECK-NEXT: vmv.v.x v9, a0 72; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 73; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v9 74; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 75; CHECK-NEXT: vfadd.vv v9, v10, v8 76; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 77; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 78; CHECK-NEXT: ret 79 %head = insertelement <vscale x 2 x bfloat> poison, bfloat %b, i32 0 80 %splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer 81 %vc = call <vscale x 2 x bfloat> @llvm.experimental.constrained.fadd.nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 82 ret <vscale x 2 x bfloat> %vc 83} 84 85define <vscale x 4 x bfloat> @vfadd_vv_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb) strictfp { 86; CHECK-LABEL: vfadd_vv_nxv4bf16: 87; CHECK: # %bb.0: # %entry 88; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 89; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 90; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8 91; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 92; CHECK-NEXT: vfadd.vv v10, v12, v10 93; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 94; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10 95; CHECK-NEXT: ret 96entry: 97 %vc = call <vscale x 4 x bfloat> @llvm.experimental.constrained.fadd.nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 98 ret <vscale x 4 x bfloat> %vc 99} 100 101define <vscale x 4 x bfloat> @vfadd_vf_nxv4bf16(<vscale x 4 x bfloat> %va, bfloat %b) strictfp { 102; CHECK-LABEL: vfadd_vf_nxv4bf16: 103; CHECK: # %bb.0: 104; CHECK-NEXT: fmv.x.h a0, fa0 105; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 106; CHECK-NEXT: vmv.v.x v9, a0 107; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 108; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v9 109; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 110; CHECK-NEXT: vfadd.vv v10, v10, v12 111; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 112; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10 113; CHECK-NEXT: ret 114 %head = insertelement <vscale x 4 x bfloat> poison, bfloat %b, i32 0 115 %splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer 116 %vc = call <vscale x 4 x bfloat> @llvm.experimental.constrained.fadd.nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 117 ret <vscale x 4 x bfloat> %vc 118} 119 120define <vscale x 8 x bfloat> @vfadd_vv_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb) strictfp { 121; CHECK-LABEL: vfadd_vv_nxv8bf16: 122; CHECK: # %bb.0: # %entry 123; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 124; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v10 125; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 126; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 127; CHECK-NEXT: vfadd.vv v12, v16, v12 128; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 129; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12 130; CHECK-NEXT: ret 131entry: 132 %vc = call <vscale x 8 x bfloat> @llvm.experimental.constrained.fadd.nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 133 ret <vscale x 8 x bfloat> %vc 134} 135 136define <vscale x 8 x bfloat> @vfadd_vf_nxv8bf16(<vscale x 8 x bfloat> %va, bfloat %b) strictfp { 137; CHECK-LABEL: vfadd_vf_nxv8bf16: 138; CHECK: # %bb.0: 139; CHECK-NEXT: fmv.x.h a0, fa0 140; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 141; CHECK-NEXT: vmv.v.x v10, a0 142; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8 143; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v10 144; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 145; CHECK-NEXT: vfadd.vv v12, v12, v16 146; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 147; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12 148; CHECK-NEXT: ret 149 %head = insertelement <vscale x 8 x bfloat> poison, bfloat %b, i32 0 150 %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer 151 %vc = call <vscale x 8 x bfloat> @llvm.experimental.constrained.fadd.nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 152 ret <vscale x 8 x bfloat> %vc 153} 154 155define <vscale x 16 x bfloat> @vfadd_vv_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb) strictfp { 156; CHECK-LABEL: vfadd_vv_nxv16bf16: 157; CHECK: # %bb.0: # %entry 158; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 159; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 160; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8 161; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 162; CHECK-NEXT: vfadd.vv v16, v24, v16 163; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 164; CHECK-NEXT: vfncvtbf16.f.f.w v8, v16 165; CHECK-NEXT: ret 166entry: 167 %vc = call <vscale x 16 x bfloat> @llvm.experimental.constrained.fadd.nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 168 ret <vscale x 16 x bfloat> %vc 169} 170 171define <vscale x 16 x bfloat> @vfadd_vf_nxv16bf16(<vscale x 16 x bfloat> %va, bfloat %b) strictfp { 172; CHECK-LABEL: vfadd_vf_nxv16bf16: 173; CHECK: # %bb.0: 174; CHECK-NEXT: fmv.x.h a0, fa0 175; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 176; CHECK-NEXT: vmv.v.x v12, a0 177; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 178; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12 179; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 180; CHECK-NEXT: vfadd.vv v16, v16, v24 181; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 182; CHECK-NEXT: vfncvtbf16.f.f.w v8, v16 183; CHECK-NEXT: ret 184 %head = insertelement <vscale x 16 x bfloat> poison, bfloat %b, i32 0 185 %splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer 186 %vc = call <vscale x 16 x bfloat> @llvm.experimental.constrained.fadd.nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 187 ret <vscale x 16 x bfloat> %vc 188} 189 190define <vscale x 32 x bfloat> @vfadd_vv_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb) strictfp { 191; CHECK-LABEL: vfadd_vv_nxv32bf16: 192; CHECK: # %bb.0: # %entry 193; CHECK-NEXT: addi sp, sp, -16 194; CHECK-NEXT: .cfi_def_cfa_offset 16 195; CHECK-NEXT: csrr a0, vlenb 196; CHECK-NEXT: slli a0, a0, 3 197; CHECK-NEXT: sub sp, sp, a0 198; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 199; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 200; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v16 201; CHECK-NEXT: addi a0, sp, 16 202; CHECK-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill 203; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v8 204; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v20 205; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 206; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 207; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 208; CHECK-NEXT: vfadd.vv v0, v0, v8 209; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 210; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0 211; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 212; CHECK-NEXT: vfadd.vv v16, v16, v24 213; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 214; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16 215; CHECK-NEXT: csrr a0, vlenb 216; CHECK-NEXT: slli a0, a0, 3 217; CHECK-NEXT: add sp, sp, a0 218; CHECK-NEXT: .cfi_def_cfa sp, 16 219; CHECK-NEXT: addi sp, sp, 16 220; CHECK-NEXT: .cfi_def_cfa_offset 0 221; CHECK-NEXT: ret 222entry: 223 %vc = call <vscale x 32 x bfloat> @llvm.experimental.constrained.fadd.nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 224 ret <vscale x 32 x bfloat> %vc 225} 226 227define <vscale x 32 x bfloat> @vfadd_vf_nxv32bf16(<vscale x 32 x bfloat> %va, bfloat %b) strictfp { 228; CHECK-LABEL: vfadd_vf_nxv32bf16: 229; CHECK: # %bb.0: 230; CHECK-NEXT: addi sp, sp, -16 231; CHECK-NEXT: .cfi_def_cfa_offset 16 232; CHECK-NEXT: csrr a0, vlenb 233; CHECK-NEXT: slli a0, a0, 3 234; CHECK-NEXT: sub sp, sp, a0 235; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 236; CHECK-NEXT: fmv.x.h a0, fa0 237; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 238; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 239; CHECK-NEXT: addi a1, sp, 16 240; CHECK-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 241; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12 242; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 243; CHECK-NEXT: vmv.v.x v8, a0 244; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 245; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v8 246; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 247; CHECK-NEXT: addi a0, sp, 16 248; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 249; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 250; CHECK-NEXT: vfadd.vv v0, v8, v0 251; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 252; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0 253; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 254; CHECK-NEXT: vfadd.vv v16, v24, v16 255; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 256; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16 257; CHECK-NEXT: csrr a0, vlenb 258; CHECK-NEXT: slli a0, a0, 3 259; CHECK-NEXT: add sp, sp, a0 260; CHECK-NEXT: .cfi_def_cfa sp, 16 261; CHECK-NEXT: addi sp, sp, 16 262; CHECK-NEXT: .cfi_def_cfa_offset 0 263; CHECK-NEXT: ret 264 %head = insertelement <vscale x 32 x bfloat> poison, bfloat %b, i32 0 265 %splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer 266 %vc = call <vscale x 32 x bfloat> @llvm.experimental.constrained.fadd.nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 267 ret <vscale x 32 x bfloat> %vc 268} 269 270declare <vscale x 1 x half> @llvm.experimental.constrained.fadd.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>, metadata, metadata) 271define <vscale x 1 x half> @vfadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb) strictfp { 272; ZVFH-LABEL: vfadd_vv_nxv1f16: 273; ZVFH: # %bb.0: # %entry 274; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 275; ZVFH-NEXT: vfadd.vv v8, v8, v9 276; ZVFH-NEXT: ret 277; 278; ZVFHMIN-LABEL: vfadd_vv_nxv1f16: 279; ZVFHMIN: # %bb.0: # %entry 280; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 281; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 282; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 283; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 284; ZVFHMIN-NEXT: vfadd.vv v9, v9, v10 285; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 286; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 287; ZVFHMIN-NEXT: ret 288entry: 289 %vc = call <vscale x 1 x half> @llvm.experimental.constrained.fadd.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 290 ret <vscale x 1 x half> %vc 291} 292 293define <vscale x 1 x half> @vfadd_vf_nxv1f16(<vscale x 1 x half> %va, half %b) strictfp { 294; ZVFH-LABEL: vfadd_vf_nxv1f16: 295; ZVFH: # %bb.0: 296; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 297; ZVFH-NEXT: vfadd.vf v8, v8, fa0 298; ZVFH-NEXT: ret 299; 300; ZVFHMIN-LABEL: vfadd_vf_nxv1f16: 301; ZVFHMIN: # %bb.0: 302; ZVFHMIN-NEXT: fmv.x.h a0, fa0 303; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 304; ZVFHMIN-NEXT: vmv.v.x v9, a0 305; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 306; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 307; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 308; ZVFHMIN-NEXT: vfadd.vv v9, v10, v8 309; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 310; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 311; ZVFHMIN-NEXT: ret 312 %head = insertelement <vscale x 1 x half> poison, half %b, i32 0 313 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 314 %vc = call <vscale x 1 x half> @llvm.experimental.constrained.fadd.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 315 ret <vscale x 1 x half> %vc 316} 317 318declare <vscale x 2 x half> @llvm.experimental.constrained.fadd.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>, metadata, metadata) 319define <vscale x 2 x half> @vfadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb) strictfp { 320; ZVFH-LABEL: vfadd_vv_nxv2f16: 321; ZVFH: # %bb.0: # %entry 322; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 323; ZVFH-NEXT: vfadd.vv v8, v8, v9 324; ZVFH-NEXT: ret 325; 326; ZVFHMIN-LABEL: vfadd_vv_nxv2f16: 327; ZVFHMIN: # %bb.0: # %entry 328; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 329; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 330; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 331; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 332; ZVFHMIN-NEXT: vfadd.vv v9, v9, v10 333; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 334; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 335; ZVFHMIN-NEXT: ret 336entry: 337 %vc = call <vscale x 2 x half> @llvm.experimental.constrained.fadd.nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 338 ret <vscale x 2 x half> %vc 339} 340 341define <vscale x 2 x half> @vfadd_vf_nxv2f16(<vscale x 2 x half> %va, half %b) strictfp { 342; ZVFH-LABEL: vfadd_vf_nxv2f16: 343; ZVFH: # %bb.0: 344; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 345; ZVFH-NEXT: vfadd.vf v8, v8, fa0 346; ZVFH-NEXT: ret 347; 348; ZVFHMIN-LABEL: vfadd_vf_nxv2f16: 349; ZVFHMIN: # %bb.0: 350; ZVFHMIN-NEXT: fmv.x.h a0, fa0 351; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 352; ZVFHMIN-NEXT: vmv.v.x v9, a0 353; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 354; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 355; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 356; ZVFHMIN-NEXT: vfadd.vv v9, v10, v8 357; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 358; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 359; ZVFHMIN-NEXT: ret 360 %head = insertelement <vscale x 2 x half> poison, half %b, i32 0 361 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 362 %vc = call <vscale x 2 x half> @llvm.experimental.constrained.fadd.nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 363 ret <vscale x 2 x half> %vc 364} 365 366declare <vscale x 4 x half> @llvm.experimental.constrained.fadd.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>, metadata, metadata) 367define <vscale x 4 x half> @vfadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb) strictfp { 368; ZVFH-LABEL: vfadd_vv_nxv4f16: 369; ZVFH: # %bb.0: # %entry 370; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 371; ZVFH-NEXT: vfadd.vv v8, v8, v9 372; ZVFH-NEXT: ret 373; 374; ZVFHMIN-LABEL: vfadd_vv_nxv4f16: 375; ZVFHMIN: # %bb.0: # %entry 376; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 377; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 378; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 379; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 380; ZVFHMIN-NEXT: vfadd.vv v10, v12, v10 381; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 382; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 383; ZVFHMIN-NEXT: ret 384entry: 385 %vc = call <vscale x 4 x half> @llvm.experimental.constrained.fadd.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 386 ret <vscale x 4 x half> %vc 387} 388 389define <vscale x 4 x half> @vfadd_vf_nxv4f16(<vscale x 4 x half> %va, half %b) strictfp { 390; ZVFH-LABEL: vfadd_vf_nxv4f16: 391; ZVFH: # %bb.0: 392; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 393; ZVFH-NEXT: vfadd.vf v8, v8, fa0 394; ZVFH-NEXT: ret 395; 396; ZVFHMIN-LABEL: vfadd_vf_nxv4f16: 397; ZVFHMIN: # %bb.0: 398; ZVFHMIN-NEXT: fmv.x.h a0, fa0 399; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma 400; ZVFHMIN-NEXT: vmv.v.x v9, a0 401; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 402; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 403; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 404; ZVFHMIN-NEXT: vfadd.vv v10, v10, v12 405; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 406; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 407; ZVFHMIN-NEXT: ret 408 %head = insertelement <vscale x 4 x half> poison, half %b, i32 0 409 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 410 %vc = call <vscale x 4 x half> @llvm.experimental.constrained.fadd.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 411 ret <vscale x 4 x half> %vc 412} 413 414declare <vscale x 8 x half> @llvm.experimental.constrained.fadd.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, metadata, metadata) 415define <vscale x 8 x half> @vfadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb) strictfp { 416; ZVFH-LABEL: vfadd_vv_nxv8f16: 417; ZVFH: # %bb.0: # %entry 418; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 419; ZVFH-NEXT: vfadd.vv v8, v8, v10 420; ZVFH-NEXT: ret 421; 422; ZVFHMIN-LABEL: vfadd_vv_nxv8f16: 423; ZVFHMIN: # %bb.0: # %entry 424; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 425; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 426; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 427; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 428; ZVFHMIN-NEXT: vfadd.vv v12, v16, v12 429; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 430; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 431; ZVFHMIN-NEXT: ret 432entry: 433 %vc = call <vscale x 8 x half> @llvm.experimental.constrained.fadd.nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 434 ret <vscale x 8 x half> %vc 435} 436 437define <vscale x 8 x half> @vfadd_vf_nxv8f16(<vscale x 8 x half> %va, half %b) strictfp { 438; ZVFH-LABEL: vfadd_vf_nxv8f16: 439; ZVFH: # %bb.0: 440; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 441; ZVFH-NEXT: vfadd.vf v8, v8, fa0 442; ZVFH-NEXT: ret 443; 444; ZVFHMIN-LABEL: vfadd_vf_nxv8f16: 445; ZVFHMIN: # %bb.0: 446; ZVFHMIN-NEXT: fmv.x.h a0, fa0 447; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma 448; ZVFHMIN-NEXT: vmv.v.x v10, a0 449; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 450; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 451; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 452; ZVFHMIN-NEXT: vfadd.vv v12, v12, v16 453; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 454; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 455; ZVFHMIN-NEXT: ret 456 %head = insertelement <vscale x 8 x half> poison, half %b, i32 0 457 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 458 %vc = call <vscale x 8 x half> @llvm.experimental.constrained.fadd.nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 459 ret <vscale x 8 x half> %vc 460} 461 462declare <vscale x 16 x half> @llvm.experimental.constrained.fadd.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>, metadata, metadata) 463define <vscale x 16 x half> @vfadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb) strictfp { 464; ZVFH-LABEL: vfadd_vv_nxv16f16: 465; ZVFH: # %bb.0: # %entry 466; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 467; ZVFH-NEXT: vfadd.vv v8, v8, v12 468; ZVFH-NEXT: ret 469; 470; ZVFHMIN-LABEL: vfadd_vv_nxv16f16: 471; ZVFHMIN: # %bb.0: # %entry 472; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 473; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 474; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8 475; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 476; ZVFHMIN-NEXT: vfadd.vv v16, v24, v16 477; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 478; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 479; ZVFHMIN-NEXT: ret 480entry: 481 %vc = call <vscale x 16 x half> @llvm.experimental.constrained.fadd.nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 482 ret <vscale x 16 x half> %vc 483} 484 485define <vscale x 16 x half> @vfadd_vf_nxv16f16(<vscale x 16 x half> %va, half %b) strictfp { 486; ZVFH-LABEL: vfadd_vf_nxv16f16: 487; ZVFH: # %bb.0: 488; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 489; ZVFH-NEXT: vfadd.vf v8, v8, fa0 490; ZVFH-NEXT: ret 491; 492; ZVFHMIN-LABEL: vfadd_vf_nxv16f16: 493; ZVFHMIN: # %bb.0: 494; ZVFHMIN-NEXT: fmv.x.h a0, fa0 495; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 496; ZVFHMIN-NEXT: vmv.v.x v12, a0 497; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 498; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 499; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 500; ZVFHMIN-NEXT: vfadd.vv v16, v16, v24 501; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 502; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 503; ZVFHMIN-NEXT: ret 504 %head = insertelement <vscale x 16 x half> poison, half %b, i32 0 505 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 506 %vc = call <vscale x 16 x half> @llvm.experimental.constrained.fadd.nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 507 ret <vscale x 16 x half> %vc 508} 509 510declare <vscale x 32 x half> @llvm.experimental.constrained.fadd.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>, metadata, metadata) 511define <vscale x 32 x half> @vfadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb) strictfp { 512; ZVFH-LABEL: vfadd_vv_nxv32f16: 513; ZVFH: # %bb.0: # %entry 514; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 515; ZVFH-NEXT: vfadd.vv v8, v8, v16 516; ZVFH-NEXT: ret 517; 518; ZVFHMIN-LABEL: vfadd_vv_nxv32f16: 519; ZVFHMIN: # %bb.0: # %entry 520; ZVFHMIN-NEXT: addi sp, sp, -16 521; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 522; ZVFHMIN-NEXT: csrr a0, vlenb 523; ZVFHMIN-NEXT: slli a0, a0, 3 524; ZVFHMIN-NEXT: sub sp, sp, a0 525; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 526; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 527; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 528; ZVFHMIN-NEXT: addi a0, sp, 16 529; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill 530; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 531; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v20 532; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 533; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 534; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 535; ZVFHMIN-NEXT: vfadd.vv v0, v0, v8 536; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 537; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0 538; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 539; ZVFHMIN-NEXT: vfadd.vv v16, v16, v24 540; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 541; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16 542; ZVFHMIN-NEXT: csrr a0, vlenb 543; ZVFHMIN-NEXT: slli a0, a0, 3 544; ZVFHMIN-NEXT: add sp, sp, a0 545; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 546; ZVFHMIN-NEXT: addi sp, sp, 16 547; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 548; ZVFHMIN-NEXT: ret 549entry: 550 %vc = call <vscale x 32 x half> @llvm.experimental.constrained.fadd.nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 551 ret <vscale x 32 x half> %vc 552} 553 554define <vscale x 32 x half> @vfadd_vf_nxv32f16(<vscale x 32 x half> %va, half %b) strictfp { 555; ZVFH-LABEL: vfadd_vf_nxv32f16: 556; ZVFH: # %bb.0: 557; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 558; ZVFH-NEXT: vfadd.vf v8, v8, fa0 559; ZVFH-NEXT: ret 560; 561; ZVFHMIN-LABEL: vfadd_vf_nxv32f16: 562; ZVFHMIN: # %bb.0: 563; ZVFHMIN-NEXT: addi sp, sp, -16 564; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 565; ZVFHMIN-NEXT: csrr a0, vlenb 566; ZVFHMIN-NEXT: slli a0, a0, 3 567; ZVFHMIN-NEXT: sub sp, sp, a0 568; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 569; ZVFHMIN-NEXT: fmv.x.h a0, fa0 570; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 571; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 572; ZVFHMIN-NEXT: addi a1, sp, 16 573; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 574; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 575; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma 576; ZVFHMIN-NEXT: vmv.v.x v8, a0 577; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 578; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 579; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 580; ZVFHMIN-NEXT: addi a0, sp, 16 581; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 582; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 583; ZVFHMIN-NEXT: vfadd.vv v0, v8, v0 584; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 585; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0 586; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 587; ZVFHMIN-NEXT: vfadd.vv v16, v24, v16 588; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 589; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16 590; ZVFHMIN-NEXT: csrr a0, vlenb 591; ZVFHMIN-NEXT: slli a0, a0, 3 592; ZVFHMIN-NEXT: add sp, sp, a0 593; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 594; ZVFHMIN-NEXT: addi sp, sp, 16 595; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 596; ZVFHMIN-NEXT: ret 597 %head = insertelement <vscale x 32 x half> poison, half %b, i32 0 598 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 599 %vc = call <vscale x 32 x half> @llvm.experimental.constrained.fadd.nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 600 ret <vscale x 32 x half> %vc 601} 602 603declare <vscale x 1 x float> @llvm.experimental.constrained.fadd.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, metadata, metadata) 604define <vscale x 1 x float> @vfadd_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb) strictfp { 605; CHECK-LABEL: vfadd_vv_nxv1f32: 606; CHECK: # %bb.0: # %entry 607; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 608; CHECK-NEXT: vfadd.vv v8, v8, v9 609; CHECK-NEXT: ret 610entry: 611 %vc = call <vscale x 1 x float> @llvm.experimental.constrained.fadd.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 612 ret <vscale x 1 x float> %vc 613} 614 615define <vscale x 1 x float> @vfadd_vf_nxv1f32(<vscale x 1 x float> %va, float %b) strictfp { 616; CHECK-LABEL: vfadd_vf_nxv1f32: 617; CHECK: # %bb.0: 618; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 619; CHECK-NEXT: vfadd.vf v8, v8, fa0 620; CHECK-NEXT: ret 621 %head = insertelement <vscale x 1 x float> poison, float %b, i32 0 622 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 623 %vc = call <vscale x 1 x float> @llvm.experimental.constrained.fadd.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 624 ret <vscale x 1 x float> %vc 625} 626 627declare <vscale x 2 x float> @llvm.experimental.constrained.fadd.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, metadata, metadata) 628define <vscale x 2 x float> @vfadd_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb) strictfp { 629; CHECK-LABEL: vfadd_vv_nxv2f32: 630; CHECK: # %bb.0: # %entry 631; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 632; CHECK-NEXT: vfadd.vv v8, v8, v9 633; CHECK-NEXT: ret 634entry: 635 %vc = call <vscale x 2 x float> @llvm.experimental.constrained.fadd.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 636 ret <vscale x 2 x float> %vc 637} 638 639define <vscale x 2 x float> @vfadd_vf_nxv2f32(<vscale x 2 x float> %va, float %b) strictfp { 640; CHECK-LABEL: vfadd_vf_nxv2f32: 641; CHECK: # %bb.0: 642; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 643; CHECK-NEXT: vfadd.vf v8, v8, fa0 644; CHECK-NEXT: ret 645 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0 646 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 647 %vc = call <vscale x 2 x float> @llvm.experimental.constrained.fadd.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 648 ret <vscale x 2 x float> %vc 649} 650 651declare <vscale x 4 x float> @llvm.experimental.constrained.fadd.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, metadata, metadata) 652define <vscale x 4 x float> @vfadd_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb) strictfp { 653; CHECK-LABEL: vfadd_vv_nxv4f32: 654; CHECK: # %bb.0: # %entry 655; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 656; CHECK-NEXT: vfadd.vv v8, v8, v10 657; CHECK-NEXT: ret 658entry: 659 %vc = call <vscale x 4 x float> @llvm.experimental.constrained.fadd.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 660 ret <vscale x 4 x float> %vc 661} 662 663define <vscale x 4 x float> @vfadd_vf_nxv4f32(<vscale x 4 x float> %va, float %b) strictfp { 664; CHECK-LABEL: vfadd_vf_nxv4f32: 665; CHECK: # %bb.0: 666; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 667; CHECK-NEXT: vfadd.vf v8, v8, fa0 668; CHECK-NEXT: ret 669 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0 670 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 671 %vc = call <vscale x 4 x float> @llvm.experimental.constrained.fadd.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 672 ret <vscale x 4 x float> %vc 673} 674 675declare <vscale x 8 x float> @llvm.experimental.constrained.fadd.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, metadata, metadata) 676define <vscale x 8 x float> @vfadd_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb) strictfp { 677; CHECK-LABEL: vfadd_vv_nxv8f32: 678; CHECK: # %bb.0: # %entry 679; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 680; CHECK-NEXT: vfadd.vv v8, v8, v12 681; CHECK-NEXT: ret 682entry: 683 %vc = call <vscale x 8 x float> @llvm.experimental.constrained.fadd.nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 684 ret <vscale x 8 x float> %vc 685} 686 687define <vscale x 8 x float> @vfadd_vf_nxv8f32(<vscale x 8 x float> %va, float %b) strictfp { 688; CHECK-LABEL: vfadd_vf_nxv8f32: 689; CHECK: # %bb.0: 690; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 691; CHECK-NEXT: vfadd.vf v8, v8, fa0 692; CHECK-NEXT: ret 693 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0 694 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 695 %vc = call <vscale x 8 x float> @llvm.experimental.constrained.fadd.nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 696 ret <vscale x 8 x float> %vc 697} 698 699declare <vscale x 16 x float> @llvm.experimental.constrained.fadd.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, metadata, metadata) 700define <vscale x 16 x float> @vfadd_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb) strictfp { 701; CHECK-LABEL: vfadd_vv_nxv16f32: 702; CHECK: # %bb.0: # %entry 703; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 704; CHECK-NEXT: vfadd.vv v8, v8, v16 705; CHECK-NEXT: ret 706entry: 707 %vc = call <vscale x 16 x float> @llvm.experimental.constrained.fadd.nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 708 ret <vscale x 16 x float> %vc 709} 710 711define <vscale x 16 x float> @vfadd_vf_nxv16f32(<vscale x 16 x float> %va, float %b) strictfp { 712; CHECK-LABEL: vfadd_vf_nxv16f32: 713; CHECK: # %bb.0: 714; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 715; CHECK-NEXT: vfadd.vf v8, v8, fa0 716; CHECK-NEXT: ret 717 %head = insertelement <vscale x 16 x float> poison, float %b, i32 0 718 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 719 %vc = call <vscale x 16 x float> @llvm.experimental.constrained.fadd.nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 720 ret <vscale x 16 x float> %vc 721} 722 723declare <vscale x 1 x double> @llvm.experimental.constrained.fadd.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, metadata, metadata) 724define <vscale x 1 x double> @vfadd_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb) strictfp { 725; CHECK-LABEL: vfadd_vv_nxv1f64: 726; CHECK: # %bb.0: # %entry 727; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 728; CHECK-NEXT: vfadd.vv v8, v8, v9 729; CHECK-NEXT: ret 730entry: 731 %vc = call <vscale x 1 x double> @llvm.experimental.constrained.fadd.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 732 ret <vscale x 1 x double> %vc 733} 734 735define <vscale x 1 x double> @vfadd_vf_nxv1f64(<vscale x 1 x double> %va, double %b) strictfp { 736; CHECK-LABEL: vfadd_vf_nxv1f64: 737; CHECK: # %bb.0: 738; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 739; CHECK-NEXT: vfadd.vf v8, v8, fa0 740; CHECK-NEXT: ret 741 %head = insertelement <vscale x 1 x double> poison, double %b, i32 0 742 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 743 %vc = call <vscale x 1 x double> @llvm.experimental.constrained.fadd.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 744 ret <vscale x 1 x double> %vc 745} 746 747declare <vscale x 2 x double> @llvm.experimental.constrained.fadd.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, metadata, metadata) 748define <vscale x 2 x double> @vfadd_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb) strictfp { 749; CHECK-LABEL: vfadd_vv_nxv2f64: 750; CHECK: # %bb.0: # %entry 751; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 752; CHECK-NEXT: vfadd.vv v8, v8, v10 753; CHECK-NEXT: ret 754entry: 755 %vc = call <vscale x 2 x double> @llvm.experimental.constrained.fadd.nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 756 ret <vscale x 2 x double> %vc 757} 758 759define <vscale x 2 x double> @vfadd_vf_nxv2f64(<vscale x 2 x double> %va, double %b) strictfp { 760; CHECK-LABEL: vfadd_vf_nxv2f64: 761; CHECK: # %bb.0: 762; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 763; CHECK-NEXT: vfadd.vf v8, v8, fa0 764; CHECK-NEXT: ret 765 %head = insertelement <vscale x 2 x double> poison, double %b, i32 0 766 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 767 %vc = call <vscale x 2 x double> @llvm.experimental.constrained.fadd.nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 768 ret <vscale x 2 x double> %vc 769} 770 771declare <vscale x 4 x double> @llvm.experimental.constrained.fadd.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, metadata, metadata) 772define <vscale x 4 x double> @vfadd_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb) strictfp { 773; CHECK-LABEL: vfadd_vv_nxv4f64: 774; CHECK: # %bb.0: # %entry 775; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 776; CHECK-NEXT: vfadd.vv v8, v8, v12 777; CHECK-NEXT: ret 778entry: 779 %vc = call <vscale x 4 x double> @llvm.experimental.constrained.fadd.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 780 ret <vscale x 4 x double> %vc 781} 782 783define <vscale x 4 x double> @vfadd_vf_nxv4f64(<vscale x 4 x double> %va, double %b) strictfp { 784; CHECK-LABEL: vfadd_vf_nxv4f64: 785; CHECK: # %bb.0: 786; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 787; CHECK-NEXT: vfadd.vf v8, v8, fa0 788; CHECK-NEXT: ret 789 %head = insertelement <vscale x 4 x double> poison, double %b, i32 0 790 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 791 %vc = call <vscale x 4 x double> @llvm.experimental.constrained.fadd.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 792 ret <vscale x 4 x double> %vc 793} 794 795declare <vscale x 8 x double> @llvm.experimental.constrained.fadd.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, metadata, metadata) 796define <vscale x 8 x double> @vfadd_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb) strictfp { 797; CHECK-LABEL: vfadd_vv_nxv8f64: 798; CHECK: # %bb.0: # %entry 799; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 800; CHECK-NEXT: vfadd.vv v8, v8, v16 801; CHECK-NEXT: ret 802entry: 803 %vc = call <vscale x 8 x double> @llvm.experimental.constrained.fadd.nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 804 ret <vscale x 8 x double> %vc 805} 806 807define <vscale x 8 x double> @vfadd_vf_nxv8f64(<vscale x 8 x double> %va, double %b) strictfp { 808; CHECK-LABEL: vfadd_vf_nxv8f64: 809; CHECK: # %bb.0: 810; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 811; CHECK-NEXT: vfadd.vf v8, v8, fa0 812; CHECK-NEXT: ret 813 %head = insertelement <vscale x 8 x double> poison, double %b, i32 0 814 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 815 %vc = call <vscale x 8 x double> @llvm.experimental.constrained.fadd.nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 816 ret <vscale x 8 x double> %vc 817} 818