[backport from gcc-4.7/trunk r183451 ] From: Andreas Schwab Subject: [PATCH] libffi fixes for m68k Date: Sat, 14 Jan 2012 21:42:02 +0100 List-Archive: The only way to detect compiling for a plain 68000 is the absense of other defines since __mc68000__ is always defined. Also, gcc defines __HAVE_68881__, not __MC68881__. The latter fixes failures of all tests involving floating point return values. Tested on m68k-linux. Andreas. libffi/ 2012-01-23 Andreas Schwab * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain mc68000. Test for __HAVE_68881__ in addition to __MC68881__. --- gcc-4.6.3/libffi/src/m68k/sysv.S.~1~ 2011-02-08 20:19:01.000000000 +0100 +++ gcc-4.6.3/libffi/src/m68k/sysv.S 2012-05-04 00:44:47.000000000 +0200 @@ -87,7 +87,7 @@ ffi_call_SYSV: | If the return value pointer is NULL, assume no return value. | NOTE: On the mc68000, tst on an address register is not supported. -#if defined(__mc68000__) && !defined(__mcoldfire__) +#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) cmp.w #0, %a1 #else tst.l %a1 @@ -109,7 +109,7 @@ retlongint: retfloat: btst #2,%d2 jbeq retdouble -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.s %fp0,(%a1) #else move.l %d0,(%a1) @@ -119,7 +119,7 @@ retfloat: retdouble: btst #3,%d2 jbeq retlongdouble -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.d %fp0,(%a1) #else move.l %d0,(%a1)+ @@ -130,7 +130,7 @@ retdouble: retlongdouble: btst #4,%d2 jbeq retpointer -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.x %fp0,(%a1) #else move.l %d0,(%a1)+ @@ -199,7 +199,7 @@ ffi_closure_SYSV: move.l (%a0),%d1 jra .Lcls_epilogue .Lcls_ret_float: -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.s (%a0),%fp0 #else move.l (%a0),%d0 @@ -209,7 +209,7 @@ ffi_closure_SYSV: lsr.l #2,%d0 jne 1f jcs .Lcls_ret_ldouble -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.d (%a0),%fp0 #else move.l (%a0)+,%d0 @@ -217,7 +217,7 @@ ffi_closure_SYSV: #endif jra .Lcls_epilogue .Lcls_ret_ldouble: -#if defined(__MC68881__) +#if defined(__MC68881__) || defined(__HAVE_68881__) fmove.x (%a0),%fp0 #else move.l (%a0)+,%d0