@@ -65,37 +65,56 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
6565 argp = (char * ) ALIGN (argp , sizeof (void * ));
6666
6767 z = (* p_arg )-> size ;
68- if (z < sizeof (int ))
68+ if (z < sizeof (intptr_t ))
6969 {
70- z = sizeof (int );
70+ z = sizeof (intptr_t );
7171 switch ((* p_arg )-> type )
7272 {
7373 case FFI_TYPE_SINT8 :
74- * (signed int * ) argp = (signed int )* (SINT8 * )(* p_argv );
74+ * (intptr_t * ) argp = (intptr_t )* (SINT8 * )(* p_argv );
7575 break ;
7676
7777 case FFI_TYPE_UINT8 :
78- * (unsigned int * ) argp = (unsigned int )* (UINT8 * )(* p_argv );
78+ * (uintptr_t * ) argp = (uintptr_t )* (UINT8 * )(* p_argv );
7979 break ;
8080
8181 case FFI_TYPE_SINT16 :
82- * (signed int * ) argp = (signed int )* (SINT16 * )(* p_argv );
82+ * (intptr_t * ) argp = (intptr_t )* (SINT16 * )(* p_argv );
8383 break ;
8484
8585 case FFI_TYPE_UINT16 :
86- * (unsigned int * ) argp = (unsigned int )* (UINT16 * )(* p_argv );
86+ * (uintptr_t * ) argp = (uintptr_t )* (UINT16 * )(* p_argv );
8787 break ;
8888
8989 case FFI_TYPE_SINT32 :
90- * (signed int * ) argp = (signed int )* (SINT32 * )(* p_argv );
90+ * (intptr_t * ) argp = (intptr_t )* (SINT32 * )(* p_argv );
9191 break ;
9292
9393 case FFI_TYPE_UINT32 :
94- * (unsigned int * ) argp = (unsigned int )* (UINT32 * )(* p_argv );
94+ * (uintptr_t * ) argp = (uintptr_t )* (UINT32 * )(* p_argv );
95+ break ;
96+
97+ case FFI_TYPE_FLOAT :
98+ * (uintptr_t * ) argp = 0 ;
99+ * (float * ) argp = * (float * )(* p_argv );
100+ break ;
101+
102+ // 64-bit value cases should never be used for x86 and AMD64 builds
103+ case FFI_TYPE_SINT64 :
104+ * (intptr_t * ) argp = (intptr_t )* (SINT64 * )(* p_argv );
105+ break ;
106+
107+ case FFI_TYPE_UINT64 :
108+ * (uintptr_t * ) argp = (uintptr_t )* (UINT64 * )(* p_argv );
95109 break ;
96110
97111 case FFI_TYPE_STRUCT :
98- * (unsigned int * ) argp = (unsigned int )* (UINT32 * )(* p_argv );
112+ * (uintptr_t * ) argp = (uintptr_t )* (UINT32 * )(* p_argv );
113+ break ;
114+
115+ case FFI_TYPE_DOUBLE :
116+ * (uintptr_t * ) argp = 0 ;
117+ * (double * ) argp = * (double * )(* p_argv );
99118 break ;
100119
101120 default :
0 commit comments