github.com/sandwichdev/go-internals@v0.0.0-20210605002614-12311ac6b2c5/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 // +build mips mipsle 6 7 #include "go_asm.h" 8 #include "textflag.h" 9 10 TEXT ·Compare(SB),NOSPLIT,$0-28 11 MOVW a_base+0(FP), R3 12 MOVW b_base+12(FP), R4 13 MOVW a_len+4(FP), R1 14 MOVW b_len+16(FP), R2 15 BEQ R3, R4, samebytes 16 SGTU R1, R2, R7 17 MOVW R1, R8 18 CMOVN R7, R2, R8 // R8 is min(R1, R2) 19 20 ADDU R3, R8 // R3 is current byte in a, R8 is last byte in a to compare 21 loop: 22 BEQ R3, R8, samebytes 23 24 MOVBU (R3), R6 25 ADDU $1, R3 26 MOVBU (R4), R7 27 ADDU $1, R4 28 BEQ R6, R7 , loop 29 30 SGTU R6, R7, R8 31 MOVW $-1, R6 32 CMOVZ R8, R6, R8 33 JMP cmp_ret 34 samebytes: 35 SGTU R1, R2, R6 36 SGTU R2, R1, R7 37 SUBU R7, R6, R8 38 cmp_ret: 39 MOVW R8, ret+24(FP) 40 RET 41 42 TEXT runtime·cmpstring(SB),NOSPLIT,$0-20 43 MOVW a_base+0(FP), R3 44 MOVW a_len+4(FP), R1 45 MOVW b_base+8(FP), R4 46 MOVW b_len+12(FP), R2 47 BEQ R3, R4, samebytes 48 SGTU R1, R2, R7 49 MOVW R1, R8 50 CMOVN R7, R2, R8 // R8 is min(R1, R2) 51 52 ADDU R3, R8 // R3 is current byte in a, R8 is last byte in a to compare 53 loop: 54 BEQ R3, R8, samebytes // all compared bytes were the same; compare lengths 55 56 MOVBU (R3), R6 57 ADDU $1, R3 58 MOVBU (R4), R7 59 ADDU $1, R4 60 BEQ R6, R7 , loop 61 // bytes differed 62 SGTU R6, R7, R8 63 MOVW $-1, R6 64 CMOVZ R8, R6, R8 65 JMP cmp_ret 66 samebytes: 67 SGTU R1, R2, R6 68 SGTU R2, R1, R7 69 SUBU R7, R6, R8 70 cmp_ret: 71 MOVW R8, ret+16(FP) 72 RET