]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/memmove_riscv64.s
runtime: add support for linux/riscv64
[gostls13.git] / src / runtime / memmove_riscv64.s
1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include "textflag.h"
6
7 // void runtime·memmove(void*, void*, uintptr)
8 TEXT runtime·memmove(SB),NOSPLIT,$-0-24
9         MOV     to+0(FP), T0
10         MOV     from+8(FP), T1
11         MOV     n+16(FP), T2
12         ADD     T1, T2, T5
13
14         // If the destination is ahead of the source, start at the end of the
15         // buffer and go backward.
16         BLTU    T1, T0, b
17
18         // If less than eight bytes, do one byte at a time.
19         SLTU    $8, T2, T3
20         BNE     T3, ZERO, f_outcheck
21
22         // Do one byte at a time until from is eight-aligned.
23         JMP     f_aligncheck
24 f_align:
25         MOVB    (T1), T3
26         MOVB    T3, (T0)
27         ADD     $1, T0
28         ADD     $1, T1
29 f_aligncheck:
30         AND     $7, T1, T3
31         BNE     T3, ZERO, f_align
32
33         // Do eight bytes at a time as long as there is room.
34         ADD     $-7, T5, T6
35         JMP     f_wordscheck
36 f_words:
37         MOV     (T1), T3
38         MOV     T3, (T0)
39         ADD     $8, T0
40         ADD     $8, T1
41 f_wordscheck:
42         SLTU    T6, T1, T3
43         BNE     T3, ZERO, f_words
44
45         // Finish off the remaining partial word.
46         JMP     f_outcheck
47 f_out:
48         MOVB    (T1), T3
49         MOVB    T3, (T0)
50         ADD     $1, T0
51         ADD     $1, T1
52 f_outcheck:
53         BNE     T1, T5, f_out
54
55         RET
56
57 b:
58         ADD     T0, T2, T4
59         // If less than eight bytes, do one byte at a time.
60         SLTU    $8, T2, T3
61         BNE     T3, ZERO, b_outcheck
62
63         // Do one byte at a time until from+n is eight-aligned.
64         JMP     b_aligncheck
65 b_align:
66         ADD     $-1, T4
67         ADD     $-1, T5
68         MOVB    (T5), T3
69         MOVB    T3, (T4)
70 b_aligncheck:
71         AND     $7, T5, T3
72         BNE     T3, ZERO, b_align
73
74         // Do eight bytes at a time as long as there is room.
75         ADD     $7, T1, T6
76         JMP     b_wordscheck
77 b_words:
78         ADD     $-8, T4
79         ADD     $-8, T5
80         MOV     (T5), T3
81         MOV     T3, (T4)
82 b_wordscheck:
83         SLTU    T5, T6, T3
84         BNE     T3, ZERO, b_words
85
86         // Finish off the remaining partial word.
87         JMP     b_outcheck
88 b_out:
89         ADD     $-1, T4
90         ADD     $-1, T5
91         MOVB    (T5), T3
92         MOVB    T3, (T4)
93 b_outcheck:
94         BNE     T5, T1, b_out
95
96         RET