summaryrefslogtreecommitdiff
path: root/lib/ultralib/src/libc/bzero.s
blob: 894c18661d563102e650713d50dc3ae5f8e1d9d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "PR/R4300.h"
#include "sys/asm.h"
#include "sys/regdef.h"

.text
#ifdef __sgi
WEAK(bzero, _bzero)
WEAK(blkclr, _blkclr)
#else
#define _bzero bzero
#define _blkclr blkclr
#endif
LEAF(_bzero)
XLEAF(_blkclr)
    negu v1, a0
    blt a1, 12, bytezero

    andi v1, v1, 0x3
    subu a1, a1, v1

    beqz v1, blkzero
    swl zero, 0(a0)
    addu a0, a0, v1
blkzero:
    and a3, a1, ~31
    subu a1, a1, a3
    beqz a3, wordzero

    addu a3, a3, a0
1:
    sw zero, 0(a0)
    sw zero, 4(a0)
    sw zero, 8(a0)
    sw zero, 12(a0)
    addiu a0, a0, 32
    sw zero, -16(a0)
    sw zero, -12(a0)
    sw zero, -8(a0)
    sw zero, -4(a0)
    bne a0, a3, 1b

wordzero:
    and a3, a1, ~3
    subu a1, a1, a3
    beqz a3, bytezero

    addu a3, a3, a0
1:
    addiu a0, a0, 4
    sw zero, -4(a0)
    bne a0, a3, 1b

bytezero:
    blez a1, zerodone
    #nop
    addu a1, a1, a0
1:
    addiu a0, a0, 1
    sb zero, -1(a0)
    bne a0, a1, 1b
zerodone:
    jr ra

.end _bzero