Blame SOURCES/0002-ppc64-using-a-fp-register-also-consumes-a-gp-registe.patch

ebc4bd
From f31326f623b0be2392b3846f710df75ea8760446 Mon Sep 17 00:00:00 2001
ebc4bd
From: Caolan McNamara <caolanm@redhat.com>
ebc4bd
Date: Fri, 10 Jul 2015 16:36:41 +0100
ebc4bd
Subject: [PATCH 2/2] ppc64: using a fp register also consumes a gp register
ebc4bd
 slot
ebc4bd
MIME-Version: 1.0
ebc4bd
Content-Type: text/plain; charset=UTF-8
ebc4bd
Content-Transfer-Encoding: 8bit
ebc4bd
ebc4bd
Change-Id: Idf6f40081f4598c0fa9d1e10bdc208eae49e4cd1
ebc4bd
Reviewed-on: https://gerrit.libreoffice.org/16936
ebc4bd
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
ebc4bd
Tested-by: Caolán McNamara <caolanm@redhat.com>
ebc4bd
(cherry picked from commit e8ac3b5bd973054c6fd74db017bb448721e2c3e2)
ebc4bd
Reviewed-on: https://gerrit.libreoffice.org/16946
ebc4bd
Reviewed-by: David Tardon <dtardon@redhat.com>
ebc4bd
Tested-by: David Tardon <dtardon@redhat.com>
ebc4bd
---
ebc4bd
 bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx |  6 ++++++
ebc4bd
 bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 16 ++++++++++------
ebc4bd
 testtools/com/sun/star/comp/bridge/TestComponent.java   |  4 ++++
ebc4bd
 testtools/source/bridgetest/bridgetest.cxx              |  4 ++++
ebc4bd
 testtools/source/bridgetest/cli/cli_cs_testobj.cs       |  5 +++++
ebc4bd
 testtools/source/bridgetest/cppobj.cxx                  |  2 ++
ebc4bd
 testtools/source/bridgetest/idl/bridgetest.idl          |  6 ++++++
ebc4bd
 7 files changed, 37 insertions(+), 6 deletions(-)
ebc4bd
ebc4bd
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
ebc4bd
index 6b58246..6ac003b 100644
ebc4bd
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
ebc4bd
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
ebc4bd
@@ -133,6 +133,12 @@ static typelib_TypeClass cpp2uno_call(
ebc4bd
                         }
ebc4bd
                         pCppArgs[nPos] = pUnoArgs[nPos] = fpreg++;
ebc4bd
                         nf++;
ebc4bd
+
ebc4bd
+                        if (ng < ppc64::MAX_GPR_REGS)
ebc4bd
+                        {
ebc4bd
+                            ng++;
ebc4bd
+                            gpreg++;
ebc4bd
+                        }
ebc4bd
                     }
ebc4bd
                     else
ebc4bd
                     {
ebc4bd
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
ebc4bd
index 81d3d5c..28dfaf8 100644
ebc4bd
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
ebc4bd
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
ebc4bd
@@ -229,16 +229,20 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
ebc4bd
 
ebc4bd
 // The value in %xmm register is already prepared to be retrieved as a float,
ebc4bd
 // thus we treat float and double the same
ebc4bd
-#define INSERT_FLOAT( pSV, nr, pFPR, pDS, bOverflow ) \
ebc4bd
-        if ( nr < ppc64::MAX_SSE_REGS ) \
ebc4bd
+#define INSERT_FLOAT( pSV, nr, pFPR, nGPR, pDS, bOverflow ) \
ebc4bd
+        if ( nGPR < ppc64::MAX_GPR_REGS ) \
ebc4bd
+                ++nGPR;                   \
ebc4bd
+        if ( nr < ppc64::MAX_SSE_REGS )   \
ebc4bd
                 pFPR[nr++] = *reinterpret_cast<float *>( pSV ); \
ebc4bd
         else \
ebc4bd
             bOverflow = true; \
ebc4bd
         if (bOverflow) \
ebc4bd
                 *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
ebc4bd
 
ebc4bd
-#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, bOverflow ) \
ebc4bd
-        if ( nr < ppc64::MAX_SSE_REGS ) \
ebc4bd
+#define INSERT_DOUBLE( pSV, nr, pFPR, nGPR, pDS, bOverflow ) \
ebc4bd
+        if ( nGPR < ppc64::MAX_GPR_REGS ) \
ebc4bd
+                ++nGPR;                   \
ebc4bd
+        if ( nr < ppc64::MAX_SSE_REGS )   \
ebc4bd
                 pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
ebc4bd
         else \
ebc4bd
             bOverflow = true; \
ebc4bd
@@ -390,10 +394,10 @@ static void cpp_call(
ebc4bd
                                 INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverflow );
ebc4bd
                                 break;
ebc4bd
                         case typelib_TypeClass_FLOAT:
ebc4bd
-                                INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack, bOverflow );
ebc4bd
+                                INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverflow );
ebc4bd
                                 break;
ebc4bd
                         case typelib_TypeClass_DOUBLE:
ebc4bd
-                                INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack, bOverflow );
ebc4bd
+                                INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverflow );
ebc4bd
                                 break;
ebc4bd
                         default:
ebc4bd
                                 break;
ebc4bd
diff --git a/testtools/com/sun/star/comp/bridge/TestComponent.java b/testtools/com/sun/star/comp/bridge/TestComponent.java
ebc4bd
index bf1524d..8e07d1a 100644
ebc4bd
--- a/testtools/com/sun/star/comp/bridge/TestComponent.java
ebc4bd
+++ b/testtools/com/sun/star/comp/bridge/TestComponent.java
ebc4bd
@@ -498,6 +498,10 @@ public class TestComponent {
ebc4bd
             return i2;
ebc4bd
         }
ebc4bd
 
ebc4bd
+        public int testPPC64Alignment( double d1, double d2, double d3, int i1 ) throws com.sun.star.uno.RuntimeException {
ebc4bd
+            return i1;
ebc4bd
+        }
ebc4bd
+
ebc4bd
         public double testTenDoubles( double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10 ) {
ebc4bd
             return d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10;
ebc4bd
         }
ebc4bd
diff --git a/testtools/source/bridgetest/bridgetest.cxx b/testtools/source/bridgetest/bridgetest.cxx
ebc4bd
index ea37b9a..427513f 100644
ebc4bd
--- a/testtools/source/bridgetest/bridgetest.cxx
ebc4bd
+++ b/testtools/source/bridgetest/bridgetest.cxx
ebc4bd
@@ -529,6 +529,10 @@ static bool performTest(
ebc4bd
                 bRet &= check(i2 == 0xBEAF, "ppc-style alignment test");
ebc4bd
             }
ebc4bd
             {
ebc4bd
+                sal_Int32 i1 = xLBT->testPPC64Alignment(1.0, 2.0, 3.0, 0xBEAF);
ebc4bd
+                bRet &= check(i1 == 0xBEAF, "ppc64-style alignment test");
ebc4bd
+            }
ebc4bd
+            {
ebc4bd
                 double d1 = xLBT->testTenDoubles(0.1, 0.2, 0.3, 0.4, 0.5,
ebc4bd
                     0.6, 0.7, 0.8, 0.9, 1.0);
ebc4bd
                 bRet &= check(d1 == 5.5, "armhf doubles test");
ebc4bd
diff --git a/testtools/source/bridgetest/cli/cli_cs_testobj.cs b/testtools/source/bridgetest/cli/cli_cs_testobj.cs
ebc4bd
index 9d0ac7a..8f396c9 100644
ebc4bd
--- a/testtools/source/bridgetest/cli/cli_cs_testobj.cs
ebc4bd
+++ b/testtools/source/bridgetest/cli/cli_cs_testobj.cs
ebc4bd
@@ -255,6 +255,11 @@ public class BridgeTestObject : WeakBase, XRecursiveCall, XBridgeTest2
ebc4bd
         return i2;
ebc4bd
     }
ebc4bd
 
ebc4bd
+    public int testPPC64Alignment( double d1, double d2, double d3, int i1 )
ebc4bd
+    {
ebc4bd
+        return i1;
ebc4bd
+    }
ebc4bd
+
ebc4bd
     public double testTenDoubles( double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10 )
ebc4bd
     {
ebc4bd
         return d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10;
ebc4bd
diff --git a/testtools/source/bridgetest/cppobj.cxx b/testtools/source/bridgetest/cppobj.cxx
ebc4bd
index a468d90..30f85f0 100644
ebc4bd
--- a/testtools/source/bridgetest/cppobj.cxx
ebc4bd
+++ b/testtools/source/bridgetest/cppobj.cxx
ebc4bd
@@ -220,6 +220,8 @@ public:
ebc4bd
         { return rStruct; }
ebc4bd
     virtual sal_Int32 SAL_CALL testPPCAlignment( sal_Int64, sal_Int64, sal_Int32, sal_Int64, sal_Int32 i2 ) throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
ebc4bd
         { return i2; }
ebc4bd
+    virtual sal_Int32 SAL_CALL testPPC64Alignment( double , double , double , sal_Int32 i1 ) throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
ebc4bd
+        { return i1; }
ebc4bd
     virtual double SAL_CALL testTenDoubles( double d1, double d2, double d3, double d4, double d5, double d6, double d7, double d8, double d9, double d10 ) throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
ebc4bd
         { return d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10; }
ebc4bd
     virtual sal_Bool SAL_CALL getBool() throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
ebc4bd
diff --git a/testtools/source/bridgetest/idl/bridgetest.idl b/testtools/source/bridgetest/idl/bridgetest.idl
ebc4bd
index a11ba28..22612b8 100644
ebc4bd
--- a/testtools/source/bridgetest/idl/bridgetest.idl
ebc4bd
+++ b/testtools/source/bridgetest/idl/bridgetest.idl
ebc4bd
@@ -307,6 +307,12 @@ interface XBridgeTestBase : com::sun::star::uno::XInterface
ebc4bd
     long testPPCAlignment( [in] hyper l1, [in] hyper l2, [in] long i1, [in] hyper l3, [in] long i2 );
ebc4bd
 
ebc4bd
     /**
ebc4bd
+     * PPC64 Alignment test
ebc4bd
+     */
ebc4bd
+    long testPPC64Alignment( [in] double d1, [in] double d2, [in] double d3, [in] long i1 );
ebc4bd
+
ebc4bd
+
ebc4bd
+    /**
ebc4bd
      * VFP ABI (armhf) doubles test
ebc4bd
      */
ebc4bd
     double testTenDoubles( [in] double d1, [in] double d2, [in] double d3, [in] double d4, [in] double d5, [in] double d6, [in] double d7, [in] double d8, [in] double d9, [in] double d10 );
ebc4bd
-- 
ebc4bd
2.1.0
ebc4bd