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//go:build mips || mipsle
6
7#include "go_asm.h"
8#include "textflag.h"
9
10TEXT ·Compare(SB),NOSPLIT,$0-28
11	MOVW	a_base+0(FP), R3
12	MOVW	b_base+12(FP), R4
13	MOVW	a_len+4(FP), R1
14	MOVW	b_len+16(FP), R2
15	BEQ	R3, R4, samebytes
16	SGTU	R1, R2, R7
17	MOVW	R1, R8
18	CMOVN	R7, R2, R8	// R8 is min(R1, R2)
19
20	ADDU	R3, R8	// R3 is current byte in a, R8 is last byte in a to compare
21loop:
22	BEQ	R3, R8, samebytes
23
24	MOVBU	(R3), R6
25	ADDU	$1, R3
26	MOVBU	(R4), R7
27	ADDU	$1, R4
28	BEQ	R6, R7 , loop
29
30	SGTU	R6, R7, R8
31	MOVW	$-1, R6
32	CMOVZ	R8, R6, R8
33	JMP	cmp_ret
34samebytes:
35	SGTU	R1, R2, R6
36	SGTU	R2, R1, R7
37	SUBU	R7, R6, R8
38cmp_ret:
39	MOVW	R8, ret+24(FP)
40	RET
41
42TEXT runtime·cmpstring(SB),NOSPLIT,$0-20
43	MOVW	a_base+0(FP), R3
44	MOVW	a_len+4(FP), R1
45	MOVW	b_base+8(FP), R4
46	MOVW	b_len+12(FP), R2
47	BEQ	R3, R4, samebytes
48	SGTU	R1, R2, R7
49	MOVW	R1, R8
50	CMOVN	R7, R2, R8	// R8 is min(R1, R2)
51
52	ADDU	R3, R8	// R3 is current byte in a, R8 is last byte in a to compare
53loop:
54	BEQ	R3, R8, samebytes	// all compared bytes were the same; compare lengths
55
56	MOVBU	(R3), R6
57	ADDU	$1, R3
58	MOVBU	(R4), R7
59	ADDU	$1, R4
60	BEQ	R6, R7 , loop
61	// bytes differed
62	SGTU	R6, R7, R8
63	MOVW	$-1, R6
64	CMOVZ	R8, R6, R8
65	JMP	cmp_ret
66samebytes:
67	SGTU	R1, R2, R6
68	SGTU	R2, R1, R7
69	SUBU	R7, R6, R8
70cmp_ret:
71	MOVW	R8, ret+16(FP)
72	RET
73