diff options
author | Richard Henderson <rth@twiddle.net> | 2013-02-14 09:46:56 -0800 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2013-03-06 07:44:25 -0800 |
commit | 3ae44082ab30918a6f5aa135620dda08e62593d5 (patch) | |
tree | 659127296546c56218bfe4dd8ede95a389dd3b62 /ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S | |
parent | cd24e113c38e81c15a72536a99062373d5701389 (diff) | |
download | glibc-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.S | 14 |
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" |