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 <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half>, <2 x half>, metadata, metadata) 8define <2 x half> @vfadd_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp { 9; CHECK-LABEL: vfadd_vv_v2f16: 10; CHECK: # %bb.0: # %entry 11; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 12; CHECK-NEXT: vfadd.vv v8, v8, v9 13; CHECK-NEXT: ret 14entry: 15 %vc = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %va, <2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 16 ret <2 x half> %vc 17} 18 19define <2 x half> @vfadd_vf_v2f16(<2 x half> %va, half %b) strictfp { 20; CHECK-LABEL: vfadd_vf_v2f16: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 23; CHECK-NEXT: vfadd.vf v8, v8, fa0 24; CHECK-NEXT: ret 25 %head = insertelement <2 x half> poison, half %b, i32 0 26 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer 27 %vc = call <2 x half> @llvm.experimental.constrained.fadd.v2f16(<2 x half> %va, <2 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 28 ret <2 x half> %vc 29} 30 31declare <4 x half> @llvm.experimental.constrained.fadd.v4f16(<4 x half>, <4 x half>, metadata, metadata) 32define <4 x half> @vfadd_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp { 33; CHECK-LABEL: vfadd_vv_v4f16: 34; CHECK: # %bb.0: # %entry 35; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 36; CHECK-NEXT: vfadd.vv v8, v8, v9 37; CHECK-NEXT: ret 38entry: 39 %vc = call <4 x half> @llvm.experimental.constrained.fadd.v4f16(<4 x half> %va, <4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 40 ret <4 x half> %vc 41} 42 43define <4 x half> @vfadd_vf_v4f16(<4 x half> %va, half %b) strictfp { 44; CHECK-LABEL: vfadd_vf_v4f16: 45; CHECK: # %bb.0: 46; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 47; CHECK-NEXT: vfadd.vf v8, v8, fa0 48; CHECK-NEXT: ret 49 %head = insertelement <4 x half> poison, half %b, i32 0 50 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer 51 %vc = call <4 x half> @llvm.experimental.constrained.fadd.v4f16(<4 x half> %va, <4 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 52 ret <4 x half> %vc 53} 54 55declare <8 x half> @llvm.experimental.constrained.fadd.v8f16(<8 x half>, <8 x half>, metadata, metadata) 56define <8 x half> @vfadd_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp { 57; CHECK-LABEL: vfadd_vv_v8f16: 58; CHECK: # %bb.0: # %entry 59; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 60; CHECK-NEXT: vfadd.vv v8, v8, v9 61; CHECK-NEXT: ret 62entry: 63 %vc = call <8 x half> @llvm.experimental.constrained.fadd.v8f16(<8 x half> %va, <8 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 64 ret <8 x half> %vc 65} 66 67define <8 x half> @vfadd_vf_v8f16(<8 x half> %va, half %b) strictfp { 68; CHECK-LABEL: vfadd_vf_v8f16: 69; CHECK: # %bb.0: 70; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 71; CHECK-NEXT: vfadd.vf v8, v8, fa0 72; CHECK-NEXT: ret 73 %head = insertelement <8 x half> poison, half %b, i32 0 74 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer 75 %vc = call <8 x half> @llvm.experimental.constrained.fadd.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 76 ret <8 x half> %vc 77} 78 79declare <16 x half> @llvm.experimental.constrained.fadd.v16f16(<16 x half>, <16 x half>, metadata, metadata) 80define <16 x half> @vfadd_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp { 81; CHECK-LABEL: vfadd_vv_v16f16: 82; CHECK: # %bb.0: # %entry 83; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 84; CHECK-NEXT: vfadd.vv v8, v8, v10 85; CHECK-NEXT: ret 86entry: 87 %vc = call <16 x half> @llvm.experimental.constrained.fadd.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 88 ret <16 x half> %vc 89} 90 91define <16 x half> @vfadd_vf_v16f16(<16 x half> %va, half %b) strictfp { 92; CHECK-LABEL: vfadd_vf_v16f16: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 95; CHECK-NEXT: vfadd.vf v8, v8, fa0 96; CHECK-NEXT: ret 97 %head = insertelement <16 x half> poison, half %b, i32 0 98 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer 99 %vc = call <16 x half> @llvm.experimental.constrained.fadd.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 100 ret <16 x half> %vc 101} 102 103declare <32 x half> @llvm.experimental.constrained.fadd.v32f16(<32 x half>, <32 x half>, metadata, metadata) 104define <32 x half> @vfadd_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp { 105; CHECK-LABEL: vfadd_vv_v32f16: 106; CHECK: # %bb.0: # %entry 107; CHECK-NEXT: li a0, 32 108; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 109; CHECK-NEXT: vfadd.vv v8, v8, v12 110; CHECK-NEXT: ret 111entry: 112 %vc = call <32 x half> @llvm.experimental.constrained.fadd.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 113 ret <32 x half> %vc 114} 115 116define <32 x half> @vfadd_vf_v32f16(<32 x half> %va, half %b) strictfp { 117; CHECK-LABEL: vfadd_vf_v32f16: 118; CHECK: # %bb.0: 119; CHECK-NEXT: li a0, 32 120; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 121; CHECK-NEXT: vfadd.vf v8, v8, fa0 122; CHECK-NEXT: ret 123 %head = insertelement <32 x half> poison, half %b, i32 0 124 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer 125 %vc = call <32 x half> @llvm.experimental.constrained.fadd.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 126 ret <32 x half> %vc 127} 128 129declare <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float>, <2 x float>, metadata, metadata) 130define <2 x float> @vfadd_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp { 131; CHECK-LABEL: vfadd_vv_v2f32: 132; CHECK: # %bb.0: # %entry 133; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 134; CHECK-NEXT: vfadd.vv v8, v8, v9 135; CHECK-NEXT: ret 136entry: 137 %vc = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 138 ret <2 x float> %vc 139} 140 141define <2 x float> @vfadd_vf_v2f32(<2 x float> %va, float %b) strictfp { 142; CHECK-LABEL: vfadd_vf_v2f32: 143; CHECK: # %bb.0: 144; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 145; CHECK-NEXT: vfadd.vf v8, v8, fa0 146; CHECK-NEXT: ret 147 %head = insertelement <2 x float> poison, float %b, i32 0 148 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer 149 %vc = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 150 ret <2 x float> %vc 151} 152 153declare <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float>, <4 x float>, metadata, metadata) 154define <4 x float> @vfadd_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp { 155; CHECK-LABEL: vfadd_vv_v4f32: 156; CHECK: # %bb.0: # %entry 157; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 158; CHECK-NEXT: vfadd.vv v8, v8, v9 159; CHECK-NEXT: ret 160entry: 161 %vc = call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 162 ret <4 x float> %vc 163} 164 165define <4 x float> @vfadd_vf_v4f32(<4 x float> %va, float %b) strictfp { 166; CHECK-LABEL: vfadd_vf_v4f32: 167; CHECK: # %bb.0: 168; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 169; CHECK-NEXT: vfadd.vf v8, v8, fa0 170; CHECK-NEXT: ret 171 %head = insertelement <4 x float> poison, float %b, i32 0 172 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer 173 %vc = call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 174 ret <4 x float> %vc 175} 176 177declare <8 x float> @llvm.experimental.constrained.fadd.v8f32(<8 x float>, <8 x float>, metadata, metadata) 178define <8 x float> @vfadd_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp { 179; CHECK-LABEL: vfadd_vv_v8f32: 180; CHECK: # %bb.0: # %entry 181; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 182; CHECK-NEXT: vfadd.vv v8, v8, v10 183; CHECK-NEXT: ret 184entry: 185 %vc = call <8 x float> @llvm.experimental.constrained.fadd.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 186 ret <8 x float> %vc 187} 188 189define <8 x float> @vfadd_vf_v8f32(<8 x float> %va, float %b) strictfp { 190; CHECK-LABEL: vfadd_vf_v8f32: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 193; CHECK-NEXT: vfadd.vf v8, v8, fa0 194; CHECK-NEXT: ret 195 %head = insertelement <8 x float> poison, float %b, i32 0 196 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer 197 %vc = call <8 x float> @llvm.experimental.constrained.fadd.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 198 ret <8 x float> %vc 199} 200 201declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata) 202define <16 x float> @vfadd_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp { 203; CHECK-LABEL: vfadd_vv_v16f32: 204; CHECK: # %bb.0: # %entry 205; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 206; CHECK-NEXT: vfadd.vv v8, v8, v12 207; CHECK-NEXT: ret 208entry: 209 %vc = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 210 ret <16 x float> %vc 211} 212 213define <16 x float> @vfadd_vf_v16f32(<16 x float> %va, float %b) strictfp { 214; CHECK-LABEL: vfadd_vf_v16f32: 215; CHECK: # %bb.0: 216; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 217; CHECK-NEXT: vfadd.vf v8, v8, fa0 218; CHECK-NEXT: ret 219 %head = insertelement <16 x float> poison, float %b, i32 0 220 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer 221 %vc = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 222 ret <16 x float> %vc 223} 224 225declare <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double>, <2 x double>, metadata, metadata) 226define <2 x double> @vfadd_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp { 227; CHECK-LABEL: vfadd_vv_v2f64: 228; CHECK: # %bb.0: # %entry 229; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 230; CHECK-NEXT: vfadd.vv v8, v8, v9 231; CHECK-NEXT: ret 232entry: 233 %vc = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 234 ret <2 x double> %vc 235} 236 237define <2 x double> @vfadd_vf_v2f64(<2 x double> %va, double %b) strictfp { 238; CHECK-LABEL: vfadd_vf_v2f64: 239; CHECK: # %bb.0: 240; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 241; CHECK-NEXT: vfadd.vf v8, v8, fa0 242; CHECK-NEXT: ret 243 %head = insertelement <2 x double> poison, double %b, i32 0 244 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer 245 %vc = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 246 ret <2 x double> %vc 247} 248 249declare <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double>, <4 x double>, metadata, metadata) 250define <4 x double> @vfadd_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp { 251; CHECK-LABEL: vfadd_vv_v4f64: 252; CHECK: # %bb.0: # %entry 253; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 254; CHECK-NEXT: vfadd.vv v8, v8, v10 255; CHECK-NEXT: ret 256entry: 257 %vc = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 258 ret <4 x double> %vc 259} 260 261define <4 x double> @vfadd_vf_v4f64(<4 x double> %va, double %b) strictfp { 262; CHECK-LABEL: vfadd_vf_v4f64: 263; CHECK: # %bb.0: 264; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 265; CHECK-NEXT: vfadd.vf v8, v8, fa0 266; CHECK-NEXT: ret 267 %head = insertelement <4 x double> poison, double %b, i32 0 268 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer 269 %vc = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 270 ret <4 x double> %vc 271} 272 273declare <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double>, <8 x double>, metadata, metadata) 274define <8 x double> @vfadd_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp { 275; CHECK-LABEL: vfadd_vv_v8f64: 276; CHECK: # %bb.0: # %entry 277; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 278; CHECK-NEXT: vfadd.vv v8, v8, v12 279; CHECK-NEXT: ret 280entry: 281 %vc = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore") 282 ret <8 x double> %vc 283} 284 285define <8 x double> @vfadd_vf_v8f64(<8 x double> %va, double %b) strictfp { 286; CHECK-LABEL: vfadd_vf_v8f64: 287; CHECK: # %bb.0: 288; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 289; CHECK-NEXT: vfadd.vf v8, v8, fa0 290; CHECK-NEXT: ret 291 %head = insertelement <8 x double> poison, double %b, i32 0 292 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer 293 %vc = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore") 294 ret <8 x double> %vc 295} 296