From 8649b5eece4105d3a4d1c1ce2303457f03146681 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Mon, 21 Jan 2013 11:45:05 +0000 Subject: [PATCH] The patch from ticket #3469 adapted for the trunk. This commit was SVN r27882. --- config/opal_config_asm.m4 | 3 + opal/asm/Makefile.am | 4 +- opal/asm/base/ARMV5.asm | 109 +++++++++++++++++++ opal/asm/base/ARMV6.asm | 153 +++++++++++++++++++++++++++ opal/asm/base/{ARM.asm => ARMV7.asm} | 0 5 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 opal/asm/base/ARMV5.asm create mode 100644 opal/asm/base/ARMV6.asm rename opal/asm/base/{ARM.asm => ARMV7.asm} (100%) diff --git a/config/opal_config_asm.m4 b/config/opal_config_asm.m4 index eab640f9c4..4ae982a3fd 100644 --- a/config/opal_config_asm.m4 +++ b/config/opal_config_asm.m4 @@ -811,6 +811,7 @@ AC_DEFUN([OPAL_CONFIG_ASM],[ ompi_cv_asm_arch="ARM" OPAL_ASM_SUPPORT_64BIT=1 OPAL_ASM_ARM_VERSION=7 + cp -f "$top_ompi_builddir/opal/asm/base/ARMV7.asm" "$top_ompi_builddir/opal/asm/base/ARM.asm" AC_DEFINE_UNQUOTED([OPAL_ASM_ARM_VERSION], [$OPAL_ASM_ARM_VERSION], [What ARM assembly version to use]) OMPI_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)' @@ -820,6 +821,7 @@ AC_DEFUN([OPAL_CONFIG_ASM],[ ompi_cv_asm_arch="ARM" OPAL_ASM_SUPPORT_64BIT=0 OPAL_ASM_ARM_VERSION=6 + cp -f "$top_ompi_builddir/opal/asm/base/ARMV6.asm" "$top_ompi_builddir/opal/asm/base/ARM.asm" AC_DEFINE_UNQUOTED([OPAL_ASM_ARM_VERSION], [$OPAL_ASM_ARM_VERSION], [What ARM assembly version to use]) OMPI_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)' @@ -830,6 +832,7 @@ AC_DEFUN([OPAL_CONFIG_ASM],[ ompi_cv_asm_arch="ARM" OPAL_ASM_SUPPORT_64BIT=0 OPAL_ASM_ARM_VERSION=5 + cp -f "$top_ompi_builddir/opal/asm/base/ARMV5.asm" "$top_ompi_builddir/opal/asm/base/ARM.asm" AC_DEFINE_UNQUOTED([OPAL_ASM_ARM_VERSION], [$OPAL_ASM_ARM_VERSION], [What ARM assembly version to use]) OMPI_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)' diff --git a/opal/asm/Makefile.am b/opal/asm/Makefile.am index 96fa02d3ad..b0c705d146 100644 --- a/opal/asm/Makefile.am +++ b/opal/asm/Makefile.am @@ -65,7 +65,9 @@ EXTRA_DIST = \ base/default.conf \ base/ALPHA.asm \ base/AMD64.asm \ - base/ARM.asm \ + base/ARMV5.asm \ + base/ARMV6.asm \ + base/ARMV7.asm \ base/IA32.asm \ base/IA64.asm \ base/MIPS.asm \ diff --git a/opal/asm/base/ARMV5.asm b/opal/asm/base/ARMV5.asm new file mode 100644 index 0000000000..a89335df30 --- /dev/null +++ b/opal/asm/base/ARMV5.asm @@ -0,0 +1,109 @@ +START_FILE + TEXT + + ALIGN(4) +START_FUNC(opal_atomic_mb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_mb) + + +START_FUNC(opal_atomic_rmb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_rmb) + + +START_FUNC(opal_atomic_wmb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_wmb) + + +START_FUNC(opal_atomic_cmpset_32) + push {r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, REFLSYM(1) + blx r3 + movcc r0, #0 + movcs r0, #1 + pop {r4, lr} + bx lr + .align 2 + LSYM(1) + .word 0xffff0fc0 +END_FUNC(opal_atomic_cmpset_32) + + +START_FUNC(opal_atomic_cmpset_acq_32) + push {r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, REFLSYM(2) + blx r3 + movcc r0, #0 + movcs r0, #1 + pop {r4, lr} + bx lr + .align 2 + LSYM(2) + .word 0xffff0fc0 +END_FUNC(opal_atomic_cmpset_acq_32) + + +START_FUNC(opal_atomic_cmpset_rel_32) + push {r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + ldr r3, REFLSYM(3) + blx r3 + movcc r0, #0 + movcs r0, #1 + pop {r4, lr} + bx lr + .align 2 + LSYM(3) + .word 0xffff0fc0 +END_FUNC(opal_atomic_cmpset_rel_32) + +START_FUNC(opal_atomic_add_32) + push {r4, lr} + mov r4, r1 + mov r2, r0 + LSYM(4) + ldr r0, [r2] + ldr r3, REFLSYM(5) + add r1, r0, r4 + blx r3 + bcc REFLSYM(4) + pop {r4, lr} + bx lr + .align 2 + LSYM(5) + .word 0xffff0fc0 +END_FUNC(opal_atomic_add_32) + + +START_FUNC(opal_atomic_sub_32) + push {r4, lr} + mov r4, r1 + mov r2, r0 + LSYM(6) + ldr r0, [r2] + ldr r3, REFLSYM(7) + sub r1, r0, r4 + blx r3 + bcc REFLSYM(6) + pop {r4, lr} + bx lr + .align 2 + LSYM(7) + .word 0xffff0fc0 +END_FUNC(opal_atomic_sub_32) diff --git a/opal/asm/base/ARMV6.asm b/opal/asm/base/ARMV6.asm new file mode 100644 index 0000000000..1a603bb991 --- /dev/null +++ b/opal/asm/base/ARMV6.asm @@ -0,0 +1,153 @@ +START_FILE + TEXT + + ALIGN(4) +START_FUNC(opal_atomic_mb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_mb) + + +START_FUNC(opal_atomic_rmb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_rmb) + + +START_FUNC(opal_atomic_wmb) + mcr p15, 0, r0, c7, c10, 5 + bx lr +END_FUNC(opal_atomic_wmb) + + +START_FUNC(opal_atomic_cmpset_32) + LSYM(1) + ldrex r3, [r0] + cmp r1, r3 + bne REFLSYM(2) + strex r12, r2, [r0] + cmp r12, #0 + bne REFLSYM(1) + mov r0, #1 + LSYM(2) + movne r0, #0 + bx lr +END_FUNC(opal_atomic_cmpset_32) + + +START_FUNC(opal_atomic_cmpset_acq_32) + LSYM(3) + ldrex r3, [r0] + cmp r1, r3 + bne REFLSYM(4) + strex r12, r2, [r0] + cmp r12, #0 + bne REFLSYM(3) + dmb + mov r0, #1 + LSYM(4) + movne r0, #0 + bx lr +END_FUNC(opal_atomic_cmpset_acq_32) + + +START_FUNC(opal_atomic_cmpset_rel_32) + LSYM(5) + ldrex r3, [r0] + cmp r1, r3 + bne REFLSYM(6) + dmb + strex r12, r2, [r0] + cmp r12, #0 + bne REFLSYM(4) + mov r0, #1 + LSYM(6) + movne r0, #0 + bx lr +END_FUNC(opal_atomic_cmpset_rel_32) + +#START_64BIT +START_FUNC(opal_atomic_cmpset_64) + push {r4-r7} + ldrd r6, r7, [sp, #16] + LSYM(7) + ldrexd r4, r5, [r0] + cmp r4, r2 + it eq + cmpeq r5, r3 + bne REFLSYM(8) + strexd r1, r6, r7, [r0] + cmp r1, #0 + bne REFLSYM(7) + mov r0, #1 + LSYM(8) + movne r0, #0 + pop {r4-r7} + bx lr +END_FUNC(opal_atomic_cmpset_64) + +START_FUNC(opal_atomic_cmpset_acq_64) + push {r4-r7} + ldrd r6, r7, [sp, #16] + LSYM(9) + ldrexd r4, r5, [r0] + cmp r4, r2 + it eq + cmpeq r5, r3 + bne REFLSYM(10) + strexd r1, r6, r7, [r0] + cmp r1, #0 + bne REFLSYM(9) + dmb + mov r0, #1 + LSYM(10) + movne r0, #0 + pop {r4-r7} + bx lr +END_FUNC(opal_atomic_cmpset_acq_64) + + +START_FUNC(opal_atomic_cmpset_rel_64) + push {r4-r7} + ldrd r6, r7, [sp, #16] + LSYM(11) + ldrexd r4, r5, [r0] + cmp r4, r2 + it eq + cmpeq r5, r3 + bne REFLSYM(12) + dmb + strexd r1, r6, r7, [r0] + cmp r1, #0 + bne REFLSYM(11) + mov r0, #1 + LSYM(12) + movne r0, #0 + pop {r4-r7} + bx lr +END_FUNC(opal_atomic_cmpset_rel_64) +#END_64BIT + + +START_FUNC(opal_atomic_add_32) + LSYM(13) + ldrex r2, [r0] + add r2, r2, r1 + strex r3, r2, [r0] + cmp r3, #0 + bne REFLSYM(13) + mov r0, r2 + bx lr +END_FUNC(opal_atomic_add_32) + + +START_FUNC(opal_atomic_sub_32) + LSYM(14) + ldrex r2, [r0] + sub r2, r2, r1 + strex r3, r2, [r0] + cmp r3, #0 + bne REFLSYM(14) + mov r0, r2 + bx lr +END_FUNC(opal_atomic_sub_32) diff --git a/opal/asm/base/ARM.asm b/opal/asm/base/ARMV7.asm similarity index 100% rename from opal/asm/base/ARM.asm rename to opal/asm/base/ARMV7.asm