Реализация функции __sync_val_compare_and_swap для Sparc V8

Тема в разделе "LANGS.C", создана пользователем Goliath, 20 фев 2012.

  1. Goliath

    Goliath New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2012
    Сообщения:
    2
    У меня возникла проблема. Имеется кросс компилятор под архитектуру Sparc. Но он не поддерживает Built-in functions for atomic memory access. Меня интересует функция __sync_val_compare_and_swap (long *ptr, long oldval long newval)

    она выполняет атомарную операцию сравнения и обмена: That is, if the current value of *ptr is oldval, then write newval into *ptr.

    Вот есть реализация для i386:
    Код (Text):
    1. struct __xchg_dummy { unsigned long a[100]; };
    2. #define __xg(x) ((struct __xchg_dummy *)(x))
    3.  
    4. static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
    5.                   unsigned long new, int size)
    6. {
    7.    unsigned long prev;
    8.    switch (size) {
    9.    case 1:
    10.       __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
    11.                  : "=a"(prev)
    12.                  : "q"(new), "m"(*__xg(ptr)), "0"(old)
    13.                  : "memory");
    14.       return prev;
    15.    case 2:
    16.       __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
    17.                  : "=a"(prev)
    18.                  : "q"(new), "m"(*__xg(ptr)), "0"(old)
    19.                  : "memory");
    20.       return prev;
    21.    case 4:
    22.       __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
    23.                  : "=a"(prev)
    24.                  : "q"(new), "m"(*__xg(ptr)), "0"(old)
    25.                  : "memory");
    26.       return prev;
    27.    }
    28.    return old;
    29. }
    30.  
    31. #define cmpxchg(ptr,o,n)\
    32.    ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
    33.                (unsigned long)(n),sizeof(*(ptr))))
    Кто-нибудь знаком с написанием ассемблерных вставок (для кода на языке C) под архитектуру Sparc V8? Буду очень благодарен помощи
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Что нам с вашей благодарности ?
    Пробуйте линковать с -lgcc_s (юзая __sync_val_compare_and_swap_4 )
     
  3. Goliath

    Goliath New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2012
    Сообщения:
    2
    пробовал, не помогает
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Goliath
    Вам не приходило в голову, что на Sparc могут отсутствовать некоторые интеловские извращения и нужно использовать другие механизмы синхронизации?!