2014-08-12 17:48:49 -06:00
|
|
|
// Copyright 2014 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2014-12-05 17:13:20 -07:00
|
|
|
// +build ppc64 ppc64le
|
2014-08-12 17:48:49 -06:00
|
|
|
|
2014-10-27 15:27:03 -06:00
|
|
|
#include "textflag.h"
|
2014-08-12 17:48:49 -06:00
|
|
|
|
2016-10-17 16:41:56 -06:00
|
|
|
// void runtime·memclrNoHeapPointers(void*, uintptr)
|
|
|
|
TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT|NOFRAME, $0-16
|
2016-10-05 14:12:05 -06:00
|
|
|
MOVD ptr+0(FP), R3
|
|
|
|
MOVD n+8(FP), R4
|
|
|
|
|
|
|
|
// Determine if there are doublewords to clear
|
|
|
|
check:
|
|
|
|
ANDCC $7, R4, R5 // R5: leftover bytes to clear
|
|
|
|
SRAD $3, R4, R6 // R6: double words to clear
|
|
|
|
CMP R6, $0, CR1 // CR1[EQ] set if no double words
|
|
|
|
|
|
|
|
BC 12, 6, nozerolarge // only single bytes
|
|
|
|
MOVD R6, CTR // R6 = number of double words
|
|
|
|
SRADCC $2, R6, R7 // 32 byte chunks?
|
|
|
|
BNE zero32setup
|
|
|
|
|
|
|
|
// Clear double words
|
|
|
|
|
|
|
|
zero8:
|
|
|
|
MOVD R0, 0(R3) // double word
|
|
|
|
ADD $8, R3
|
|
|
|
BC 16, 0, zero8 // dec ctr, br zero8 if ctr not 0
|
|
|
|
BR nozerolarge // handle remainder
|
|
|
|
|
|
|
|
// Prepare to clear 32 bytes at a time.
|
|
|
|
|
|
|
|
zero32setup:
|
|
|
|
DCBTST (R3) // prepare data cache
|
|
|
|
MOVD R7, CTR // number of 32 byte chunks
|
|
|
|
|
|
|
|
zero32:
|
|
|
|
MOVD R0, 0(R3) // clear 4 double words
|
|
|
|
MOVD R0, 8(R3)
|
|
|
|
MOVD R0, 16(R3)
|
|
|
|
MOVD R0, 24(R3)
|
|
|
|
ADD $32, R3
|
|
|
|
BC 16, 0, zero32 // dec ctr, br zero32 if ctr not 0
|
|
|
|
RLDCLCC $61, R4, $3, R6 // remaining doublewords
|
|
|
|
BEQ nozerolarge
|
|
|
|
MOVD R6, CTR // set up the CTR for doublewords
|
|
|
|
BR zero8
|
|
|
|
|
|
|
|
nozerolarge:
|
|
|
|
CMP R5, $0 // any remaining bytes
|
|
|
|
BC 4, 1, LR // ble lr
|
|
|
|
|
|
|
|
zerotail:
|
|
|
|
MOVD R5, CTR // set up to clear tail bytes
|
|
|
|
|
|
|
|
zerotailloop:
|
|
|
|
MOVB R0, 0(R3) // clear single bytes
|
|
|
|
ADD $1, R3
|
|
|
|
BC 16, 0, zerotailloop // dec ctr, br zerotailloop if ctr not 0
|
2015-06-03 12:59:27 -06:00
|
|
|
RET
|