@@ -28,6 +28,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2828#include <ffi_common.h>
2929#include "internal.h"
3030#ifdef _WIN32
31+ #define WIN32_LEAN_AND_MEAN
3132#include <windows.h> /* FlushInstructionCache */
3233#endif
3334#include <tramp.h>
@@ -537,6 +538,32 @@ allocate_int_to_reg_or_stack (struct call_context *context,
537538 return allocate_to_stack (state , stack , size , size );
538539}
539540
541+ static void *
542+ allocate_int128_to_reg_or_stack (struct call_context * context ,
543+ struct arg_state * state , void * stack )
544+ {
545+ unsigned ngrn = state -> ngrn ;
546+ void * ret ;
547+
548+ /* The normal AArch64 ABI requires even Xreg; Darwin does not. */
549+ #ifndef __APPLE__
550+ ngrn += ngrn & 1 ;
551+ #endif
552+
553+ if (ngrn < N_X_ARG_REG )
554+ {
555+ ret = & context -> x [ngrn ];
556+ ngrn += 2 ;
557+ }
558+ else
559+ {
560+ ret = allocate_to_stack (state , stack , 16 , 16 );
561+ ngrn = N_X_ARG_REG ;
562+ }
563+ state -> ngrn = ngrn ;
564+ return ret ;
565+ }
566+
540567ffi_status FFI_HIDDEN
541568ffi_prep_cif_machdep (ffi_cif * cif )
542569{
@@ -576,6 +603,11 @@ ffi_prep_cif_machdep (ffi_cif *cif)
576603 flags = (sizeof (void * ) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64 );
577604 break ;
578605
606+ case FFI_TYPE_UINT128 :
607+ case FFI_TYPE_SINT128 :
608+ flags = AARCH64_RET_INT128 ;
609+ break ;
610+
579611 case FFI_TYPE_FLOAT :
580612 case FFI_TYPE_DOUBLE :
581613 case FFI_TYPE_LONGDOUBLE :
@@ -741,6 +773,12 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue,
741773 }
742774 break ;
743775
776+ case FFI_TYPE_UINT128 :
777+ case FFI_TYPE_SINT128 :
778+ dest = allocate_int128_to_reg_or_stack (context , & state , stack );
779+ memcpy (dest , a , 16 );
780+ break ;
781+
744782 case FFI_TYPE_FLOAT :
745783 case FFI_TYPE_DOUBLE :
746784 case FFI_TYPE_LONGDOUBLE :
@@ -1023,6 +1061,11 @@ ffi_closure_SYSV_inner (ffi_cif *cif,
10231061 avalue [i ] = allocate_int_to_reg_or_stack (context , & state , stack , s );
10241062 break ;
10251063
1064+ case FFI_TYPE_UINT128 :
1065+ case FFI_TYPE_SINT128 :
1066+ avalue [i ] = allocate_int128_to_reg_or_stack (context , & state , stack );
1067+ break ;
1068+
10261069 case FFI_TYPE_FLOAT :
10271070 case FFI_TYPE_DOUBLE :
10281071 case FFI_TYPE_LONGDOUBLE :
0 commit comments