1111; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
1212; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
1313; RUN: --check-prefixes=CHECK,ZVFHMIN
14- ; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh ,+experimental-zvfbfa,+v \
14+ ; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfhmin ,+experimental-zvfbfa,+v \
1515; RUN: -verify-machineinstrs < %s | FileCheck %s \
1616; RUN: --check-prefixes=CHECK,ZVFBFA
17- ; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh ,+experimental-zvfbfa,+v \
17+ ; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfhmin ,+experimental-zvfbfa,+v \
1818; RUN: -verify-machineinstrs < %s | FileCheck %s \
1919; RUN: --check-prefixes=CHECK,ZVFBFA
2020
@@ -563,7 +563,12 @@ define <vscale x 1 x half> @vfadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x
563563; ZVFBFA-LABEL: vfadd_vv_nxv1f16:
564564; ZVFBFA: # %bb.0:
565565; ZVFBFA-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
566- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v9
566+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v9
567+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v9, v8
568+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
569+ ; ZVFBFA-NEXT: vfadd.vv v9, v9, v10
570+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
571+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v9
567572; ZVFBFA-NEXT: ret
568573 %vc = fadd <vscale x 1 x half > %va , %vb
569574 ret <vscale x 1 x half > %vc
@@ -589,8 +594,15 @@ define <vscale x 1 x half> @vfadd_vf_nxv1f16(<vscale x 1 x half> %va, half %b) {
589594;
590595; ZVFBFA-LABEL: vfadd_vf_nxv1f16:
591596; ZVFBFA: # %bb.0:
592- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
593- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
597+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
598+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
599+ ; ZVFBFA-NEXT: vmv.v.x v9, a0
600+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v8
601+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v9
602+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
603+ ; ZVFBFA-NEXT: vfadd.vv v9, v10, v8
604+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
605+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v9
594606; ZVFBFA-NEXT: ret
595607 %head = insertelement <vscale x 1 x half > poison, half %b , i32 0
596608 %splat = shufflevector <vscale x 1 x half > %head , <vscale x 1 x half > poison, <vscale x 1 x i32 > zeroinitializer
@@ -619,7 +631,12 @@ define <vscale x 2 x half> @vfadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x
619631; ZVFBFA-LABEL: vfadd_vv_nxv2f16:
620632; ZVFBFA: # %bb.0:
621633; ZVFBFA-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
622- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v9
634+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v9
635+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v9, v8
636+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m1, ta, ma
637+ ; ZVFBFA-NEXT: vfadd.vv v9, v9, v10
638+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
639+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v9
623640; ZVFBFA-NEXT: ret
624641 %vc = fadd <vscale x 2 x half > %va , %vb
625642 ret <vscale x 2 x half > %vc
@@ -645,8 +662,15 @@ define <vscale x 2 x half> @vfadd_vf_nxv2f16(<vscale x 2 x half> %va, half %b) {
645662;
646663; ZVFBFA-LABEL: vfadd_vf_nxv2f16:
647664; ZVFBFA: # %bb.0:
648- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
649- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
665+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
666+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
667+ ; ZVFBFA-NEXT: vmv.v.x v9, a0
668+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v8
669+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v9
670+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m1, ta, ma
671+ ; ZVFBFA-NEXT: vfadd.vv v9, v10, v8
672+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
673+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v9
650674; ZVFBFA-NEXT: ret
651675 %head = insertelement <vscale x 2 x half > poison, half %b , i32 0
652676 %splat = shufflevector <vscale x 2 x half > %head , <vscale x 2 x half > poison, <vscale x 2 x i32 > zeroinitializer
@@ -675,7 +699,12 @@ define <vscale x 4 x half> @vfadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x
675699; ZVFBFA-LABEL: vfadd_vv_nxv4f16:
676700; ZVFBFA: # %bb.0:
677701; ZVFBFA-NEXT: vsetvli a0, zero, e16, m1, ta, ma
678- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v9
702+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v9
703+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v12, v8
704+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m2, ta, ma
705+ ; ZVFBFA-NEXT: vfadd.vv v10, v12, v10
706+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m1, ta, ma
707+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v10
679708; ZVFBFA-NEXT: ret
680709 %vc = fadd <vscale x 4 x half > %va , %vb
681710 ret <vscale x 4 x half > %vc
@@ -701,8 +730,15 @@ define <vscale x 4 x half> @vfadd_vf_nxv4f16(<vscale x 4 x half> %va, half %b) {
701730;
702731; ZVFBFA-LABEL: vfadd_vf_nxv4f16:
703732; ZVFBFA: # %bb.0:
704- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m1, ta, ma
705- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
733+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
734+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m1, ta, ma
735+ ; ZVFBFA-NEXT: vmv.v.x v12, a0
736+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v10, v8
737+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v12
738+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m2, ta, ma
739+ ; ZVFBFA-NEXT: vfadd.vv v10, v10, v8
740+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m1, ta, ma
741+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v10
706742; ZVFBFA-NEXT: ret
707743 %head = insertelement <vscale x 4 x half > poison, half %b , i32 0
708744 %splat = shufflevector <vscale x 4 x half > %head , <vscale x 4 x half > poison, <vscale x 4 x i32 > zeroinitializer
@@ -731,7 +767,12 @@ define <vscale x 8 x half> @vfadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x
731767; ZVFBFA-LABEL: vfadd_vv_nxv8f16:
732768; ZVFBFA: # %bb.0:
733769; ZVFBFA-NEXT: vsetvli a0, zero, e16, m2, ta, ma
734- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v10
770+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v12, v10
771+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v8
772+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m4, ta, ma
773+ ; ZVFBFA-NEXT: vfadd.vv v12, v16, v12
774+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m2, ta, ma
775+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v12
735776; ZVFBFA-NEXT: ret
736777 %vc = fadd <vscale x 8 x half > %va , %vb
737778 ret <vscale x 8 x half > %vc
@@ -757,8 +798,15 @@ define <vscale x 8 x half> @vfadd_vf_nxv8f16(<vscale x 8 x half> %va, half %b) {
757798;
758799; ZVFBFA-LABEL: vfadd_vf_nxv8f16:
759800; ZVFBFA: # %bb.0:
760- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m2, ta, ma
761- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
801+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
802+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m2, ta, ma
803+ ; ZVFBFA-NEXT: vmv.v.x v16, a0
804+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v12, v8
805+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v16
806+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m4, ta, ma
807+ ; ZVFBFA-NEXT: vfadd.vv v12, v12, v8
808+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m2, ta, ma
809+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v12
762810; ZVFBFA-NEXT: ret
763811 %head = insertelement <vscale x 8 x half > poison, half %b , i32 0
764812 %splat = shufflevector <vscale x 8 x half > %head , <vscale x 8 x half > poison, <vscale x 8 x i32 > zeroinitializer
@@ -786,8 +834,15 @@ define <vscale x 8 x half> @vfadd_fv_nxv8f16(<vscale x 8 x half> %va, half %b) {
786834;
787835; ZVFBFA-LABEL: vfadd_fv_nxv8f16:
788836; ZVFBFA: # %bb.0:
789- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m2, ta, ma
790- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
837+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
838+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m2, ta, ma
839+ ; ZVFBFA-NEXT: vmv.v.x v16, a0
840+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v12, v8
841+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v16
842+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m4, ta, ma
843+ ; ZVFBFA-NEXT: vfadd.vv v12, v8, v12
844+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m2, ta, ma
845+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v12
791846; ZVFBFA-NEXT: ret
792847 %head = insertelement <vscale x 8 x half > poison, half %b , i32 0
793848 %splat = shufflevector <vscale x 8 x half > %head , <vscale x 8 x half > poison, <vscale x 8 x i32 > zeroinitializer
@@ -816,7 +871,12 @@ define <vscale x 16 x half> @vfadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale
816871; ZVFBFA-LABEL: vfadd_vv_nxv16f16:
817872; ZVFBFA: # %bb.0:
818873; ZVFBFA-NEXT: vsetvli a0, zero, e16, m4, ta, ma
819- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v12
874+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v12
875+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v24, v8
876+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
877+ ; ZVFBFA-NEXT: vfadd.vv v16, v24, v16
878+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
879+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v16
820880; ZVFBFA-NEXT: ret
821881 %vc = fadd <vscale x 16 x half > %va , %vb
822882 ret <vscale x 16 x half > %vc
@@ -842,8 +902,15 @@ define <vscale x 16 x half> @vfadd_vf_nxv16f16(<vscale x 16 x half> %va, half %b
842902;
843903; ZVFBFA-LABEL: vfadd_vf_nxv16f16:
844904; ZVFBFA: # %bb.0:
845- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m4, ta, ma
846- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
905+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
906+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m4, ta, ma
907+ ; ZVFBFA-NEXT: vmv.v.x v24, a0
908+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v8
909+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v8, v24
910+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
911+ ; ZVFBFA-NEXT: vfadd.vv v16, v16, v8
912+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
913+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v16
847914; ZVFBFA-NEXT: ret
848915 %head = insertelement <vscale x 16 x half > poison, half %b , i32 0
849916 %splat = shufflevector <vscale x 16 x half > %head , <vscale x 16 x half > poison, <vscale x 16 x i32 > zeroinitializer
@@ -892,8 +959,34 @@ define <vscale x 32 x half> @vfadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale
892959;
893960; ZVFBFA-LABEL: vfadd_vv_nxv32f16:
894961; ZVFBFA: # %bb.0:
895- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m8, ta, ma
896- ; ZVFBFA-NEXT: vfadd.vv v8, v8, v16
962+ ; ZVFBFA-NEXT: addi sp, sp, -16
963+ ; ZVFBFA-NEXT: .cfi_def_cfa_offset 16
964+ ; ZVFBFA-NEXT: csrr a0, vlenb
965+ ; ZVFBFA-NEXT: slli a0, a0, 3
966+ ; ZVFBFA-NEXT: sub sp, sp, a0
967+ ; ZVFBFA-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
968+ ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m4, ta, ma
969+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v24, v16
970+ ; ZVFBFA-NEXT: addi a0, sp, 16
971+ ; ZVFBFA-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill
972+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v0, v8
973+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v24, v20
974+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v12
975+ ; ZVFBFA-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload
976+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
977+ ; ZVFBFA-NEXT: vfadd.vv v0, v0, v8
978+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
979+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v0
980+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
981+ ; ZVFBFA-NEXT: vfadd.vv v16, v16, v24
982+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
983+ ; ZVFBFA-NEXT: vfncvt.f.f.w v12, v16
984+ ; ZVFBFA-NEXT: csrr a0, vlenb
985+ ; ZVFBFA-NEXT: slli a0, a0, 3
986+ ; ZVFBFA-NEXT: add sp, sp, a0
987+ ; ZVFBFA-NEXT: .cfi_def_cfa sp, 16
988+ ; ZVFBFA-NEXT: addi sp, sp, 16
989+ ; ZVFBFA-NEXT: .cfi_def_cfa_offset 0
897990; ZVFBFA-NEXT: ret
898991 %vc = fadd <vscale x 32 x half > %va , %vb
899992 ret <vscale x 32 x half > %vc
@@ -945,8 +1038,39 @@ define <vscale x 32 x half> @vfadd_vf_nxv32f16(<vscale x 32 x half> %va, half %b
9451038;
9461039; ZVFBFA-LABEL: vfadd_vf_nxv32f16:
9471040; ZVFBFA: # %bb.0:
948- ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m8, ta, ma
949- ; ZVFBFA-NEXT: vfadd.vf v8, v8, fa0
1041+ ; ZVFBFA-NEXT: addi sp, sp, -16
1042+ ; ZVFBFA-NEXT: .cfi_def_cfa_offset 16
1043+ ; ZVFBFA-NEXT: csrr a0, vlenb
1044+ ; ZVFBFA-NEXT: slli a0, a0, 3
1045+ ; ZVFBFA-NEXT: sub sp, sp, a0
1046+ ; ZVFBFA-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
1047+ ; ZVFBFA-NEXT: fmv.x.w a0, fa0
1048+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m4, ta, ma
1049+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v8
1050+ ; ZVFBFA-NEXT: addi a1, sp, 16
1051+ ; ZVFBFA-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill
1052+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v24, v12
1053+ ; ZVFBFA-NEXT: vsetvli a1, zero, e16, m8, ta, ma
1054+ ; ZVFBFA-NEXT: vmv.v.x v8, a0
1055+ ; ZVFBFA-NEXT: vsetvli a0, zero, e16, m4, ta, ma
1056+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v0, v8
1057+ ; ZVFBFA-NEXT: vfwcvt.f.f.v v16, v12
1058+ ; ZVFBFA-NEXT: addi a0, sp, 16
1059+ ; ZVFBFA-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload
1060+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
1061+ ; ZVFBFA-NEXT: vfadd.vv v0, v8, v0
1062+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
1063+ ; ZVFBFA-NEXT: vfncvt.f.f.w v8, v0
1064+ ; ZVFBFA-NEXT: vsetvli zero, zero, e32, m8, ta, ma
1065+ ; ZVFBFA-NEXT: vfadd.vv v16, v24, v16
1066+ ; ZVFBFA-NEXT: vsetvli zero, zero, e16, m4, ta, ma
1067+ ; ZVFBFA-NEXT: vfncvt.f.f.w v12, v16
1068+ ; ZVFBFA-NEXT: csrr a0, vlenb
1069+ ; ZVFBFA-NEXT: slli a0, a0, 3
1070+ ; ZVFBFA-NEXT: add sp, sp, a0
1071+ ; ZVFBFA-NEXT: .cfi_def_cfa sp, 16
1072+ ; ZVFBFA-NEXT: addi sp, sp, 16
1073+ ; ZVFBFA-NEXT: .cfi_def_cfa_offset 0
9501074; ZVFBFA-NEXT: ret
9511075 %head = insertelement <vscale x 32 x half > poison, half %b , i32 0
9521076 %splat = shufflevector <vscale x 32 x half > %head , <vscale x 32 x half > poison, <vscale x 32 x i32 > zeroinitializer
0 commit comments