341 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 <vscale x 1 x double> @vfwadd_vv_nxv1f64(<vscale x 1 x float> %va, <vscale x 1 x float> %vb) {8; CHECK-LABEL: vfwadd_vv_nxv1f64:9; CHECK: # %bb.0:10; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma11; CHECK-NEXT: vfwadd.vv v10, v8, v912; CHECK-NEXT: vmv1r.v v8, v1013; CHECK-NEXT: ret14 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>15 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>16 %ve = fadd <vscale x 1 x double> %vc, %vd17 ret <vscale x 1 x double> %ve18}19 20define <vscale x 1 x double> @vfwadd_vf_nxv1f64(<vscale x 1 x float> %va, float %b) {21; CHECK-LABEL: vfwadd_vf_nxv1f64:22; CHECK: # %bb.0:23; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma24; CHECK-NEXT: vfwadd.vf v9, v8, fa025; CHECK-NEXT: vmv1r.v v8, v926; CHECK-NEXT: ret27 %head = insertelement <vscale x 1 x float> poison, float %b, i32 028 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer29 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>30 %vd = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>31 %ve = fadd <vscale x 1 x double> %vc, %vd32 ret <vscale x 1 x double> %ve33}34 35define <vscale x 1 x double> @vfwadd_vf_nxv1f64_2(<vscale x 1 x float> %va, float %b) {36; CHECK-LABEL: vfwadd_vf_nxv1f64_2:37; CHECK: # %bb.0:38; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma39; CHECK-NEXT: vfwadd.vf v9, v8, fa040; CHECK-NEXT: vmv1r.v v8, v941; CHECK-NEXT: ret42 %fpext = fpext float %b to double43 %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 044 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer45 %vc = fpext <vscale x 1 x float> %va to <vscale x 1 x double>46 %ve = fadd <vscale x 1 x double> %vc, %splat47 ret <vscale x 1 x double> %ve48}49 50define <vscale x 1 x double> @vfwadd_wv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb) {51; CHECK-LABEL: vfwadd_wv_nxv1f64:52; CHECK: # %bb.0:53; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma54; CHECK-NEXT: vfwadd.wv v8, v8, v955; CHECK-NEXT: ret56 %vc = fpext <vscale x 1 x float> %vb to <vscale x 1 x double>57 %vd = fadd <vscale x 1 x double> %va, %vc58 ret <vscale x 1 x double> %vd59}60 61define <vscale x 1 x double> @vfwadd_wf_nxv1f64(<vscale x 1 x double> %va, float %b) {62; CHECK-LABEL: vfwadd_wf_nxv1f64:63; CHECK: # %bb.0:64; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma65; CHECK-NEXT: vfwadd.wf v8, v8, fa066; CHECK-NEXT: ret67 %head = insertelement <vscale x 1 x float> poison, float %b, i32 068 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer69 %vc = fpext <vscale x 1 x float> %splat to <vscale x 1 x double>70 %vd = fadd <vscale x 1 x double> %va, %vc71 ret <vscale x 1 x double> %vd72}73 74define <vscale x 1 x double> @vfwadd_wf_nxv1f64_2(<vscale x 1 x double> %va, float %b) {75; CHECK-LABEL: vfwadd_wf_nxv1f64_2:76; CHECK: # %bb.0:77; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma78; CHECK-NEXT: vfwadd.wf v8, v8, fa079; CHECK-NEXT: ret80 %fpext = fpext float %b to double81 %head = insertelement <vscale x 1 x double> poison, double %fpext, i32 082 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer83 %vd = fadd <vscale x 1 x double> %va, %splat84 ret <vscale x 1 x double> %vd85}86 87define <vscale x 2 x double> @vfwadd_vv_nxv2f64(<vscale x 2 x float> %va, <vscale x 2 x float> %vb) {88; CHECK-LABEL: vfwadd_vv_nxv2f64:89; CHECK: # %bb.0:90; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma91; CHECK-NEXT: vmv1r.v v10, v992; CHECK-NEXT: vmv1r.v v11, v893; CHECK-NEXT: vfwadd.vv v8, v11, v1094; CHECK-NEXT: ret95 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>96 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>97 %ve = fadd <vscale x 2 x double> %vc, %vd98 ret <vscale x 2 x double> %ve99}100 101define <vscale x 2 x double> @vfwadd_vf_nxv2f64(<vscale x 2 x float> %va, float %b) {102; CHECK-LABEL: vfwadd_vf_nxv2f64:103; CHECK: # %bb.0:104; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma105; CHECK-NEXT: vmv1r.v v10, v8106; CHECK-NEXT: vfwadd.vf v8, v10, fa0107; CHECK-NEXT: ret108 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0109 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer110 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>111 %vd = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>112 %ve = fadd <vscale x 2 x double> %vc, %vd113 ret <vscale x 2 x double> %ve114}115 116define <vscale x 2 x double> @vfwadd_vf_nxv2f64_2(<vscale x 2 x float> %va, float %b) {117; CHECK-LABEL: vfwadd_vf_nxv2f64_2:118; CHECK: # %bb.0:119; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma120; CHECK-NEXT: vmv1r.v v10, v8121; CHECK-NEXT: vfwadd.vf v8, v10, fa0122; CHECK-NEXT: ret123 %fpext = fpext float %b to double124 %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0125 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer126 %vc = fpext <vscale x 2 x float> %va to <vscale x 2 x double>127 %ve = fadd <vscale x 2 x double> %vc, %splat128 ret <vscale x 2 x double> %ve129}130 131define <vscale x 2 x double> @vfwadd_wv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb) {132; CHECK-LABEL: vfwadd_wv_nxv2f64:133; CHECK: # %bb.0:134; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma135; CHECK-NEXT: vfwadd.wv v8, v8, v10136; CHECK-NEXT: ret137 %vc = fpext <vscale x 2 x float> %vb to <vscale x 2 x double>138 %vd = fadd <vscale x 2 x double> %va, %vc139 ret <vscale x 2 x double> %vd140}141 142define <vscale x 2 x double> @vfwadd_wf_nxv2f64(<vscale x 2 x double> %va, float %b) {143; CHECK-LABEL: vfwadd_wf_nxv2f64:144; CHECK: # %bb.0:145; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma146; CHECK-NEXT: vfwadd.wf v8, v8, fa0147; CHECK-NEXT: ret148 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0149 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer150 %vc = fpext <vscale x 2 x float> %splat to <vscale x 2 x double>151 %vd = fadd <vscale x 2 x double> %va, %vc152 ret <vscale x 2 x double> %vd153}154 155define <vscale x 2 x double> @vfwadd_wf_nxv2f64_2(<vscale x 2 x double> %va, float %b) {156; CHECK-LABEL: vfwadd_wf_nxv2f64_2:157; CHECK: # %bb.0:158; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma159; CHECK-NEXT: vfwadd.wf v8, v8, fa0160; CHECK-NEXT: ret161 %fpext = fpext float %b to double162 %head = insertelement <vscale x 2 x double> poison, double %fpext, i32 0163 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer164 %vd = fadd <vscale x 2 x double> %va, %splat165 ret <vscale x 2 x double> %vd166}167 168define <vscale x 4 x double> @vfwadd_vv_nxv4f64(<vscale x 4 x float> %va, <vscale x 4 x float> %vb) {169; CHECK-LABEL: vfwadd_vv_nxv4f64:170; CHECK: # %bb.0:171; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma172; CHECK-NEXT: vmv2r.v v12, v10173; CHECK-NEXT: vmv2r.v v14, v8174; CHECK-NEXT: vfwadd.vv v8, v14, v12175; CHECK-NEXT: ret176 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>177 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>178 %ve = fadd <vscale x 4 x double> %vc, %vd179 ret <vscale x 4 x double> %ve180}181 182define <vscale x 4 x double> @vfwadd_vf_nxv4f64(<vscale x 4 x float> %va, float %b) {183; CHECK-LABEL: vfwadd_vf_nxv4f64:184; CHECK: # %bb.0:185; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma186; CHECK-NEXT: vmv2r.v v12, v8187; CHECK-NEXT: vfwadd.vf v8, v12, fa0188; CHECK-NEXT: ret189 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0190 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer191 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>192 %vd = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>193 %ve = fadd <vscale x 4 x double> %vc, %vd194 ret <vscale x 4 x double> %ve195}196 197define <vscale x 4 x double> @vfwadd_vf_nxv4f64_2(<vscale x 4 x float> %va, float %b) {198; CHECK-LABEL: vfwadd_vf_nxv4f64_2:199; CHECK: # %bb.0:200; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma201; CHECK-NEXT: vmv2r.v v12, v8202; CHECK-NEXT: vfwadd.vf v8, v12, fa0203; CHECK-NEXT: ret204 %fpext = fpext float %b to double205 %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0206 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer207 %vc = fpext <vscale x 4 x float> %va to <vscale x 4 x double>208 %ve = fadd <vscale x 4 x double> %vc, %splat209 ret <vscale x 4 x double> %ve210}211 212define <vscale x 4 x double> @vfwadd_wv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb) {213; CHECK-LABEL: vfwadd_wv_nxv4f64:214; CHECK: # %bb.0:215; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma216; CHECK-NEXT: vfwadd.wv v8, v8, v12217; CHECK-NEXT: ret218 %vc = fpext <vscale x 4 x float> %vb to <vscale x 4 x double>219 %vd = fadd <vscale x 4 x double> %va, %vc220 ret <vscale x 4 x double> %vd221}222 223define <vscale x 4 x double> @vfwadd_wf_nxv4f64(<vscale x 4 x double> %va, float %b) {224; CHECK-LABEL: vfwadd_wf_nxv4f64:225; CHECK: # %bb.0:226; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma227; CHECK-NEXT: vfwadd.wf v8, v8, fa0228; CHECK-NEXT: ret229 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0230 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer231 %vc = fpext <vscale x 4 x float> %splat to <vscale x 4 x double>232 %vd = fadd <vscale x 4 x double> %va, %vc233 ret <vscale x 4 x double> %vd234}235 236define <vscale x 4 x double> @vfwadd_wf_nxv4f64_2(<vscale x 4 x double> %va, float %b) {237; CHECK-LABEL: vfwadd_wf_nxv4f64_2:238; CHECK: # %bb.0:239; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma240; CHECK-NEXT: vfwadd.wf v8, v8, fa0241; CHECK-NEXT: ret242 %fpext = fpext float %b to double243 %head = insertelement <vscale x 4 x double> poison, double %fpext, i32 0244 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer245 %vd = fadd <vscale x 4 x double> %va, %splat246 ret <vscale x 4 x double> %vd247}248 249define <vscale x 8 x double> @vfwadd_vv_nxv8f64(<vscale x 8 x float> %va, <vscale x 8 x float> %vb) {250; CHECK-LABEL: vfwadd_vv_nxv8f64:251; CHECK: # %bb.0:252; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma253; CHECK-NEXT: vmv4r.v v16, v12254; CHECK-NEXT: vmv4r.v v20, v8255; CHECK-NEXT: vfwadd.vv v8, v20, v16256; CHECK-NEXT: ret257 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>258 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>259 %ve = fadd <vscale x 8 x double> %vc, %vd260 ret <vscale x 8 x double> %ve261}262 263define <vscale x 8 x double> @vfwadd_vf_nxv8f64(<vscale x 8 x float> %va, float %b) {264; CHECK-LABEL: vfwadd_vf_nxv8f64:265; CHECK: # %bb.0:266; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma267; CHECK-NEXT: vmv4r.v v16, v8268; CHECK-NEXT: vfwadd.vf v8, v16, fa0269; CHECK-NEXT: ret270 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0271 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer272 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>273 %vd = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>274 %ve = fadd <vscale x 8 x double> %vc, %vd275 ret <vscale x 8 x double> %ve276}277 278define <vscale x 8 x double> @vfwadd_vf_nxv8f64_2(<vscale x 8 x float> %va, float %b) {279; CHECK-LABEL: vfwadd_vf_nxv8f64_2:280; CHECK: # %bb.0:281; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma282; CHECK-NEXT: vmv4r.v v16, v8283; CHECK-NEXT: vfwadd.vf v8, v16, fa0284; CHECK-NEXT: ret285 %fpext = fpext float %b to double286 %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0287 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer288 %vc = fpext <vscale x 8 x float> %va to <vscale x 8 x double>289 %ve = fadd <vscale x 8 x double> %vc, %splat290 ret <vscale x 8 x double> %ve291}292 293define <vscale x 8 x double> @vfwadd_wv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb) {294; CHECK-LABEL: vfwadd_wv_nxv8f64:295; CHECK: # %bb.0:296; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma297; CHECK-NEXT: vfwadd.wv v8, v8, v16298; CHECK-NEXT: ret299 %vc = fpext <vscale x 8 x float> %vb to <vscale x 8 x double>300 %vd = fadd <vscale x 8 x double> %va, %vc301 ret <vscale x 8 x double> %vd302}303 304define <vscale x 8 x double> @vfwadd_wf_nxv8f64(<vscale x 8 x double> %va, float %b) {305; CHECK-LABEL: vfwadd_wf_nxv8f64:306; CHECK: # %bb.0:307; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma308; CHECK-NEXT: vfwadd.wf v8, v8, fa0309; CHECK-NEXT: ret310 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0311 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer312 %vc = fpext <vscale x 8 x float> %splat to <vscale x 8 x double>313 %vd = fadd <vscale x 8 x double> %va, %vc314 ret <vscale x 8 x double> %vd315}316 317define <vscale x 8 x double> @vfwadd_wf_nxv8f64_2(<vscale x 8 x double> %va, float %b) {318; CHECK-LABEL: vfwadd_wf_nxv8f64_2:319; CHECK: # %bb.0:320; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma321; CHECK-NEXT: vfwadd.wf v8, v8, fa0322; CHECK-NEXT: ret323 %fpext = fpext float %b to double324 %head = insertelement <vscale x 8 x double> poison, double %fpext, i32 0325 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer326 %vd = fadd <vscale x 8 x double> %va, %splat327 ret <vscale x 8 x double> %vd328}329 330define <vscale x 1 x double> @vfwadd_vv_nxv1f64_same_op(<vscale x 1 x float> %va) {331; CHECK-LABEL: vfwadd_vv_nxv1f64_same_op:332; CHECK: # %bb.0:333; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma334; CHECK-NEXT: vfwadd.vv v9, v8, v8335; CHECK-NEXT: vmv1r.v v8, v9336; CHECK-NEXT: ret337 %vb = fpext <vscale x 1 x float> %va to <vscale x 1 x double>338 %vc = fadd <vscale x 1 x double> %vb, %vb339 ret <vscale x 1 x double> %vc340}341