ARM bridge: VFP ABI (armhf) support

This commit is contained in:
Jani Monoses
2012-02-10 14:50:22 +02:00
parent 746e9a7d33
commit dab11f7fe2
4 changed files with 142 additions and 17 deletions

View File

@@ -69,6 +69,9 @@ namespace
char * pTopStack = (char *)(pCallStack + 0);
char * pCppStack = pTopStack;
#ifdef __ARM_PCS_VFP
char * pFloatArgs = (char *)(pCppStack - 64);
#endif
// return
typelib_TypeDescription * pReturnTypeDescr = 0;
if (pReturnTypeRef)
@@ -125,7 +128,9 @@ namespace
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
#ifndef __ARM_PCS_VFP
case typelib_TypeClass_DOUBLE:
#endif
if ((pCppStack - pTopStack) % 8) pCppStack+=sizeof(sal_Int32); //align to 8
break;
default:
@@ -133,13 +138,31 @@ namespace
}
#endif
pCppArgs[nPos] = pCppStack;
pUnoArgs[nPos] = pCppStack;
// For armhf we get the floating point arguments from a different area of the stack
// TODO: deal with functions with more than 8 floating point args that need to overflow
// to the stack. Find such an UNO API to try on.
#ifdef __ARM_PCS_VFP
if (pParamTypeDescr->eTypeClass == typelib_TypeClass_FLOAT)
{
pCppArgs[nPos] = pUnoArgs[nPos] = pFloatArgs;
pFloatArgs += sizeof(float);
} else
if (pParamTypeDescr->eTypeClass == typelib_TypeClass_DOUBLE)
{
if ((pFloatArgs - pTopStack) % 8) pFloatArgs+=sizeof(float); //align to 8
pCppArgs[nPos] = pUnoArgs[nPos] = pFloatArgs;
pFloatArgs += sizeof(double);
} else
#endif
pCppArgs[nPos] = pUnoArgs[nPos] = pCppStack;
switch (pParamTypeDescr->eTypeClass)
{
case typelib_TypeClass_HYPER:
case typelib_TypeClass_UNSIGNED_HYPER:
#ifndef __ARM_PCS_VFP
case typelib_TypeClass_DOUBLE:
#endif
pCppStack += sizeof(sal_Int32); // extra long
break;
default:
@@ -179,6 +202,13 @@ namespace
TYPELIB_DANGER_RELEASE( pParamTypeDescr );
}
}
#ifdef __ARM_PCS_VFP
// use the stack for output parameters or non floating point values
if (rParam.bOut ||
((pParamTypeDescr->eTypeClass != typelib_TypeClass_DOUBLE)
&& (pParamTypeDescr->eTypeClass != typelib_TypeClass_FLOAT))
)
#endif
pCppStack += sizeof(sal_Int32); // standard parameter length
}