summaryrefslogtreecommitdiff
path: root/cesar/hal/arch/inc/sparc.h
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/hal/arch/inc/sparc.h')
-rw-r--r--cesar/hal/arch/inc/sparc.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/cesar/hal/arch/inc/sparc.h b/cesar/hal/arch/inc/sparc.h
new file mode 100644
index 0000000000..bd50158436
--- /dev/null
+++ b/cesar/hal/arch/inc/sparc.h
@@ -0,0 +1,33 @@
+#ifndef hal_arch_inc_sparc_h
+#define hal_arch_inc_sparc_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2007 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file hal/arch/inc/sparc.h
+ * \brief Sparc specific header.
+ * \ingroup lib
+ */
+
+extern inline int
+arch_atomic_add (volatile int *p, int d)
+{
+ int o, n, t;
+ __asm__ (" ld %[p], %[o]" "\n\t"
+ "1: add %[o], %[d], %[n]" "\n\t"
+ " mov %[n], %[t]" "\n\t"
+ " swap %[p], %[t]" "\n\t"
+ " subcc %[t], %[o], %[d]" "\n\t"
+ " bne,a 1b" "\n\t"
+ " mov %[n], %[o]" "\n\t"
+ : [p] "=m" (*p), [d] "=r" (d), [o] "=&r" (o), [n] "=&r" (n), [t] "=&r" (t)
+ : "1" (d)
+ );
+ return n;
+}
+
+#endif /* hal_arch_inc_sparc_h */