-
Notifications
You must be signed in to change notification settings - Fork 15.2k
RuntimeLibcalls: Add definitions for vector math functions #167026
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
RuntimeLibcalls: Add definitions for vector math functions #167026
Conversation
|
@llvm/pr-subscribers-llvm-ir @llvm/pr-subscribers-llvm-selectiondag Author: Matt Arsenault (arsenm) ChangesThis is mostly the output of a vibe coded script running on One annoying piece is there are some name conflicts across the libraries. Patch is 56.38 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/167026.diff 1 Files Affected:
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index 98d863bfbb000..54d67249c3c1c 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -182,10 +182,64 @@ foreach FPTy = ["F32", "F64", "F80", "F128", "PPCF128"] in {
def MODF_#FPTy : RuntimeLibcall;
}
-foreach VecTy = ["V4F32", "V2F64", "NXV4F32", "NXV2F64"] in {
- def MODF_#VecTy : RuntimeLibcall;
- def SINCOS_#VecTy : RuntimeLibcall;
- def SINCOSPI_#VecTy : RuntimeLibcall;
+defvar F32VectorSuffixes = ["V2F32", "V4F32", "V8F32", "V16F32", "NXV2F32",
+ "NXV4F32"];
+defvar F64VectorSuffixes = ["V2F64", "V4F64", "V8F64", "NXV2F64"];
+
+foreach S = !listconcat(F32VectorSuffixes, F64VectorSuffixes) in {
+ def ACOS_#S : RuntimeLibcall;
+ def ACOSH_#S : RuntimeLibcall;
+ def ASIN_#S : RuntimeLibcall;
+ def ASINH_#S : RuntimeLibcall;
+ def ATAN_#S : RuntimeLibcall;
+ def ATAN2_#S : RuntimeLibcall;
+ def ATANH_#S : RuntimeLibcall;
+ def CBRT_#S : RuntimeLibcall;
+ def CEIL_#S : RuntimeLibcall;
+ def COPYSIGN_#S : RuntimeLibcall;
+ def COS_#S : RuntimeLibcall;
+ def COSH_#S : RuntimeLibcall;
+ def COSPI_#S : RuntimeLibcall;
+ def ERFC_#S : RuntimeLibcall;
+ def ERF_#S : RuntimeLibcall;
+ def EXP_#S : RuntimeLibcall;
+ def EXP_FINITE_#S : RuntimeLibcall;
+ def EXP10_#S : RuntimeLibcall;
+ def EXP2_#S : RuntimeLibcall;
+ def EXPM1_#S : RuntimeLibcall;
+ def FABS_#S : RuntimeLibcall;
+ def FDIM_#S : RuntimeLibcall;
+ def FLOOR_#S : RuntimeLibcall;
+ def FMA_#S : RuntimeLibcall;
+ def FMAX_#S : RuntimeLibcall;
+ def FMIN_#S : RuntimeLibcall;
+ def FMOD_#S : RuntimeLibcall;
+ def HYPOT_#S : RuntimeLibcall;
+ def ILOGB_#S : RuntimeLibcall;
+ def LDEXP_#S : RuntimeLibcall;
+ def LGAMMA_#S : RuntimeLibcall;
+ def LOG_#S : RuntimeLibcall;
+ def LOG10_#S : RuntimeLibcall;
+ def LOG1P_#S : RuntimeLibcall;
+ def LOG2_#S : RuntimeLibcall;
+ def LOGB_#S : RuntimeLibcall;
+ def MODF_#S : RuntimeLibcall;
+ def NEXTAFTER_#S : RuntimeLibcall;
+ def POW_#S : RuntimeLibcall;
+ def SINCOS_#S : RuntimeLibcall;
+ def SINCOSPI_#S : RuntimeLibcall;
+ def SIN_#S : RuntimeLibcall;
+ def SINH_#S : RuntimeLibcall;
+ def SINPI_#S : RuntimeLibcall;
+ def SQRT_#S : RuntimeLibcall;
+ def TAN_#S : RuntimeLibcall;
+ def TANH_#S : RuntimeLibcall;
+ def TGAMMA_#S : RuntimeLibcall;
+}
+
+foreach S = F64VectorSuffixes in {
+ def LOG_FINITE_#S : RuntimeLibcall;
+ def POW_FINITE_#S : RuntimeLibcall;
}
def FEGETENV : RuntimeLibcall;
@@ -1089,50 +1143,6 @@ def __security_check_cookie : RuntimeLibcallImpl<SECURITY_CHECK_COOKIE>;
def __security_check_cookie_arm64ec : RuntimeLibcallImpl<SECURITY_CHECK_COOKIE,
"#__security_check_cookie_arm64ec">;
-//===----------------------------------------------------------------------===//
-// sleef calls
-//===----------------------------------------------------------------------===//
-
-defset list<RuntimeLibcallImpl> SleefLibcalls = {
- def _ZGVnN2vl8_modf : RuntimeLibcallImpl<MODF_V2F64>;
- def _ZGVnN4vl4_modff : RuntimeLibcallImpl<MODF_V4F32>;
- def _ZGVsNxvl8_modf : RuntimeLibcallImpl<MODF_NXV2F64>;
- def _ZGVsNxvl4_modff : RuntimeLibcallImpl<MODF_NXV4F32>;
-
- def _ZGVnN2vl8l8_sincos : RuntimeLibcallImpl<SINCOS_V2F64>;
- def _ZGVnN4vl4l4_sincosf : RuntimeLibcallImpl<SINCOS_V4F32>;
- def _ZGVsNxvl8l8_sincos : RuntimeLibcallImpl<SINCOS_NXV2F64>;
- def _ZGVsNxvl4l4_sincosf : RuntimeLibcallImpl<SINCOS_NXV4F32>;
-
- def _ZGVnN4vl4l4_sincospif : RuntimeLibcallImpl<SINCOSPI_V4F32>;
- def _ZGVnN2vl8l8_sincospi : RuntimeLibcallImpl<SINCOSPI_V2F64>;
- def _ZGVsNxvl4l4_sincospif : RuntimeLibcallImpl<SINCOSPI_NXV4F32>;
- def _ZGVsNxvl8l8_sincospi : RuntimeLibcallImpl<SINCOSPI_NXV2F64>;
-}
-
-//===----------------------------------------------------------------------===//
-// ARMPL calls
-//===----------------------------------------------------------------------===//
-
-defset list<RuntimeLibcallImpl> ARMPLLibcalls = {
- def armpl_vmodfq_f64 : RuntimeLibcallImpl<MODF_V2F64>; // CallingConv::AArch64_VectorCall
- def armpl_vmodfq_f32 : RuntimeLibcallImpl<MODF_V4F32>; // CallingConv::AArch64_VectorCall
- def armpl_svmodf_f64_x : RuntimeLibcallImpl<MODF_NXV2F64>;
- def armpl_svmodf_f32_x : RuntimeLibcallImpl<MODF_NXV4F32>;
-
- def armpl_vsincosq_f64
- : RuntimeLibcallImpl<SINCOS_V2F64>; // CallingConv::AArch64_VectorCall
- def armpl_vsincosq_f32
- : RuntimeLibcallImpl<SINCOS_V4F32>; // CallingConv::AArch64_VectorCall
- def armpl_svsincos_f64_x : RuntimeLibcallImpl<SINCOS_NXV2F64>;
- def armpl_svsincos_f32_x : RuntimeLibcallImpl<SINCOS_NXV4F32>;
-
- def armpl_vsincospiq_f32 : RuntimeLibcallImpl<SINCOSPI_V4F32>;
- def armpl_vsincospiq_f64 : RuntimeLibcallImpl<SINCOSPI_V2F64>;
- def armpl_svsincospi_f32_x : RuntimeLibcallImpl<SINCOSPI_NXV4F32>;
- def armpl_svsincospi_f64_x : RuntimeLibcallImpl<SINCOSPI_NXV2F64>;
-}
-
//===----------------------------------------------------------------------===//
// F128 libm Runtime Libcalls
//===----------------------------------------------------------------------===//
@@ -2769,3 +2779,926 @@ def LegacyDefaultSystemLibrary
LibcallImpls<(add Int128RTLibcalls), isArch64Bit>,
DefaultStackProtector
)>;
+
+//===----------------------------------------------------------------------===//
+// Vector math libraries
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// Accelerate framework functions
+//===----------------------------------------------------------------------===//
+
+defset list<RuntimeLibcallImpl> ACCELERATE_VECFUNCS = {
+ def vacosf : RuntimeLibcallImpl<ACOS_V4F32>;
+ def vacoshf : RuntimeLibcallImpl<ACOSH_V4F32>;
+ def vasinf : RuntimeLibcallImpl<ASIN_V4F32>;
+ def vasinhf : RuntimeLibcallImpl<ASINH_V4F32>;
+ def vatan2f : RuntimeLibcallImpl<ATAN2_V4F32>;
+ def vatanf : RuntimeLibcallImpl<ATAN_V4F32>;
+ def vatanhf : RuntimeLibcallImpl<ATANH_V4F32>;
+ def vceilf : RuntimeLibcallImpl<CEIL_V4F32>;
+ def vcosf : RuntimeLibcallImpl<COS_V4F32>;
+ def vcoshf : RuntimeLibcallImpl<COSH_V4F32>;
+ def vexpf : RuntimeLibcallImpl<EXP_V4F32>;
+ def vexpm1f : RuntimeLibcallImpl<EXPM1_V4F32>;
+ def vfabsf : RuntimeLibcallImpl<FABS_V4F32>;
+ def vfloorf : RuntimeLibcallImpl<FLOOR_V4F32>;
+ def vlog10f : RuntimeLibcallImpl<LOG10_V4F32>;
+ def vlog1pf : RuntimeLibcallImpl<LOG1P_V4F32>;
+ def vlogbf : RuntimeLibcallImpl<LOGB_V4F32>;
+ def vlogf : RuntimeLibcallImpl<LOG_V4F32>;
+ def vsinf : RuntimeLibcallImpl<SIN_V4F32>;
+ def vsinhf : RuntimeLibcallImpl<SINH_V4F32>;
+ def vsqrtf : RuntimeLibcallImpl<SQRT_V4F32>;
+ def vtanf : RuntimeLibcallImpl<TAN_V4F32>;
+ def vtanhf : RuntimeLibcallImpl<TANH_V4F32>;
+}
+
+//===----------------------------------------------------------------------===//
+// Darwin_libsystem_m vector functions
+//===----------------------------------------------------------------------===//
+
+defset list<RuntimeLibcallImpl> DARWIN_LIBSYSTEM_M_VECFUNCS = {
+ def _simd_acos_d2 : RuntimeLibcallImpl<ACOS_V2F64>;
+ def _simd_acos_f4 : RuntimeLibcallImpl<ACOS_V4F32>;
+ def _simd_acosh_d2 : RuntimeLibcallImpl<ACOSH_V2F64>;
+ def _simd_acosh_f4 : RuntimeLibcallImpl<ACOSH_V4F32>;
+ def _simd_asin_d2 : RuntimeLibcallImpl<ASIN_V2F64>;
+ def _simd_asin_f4 : RuntimeLibcallImpl<ASIN_V4F32>;
+ def _simd_asinh_d2 : RuntimeLibcallImpl<ASINH_V2F64>;
+ def _simd_asinh_f4 : RuntimeLibcallImpl<ASINH_V4F32>;
+ def _simd_atan2_d2 : RuntimeLibcallImpl<ATAN2_V2F64>;
+ def _simd_atan2_f4 : RuntimeLibcallImpl<ATAN2_V4F32>;
+ def _simd_atan_d2 : RuntimeLibcallImpl<ATAN_V2F64>;
+ def _simd_atan_f4 : RuntimeLibcallImpl<ATAN_V4F32>;
+ def _simd_atanh_d2 : RuntimeLibcallImpl<ATANH_V2F64>;
+ def _simd_atanh_f4 : RuntimeLibcallImpl<ATANH_V4F32>;
+ def _simd_cbrt_d2 : RuntimeLibcallImpl<CBRT_V2F64>;
+ def _simd_cbrt_f4 : RuntimeLibcallImpl<CBRT_V4F32>;
+ def _simd_cos_d2 : RuntimeLibcallImpl<COS_V2F64>;
+ def _simd_cos_f4 : RuntimeLibcallImpl<COS_V4F32>;
+ def _simd_cosh_d2 : RuntimeLibcallImpl<COSH_V2F64>;
+ def _simd_cosh_f4 : RuntimeLibcallImpl<COSH_V4F32>;
+ def _simd_erf_d2 : RuntimeLibcallImpl<ERF_V2F32>;
+ def _simd_erf_f4 : RuntimeLibcallImpl<ERF_V4F32>;
+ def _simd_exp_d2 : RuntimeLibcallImpl<EXP_V2F64>;
+ def _simd_exp_f4 : RuntimeLibcallImpl<EXP_V4F32>;
+ def _simd_pow_d2 : RuntimeLibcallImpl<POW_V2F64>;
+ def _simd_pow_f4 : RuntimeLibcallImpl<POW_V4F32>;
+ def _simd_sin_d2 : RuntimeLibcallImpl<SIN_V2F64>;
+ def _simd_sin_f4 : RuntimeLibcallImpl<SIN_V4F32>;
+ def _simd_sinh_d2 : RuntimeLibcallImpl<SINH_V2F64>;
+ def _simd_sinh_f4 : RuntimeLibcallImpl<SINH_V4F32>;
+ def _simd_tan_d2 : RuntimeLibcallImpl<TAN_V2F64>;
+ def _simd_tan_f4 : RuntimeLibcallImpl<TAN_V4F32>;
+ def _simd_tanh_d2 : RuntimeLibcallImpl<TANH_V2F64>;
+ def _simd_tanh_f4 : RuntimeLibcallImpl<TANH_V4F32>;
+}
+
+//===----------------------------------------------------------------------===//
+// GLIBC Vector Math library LIBMVEC functions
+//===----------------------------------------------------------------------===//
+
+defvar LIBMVECPrefix = "LIBMVEC_";
+
+class LibmvecLibcall<RuntimeLibcall P>
+ : RuntimeLibcallImpl<P, !substr(NAME, !size(LIBMVECPrefix))>;
+
+defset list<RuntimeLibcallImpl> LIBMVEC_X86_VECFUNCS = {
+ def LIBMVEC__ZGVbN2v___exp_finite : LibmvecLibcall<EXP_FINITE_V2F64>;
+ def LIBMVEC__ZGVbN2v___log_finite : LibmvecLibcall<LOG_FINITE_V2F64>;
+ def LIBMVEC__ZGVbN2v_cos : LibmvecLibcall<COS_V2F64>;
+ def LIBMVEC__ZGVbN2v_exp : LibmvecLibcall<EXP_V2F64>;
+ def LIBMVEC__ZGVbN2v_log : LibmvecLibcall<LOG_V2F64>;
+ def LIBMVEC__ZGVbN2v_sin : LibmvecLibcall<SIN_V2F64>;
+ def LIBMVEC__ZGVbN2v_tan : LibmvecLibcall<TAN_V2F64>;
+ def LIBMVEC__ZGVbN2vv___pow_finite : LibmvecLibcall<POW_FINITE_V2F64>;
+ def LIBMVEC__ZGVbN2vv_pow : LibmvecLibcall<POW_V2F64>;
+ def LIBMVEC__ZGVbN4v___expf_finite : LibmvecLibcall<EXP_FINITE_V4F64>;
+ def LIBMVEC__ZGVbN4v___logf_finite : LibmvecLibcall<LOG_FINITE_V4F64>;
+ def LIBMVEC__ZGVbN4v_cosf : LibmvecLibcall<COS_V4F32>;
+ def LIBMVEC__ZGVbN4v_expf : LibmvecLibcall<EXP_V4F32>;
+ def LIBMVEC__ZGVbN4v_logf : LibmvecLibcall<LOG_V4F32>;
+ def LIBMVEC__ZGVbN4v_sinf : LibmvecLibcall<SIN_V4F32>;
+ def LIBMVEC__ZGVbN4v_tanf : LibmvecLibcall<TAN_V4F32>;
+ def LIBMVEC__ZGVbN4vv___powf_finite : LibmvecLibcall<POW_FINITE_V4F64>;
+ def LIBMVEC__ZGVbN4vv_powf : LibmvecLibcall<POW_V4F32>;
+ def LIBMVEC__ZGVdN4v___exp_finite : LibmvecLibcall<EXP_FINITE_V4F64>;
+ def LIBMVEC__ZGVdN4v___log_finite : LibmvecLibcall<LOG_FINITE_V4F64>;
+ def LIBMVEC__ZGVdN4v_cos : LibmvecLibcall<COS_V4F64>;
+ def LIBMVEC__ZGVdN4v_exp : LibmvecLibcall<EXP_V4F64>;
+ def LIBMVEC__ZGVdN4v_log : LibmvecLibcall<LOG_V4F64>;
+ def LIBMVEC__ZGVdN4v_sin : LibmvecLibcall<SIN_V4F64>;
+ def LIBMVEC__ZGVdN4v_tan : LibmvecLibcall<TAN_V4F64>;
+ def LIBMVEC__ZGVdN4vv___pow_finite : LibmvecLibcall<POW_FINITE_V4F64>;
+ def LIBMVEC__ZGVdN4vv_pow : LibmvecLibcall<POW_V4F64>;
+ def LIBMVEC__ZGVdN8v___expf_finite : LibmvecLibcall<EXP_FINITE_V8F64>;
+ def LIBMVEC__ZGVdN8v___logf_finite : LibmvecLibcall<LOG_FINITE_V8F64>;
+ def LIBMVEC__ZGVdN8v_cosf : LibmvecLibcall<COS_V8F32>;
+ def LIBMVEC__ZGVdN8v_expf : LibmvecLibcall<EXP_V8F32>;
+ def LIBMVEC__ZGVdN8v_logf : LibmvecLibcall<LOG_V8F32>;
+ def LIBMVEC__ZGVdN8v_sinf : LibmvecLibcall<SIN_V8F32>;
+ def LIBMVEC__ZGVdN8v_tanf : LibmvecLibcall<TAN_V8F32>;
+ def LIBMVEC__ZGVdN8vv___powf_finite : LibmvecLibcall<POW_FINITE_V8F64>;
+ def LIBMVEC__ZGVdN8vv_powf : LibmvecLibcall<POW_V8F32>;
+}
+
+defset list<RuntimeLibcallImpl> LIBMVEC_AARCH64_VECFUNCS = {
+ def LIBMVEC__ZGVnN2v_acos : LibmvecLibcall<ACOS_V2F64>;
+ def LIBMVEC__ZGVnN2v_acosf : LibmvecLibcall<ACOS_V2F32>;
+ def LIBMVEC__ZGVnN2v_acosh : LibmvecLibcall<ACOSH_V2F64>;
+ def LIBMVEC__ZGVnN2v_acoshf : LibmvecLibcall<ACOSH_V2F32>;
+ def LIBMVEC__ZGVnN2v_asin : LibmvecLibcall<ASIN_V2F64>;
+ def LIBMVEC__ZGVnN2v_asinf : LibmvecLibcall<ASIN_V2F32>;
+ def LIBMVEC__ZGVnN2v_asinh : LibmvecLibcall<ASINH_V2F64>;
+ def LIBMVEC__ZGVnN2v_asinhf : LibmvecLibcall<ASINH_V2F32>;
+ def LIBMVEC__ZGVnN2v_atan : LibmvecLibcall<ATAN_V2F64>;
+ def LIBMVEC__ZGVnN2v_atanf : LibmvecLibcall<ATAN_V2F32>;
+ def LIBMVEC__ZGVnN2v_atanh : LibmvecLibcall<ATANH_V2F64>;
+ def LIBMVEC__ZGVnN2v_atanhf : LibmvecLibcall<ATANH_V2F32>;
+ def LIBMVEC__ZGVnN2v_cbrt : LibmvecLibcall<CBRT_V2F64>;
+ def LIBMVEC__ZGVnN2v_cbrtf : LibmvecLibcall<CBRT_V2F32>;
+ def LIBMVEC__ZGVnN2v_cos : LibmvecLibcall<COS_V2F64>;
+ def LIBMVEC__ZGVnN2v_cosf : LibmvecLibcall<COS_V2F32>;
+ def LIBMVEC__ZGVnN2v_cosh : LibmvecLibcall<COSH_V2F64>;
+ def LIBMVEC__ZGVnN2v_coshf : LibmvecLibcall<COSH_V2F32>;
+ def LIBMVEC__ZGVnN2v_erf : LibmvecLibcall<ERF_V2F32>;
+ def LIBMVEC__ZGVnN2v_erfc : LibmvecLibcall<ERFC_V2F64>;
+ def LIBMVEC__ZGVnN2v_erfcf : LibmvecLibcall<ERFC_V2F32>;
+ def LIBMVEC__ZGVnN2v_erff : LibmvecLibcall<ERF_V2F32>;
+ def LIBMVEC__ZGVnN2v_exp : LibmvecLibcall<EXP_V2F64>;
+ def LIBMVEC__ZGVnN2v_exp10 : LibmvecLibcall<EXP10_V2F64>;
+ def LIBMVEC__ZGVnN2v_exp10f : LibmvecLibcall<EXP10_V2F32>;
+ def LIBMVEC__ZGVnN2v_exp2 : LibmvecLibcall<EXP2_V2F64>;
+ def LIBMVEC__ZGVnN2v_exp2f : LibmvecLibcall<EXP2_V2F32>;
+ def LIBMVEC__ZGVnN2v_expf : LibmvecLibcall<EXP_V2F32>;
+ def LIBMVEC__ZGVnN2v_expm1 : LibmvecLibcall<EXPM1_V2F64>;
+ def LIBMVEC__ZGVnN2v_expm1f : LibmvecLibcall<EXPM1_V2F32>;
+ def LIBMVEC__ZGVnN2v_log : LibmvecLibcall<LOG_V2F64>;
+ def LIBMVEC__ZGVnN2v_log10 : LibmvecLibcall<LOG10_V2F64>;
+ def LIBMVEC__ZGVnN2v_log10f : LibmvecLibcall<LOG10_V2F32>;
+ def LIBMVEC__ZGVnN2v_log1p : LibmvecLibcall<LOG1P_V2F64>;
+ def LIBMVEC__ZGVnN2v_log1pf : LibmvecLibcall<LOG1P_V2F32>;
+ def LIBMVEC__ZGVnN2v_log2 : LibmvecLibcall<LOG2_V2F64>;
+ def LIBMVEC__ZGVnN2v_log2f : LibmvecLibcall<LOG2_V2F32>;
+ def LIBMVEC__ZGVnN2v_logf : LibmvecLibcall<LOG_V2F32>;
+ def LIBMVEC__ZGVnN2v_sin : LibmvecLibcall<SIN_V2F64>;
+ def LIBMVEC__ZGVnN2v_sinf : LibmvecLibcall<SIN_V2F32>;
+ def LIBMVEC__ZGVnN2v_sinh : LibmvecLibcall<SINH_V2F64>;
+ def LIBMVEC__ZGVnN2v_sinhf : LibmvecLibcall<SINH_V2F32>;
+ def LIBMVEC__ZGVnN2v_tan : LibmvecLibcall<TAN_V2F64>;
+ def LIBMVEC__ZGVnN2v_tanf : LibmvecLibcall<TAN_V2F32>;
+ def LIBMVEC__ZGVnN2v_tanh : LibmvecLibcall<TANH_V2F64>;
+ def LIBMVEC__ZGVnN2v_tanhf : LibmvecLibcall<TANH_V2F32>;
+ def LIBMVEC__ZGVnN2vv_atan2 : LibmvecLibcall<ATAN2_V2F64>;
+ def LIBMVEC__ZGVnN2vv_atan2f : LibmvecLibcall<ATAN2_V2F32>;
+ def LIBMVEC__ZGVnN2vv_hypot : LibmvecLibcall<HYPOT_V2F64>;
+ def LIBMVEC__ZGVnN2vv_hypotf : LibmvecLibcall<HYPOT_V2F32>;
+ def LIBMVEC__ZGVnN2vv_pow : LibmvecLibcall<POW_V2F64>;
+ def LIBMVEC__ZGVnN2vv_powf : LibmvecLibcall<POW_V2F32>;
+ def LIBMVEC__ZGVnN4v_acosf : LibmvecLibcall<ACOS_V4F32>;
+ def LIBMVEC__ZGVnN4v_acoshf : LibmvecLibcall<ACOSH_V4F32>;
+ def LIBMVEC__ZGVnN4v_asinf : LibmvecLibcall<ASIN_V4F32>;
+ def LIBMVEC__ZGVnN4v_asinhf : LibmvecLibcall<ASINH_V4F32>;
+ def LIBMVEC__ZGVnN4v_atanf : LibmvecLibcall<ATAN_V4F32>;
+ def LIBMVEC__ZGVnN4v_atanhf : LibmvecLibcall<ATANH_V4F32>;
+ def LIBMVEC__ZGVnN4v_cbrtf : LibmvecLibcall<CBRT_V4F32>;
+ def LIBMVEC__ZGVnN4v_cosf : LibmvecLibcall<COS_V4F32>;
+ def LIBMVEC__ZGVnN4v_coshf : LibmvecLibcall<COSH_V4F32>;
+ def LIBMVEC__ZGVnN4v_erfcf : LibmvecLibcall<ERFC_V4F32>;
+ def LIBMVEC__ZGVnN4v_erff : LibmvecLibcall<ERF_V4F32>;
+ def LIBMVEC__ZGVnN4v_exp10f : LibmvecLibcall<EXP10_V4F32>;
+ def LIBMVEC__ZGVnN4v_exp2f : LibmvecLibcall<EXP2_V4F32>;
+ def LIBMVEC__ZGVnN4v_expf : LibmvecLibcall<EXP_V4F32>;
+ def LIBMVEC__ZGVnN4v_expm1f : LibmvecLibcall<EXPM1_V4F32>;
+ def LIBMVEC__ZGVnN4v_log10f : LibmvecLibcall<LOG10_V4F32>;
+ def LIBMVEC__ZGVnN4v_log1pf : LibmvecLibcall<LOG1P_V4F32>;
+ def LIBMVEC__ZGVnN4v_log2f : LibmvecLibcall<LOG2_V4F32>;
+ def LIBMVEC__ZGVnN4v_logf : LibmvecLibcall<LOG_V4F32>;
+ def LIBMVEC__ZGVnN4v_sinf : LibmvecLibcall<SIN_V4F32>;
+ def LIBMVEC__ZGVnN4v_sinhf : LibmvecLibcall<SINH_V4F32>;
+ def LIBMVEC__ZGVnN4v_tanf : LibmvecLibcall<TAN_V4F32>;
+ def LIBMVEC__ZGVnN4v_tanhf : LibmvecLibcall<TANH_V4F32>;
+ def LIBMVEC__ZGVnN4vv_atan2f : LibmvecLibcall<ATAN2_V4F32>;
+ def LIBMVEC__ZGVnN4vv_hypotf : LibmvecLibcall<HYPOT_V4F32>;
+ def LIBMVEC__ZGVnN4vv_powf : LibmvecLibcall<POW_V4F32>;
+ def LIBMVEC__ZGVsMxv_acos : LibmvecLibcall<ACOS_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_acosf : LibmvecLibcall<ACOS_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_acosh : LibmvecLibcall<ACOSH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_acoshf : LibmvecLibcall<ACOSH_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_asin : LibmvecLibcall<ASIN_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_asinf : LibmvecLibcall<ASIN_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_asinh : LibmvecLibcall<ASINH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_asinhf : LibmvecLibcall<ASINH_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_atan : LibmvecLibcall<ATAN_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_atanf : LibmvecLibcall<ATAN_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_atanh : LibmvecLibcall<ATANH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_atanhf : LibmvecLibcall<ATANH_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_cbrt : LibmvecLibcall<CBRT_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_cbrtf : LibmvecLibcall<CBRT_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_cos : LibmvecLibcall<COS_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_cosf : LibmvecLibcall<COS_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_cosh : LibmvecLibcall<COSH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_coshf : LibmvecLibcall<COSH_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_erf : LibmvecLibcall<ERF_NXV2F32>;
+ def LIBMVEC__ZGVsMxv_erfc : LibmvecLibcall<ERFC_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_erfcf : LibmvecLibcall<ERFC_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_erff : LibmvecLibcall<ERF_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_exp : LibmvecLibcall<EXP_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_exp10 : LibmvecLibcall<EXP10_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_exp10f : LibmvecLibcall<EXP10_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_exp2 : LibmvecLibcall<EXP2_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_exp2f : LibmvecLibcall<EXP2_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_expf : LibmvecLibcall<EXP_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_expm1 : LibmvecLibcall<EXPM1_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_expm1f : LibmvecLibcall<EXPM1_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_log : LibmvecLibcall<LOG_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_log10 : LibmvecLibcall<LOG10_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_log10f : LibmvecLibcall<LOG10_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_log1p : LibmvecLibcall<LOG1P_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_log1pf : LibmvecLibcall<LOG1P_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_log2 : LibmvecLibcall<LOG2_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_log2f : LibmvecLibcall<LOG2_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_logf : LibmvecLibcall<LOG_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_sin : LibmvecLibcall<SIN_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_sinf : LibmvecLibcall<SIN_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_sinh : LibmvecLibcall<SINH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_sinhf : LibmvecLibcall<SINH_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_tan : LibmvecLibcall<TAN_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_tanf : LibmvecLibcall<TAN_NXV4F32>;
+ def LIBMVEC__ZGVsMxv_tanh : LibmvecLibcall<TANH_NXV2F64>;
+ def LIBMVEC__ZGVsMxv_tanhf : LibmvecLibcall<TANH_NXV4F32>;
+ def LIBMVEC__ZGVsMxvv_atan2 : LibmvecLibcall<ATAN2_NXV2F64>;
+ def LIBMVEC__ZGVsMxvv_atan2f : LibmvecLibcall<ATAN2_NXV4F32>;
+ def LIBMVEC__ZGVsMxvv_hypot : LibmvecLibcall<HYPOT_NXV2F64>;
+ def LIBMVEC__ZGVsMxvv_hypotf : LibmvecLibcall<HYPOT_NXV4F32>;
+ def LIBMVEC__ZGVsMxvv_pow : LibmvecLibcall<POW_NXV2F64>;
+ def LIBMVEC__ZGVsMxvv_powf : LibmvecLibcall<POW_NXV4F32>;
+}
+
+//===----------------------------------------------------------------------===//
+// IBM MASS vector library (MASSV) functions
+//===----------------------------------------------------------------------===//
+
+defset list<RuntimeLibcallImpl> MASSV_VECFUNCS = {
+ def __acosd2 : RuntimeLibcallImpl<ACOS_V2F64>;
+ def __acosf4 : RuntimeLibcallImpl<ACOS_V4F32>;
+ def __acoshd2 : RuntimeLibcallImpl<ACOSH_V2F64>;
+ def __acoshf4 : RuntimeLibcallImpl<ACOSH_V4F32>;
+ def __asind2 : RuntimeLibcallImpl<ASIN_V2F64>;
+ def __asinf4 : RuntimeLibcallImpl<ASIN_V4F32>;
+ def __asinhd2 : RuntimeLibcallImpl<ASINH_V2F64>;
+ def __asinhf4 : RuntimeLibcallImpl<ASINH_V4F32>;
+ def __atan2d2 : RuntimeLibcallImpl<ATAN2_V2F64>;
+ def __atan2f4 : RuntimeLibcallImpl<ATAN2_V4F32>;
+ def __atand2 : RuntimeLibcallImpl<ATAN_V2F64>;
+ ...
[truncated]
|
866dba4 to
090c10a
Compare
62eca91 to
213cae7
Compare
090c10a to
9cb5465
Compare
|
What is the ultimate purpose of these PR? One of my use cases is using SLEEFGNUABI as libmvec on MinGW that doesn't have libmvec. Will this be affected? |
Merge TargetLibraryInfo and RuntimeLibcalls. We're maintaining 2 lists of functions now that are basically the same thing |
| def SINCOS_#VecTy : RuntimeLibcall; | ||
| def SINCOSPI_#VecTy : RuntimeLibcall; | ||
| defvar F32VectorSuffixes = ["V2F32", "V4F32", "V8F32", "V16F32", "NXV4F32"]; | ||
| defvar F64VectorSuffixes = ["V2F64", "V4F64", "V8F64", "NXV2F64"]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Compared to VABI_PREFIX in VecFuncs.def, VectorSuffixes appears to lack certain semantics. For instance, in VecFuncs.def, it is possible to add “FIXED(8), MASKED, _ZGV_LLVM_M8vv”, but in VectorSuffixes, V8F64 seems unable to express the NOMASK/MASKED semantics.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this can't express all information yet. This is far too much to handle at once
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's gained from adding so many incomplete definitions though? This might cause a lot of churn as RuntimeLibcall gains capabilities that require many of these definitions to be updated? Does it hamper your progress if say a couple of each type is added instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it helps see the scope of exactly what tablegen needs to be able to express. At this point I think the bigger problem is expressing the logical groups of functions per library is more pressing than the type signatures
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, but properties like whether a vector function is masked are now in active use, and once this PR lands hasVectorMaskArgument becomes out of sync/broken. Manually updating/verifying that function is fine when there's only a few entries and you just want to get the structure down. However, while the properties are separated like this I don't want to have to do it for all functions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hasVectorMaskArgument doesn't break because it's only implemented for cases that have manually specified type information
b983fd3 to
b6e6f8d
Compare
9853e99 to
db5e3c2
Compare
0aaa77d to
691fac5
Compare
db5e3c2 to
0a118b3
Compare
This kind of helper is higher level and not general enough to go directly in SelectionDAG. Most similar utilities are in TargetLowering.
This is mostly the output of a vibe coded script running on VecFuncs.def, with a lot of manual cleanups and fixing where the vibes were off. This is not yet wired up to anything (except for the handful of calls which are already manually enabled). In the future the SystemLibrary mechanism needs to be generalized to allow plugging these sets in based on the flag. One annoying piece is there are some name conflicts across the libraries. Some of the libmvec functions have name collisions with some sleef functions. I solved this by just adding a prefix to the libmvec functions. It would probably be a good idea to add a prefix to every group. It gets ugly, particularly since some of the sleef functions started to use a Sleef_ prefix, but mostly do not.
691fac5 to
4a7df0a
Compare
0a118b3 to
c106789
Compare

This is mostly the output of a vibe coded script running on
VecFuncs.def, with a lot of manual cleanups and fixing where the
vibes were off. This is not yet wired up to anything (except for the
handful of calls which are already manually enabled). In the future
the SystemLibrary mechanism needs to be generalized to allow plugging
these sets in based on the flag.
One annoying piece is there are some name conflicts across the libraries.
Some of the libmvec functions have name collisions with some sleef functions.
I solved this by just adding a prefix to the libmvec functions. It would
probably be a good idea to add a prefix to every group. It gets ugly,
particularly since some of the sleef functions started to use a Sleef_ prefix,
but mostly do not.