Skip to content

Commit

Permalink
[X86] Add ABI handling for __float128 to match with GCC (#75156)
Browse files Browse the repository at this point in the history
Fixes #74601
  • Loading branch information
phoebewang committed Jan 5, 2024
1 parent 06f1e10 commit f07aba4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,7 @@ X86 Support
* Support intrinsic of ``_uwrmsr``.
- Support ISA of ``AVX10.1``.
- ``-march=pantherlake`` and ``-march=clearwaterforest`` are now supported.
- Added ABI handling for ``__float128`` to match with GCC.

Arm and AArch64 Support
^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/CodeGen/Targets/X86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1797,6 +1797,9 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class &Lo,
} else if (k == BuiltinType::Float || k == BuiltinType::Double ||
k == BuiltinType::Float16 || k == BuiltinType::BFloat16) {
Current = SSE;
} else if (k == BuiltinType::Float128) {
Lo = SSE;
Hi = SSEUp;
} else if (k == BuiltinType::LongDouble) {
const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
if (LDF == &llvm::APFloat::IEEEquad()) {
Expand Down
36 changes: 36 additions & 0 deletions clang/test/CodeGen/X86/fp128-abi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature +sse2 < %s | FileCheck %s --check-prefixes=CHECK
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature -sse2 < %s | FileCheck %s --check-prefixes=CHECK

struct st1 {
__float128 a;
};

struct st1 h1(__float128 a) {
// CHECK: define{{.*}}fp128 @h1(fp128
struct st1 x;
x.a = a;
return x;
}

__float128 h2(struct st1 x) {
// CHECK: define{{.*}}fp128 @h2(fp128
return x.a;
}

struct st2 {
__float128 a;
int b;
};

struct st2 h3(__float128 a, int b) {
// CHECK: define{{.*}}void @h3(ptr {{.*}}sret(%struct.st2)
struct st2 x;
x.a = a;
x.b = b;
return x;
}

__float128 h4(struct st2 x) {
// CHECK: define{{.*}}fp128 @h4(ptr {{.*}}byval(%struct.st2)
return x.a;
}

0 comments on commit f07aba4

Please sign in to comment.