1 // Copyright 2019 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 "go_asm.h"
6 #include "textflag.h"
7
8 #define CTXT S10
9
10 // func memequal_varlen(a, b unsafe.Pointer) bool
11 TEXT runtime·memequal_varlen<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-17
12 // X10 = a_base
13 // X11 = b_base
14 MOV 8(CTXT), X12 // compiler stores size at offset 8 in the closure
15 JMP runtime·memequal<ABIInternal>(SB)
16
17 // func memequal(a, b unsafe.Pointer, size uintptr) bool
18 TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25
19 // X10 = a_base
20 // X11 = b_base
21 // X12 = size
22 BNE X10, X11, length_check
23 MOV $0, X12
24
25 length_check:
26 BEQZ X12, done
27
28 MOV $32, X23
29 BLT X12, X23, loop4_check
30
31 // Check alignment - if alignment differs we have to do one byte at a time.
32 AND $7, X10, X9
33 AND $7, X11, X19
34 BNE X9, X19, loop4_check
35 BEQZ X9, loop32_check
36
37 // Check one byte at a time until we reach 8 byte alignment.
38 SUB X9, X0, X9
39 ADD $8, X9, X9
40 SUB X9, X12, X12
41 align:
42 SUB $1, X9
43 MOVBU 0(X10), X19
44 MOVBU 0(X11), X20
45 BNE X19, X20, done
46 ADD $1, X10
47 ADD $1, X11
48 BNEZ X9, align
49
50 loop32_check:
51 MOV $32, X9
52 BLT X12, X9, loop16_check
53 loop32:
54 MOV 0(X10), X19
55 MOV 0(X11), X20
56 MOV 8(X10), X21
57 MOV 8(X11), X22
58 BNE X19, X20, done
59 BNE X21, X22, done
60 MOV 16(X10), X14
61 MOV 16(X11), X15
62 MOV 24(X10), X16
63 MOV 24(X11), X17
64 BNE X14, X15, done
65 BNE X16, X17, done
66 ADD $32, X10
67 ADD $32, X11
68 SUB $32, X12
69 BGE X12, X9, loop32
70 BEQZ X12, done
71
72 loop16_check:
73 MOV $16, X23
74 BLT X12, X23, loop4_check
75 loop16:
76 MOV 0(X10), X19
77 MOV 0(X11), X20
78 MOV 8(X10), X21
79 MOV 8(X11), X22
80 BNE X19, X20, done
81 BNE X21, X22, done
82 ADD $16, X10
83 ADD $16, X11
84 SUB $16, X12
85 BGE X12, X23, loop16
86 BEQZ X12, done
87
88 loop4_check:
89 MOV $4, X23
90 BLT X12, X23, loop1
91 loop4:
92 MOVBU 0(X10), X19
93 MOVBU 0(X11), X20
94 MOVBU 1(X10), X21
95 MOVBU 1(X11), X22
96 BNE X19, X20, done
97 BNE X21, X22, done
98 MOVBU 2(X10), X14
99 MOVBU 2(X11), X15
100 MOVBU 3(X10), X16
101 MOVBU 3(X11), X17
102 BNE X14, X15, done
103 BNE X16, X17, done
104 ADD $4, X10
105 ADD $4, X11
106 SUB $4, X12
107 BGE X12, X23, loop4
108
109 loop1:
110 BEQZ X12, done
111 MOVBU 0(X10), X19
112 MOVBU 0(X11), X20
113 BNE X19, X20, done
114 ADD $1, X10
115 ADD $1, X11
116 SUB $1, X12
117 JMP loop1
118
119 done:
120 // If X12 is zero then memory is equivalent.
121 SEQZ X12, X10
122 RET
123
View as plain text