Darwin/aarch64: Account for long double being equal to double

This commit is contained in:
Zachary Waldowski
2013-12-30 15:45:51 -05:00
parent 5658b08926
commit 6030cdcae7

View File

@@ -94,8 +94,10 @@ get_basic_type_addr (unsigned short type, struct call_context *context,
return get_s_addr (context, n); return get_s_addr (context, n);
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
return get_d_addr (context, n); return get_d_addr (context, n);
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
return get_v_addr (context, n); return get_v_addr (context, n);
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
@@ -123,8 +125,10 @@ get_basic_type_alignment (unsigned short type)
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
return sizeof (UINT64); return sizeof (UINT64);
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
return sizeof (long double); return sizeof (long double);
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
@@ -154,8 +158,10 @@ get_basic_type_size (unsigned short type)
return sizeof (UINT32); return sizeof (UINT32);
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
return sizeof (UINT64); return sizeof (UINT64);
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
return sizeof (long double); return sizeof (long double);
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
return sizeof (UINT8); return sizeof (UINT8);
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
@@ -305,7 +311,9 @@ is_register_candidate (ffi_type *ty)
case FFI_TYPE_VOID: case FFI_TYPE_VOID:
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
case FFI_TYPE_UINT32: case FFI_TYPE_UINT32:
@@ -457,9 +465,11 @@ copy_basic_type (void *dest, void *source, unsigned short type)
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
*(double *) dest = *(double *) source; *(double *) dest = *(double *) source;
break; break;
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
*(long double *) dest = *(long double *) source; *(long double *) dest = *(long double *) source;
break; break;
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
*(ffi_arg *) dest = *(UINT8 *) source; *(ffi_arg *) dest = *(UINT8 *) source;
break; break;
@@ -548,11 +558,13 @@ allocate_to_register_or_stack (struct call_context *context,
return allocate_to_d (context, state); return allocate_to_d (context, state);
state->nsrn = N_V_ARG_REG; state->nsrn = N_V_ARG_REG;
break; break;
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
if (state->nsrn < N_V_ARG_REG) if (state->nsrn < N_V_ARG_REG)
return allocate_to_v (context, state); return allocate_to_v (context, state);
state->nsrn = N_V_ARG_REG; state->nsrn = N_V_ARG_REG;
break; break;
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
@@ -615,7 +627,9 @@ aarch64_prep_args (struct call_context *context, unsigned char *stack,
appropriate register, or if none are available, to the stack. */ appropriate register, or if none are available, to the stack. */
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
@@ -745,7 +759,9 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
case FFI_TYPE_VOID: case FFI_TYPE_VOID:
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
#endif
case FFI_TYPE_UINT8: case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8: case FFI_TYPE_SINT8:
case FFI_TYPE_UINT16: case FFI_TYPE_UINT16:
@@ -897,10 +913,12 @@ ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context,
case FFI_TYPE_SINT64: case FFI_TYPE_SINT64:
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
avalue[i] = allocate_to_register_or_stack (context, stack, avalue[i] = allocate_to_register_or_stack (context, stack,
&state, ty->type); &state, ty->type);
break; break;
#endif
case FFI_TYPE_STRUCT: case FFI_TYPE_STRUCT:
if (is_hfa (ty)) if (is_hfa (ty))
@@ -958,11 +976,13 @@ ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context,
break; break;
} }
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
memcpy (&avalue[i], memcpy (&avalue[i],
allocate_to_v (context, &state), allocate_to_v (context, &state),
sizeof (*avalue)); sizeof (*avalue));
break; break;
#endif
default: default:
FFI_ASSERT (0); FFI_ASSERT (0);
@@ -1033,7 +1053,9 @@ ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context,
case FFI_TYPE_SINT64: case FFI_TYPE_SINT64:
case FFI_TYPE_FLOAT: case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE: case FFI_TYPE_DOUBLE:
#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_LONGDOUBLE:
#endif
{ {
void *addr = get_basic_type_addr (cif->rtype->type, context, 0); void *addr = get_basic_type_addr (cif->rtype->type, context, 0);
copy_basic_type (addr, rvalue, cif->rtype->type); copy_basic_type (addr, rvalue, cif->rtype->type);