Skip to content

Commit 1e58735

Browse files
committed
[RuntimeLibcalls] Use a multiclass for all libm impls
`LibmLongDoubleLibcalls` currently handles generating definitions for the three long double variants, but `F32` and `F64` always get a written definition. Simplify this by changing `LibmLongDoubleLibcalls` to `LibmLibcallImpls` that also expands `F32` and `F64`. As part of this, `LibmLibcallImpls` can take a function name with an `X` placeholder, to be replaced with the float type suffix. This allows the multiclass to also be used for libcalls with the suffix in the middle rather than strictly at the end.
1 parent 9de657a commit 1e58735

File tree

1 file changed

+64
-219
lines changed

1 file changed

+64
-219
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 64 additions & 219 deletions
Original file line numberDiff line numberDiff line change
@@ -352,17 +352,26 @@ def MIPS16_RET_DF : RuntimeLibcall;
352352
def MIPS16_RET_SC : RuntimeLibcall;
353353
def MIPS16_RET_SF : RuntimeLibcall;
354354

355-
multiclass LibmLongDoubleLibCall<string libcall_basename = !toupper(NAME),
356-
string rtbasename = NAME> {
355+
// Produce libcall impls for all float types. If provided, `rtbasename` should
356+
// contain an `X` that will be replaced with the `f`/`l`/`fX` suffix (if not
357+
// provided, it is appended to the def name).
358+
multiclass LibmLibcallImpls<string libcall_basename = !toupper(NAME),
359+
string rtbasename = !strconcat(NAME, "X")> {
360+
def NAME#"f"
361+
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F32"),
362+
!subst("X", "f", rtbasename)>;
363+
def NAME#""
364+
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F64"),
365+
!subst("X", "", rtbasename)>;
357366
def NAME#"_f128"
358367
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F128"),
359-
!strconcat(rtbasename, "l")>;
368+
!subst("X", "l", rtbasename)>;
360369
def NAME#"_ppcf128"
361370
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_PPCF128"),
362-
!strconcat(rtbasename, "l")>;
371+
!subst("X", "l", rtbasename)>;
363372
def NAME#"_f80"
364373
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F80"),
365-
!strconcat(rtbasename, "l")>;
374+
!subst("X", "l", rtbasename)>;
366375
}
367376

368377
// AArch64 calls
@@ -692,217 +701,55 @@ def __riscv_flush_icache : RuntimeLibcallImpl<RISCV_FLUSH_ICACHE>;
692701
// libm
693702
//--------------------------------------------------------------------
694703

695-
def fmodf : RuntimeLibcallImpl<REM_F32>;
696-
def fmod : RuntimeLibcallImpl<REM_F64>;
697-
def fmodl_f128 : RuntimeLibcallImpl<REM_F128, "fmodl">;
698-
def fmodl_f80 : RuntimeLibcallImpl<REM_F80, "fmodl">;
699-
def fmodl_ppc128 : RuntimeLibcallImpl<REM_PPCF128, "fmodl">;
700-
701-
def fmaf : RuntimeLibcallImpl<FMA_F32>;
702-
def fma : RuntimeLibcallImpl<FMA_F64>;
703-
defm fma : LibmLongDoubleLibCall;
704-
705-
def sqrtf : RuntimeLibcallImpl<SQRT_F32>;
706-
def sqrt : RuntimeLibcallImpl<SQRT_F64>;
707-
defm sqrt : LibmLongDoubleLibCall;
708-
709-
def cbrtf : RuntimeLibcallImpl<CBRT_F32>;
710-
def cbrt : RuntimeLibcallImpl<CBRT_F64>;
711-
defm cbrt : LibmLongDoubleLibCall;
712-
713-
def logf : RuntimeLibcallImpl<LOG_F32>;
714-
def log : RuntimeLibcallImpl<LOG_F64>;
715-
defm log : LibmLongDoubleLibCall;
716-
717-
def __logf_finite : RuntimeLibcallImpl<LOG_FINITE_F32>;
718-
def __log_finite : RuntimeLibcallImpl<LOG_FINITE_F64>;
719-
def __logl_finite_f80 : RuntimeLibcallImpl<LOG_FINITE_F80, "__logl_finite">;
720-
def __logl_finite_f128 : RuntimeLibcallImpl<LOG_FINITE_F128, "__logl_finite">;
721-
def __logl_finite_ppcf128 : RuntimeLibcallImpl<LOG_FINITE_PPCF128, "__logl_finite">;
722-
723-
def log2f : RuntimeLibcallImpl<LOG2_F32>;
724-
def log2 : RuntimeLibcallImpl<LOG2_F64>;
725-
defm log2 : LibmLongDoubleLibCall;
726-
727-
def __log2f_finite : RuntimeLibcallImpl<LOG2_FINITE_F32>;
728-
def __log2_finite : RuntimeLibcallImpl<LOG2_FINITE_F64>;
729-
def __log2l_finite_f80 : RuntimeLibcallImpl<LOG2_FINITE_F80, "__log2l_finite">;
730-
def __log2l_finite_f128 : RuntimeLibcallImpl<LOG2_FINITE_F128, "__log2l_finite">;
731-
def __log2l_finite_ppcf128 : RuntimeLibcallImpl<LOG2_FINITE_PPCF128, "__log2l_finite">;
732-
733-
def log10f : RuntimeLibcallImpl<LOG10_F32>;
734-
def log10 : RuntimeLibcallImpl<LOG10_F64>;
735-
defm log10 : LibmLongDoubleLibCall;
736-
737-
def __log10f_finite : RuntimeLibcallImpl<LOG10_FINITE_F32>;
738-
def __log10_finite : RuntimeLibcallImpl<LOG10_FINITE_F64>;
739-
def __log10l_finite_f80 : RuntimeLibcallImpl<LOG10_FINITE_F80, "__log10l_finite">;
740-
def __log10l_finite_f128 : RuntimeLibcallImpl<LOG10_FINITE_F128, "__log10l_finite">;
741-
def __log10l_finite_ppcf128 : RuntimeLibcallImpl<LOG10_FINITE_PPCF128, "__log10l_finite">;
742-
743-
def expf : RuntimeLibcallImpl<EXP_F32>;
744-
def exp : RuntimeLibcallImpl<EXP_F64>;
745-
defm exp : LibmLongDoubleLibCall<"EXP", "exp">;
746-
747-
def __expf_finite : RuntimeLibcallImpl<EXP_FINITE_F32>;
748-
def __exp_finite : RuntimeLibcallImpl<EXP_FINITE_F64>;
749-
def __expl_finite_f80 : RuntimeLibcallImpl<EXP_FINITE_F80, "__expl_finite">;
750-
def __expl_finite_f128 : RuntimeLibcallImpl<EXP_FINITE_F128, "__expl_finite">;
751-
def __expl_finite_ppcf128 : RuntimeLibcallImpl<EXP_FINITE_PPCF128, "__expl_finite">;
752-
753-
def exp2f : RuntimeLibcallImpl<EXP2_F32>;
754-
def exp2 : RuntimeLibcallImpl<EXP2_F64>;
755-
defm exp2 : LibmLongDoubleLibCall<"EXP2", "exp2">;
756-
757-
def __exp2f_finite : RuntimeLibcallImpl<EXP2_FINITE_F32>;
758-
def __exp2_finite : RuntimeLibcallImpl<EXP2_FINITE_F64>;
759-
def __exp2l_finite_f80 : RuntimeLibcallImpl<EXP2_FINITE_F80, "__exp2l_finite">;
760-
def __exp2l_finite_f128 : RuntimeLibcallImpl<EXP2_FINITE_F128, "__exp2l_finite">;
761-
def __exp2l_finite_ppcf128 : RuntimeLibcallImpl<EXP2_FINITE_PPCF128, "__exp2l_finite">;
762-
763-
def exp10f : RuntimeLibcallImpl<EXP10_F32>;
764-
def exp10 : RuntimeLibcallImpl<EXP10_F64>;
765-
def exp10l_f80 : RuntimeLibcallImpl<EXP10_F80, "exp10l">;
766-
def exp10l_f128 : RuntimeLibcallImpl<EXP10_F128, "exp10l">;
767-
def exp10l_ppcf128 : RuntimeLibcallImpl<EXP10_PPCF128, "exp10l">;
768-
769-
def sinf : RuntimeLibcallImpl<SIN_F32>;
770-
def sin : RuntimeLibcallImpl<SIN_F64>;
771-
defm sin : LibmLongDoubleLibCall;
772-
773-
def cosf : RuntimeLibcallImpl<COS_F32>;
774-
def cos : RuntimeLibcallImpl<COS_F64>;
775-
defm cos : LibmLongDoubleLibCall;
776-
777-
def tanf : RuntimeLibcallImpl<TAN_F32>;
778-
def tan : RuntimeLibcallImpl<TAN_F64>;
779-
defm tan : LibmLongDoubleLibCall;
780-
781-
def sinhf : RuntimeLibcallImpl<SINH_F32>;
782-
def sinh : RuntimeLibcallImpl<SINH_F64>;
783-
defm sinh : LibmLongDoubleLibCall;
784-
785-
def coshf : RuntimeLibcallImpl<COSH_F32>;
786-
def cosh : RuntimeLibcallImpl<COSH_F64>;
787-
defm cosh : LibmLongDoubleLibCall;
788-
789-
def tanhf : RuntimeLibcallImpl<TANH_F32>;
790-
def tanh : RuntimeLibcallImpl<TANH_F64>;
791-
defm tanh : LibmLongDoubleLibCall;
792-
793-
def asinf : RuntimeLibcallImpl<ASIN_F32>;
794-
def asin : RuntimeLibcallImpl<ASIN_F64>;
795-
defm asin : LibmLongDoubleLibCall;
796-
797-
def acosf : RuntimeLibcallImpl<ACOS_F32>;
798-
def acos : RuntimeLibcallImpl<ACOS_F64>;
799-
defm acos : LibmLongDoubleLibCall;
800-
801-
def atanf : RuntimeLibcallImpl<ATAN_F32>;
802-
def atan : RuntimeLibcallImpl<ATAN_F64>;
803-
defm atan : LibmLongDoubleLibCall;
804-
805-
def atan2f : RuntimeLibcallImpl<ATAN2_F32>;
806-
def atan2 : RuntimeLibcallImpl<ATAN2_F64>;
807-
defm atan2 : LibmLongDoubleLibCall;
808-
809-
def powf : RuntimeLibcallImpl<POW_F32>;
810-
def pow : RuntimeLibcallImpl<POW_F64>;
811-
defm pow : LibmLongDoubleLibCall;
812-
813-
def __powf_finite : RuntimeLibcallImpl<POW_FINITE_F32>;
814-
def __pow_finite : RuntimeLibcallImpl<POW_FINITE_F64>;
815-
def __powl_finite_f80 : RuntimeLibcallImpl<POW_FINITE_F80, "__powl_finite">;
816-
def __powl_finite_f128 : RuntimeLibcallImpl<POW_FINITE_F128, "__powl_finite">;
817-
def __powl_finite_ppcf128 : RuntimeLibcallImpl<POW_FINITE_PPCF128, "__powl_finite">;
818-
819-
def ceilf : RuntimeLibcallImpl<CEIL_F32>;
820-
def ceil : RuntimeLibcallImpl<CEIL_F64>;
821-
defm ceil : LibmLongDoubleLibCall;
822-
823-
def truncf : RuntimeLibcallImpl<TRUNC_F32>;
824-
def trunc : RuntimeLibcallImpl<TRUNC_F64>;
825-
defm trunc : LibmLongDoubleLibCall;
826-
827-
def rintf : RuntimeLibcallImpl<RINT_F32>;
828-
def rint : RuntimeLibcallImpl<RINT_F64>;
829-
defm rint : LibmLongDoubleLibCall;
830-
831-
def nearbyintf : RuntimeLibcallImpl<NEARBYINT_F32>;
832-
def nearbyint : RuntimeLibcallImpl<NEARBYINT_F64>;
833-
defm nearbyint : LibmLongDoubleLibCall;
834-
835-
def roundf : RuntimeLibcallImpl<ROUND_F32>;
836-
def round : RuntimeLibcallImpl<ROUND_F64>;
837-
defm round : LibmLongDoubleLibCall;
838-
839-
def roundevenf : RuntimeLibcallImpl<ROUNDEVEN_F32>;
840-
def roundeven : RuntimeLibcallImpl<ROUNDEVEN_F64>;
841-
defm roundeven : LibmLongDoubleLibCall;
842-
843-
def floorf : RuntimeLibcallImpl<FLOOR_F32>;
844-
def floor : RuntimeLibcallImpl<FLOOR_F64>;
845-
defm floor : LibmLongDoubleLibCall;
846-
847-
def copysignf : RuntimeLibcallImpl<COPYSIGN_F32>;
848-
def copysign : RuntimeLibcallImpl<COPYSIGN_F64>;
849-
defm copysign : LibmLongDoubleLibCall;
850-
851-
def fminf : RuntimeLibcallImpl<FMIN_F32>;
852-
def fmin : RuntimeLibcallImpl<FMIN_F64>;
853-
defm fmin : LibmLongDoubleLibCall;
854-
855-
def fmaxf : RuntimeLibcallImpl<FMAX_F32>;
856-
def fmax : RuntimeLibcallImpl<FMAX_F64>;
857-
defm fmax : LibmLongDoubleLibCall;
858-
859-
def fminimumf : RuntimeLibcallImpl<FMINIMUM_F32>;
860-
def fminimum : RuntimeLibcallImpl<FMINIMUM_F64>;
861-
defm fminimum : LibmLongDoubleLibCall;
862-
863-
def fmaximumf : RuntimeLibcallImpl<FMAXIMUM_F32>;
864-
def fmaximum : RuntimeLibcallImpl<FMAXIMUM_F64>;
865-
defm fmaximum : LibmLongDoubleLibCall;
866-
867-
def fminimum_numf : RuntimeLibcallImpl<FMINIMUM_NUM_F32>;
868-
def fminimum_num : RuntimeLibcallImpl<FMINIMUM_NUM_F64>;
869-
defm fminimum_num : LibmLongDoubleLibCall;
870-
871-
def fmaximum_numf : RuntimeLibcallImpl<FMAXIMUM_NUM_F32>;
872-
def fmaximum_num : RuntimeLibcallImpl<FMAXIMUM_NUM_F64>;
873-
defm fmaximum_num : LibmLongDoubleLibCall;
874-
875-
def lroundf : RuntimeLibcallImpl<LROUND_F32>;
876-
def lround : RuntimeLibcallImpl<LROUND_F64>;
877-
defm lround : LibmLongDoubleLibCall;
878-
879-
def llroundf : RuntimeLibcallImpl<LLROUND_F32>;
880-
def llround : RuntimeLibcallImpl<LLROUND_F64>;
881-
defm llround : LibmLongDoubleLibCall;
882-
883-
def lrintf : RuntimeLibcallImpl<LRINT_F32>;
884-
def lrint : RuntimeLibcallImpl<LRINT_F64>;
885-
defm lrint : LibmLongDoubleLibCall;
886-
887-
def llrintf : RuntimeLibcallImpl<LLRINT_F32>;
888-
def llrint : RuntimeLibcallImpl<LLRINT_F64>;
889-
defm llrint : LibmLongDoubleLibCall;
890-
891-
def ldexpf : RuntimeLibcallImpl<LDEXP_F32>;
892-
def ldexp : RuntimeLibcallImpl<LDEXP_F64>;
893-
defm ldexp : LibmLongDoubleLibCall;
894-
895-
def frexpf : RuntimeLibcallImpl<FREXP_F32>;
896-
def frexp : RuntimeLibcallImpl<FREXP_F64>;
897-
defm frexp : LibmLongDoubleLibCall;
898-
899-
def sincospif : RuntimeLibcallImpl<SINCOSPI_F32>;
900-
def sincospi : RuntimeLibcallImpl<SINCOSPI_F64>;
901-
defm sincospi : LibmLongDoubleLibCall;
902-
903-
def modff : RuntimeLibcallImpl<MODF_F32>;
904-
def modf : RuntimeLibcallImpl<MODF_F64>;
905-
defm modf : LibmLongDoubleLibCall;
704+
defm fmod : LibmLibcallImpls<"REM">;
705+
defm fma : LibmLibcallImpls;
706+
defm sqrt : LibmLibcallImpls;
707+
defm cbrt : LibmLibcallImpls;
708+
defm log : LibmLibcallImpls;
709+
defm __log_finite : LibmLibcallImpls<"LOG_FINITE", "__logX_finite">;
710+
defm log2 : LibmLibcallImpls;
711+
defm __log2_finite : LibmLibcallImpls<"LOG2_FINITE", "__log2X_finite">;
712+
defm log10 : LibmLibcallImpls;
713+
defm __log10_finite : LibmLibcallImpls<"LOG10_FINITE", "__log10X_finite">;
714+
defm exp : LibmLibcallImpls;
715+
defm __exp_finite : LibmLibcallImpls<"EXP_FINITE", "__expX_finite">;
716+
defm exp2 : LibmLibcallImpls;
717+
defm __exp2_finite : LibmLibcallImpls<"EXP2_FINITE", "__exp2X_finite">;
718+
defm exp10 : LibmLibcallImpls;
719+
defm sin : LibmLibcallImpls;
720+
defm cos : LibmLibcallImpls;
721+
defm tan : LibmLibcallImpls;
722+
defm sinh : LibmLibcallImpls;
723+
defm cosh : LibmLibcallImpls;
724+
defm tanh : LibmLibcallImpls;
725+
defm asin : LibmLibcallImpls;
726+
defm acos : LibmLibcallImpls;
727+
defm atan : LibmLibcallImpls;
728+
defm atan2 : LibmLibcallImpls;
729+
defm pow : LibmLibcallImpls;
730+
defm __pow_finite : LibmLibcallImpls<"POW_FINITE", "__powX_finite">;
731+
defm ceil : LibmLibcallImpls;
732+
defm trunc : LibmLibcallImpls;
733+
defm rint : LibmLibcallImpls;
734+
defm nearbyint : LibmLibcallImpls;
735+
defm round : LibmLibcallImpls;
736+
defm roundeven : LibmLibcallImpls;
737+
defm floor : LibmLibcallImpls;
738+
defm copysign : LibmLibcallImpls;
739+
defm fmin : LibmLibcallImpls;
740+
defm fmax : LibmLibcallImpls;
741+
defm fminimum : LibmLibcallImpls;
742+
defm fmaximum : LibmLibcallImpls;
743+
defm fminimum_num : LibmLibcallImpls;
744+
defm fmaximum_num : LibmLibcallImpls;
745+
defm lround : LibmLibcallImpls;
746+
defm llround : LibmLibcallImpls;
747+
defm lrint : LibmLibcallImpls;
748+
defm llrint : LibmLibcallImpls;
749+
defm ldexp : LibmLibcallImpls;
750+
defm frexp : LibmLibcallImpls;
751+
defm sincospi : LibmLibcallImpls;
752+
defm modf : LibmLibcallImpls;
906753

907754
// Floating point environment
908755
def fegetenv : RuntimeLibcallImpl<FEGETENV>;
@@ -939,9 +786,7 @@ def __exp10 : RuntimeLibcallImpl<EXP10_F64>;
939786
def __sincosf_stret : RuntimeLibcallImpl<SINCOS_STRET_F32>;
940787
def __sincos_stret : RuntimeLibcallImpl<SINCOS_STRET_F64>;
941788

942-
def sincosf : RuntimeLibcallImpl<SINCOS_F32>;
943-
def sincos : RuntimeLibcallImpl<SINCOS_F64>;
944-
defm sincos : LibmLongDoubleLibCall;
789+
defm sincos : LibmLibcallImpls;
945790

946791
def bzero : RuntimeLibcallImpl<BZERO>;
947792
def __bzero : RuntimeLibcallImpl<BZERO>;

0 commit comments

Comments
 (0)