Index: flang/lib/Optimizer/CodeGen/Target.cpp =================================================================== --- flang/lib/Optimizer/CodeGen/Target.cpp +++ flang/lib/Optimizer/CodeGen/Target.cpp @@ -222,6 +222,37 @@ }; } // namespace +//===----------------------------------------------------------------------===// +// PPC64 (AIX 64 bit) target specifics. +//===----------------------------------------------------------------------===// + +namespace { +struct TargetPPC64 : public GenericTarget { + using GenericTarget::GenericTarget; + + static constexpr int defaultWidth = 64; + + CodeGenSpecifics::Marshalling + complexArgumentType(mlir::Location, mlir::Type eleTy) const override { + CodeGenSpecifics::Marshalling marshal; + // two distinct element type arguments (re, im) + marshal.emplace_back(eleTy, AT{}); + marshal.emplace_back(eleTy, AT{}); + return marshal; + } + + CodeGenSpecifics::Marshalling + complexReturnType(mlir::Location, mlir::Type eleTy) const override { + CodeGenSpecifics::Marshalling marshal; + // Use a type that will be translated into LLVM as: + // { t, t } struct of 2 element type + mlir::TypeRange range = {eleTy, eleTy}; + marshal.emplace_back(mlir::TupleType::get(eleTy.getContext(), range), AT{}); + return marshal; + } +}; +} // namespace + //===----------------------------------------------------------------------===// // PPC64le linux target specifics. //===----------------------------------------------------------------------===// @@ -351,6 +382,9 @@ case llvm::Triple::ArchType::aarch64: return std::make_unique(ctx, std::move(trp), std::move(kindMap)); + case llvm::Triple::ArchType::ppc64: + return std::make_unique(ctx, std::move(trp), + std::move(kindMap)); case llvm::Triple::ArchType::ppc64le: return std::make_unique(ctx, std::move(trp), std::move(kindMap));