Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / arch / avr32 / lib / memset.S
diff --git a/qemu/roms/u-boot/arch/avr32/lib/memset.S b/qemu/roms/u-boot/arch/avr32/lib/memset.S
new file mode 100644 (file)
index 0000000..ac2d388
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+       /*
+        * r12: void *b
+        * r11: int c
+        * r10: size_t len
+        *
+        * Returns b in r12
+        */
+       .section .text.memset, "ax", @progbits
+
+       .global memset
+       .type   memset, @function
+       .align  2
+memset:
+       mov     r9, r12
+       mov     r8, r12
+       or      r11, r11, r11 << 8
+       andl    r9, 3, COH
+       brne    1f
+
+2:     or      r11, r11, r11 << 16
+       sub     r10, 4
+       brlt    5f
+
+       /* Let's do some real work */
+4:     st.w    r8++, r11
+       sub     r10, 4
+       brge    4b
+
+       /*
+        * When we get here, we've got less than 4 bytes to set. r10
+        * might be negative.
+        */
+5:     sub     r10, -4
+       reteq   r12
+
+       /* Fastpath ends here, exactly 32 bytes from memset */
+
+       /* Handle unaligned count or pointer */
+       bld     r10, 1
+       brcc    6f
+       st.b    r8++, r11
+       st.b    r8++, r11
+       bld     r10, 0
+       retcc   r12
+6:     st.b    r8++, r11
+       mov     pc, lr
+
+       /* Handle unaligned pointer */
+1:     sub     r10, 4
+       brlt    5b
+       add     r10, r9
+       lsl     r9, 1
+       add     pc, r9
+       st.b    r8++, r11
+       st.b    r8++, r11
+       st.b    r8++, r11
+       rjmp    2b
+
+       .size   memset, . - memset