summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorCaolan McNamara <caolanm@redhat.com>2015-07-10 16:36:41 +0100
committerDavid Tardon <dtardon@redhat.com>2015-07-13 11:05:38 +0000
commit3708b3eb99f9283032e4210946aaf8a57d3bd252 (patch)
tree3a959637a6d2dad45bcc1c0621be9da9c5bef435 /bridges
parent23599fa36015259ef5f84fc827d4569ca548c2ab (diff)
ppc64: using a fp register also consumes a gp register slot
Change-Id: Idf6f40081f4598c0fa9d1e10bdc208eae49e4cd1 Reviewed-on: https://gerrit.libreoffice.org/16936 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit e8ac3b5bd973054c6fd74db017bb448721e2c3e2) Reviewed-on: https://gerrit.libreoffice.org/16948 Reviewed-by: David Tardon <dtardon@redhat.com> Tested-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx6
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx16
2 files changed, 16 insertions, 6 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
index f2e5174a1929..37ea597a5e9e 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
@@ -132,6 +132,12 @@ static typelib_TypeClass cpp2uno_call(
}
pCppArgs[nPos] = pUnoArgs[nPos] = fpreg++;
nf++;
+
+ if (ng < ppc64::MAX_GPR_REGS)
+ {
+ ng++;
+ gpreg++;
+ }
}
else
{
diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
index a8ff6b4d6a5a..c627e2eea34f 100644
--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
@@ -229,16 +229,20 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
// The value in %xmm register is already prepared to be retrieved as a float,
// thus we treat float and double the same
-#define INSERT_FLOAT( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_FLOAT( pSV, nr, pFPR, nGPR, pDS, bOverflow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<float *>( pSV ); \
else \
bOverflow = true; \
if (bOverflow) \
*pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV ); // verbatim!
-#define INSERT_DOUBLE( pSV, nr, pFPR, pDS, bOverflow ) \
- if ( nr < ppc64::MAX_SSE_REGS ) \
+#define INSERT_DOUBLE( pSV, nr, pFPR, nGPR, pDS, bOverflow ) \
+ if ( nGPR < ppc64::MAX_GPR_REGS ) \
+ ++nGPR; \
+ if ( nr < ppc64::MAX_SSE_REGS ) \
pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
else \
bOverflow = true; \
@@ -392,10 +396,10 @@ static void cpp_call(
INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack, bOverflow );
break;
case typelib_TypeClass_FLOAT:
- INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack, bOverflow );
+ INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverflow );
break;
case typelib_TypeClass_DOUBLE:
- INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack, bOverflow );
+ INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, nGPR, pStack, bOverflow );
break;
default:
break;