]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/memclr_riscv64.s
runtime: optimise memclrNoHeapPointers on riscv64
[gostls13.git] / src / runtime / memclr_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 memclrNoHeapPointers Go doc for important implementation constraints.
8
9 // void runtime·memclrNoHeapPointers(void*, uintptr)
10 TEXT runtime·memclrNoHeapPointers<ABIInternal>(SB),NOSPLIT,$0-16
11 #ifndef GOEXPERIMENT_regabiargs
12         MOV     ptr+0(FP), X10
13         MOV     n+8(FP), X11
14 #endif
15
16         // If less than 8 bytes, do single byte zeroing.
17         MOV     $8, X9
18         BLT     X11, X9, check4
19
20         // Check alignment
21         AND     $3, X10, X5
22         BEQZ    X5, aligned
23
24         // Zero one byte at a time until we reach 8 byte alignment.
25         SUB     X5, X11, X11
26 align:
27         ADD     $-1, X5
28         MOVB    ZERO, 0(X10)
29         ADD     $1, X10
30         BNEZ    X5, align
31
32 aligned:
33         MOV     $8, X9
34         BLT     X11, X9, check4
35         MOV     $16, X9
36         BLT     X11, X9, zero8
37         MOV     $32, X9
38         BLT     X11, X9, zero16
39         MOV     $64, X9
40         BLT     X11, X9, zero32
41 loop64:
42         MOV     ZERO, 0(X10)
43         MOV     ZERO, 8(X10)
44         MOV     ZERO, 16(X10)
45         MOV     ZERO, 24(X10)
46         MOV     ZERO, 32(X10)
47         MOV     ZERO, 40(X10)
48         MOV     ZERO, 48(X10)
49         MOV     ZERO, 56(X10)
50         ADD     $64, X10
51         ADD     $-64, X11
52         BGE     X11, X9, loop64
53         BEQZ    X11, done
54
55 check32:
56         MOV     $32, X9
57         BLT     X11, X9, check16
58 zero32:
59         MOV     ZERO, 0(X10)
60         MOV     ZERO, 8(X10)
61         MOV     ZERO, 16(X10)
62         MOV     ZERO, 24(X10)
63         ADD     $32, X10
64         ADD     $-32, X11
65         BEQZ    X11, done
66
67 check16:
68         MOV     $16, X9
69         BLT     X11, X9, check8
70 zero16:
71         MOV     ZERO, 0(X10)
72         MOV     ZERO, 8(X10)
73         ADD     $16, X10
74         ADD     $-16, X11
75         BEQZ    X11, done
76
77 check8:
78         MOV     $8, X9
79         BLT     X11, X9, check4
80 zero8:
81         MOV     ZERO, 0(X10)
82         ADD     $8, X10
83         ADD     $-8, X11
84         BEQZ    X11, done
85
86 check4:
87         MOV     $4, X9
88         BLT     X11, X9, loop1
89 zero4:
90         MOVB    ZERO, 0(X10)
91         MOVB    ZERO, 1(X10)
92         MOVB    ZERO, 2(X10)
93         MOVB    ZERO, 3(X10)
94         ADD     $4, X10
95         ADD     $-4, X11
96
97 loop1:
98         BEQZ    X11, done
99         MOVB    ZERO, 0(X10)
100         ADD     $1, X10
101         ADD     $-1, X11
102         JMP     loop1
103
104 done:
105         RET