gitee.com/ks-custle/core-gm@v0.0.0-20230922171213-b83bdd97b62c/internal/bytealg/compare_mipsx.s (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build mips || mipsle 6 // +build mips mipsle 7 8 #include "go_asm.h" 9 #include "textflag.h" 10 11 TEXT ·Compare(SB),NOSPLIT,$0-28 12 MOVW a_base+0(FP), R3 13 MOVW b_base+12(FP), R4 14 MOVW a_len+4(FP), R1 15 MOVW b_len+16(FP), R2 16 BEQ R3, R4, samebytes 17 SGTU R1, R2, R7 18 MOVW R1, R8 19 CMOVN R7, R2, R8 // R8 is min(R1, R2) 20 21 ADDU R3, R8 // R3 is current byte in a, R8 is last byte in a to compare 22 loop: 23 BEQ R3, R8, samebytes 24 25 MOVBU (R3), R6 26 ADDU $1, R3 27 MOVBU (R4), R7 28 ADDU $1, R4 29 BEQ R6, R7 , loop 30 31 SGTU R6, R7, R8 32 MOVW $-1, R6 33 CMOVZ R8, R6, R8 34 JMP cmp_ret 35 samebytes: 36 SGTU R1, R2, R6 37 SGTU R2, R1, R7 38 SUBU R7, R6, R8 39 cmp_ret: 40 MOVW R8, ret+24(FP) 41 RET 42 43 TEXT runtime·cmpstring(SB),NOSPLIT,$0-20 44 MOVW a_base+0(FP), R3 45 MOVW a_len+4(FP), R1 46 MOVW b_base+8(FP), R4 47 MOVW b_len+12(FP), R2 48 BEQ R3, R4, samebytes 49 SGTU R1, R2, R7 50 MOVW R1, R8 51 CMOVN R7, R2, R8 // R8 is min(R1, R2) 52 53 ADDU R3, R8 // R3 is current byte in a, R8 is last byte in a to compare 54 loop: 55 BEQ R3, R8, samebytes // all compared bytes were the same; compare lengths 56 57 MOVBU (R3), R6 58 ADDU $1, R3 59 MOVBU (R4), R7 60 ADDU $1, R4 61 BEQ R6, R7 , loop 62 // bytes differed 63 SGTU R6, R7, R8 64 MOVW $-1, R6 65 CMOVZ R8, R6, R8 66 JMP cmp_ret 67 samebytes: 68 SGTU R1, R2, R6 69 SGTU R2, R1, R7 70 SUBU R7, R6, R8 71 cmp_ret: 72 MOVW R8, ret+16(FP) 73 RET