summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff')
-rw-r--r--contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff37
1 files changed, 37 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff b/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff
new file mode 100644
index 0000000..106ab89
--- /dev/null
+++ b/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff
@@ -0,0 +1,37 @@
+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,
OpenPOWER on IntegriCloud