… | |
… | |
120 | # endif |
120 | # endif |
121 | |
121 | |
122 | #endif |
122 | #endif |
123 | |
123 | |
124 | #if CORO_ASM |
124 | #if CORO_ASM |
125 | void __attribute__((__noinline__, __fastcall__)) |
125 | void __attribute__((__noinline__, __regparm__(2))) |
126 | coro_transfer (struct coro_context *prev, struct coro_context *next) |
126 | coro_transfer (struct coro_context *prev, struct coro_context *next) |
127 | { |
127 | { |
128 | asm volatile ( |
128 | asm volatile ( |
129 | #if __amd64 |
129 | #if __amd64 |
130 | # define NUM_CLOBBERED 5 |
130 | # define NUM_SAVED 5 |
131 | "push %%rbx\n\t" |
131 | "push %%rbx\n\t" |
132 | "push %%r12\n\t" |
132 | "push %%r12\n\t" |
133 | "push %%r13\n\t" |
133 | "push %%r13\n\t" |
134 | "push %%r14\n\t" |
134 | "push %%r14\n\t" |
135 | "push %%r15\n\t" |
135 | "push %%r15\n\t" |
… | |
… | |
139 | "pop %%r14\n\t" |
139 | "pop %%r14\n\t" |
140 | "pop %%r13\n\t" |
140 | "pop %%r13\n\t" |
141 | "pop %%r12\n\t" |
141 | "pop %%r12\n\t" |
142 | "pop %%rbx\n\t" |
142 | "pop %%rbx\n\t" |
143 | #elif __i386 |
143 | #elif __i386 |
144 | # define NUM_CLOBBERED 4 |
144 | # define NUM_SAVED 4 |
145 | "push %%ebx\n\t" |
145 | "push %%ebx\n\t" |
146 | "push %%esi\n\t" |
146 | "push %%esi\n\t" |
147 | "push %%edi\n\t" |
147 | "push %%edi\n\t" |
148 | "push %%ebp\n\t" |
148 | "push %%ebp\n\t" |
149 | "mov %%esp, %0\n\t" |
149 | "mov %%esp, %0\n\t" |
… | |
… | |
326 | # elif CORO_ASM |
326 | # elif CORO_ASM |
327 | |
327 | |
328 | ctx->sp = (volatile void **)(ssize + (char *)sptr); |
328 | ctx->sp = (volatile void **)(ssize + (char *)sptr); |
329 | *--ctx->sp = (void *)coro_init; |
329 | *--ctx->sp = (void *)coro_init; |
330 | *--ctx->sp = (void *)coro_init; // this is needed when the prologue saves ebp |
330 | *--ctx->sp = (void *)coro_init; // this is needed when the prologue saves ebp |
331 | ctx->sp -= NUM_CLOBBERED; |
331 | ctx->sp -= NUM_SAVED; |
332 | |
332 | |
333 | # endif |
333 | # endif |
334 | |
334 | |
335 | coro_transfer ((coro_context *)create_coro, (coro_context *)new_coro); |
335 | coro_transfer ((coro_context *)create_coro, (coro_context *)new_coro); |
336 | |
336 | |