mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This commit implements SE-0246, by adding conformance to Real to the Float, CGFloat, Double, and Float80 types, implemented either in terms of the system's C math library, existing standard library functionality, or LLVM intrinsics. It includes basic test coverage for these new functions, and deprecates and obsoletes *some* existing functionality in the Platform overlay. We still need to make a decision about how to handle the remaining "tgmath" functions, because obsoleting them is technically a source-breaking change (if users have unqualified names like "exp(1)", it's fine, but it would break users who have used qualified names like "Darwin.exp(1)".)
63 lines
2.7 KiB
Python
63 lines
2.7 KiB
Python
from SwiftFloatingPointTypes import all_floating_point_types
|
|
|
|
class SwiftMathFunction(object):
|
|
def __init__(self, name, kind=None, swiftName=None, args="x", comment=None, platforms=None):
|
|
self.name = name
|
|
self.swiftName = swiftName if swiftName is not None else name
|
|
self.kind = kind if kind is not None else "library"
|
|
self.args = args
|
|
self.comment = comment if comment is not None else "/// The " + str(self.swiftName) + " function."
|
|
self.platforms = platforms
|
|
|
|
def params(self, prefix="", suffix=""):
|
|
return ", ".join(
|
|
map(lambda a: prefix + a + suffix, self.args)
|
|
)
|
|
|
|
def decl(self, type):
|
|
return self.swiftName + "(" + self.params("_ ", ": " + type) + ") -> " + type
|
|
|
|
def free_decl(self, constraint="T: ElementaryFunctions"):
|
|
return self.swiftName + "<T>(" + self.params("_ ", ": T") + ") -> T where " + constraint
|
|
|
|
def impl(self, type):
|
|
if self.kind == "intrinsic":
|
|
builtin = "Builtin.int_" + self.name + "_FPIEEE" + str(type.bits)
|
|
return type.stdlib_name + "(" + builtin + "(" + self.params("","._value") + "))"
|
|
return "_swift_stdlib_" + self.name + type.cFuncSuffix + "(" + self.params() + ")"
|
|
|
|
ElementaryFunctions = [
|
|
SwiftMathFunction(name="sqrt", kind="intrinsic", comment="/// The square root of `x`."),
|
|
SwiftMathFunction(name="cos", kind="intrinsic", comment="/// The cosine of `x`."),
|
|
SwiftMathFunction(name="sin", kind="intrinsic", comment="/// The sine of `x`."),
|
|
SwiftMathFunction(name="tan", comment="/// The tangent of `x`."),
|
|
SwiftMathFunction(name="acos"),
|
|
SwiftMathFunction(name="asin"),
|
|
SwiftMathFunction(name="atan"),
|
|
SwiftMathFunction(name="cosh"),
|
|
SwiftMathFunction(name="sinh"),
|
|
SwiftMathFunction(name="tanh"),
|
|
SwiftMathFunction(name="acosh"),
|
|
SwiftMathFunction(name="asinh"),
|
|
SwiftMathFunction(name="atanh"),
|
|
SwiftMathFunction(name="exp", kind="intrinsic"),
|
|
SwiftMathFunction(name="exp2", kind="intrinsic"),
|
|
SwiftMathFunction(name="exp10"),
|
|
SwiftMathFunction(name="expm1"),
|
|
SwiftMathFunction(name="log", kind="intrinsic"),
|
|
SwiftMathFunction(name="log2", kind="intrinsic"),
|
|
SwiftMathFunction(name="log10", kind="intrinsic"),
|
|
SwiftMathFunction(name="log1p"),
|
|
# SwiftMathFunction(name="pow", kind="intrinsic", args="xy"), Handled separately for edge cases.
|
|
# SwiftMathFunction(name="root", args="xn"), Handled separately for implementation.
|
|
]
|
|
|
|
RealFunctions = [
|
|
# SwiftMathFunction(name="atan2"), Handled separately for explicit arg labels.
|
|
SwiftMathFunction(name="erf"),
|
|
SwiftMathFunction(name="erfc"),
|
|
SwiftMathFunction(name="hypot", args="xy"),
|
|
SwiftMathFunction(name="tgamma", swiftName="gamma"),
|
|
# SwiftMathFunction(name="lgamma"), Handled separately to handle sign result.
|
|
]
|