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, $0-56
9 Get SP
10 I64Load a_base+0(FP)
11 I64Load a_len+8(FP)
12 I64Load b_base+24(FP)
13 I64Load b_len+32(FP)
14 Call cmpbody<>(SB)
15 I64Store ret+48(FP)
16 RET
17
18 TEXT runtime·cmpstring(SB), NOSPLIT, $0-40
19 Get SP
20 I64Load a_base+0(FP)
21 I64Load a_len+8(FP)
22 I64Load b_base+16(FP)
23 I64Load b_len+24(FP)
24 Call cmpbody<>(SB)
25 I64Store ret+32(FP)
26 RET
27
28 // params: a, alen, b, blen
29 // ret: -1/0/1
30 TEXT cmpbody<>(SB), NOSPLIT, $0-0
31 // len = min(alen, blen)
32 Get R1
33 Get R3
34 Get R1
35 Get R3
36 I64LtU
37 Select
38 Set R4
39
40 Get R0
41 I32WrapI64
42 Get R2
43 I32WrapI64
44 Get R4
45 I32WrapI64
46 Call memcmp<>(SB)
47 I64ExtendI32S
48 Tee R5
49
50 I64Eqz
51 If
52 // check length
53 Get R1
54 Get R3
55 I64Sub
56 Set R5
57 End
58
59 I64Const $0
60 I64Const $-1
61 I64Const $1
62 Get R5
63 I64Const $0
64 I64LtS
65 Select
66 Get R5
67 I64Eqz
68 Select
69 Return
70
71 // compiled with emscripten
72 // params: a, b, len
73 // ret: <0/0/>0
74 TEXT memcmp<>(SB), NOSPLIT, $0-0
75 Get R2
76 If $1
77 Loop
78 Get R0
79 I32Load8S $0
80 Tee R3
81 Get R1
82 I32Load8S $0
83 Tee R4
84 I32Eq
85 If
86 Get R0
87 I32Const $1
88 I32Add
89 Set R0
90 Get R1
91 I32Const $1
92 I32Add
93 Set R1
94 I32Const $0
95 Get R2
96 I32Const $-1
97 I32Add
98 Tee R2
99 I32Eqz
100 BrIf $3
101 Drop
102 Br $1
103 End
104 End
105 Get R3
106 I32Const $255
107 I32And
108 Get R4
109 I32Const $255
110 I32And
111 I32Sub
112 Else
113 I32Const $0
114 End
115 Return
116
View as plain text