| // Copyright 2016 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. |
| |
| //go:build mips || mipsle |
| // +build mips mipsle |
| |
| #include "textflag.h" |
| |
| #ifdef GOARCH_mips |
| #define MOVWHI MOVWL |
| #define MOVWLO MOVWR |
| #else |
| #define MOVWHI MOVWR |
| #define MOVWLO MOVWL |
| #endif |
| |
| // See memclrNoHeapPointers Go doc for important implementation constraints. |
| |
| // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) |
| TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8 |
| MOVW n+4(FP), R2 |
| MOVW ptr+0(FP), R1 |
| |
| SGTU $4, R2, R3 |
| ADDU R2, R1, R4 |
| BNE R3, small_zero |
| |
| ptr_align: |
| AND $3, R1, R3 |
| BEQ R3, setup |
| SUBU R1, R0, R3 |
| AND $3, R3 // R3 contains number of bytes needed to align ptr |
| MOVWHI R0, 0(R1) // MOVWHI will write zeros up to next word boundary |
| SUBU R3, R2 |
| ADDU R3, R1 |
| |
| setup: |
| AND $31, R2, R6 |
| AND $3, R2, R5 |
| SUBU R6, R4, R6 // end pointer for 32-byte chunks |
| SUBU R5, R4, R5 // end pointer for 4-byte chunks |
| |
| large: |
| BEQ R1, R6, words |
| MOVW R0, 0(R1) |
| MOVW R0, 4(R1) |
| MOVW R0, 8(R1) |
| MOVW R0, 12(R1) |
| MOVW R0, 16(R1) |
| MOVW R0, 20(R1) |
| MOVW R0, 24(R1) |
| MOVW R0, 28(R1) |
| ADDU $32, R1 |
| JMP large |
| |
| words: |
| BEQ R1, R5, tail |
| MOVW R0, 0(R1) |
| ADDU $4, R1 |
| JMP words |
| |
| tail: |
| BEQ R1, R4, ret |
| MOVWLO R0, -1(R4) |
| |
| ret: |
| RET |
| |
| small_zero: |
| BEQ R1, R4, ret |
| MOVB R0, 0(R1) |
| ADDU $1, R1 |
| JMP small_zero |