1 // Copyright 2016 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 mips mipsle 6 7 #include "textflag.h" 8 9 #ifdef GOARCH_mips 10 #define MOVWHI MOVWL 11 #define MOVWLO MOVWR 12 #else 13 #define MOVWHI MOVWR 14 #define MOVWLO MOVWL 15 #endif 16 17 // void runtimememclrNoHeapPointers(void*, uintptr) 18 TEXT runtimememclrNoHeapPointers(SB),NOSPLIT,$0-8 19 MOVW n+4(FP), R2 20 MOVW ptr+0(FP), R1 21 22 SGTU $4, R2, R3 23 ADDU R2, R1, R4 24 BNE R3, small_zero 25 26 ptr_align: 27 AND $3, R1, R3 28 BEQ R3, setup 29 SUBU R1, R0, R3 30 AND $3, R3 // R3 contains number of bytes needed to align ptr 31 MOVWHI R0, 0(R1) // MOVWHI will write zeros up to next word boundary 32 SUBU R3, R2 33 ADDU R3, R1 34 35 setup: 36 AND $31, R2, R6 37 AND $3, R2, R5 38 SUBU R6, R4, R6 // end pointer for 32-byte chunks 39 SUBU R5, R4, R5 // end pointer for 4-byte chunks 40 41 large: 42 BEQ R1, R6, words 43 MOVW R0, 0(R1) 44 MOVW R0, 4(R1) 45 MOVW R0, 8(R1) 46 MOVW R0, 12(R1) 47 MOVW R0, 16(R1) 48 MOVW R0, 20(R1) 49 MOVW R0, 24(R1) 50 MOVW R0, 28(R1) 51 ADDU $32, R1 52 JMP large 53 54 words: 55 BEQ R1, R5, tail 56 MOVW R0, 0(R1) 57 ADDU $4, R1 58 JMP words 59 60 tail: 61 BEQ R1, R4, ret 62 MOVWLO R0, -1(R4) 63 64 ret: 65 RET 66 67 small_zero: 68 BEQ R1, R4, ret 69 MOVB R0, 0(R1) 70 ADDU $1, R1 71 JMP small_zero 72