Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 90 additions & 90 deletions mlir/lib/Dialect/Math/IR/MathOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ OpFoldResult math::AbsIOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AcosOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(acos(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(acosf(a.convertToFloat()));
default:
return {};
Expand All @@ -80,10 +80,10 @@ OpFoldResult math::AcosOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AcoshOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(acosh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(acoshf(a.convertToFloat()));
default:
return {};
Expand All @@ -98,10 +98,10 @@ OpFoldResult math::AcoshOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AsinOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(asin(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(asinf(a.convertToFloat()));
default:
return {};
Expand All @@ -116,10 +116,10 @@ OpFoldResult math::AsinOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AsinhOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(asinh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(asinhf(a.convertToFloat()));
default:
return {};
Expand All @@ -134,10 +134,10 @@ OpFoldResult math::AsinhOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AtanOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(atan(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(atanf(a.convertToFloat()));
default:
return {};
Expand All @@ -152,10 +152,10 @@ OpFoldResult math::AtanOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::AtanhOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(atanh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(atanhf(a.convertToFloat()));
default:
return {};
Expand All @@ -174,15 +174,14 @@ OpFoldResult math::Atan2Op::fold(FoldAdaptor adaptor) {
if (a.isZero() && b.isZero())
return llvm::APFloat::getNaN(a.getSemantics());

if (a.getSizeInBits(a.getSemantics()) == 64 &&
b.getSizeInBits(b.getSemantics()) == 64)
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(atan2(a.convertToDouble(), b.convertToDouble()));

if (a.getSizeInBits(a.getSemantics()) == 32 &&
b.getSizeInBits(b.getSemantics()) == 32)
case APFloat::Semantics::S_IEEEsingle:
return APFloat(atan2f(a.convertToFloat(), b.convertToFloat()));

return {};
default:
return {};
}
});
}

Expand Down Expand Up @@ -219,10 +218,10 @@ OpFoldResult math::CopySignOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::CosOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(cos(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(cosf(a.convertToFloat()));
default:
return {};
Expand All @@ -237,10 +236,10 @@ OpFoldResult math::CosOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::CoshOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(cosh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(coshf(a.convertToFloat()));
default:
return {};
Expand All @@ -255,10 +254,10 @@ OpFoldResult math::CoshOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::SinOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(sin(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(sinf(a.convertToFloat()));
default:
return {};
Expand All @@ -273,10 +272,10 @@ OpFoldResult math::SinOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::SinhOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(sinh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(sinhf(a.convertToFloat()));
default:
return {};
Expand Down Expand Up @@ -331,10 +330,10 @@ OpFoldResult math::CtPopOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::ErfOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(erf(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(erff(a.convertToFloat()));
default:
return {};
Expand Down Expand Up @@ -424,13 +423,14 @@ OpFoldResult math::LogOp::fold(FoldAdaptor adaptor) {
if (a.isNegative())
return {};

if (a.getSizeInBits(a.getSemantics()) == 64)
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(log(a.convertToDouble()));

if (a.getSizeInBits(a.getSemantics()) == 32)
case APFloat::Semantics::S_IEEEsingle:
return APFloat(logf(a.convertToFloat()));

return {};
default:
return {};
}
});
}

Expand All @@ -444,13 +444,14 @@ OpFoldResult math::Log2Op::fold(FoldAdaptor adaptor) {
if (a.isNegative())
return {};

if (a.getSizeInBits(a.getSemantics()) == 64)
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(log2(a.convertToDouble()));

if (a.getSizeInBits(a.getSemantics()) == 32)
case APFloat::Semantics::S_IEEEsingle:
return APFloat(log2f(a.convertToFloat()));

return {};
default:
return {};
}
});
}

Expand All @@ -464,10 +465,10 @@ OpFoldResult math::Log10Op::fold(FoldAdaptor adaptor) {
if (a.isNegative())
return {};

switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(log10(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(log10f(a.convertToFloat()));
default:
return {};
Expand All @@ -482,12 +483,12 @@ OpFoldResult math::Log10Op::fold(FoldAdaptor adaptor) {
OpFoldResult math::Log1pOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
if ((a + APFloat(1.0)).isNegative())
return {};
return APFloat(log1p(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
if ((a + APFloat(1.0f)).isNegative())
return {};
return APFloat(log1pf(a.convertToFloat()));
Expand All @@ -505,15 +506,14 @@ OpFoldResult math::PowFOp::fold(FoldAdaptor adaptor) {
return constFoldBinaryOpConditional<FloatAttr>(
adaptor.getOperands(),
[](const APFloat &a, const APFloat &b) -> std::optional<APFloat> {
if (a.getSizeInBits(a.getSemantics()) == 64 &&
b.getSizeInBits(b.getSemantics()) == 64)
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(pow(a.convertToDouble(), b.convertToDouble()));

if (a.getSizeInBits(a.getSemantics()) == 32 &&
b.getSizeInBits(b.getSemantics()) == 32)
case APFloat::Semantics::S_IEEEsingle:
return APFloat(powf(a.convertToFloat(), b.convertToFloat()));

return {};
default:
return {};
}
});
}

Expand All @@ -528,10 +528,10 @@ OpFoldResult math::RsqrtOp::fold(FoldAdaptor adaptor) {
return {};

APFloat one(a.getSemantics(), 1);
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return one / APFloat(sqrt(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return one / APFloat(sqrtf(a.convertToFloat()));
default:
return {};
Expand All @@ -549,10 +549,10 @@ OpFoldResult math::SqrtOp::fold(FoldAdaptor adaptor) {
if (a.isNegative())
return {};

switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(sqrt(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(sqrtf(a.convertToFloat()));
default:
return {};
Expand All @@ -567,10 +567,10 @@ OpFoldResult math::SqrtOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::ExpOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(exp(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(expf(a.convertToFloat()));
default:
return {};
Expand All @@ -585,10 +585,10 @@ OpFoldResult math::ExpOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::Exp2Op::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(exp2(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(exp2f(a.convertToFloat()));
default:
return {};
Expand All @@ -603,10 +603,10 @@ OpFoldResult math::Exp2Op::fold(FoldAdaptor adaptor) {
OpFoldResult math::ExpM1Op::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(expm1(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(expm1f(a.convertToFloat()));
default:
return {};
Expand Down Expand Up @@ -685,10 +685,10 @@ OpFoldResult math::IsNormalOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::TanOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(tan(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(tanf(a.convertToFloat()));
default:
return {};
Expand All @@ -703,10 +703,10 @@ OpFoldResult math::TanOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::TanhOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(tanh(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(tanhf(a.convertToFloat()));
default:
return {};
Expand Down Expand Up @@ -747,10 +747,10 @@ OpFoldResult math::FloorOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::RoundOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(round(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(roundf(a.convertToFloat()));
default:
return {};
Expand All @@ -765,10 +765,10 @@ OpFoldResult math::RoundOp::fold(FoldAdaptor adaptor) {
OpFoldResult math::TruncOp::fold(FoldAdaptor adaptor) {
return constFoldUnaryOpConditional<FloatAttr>(
adaptor.getOperands(), [](const APFloat &a) -> std::optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
switch (APFloat::SemanticsToEnum(a.getSemantics())) {
case APFloat::Semantics::S_IEEEdouble:
return APFloat(trunc(a.convertToDouble()));
case 32:
case APFloat::Semantics::S_IEEEsingle:
return APFloat(truncf(a.convertToFloat()));
default:
return {};
Expand Down