284 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> @vfadd_vv_v2f16(<2 x half> %va, <2 x half> %vb) strictfp {8; CHECK-LABEL: vfadd_vv_v2f16:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma11; CHECK-NEXT: vfadd.vv v8, v8, v912; CHECK-NEXT: ret13entry:14 %vc = call <2 x half> @llvm.experimental.constrained.fadd.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> @vfadd_vf_v2f16(<2 x half> %va, half %b) strictfp {19; CHECK-LABEL: vfadd_vf_v2f16:20; CHECK: # %bb.0:21; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma22; CHECK-NEXT: vfadd.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.fadd.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> @vfadd_vv_v4f16(<4 x half> %va, <4 x half> %vb) strictfp {31; CHECK-LABEL: vfadd_vv_v4f16:32; CHECK: # %bb.0: # %entry33; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma34; CHECK-NEXT: vfadd.vv v8, v8, v935; CHECK-NEXT: ret36entry:37 %vc = call <4 x half> @llvm.experimental.constrained.fadd.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> @vfadd_vf_v4f16(<4 x half> %va, half %b) strictfp {42; CHECK-LABEL: vfadd_vf_v4f16:43; CHECK: # %bb.0:44; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma45; CHECK-NEXT: vfadd.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.fadd.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> @vfadd_vv_v8f16(<8 x half> %va, <8 x half> %vb) strictfp {54; CHECK-LABEL: vfadd_vv_v8f16:55; CHECK: # %bb.0: # %entry56; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma57; CHECK-NEXT: vfadd.vv v8, v8, v958; CHECK-NEXT: ret59entry:60 %vc = call <8 x half> @llvm.experimental.constrained.fadd.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> @vfadd_vf_v8f16(<8 x half> %va, half %b) strictfp {65; CHECK-LABEL: vfadd_vf_v8f16:66; CHECK: # %bb.0:67; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma68; CHECK-NEXT: vfadd.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.fadd.v8f16(<8 x half> %va, <8 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")73 ret <8 x half> %vc74}75 76define <16 x half> @vfadd_vv_v16f16(<16 x half> %va, <16 x half> %vb) strictfp {77; CHECK-LABEL: vfadd_vv_v16f16:78; CHECK: # %bb.0: # %entry79; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma80; CHECK-NEXT: vfadd.vv v8, v8, v1081; CHECK-NEXT: ret82entry:83 %vc = call <16 x half> @llvm.experimental.constrained.fadd.v16f16(<16 x half> %va, <16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")84 ret <16 x half> %vc85}86 87define <16 x half> @vfadd_vf_v16f16(<16 x half> %va, half %b) strictfp {88; CHECK-LABEL: vfadd_vf_v16f16:89; CHECK: # %bb.0:90; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma91; CHECK-NEXT: vfadd.vf v8, v8, fa092; CHECK-NEXT: ret93 %head = insertelement <16 x half> poison, half %b, i32 094 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer95 %vc = call <16 x half> @llvm.experimental.constrained.fadd.v16f16(<16 x half> %va, <16 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")96 ret <16 x half> %vc97}98 99define <32 x half> @vfadd_vv_v32f16(<32 x half> %va, <32 x half> %vb) strictfp {100; CHECK-LABEL: vfadd_vv_v32f16:101; CHECK: # %bb.0: # %entry102; CHECK-NEXT: li a0, 32103; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma104; CHECK-NEXT: vfadd.vv v8, v8, v12105; CHECK-NEXT: ret106entry:107 %vc = call <32 x half> @llvm.experimental.constrained.fadd.v32f16(<32 x half> %va, <32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")108 ret <32 x half> %vc109}110 111define <32 x half> @vfadd_vf_v32f16(<32 x half> %va, half %b) strictfp {112; CHECK-LABEL: vfadd_vf_v32f16:113; CHECK: # %bb.0:114; CHECK-NEXT: li a0, 32115; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma116; CHECK-NEXT: vfadd.vf v8, v8, fa0117; CHECK-NEXT: ret118 %head = insertelement <32 x half> poison, half %b, i32 0119 %splat = shufflevector <32 x half> %head, <32 x half> poison, <32 x i32> zeroinitializer120 %vc = call <32 x half> @llvm.experimental.constrained.fadd.v32f16(<32 x half> %va, <32 x half> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")121 ret <32 x half> %vc122}123 124define <2 x float> @vfadd_vv_v2f32(<2 x float> %va, <2 x float> %vb) strictfp {125; CHECK-LABEL: vfadd_vv_v2f32:126; CHECK: # %bb.0: # %entry127; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma128; CHECK-NEXT: vfadd.vv v8, v8, v9129; CHECK-NEXT: ret130entry:131 %vc = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %va, <2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")132 ret <2 x float> %vc133}134 135define <2 x float> @vfadd_vf_v2f32(<2 x float> %va, float %b) strictfp {136; CHECK-LABEL: vfadd_vf_v2f32:137; CHECK: # %bb.0:138; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma139; CHECK-NEXT: vfadd.vf v8, v8, fa0140; CHECK-NEXT: ret141 %head = insertelement <2 x float> poison, float %b, i32 0142 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer143 %vc = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %va, <2 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")144 ret <2 x float> %vc145}146 147define <4 x float> @vfadd_vv_v4f32(<4 x float> %va, <4 x float> %vb) strictfp {148; CHECK-LABEL: vfadd_vv_v4f32:149; CHECK: # %bb.0: # %entry150; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma151; CHECK-NEXT: vfadd.vv v8, v8, v9152; CHECK-NEXT: ret153entry:154 %vc = call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> %va, <4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")155 ret <4 x float> %vc156}157 158define <4 x float> @vfadd_vf_v4f32(<4 x float> %va, float %b) strictfp {159; CHECK-LABEL: vfadd_vf_v4f32:160; CHECK: # %bb.0:161; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma162; CHECK-NEXT: vfadd.vf v8, v8, fa0163; CHECK-NEXT: ret164 %head = insertelement <4 x float> poison, float %b, i32 0165 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer166 %vc = call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> %va, <4 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")167 ret <4 x float> %vc168}169 170define <8 x float> @vfadd_vv_v8f32(<8 x float> %va, <8 x float> %vb) strictfp {171; CHECK-LABEL: vfadd_vv_v8f32:172; CHECK: # %bb.0: # %entry173; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma174; CHECK-NEXT: vfadd.vv v8, v8, v10175; CHECK-NEXT: ret176entry:177 %vc = call <8 x float> @llvm.experimental.constrained.fadd.v8f32(<8 x float> %va, <8 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")178 ret <8 x float> %vc179}180 181define <8 x float> @vfadd_vf_v8f32(<8 x float> %va, float %b) strictfp {182; CHECK-LABEL: vfadd_vf_v8f32:183; CHECK: # %bb.0:184; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma185; CHECK-NEXT: vfadd.vf v8, v8, fa0186; CHECK-NEXT: ret187 %head = insertelement <8 x float> poison, float %b, i32 0188 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer189 %vc = call <8 x float> @llvm.experimental.constrained.fadd.v8f32(<8 x float> %va, <8 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")190 ret <8 x float> %vc191}192 193define <16 x float> @vfadd_vv_v16f32(<16 x float> %va, <16 x float> %vb) strictfp {194; CHECK-LABEL: vfadd_vv_v16f32:195; CHECK: # %bb.0: # %entry196; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma197; CHECK-NEXT: vfadd.vv v8, v8, v12198; CHECK-NEXT: ret199entry:200 %vc = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")201 ret <16 x float> %vc202}203 204define <16 x float> @vfadd_vf_v16f32(<16 x float> %va, float %b) strictfp {205; CHECK-LABEL: vfadd_vf_v16f32:206; CHECK: # %bb.0:207; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma208; CHECK-NEXT: vfadd.vf v8, v8, fa0209; CHECK-NEXT: ret210 %head = insertelement <16 x float> poison, float %b, i32 0211 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer212 %vc = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")213 ret <16 x float> %vc214}215 216define <2 x double> @vfadd_vv_v2f64(<2 x double> %va, <2 x double> %vb) strictfp {217; CHECK-LABEL: vfadd_vv_v2f64:218; CHECK: # %bb.0: # %entry219; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma220; CHECK-NEXT: vfadd.vv v8, v8, v9221; CHECK-NEXT: ret222entry:223 %vc = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double> %va, <2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")224 ret <2 x double> %vc225}226 227define <2 x double> @vfadd_vf_v2f64(<2 x double> %va, double %b) strictfp {228; CHECK-LABEL: vfadd_vf_v2f64:229; CHECK: # %bb.0:230; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma231; CHECK-NEXT: vfadd.vf v8, v8, fa0232; CHECK-NEXT: ret233 %head = insertelement <2 x double> poison, double %b, i32 0234 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer235 %vc = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double> %va, <2 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")236 ret <2 x double> %vc237}238 239define <4 x double> @vfadd_vv_v4f64(<4 x double> %va, <4 x double> %vb) strictfp {240; CHECK-LABEL: vfadd_vv_v4f64:241; CHECK: # %bb.0: # %entry242; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma243; CHECK-NEXT: vfadd.vv v8, v8, v10244; CHECK-NEXT: ret245entry:246 %vc = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double> %va, <4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")247 ret <4 x double> %vc248}249 250define <4 x double> @vfadd_vf_v4f64(<4 x double> %va, double %b) strictfp {251; CHECK-LABEL: vfadd_vf_v4f64:252; CHECK: # %bb.0:253; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma254; CHECK-NEXT: vfadd.vf v8, v8, fa0255; CHECK-NEXT: ret256 %head = insertelement <4 x double> poison, double %b, i32 0257 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer258 %vc = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(<4 x double> %va, <4 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")259 ret <4 x double> %vc260}261 262define <8 x double> @vfadd_vv_v8f64(<8 x double> %va, <8 x double> %vb) strictfp {263; CHECK-LABEL: vfadd_vv_v8f64:264; CHECK: # %bb.0: # %entry265; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma266; CHECK-NEXT: vfadd.vv v8, v8, v12267; CHECK-NEXT: ret268entry:269 %vc = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %va, <8 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.ignore")270 ret <8 x double> %vc271}272 273define <8 x double> @vfadd_vf_v8f64(<8 x double> %va, double %b) strictfp {274; CHECK-LABEL: vfadd_vf_v8f64:275; CHECK: # %bb.0:276; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma277; CHECK-NEXT: vfadd.vf v8, v8, fa0278; CHECK-NEXT: ret279 %head = insertelement <8 x double> poison, double %b, i32 0280 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer281 %vc = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %va, <8 x double> %splat, metadata !"round.dynamic", metadata !"fpexcept.ignore")282 ret <8 x double> %vc283}284