blob: 64f537be99e5a86ceb8b1f5acb3dd1f128e88c91 [file] [log] [blame]
// 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<ABIInternal>(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<ABIInternal>(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