summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/riscv/memset.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/riscv/memset.S')
-rw-r--r--newlib/libc/machine/riscv/memset.S98
1 files changed, 98 insertions, 0 deletions
diff --git a/newlib/libc/machine/riscv/memset.S b/newlib/libc/machine/riscv/memset.S
new file mode 100644
index 000000000..96bdddf68
--- /dev/null
+++ b/newlib/libc/machine/riscv/memset.S
@@ -0,0 +1,98 @@
+/* Copyright (c) 2017 SiFive Inc. All rights reserved.
+
+ This copyrighted material is made available to anyone wishing to use,
+ modify, copy, or redistribute it subject to the terms and conditions
+ of the BSD License. This program is distributed in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
+ including the implied warranties of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. A copy of this license is available at
+ http://www.opensource.org/licenses.
+*/
+
+.text
+.global memset
+.type memset, @function
+memset:
+ li t1, 15
+ move a4, a0
+ bleu a2, t1, .Ltiny
+ and a5, a4, 15
+ bnez a5, .Lmisaligned
+
+.Laligned:
+ bnez a1, .Lwordify
+
+.Lwordified:
+ and a3, a2, ~15
+ and a2, a2, 15
+ add a3, a3, a4
+
+#if __riscv_xlen == 64
+1:sd a1, 0(a4)
+ sd a1, 8(a4)
+#else
+1:sw a1, 0(a4)
+ sw a1, 4(a4)
+ sw a1, 8(a4)
+ sw a1, 12(a4)
+#endif
+ add a4, a4, 16
+ bltu a4, a3, 1b
+
+ bnez a2, .Ltiny
+ ret
+
+.Ltiny:
+ sub a3, t1, a2
+ sll a3, a3, 2
+1:auipc t0, %pcrel_hi(.Ltable)
+ add a3, a3, t0
+.option push
+.option norvc
+.Ltable_misaligned:
+ jr a3, %pcrel_lo(1b)
+.Ltable:
+ sb a1,14(a4)
+ sb a1,13(a4)
+ sb a1,12(a4)
+ sb a1,11(a4)
+ sb a1,10(a4)
+ sb a1, 9(a4)
+ sb a1, 8(a4)
+ sb a1, 7(a4)
+ sb a1, 6(a4)
+ sb a1, 5(a4)
+ sb a1, 4(a4)
+ sb a1, 3(a4)
+ sb a1, 2(a4)
+ sb a1, 1(a4)
+ sb a1, 0(a4)
+.option pop
+ ret
+
+.Lwordify:
+ and a1, a1, 0xFF
+ sll a3, a1, 8
+ or a1, a1, a3
+ sll a3, a1, 16
+ or a1, a1, a3
+#if __riscv_xlen == 64
+ sll a3, a1, 32
+ or a1, a1, a3
+#endif
+ j .Lwordified
+
+.Lmisaligned:
+ sll a3, a5, 2
+1:auipc t0, %pcrel_hi(.Ltable_misaligned)
+ add a3, a3, t0
+ mv t0, ra
+ jalr a3, %pcrel_lo(1b)
+ mv ra, t0
+
+ add a5, a5, -16
+ sub a4, a4, a5
+ add a2, a2, a5
+ bleu a2, t1, .Ltiny
+ j .Laligned
+ .size memset, .-memset