These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / h8300 / lib / memset.S
diff --git a/kernel/arch/h8300/lib/memset.S b/kernel/arch/h8300/lib/memset.S
new file mode 100644 (file)
index 0000000..18d4e70
--- /dev/null
@@ -0,0 +1,69 @@
+/* memset.S */
+
+#include <asm/linkage.h>
+
+#if defined(CONFIG_CPU_H8300H)
+       .h8300h
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .h8300s
+#endif
+       .text
+
+.global        memset
+.global        clear_user
+
+;;void *memset(*ptr, int c, size_t count)
+;; ptr = er0
+;; c   = er1(r1l)
+;; count = er2
+memset:
+       btst    #0,r0l
+       beq     2f
+
+       ;; odd address
+1:
+       mov.b   r1l,@er0
+       adds    #1,er0
+       dec.l   #1,er2
+       beq     6f
+
+       ;; even address
+2:
+       mov.l   er2,er3
+       cmp.l   #4,er2
+       blo     4f
+       ;; count>=4 -> count/4
+#if defined(CONFIG_CPU_H8300H)
+       shlr.l  er2
+       shlr.l  er2
+#endif
+#if defined(CONFIG_CPU_H8S)
+       shlr.l  #2,er2
+#endif
+       ;; byte -> long
+       mov.b   r1l,r1h
+       mov.w   r1,e1
+3:
+       mov.l   er1,@er0
+       adds    #4,er0
+       dec.l   #1,er2
+       bne     3b
+4:
+       ;; count % 4
+       and.b   #3,r3l
+       beq     6f
+5:
+       mov.b   r1l,@er0
+       adds    #1,er0
+       dec.b   r3l
+       bne     5b
+6:
+       rts
+
+clear_user:
+       mov.l   er1, er2
+       sub.l   er1, er1
+       bra     memset
+
+       .end