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