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