Skip to content

Commit d742872

Browse files
[Flang][AArch64] Add support for complex16 params/returns (llvm#84217)
Fixes llvm#84088
1 parent 430de48 commit d742872

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

flang/lib/Optimizer/CodeGen/Target.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,8 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> {
737737
CodeGenSpecifics::Marshalling marshal;
738738
const auto *sem = &floatToSemantics(kindMap, eleTy);
739739
if (sem == &llvm::APFloat::IEEEsingle() ||
740-
sem == &llvm::APFloat::IEEEdouble()) {
740+
sem == &llvm::APFloat::IEEEdouble() ||
741+
sem == &llvm::APFloat::IEEEquad()) {
741742
// [2 x t] array of 2 eleTy
742743
marshal.emplace_back(fir::SequenceType::get({2}, eleTy), AT{});
743744
} else {
@@ -751,7 +752,8 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> {
751752
CodeGenSpecifics::Marshalling marshal;
752753
const auto *sem = &floatToSemantics(kindMap, eleTy);
753754
if (sem == &llvm::APFloat::IEEEsingle() ||
754-
sem == &llvm::APFloat::IEEEdouble()) {
755+
sem == &llvm::APFloat::IEEEdouble() ||
756+
sem == &llvm::APFloat::IEEEquad()) {
755757
// Use a type that will be translated into LLVM as:
756758
// { t, t } struct of 2 eleTy
757759
marshal.emplace_back(mlir::TupleType::get(eleTy.getContext(),

flang/test/Fir/target-complex16.f90

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: tco --target=aarch64-unknown-linux-gnu %s | FileCheck %s --check-prefix=AARCH64
2+
3+
// AARCH64-LABEL: define { fp128, fp128 } @gen16()
4+
func.func @gen16() -> !fir.complex<16> {
5+
// AARCH64: %[[VAL1:.*]] = alloca { fp128, fp128 }, i64 1, align 16
6+
%1 = fir.undefined !fir.complex<16>
7+
%2 = arith.constant 1.0 : f128
8+
%3 = arith.constant -4.0 : f128
9+
%c0 = arith.constant 0 : i32
10+
// AARCH64: store { fp128, fp128 } { fp128 0xL0000000000000000C001000000000000, fp128 0xL00000000000000003FFF000000000000 }, ptr %[[VAL1]], align 16
11+
%4 = fir.insert_value %1, %3, [0 : index] : (!fir.complex<16>, f128) -> !fir.complex<16>
12+
%c1 = arith.constant 1 : i32
13+
%5 = fir.insert_value %4, %2, [1 : index] : (!fir.complex<16>, f128) -> !fir.complex<16>
14+
// AARCH64: %[[VAL2:.*]] = load { fp128, fp128 }, ptr %[[VAL1]], align 16
15+
// AARCH64: ret { fp128, fp128 } %[[VAL2]]
16+
return %5 : !fir.complex<16>
17+
}
18+
19+
// AARCH64: declare void @sink16([2 x fp128])
20+
func.func private @sink16(!fir.complex<16>) -> ()
21+
22+
// AARCH64-LABEL: define void @call16()
23+
func.func @call16() {
24+
// AARCH64: = call { fp128, fp128 } @gen16()
25+
%1 = fir.call @gen16() : () -> !fir.complex<16>
26+
// AARCH64: call void @sink16([2 x fp128] %
27+
fir.call @sink16(%1) : (!fir.complex<16>) -> ()
28+
return
29+
}

0 commit comments

Comments
 (0)