summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root>2008-11-03 16:05:38 +0000
committerroot <root>2008-11-03 16:05:38 +0000
commitdcc2c81e80826ac63c4d2ed39a8892e04e543a77 (patch)
treef9efce5f5cc91ae948b02c2c12d73bc886e582a0
parentba65c39933ea70641654c0fb4b76d6cc85dd534e (diff)
*** empty log message ***rel-4_803
-rw-r--r--coro.c64
-rw-r--r--coro.h5
2 files changed, 35 insertions, 34 deletions
diff --git a/coro.c b/coro.c
index 1d9b5a8..ec41c0e 100644
--- a/coro.c
+++ b/coro.c
@@ -122,43 +122,42 @@ trampoline (int sig)
#endif
#if CORO_ASM
-void __attribute__((__noinline__, __regparm__(2)))
-coro_transfer (struct coro_context *prev, struct coro_context *next)
-{
- asm volatile (
+asm (
+ ".text\n"
+ ".globl coro_transfer\n"
+ ".type coro_transfer, @function\n"
+ "coro_transfer:\n"
#if __amd64
# define NUM_SAVED 5
- "push %%rbx\n\t"
- "push %%r12\n\t"
- "push %%r13\n\t"
- "push %%r14\n\t"
- "push %%r15\n\t"
- "mov %%rsp, %0\n\t"
- "mov %1, %%rsp\n\t"
- "pop %%r15\n\t"
- "pop %%r14\n\t"
- "pop %%r13\n\t"
- "pop %%r12\n\t"
- "pop %%rbx\n\t"
+ "\tpush %rbx\n"
+ "\tpush %r12\n"
+ "\tpush %r13\n"
+ "\tpush %r14\n"
+ "\tpush %r15\n"
+ "\tmov %rsp, (%rdi)\n"
+ "\tmov (%rsi), %rsp\n"
+ "\tpop %r15\n"
+ "\tpop %r14\n"
+ "\tpop %r13\n"
+ "\tpop %r12\n"
+ "\tpop %rbx\n"
#elif __i386
# define NUM_SAVED 4
- "push %%ebx\n\t"
- "push %%esi\n\t"
- "push %%edi\n\t"
- "push %%ebp\n\t"
- "mov %%esp, %0\n\t"
- "mov %1, %%esp\n\t"
- "pop %%ebp\n\t"
- "pop %%edi\n\t"
- "pop %%esi\n\t"
- "pop %%ebx\n\t"
+ "\tpush %ebx\n"
+ "\tpush %esi\n"
+ "\tpush %edi\n"
+ "\tpush %ebp\n"
+ "\tmov %esp, (%eax)\n"
+ "\tmov (%edx), %esp\n"
+ "\tpop %ebp\n"
+ "\tpop %edi\n"
+ "\tpop %esi\n"
+ "\tpop %ebx\n"
#else
# error unsupported architecture
#endif
- : "=m" (prev->sp)
- : "m" (next->sp)
- );
-}
+ "\tret\n"
+);
#endif
#if CORO_PTHREAD
@@ -187,6 +186,8 @@ trampoline (void *args_)
return 0;
}
+asm("");
+
void coro_transfer(coro_context *prev, coro_context *next)
{
pthread_cond_init (&prev->c, 0);
@@ -329,10 +330,9 @@ void coro_create (coro_context *ctx,
/* we try to allow for both functions with and without frame pointers */
*--ctx->sp = (void *)coro_init;
{
- void *frame = ctx->sp - 1;
int i;
for (i = NUM_SAVED; i--; )
- *--ctx->sp = frame;
+ *--ctx->sp = 0;
}
# endif
diff --git a/coro.h b/coro.h
index 2041d3b..a48fb8b 100644
--- a/coro.h
+++ b/coro.h
@@ -56,6 +56,7 @@
* 2008-04-04 New (but highly unrecommended) pthreads backend.
* 2008-04-24 Reinstate CORO_LOSER (had wrong stack adjustments).
* 2008-10-30 Support assembly method on x86 with and without frame pointer.
+ * 2008-11-03 Use a global asm statement for CORO_ASM, idea by pippijn.
*/
#ifndef CORO_H
@@ -208,11 +209,11 @@ struct coro_context {
#elif CORO_ASM
struct coro_context {
- volatile void **sp;
+ volatile void **sp; /* must be at offset 0 */
};
void __attribute__ ((__noinline__, __regparm__(2)))
- coro_transfer (coro_context *prev, coro_context *next);
+coro_transfer (coro_context *prev, coro_context *next);
#elif CORO_PTHREAD