Newer
Older
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "go_asm.h"
#include "textflag.h"
TEXT ·Compare(SB), NOSPLIT, $0-56
Get SP
I64Load a_base+0(FP)
I64Load a_len+8(FP)
I64Load b_base+24(FP)
I64Load b_len+32(FP)
Call cmpbody<>(SB)
I64Store ret+48(FP)
RET
TEXT runtime·cmpstring(SB), NOSPLIT, $0-40
Get SP
I64Load a_base+0(FP)
I64Load a_len+8(FP)
I64Load b_base+16(FP)
I64Load b_len+24(FP)
Call cmpbody<>(SB)
I64Store ret+32(FP)
RET
// params: a, alen, b, blen
// ret: -1/0/1
TEXT cmpbody<>(SB), NOSPLIT, $0-0
// len = min(alen, blen)
Get R1
Get R3
Get R1
Get R3
I64LtU
Select
Set R4
Get R0
I32WrapI64
Get R2
I32WrapI64
Get R4
I32WrapI64
Call memcmp<>(SB)
I64ExtendI32S
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
I64Eqz
If
// check length
Get R1
Get R3
I64Sub
Set R5
End
I64Const $0
I64Const $-1
I64Const $1
Get R5
I64Const $0
I64LtS
Select
Get R5
I64Eqz
Select
Return
// compiled with emscripten
// params: a, b, len
// ret: <0/0/>0
TEXT memcmp<>(SB), NOSPLIT, $0-0
Get R2
If $1
Loop
Get R0
I32Load8S $0
Tee R3
Get R1
I32Load8S $0
Tee R4
I32Eq
If
Get R0
I32Const $1
I32Add
Set R0
Get R1
I32Const $1
I32Add
Set R1
I32Const $0
Get R2
I32Const $-1
I32Add
Tee R2
I32Eqz
BrIf $3
Drop
Br $1
End
End
Get R3
I32Const $255
I32And
Get R4
I32Const $255
I32And
I32Sub
Else
I32Const $0
End
Return