...
Run Format

Text file src/internal/bytealg/equal_riscv64.s

Documentation: internal/bytealg

     1// Copyright 2019 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#define	CTXT	S10
     9
    10// func memequal_varlen(a, b unsafe.Pointer) bool
    11TEXT runtime·memequal_varlen<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-17
    12	// X10 = a_base
    13	// X11 = b_base
    14	MOV	8(CTXT), X12    // compiler stores size at offset 8 in the closure
    15	JMP	runtime·memequal<ABIInternal>(SB)
    16
    17// func memequal(a, b unsafe.Pointer, size uintptr) bool
    18TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25
    19	// X10 = a_base
    20	// X11 = b_base
    21	// X12 = size
    22	BNE	X10, X11, length_check
    23	MOV	$0, X12
    24
    25length_check:
    26	BEQZ	X12, done
    27
    28	MOV	$32, X23
    29	BLT	X12, X23, loop4_check
    30
    31	// Check alignment - if alignment differs we have to do one byte at a time.
    32	AND	$7, X10, X9
    33	AND	$7, X11, X19
    34	BNE	X9, X19, loop4_check
    35	BEQZ	X9, loop32_check
    36
    37	// Check one byte at a time until we reach 8 byte alignment.
    38	SUB	X9, X0, X9
    39	ADD	$8, X9, X9
    40	SUB	X9, X12, X12
    41align:
    42	SUB	$1, X9
    43	MOVBU	0(X10), X19
    44	MOVBU	0(X11), X20
    45	BNE	X19, X20, done
    46	ADD	$1, X10
    47	ADD	$1, X11
    48	BNEZ	X9, align
    49
    50loop32_check:
    51	MOV	$32, X9
    52	BLT	X12, X9, loop16_check
    53loop32:
    54	MOV	0(X10), X19
    55	MOV	0(X11), X20
    56	MOV	8(X10), X21
    57	MOV	8(X11), X22
    58	BNE	X19, X20, done
    59	BNE	X21, X22, done
    60	MOV	16(X10), X14
    61	MOV	16(X11), X15
    62	MOV	24(X10), X16
    63	MOV	24(X11), X17
    64	BNE	X14, X15, done
    65	BNE	X16, X17, done
    66	ADD	$32, X10
    67	ADD	$32, X11
    68	SUB	$32, X12
    69	BGE	X12, X9, loop32
    70	BEQZ	X12, done
    71
    72loop16_check:
    73	MOV	$16, X23
    74	BLT	X12, X23, loop4_check
    75loop16:
    76	MOV	0(X10), X19
    77	MOV	0(X11), X20
    78	MOV	8(X10), X21
    79	MOV	8(X11), X22
    80	BNE	X19, X20, done
    81	BNE	X21, X22, done
    82	ADD	$16, X10
    83	ADD	$16, X11
    84	SUB	$16, X12
    85	BGE	X12, X23, loop16
    86	BEQZ	X12, done
    87
    88loop4_check:
    89	MOV	$4, X23
    90	BLT	X12, X23, loop1
    91loop4:
    92	MOVBU	0(X10), X19
    93	MOVBU	0(X11), X20
    94	MOVBU	1(X10), X21
    95	MOVBU	1(X11), X22
    96	BNE	X19, X20, done
    97	BNE	X21, X22, done
    98	MOVBU	2(X10), X14
    99	MOVBU	2(X11), X15
   100	MOVBU	3(X10), X16
   101	MOVBU	3(X11), X17
   102	BNE	X14, X15, done
   103	BNE	X16, X17, done
   104	ADD	$4, X10
   105	ADD	$4, X11
   106	SUB	$4, X12
   107	BGE	X12, X23, loop4
   108
   109loop1:
   110	BEQZ	X12, done
   111	MOVBU	0(X10), X19
   112	MOVBU	0(X11), X20
   113	BNE	X19, X20, done
   114	ADD	$1, X10
   115	ADD	$1, X11
   116	SUB	$1, X12
   117	JMP	loop1
   118
   119done:
   120	// If X12 is zero then memory is equivalent.
   121	SEQZ	X12, X10
   122	RET

View as plain text