@@ -352,17 +352,26 @@ def MIPS16_RET_DF : RuntimeLibcall;
352
352
def MIPS16_RET_SC : RuntimeLibcall;
353
353
def MIPS16_RET_SF : RuntimeLibcall;
354
354
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)>;
357
366
def NAME#"_f128"
358
367
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F128"),
359
- !strconcat(rtbasename , "l")>;
368
+ !subst("X" , "l", rtbasename )>;
360
369
def NAME#"_ppcf128"
361
370
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_PPCF128"),
362
- !strconcat(rtbasename , "l")>;
371
+ !subst("X" , "l", rtbasename )>;
363
372
def NAME#"_f80"
364
373
: RuntimeLibcallImpl<!cast<RuntimeLibcall>(libcall_basename#"_F80"),
365
- !strconcat(rtbasename , "l")>;
374
+ !subst("X" , "l", rtbasename )>;
366
375
}
367
376
368
377
// AArch64 calls
@@ -692,217 +701,55 @@ def __riscv_flush_icache : RuntimeLibcallImpl<RISCV_FLUSH_ICACHE>;
692
701
// libm
693
702
//--------------------------------------------------------------------
694
703
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;
906
753
907
754
// Floating point environment
908
755
def fegetenv : RuntimeLibcallImpl<FEGETENV>;
@@ -939,9 +786,7 @@ def __exp10 : RuntimeLibcallImpl<EXP10_F64>;
939
786
def __sincosf_stret : RuntimeLibcallImpl<SINCOS_STRET_F32>;
940
787
def __sincos_stret : RuntimeLibcallImpl<SINCOS_STRET_F64>;
941
788
942
- def sincosf : RuntimeLibcallImpl<SINCOS_F32>;
943
- def sincos : RuntimeLibcallImpl<SINCOS_F64>;
944
- defm sincos : LibmLongDoubleLibCall;
789
+ defm sincos : LibmLibcallImpls;
945
790
946
791
def bzero : RuntimeLibcallImpl<BZERO>;
947
792
def __bzero : RuntimeLibcallImpl<BZERO>;
0 commit comments