yubing created this revision.
yubing added reviewers: craig.topper, LuoYuanke, LiuChen3.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
yubing requested review of this revision.
This patch make __float128/long double(128bits) passed on the stack with
16-byte alignment, accoding to i386 System V ABI.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D86668
Files:
clang/lib/CodeGen/TargetInfo.cpp
clang/test/CodeGen/x86-long-double.cpp
clang/test/CodeGen/x86_32-fp128-call-conv-linux.c
Index: clang/test/CodeGen/x86_32-fp128-call-conv-linux.c
===================================================================
--- /dev/null
+++ clang/test/CodeGen/x86_32-fp128-call-conv-linux.c
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -mlong-double-128 -w -fblocks -ffreestanding -triple i386-pc-linux-gnu -emit-llvm -o %t %s || FileCheck < %t %s
+
+
+// CHECK-LABEL: define void @testfp128
+// CHECK-NEXT: %a.addr = alloca fp128, align 16
+// CHECK-NEXT: %a = load fp128, fp128* %0, align 16
+// CHECK-NEXT: store fp128 %a, fp128* %a.addr, align 16
+void testfp128(__float128 a) {
+ return;
+}
+
+// CHECK-LABEL: define void @testlongdouble
+// CHECK-NEXT: %a.addr = alloca fp128, align 16
+// CHECK-NEXT: %a = load fp128, fp128* %0, align 16
+// CHECK-NEXT: store fp128 %a, fp128* %a.addr, align 16
+void testlongdouble(long double a) {
+ return;
+}
+
+// CHECK-LABEL: define void @testPassArguments
+// CHECK: call void @testfp128(fp128* byval(fp128) align 16 %{{.*}})
+// CHECK: call void @testlongdouble(fp128* byval(fp128) align 16 %{{.*}})
+void testPassArguments() {
+ __float128 a=1.0;
+ testfp128(a);
+ testlongdouble(a);
+ return;
+}
Index: clang/test/CodeGen/x86-long-double.cpp
===================================================================
--- clang/test/CodeGen/x86-long-double.cpp
+++ clang/test/CodeGen/x86-long-double.cpp
@@ -16,14 +16,14 @@
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin -mlong-double-64 | \
// RUN: FileCheck --check-prefixes=FP64,FP64-X64 %s
-// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686 -mlong-double-128 | \
-// RUN: FileCheck --check-prefix=FP128 %s
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i386-pc-linux-gnu -mlong-double-128 | \
+// RUN: FileCheck --check-prefixes=FP128,FP128-X32-LINUX %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin -mlong-double-128 | \
-// RUN: FileCheck --check-prefix=FP128 %s
+// RUN: FileCheck --check-prefixes=FP128,FP128-X32-DARWIN %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64 -mlong-double-128 | \
-// RUN: FileCheck --check-prefix=FP128 %s
+// RUN: FileCheck --check-prefixes=FP128,FP128-X64 %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin -mlong-double-128 | \
-// RUN: FileCheck --check-prefix=FP128 %s
+// RUN: FileCheck --check-prefixes=FP128,FP128-X64 %s
// Check -malign-double increases the alignment from 4 to 8 on x86-32.
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686 -mlong-double-64 \
@@ -53,4 +53,6 @@
// FP64: double @_Z3fooe(double %d)
// FP80: x86_fp80 @_Z3fooe(x86_fp80 %d)
-// FP128: fp128 @_Z3foog(fp128 %d)
+// FP128-X32-LINUX: fp128 @_Z3foog(fp128* byval(fp128) align 16 %0)
+// FP128-X32-DARWIN: fp128 @_Z3foog(fp128 %d)
+// FP128-X64: fp128 @_Z3foog(fp128 %d)
Index: clang/lib/CodeGen/TargetInfo.cpp
===================================================================
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -1108,6 +1108,7 @@
bool IsWin32StructABI;
bool IsSoftFloatABI;
bool IsMCUABI;
+ bool IsLinuxABI;
unsigned DefaultNumRegisterParameters;
static bool isRegisterSize(unsigned Size) {
@@ -1173,6 +1174,7 @@
IsWin32StructABI(Win32StructABI),
IsSoftFloatABI(SoftFloatABI),
IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
+ IsLinuxABI(CGT.getTarget().getTriple().isOSLinux()),
DefaultNumRegisterParameters(NumRegisterParameters) {}
bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
@@ -1597,6 +1599,9 @@
if (Align <= MinABIStackAlignInBytes)
return 0; // Use default alignment.
+ if (IsLinuxABI && Ty->isFloatingType() && getContext().getTypeSize(Ty) == 128)
+ return 16;
+
// On non-Darwin, the stack type alignment is always 4.
if (!IsDarwinVectorABI) {
// Set explicit alignment, since we may need to realign the top.
@@ -1890,6 +1895,9 @@
return getIndirectResult(Ty, /*ByVal=*/false, State);
}
+ if (IsLinuxABI && Ty->isFloatingType() && getContext().getTypeSize(Ty) == 128)
+ return getIndirectResult(Ty, /*ByVal=*/true, State);
+
if (InReg)
return ABIArgInfo::getDirectInReg();
return ABIArgInfo::getDirect();
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits