Alexandre Julliard : oleaut32: Disable floating point instructions for the soft-float ARM build.
Alexandre Julliard
julliard at winehq.org
Fri Dec 8 13:51:29 CST 2017
Module: wine
Branch: master
Commit: 46aedd2ba4623f5ea72233d90c41c2291211b423
URL: http://source.winehq.org/git/wine.git/?a=commit;h=46aedd2ba4623f5ea72233d90c41c2291211b423
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Dec 8 13:22:31 2017 +0100
oleaut32: Disable floating point instructions for the soft-float ARM build.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/typelib.c | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 388f108..4e72ac0 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -6443,7 +6443,10 @@ __ASM_GLOBAL_FUNC( call_method,
"subs r1, r1, #4\n\t" /* Decrement count */
"bgt 2b\n\t" /* Loop till done */
- "1:\tvldm r3!, {s0-s15}\n\t" /* Load the s0-s15/d0-d7 arguments */
+ "1:\n\t"
+#ifndef __SOFTFP__
+ "vldm r3!, {s0-s15}\n\t" /* Load the s0-s15/d0-d7 arguments */
+#endif
"mov ip, r0\n\t" /* Save the function call address to ip before we nuke r0 with arguments to pass */
"ldm r3, {r0-r3}\n\t" /* Load the r0-r3 arguments */
@@ -6854,14 +6857,18 @@ DispCallFunc(
UINT i;
DWORD *args;
struct {
+#ifndef __SOFTFP__
union {
float s[16];
double d[8];
} sd;
+#endif
DWORD r[4];
} regs;
int rcount; /* 32-bit register index count */
- int scount; /* single-precision float register index count (will be incremented twice for doubles, plus alignment) */
+#ifndef __SOFTFP__
+ int scount = 0; /* single-precision float register index count (will be incremented twice for doubles, plus alignment) */
+#endif
TRACE("(%p, %ld, %d, %d, %d, %p, %p, %p (vt=%d))\n",
pvInstance, oVft, cc, vtReturn, cActuals, prgvt, prgpvarg, pvargResult, V_VT(pvargResult));
@@ -6874,7 +6881,6 @@ DispCallFunc(
argspos = 0;
rcount = 0;
- scount = 0;
/* Determine if we need to pass a pointer for the return value as arg 0. If so, do that */
/* first as it will need to be in the 'r' registers: */
@@ -6912,14 +6918,9 @@ DispCallFunc(
{
case VT_EMPTY:
break;
- case VT_R4: /* these must be 4-byte aligned, and put in 's' regs or stack, as they are single-floats */
- if (scount < 16)
- regs.sd.s[scount++] = V_R4(arg);
- else
- args[argspos++] = V_UI4(arg);
- break;
case VT_R8: /* these must be 8-byte aligned, and put in 'd' regs or stack, as they are double-floats */
case VT_DATE:
+#ifndef __SOFTFP__
if (scount < 15)
{
scount += (scount % 2); /* align scount to next whole double */
@@ -6934,6 +6935,7 @@ DispCallFunc(
argspos += sizeof(V_R8(arg)) / sizeof(DWORD);
}
break;
+#endif
case VT_I8: /* these must be 8-byte aligned, and put in 'r' regs or stack, as they are long-longs */
case VT_UI8:
case VT_CY:
@@ -6977,6 +6979,14 @@ DispCallFunc(
else
args[argspos++] = V_BOOL(arg);
break;
+ case VT_R4: /* these must be 4-byte aligned, and put in 's' regs or stack, as they are single-floats */
+#ifndef __SOFTFP__
+ if (scount < 16)
+ regs.sd.s[scount++] = V_R4(arg);
+ else
+ args[argspos++] = V_UI4(arg);
+ break;
+#endif
default:
if (rcount < 4)
regs.r[rcount++] = V_UI4(arg);
@@ -6989,8 +6999,6 @@ DispCallFunc(
argspos += (argspos % 2); /* Make sure stack function alignment is 8-byte */
- TRACE("rcount: %d, scount: %d, argspos: %d\n", rcount, scount, argspos);
-
switch (vtReturn)
{
case VT_EMPTY: /* EMPTY = no return value */
More information about the wine-cvs
mailing list