...

Text file src/runtime/memclr_mips64x.s

Documentation: runtime

     1// Copyright 2015 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// See memclrNoHeapPointers Go doc for important implementation constraints.
    11
    12// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
    13TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16
    14	MOVV	ptr+0(FP), R1
    15	MOVV	n+8(FP), R2
    16	ADDV	R1, R2, R4
    17
    18	// if less than 16 bytes or no MSA, do words check
    19	SGTU	$16, R2, R3
    20	BNE	R3, no_msa
    21	MOVBU	internal∕cpu·MIPS64X+const_offsetMIPS64XHasMSA(SB), R3
    22	BEQ	R3, R0, no_msa
    23
    24	VMOVB	$0, W0
    25
    26	SGTU	$128, R2, R3
    27	BEQ	R3, msa_large
    28
    29	AND	$15, R2, R5
    30	XOR	R2, R5, R6
    31	ADDVU	R1, R6
    32
    33msa_small:
    34	VMOVB	W0, (R1)
    35	ADDVU	$16, R1
    36	SGTU	R6, R1, R3
    37	BNE	R3, R0, msa_small
    38	BEQ	R5, R0, done
    39	VMOVB	W0, -16(R4)
    40	JMP	done
    41
    42msa_large:
    43	AND	$127, R2, R5
    44	XOR	R2, R5, R6
    45	ADDVU	R1, R6
    46
    47msa_large_loop:
    48	VMOVB	W0, (R1)
    49	VMOVB	W0, 16(R1)
    50	VMOVB	W0, 32(R1)
    51	VMOVB	W0, 48(R1)
    52	VMOVB	W0, 64(R1)
    53	VMOVB	W0, 80(R1)
    54	VMOVB	W0, 96(R1)
    55	VMOVB	W0, 112(R1)
    56
    57	ADDVU	$128, R1
    58	SGTU	R6, R1, R3
    59	BNE	R3, R0, msa_large_loop
    60	BEQ	R5, R0, done
    61	VMOVB	W0, -128(R4)
    62	VMOVB	W0, -112(R4)
    63	VMOVB	W0, -96(R4)
    64	VMOVB	W0, -80(R4)
    65	VMOVB	W0, -64(R4)
    66	VMOVB	W0, -48(R4)
    67	VMOVB	W0, -32(R4)
    68	VMOVB	W0, -16(R4)
    69	JMP	done
    70
    71no_msa:
    72	// if less than 8 bytes, do one byte at a time
    73	SGTU	$8, R2, R3
    74	BNE	R3, check4
    75
    76	// Check alignment
    77	AND	$7, R1, R3
    78	BEQ	R3, aligned
    79
    80	// Zero one byte at a time until we reach 8 byte alignment.
    81	MOVV	$8, R5
    82	SUBV	R3, R5, R3
    83	SUBV	R3, R2, R2
    84align:
    85	SUBV	$1, R3
    86	MOVB	R0, (R1)
    87	ADDV	$1, R1
    88	BNE	R3, align
    89
    90aligned:
    91	SGTU	$8, R2, R3
    92	BNE	R3, check4
    93	SGTU	$16, R2, R3
    94	BNE	R3, zero8
    95	SGTU	$32, R2, R3
    96	BNE	R3, zero16
    97	SGTU	$64, R2, R3
    98	BNE	R3, zero32
    99loop64:
   100	MOVV	R0, (R1)
   101	MOVV	R0, 8(R1)
   102	MOVV	R0, 16(R1)
   103	MOVV	R0, 24(R1)
   104	MOVV	R0, 32(R1)
   105	MOVV	R0, 40(R1)
   106	MOVV	R0, 48(R1)
   107	MOVV	R0, 56(R1)
   108	ADDV	$64, R1
   109	SUBV	$64, R2
   110	SGTU	$64, R2, R3
   111	BEQ	R0, R3, loop64
   112	BEQ	R2, done
   113
   114check32:
   115	SGTU	$32, R2, R3
   116	BNE	R3, check16
   117zero32:
   118	MOVV	R0, (R1)
   119	MOVV	R0, 8(R1)
   120	MOVV	R0, 16(R1)
   121	MOVV	R0, 24(R1)
   122	ADDV	$32, R1
   123	SUBV	$32, R2
   124	BEQ	R2, done
   125
   126check16:
   127	SGTU	$16, R2, R3
   128	BNE	R3, check8
   129zero16:
   130	MOVV	R0, (R1)
   131	MOVV	R0, 8(R1)
   132	ADDV	$16, R1
   133	SUBV	$16, R2
   134	BEQ	R2, done
   135
   136check8:
   137	SGTU	$8, R2, R3
   138	BNE	R3, check4
   139zero8:
   140	MOVV	R0, (R1)
   141	ADDV	$8, R1
   142	SUBV	$8, R2
   143	BEQ	R2, done
   144
   145check4:
   146	SGTU	$4, R2, R3
   147	BNE	R3, loop1
   148zero4:
   149	MOVB	R0, (R1)
   150	MOVB	R0, 1(R1)
   151	MOVB	R0, 2(R1)
   152	MOVB	R0, 3(R1)
   153	ADDV	$4, R1
   154	SUBV	$4, R2
   155
   156loop1:
   157	BEQ	R1, R4, done
   158	MOVB	R0, (R1)
   159	ADDV	$1, R1
   160	JMP	loop1
   161done:
   162	RET
   163

View as plain text