summary refs log tree commit diff
path: root/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2013-02-14 09:46:56 -0800
committerRichard Henderson <rth@twiddle.net>2013-03-06 07:44:25 -0800
commit3ae44082ab30918a6f5aa135620dda08e62593d5 (patch)
tree659127296546c56218bfe4dd8ede95a389dd3b62 /ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
parentcd24e113c38e81c15a72536a99062373d5701389 (diff)
downloadglibc-3ae44082ab30918a6f5aa135620dda08e62593d5.tar.gz
glibc-3ae44082ab30918a6f5aa135620dda08e62593d5.tar.xz
glibc-3ae44082ab30918a6f5aa135620dda08e62593d5.zip
arm: Introduce and use NEGOFF series of macros
There are several places in which we access negative offsets from
the thread-pointer, but thumb2 only supports positive offsets in
memory references.

Avoid duplicating the rather large macros in which these references
are embedded by abstracting out the operation.
Diffstat (limited to 'ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S')
-rw-r--r--ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S14
1 files changed, 8 insertions, 6 deletions
diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S b/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
index 3fce2d1afa..1c6f3bb2bf 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
+++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
@@ -28,15 +28,17 @@
 	ldr	lr, [sp], #4;		/* Restore LR.  */		\
 	cfi_adjust_cfa_offset (-4);					\
 	cfi_restore (lr);						\
-	mov	r2, r0;			/* Save the TLS addr in r2.  */	\
-	ldr	r3, [r2, #PID_OFFSET];	/* Load the saved PID.  */	\
-	rsbs	r0, r3, #0;		/* Negate it.  */		\
-	moveq	r0, #0x80000000;	/* Use 0x80000000 if it was 0.  */ \
-	str	r0, [r2, #PID_OFFSET]	/* Store the temporary PID.  */
+	NEGOFF_ADJ_BASE2 (r2, r0, PID_OFFSET); /* Save the TLS addr in r2.  */ \
+	ldr	r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* Load the saved PID.  */   \
+	rsbs	r0, r3, #0;		/* Negate it.  */		      \
+	it	eq;							      \
+	moveq	r0, #0x80000000;	/* Use 0x80000000 if it was 0.  */    \
+	str	r0, NEGOFF_OFF1 (r2, PID_OFFSET); /* Store the temp PID.  */
 
 /* Restore the old PID value in the parent.  */
 #define RESTORE_PID \
 	cmp	r0, #0;		/* If we are the parent... */		\
-	strne	r3, [r2, #PID_OFFSET]	/* ... restore the saved PID.  */
+	it	ne;							\
+	strne	r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* restore the saved PID.  */
 
 #include "../vfork.S"