1// Copyright 2018 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// memequal(a, b unsafe.Pointer, size uintptr) bool
9TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25
10	MOVD	a+0(FP), R3
11	MOVD	b+8(FP), R5
12	MOVD	size+16(FP), R6
13	LA	ret+24(FP), R7
14	BR	memeqbody<>(SB)
15
16// memequal_varlen(a, b unsafe.Pointer) bool
17TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17
18	MOVD	a+0(FP), R3
19	MOVD	b+8(FP), R5
20	MOVD	8(R12), R6    // compiler stores size at offset 8 in the closure
21	LA	ret+16(FP), R7
22	BR	memeqbody<>(SB)
23
24// input:
25//   R3 = a
26//   R5 = b
27//   R6 = len
28//   R7 = address of output byte (stores 0 or 1 here)
29//   a and b have the same length
30TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0
31	CMPBEQ	R3, R5, equal
32loop:
33	CMPBEQ	R6, $0, equal
34	CMPBLT	R6, $32, tiny
35	CMP	R6, $256
36	BLT	tail
37	CLC	$256, 0(R3), 0(R5)
38	BNE	notequal
39	SUB	$256, R6
40	LA	256(R3), R3
41	LA	256(R5), R5
42	BR	loop
43tail:
44	SUB	$1, R6, R8
45	EXRL	$memeqbodyclc<>(SB), R8
46	BEQ	equal
47notequal:
48	MOVB	$0, 0(R7)
49	RET
50equal:
51	MOVB	$1, 0(R7)
52	RET
53tiny:
54	MOVD	$0, R2
55	CMPBLT	R6, $16, lt16
56	MOVD	0(R3), R8
57	MOVD	0(R5), R9
58	CMPBNE	R8, R9, notequal
59	MOVD	8(R3), R8
60	MOVD	8(R5), R9
61	CMPBNE	R8, R9, notequal
62	LA	16(R2), R2
63	SUB	$16, R6
64lt16:
65	CMPBLT	R6, $8, lt8
66	MOVD	0(R3)(R2*1), R8
67	MOVD	0(R5)(R2*1), R9
68	CMPBNE	R8, R9, notequal
69	LA	8(R2), R2
70	SUB	$8, R6
71lt8:
72	CMPBLT	R6, $4, lt4
73	MOVWZ	0(R3)(R2*1), R8
74	MOVWZ	0(R5)(R2*1), R9
75	CMPBNE	R8, R9, notequal
76	LA	4(R2), R2
77	SUB	$4, R6
78lt4:
79#define CHECK(n) \
80	CMPBEQ	R6, $n, equal \
81	MOVB	n(R3)(R2*1), R8 \
82	MOVB	n(R5)(R2*1), R9 \
83	CMPBNE	R8, R9, notequal
84	CHECK(0)
85	CHECK(1)
86	CHECK(2)
87	CHECK(3)
88	BR	equal
89
90TEXT memeqbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0
91	CLC	$1, 0(R3), 0(R5)
92	RET
93