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
10 TEXT ·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
21 loop:
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
34 samebytes:
35 SGTU R1, R2, R6
36 SGTU R2, R1, R7
37 SUBU R7, R6, R8
38 cmp_ret:
39 MOVW R8, ret+24(FP)
40 RET
41
42 TEXT 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
53 loop:
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
66 samebytes:
67 SGTU R1, R2, R6
68 SGTU R2, R1, R7
69 SUBU R7, R6, R8
70 cmp_ret:
71 MOVW R8, ret+16(FP)
72 RET
73
View as plain text