diff --git a/include/llvm/IR/IntrinsicsARM.td b/include/llvm/IR/IntrinsicsARM.td index 9c9339cb9f8..80ab3a73d39 100644 --- a/include/llvm/IR/IntrinsicsARM.td +++ b/include/llvm/IR/IntrinsicsARM.td @@ -1158,4 +1158,8 @@ defm int_arm_mve_vcvt_fix: MVEMXPredicated< [llvm_anyvector_ty /* output */], [llvm_i32_ty], [llvm_anyvector_ty /* input vector */, llvm_i32_ty /* scale */], LLVMMatchType<0>, llvm_anyvector_ty>; + +def int_arm_mve_vrintn: Intrinsic< + [llvm_anyvector_ty], [LLVMMatchType<0>], [IntrNoMem]>; + } // end TargetPrefix diff --git a/lib/Target/ARM/ARMInstrMVE.td b/lib/Target/ARM/ARMInstrMVE.td index 5a2bb9c89c2..b0ec20494b8 100644 --- a/lib/Target/ARM/ARMInstrMVE.td +++ b/lib/Target/ARM/ARMInstrMVE.td @@ -3179,6 +3179,10 @@ let Predicates = [HasMVEFloat] in { (v4f32 (MVE_VRINTf32P (v4f32 MQPR:$val1)))>; def : Pat<(v8f16 (fceil (v8f16 MQPR:$val1))), (v8f16 (MVE_VRINTf16P (v8f16 MQPR:$val1)))>; + def : Pat<(v4f32 (int_arm_mve_vrintn (v4f32 MQPR:$val1))), + (v4f32 (MVE_VRINTf32N (v4f32 MQPR:$val1)))>; + def : Pat<(v8f16 (int_arm_mve_vrintn (v8f16 MQPR:$val1))), + (v8f16 (MVE_VRINTf16N (v8f16 MQPR:$val1)))>; } class MVEFloatArithNeon @test_vrndnq_f16(<8 x half> %a) { +; CHECK-LABEL: test_vrndnq_f16: +; CHECK: @ %bb.0: @ %entry +; CHECK-NEXT: vrintn.f16 q0, q0 +; CHECK-NEXT: bx lr +entry: + %0 = tail call <8 x half> @llvm.arm.mve.vrintn.v8f16(<8 x half> %a) + ret <8 x half> %0 +} + +define arm_aapcs_vfpcc <4 x float> @test_vrndnq_f32(<4 x float> %a) { +; CHECK-LABEL: test_vrndnq_f32: +; CHECK: @ %bb.0: @ %entry +; CHECK-NEXT: vrintn.f32 q0, q0 +; CHECK-NEXT: bx lr +entry: + %0 = tail call <4 x float> @llvm.arm.mve.vrintn.v4f32(<4 x float> %a) + ret <4 x float> %0 +} + +declare <8 x half> @llvm.arm.mve.vrintn.v8f16(<8 x half>) +declare <4 x float> @llvm.arm.mve.vrintn.v4f32(<4 x float>)