...
Text file src/pkg/internal/bytealg/compare_wasm.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, $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 Set R5
49
50 Get R5
51 I64Eqz
52 If
53 // check length
54 Get R1
55 Get R3
56 I64Sub
57 Set R5
58 End
59
60 I64Const $0
61 I64Const $-1
62 I64Const $1
63 Get R5
64 I64Const $0
65 I64LtS
66 Select
67 Get R5
68 I64Eqz
69 Select
70 Return
71
72 // compiled with emscripten
73 // params: a, b, len
74 // ret: <0/0/>0
75 TEXT memcmp<>(SB), NOSPLIT, $0-0
76 Get R2
77 If $1
78 Loop
79 Get R0
80 I32Load8S $0
81 Tee R3
82 Get R1
83 I32Load8S $0
84 Tee R4
85 I32Eq
86 If
87 Get R0
88 I32Const $1
89 I32Add
90 Set R0
91 Get R1
92 I32Const $1
93 I32Add
94 Set R1
95 I32Const $0
96 Get R2
97 I32Const $-1
98 I32Add
99 Tee R2
100 I32Eqz
101 BrIf $3
102 Drop
103 Br $1
104 End
105 End
106 Get R3
107 I32Const $255
108 I32And
109 Get R4
110 I32Const $255
111 I32And
112 I32Sub
113 Else
114 I32Const $0
115 End
116 Return
View as plain text