Skip to content

Commit 8beb9d3

Browse files
[RISCV][VLOPT] Add vector widening floating point add subtract instructions to isSupportedInstr
1 parent c036a9a commit 8beb9d3

File tree

2 files changed

+177
-0
lines changed

2 files changed

+177
-0
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,15 @@ static bool isSupportedInstr(const MachineInstr &MI) {
989989
case RISCV::VFSUB_VF:
990990
case RISCV::VFSUB_VV:
991991
case RISCV::VFRSUB_VF:
992+
// Vector Widening Floating-Point Add/Subtract Instructions
993+
case RISCV::VFWADD_VV:
994+
case RISCV::VFWADD_VF:
995+
case RISCV::VFWSUB_VV:
996+
case RISCV::VFWSUB_VF:
997+
case RISCV::VFWADD_WF:
998+
case RISCV::VFWADD_WV:
999+
case RISCV::VFWSUB_WF:
1000+
case RISCV::VFWSUB_WV:
9921001
// Single-Width Floating-Point/Integer Type-Convert Instructions
9931002
case RISCV::VFCVT_XU_F_V:
9941003
case RISCV::VFCVT_X_F_V:

llvm/test/CodeGen/RISCV/rvv/vl-opt-instrs.ll

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3025,3 +3025,171 @@ define <vscale x 4 x float> @vfrsub_vx(<vscale x 4 x float> %a, float %b, iXLen
30253025
%2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
30263026
ret <vscale x 4 x float> %2
30273027
}
3028+
3029+
define <vscale x 4 x double> @vfwadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3030+
; NOVLOPT-LABEL: vfwadd_vv:
3031+
; NOVLOPT: # %bb.0:
3032+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3033+
; NOVLOPT-NEXT: vfwadd.vv v12, v8, v10
3034+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3035+
; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3036+
; NOVLOPT-NEXT: ret
3037+
;
3038+
; VLOPT-LABEL: vfwadd_vv:
3039+
; VLOPT: # %bb.0:
3040+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3041+
; VLOPT-NEXT: vfwadd.vv v12, v8, v10
3042+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3043+
; VLOPT-NEXT: vfadd.vv v8, v12, v12
3044+
; VLOPT-NEXT: ret
3045+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3046+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3047+
ret <vscale x 4 x double> %2
3048+
}
3049+
3050+
define <vscale x 4 x double> @vfwadd_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3051+
; NOVLOPT-LABEL: vfwadd_vf:
3052+
; NOVLOPT: # %bb.0:
3053+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3054+
; NOVLOPT-NEXT: vfwadd.vf v12, v8, fa0
3055+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3056+
; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3057+
; NOVLOPT-NEXT: ret
3058+
;
3059+
; VLOPT-LABEL: vfwadd_vf:
3060+
; VLOPT: # %bb.0:
3061+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3062+
; VLOPT-NEXT: vfwadd.vf v12, v8, fa0
3063+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3064+
; VLOPT-NEXT: vfadd.vv v8, v12, v12
3065+
; VLOPT-NEXT: ret
3066+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3067+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3068+
ret <vscale x 4 x double> %2
3069+
}
3070+
3071+
define <vscale x 4 x double> @vfwsub_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3072+
; NOVLOPT-LABEL: vfwsub_vv:
3073+
; NOVLOPT: # %bb.0:
3074+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3075+
; NOVLOPT-NEXT: vfwsub.vv v12, v8, v10
3076+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3077+
; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3078+
; NOVLOPT-NEXT: ret
3079+
;
3080+
; VLOPT-LABEL: vfwsub_vv:
3081+
; VLOPT: # %bb.0:
3082+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3083+
; VLOPT-NEXT: vfwsub.vv v12, v8, v10
3084+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3085+
; VLOPT-NEXT: vfadd.vv v8, v12, v12
3086+
; VLOPT-NEXT: ret
3087+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3088+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3089+
ret <vscale x 4 x double> %2
3090+
}
3091+
3092+
define <vscale x 4 x double> @vfwsub_vx(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3093+
; NOVLOPT-LABEL: vfwsub_vx:
3094+
; NOVLOPT: # %bb.0:
3095+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3096+
; NOVLOPT-NEXT: vfwsub.vf v12, v8, fa0
3097+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3098+
; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3099+
; NOVLOPT-NEXT: ret
3100+
;
3101+
; VLOPT-LABEL: vfwsub_vx:
3102+
; VLOPT: # %bb.0:
3103+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3104+
; VLOPT-NEXT: vfwsub.vf v12, v8, fa0
3105+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3106+
; VLOPT-NEXT: vfadd.vv v8, v12, v12
3107+
; VLOPT-NEXT: ret
3108+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3109+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3110+
ret <vscale x 4 x double> %2
3111+
}
3112+
3113+
define <vscale x 4 x double> @vfwadd_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) {
3114+
; NOVLOPT-LABEL: vfwadd_wv:
3115+
; NOVLOPT: # %bb.0:
3116+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3117+
; NOVLOPT-NEXT: vfwadd.wv v8, v8, v12
3118+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3119+
; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3120+
; NOVLOPT-NEXT: ret
3121+
;
3122+
; VLOPT-LABEL: vfwadd_wv:
3123+
; VLOPT: # %bb.0:
3124+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3125+
; VLOPT-NEXT: vfwadd.wv v8, v8, v12
3126+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3127+
; VLOPT-NEXT: vfadd.vv v8, v8, v8
3128+
; VLOPT-NEXT: ret
3129+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3130+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3131+
ret <vscale x 4 x double> %2
3132+
}
3133+
3134+
define <vscale x 4 x double> @vfwadd_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) {
3135+
; NOVLOPT-LABEL: vfwadd_wf:
3136+
; NOVLOPT: # %bb.0:
3137+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3138+
; NOVLOPT-NEXT: vfwadd.wf v8, v8, fa0
3139+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3140+
; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3141+
; NOVLOPT-NEXT: ret
3142+
;
3143+
; VLOPT-LABEL: vfwadd_wf:
3144+
; VLOPT: # %bb.0:
3145+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3146+
; VLOPT-NEXT: vfwadd.wf v8, v8, fa0
3147+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3148+
; VLOPT-NEXT: vfadd.vv v8, v8, v8
3149+
; VLOPT-NEXT: ret
3150+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1)
3151+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3152+
ret <vscale x 4 x double> %2
3153+
}
3154+
3155+
define <vscale x 4 x double> @vfwsub_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) {
3156+
; NOVLOPT-LABEL: vfwsub_wv:
3157+
; NOVLOPT: # %bb.0:
3158+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3159+
; NOVLOPT-NEXT: vfwsub.wv v8, v8, v12
3160+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3161+
; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3162+
; NOVLOPT-NEXT: ret
3163+
;
3164+
; VLOPT-LABEL: vfwsub_wv:
3165+
; VLOPT: # %bb.0:
3166+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3167+
; VLOPT-NEXT: vfwsub.wv v8, v8, v12
3168+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3169+
; VLOPT-NEXT: vfadd.vv v8, v8, v8
3170+
; VLOPT-NEXT: ret
3171+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3172+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3173+
ret <vscale x 4 x double> %2
3174+
}
3175+
3176+
define <vscale x 4 x double> @vfwsub_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) {
3177+
; NOVLOPT-LABEL: vfwsub_wf:
3178+
; NOVLOPT: # %bb.0:
3179+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3180+
; NOVLOPT-NEXT: vfwsub.wf v8, v8, fa0
3181+
; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3182+
; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3183+
; NOVLOPT-NEXT: ret
3184+
;
3185+
; VLOPT-LABEL: vfwsub_wf:
3186+
; VLOPT: # %bb.0:
3187+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3188+
; VLOPT-NEXT: vfwsub.wf v8, v8, fa0
3189+
; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3190+
; VLOPT-NEXT: vfadd.vv v8, v8, v8
3191+
; VLOPT-NEXT: ret
3192+
%1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1)
3193+
%2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3194+
ret <vscale x 4 x double> %2
3195+
}

0 commit comments

Comments
 (0)