diff options
author | Caolan McNamara <caolanm@redhat.com> | 2015-07-10 16:36:41 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2015-07-13 11:03:08 +0000 |
commit | f31326f623b0be2392b3846f710df75ea8760446 (patch) | |
tree | 250cd9eadfafdbc6302bf9f3bd3ea66b985c11a7 /bridges | |
parent | 3059edbc419e79f964a340b5b0ac828a5e866666 (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/16946
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.cxx | 6 | ||||
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 16 |
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 6b5824695407..6ac003b2ab8f 100644 --- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx @@ -133,6 +133,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 81d3d5ca192c..28dfaf8f118e 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; \ @@ -390,10 +394,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; |