[llvm-commits] [llvm-gcc-4.2] r50402 - /llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm

Anton Korobeynikov asl at math.spbu.ru
Mon Apr 28 23:22:10 PDT 2008


Author: asl
Date: Tue Apr 29 01:22:09 2008
New Revision: 50402

URL: http://llvm.org/viewvc/llvm-project?rev=50402&view=rev
Log:
Backport from mainline.
Provide win64 version of __alloca()

Modified:
    llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm

Modified: llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm?rev=50402&r1=50401&r2=50402&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/cygwin.asm Tue Apr 29 01:22:09 2008
@@ -42,27 +42,97 @@
 
 	.global ___chkstk
 	.global	__alloca
+/* LLVM LOCAL begin mainline */
+#ifndef _WIN64
 ___chkstk:
 __alloca:
-	pushl  %ecx		/* save temp */
-	movl   %esp,%ecx	/* get sp */
-	addl   $0x8,%ecx	/* and point to return addr */
-
-probe: 	cmpl   $0x1000,%eax	/* > 4k ?*/
-	jb    done		
-
-	subl   $0x1000,%ecx  		/* yes, move pointer down 4k*/
-	orl    $0x0,(%ecx)   		/* probe there */
-	subl   $0x1000,%eax  	 	/* decrement count */
-	jmp    probe           	 	/* and do it again */
-
-done: 	subl   %eax,%ecx	   
-	orl    $0x0,(%ecx)	/* less that 4k, just peek here */
-
-	movl   %esp,%eax
-	movl   %ecx,%esp	/* decrement stack */
-
-	movl   (%eax),%ecx	/* recover saved temp */
-	movl   4(%eax),%eax	/* get return address */
-	jmp    *%eax	
+	pushl	%ecx		/* save temp */
+	leal	8(%esp), %ecx	/* point past return addr */
+	cmpl	$0x1000, %eax	/* > 4k ?*/
+	jb	Ldone
+
+Lprobe:
+	subl	$0x1000, %ecx  		/* yes, move pointer down 4k*/
+	orl	$0x0, (%ecx)   		/* probe there */
+	subl	$0x1000, %eax  	 	/* decrement count */
+	cmpl	$0x1000, %eax
+	ja	Lprobe         	 	/* and do it again */
+
+Ldone:
+	subl	%eax, %ecx	   
+	orl	$0x0, (%ecx)	/* less than 4k, just peek here */
+
+	movl	%esp, %eax	/* save old stack pointer */
+	movl	%ecx, %esp	/* decrement stack */
+	movl	(%eax), %ecx	/* recover saved temp */
+	movl	4(%eax), %eax	/* recover return address */
+
+	/* Push the return value back.  Doing this instead of just
+	   jumping to %eax preserves the cached call-return stack
+	   used by most modern processors.  */
+	pushl	%eax
+	ret
+#else
+/* __alloca is a normal function call, which uses %rcx as the argument.  And stack space
+   for the argument is saved.  */
+__alloca:
+ 	movq	%rcx, %rax
+	addq	$0x7, %rax
+	andq	$0xfffffffffffffff8, %rax
+	popq	%rcx		/* pop return address */
+	popq	%r10		/* Pop the reserved stack space.  */
+	movq	%rsp, %r10	/* get sp */
+	cmpq	$0x1000, %rax	/* > 4k ?*/
+	jb	Ldone_alloca
+
+Lprobe_alloca:
+	subq	$0x1000, %r10  		/* yes, move pointer down 4k*/
+	orq	$0x0, (%r10)   		/* probe there */
+	subq	$0x1000, %rax  	 	/* decrement count */
+	cmpq	$0x1000, %rax
+	ja	Lprobe_alloca         	 	/* and do it again */
+
+Ldone_alloca:
+	subq	%rax, %r10
+	orq	$0x0, (%r10)	/* less than 4k, just peek here */
+	movq	%r10, %rax
+	subq	$0x8, %r10	/* Reserve argument stack space.  */
+	movq	%r10, %rsp	/* decrement stack */
+
+	/* Push the return value back.  Doing this instead of just
+	   jumping to %rcx preserves the cached call-return stack
+	   used by most modern processors.  */
+	pushq	%rcx
+	ret
+
+/* ___chkstk is a *special* function call, which uses %rax as the argument.
+   We avoid clobbering the 4 integer argument registers, %rcx, %rdx, 
+   %r8 and %r9, which leaves us with %rax, %r10, and %r11 to use.  */
+___chkstk:
+	addq	$0x7, %rax	/* Make sure stack is on alignment of 8.  */
+	andq	$0xfffffffffffffff8, %rax
+	popq	%r11		/* pop return address */
+	movq	%rsp, %r10	/* get sp */
+	cmpq	$0x1000, %rax	/* > 4k ?*/
+	jb	Ldone
+
+Lprobe:
+	subq	$0x1000, %r10  		/* yes, move pointer down 4k*/
+	orl	$0x0, (%r10)   		/* probe there */
+	subq	$0x1000, %rax  	 	/* decrement count */
+	cmpq	$0x1000, %rax
+	ja	Lprobe         	 	/* and do it again */
+
+Ldone:
+	subq	%rax, %r10
+	orl	$0x0, (%r10)	/* less than 4k, just peek here */
+	movq	%r10, %rsp	/* decrement stack */
+
+	/* Push the return value back.  Doing this instead of just
+	   jumping to %r11 preserves the cached call-return stack
+	   used by most modern processors.  */
+	pushq	%r11
+	ret
+#endif
+/* LLVM LOCAL end mainline */
 #endif





More information about the llvm-commits mailing list