1/* Copyright (C) 1996-2021 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library. If not, see 16 <https://www.gnu.org/licenses/>. */ 17 18/* Fill a block of memory with zeros. Optimized for the Alpha architecture: 19 20 - memory accessed as aligned quadwords only 21 - destination memory not read unless needed for good cache behaviour 22 - basic blocks arranged to optimize branch prediction for full-quadword 23 aligned memory blocks. 24 - partial head and tail quadwords constructed with byte-mask instructions 25 26 This is generally scheduled for the EV5 (got to look out for my own 27 interests :-), but with EV4 needs in mind. There *should* be no more 28 stalls for the EV4 than there are for the EV5. 29*/ 30 31 32#include <sysdep.h> 33 34 .set noat 35 .set noreorder 36 37 .text 38 .type __bzero, @function 39 .globl __bzero 40 .usepv __bzero, USEPV_PROF 41 42 cfi_startproc 43 44 /* On entry to this basic block: 45 t3 == loop counter 46 t4 == bytes in partial final word 47 a0 == possibly misaligned destination pointer */ 48 49 .align 3 50bzero_loop: 51 beq t3, $tail # 52 blbc t3, 0f # skip single store if count even 53 54 stq_u zero, 0(a0) # e0 : store one word 55 subq t3, 1, t3 # .. e1 : 56 addq a0, 8, a0 # e0 : 57 beq t3, $tail # .. e1 : 58 590: stq_u zero, 0(a0) # e0 : store two words 60 subq t3, 2, t3 # .. e1 : 61 stq_u zero, 8(a0) # e0 : 62 addq a0, 16, a0 # .. e1 : 63 bne t3, 0b # e1 : 64 65$tail: bne t4, 1f # is there a tail to do? 66 ret # no 67 681: ldq_u t0, 0(a0) # yes, load original data 69 mskqh t0, t4, t0 # 70 stq_u t0, 0(a0) # 71 ret # 72 73__bzero: 74#ifdef PROF 75 ldgp gp, 0(pv) 76 lda AT, _mcount 77 jsr AT, (AT), _mcount 78#endif 79 80 mov a0, v0 # e0 : move return value in place 81 beq a1, $done # .. e1 : early exit for zero-length store 82 and a0, 7, t1 # e0 : 83 addq a1, t1, a1 # e1 : add dest misalignment to count 84 srl a1, 3, t3 # e0 : loop = count >> 3 85 and a1, 7, t4 # .. e1 : find number of bytes in tail 86 unop # : 87 beq t1, bzero_loop # e1 : aligned head, jump right in 88 89 ldq_u t0, 0(a0) # e0 : load original data to mask into 90 cmpult a1, 8, t2 # .. e1 : is this a sub-word set? 91 bne t2, $oneq # e1 : 92 93 mskql t0, a0, t0 # e0 : we span words. finish this partial 94 subq t3, 1, t3 # e0 : 95 addq a0, 8, a0 # .. e1 : 96 stq_u t0, -8(a0) # e0 : 97 br bzero_loop # .. e1 : 98 99 .align 3 100$oneq: 101 mskql t0, a0, t2 # e0 : 102 mskqh t0, a1, t3 # e0 : 103 or t2, t3, t0 # e1 : 104 stq_u t0, 0(a0) # e0 : 105 106$done: ret 107 108 cfi_endproc 109weak_alias (__bzero, bzero) 110