Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -77,11 +77,11 @@ pushDouble(struct call_context **context, size_t *currentSSE, double value) { struct call_context *newContext; if (*currentSSE < NUM_SSE_IN) { - (*context)->sse[(*currentSSE)++] = _mm_set_sd(value); + (*context)->sse[(*currentSSE)++] = (__m128)_mm_set_sd(value); (*context)->num_sse_used++; return; } if ((newContext = realloc(*context, @@ -273,11 +273,11 @@ _mm_store_ss(&floatTmp, context->sse[0]); [invocation setReturnValue: &floatTmp]; break; case 'd':; double doubleTmp; - _mm_store_sd(&doubleTmp, context->sse[0]); + _mm_store_sd(&doubleTmp, (__m128d)context->sse[0]); [invocation setReturnValue: &doubleTmp]; break; case 'D': [invocation setReturnValue: &context->x87[0]]; break; Index: tests/OFInvocationTests.m ================================================================== --- tests/OFInvocationTests.m +++ tests/OFInvocationTests.m @@ -102,10 +102,11 @@ return (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 + d12 + d13 + d14 + d15 + d16) / 16; } #ifdef __SIZEOF_INT128__ +__extension__ - (__int128)invocationTestMethod5: (__int128)i1 : (__int128)i2 : (int)i3 /* to check alignment */ : (__int128)i4 : (__int128)i5 @@ -274,11 +275,11 @@ atIndex: 0]; [invocation setArgument: &selector atIndex: 1]; for (int i = 1; i <= 16; i++) { - __int128 i128 = 0xFFFFFFFFFFFFFFFF; + __extension__ __int128 i128 = 0xFFFFFFFFFFFFFFFF; i128 <<= 64; i128 |= i; if (i == 3) [invocation setArgument: &i @@ -286,15 +287,16 @@ else [invocation setArgument: &i128 atIndex: i + 1]; } - __int128 int128Result; + __extension__ __int128 int128Result; TEST(@"-[invoke] #4", R([invocation invoke]) && R([invocation getReturnValue: &int128Result]) && - int128Result == ((__int128)0xFFFFFFFFFFFFFFFF << 64) + 8) + int128Result == __extension__ ((__int128)0xFFFFFFFFFFFFFFFF << 64) + + 8) # endif #endif [pool drain]; } @end