This is the mail archive of the
mailing list for the GCC project.
Help with implementing Wine optimization experiment
- From: Daniel Santos <daniel dot santos at pobox dot com>
- To: gcc <gcc at gcc dot gnu dot org>
- Date: Sun, 14 Aug 2016 01:23:16 -0500
- Subject: Help with implementing Wine optimization experiment
- Authentication-results: sourceware.org; auth=none
I'm experimenting with ways to optimize wine (x86 target only) and I
believe I can shrink wine's total text size by around 7% by outlining
the lengthy pro- and epilogues required for ms_abi functions making
sysv_abi calls. Theoretically, fewer instruction cache misses will
offset the extra 4 instructions per function and result in a net
performance gain. However, I'm new to the gcc project and a novice x86
assembly programmer as well (have been wanting to work on gcc for a
while now!) In short, I want to:
1. Replace the prologue that pushes di, sp and xmm6-15 with a single
call to a global "ms_abi_push_regs" routine
2. Replace the epilogue that pops these regs with a jmp to a global
3. Add the two routines somewhere so that they are linked into the output.
I have this working in a small-scale experiment (writing the ms_abi
function in assembly), but I'm not certain how I would add these
routines. Should I make them built-ins?
I have found the code that adds the clobber RTL instructions in
ix86_expand_call() (gcc/config/i386/i386.c:25832), and I see that
thread_prologue_and_epilogue_insns() (gcc/function.c) is where these
clobbers are expanded into the prologue and epilogue, but I'm not sure
what the cleanest way to convert this is. My thought was to replace the
clobber_reg() calls with one that would add an insn_call, or would it be
better to do this in thread_prologue_and_epilogue_insns() where prologue
and epilogue generation belongs? But that function is for all targets.
Any pointers greatly appreciated!
For reference, this is my 64-bit test case:
extern void my_sysv_func(void);
extern int __attribute__((ms_abi)) my_ms_abi_func(void);
xor %eax, %eax