[build] Get release mode optimizations working
Added a release config, and fixed a few spots where optimizations broke things: - Clang was generating incorrect code for run_ctor_list in libc's init.cpp (it ignored a check for the end of the list) - my rep movsb memcpy implementation used incorrect inline asm constraints, so it was returning a pointer to the end of the copied range instead of the start. Since this function was just inline asm anyway, I rewrote it in asm by hand in a new memutils.s file.
This commit is contained in:
@@ -8,6 +8,7 @@ j6 = module("j6",
|
||||
"condition.cpp",
|
||||
"init.cpp",
|
||||
"memutils.cpp",
|
||||
"memutils.s",
|
||||
"mutex.cpp",
|
||||
"protocol_ids.cpp",
|
||||
"protocols/service_locator.cpp",
|
||||
|
||||
@@ -7,14 +7,6 @@
|
||||
using namespace j6;
|
||||
using namespace __j6libc;
|
||||
|
||||
void *memcpy(void * restrict dst, const void * restrict src, size_t n) {
|
||||
asm volatile ("rep movsb"
|
||||
:
|
||||
: "D"(dst), "S"(src), "c"(n)
|
||||
: "memory");
|
||||
return dst;
|
||||
}
|
||||
|
||||
static void memmove_dispatch(char *s1, const char *s2, size_t n) {
|
||||
if (s1 == s2) return;
|
||||
|
||||
|
||||
7
src/libraries/j6/memutils.s
Normal file
7
src/libraries/j6/memutils.s
Normal file
@@ -0,0 +1,7 @@
|
||||
global memcpy: function (memcpy.end - memcpy)
|
||||
memcpy:
|
||||
mov rax, rdi
|
||||
mov rcx, rdx
|
||||
rep movsb
|
||||
ret
|
||||
memcpy.end:
|
||||
Reference in New Issue
Block a user