Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1147407b authored by Carl Shapiro's avatar Carl Shapiro Committed by Android (Google) Code Review
Browse files

Merge "Remove unconditional swap from the android atomic operations suite." into honeycomb

parents 575a2bbe 0a16d839
Loading
Loading
Loading
Loading
+0 −32
Original line number Original line Diff line number Diff line
@@ -145,38 +145,6 @@ extern inline int android_atomic_release_cas(int32_t old_value,
}
}




#if defined(__thumb__)
extern int32_t android_atomic_swap(int32_t new_value,
                                   volatile int32_t *ptr);
#elif defined(__ARM_HAVE_LDREX_STREX)
extern inline int32_t android_atomic_swap(int32_t new_value,
                                          volatile int32_t *ptr)
{
    int32_t prev, status;
    do {
        __asm__ __volatile__ ("ldrex %0, [%3]\n"
                              "strex %1, %4, [%3]"
                              : "=&r" (prev), "=&r" (status), "+m" (*ptr)
                              : "r" (ptr), "r" (new_value)
                              : "cc");
    } while (__builtin_expect(status != 0, 0));
    android_memory_barrier();
    return prev;
}
#else
extern inline int32_t android_atomic_swap(int32_t new_value,
                                          volatile int32_t *ptr)
{
    int32_t prev;
    __asm__ __volatile__ ("swp %0, %2, [%3]"
                          : "=&r" (prev), "+m" (*ptr)
                          : "r" (new_value), "r" (ptr)
                          : "cc");
    android_memory_barrier();
    return prev;
}
#endif

#if defined(__thumb__)
#if defined(__thumb__)
extern int32_t android_atomic_add(int32_t increment,
extern int32_t android_atomic_add(int32_t increment,
                                  volatile int32_t *ptr);
                                  volatile int32_t *ptr);
+0 −11
Original line number Original line Diff line number Diff line
@@ -98,17 +98,6 @@ extern inline int android_atomic_release_cas(int32_t old_value,
    return android_atomic_cas(old_value, new_value, ptr);
    return android_atomic_cas(old_value, new_value, ptr);
}
}


extern inline int32_t android_atomic_swap(int32_t new_value,
                                          volatile int32_t *ptr)
{
    __asm__ __volatile__ ("xchgl %1, %0"
                          : "=r" (new_value)
                          : "m" (*ptr), "0" (new_value)
                          : "memory");
    /* new_value now holds the old value of *ptr */
    return new_value;
}

extern inline int32_t android_atomic_add(int32_t increment,
extern inline int32_t android_atomic_add(int32_t increment,
                                         volatile int32_t *ptr)
                                         volatile int32_t *ptr)
{
{
+0 −7
Original line number Original line Diff line number Diff line
@@ -89,13 +89,6 @@ int32_t android_atomic_release_load(volatile const int32_t* addr);
void android_atomic_acquire_store(int32_t value, volatile int32_t* addr);
void android_atomic_acquire_store(int32_t value, volatile int32_t* addr);
void android_atomic_release_store(int32_t value, volatile int32_t* addr);
void android_atomic_release_store(int32_t value, volatile int32_t* addr);


/*
 * Unconditional swap operation with release ordering.
 *
 * Stores the new value at *addr, and returns the previous value.
 */
int32_t android_atomic_swap(int32_t value, volatile int32_t* addr);

/*
/*
 * Compare-and-set operation with "acquire" or "release" ordering.
 * Compare-and-set operation with "acquire" or "release" ordering.
 *
 *
+0 −12
Original line number Original line Diff line number Diff line
@@ -113,18 +113,6 @@ int32_t android_atomic_or(int32_t value, volatile int32_t* addr) {
    return oldValue;
    return oldValue;
}
}


int32_t android_atomic_acquire_swap(int32_t value, volatile int32_t* addr) {
    return android_atomic_release_swap(value, addr);
}

int32_t android_atomic_release_swap(int32_t value, volatile int32_t* addr) {
    int32_t oldValue;
    do {
        oldValue = *addr;
    } while (android_atomic_cmpxchg(oldValue, value, addr));
    return oldValue;
}

int android_atomic_acquire_cmpxchg(int32_t oldvalue, int32_t newvalue,
int android_atomic_acquire_cmpxchg(int32_t oldvalue, int32_t newvalue,
                           volatile int32_t* addr) {
                           volatile int32_t* addr) {
    return android_atomic_release_cmpxchg(oldValue, newValue, addr);
    return android_atomic_release_cmpxchg(oldValue, newValue, addr);