Commit 5af1c806 by Alan Modra Committed by Alan Modra

types.c (double, longdouble): Merge identical SH and ARM typedefs, and add POWERPC64.

	* src/types.c (double, longdouble): Merge identical SH and ARM
	typedefs, and add POWERPC64.
	* src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for
	struct split over gpr and rest.
	(ffi_prep_cif_machdep): Correct intarg_count for structures.
	* src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets.

From-SVN: r71295
parent 64871887
2003-09-11 Alan Modra <amodra@bigpond.net.au>
* src/types.c (double, longdouble): Merge identical SH and ARM
typedefs, and add POWERPC64.
* src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for
struct split over gpr and rest.
(ffi_prep_cif_machdep): Correct intarg_count for structures.
* src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets.
2003-09-09 Andreas Tobler <a.tobler@schweiz.ch> 2003-09-09 Andreas Tobler <a.tobler@schweiz.ch>
* src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct
......
...@@ -376,11 +376,11 @@ void hidden ffi_prep_args64(extended_cif *ecif, unsigned long *const stack) ...@@ -376,11 +376,11 @@ void hidden ffi_prep_args64(extended_cif *ecif, unsigned long *const stack)
words = ((*ptr)->size + 7) / 8; words = ((*ptr)->size + 7) / 8;
if (next_arg >= gpr_base && next_arg + words > gpr_end) if (next_arg >= gpr_base && next_arg + words > gpr_end)
{ {
unsigned int first = (char *) gpr_end - (char *) next_arg; size_t first = (char *) gpr_end - (char *) next_arg;
memcpy((char *) next_arg, (char *) *p_argv, first); memcpy((char *) next_arg, (char *) *p_argv, first);
memcpy((char *) rest, (char *) *p_argv + first, memcpy((char *) rest, (char *) *p_argv + first,
(*ptr)->size - first); (*ptr)->size - first);
next_arg = rest + words * 8 - first; next_arg = (unsigned long *) ((char *) rest + words * 8 - first);
} }
else else
{ {
...@@ -591,7 +591,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -591,7 +591,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
#endif #endif
intarg_count += ((*ptr)->size + 7) & ~7; intarg_count += ((*ptr)->size + 7) / 8;
break; break;
default: default:
......
...@@ -73,10 +73,10 @@ ffi_call_LINUX64: ...@@ -73,10 +73,10 @@ ffi_call_LINUX64:
ld %r5, -32-(6*8)(%r28) ld %r5, -32-(6*8)(%r28)
ld %r6, -32-(5*8)(%r28) ld %r6, -32-(5*8)(%r28)
bf- 5, 1f bf- 5, 1f
ld %r7, -32-(4*4)(%r28) ld %r7, -32-(4*8)(%r28)
ld %r8, -32-(3*4)(%r28) ld %r8, -32-(3*8)(%r28)
ld %r9, -32-(2*4)(%r28) ld %r9, -32-(2*8)(%r28)
ld %r10, -32-(1*4)(%r28) ld %r10, -32-(1*8)(%r28)
1: 1:
/* Load all the FP registers. */ /* Load all the FP registers. */
......
...@@ -76,12 +76,7 @@ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ...@@ -76,12 +76,7 @@ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64);
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
#elif defined ARM #elif defined ARM || defined SH || defined POWERPC64
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
#elif defined SH
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment