// 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 #ifndef GOEXPERIMENT_regabiargs MOVD a_base+0(FP), R2 MOVD a_len+8(FP), R3 MOVD b_base+24(FP), R4 MOVD b_len+32(FP), R5 LA ret+48(FP), R6 #else // R2 = a_base // R3 = a_len // R4 = a_cap (unused) // R5 = b_base (want in R4) // R6 = b_len (want in R5) // R7 = b_cap (unused) MOVD R5, R4 MOVD R6, R5 #endif BR cmpbody<>(SB) TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40 #ifndef GOEXPERIMENT_regabiargs MOVD a_base+0(FP), R2 MOVD a_len+8(FP), R3 MOVD b_base+16(FP), R4 MOVD b_len+24(FP), R5 LA ret+32(FP), R6 #endif // R2 = a_base // R3 = a_len // R4 = b_base // R5 = b_len BR cmpbody<>(SB) // input: // R2 = a // R3 = alen // R4 = b // R5 = blen // For regabiargs output value( -1/0/1 ) stored in R2 // For !regabiargs address of output word( stores -1/0/1 ) stored in R6 TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMPBEQ R2, R4, cmplengths MOVD R3, R7 CMPBLE R3, R5, amin MOVD R5, R7 amin: CMPBEQ R7, $0, cmplengths CMP R7, $256 BLE tail loop: CLC $256, 0(R2), 0(R4) BGT gt BLT lt SUB $256, R7 MOVD $256(R2), R2 MOVD $256(R4), R4 CMP R7, $256 BGT loop tail: SUB $1, R7 EXRL $cmpbodyclc<>(SB), R7 BGT gt BLT lt cmplengths: CMP R3, R5 BEQ eq BLT lt gt: MOVD $1, R2 #ifndef GOEXPERIMENT_regabiargs MOVD R2, 0(R6) #endif RET lt: MOVD $-1, R2 #ifndef GOEXPERIMENT_regabiargs MOVD R2, 0(R6) #endif RET eq: MOVD $0, R2 #ifndef GOEXPERIMENT_regabiargs MOVD R2, 0(R6) #endif RET TEXT cmpbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0 CLC $1, 0(R2), 0(R4) RET