summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/sparc/sparc-access.S
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/sparc/sparc-access.S')
-rw-r--r--cpukit/score/cpu/sparc/sparc-access.S109
1 files changed, 109 insertions, 0 deletions
diff --git a/cpukit/score/cpu/sparc/sparc-access.S b/cpukit/score/cpu/sparc/sparc-access.S
new file mode 100644
index 0000000000..9397cb815b
--- /dev/null
+++ b/cpukit/score/cpu/sparc/sparc-access.S
@@ -0,0 +1,109 @@
+/*
+ * Optimized access routines for SPARC.
+ *
+ * Note the difference between byteorder.h (inlined functions) and access.S
+ * where the functions will be declared in the library archive librtemscpu.a.
+ * Function names starting with _ are in library and can be referenced by
+ * function pointers.
+ *
+ * _ldN, _stN standard machine endianess access (SPARC: big-endian)
+ * _ld_beN, _st_beN forced big-endian
+ * _ld_leN, _st_leN forced little-endian (defined in access_le.C)
+ *
+ * This file is written in assembly because the big-endian functions maps to
+ * machine dependant access methods, i.e. same function has two names.
+ *
+ * COPYRIGHT (c) 2011
+ * Aeroflex Gaisler.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/asm.h>
+
+ .align 4
+ .section ".text"
+ PUBLIC(_ld8)
+ PUBLIC(_ld16)
+ PUBLIC(_ld32)
+ PUBLIC(_ld64)
+ PUBLIC(_st8)
+ PUBLIC(_st16)
+ PUBLIC(_st32)
+ PUBLIC(_st64)
+ PUBLIC(_ld_be16)
+ PUBLIC(_ld_be32)
+ PUBLIC(_ld_be64)
+ PUBLIC(_st_be16)
+ PUBLIC(_st_be32)
+ PUBLIC(_st_be64)
+
+SYM(_ld8):
+ retl
+ ldub [%o0], %o0
+
+SYM(_ld_be16):
+SYM(_ld16):
+ retl
+ lduh [%o0], %o0
+
+SYM(_ld_be32):
+SYM(_ld32):
+ retl
+ ld [%o0], %o0
+
+SYM(_ld_be64):
+SYM(_ld64):
+ retl
+ ldd [%o0], %o0
+
+#if defined(__FIX_LEON3FT_B2BST)
+
+SYM(_st8):
+ stub %o1, [%o0]
+ retl
+ nop
+
+SYM(_st_be16):
+SYM(_st16):
+ stuh %o1, [%o0]
+ retl
+ nop
+
+SYM(_st_be32):
+SYM(_st32):
+ st %o1, [%o0]
+ retl
+ nop
+
+SYM(_st_be64):
+SYM(_st64):
+ std %o1, [%o0]
+ retl
+ nop
+
+#else
+
+SYM(_st8):
+ retl
+ stb %o1, [%o0]
+
+SYM(_st_be16):
+SYM(_st16):
+ retl
+ sth %o1, [%o0]
+
+SYM(_st_be32):
+SYM(_st32):
+ retl
+ st %o1, [%o0]
+
+SYM(_st_be64):
+SYM(_st64):
+ mov %o2, %o3
+ mov %o1, %o2
+ retl
+ std %o2, [%o0]
+#endif