#i98028# SmallStruct and AllFloats
This commit is contained in:
@@ -53,13 +53,13 @@ using namespace ::com::sun::star::uno;
|
||||
|
||||
//==================================================================================================
|
||||
static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
||||
void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
|
||||
void * pRegisterReturn, typelib_TypeDescriptionReference * pReturnTypeRef, bool bSimpleReturn,
|
||||
sal_uInt64 *pStack, sal_uInt32 nStack,
|
||||
sal_uInt64 *pGPR, sal_uInt32 nGPR,
|
||||
double *pFPR, sal_uInt32 nFPR) __attribute__((noinline));
|
||||
|
||||
static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
||||
void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
|
||||
void * pRegisterReturn, typelib_TypeDescriptionReference * pReturnTypeRef, bool bSimpleReturn,
|
||||
sal_uInt64 *pStack, sal_uInt32 nStack,
|
||||
sal_uInt64 *pGPR, sal_uInt32 nGPR,
|
||||
double *pFPR, sal_uInt32 nFPR)
|
||||
@@ -113,6 +113,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
||||
sal_uInt64 rax;
|
||||
sal_uInt64 rdx;
|
||||
double xmm0;
|
||||
double xmm1;
|
||||
|
||||
asm volatile (
|
||||
|
||||
@@ -147,13 +148,14 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
||||
"movq %%rax, %4\n\t"
|
||||
"movq %%rdx, %5\n\t"
|
||||
"movsd %%xmm0, %6\n\t"
|
||||
"movsd %%xmm1, %7\n\t"
|
||||
:
|
||||
: "m" ( pMethod ), "m" ( pGPR ), "m" ( pFPR ), "m" ( nFPR ),
|
||||
"m" ( rax ), "m" ( rdx ), "m" ( xmm0 )
|
||||
"m" ( rax ), "m" ( rdx ), "m" ( xmm0 ), "m" ( xmm1 )
|
||||
: "rax", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11"
|
||||
);
|
||||
|
||||
switch (pReturnTypeDescr->eTypeClass)
|
||||
switch (pReturnTypeRef->eTypeClass)
|
||||
{
|
||||
case typelib_TypeClass_HYPER:
|
||||
case typelib_TypeClass_UNSIGNED_HYPER:
|
||||
@@ -179,12 +181,17 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
|
||||
break;
|
||||
default:
|
||||
{
|
||||
sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
|
||||
sal_Int32 const nRetSize = pReturnTypeRef->pType->nSize;
|
||||
if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0)
|
||||
{
|
||||
if (nRetSize > 8)
|
||||
static_cast<sal_uInt64 *>(pRegisterReturn)[1] = rdx;
|
||||
static_cast<sal_uInt64 *>(pRegisterReturn)[0] = rax;
|
||||
sal_uInt64 longs[2];
|
||||
longs[0] = rax;
|
||||
longs[1] = rdx;
|
||||
|
||||
double doubles[2];
|
||||
doubles[0] = xmm0;
|
||||
doubles[1] = xmm1;
|
||||
x86_64::fill_struct( pReturnTypeRef, &longs[0], &doubles[0], pRegisterReturn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -367,7 +374,7 @@ static void cpp_call(
|
||||
{
|
||||
callVirtualMethod(
|
||||
pAdjustedThisPtr, aVtableSlot.index,
|
||||
pCppReturn, pReturnTypeDescr, bSimpleReturn,
|
||||
pCppReturn, pReturnTypeRef, bSimpleReturn,
|
||||
pStackStart, ( pStack - pStackStart ),
|
||||
pGPR, nGPR,
|
||||
pFPR, nFPR );
|
||||
|
Reference in New Issue
Block a user