github.com/SandwichDev/go-internals@v0.0.0-20210605002614-12311ac6b2c5/bytealg/equal_s390x.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  // memequal(a, b unsafe.Pointer, size uintptr) bool
     9  TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25
    10  	MOVD	a+0(FP), R3
    11  	MOVD	b+8(FP), R5
    12  	MOVD	size+16(FP), R6
    13  	LA	ret+24(FP), R7
    14  	BR	memeqbody<>(SB)
    15  
    16  // memequal_varlen(a, b unsafe.Pointer) bool
    17  TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17
    18  	MOVD	a+0(FP), R3
    19  	MOVD	b+8(FP), R5
    20  	MOVD	8(R12), R6    // compiler stores size at offset 8 in the closure
    21  	LA	ret+16(FP), R7
    22  	BR	memeqbody<>(SB)
    23  
    24  // input:
    25  //   R3 = a
    26  //   R5 = b
    27  //   R6 = len
    28  //   R7 = address of output byte (stores 0 or 1 here)
    29  //   a and b have the same length
    30  TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0
    31  	CMPBEQ	R3, R5, equal
    32  loop:
    33  	CMPBEQ	R6, $0, equal
    34  	CMPBLT	R6, $32, tiny
    35  	CMP	R6, $256
    36  	BLT	tail
    37  	CLC	$256, 0(R3), 0(R5)
    38  	BNE	notequal
    39  	SUB	$256, R6
    40  	LA	256(R3), R3
    41  	LA	256(R5), R5
    42  	BR	loop
    43  tail:
    44  	SUB	$1, R6, R8
    45  	EXRL	$memeqbodyclc<>(SB), R8
    46  	BEQ	equal
    47  notequal:
    48  	MOVB	$0, 0(R7)
    49  	RET
    50  equal:
    51  	MOVB	$1, 0(R7)
    52  	RET
    53  tiny:
    54  	MOVD	$0, R2
    55  	CMPBLT	R6, $16, lt16
    56  	MOVD	0(R3), R8
    57  	MOVD	0(R5), R9
    58  	CMPBNE	R8, R9, notequal
    59  	MOVD	8(R3), R8
    60  	MOVD	8(R5), R9
    61  	CMPBNE	R8, R9, notequal
    62  	LA	16(R2), R2
    63  	SUB	$16, R6
    64  lt16:
    65  	CMPBLT	R6, $8, lt8
    66  	MOVD	0(R3)(R2*1), R8
    67  	MOVD	0(R5)(R2*1), R9
    68  	CMPBNE	R8, R9, notequal
    69  	LA	8(R2), R2
    70  	SUB	$8, R6
    71  lt8:
    72  	CMPBLT	R6, $4, lt4
    73  	MOVWZ	0(R3)(R2*1), R8
    74  	MOVWZ	0(R5)(R2*1), R9
    75  	CMPBNE	R8, R9, notequal
    76  	LA	4(R2), R2
    77  	SUB	$4, R6
    78  lt4:
    79  #define CHECK(n) \
    80  	CMPBEQ	R6, $n, equal \
    81  	MOVB	n(R3)(R2*1), R8 \
    82  	MOVB	n(R5)(R2*1), R9 \
    83  	CMPBNE	R8, R9, notequal
    84  	CHECK(0)
    85  	CHECK(1)
    86  	CHECK(2)
    87  	CHECK(3)
    88  	BR	equal
    89  
    90  TEXT memeqbodyclc<>(SB),NOSPLIT|NOFRAME,$0-0
    91  	CLC	$1, 0(R3), 0(R5)
    92  	RET