diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:18:55 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:18:55 (GMT) |
commit | e5fcad302d86d316390c6b0f62759a067313e8a9 (patch) | |
tree | c2afbf6f1066b6ce261f14341cf6d310e5595bc1 /src/corelib/arch/sparc | |
download | Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2 |
Long live Qt 4.5!
Diffstat (limited to 'src/corelib/arch/sparc')
-rw-r--r-- | src/corelib/arch/sparc/arch.pri | 10 | ||||
-rw-r--r-- | src/corelib/arch/sparc/qatomic32.s | 63 | ||||
-rw-r--r-- | src/corelib/arch/sparc/qatomic64.s | 287 | ||||
-rw-r--r-- | src/corelib/arch/sparc/qatomic_sparc.cpp | 92 |
4 files changed, 452 insertions, 0 deletions
diff --git a/src/corelib/arch/sparc/arch.pri b/src/corelib/arch/sparc/arch.pri new file mode 100644 index 0000000..3113dd3 --- /dev/null +++ b/src/corelib/arch/sparc/arch.pri @@ -0,0 +1,10 @@ +# +# SPARC architecture +# +*-64 { + SOURCES += $$QT_ARCH_CPP/qatomic64.s +} +else { + SOURCES += $$QT_ARCH_CPP/qatomic32.s \ + $$QT_ARCH_CPP/qatomic_sparc.cpp +} diff --git a/src/corelib/arch/sparc/qatomic32.s b/src/corelib/arch/sparc/qatomic32.s new file mode 100644 index 0000000..f0ab0d1 --- /dev/null +++ b/src/corelib/arch/sparc/qatomic32.s @@ -0,0 +1,63 @@ + .section ".text" + + .align 4 + .type q_atomic_trylock_int,#function + .global q_atomic_trylock_int +q_atomic_trylock_int: + sethi %hi(-2147483648),%o2 + swap [%o0],%o2 + retl + mov %o2,%o0 + .size q_atomic_trylock_int,.-q_atomic_trylock_int + + + + + .align 4 + .type q_atomic_trylock_ptr,#function + .global q_atomic_trylock_ptr +q_atomic_trylock_ptr: + mov -1, %o2 + swap [%o0], %o2 + retl + mov %o2, %o0 + .size q_atomic_trylock_ptr,.-q_atomic_trylock_ptr + + + + + .align 4 + .type q_atomic_unlock,#function + .global q_atomic_unlock +q_atomic_unlock: + stbar + retl + st %o1,[%o0] + .size q_atomic_unlock,.-q_atomic_unlock + + + + + .align 4 + .type q_atomic_set_int,#function + .global q_atomic_set_int +q_atomic_set_int: + swap [%o0],%o1 + stbar + retl + mov %o1,%o0 + .size q_atomic_set_int,.-q_atomic_set_int + + + + + .align 4 + .type q_atomic_set_ptr,#function + .global q_atomic_set_ptr +q_atomic_set_ptr: + swap [%o0],%o1 + stbar + retl + mov %o1,%o0 + .size q_atomic_set_ptr,.-q_atomic_set_ptr + diff --git a/src/corelib/arch/sparc/qatomic64.s b/src/corelib/arch/sparc/qatomic64.s new file mode 100644 index 0000000..edd1716 --- /dev/null +++ b/src/corelib/arch/sparc/qatomic64.s @@ -0,0 +1,287 @@ + .section ".text" + + .align 4 + .type q_atomic_test_and_set_int,#function + .global q_atomic_test_and_set_int +q_atomic_test_and_set_int: + cas [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_int,.-q_atomic_test_and_set_int + + .align 4 + .type q_atomic_test_and_set_acquire_int,#function + .global q_atomic_test_and_set_acquire_int +q_atomic_test_and_set_acquire_int: + cas [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + membar #LoadLoad | #LoadStore + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_acquire_int,.-q_atomic_test_and_set_acquire_int + + .align 4 + .type q_atomic_test_and_set_release_int,#function + .global q_atomic_test_and_set_release_int +q_atomic_test_and_set_release_int: + membar #LoadStore | #StoreStore + cas [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_release_int,.-q_atomic_test_and_set_release_int + + .align 4 + .type q_atomic_test_and_set_ptr,#function + .global q_atomic_test_and_set_ptr +q_atomic_test_and_set_ptr: + casx [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_ptr,.-q_atomic_test_and_set_ptr + + .align 4 + .type q_atomic_increment,#function + .global q_atomic_increment +q_atomic_increment: +q_atomic_increment_retry: + ld [%o0],%o3 + add %o3,1,%o4 + cas [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_increment_retry + nop + cmp %o4,-1 + clr %o0 + retl + movne %icc,1,%o0 + .size q_atomic_increment,.-q_atomic_increment + + .align 4 + .type q_atomic_decrement,#function + .global q_atomic_decrement +q_atomic_decrement: +q_atomic_decrement_retry: + ld [%o0],%o3 + add %o3,-1,%o4 + cas [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_decrement_retry + nop + cmp %o4,1 + clr %o0 + retl + movne %icc,1,%o0 + .size q_atomic_decrement,.-q_atomic_decrement + + .align 4 + .type q_atomic_set_int,#function + .global q_atomic_set_int +q_atomic_set_int: +q_atomic_set_int_retry: + ld [%o0],%o2 + cas [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_set_int_retry + nop + retl + mov %o1,%o0 + .size q_atomic_set_int,.-q_atomic_set_int + + .align 4 + .type q_atomic_set_ptr,#function + .global q_atomic_set_ptr +q_atomic_set_ptr: +q_atomic_set_ptr_retry: + ldx [%o0],%o2 + casx [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_set_ptr_retry + nop + retl + mov %o1,%o0 + .size q_atomic_set_ptr,.-q_atomic_set_ptr + + .align 4 + .type q_atomic_fetch_and_add_int,#function + .global q_atomic_fetch_and_add_int +q_atomic_fetch_and_add_int: +q_atomic_fetch_and_add_int_retry: + ld [%o0],%o3 + add %o3,%o1,%o4 + cas [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_int_retry + nop + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_int,.-q_atomic_fetch_and_add_int + + .align 4 + .type q_atomic_fetch_and_add_acquire_int,#function + .global q_atomic_fetch_and_add_acquire_int +q_atomic_fetch_and_add_acquire_int: +q_atomic_fetch_and_add_acquire_int_retry: + ld [%o0],%o3 + add %o3,%o1,%o4 + cas [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_acquire_int_retry + nop + membar #LoadLoad | #LoadStore + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_acquire_int,.-q_atomic_fetch_and_add_acquire_int + + .align 4 + .type q_atomic_fetch_and_add_release_int,#function + .global q_atomic_fetch_and_add_release_int +q_atomic_fetch_and_add_release_int: +q_atomic_fetch_and_add_release_int_retry: + membar #LoadStore | #StoreStore + ld [%o0],%o3 + add %o3,%o1,%o4 + cas [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_release_int_retry + nop + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_release_int,.-q_atomic_fetch_and_add_release_int + + .align 4 + .type q_atomic_fetch_and_store_acquire_int,#function + .global q_atomic_fetch_and_store_acquire_int +q_atomic_fetch_and_store_acquire_int: +q_atomic_fetch_and_store_acquire_int_retry: + ld [%o0],%o2 + cas [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_fetch_and_store_acquire_int_retry + nop + membar #LoadLoad | #LoadStore + retl + mov %o1,%o0 + .size q_atomic_fetch_and_store_acquire_int,.-q_atomic_fetch_and_store_acquire_int + + .align 4 + .type q_atomic_fetch_and_store_release_int,#function + .global q_atomic_fetch_and_store_release_int +q_atomic_fetch_and_store_release_int: +q_atomic_fetch_and_store_release_int_retry: + membar #LoadStore | #StoreStore + ld [%o0],%o2 + cas [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_fetch_and_store_release_int_retry + nop + retl + mov %o1,%o0 + .size q_atomic_fetch_and_store_release_int,.-q_atomic_fetch_and_store_release_int + + .align 4 + .type q_atomic_test_and_set_acquire_ptr,#function + .global q_atomic_test_and_set_acquire_ptr +q_atomic_test_and_set_acquire_ptr: + casx [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + membar #LoadLoad | #LoadStore + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_acquire_ptr,.-q_atomic_test_and_set_acquire_ptr + + .align 4 + .type q_atomic_test_and_set_release_ptr,#function + .global q_atomic_test_and_set_release_ptr +q_atomic_test_and_set_release_ptr: + membar #LoadStore | #StoreStore + casx [%o0],%o1,%o2 + cmp %o1,%o2 + clr %o0 + retl + move %icc,1,%o0 + .size q_atomic_test_and_set_release_ptr,.-q_atomic_test_and_set_release_ptr + + .align 4 + .type q_atomic_fetch_and_store_acquire_ptr,#function + .global q_atomic_fetch_and_store_acquire_ptr +q_atomic_fetch_and_store_acquire_ptr: +q_atomic_fetch_and_store_acquire_ptr_retry: + ldx [%o0],%o2 + casx [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_fetch_and_store_acquire_ptr_retry + nop + membar #LoadLoad | #LoadStore + retl + mov %o1,%o0 + .size q_atomic_fetch_and_store_acquire_ptr,.-q_atomic_fetch_and_store_acquire_ptr + + .align 4 + .type q_atomic_fetch_and_store_release_ptr,#function + .global q_atomic_fetch_and_store_release_ptr +q_atomic_fetch_and_store_release_ptr: +q_atomic_fetch_and_store_release_ptr_retry: + membar #LoadStore | #StoreStore + ldx [%o0],%o2 + casx [%o0],%o2,%o1 + cmp %o2,%o1 + bne q_atomic_fetch_and_store_release_ptr_retry + nop + retl + mov %o1,%o0 + .size q_atomic_fetch_and_store_release_ptr,.-q_atomic_fetch_and_store_release_ptr + + .align 4 + .type q_atomic_fetch_and_add_ptr,#function + .global q_atomic_fetch_and_add_ptr +q_atomic_fetch_and_add_ptr: +q_atomic_fetch_and_add_ptr_retry: + ldx [%o0],%o3 + add %o3,%o1,%o4 + casx [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_ptr_retry + nop + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_ptr,.-q_atomic_fetch_and_add_ptr + + .align 4 + .type q_atomic_fetch_and_add_acquire_ptr,#function + .global q_atomic_fetch_and_add_acquire_ptr +q_atomic_fetch_and_add_acquire_ptr: +q_atomic_fetch_and_add_acquire_ptr_retry: + ldx [%o0],%o3 + add %o3,%o1,%o4 + casx [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_acquire_ptr_retry + nop + membar #LoadLoad | #LoadStore + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_acquire_ptr,.-q_atomic_fetch_and_add_acquire_ptr + + .align 4 + .type q_atomic_fetch_and_add_release_ptr,#function + .global q_atomic_fetch_and_add_release_ptr +q_atomic_fetch_and_add_release_ptr: +q_atomic_fetch_and_add_release_ptr_retry: + membar #LoadStore | #StoreStore + ldx [%o0],%o3 + add %o3,%o1,%o4 + casx [%o0],%o3,%o4 + cmp %o3,%o4 + bne q_atomic_fetch_and_add_release_ptr_retry + nop + retl + mov %o3,%o0 + .size q_atomic_fetch_and_add_release_ptr,.-q_atomic_fetch_and_add_release_ptr diff --git a/src/corelib/arch/sparc/qatomic_sparc.cpp b/src/corelib/arch/sparc/qatomic_sparc.cpp new file mode 100644 index 0000000..bb411cd --- /dev/null +++ b/src/corelib/arch/sparc/qatomic_sparc.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/qatomic.h> + +#include <limits.h> +#include <sched.h> + +extern "C" { + +int q_atomic_trylock_int(volatile int *addr); +int q_atomic_trylock_ptr(volatile void *addr); + +Q_CORE_EXPORT int q_atomic_lock_int(volatile int *addr) +{ + int returnValue = q_atomic_trylock_int(addr); + + if (returnValue == INT_MIN) { + do { + // spin until we think we can succeed + do { + sched_yield(); + returnValue = *addr; + } while (returnValue == INT_MIN); + + // try again + returnValue = q_atomic_trylock_int(addr); + } while (returnValue == INT_MIN); + } + + return returnValue; +} + +Q_CORE_EXPORT int q_atomic_lock_ptr(volatile void *addr) +{ + int returnValue = q_atomic_trylock_ptr(addr); + + if (returnValue == -1) { + do { + // spin until we think we can succeed + do { + sched_yield(); + returnValue = *reinterpret_cast<volatile int *>(addr); + } while (returnValue == -1); + + // try again + returnValue = q_atomic_trylock_ptr(addr); + } while (returnValue == -1); + } + + return returnValue; +} + +} // extern "C" |