x86: Add support for Complex
This commit is contained in:
@@ -120,6 +120,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
do_struct:
|
||||||
switch (cabi)
|
switch (cabi)
|
||||||
{
|
{
|
||||||
case FFI_THISCALL:
|
case FFI_THISCALL:
|
||||||
@@ -136,6 +137,32 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|||||||
bytes += ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
|
bytes += ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case FFI_TYPE_COMPLEX:
|
||||||
|
switch (cif->rtype->elements[0]->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
goto do_struct;
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_INT:
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
flags = X86_RET_INT64;
|
||||||
|
break;
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
flags = X86_RET_INT32;
|
||||||
|
break;
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
flags = X86_RET_STRUCT_2B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FFI_BAD_TYPEDEF;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return FFI_BAD_TYPEDEF;
|
return FFI_BAD_TYPEDEF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ run-many-tests $tlist ""
|
|||||||
# ??? We really should preprocess ffi.h and grep
|
# ??? We really should preprocess ffi.h and grep
|
||||||
# for FFI_TARGET_HAS_COMPLEX_TYPE.
|
# for FFI_TARGET_HAS_COMPLEX_TYPE.
|
||||||
if { [istarget s390*]
|
if { [istarget s390*]
|
||||||
|| [istarget x86_64*] } {
|
|| [istarget x86_64*]
|
||||||
|
|| [istarget i?86*] } {
|
||||||
run-many-tests $ctlist ""
|
run-many-tests $ctlist ""
|
||||||
} else {
|
} else {
|
||||||
foreach test $ctlist {
|
foreach test $ctlist {
|
||||||
|
|||||||
Reference in New Issue
Block a user