...

Text file src/internal/bytealg/equal_mips64x.s

Documentation: internal/bytealg

     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
    13TEXT 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
    24byte_loop:
    25	BNE	R1, R4, byte_test
    26	MOVV	$1, R1
    27	MOVB	R1, ret+24(FP)
    28	RET
    29byte_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
    37chunk_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
    44chunk_loop:
    45	// chunk size is 16
    46	SGTU	$16, R3, R8
    47	BNE	R0, R8, chunk_tail_8
    48chunk_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
    60chunk_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
    69chunk_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
    78chunk_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
    87chunk_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
    94not_eq:
    95	MOVB	R0, ret+24(FP)
    96	RET
    97eq:
    98	MOVV	$1, R1
    99	MOVB	R1, ret+24(FP)
   100	RET
   101
   102// memequal_varlen(a, b unsafe.Pointer) bool
   103TEXT 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
   115eq:
   116	MOVV	$1, R1
   117	MOVB	R1, ret+16(FP)
   118	RET

View as plain text