freebsd-dev/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff
Dimitry Andric a1f8ad145e Add separate patch files for all the customizations we have currently
applied to our copy of llvm/clang.  These can be applied in alphabetical
order to a pristine llvm/clang 3.4 release source tree, to result in the
same version used in FreeBSD.

This is intended to clearly document all the changes until now, which
mostly consist of cherry pickings from the respective upstream trunks,
plus a number of hand-written FreeBSD-specific ones.  Hopefully those
can eventually be cleaned up and sent upstream too.

MFC after:	1 week
X-MFC-With:	r263313
2014-03-18 22:07:45 +00:00

38 lines
1.3 KiB
Diff

Pull in r199399 from upstream clang trunk (by Jakob Stoklund Olesen):
SPARCv9 implements long double as an IEEE quad.
Introduced here: http://svn.freebsd.org/changeset/base/262262
Index: tools/clang/test/CodeGen/sparcv9-abi.c
===================================================================
--- tools/clang/test/CodeGen/sparcv9-abi.c
+++ tools/clang/test/CodeGen/sparcv9-abi.c
@@ -18,6 +18,9 @@ long long f_int_3(long long x) { return x; }
// CHECK-LABEL: define signext i8 @f_int_4(i8 signext %x)
char f_int_4(char x) { return x; }
+// CHECK-LABEL: define fp128 @f_ld(fp128 %x)
+long double f_ld(long double x) { return x; }
+
// Small structs are passed in registers.
struct small {
int *a, *b;
Index: tools/clang/lib/Basic/Targets.cpp
===================================================================
--- tools/clang/lib/Basic/Targets.cpp
+++ tools/clang/lib/Basic/Targets.cpp
@@ -4529,6 +4529,12 @@ class SparcV9TargetInfo : public SparcTargetInfo {
UIntMaxType = UnsignedLong;
}
Int64Type = IntMaxType;
+
+ // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
+ // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
+ LongDoubleWidth = 128;
+ LongDoubleAlign = 128;
+ LongDoubleFormat = &llvm::APFloat::IEEEquad;
}
virtual void getTargetDefines(const LangOptions &Opts,