From 83056896e68651acc031d37cf815a7a79abd451c Mon Sep 17 00:00:00 2001
From: Chris Dewhurst <chris.dewhurst@lero.ie>
Date: Wed, 8 Jun 2016 14:46:05 +0000
Subject: [PATCH] [Sparc] Complex return value ABI compliance.

According to the Sparc V8 ABI, complex numbers should be passed and returned as pairs of registers:

https://docs.oracle.com/cd/E26502_01/html/E28387/gentextid-2734.html

This fix ensures this is the case. Without this, complex numbers are returned as a struct of two floats, which breaks the ABI rules.

Differential Review: http://reviews.llvm.org/D20955

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272148 91177308-0d34-0410-b5e6-96231b3b80d8
---
 test/CodeGen/sparcv8-abi.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 test/CodeGen/sparcv8-abi.c

diff --git a/test/CodeGen/sparcv8-abi.c b/test/CodeGen/sparcv8-abi.c
new file mode 100644
index 00000000000..cd8832f6534
--- /dev/null
+++ b/test/CodeGen/sparcv8-abi.c
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple sparc-unknown-unknown -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define { float, float } @p({ float, float }* byval align 4 %a, { float, float }* byval align 4 %b) #0 {
+float __complex__
+p (float __complex__  a, float __complex__  b)
+{
+}
+
+// CHECK-LABEL: define { double, double } @q({ double, double }* byval align 8 %a, { double, double }* byval align 8 %b) #0 {
+double __complex__
+q (double __complex__  a, double __complex__  b)
+{
+}
+
+// CHECK-LABEL: define { i64, i64 } @r({ i64, i64 }* byval align 8 %a, { i64, i64 }* byval align 8 %b) #0 {
+long long __complex__
+r (long long __complex__  a, long long __complex__  b)
+{
+}
-- 
GitLab