...

Text file src/runtime/memclr_386.s

     1	// Copyright 2014 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	// +build !plan9
     6	
     7	#include "go_asm.h"
     8	#include "textflag.h"
     9	
    10	// NOTE: Windows externalthreadhandler expects memclr to preserve DX.
    11	
    12	// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
    13	TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT, $0-8
    14		MOVL	ptr+0(FP), DI
    15		MOVL	n+4(FP), BX
    16		XORL	AX, AX
    17	
    18		// MOVOU seems always faster than REP STOSL.
    19	tail:
    20		// BSR+branch table make almost all memmove/memclr benchmarks worse. Not worth doing.
    21		TESTL	BX, BX
    22		JEQ	_0
    23		CMPL	BX, $2
    24		JBE	_1or2
    25		CMPL	BX, $4
    26		JB	_3
    27		JE	_4
    28		CMPL	BX, $8
    29		JBE	_5through8
    30		CMPL	BX, $16
    31		JBE	_9through16
    32		CMPB	internal∕cpu·X86+const_offsetX86HasSSE2(SB), $1
    33		JNE	nosse2
    34		PXOR	X0, X0
    35		CMPL	BX, $32
    36		JBE	_17through32
    37		CMPL	BX, $64
    38		JBE	_33through64
    39		CMPL	BX, $128
    40		JBE	_65through128
    41		CMPL	BX, $256
    42		JBE	_129through256
    43	
    44	loop:
    45		MOVOU	X0, 0(DI)
    46		MOVOU	X0, 16(DI)
    47		MOVOU	X0, 32(DI)
    48		MOVOU	X0, 48(DI)
    49		MOVOU	X0, 64(DI)
    50		MOVOU	X0, 80(DI)
    51		MOVOU	X0, 96(DI)
    52		MOVOU	X0, 112(DI)
    53		MOVOU	X0, 128(DI)
    54		MOVOU	X0, 144(DI)
    55		MOVOU	X0, 160(DI)
    56		MOVOU	X0, 176(DI)
    57		MOVOU	X0, 192(DI)
    58		MOVOU	X0, 208(DI)
    59		MOVOU	X0, 224(DI)
    60		MOVOU	X0, 240(DI)
    61		SUBL	$256, BX
    62		ADDL	$256, DI
    63		CMPL	BX, $256
    64		JAE	loop
    65		JMP	tail
    66	
    67	_1or2:
    68		MOVB	AX, (DI)
    69		MOVB	AX, -1(DI)(BX*1)
    70		RET
    71	_0:
    72		RET
    73	_3:
    74		MOVW	AX, (DI)
    75		MOVB	AX, 2(DI)
    76		RET
    77	_4:
    78		// We need a separate case for 4 to make sure we clear pointers atomically.
    79		MOVL	AX, (DI)
    80		RET
    81	_5through8:
    82		MOVL	AX, (DI)
    83		MOVL	AX, -4(DI)(BX*1)
    84		RET
    85	_9through16:
    86		MOVL	AX, (DI)
    87		MOVL	AX, 4(DI)
    88		MOVL	AX, -8(DI)(BX*1)
    89		MOVL	AX, -4(DI)(BX*1)
    90		RET
    91	_17through32:
    92		MOVOU	X0, (DI)
    93		MOVOU	X0, -16(DI)(BX*1)
    94		RET
    95	_33through64:
    96		MOVOU	X0, (DI)
    97		MOVOU	X0, 16(DI)
    98		MOVOU	X0, -32(DI)(BX*1)
    99		MOVOU	X0, -16(DI)(BX*1)
   100		RET
   101	_65through128:
   102		MOVOU	X0, (DI)
   103		MOVOU	X0, 16(DI)
   104		MOVOU	X0, 32(DI)
   105		MOVOU	X0, 48(DI)
   106		MOVOU	X0, -64(DI)(BX*1)
   107		MOVOU	X0, -48(DI)(BX*1)
   108		MOVOU	X0, -32(DI)(BX*1)
   109		MOVOU	X0, -16(DI)(BX*1)
   110		RET
   111	_129through256:
   112		MOVOU	X0, (DI)
   113		MOVOU	X0, 16(DI)
   114		MOVOU	X0, 32(DI)
   115		MOVOU	X0, 48(DI)
   116		MOVOU	X0, 64(DI)
   117		MOVOU	X0, 80(DI)
   118		MOVOU	X0, 96(DI)
   119		MOVOU	X0, 112(DI)
   120		MOVOU	X0, -128(DI)(BX*1)
   121		MOVOU	X0, -112(DI)(BX*1)
   122		MOVOU	X0, -96(DI)(BX*1)
   123		MOVOU	X0, -80(DI)(BX*1)
   124		MOVOU	X0, -64(DI)(BX*1)
   125		MOVOU	X0, -48(DI)(BX*1)
   126		MOVOU	X0, -32(DI)(BX*1)
   127		MOVOU	X0, -16(DI)(BX*1)
   128		RET
   129	nosse2:
   130		MOVL	BX, CX
   131		SHRL	$2, CX
   132		REP
   133		STOSL
   134		ANDL	$3, BX
   135		JNE	tail
   136		RET

View as plain text