// 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" // memequal(a, b unsafe.Pointer, size uintptr) bool TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 MOVD a+0(FP), R3 MOVD b+8(FP), R5 MOVD size+16(FP), R6 LA ret+24(FP), R7 BR memeqbody<>(SB) // memequal_varlen(a, b unsafe.Pointer) bool TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17 MOVD a+0(FP), R3 MOVD b+8(FP), R5 MOVD 8(R12), R6 // compiler stores size at offset 8 in the closure LA ret+16(FP), R7 BR memeqbody<>(SB) // input: // R3 = a // R5 = b // R6 = len // R7 = address of output byte (stores 0 or 1 here) // a and b have the same length TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMPBEQ R3, R5, equal loop: CMPBEQ R6, $0, equal CMPBLT R6, $32, tiny CMP R6, $256 BLT tail CLC $256, 0(R3), 0(R5) BNE notequal SUB $256, R6 LA 256(R3), R3 LA 256(R5), R5 BR loop tail: SUB $1, R6, R8 EXRL $memeqbodyclc<>(SB), R8 BEQ equal notequal: MOVB $0, 0(R7) RET equal: MOVB $1, 0(R7) RET tiny: MOVD $0, R2 CMPBLT R6, $16, lt16 MOVD 0(R3), R8 MOVD 0(R5), R9 CMPBNE R8, R9, notequal MOVD 8(R3), R8 MOVD 8(R5), R9 CMPBNE R8, R9, notequal LA 16(R2), R2 SUB $16, R6 lt16: CMPBLT R6, $8, lt8 MOVD 0(R3)(R2*1), R8 MOVD 0(R5)(R2*1), R9 CMPBNE R8, R9, notequal LA 8(R2), R2 SUB $8, R6 lt8: CMPBLT R6, $4, lt4 MOVWZ 0(R3)(R2*1), R8 MOVWZ 0(R5)(R2*1), R9 CMPBNE R8, R9, notequal LA 4(R2), R2 SUB $4, R6 lt4: #define CHECK(n) \ CMPBEQ R6, $n, equal \ MOVB n(R3)(R2*1), R8 \ MOVB n(R5)(R2*1), R9 \ CMPBNE R8, R9, notequal CHECK(0) CHECK(1) CHECK(2) CHECK(3) BR equal TEXT memeqbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0 CLC $1, 0(R3), 0(R5) RET