mirror of https://github.com/golang/go.git
88 lines
1.7 KiB
ArmAsm
88 lines
1.7 KiB
ArmAsm
// Copyright 2022 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
|
|
MOVV a_base+0(FP), R6
|
|
MOVV b_base+24(FP), R7
|
|
MOVV a_len+8(FP), R4
|
|
MOVV b_len+32(FP), R5
|
|
MOVV $ret+48(FP), R13
|
|
JMP cmpbody<>(SB)
|
|
|
|
TEXT runtime·cmpstring(SB),NOSPLIT,$0-40
|
|
MOVV a_base+0(FP), R6
|
|
MOVV b_base+16(FP), R7
|
|
MOVV a_len+8(FP), R4
|
|
MOVV b_len+24(FP), R5
|
|
MOVV $ret+32(FP), R13
|
|
JMP cmpbody<>(SB)
|
|
|
|
// On entry:
|
|
// R4 length of a
|
|
// R5 length of b
|
|
// R6 points to the start of a
|
|
// R7 points to the start of b
|
|
// R13 points to the return value (-1/0/1)
|
|
TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0
|
|
BEQ R6, R7, samebytes // same start of a and b
|
|
|
|
SGTU R4, R5, R9
|
|
BNE R0, R9, r2_lt_r1
|
|
MOVV R4, R14
|
|
JMP entry
|
|
r2_lt_r1:
|
|
MOVV R5, R14 // R14 is min(R4, R5)
|
|
entry:
|
|
ADDV R6, R14, R12 // R6 start of a, R14 end of a
|
|
BEQ R6, R12, samebytes // length is 0
|
|
|
|
SRLV $4, R14 // R14 is number of chunks
|
|
BEQ R0, R14, byte_loop
|
|
|
|
// make sure both a and b are aligned.
|
|
OR R6, R7, R15
|
|
AND $7, R15
|
|
BNE R0, R15, byte_loop
|
|
|
|
PCALIGN $16
|
|
chunk16_loop:
|
|
BEQ R0, R14, byte_loop
|
|
MOVV (R6), R8
|
|
MOVV (R7), R9
|
|
BNE R8, R9, byte_loop
|
|
MOVV 8(R6), R16
|
|
MOVV 8(R7), R17
|
|
ADDV $16, R6
|
|
ADDV $16, R7
|
|
SUBVU $1, R14
|
|
BEQ R16, R17, chunk16_loop
|
|
SUBV $8, R6
|
|
SUBV $8, R7
|
|
|
|
byte_loop:
|
|
BEQ R6, R12, samebytes
|
|
MOVBU (R6), R8
|
|
ADDVU $1, R6
|
|
MOVBU (R7), R9
|
|
ADDVU $1, R7
|
|
BEQ R8, R9, byte_loop
|
|
|
|
byte_cmp:
|
|
SGTU R8, R9, R12 // R12 = 1 if (R8 > R9)
|
|
BNE R0, R12, ret
|
|
MOVV $-1, R12
|
|
JMP ret
|
|
|
|
samebytes:
|
|
SGTU R4, R5, R8
|
|
SGTU R5, R4, R9
|
|
SUBV R9, R8, R12
|
|
|
|
ret:
|
|
MOVV R12, (R13)
|
|
RET
|