]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/memmove_riscv64.s
runtime: port memmove, memclr to register ABI on 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 // See memmove Go doc for important implementation constraints.
8
9 // void runtime·memmove(void*, void*, uintptr)
10 TEXT runtime·memmove<ABIInternal>(SB),NOSPLIT,$-0-24
11 #ifndef GOEXPERIMENT_regabiargs
12         MOV     to+0(FP), A0
13         MOV     from+8(FP), A1
14         MOV     n+16(FP), A2
15 #endif
16         ADD     A1, A2, T5
17
18         // If the destination is ahead of the source, start at the end of the
19         // buffer and go backward.
20         BLTU    A1, A0, b
21
22         // If less than eight bytes, do one byte at a time.
23         SLTU    $8, A2, T3
24         BNE     T3, ZERO, f_outcheck
25
26         // Do one byte at a time until from is eight-aligned.
27         JMP     f_aligncheck
28 f_align:
29         MOVB    (A1), T3
30         MOVB    T3, (A0)
31         ADD     $1, A0
32         ADD     $1, A1
33 f_aligncheck:
34         AND     $7, A1, T3
35         BNE     T3, ZERO, f_align
36
37         // Do eight bytes at a time as long as there is room.
38         ADD     $-7, T5, T6
39         JMP     f_wordscheck
40 f_words:
41         MOV     (A1), T3
42         MOV     T3, (A0)
43         ADD     $8, A0
44         ADD     $8, A1
45 f_wordscheck:
46         SLTU    T6, A1, T3
47         BNE     T3, ZERO, f_words
48
49         // Finish off the remaining partial word.
50         JMP     f_outcheck
51 f_out:
52         MOVB    (A1), T3
53         MOVB    T3, (A0)
54         ADD     $1, A0
55         ADD     $1, A1
56 f_outcheck:
57         BNE     A1, T5, f_out
58
59         RET
60
61 b:
62         ADD     A0, A2, T4
63         // If less than eight bytes, do one byte at a time.
64         SLTU    $8, A2, T3
65         BNE     T3, ZERO, b_outcheck
66
67         // Do one byte at a time until from+n is eight-aligned.
68         JMP     b_aligncheck
69 b_align:
70         ADD     $-1, T4
71         ADD     $-1, T5
72         MOVB    (T5), T3
73         MOVB    T3, (T4)
74 b_aligncheck:
75         AND     $7, T5, T3
76         BNE     T3, ZERO, b_align
77
78         // Do eight bytes at a time as long as there is room.
79         ADD     $7, A1, T6
80         JMP     b_wordscheck
81 b_words:
82         ADD     $-8, T4
83         ADD     $-8, T5
84         MOV     (T5), T3
85         MOV     T3, (T4)
86 b_wordscheck:
87         SLTU    T5, T6, T3
88         BNE     T3, ZERO, b_words
89
90         // Finish off the remaining partial word.
91         JMP     b_outcheck
92 b_out:
93         ADD     $-1, T4
94         ADD     $-1, T5
95         MOVB    (T5), T3
96         MOVB    T3, (T4)
97 b_outcheck:
98         BNE     T5, A1, b_out
99
100         RET