| // 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. | |
| // +build ppc64 ppc64le | |
| #include "textflag.h" | |
| // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) | |
| TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT|NOFRAME, $0-16 | |
| 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 | |
| RET |