[flang-commits] [flang] [Flang][AArch64] Add support for complex16 params/returns (PR #84217)

Kiran Chandramohan via flang-commits flang-commits at lists.llvm.org
Wed Mar 6 10:28:02 PST 2024


https://github.com/kiranchandramohan created https://github.com/llvm/llvm-project/pull/84217

Fixes #84088

>From 62bb49cd300894037cc2850491cd32b13e707c3a Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Wed, 6 Mar 2024 18:21:08 +0000
Subject: [PATCH] [Flang][AArch64] Add support for complex16 params/returns

Fixes #84088
---
 flang/lib/Optimizer/CodeGen/Target.cpp |  6 ++++--
 flang/test/Fir/target-complex16.f90    | 29 ++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 2 deletions(-)
 create mode 100644 flang/test/Fir/target-complex16.f90

diff --git a/flang/lib/Optimizer/CodeGen/Target.cpp b/flang/lib/Optimizer/CodeGen/Target.cpp
index 7c77bdd79008f1..cea7a1f97f419f 100644
--- a/flang/lib/Optimizer/CodeGen/Target.cpp
+++ b/flang/lib/Optimizer/CodeGen/Target.cpp
@@ -737,7 +737,8 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> {
     CodeGenSpecifics::Marshalling marshal;
     const auto *sem = &floatToSemantics(kindMap, eleTy);
     if (sem == &llvm::APFloat::IEEEsingle() ||
-        sem == &llvm::APFloat::IEEEdouble()) {
+        sem == &llvm::APFloat::IEEEdouble() ||
+        sem == &llvm::APFloat::IEEEquad()) {
       // [2 x t]   array of 2 eleTy
       marshal.emplace_back(fir::SequenceType::get({2}, eleTy), AT{});
     } else {
@@ -751,7 +752,8 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> {
     CodeGenSpecifics::Marshalling marshal;
     const auto *sem = &floatToSemantics(kindMap, eleTy);
     if (sem == &llvm::APFloat::IEEEsingle() ||
-        sem == &llvm::APFloat::IEEEdouble()) {
+        sem == &llvm::APFloat::IEEEdouble() ||
+        sem == &llvm::APFloat::IEEEquad()) {
       // Use a type that will be translated into LLVM as:
       // { t, t }   struct of 2 eleTy
       marshal.emplace_back(mlir::TupleType::get(eleTy.getContext(),
diff --git a/flang/test/Fir/target-complex16.f90 b/flang/test/Fir/target-complex16.f90
new file mode 100644
index 00000000000000..9245b205f68a05
--- /dev/null
+++ b/flang/test/Fir/target-complex16.f90
@@ -0,0 +1,29 @@
+// RUN: tco --target=aarch64-unknown-linux-gnu %s | FileCheck %s --check-prefix=AARCH64
+
+// AARCH64-LABEL: define { fp128, fp128 } @gen16()
+func.func @gen16() -> !fir.complex<16> {
+  // AARCH64: %[[VAL1:.*]] = alloca { fp128, fp128 }, i64 1, align 16
+  %1 = fir.undefined !fir.complex<16>
+  %2 = arith.constant 1.0 : f128
+  %3 = arith.constant -4.0 : f128
+  %c0 = arith.constant 0 : i32
+  // AARCH64: store { fp128, fp128 } { fp128 0xL0000000000000000C001000000000000, fp128 0xL00000000000000003FFF000000000000 }, ptr %[[VAL1]], align 16
+  %4 = fir.insert_value %1, %3, [0 : index] : (!fir.complex<16>, f128) -> !fir.complex<16>
+  %c1 = arith.constant 1 : i32
+  %5 = fir.insert_value %4, %2, [1 : index] : (!fir.complex<16>, f128) -> !fir.complex<16>
+  // AARCH64: %[[VAL2:.*]] = load { fp128, fp128 }, ptr %[[VAL1]], align 16
+  // AARCH64: ret { fp128, fp128 } %[[VAL2]]
+  return %5 : !fir.complex<16>
+}
+
+// AARCH64: declare void @sink16([2 x fp128])
+func.func private @sink16(!fir.complex<16>) -> ()
+
+// AARCH64-LABEL: define void @call16()
+func.func @call16() {
+  // AARCH64: = call { fp128, fp128 } @gen16()
+  %1 = fir.call @gen16() : () -> !fir.complex<16>
+  // AARCH64: call void @sink16([2 x fp128] %
+  fir.call @sink16(%1) : (!fir.complex<16>) -> ()
+  return
+}



More information about the flang-commits mailing list