summaryrefslogtreecommitdiff
path: root/libco/x86.c
diff options
context:
space:
mode:
authorDavid Guillen Fandos2021-03-08 18:44:03 +0100
committerDavid Guillen Fandos2021-03-08 18:44:03 +0100
commit56dc6ecb70e6fc76d32d6a7194acb273b76bfe0e (patch)
treecf3b14a8d1bc593248398d0c544251ea8987b40e /libco/x86.c
parent02e35339ee89f92d346d290c24497bbbae59ea79 (diff)
downloadpicogpsp-56dc6ecb70e6fc76d32d6a7194acb273b76bfe0e.tar.gz
picogpsp-56dc6ecb70e6fc76d32d6a7194acb273b76bfe0e.tar.bz2
picogpsp-56dc6ecb70e6fc76d32d6a7194acb273b76bfe0e.zip
Remove libco
This removes libco and all the usages of it (+pthreads). Rewired all dynarecs and interpreter to return after every frame so that libretro can process events. This required to make dynarec re-entrant. Dynarecs were updated to check for new frame on every update (IRQ, cycle exhaustion, I/O write, etc). The performance impact of doing so should be minimal (and definitely outweight the libco gains). While at it, fixed small issues to get a bit more perf: arm dynarec was not idling correctly, mips was using stack when not needed, etc. Tested on PSP (mips), OGA (armv7), Linux (x86 and interpreter). Not tested on Android though.
Diffstat (limited to 'libco/x86.c')
-rw-r--r--libco/x86.c117
1 files changed, 0 insertions, 117 deletions
diff --git a/libco/x86.c b/libco/x86.c
deleted file mode 100644
index ae16766..0000000
--- a/libco/x86.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- libco.x86 (2009-10-12)
- author: byuu
- license: public domain
-*/
-
-#define LIBCO_C
-#include <libco.h>
-#include <assert.h>
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(_MSC_VER)
- #define fastcall __fastcall
-#elif defined(__GNUC__)
- #define fastcall __attribute__((fastcall))
-#else
- #error "libco: please define fastcall macro"
-#endif
-
-static thread_local long co_active_buffer[64];
-static thread_local cothread_t co_active_handle = 0;
-static void (fastcall *co_swap)(cothread_t, cothread_t) = 0;
-
-//ABI: fastcall
-static unsigned char co_swap_function[] = {
- 0x89, 0x22, /* mov [edx],esp */
- 0x8b, 0x21, /* mov esp,[ecx] */
- 0x58, /* pop eax */
- 0x89, 0x6a, 0x04, /* mov [edx+0x04],ebp */
- 0x89, 0x72, 0x08, /* mov [edx+0x08],esi */
- 0x89, 0x7a, 0x0c, /* mov [edx+0x0c],edi */
- 0x89, 0x5a, 0x10, /* mov [edx+0x10],ebx */
- 0x8b, 0x69, 0x04, /* mov ebp,[ecx+0x04] */
- 0x8b, 0x71, 0x08, /* mov esi,[ecx+0x08] */
- 0x8b, 0x79, 0x0c, /* mov edi,[ecx+0x0c] */
- 0x8b, 0x59, 0x10, /* mov ebx,[ecx+0x10] */
- 0xff, 0xe0, /* jmp eax */
-};
-
-#ifdef _WIN32
-#include <windows.h>
-
-void co_init(void)
-{
- DWORD old_privileges;
- VirtualProtect(co_swap_function,
- sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges);
-}
-#else
-#include <unistd.h>
-#include <sys/mman.h>
-
-void co_init(void)
-{
- unsigned long addr = (unsigned long)co_swap_function;
- unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE));
- unsigned long size = (addr - base) + sizeof co_swap_function;
- mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC);
-}
-#endif
-
-static void crash(void)
-{
- assert(0); /* called only if cothread_t entrypoint returns */
-}
-
-cothread_t co_active(void)
-{
- if(!co_active_handle)
- co_active_handle = &co_active_buffer;
- return co_active_handle;
-}
-
-cothread_t co_create(unsigned int size, void (*entrypoint)(void))
-{
- cothread_t handle;
- if(!co_swap)
- {
- co_init();
- co_swap = (void (fastcall*)(cothread_t, cothread_t))co_swap_function;
- }
-
- if(!co_active_handle)
- co_active_handle = &co_active_buffer;
-
- size += 256; /* allocate additional space for storage */
- size &= ~15; /* align stack to 16-byte boundary */
-
- if((handle = (cothread_t)malloc(size)))
- {
- long *p = (long*)((char*)handle + size); /* seek to top of stack */
- *--p = (long)crash; /* crash if entrypoint returns */
- *--p = (long)entrypoint; /* start of function */
- *(long*)handle = (long)p; /* stack pointer */
- }
-
- return handle;
-}
-
-void co_delete(cothread_t handle)
-{
- free(handle);
-}
-
-void co_switch(cothread_t handle)
-{
- register cothread_t co_previous_handle = co_active_handle;
- co_swap(co_active_handle = handle, co_previous_handle);
-}
-
-#ifdef __cplusplus
-}
-#endif