...

Text file src/runtime/memclr_arm.s

Documentation: runtime

     1// Inferno's libkern/memset-arm.s
     2// https://bitbucket.org/inferno-os/inferno-os/src/master/libkern/memset-arm.s
     3//
     4//         Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
     5//         Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
     6//         Portions Copyright 2009 The Go Authors. All rights reserved.
     7//
     8// Permission is hereby granted, free of charge, to any person obtaining a copy
     9// of this software and associated documentation files (the "Software"), to deal
    10// in the Software without restriction, including without limitation the rights
    11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    12// copies of the Software, and to permit persons to whom the Software is
    13// furnished to do so, subject to the following conditions:
    14//
    15// The above copyright notice and this permission notice shall be included in
    16// all copies or substantial portions of the Software.
    17//
    18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    23// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    24// THE SOFTWARE.
    25
    26#include "textflag.h"
    27
    28#define TO	R8
    29#define TOE	R11
    30#define N	R12
    31#define TMP	R12				/* N and TMP don't overlap */
    32
    33// See memclrNoHeapPointers Go doc for important implementation constraints.
    34
    35// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
    36// Also called from assembly in sys_windows_arm.s without g (but using Go stack convention).
    37TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8
    38	MOVW	ptr+0(FP), TO
    39	MOVW	n+4(FP), N
    40	MOVW	$0, R0
    41
    42	ADD	N, TO, TOE	/* to end pointer */
    43
    44	CMP	$4, N		/* need at least 4 bytes to copy */
    45	BLT	_1tail
    46
    47_4align:				/* align on 4 */
    48	AND.S	$3, TO, TMP
    49	BEQ	_4aligned
    50
    51	MOVBU.P	R0, 1(TO)		/* implicit write back */
    52	B	_4align
    53
    54_4aligned:
    55	SUB	$31, TOE, TMP	/* do 32-byte chunks if possible */
    56	CMP	TMP, TO
    57	BHS	_4tail
    58
    59	MOVW	R0, R1			/* replicate */
    60	MOVW	R0, R2
    61	MOVW	R0, R3
    62	MOVW	R0, R4
    63	MOVW	R0, R5
    64	MOVW	R0, R6
    65	MOVW	R0, R7
    66
    67_f32loop:
    68	CMP	TMP, TO
    69	BHS	_4tail
    70
    71	MOVM.IA.W [R0-R7], (TO)
    72	B	_f32loop
    73
    74_4tail:
    75	SUB	$3, TOE, TMP	/* do remaining words if possible */
    76_4loop:
    77	CMP	TMP, TO
    78	BHS	_1tail
    79
    80	MOVW.P	R0, 4(TO)		/* implicit write back */
    81	B	_4loop
    82
    83_1tail:
    84	CMP	TO, TOE
    85	BEQ	_return
    86
    87	MOVBU.P	R0, 1(TO)		/* implicit write back */
    88	B	_1tail
    89
    90_return:
    91	RET

View as plain text