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
8TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
9	MOVD	a_base+0(FP), R3
10	MOVD	a_len+8(FP), R4
11	MOVD	b_base+24(FP), R5
12	MOVD	b_len+32(FP), R6
13	LA	ret+48(FP), R7
14	BR	cmpbody<>(SB)
15
16TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40
17	MOVD	a_base+0(FP), R3
18	MOVD	a_len+8(FP), R4
19	MOVD	b_base+16(FP), R5
20	MOVD	b_len+24(FP), R6
21	LA	ret+32(FP), R7
22	BR	cmpbody<>(SB)
23
24// input:
25//   R3 = a
26//   R4 = alen
27//   R5 = b
28//   R6 = blen
29//   R7 = address of output word (stores -1/0/1 here)
30TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0
31	CMPBEQ	R3, R5, cmplengths
32	MOVD	R4, R8
33	CMPBLE	R4, R6, amin
34	MOVD	R6, R8
35amin:
36	CMPBEQ	R8, $0, cmplengths
37	CMP	R8, $256
38	BLE	tail
39loop:
40	CLC	$256, 0(R3), 0(R5)
41	BGT	gt
42	BLT	lt
43	SUB	$256, R8
44	MOVD	$256(R3), R3
45	MOVD	$256(R5), R5
46	CMP	R8, $256
47	BGT	loop
48tail:
49	SUB	$1, R8
50	EXRL	$cmpbodyclc<>(SB), R8
51	BGT	gt
52	BLT	lt
53cmplengths:
54	CMP	R4, R6
55	BEQ	eq
56	BLT	lt
57gt:
58	MOVD	$1, 0(R7)
59	RET
60lt:
61	MOVD	$-1, 0(R7)
62	RET
63eq:
64	MOVD	$0, 0(R7)
65	RET
66
67TEXT cmpbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0
68	CLC	$1, 0(R3), 0(R5)
69	RET
70