mirror of https://go.googlesource.com/go
89 lines
1.7 KiB
ArmAsm
89 lines
1.7 KiB
ArmAsm
// Copyright 2019 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.
|
|
|
|
//go:build mips64 || mips64le
|
|
|
|
#include "go_asm.h"
|
|
#include "textflag.h"
|
|
|
|
TEXT ·Compare(SB),NOSPLIT,$0-56
|
|
MOVV a_base+0(FP), R3
|
|
MOVV b_base+24(FP), R4
|
|
MOVV a_len+8(FP), R1
|
|
MOVV b_len+32(FP), R2
|
|
MOVV $ret+48(FP), R9
|
|
JMP cmpbody<>(SB)
|
|
|
|
TEXT runtime·cmpstring(SB),NOSPLIT,$0-40
|
|
MOVV a_base+0(FP), R3
|
|
MOVV b_base+16(FP), R4
|
|
MOVV a_len+8(FP), R1
|
|
MOVV b_len+24(FP), R2
|
|
MOVV $ret+32(FP), R9
|
|
JMP cmpbody<>(SB)
|
|
|
|
// On entry:
|
|
// R1 length of a
|
|
// R2 length of b
|
|
// R3 points to the start of a
|
|
// R4 points to the start of b
|
|
// R9 points to the return value (-1/0/1)
|
|
TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0
|
|
BEQ R3, R4, samebytes // same start of a and b
|
|
|
|
SGTU R1, R2, R7
|
|
BNE R0, R7, r2_lt_r1
|
|
MOVV R1, R10
|
|
JMP entry
|
|
r2_lt_r1:
|
|
MOVV R2, R10 // R10 is min(R1, R2)
|
|
entry:
|
|
ADDV R3, R10, R8 // R3 start of a, R8 end of a
|
|
BEQ R3, R8, samebytes // length is 0
|
|
|
|
SRLV $4, R10 // R10 is number of chunks
|
|
BEQ R0, R10, byte_loop
|
|
|
|
// make sure both a and b are aligned.
|
|
OR R3, R4, R11
|
|
AND $7, R11
|
|
BNE R0, R11, byte_loop
|
|
|
|
chunk16_loop:
|
|
BEQ R0, R10, byte_loop
|
|
MOVV (R3), R6
|
|
MOVV (R4), R7
|
|
BNE R6, R7, byte_loop
|
|
MOVV 8(R3), R13
|
|
MOVV 8(R4), R14
|
|
ADDV $16, R3
|
|
ADDV $16, R4
|
|
SUBVU $1, R10
|
|
BEQ R13, R14, chunk16_loop
|
|
SUBV $8, R3
|
|
SUBV $8, R4
|
|
|
|
byte_loop:
|
|
BEQ R3, R8, samebytes
|
|
MOVBU (R3), R6
|
|
ADDVU $1, R3
|
|
MOVBU (R4), R7
|
|
ADDVU $1, R4
|
|
BEQ R6, R7, byte_loop
|
|
|
|
byte_cmp:
|
|
SGTU R6, R7, R8 // R8 = 1 if (R6 > R7)
|
|
BNE R0, R8, ret
|
|
MOVV $-1, R8
|
|
JMP ret
|
|
|
|
samebytes:
|
|
SGTU R1, R2, R6
|
|
SGTU R2, R1, R7
|
|
SUBV R7, R6, R8
|
|
|
|
ret:
|
|
MOVV R8, (R9)
|
|
RET
|