[PATCH] D14044: Support for 32-bit mingw-w64 in compiler-rt
Vadim Chugunov via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 24 17:26:23 PDT 2015
vadimcn created this revision.
vadimcn added reviewers: rnk, martell.
vadimcn added a subscriber: llvm-commits.
vadimcn set the repository for this revision to rL LLVM.
Replace __chkstk_ms with _alloca, since that's what X86FrameLowering::emitStackProbeCall actually uses to probe stack on Win32.
Also, replace `or` instructions with `test`. The latter should be marginally more efficient, as it doesn't write into memory.
Repository:
rL LLVM
http://reviews.llvm.org/D14044
Files:
lib/builtins/i386/chkstk.S
lib/builtins/x86_64/chkstk.S
Index: lib/builtins/x86_64/chkstk.S
===================================================================
--- lib/builtins/x86_64/chkstk.S
+++ lib/builtins/x86_64/chkstk.S
@@ -24,13 +24,13 @@
jb 1f
2:
sub $0x1000,%rcx
- orl $0,(%rcx)
+ test %rcx,(%rcx)
sub $0x1000,%rax
cmp $0x1000,%rax
ja 2b
1:
sub %rax,%rcx
- orl $0,(%rcx)
+ test %rcx,(%rcx)
pop %rax
pop %rcx
ret
Index: lib/builtins/i386/chkstk.S
===================================================================
--- lib/builtins/i386/chkstk.S
+++ lib/builtins/i386/chkstk.S
@@ -3,7 +3,8 @@
#include "../assembly.h"
-// _chkstk routine
+// _chkstk (_alloca) routine - probe stack between %esp and (%esp-%eax) in 4k increments,
+// then decrement %esp by %eax. Preserves all registers except %esp and flags.
// This routine is windows specific
// http://msdn.microsoft.com/en-us/library/ms648426.aspx
@@ -11,7 +12,8 @@
.text
.balign 4
-DEFINE_COMPILERRT_FUNCTION(__chkstk_ms)
+DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function
+DEFINE_COMPILERRT_FUNCTION(_chkstk)
push %ecx
push %eax
cmp $0x1000,%eax
@@ -19,16 +21,18 @@
jb 1f
2:
sub $0x1000,%ecx
- orl $0,(%ecx)
+ test %ecx,(%ecx)
sub $0x1000,%eax
cmp $0x1000,%eax
ja 2b
1:
sub %eax,%ecx
- orl $0,(%ecx)
pop %eax
- pop %ecx
+ mov %ecx,%esp // install the new top of stack pointer into esp
+ mov -8(%esp,%eax),%ecx // restore ecx (esp+eax point 4 bytes above the return address)
+ push -4(%esp,%eax) // push return address onto the stack
ret
-END_COMPILERRT_FUNCTION(__chkstk_ms)
+END_COMPILERRT_FUNCTION(_chkstk)
+END_COMPILERRT_FUNCTION(_alloca)
#endif // __i386__
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14044.38335.patch
Type: text/x-patch
Size: 1978 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151025/9193680c/attachment.bin>
More information about the llvm-commits
mailing list