From ab625d542633a21e2ca797c4949faf9ae83a6e07 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 4 Dec 2019 09:32:32 -0500 Subject: [PATCH 1/2] Experimentation --- asm-test.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 asm-test.c diff --git a/asm-test.c b/asm-test.c new file mode 100644 index 00000000..3bcb624c --- /dev/null +++ b/asm-test.c @@ -0,0 +1,33 @@ +// Example from: https://stackoverflow.com/q/37502841/101258 +int main() +{ + const char* test = "test\n"; + long dummyreg; /* dummyreg used to allow GCC to pick available register */ + + __asm__ __volatile__ ( + "add $-128, %%rsp\n\t" /* Skip the current redzone */ + "mov %%rsp, %[temp]\n\t" /* Copy RSP to available register */ + "and $-16, %%rsp\n\t" /* Align stack to 16-byte boundary */ + "mov %[test], %%rdi\n\t" /* RDI is address of string */ + "xor %%eax, %%eax\n\t" /* Variadic function set AL. This case 0 */ + "call printf\n\t" + "mov %[test], %%rdi\n\t" /* RDI is address of string again */ + "xor %%eax, %%eax\n\t" /* Variadic function set AL. This case 0 */ + "call printf\n\t" + "mov %[temp], %%rsp\n\t" /* Restore RSP */ + "sub $-128, %%rsp\n\t" /* Add 128 to RSP to restore to orig */ + : [temp]"=&r"(dummyreg) /* Allow GCC to pick available output register. Modified + before all inputs consumed so use & for early clobber*/ + : [test]"r"(test), /* Choose available register as input operand */ + "m"(test) /* Dummy constraint to make sure test array + is fully realized in memory before inline + assembly is executed */ + : "rax", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11", + "xmm0","xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8","xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", + "mm0","mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm6", + "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)" + ); + + return 0; +} From a2ca87e825a0667dd822b51cfe9243436910db55 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 4 Dec 2019 15:56:22 -0500 Subject: [PATCH 2/2] Revert previous change --- Makefile.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.config b/Makefile.config index c5d07864..7014be94 100644 --- a/Makefile.config +++ b/Makefile.config @@ -27,8 +27,8 @@ BASE_CFLAGS ?= $(CYC_PROFILING) $(CYC_GCC_OPT_FLAGS) -fPIC -Wall -I$(PREFIX)/in # Used by Cyclone to compile programs, no need for PIC there BASE_PROG_CFLAGS ?= $(CYC_PROFILING) $(CYC_GCC_OPT_FLAGS) -Wall -I$(PREFIX)/include ifeq ($(OS),Darwin) -COMP_CFLAGS ?= $(BASE_CFLAGS) -COMP_PROG_CFLAGS ?= $(BASE_PROG_CFLAGS) +COMP_CFLAGS ?= $(BASE_CFLAGS) -L$(PREFIX)/lib +COMP_PROG_CFLAGS ?= $(BASE_PROG_CFLAGS) -L$(PREFIX)/lib else COMP_CFLAGS ?= $(BASE_CFLAGS) -L$(PREFIX)/lib COMP_PROG_CFLAGS ?= $(BASE_PROG_CFLAGS) -L$(PREFIX)/lib