github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/internal/bytealg/equal_mips64x.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 mips64 || mips64le 6 7 #include "go_asm.h" 8 #include "textflag.h" 9 10 #define REGCTXT R22 11 12 // memequal(a, b unsafe.Pointer, size uintptr) bool 13 TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 14 MOVV a+0(FP), R1 15 MOVV b+8(FP), R2 16 BEQ R1, R2, eq 17 MOVV size+16(FP), R3 18 ADDV R1, R3, R4 19 20 // chunk size is 16 21 SGTU $16, R3, R8 22 BEQ R0, R8, chunk_entry 23 24 byte_loop: 25 BNE R1, R4, byte_test 26 MOVV $1, R1 27 MOVB R1, ret+24(FP) 28 RET 29 byte_test: 30 MOVBU (R1), R6 31 ADDV $1, R1 32 MOVBU (R2), R7 33 ADDV $1, R2 34 BEQ R6, R7, byte_loop 35 JMP not_eq 36 37 chunk_entry: 38 // make sure both a and b are aligned 39 OR R1, R2, R9 40 AND $0x7, R9 41 BNE R0, R9, byte_loop 42 JMP chunk_loop_1 43 44 chunk_loop: 45 // chunk size is 16 46 SGTU $16, R3, R8 47 BNE R0, R8, chunk_tail_8 48 chunk_loop_1: 49 MOVV (R1), R6 50 MOVV (R2), R7 51 BNE R6, R7, not_eq 52 MOVV 8(R1), R12 53 MOVV 8(R2), R13 54 ADDV $16, R1 55 ADDV $16, R2 56 SUBV $16, R3 57 BEQ R12, R13, chunk_loop 58 JMP not_eq 59 60 chunk_tail_8: 61 AND $8, R3, R14 62 BEQ R0, R14, chunk_tail_4 63 MOVV (R1), R6 64 MOVV (R2), R7 65 BNE R6, R7, not_eq 66 ADDV $8, R1 67 ADDV $8, R2 68 69 chunk_tail_4: 70 AND $4, R3, R14 71 BEQ R0, R14, chunk_tail_2 72 MOVWU (R1), R6 73 MOVWU (R2), R7 74 BNE R6, R7, not_eq 75 ADDV $4, R1 76 ADDV $4, R2 77 78 chunk_tail_2: 79 AND $2, R3, R14 80 BEQ R0, R14, chunk_tail_1 81 MOVHU (R1), R6 82 MOVHU (R2), R7 83 BNE R6, R7, not_eq 84 ADDV $2, R1 85 ADDV $2, R2 86 87 chunk_tail_1: 88 AND $1, R3, R14 89 BEQ R0, R14, eq 90 MOVBU (R1), R6 91 MOVBU (R2), R7 92 BEQ R6, R7, eq 93 94 not_eq: 95 MOVB R0, ret+24(FP) 96 RET 97 eq: 98 MOVV $1, R1 99 MOVB R1, ret+24(FP) 100 RET 101 102 // memequal_varlen(a, b unsafe.Pointer) bool 103 TEXT runtime·memequal_varlen(SB),NOSPLIT,$40-17 104 MOVV a+0(FP), R1 105 MOVV b+8(FP), R2 106 BEQ R1, R2, eq 107 MOVV 8(REGCTXT), R3 // compiler stores size at offset 8 in the closure 108 MOVV R1, 8(R29) 109 MOVV R2, 16(R29) 110 MOVV R3, 24(R29) 111 JAL runtime·memequal(SB) 112 MOVBU 32(R29), R1 113 MOVB R1, ret+16(FP) 114 RET 115 eq: 116 MOVV $1, R1 117 MOVB R1, ret+16(FP) 118 RET