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