github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/internal/bytealg/compare_arm64.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 #include "go_asm.h" 6 #include "textflag.h" 7 8 TEXT ·Compare<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-56 9 // R0 = a_base (want in R0) 10 // R1 = a_len (want in R1) 11 // R2 = a_cap (unused) 12 // R3 = b_base (want in R2) 13 // R4 = b_len (want in R3) 14 // R5 = b_cap (unused) 15 MOVD R3, R2 16 MOVD R4, R3 17 B cmpbody<>(SB) 18 19 TEXT runtime·cmpstring<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-40 20 // R0 = a_base 21 // R1 = a_len 22 // R2 = b_base 23 // R3 = b_len 24 B cmpbody<>(SB) 25 26 // On entry: 27 // R0 points to the start of a 28 // R1 is the length of a 29 // R2 points to the start of b 30 // R3 is the length of b 31 // 32 // On exit: 33 // R0 is the result 34 // R4, R5, R6, R8, R9 and R10 are clobbered 35 TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 36 CMP R0, R2 37 BEQ samebytes // same starting pointers; compare lengths 38 CMP R1, R3 39 CSEL LT, R3, R1, R6 // R6 is min(R1, R3) 40 41 CBZ R6, samebytes 42 BIC $0xf, R6, R10 43 CBZ R10, small // length < 16 44 ADD R0, R10 // end of chunk16 45 // length >= 16 46 chunk16_loop: 47 LDP.P 16(R0), (R4, R8) 48 LDP.P 16(R2), (R5, R9) 49 CMP R4, R5 50 BNE cmp 51 CMP R8, R9 52 BNE cmpnext 53 CMP R10, R0 54 BNE chunk16_loop 55 AND $0xf, R6, R6 56 CBZ R6, samebytes 57 SUBS $8, R6 58 BLT tail 59 // the length of tail > 8 bytes 60 MOVD.P 8(R0), R4 61 MOVD.P 8(R2), R5 62 CMP R4, R5 63 BNE cmp 64 SUB $8, R6 65 // compare last 8 bytes 66 tail: 67 MOVD (R0)(R6), R4 68 MOVD (R2)(R6), R5 69 CMP R4, R5 70 BEQ samebytes 71 cmp: 72 REV R4, R4 73 REV R5, R5 74 CMP R4, R5 75 ret: 76 MOVD $1, R0 77 CNEG HI, R0, R0 78 RET 79 small: 80 TBZ $3, R6, lt_8 81 MOVD (R0), R4 82 MOVD (R2), R5 83 CMP R4, R5 84 BNE cmp 85 SUBS $8, R6 86 BEQ samebytes 87 ADD $8, R0 88 ADD $8, R2 89 SUB $8, R6 90 B tail 91 lt_8: 92 TBZ $2, R6, lt_4 93 MOVWU (R0), R4 94 MOVWU (R2), R5 95 CMPW R4, R5 96 BNE cmp 97 SUBS $4, R6 98 BEQ samebytes 99 ADD $4, R0 100 ADD $4, R2 101 lt_4: 102 TBZ $1, R6, lt_2 103 MOVHU (R0), R4 104 MOVHU (R2), R5 105 CMPW R4, R5 106 BNE cmp 107 ADD $2, R0 108 ADD $2, R2 109 lt_2: 110 TBZ $0, R6, samebytes 111 one: 112 MOVBU (R0), R4 113 MOVBU (R2), R5 114 CMPW R4, R5 115 BNE ret 116 samebytes: 117 CMP R3, R1 118 CSET NE, R0 119 CNEG LO, R0, R0 120 RET 121 cmpnext: 122 REV R8, R4 123 REV R9, R5 124 CMP R4, R5 125 B ret