Overview
| Comment: | invoke-x86_64.m: Fix compilation with GCC |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
2379608969e26ebb4562d59893c6c74c |
| User & Date: | js on 2017-09-16 20:05:42 |
| Other Links: | manifest | tags |
Context
|
2017-09-16
| ||
| 20:20 | invoke-x86_64.m: Correctly align __int128 for GCC (check-in: c14dfdc8e5 user: js tags: trunk) | |
| 20:05 | invoke-x86_64.m: Fix compilation with GCC (check-in: 2379608969 user: js tags: trunk) | |
| 19:11 | OFInvocation: Support for invoking on x86_64/ELF (check-in: 6d2f81aea9 user: js tags: trunk) | |
Changes
Modified src/invocation/invoke-x86_64.m from [75aba7c79f] to [03bcbc3b9d].
| ︙ | ︙ | |||
75 76 77 78 79 80 81 |
static void
pushDouble(struct call_context **context, size_t *currentSSE, double value)
{
struct call_context *newContext;
if (*currentSSE < NUM_SSE_IN) {
| | | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
static void
pushDouble(struct call_context **context, size_t *currentSSE, double value)
{
struct call_context *newContext;
if (*currentSSE < NUM_SSE_IN) {
(*context)->sse[(*currentSSE)++] = (__m128)_mm_set_sd(value);
(*context)->num_sse_used++;
return;
}
if ((newContext = realloc(*context,
sizeof(**context) + ((*context)->stack_size + 1) * 8)) == NULL) {
free(*context);
|
| ︙ | ︙ | |||
271 272 273 274 275 276 277 | case 'f':; float floatTmp; _mm_store_ss(&floatTmp, context->sse[0]); [invocation setReturnValue: &floatTmp]; break; case 'd':; double doubleTmp; | | | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 |
case 'f':;
float floatTmp;
_mm_store_ss(&floatTmp, context->sse[0]);
[invocation setReturnValue: &floatTmp];
break;
case 'd':;
double doubleTmp;
_mm_store_sd(&doubleTmp, (__m128d)context->sse[0]);
[invocation setReturnValue: &doubleTmp];
break;
case 'D':
[invocation setReturnValue: &context->x87[0]];
break;
CASE_GPR('B', _Bool)
CASE_GPR('*', uintptr_t)
|
| ︙ | ︙ |
Modified tests/OFInvocationTests.m from [943b8e059c] to [23dbe050f2].
| ︙ | ︙ | |||
100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
: (long double)d16
{
return (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 +
d12 + d13 + d14 + d15 + d16) / 16;
}
#ifdef __SIZEOF_INT128__
- (__int128)invocationTestMethod5: (__int128)i1
: (__int128)i2
: (int)i3 /* to check alignment */
: (__int128)i4
: (__int128)i5
: (__int128)i6
: (__int128)i7
| > | 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
: (long double)d16
{
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
: (__int128)i6
: (__int128)i7
|
| ︙ | ︙ | |||
272 273 274 275 276 277 278 |
[invocation setArgument: &self
atIndex: 0];
[invocation setArgument: &selector
atIndex: 1];
for (int i = 1; i <= 16; i++) {
| | | | > | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
[invocation setArgument: &self
atIndex: 0];
[invocation setArgument: &selector
atIndex: 1];
for (int i = 1; i <= 16; i++) {
__extension__ __int128 i128 = 0xFFFFFFFFFFFFFFFF;
i128 <<= 64;
i128 |= i;
if (i == 3)
[invocation setArgument: &i
atIndex: i + 1];
else
[invocation setArgument: &i128
atIndex: i + 1];
}
__extension__ __int128 int128Result;
TEST(@"-[invoke] #4", R([invocation invoke]) &&
R([invocation getReturnValue: &int128Result]) &&
int128Result == __extension__ ((__int128)0xFFFFFFFFFFFFFFFF << 64) +
8)
# endif
#endif
[pool drain];
}
@end
|