Text file src/pkg/internal/bytealg/compare_arm64.s
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 TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
9 MOVD a_base+0(FP), R2
10 MOVD a_len+8(FP), R0
11 MOVD b_base+24(FP), R3
12 MOVD b_len+32(FP), R1
13 MOVD $ret+48(FP), R7
14 B cmpbody<>(SB)
15
16 TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40
17 MOVD a_base+0(FP), R2
18 MOVD a_len+8(FP), R0
19 MOVD b_base+16(FP), R3
20 MOVD b_len+24(FP), R1
21 MOVD $ret+32(FP), R7
22 B cmpbody<>(SB)
23
24 // On entry:
25 // R0 is the length of a
26 // R1 is the length of b
27 // R2 points to the start of a
28 // R3 points to the start of b
29 // R7 points to return value (-1/0/1 will be written here)
30 //
31 // On exit:
32 // R4, R5, R6, R8, R9 and R10 are clobbered
33 TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0
34 CMP R2, R3
35 BEQ samebytes // same starting pointers; compare lengths
36 CMP R0, R1
37 CSEL LT, R1, R0, R6 // R6 is min(R0, R1)
38
39 CMP $0, R6
40 BEQ samebytes
41 BIC $0xf, R6, R10
42 CBZ R10, small // length < 16
43 ADD R2, R10 // end of chunk16
44 // length >= 16
45 chunk16_loop:
46 LDP.P 16(R2), (R4, R8)
47 LDP.P 16(R3), (R5, R9)
48 CMP R4, R5
49 BNE cmp
50 CMP R8, R9
51 BNE cmpnext
52 CMP R10, R2
53 BNE chunk16_loop
54 AND $0xf, R6, R6
55 CBZ R6, samebytes
56 SUBS $8, R6
57 BLT tail
58 // the length of tail > 8 bytes
59 MOVD.P 8(R2), R4
60 MOVD.P 8(R3), R5
61 CMP R4, R5
62 BNE cmp
63 SUB $8, R6
64 // compare last 8 bytes
65 tail:
66 MOVD (R2)(R6), R4
67 MOVD (R3)(R6), R5
68 CMP R4, R5
69 BEQ samebytes
70 cmp:
71 REV R4, R4
72 REV R5, R5
73 CMP R4, R5
74 ret:
75 MOVD $1, R4
76 CNEG HI, R4, R4
77 MOVD R4, (R7)
78 RET
79 small:
80 TBZ $3, R6, lt_8
81 MOVD (R2), R4
82 MOVD (R3), R5
83 CMP R4, R5
84 BNE cmp
85 SUBS $8, R6
86 BEQ samebytes
87 ADD $8, R2
88 ADD $8, R3
89 SUB $8, R6
90 B tail
91 lt_8:
92 TBZ $2, R6, lt_4
93 MOVWU (R2), R4
94 MOVWU (R3), R5
95 CMPW R4, R5
96 BNE cmp
97 SUBS $4, R6
98 BEQ samebytes
99 ADD $4, R2
100 ADD $4, R3
101 lt_4:
102 TBZ $1, R6, lt_2
103 MOVHU (R2), R4
104 MOVHU (R3), R5
105 CMPW R4, R5
106 BNE cmp
107 ADD $2, R2
108 ADD $2, R3
109 lt_2:
110 TBZ $0, R6, samebytes
111 one:
112 MOVBU (R2), R4
113 MOVBU (R3), R5
114 CMPW R4, R5
115 BNE ret
116 samebytes:
117 CMP R1, R0
118 CSET NE, R4
119 CNEG LO, R4, R4
120 MOVD R4, (R7)
121 RET
122 cmpnext:
123 REV R8, R4
124 REV R9, R5
125 CMP R4, R5
126 B ret
View as plain text