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
9 TEXT 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
17 TEXT 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
30 TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0
31 CMPBEQ R3, R5, equal
32 loop:
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
43 tail:
44 SUB $1, R6, R8
45 EXRL $memeqbodyclc<>(SB), R8
46 BEQ equal
47 notequal:
48 MOVB $0, 0(R7)
49 RET
50 equal:
51 MOVB $1, 0(R7)
52 RET
53 tiny:
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
64 lt16:
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
71 lt8:
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
78 lt4:
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
90 TEXT memeqbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0
91 CLC $1, 0(R3), 0(R5)
92 RET
93
View as plain text