// Copyright 2018 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|NOFRAME,$0-56 MOVD a_base+0(FP), R2 MOVD a_len+8(FP), R0 MOVD b_base+24(FP), R3 MOVD b_len+32(FP), R1 MOVD $ret+48(FP), R7 B cmpbody<>(SB) TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40 MOVD a_base+0(FP), R2 MOVD a_len+8(FP), R0 MOVD b_base+16(FP), R3 MOVD b_len+24(FP), R1 MOVD $ret+32(FP), R7 B cmpbody<>(SB) // On entry: // R0 is the length of a // R1 is the length of b // R2 points to the start of a // R3 points to the start of b // R7 points to return value (-1/0/1 will be written here) // // On exit: // R4, R5, R6, R8, R9 and R10 are clobbered TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMP R2, R3 BEQ samebytes // same starting pointers; compare lengths CMP R0, R1 CSEL LT, R1, R0, R6 // R6 is min(R0, R1) CMP $0, R6 BEQ samebytes BIC $0xf, R6, R10 CBZ R10, small // length < 16 ADD R2, R10 // end of chunk16 // length >= 16 chunk16_loop: LDP.P 16(R2), (R4, R8) LDP.P 16(R3), (R5, R9) CMP R4, R5 BNE cmp CMP R8, R9 BNE cmpnext CMP R10, R2 BNE chunk16_loop AND $0xf, R6, R6 CBZ R6, samebytes SUBS $8, R6 BLT tail // the length of tail > 8 bytes MOVD.P 8(R2), R4 MOVD.P 8(R3), R5 CMP R4, R5 BNE cmp SUB $8, R6 // compare last 8 bytes tail: MOVD (R2)(R6), R4 MOVD (R3)(R6), R5 CMP R4, R5 BEQ samebytes cmp: REV R4, R4 REV R5, R5 CMP R4, R5 ret: MOVD $1, R4 CNEG HI, R4, R4 MOVD R4, (R7) RET small: TBZ $3, R6, lt_8 MOVD (R2), R4 MOVD (R3), R5 CMP R4, R5 BNE cmp SUBS $8, R6 BEQ samebytes ADD $8, R2 ADD $8, R3 SUB $8, R6 B tail lt_8: TBZ $2, R6, lt_4 MOVWU (R2), R4 MOVWU (R3), R5 CMPW R4, R5 BNE cmp SUBS $4, R6 BEQ samebytes ADD $4, R2 ADD $4, R3 lt_4: TBZ $1, R6, lt_2 MOVHU (R2), R4 MOVHU (R3), R5 CMPW R4, R5 BNE cmp ADD $2, R2 ADD $2, R3 lt_2: TBZ $0, R6, samebytes one: MOVBU (R2), R4 MOVBU (R3), R5 CMPW R4, R5 BNE ret samebytes: CMP R1, R0 CSET NE, R4 CNEG LO, R4, R4 MOVD R4, (R7) RET cmpnext: REV R8, R4 REV R9, R5 CMP R4, R5 B ret