xref: /aosp_15_r20/external/musl/src/string/aarch64/memset.S (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker/*
2*c9945492SAndroid Build Coastguard Worker * memset - fill memory with a constant byte
3*c9945492SAndroid Build Coastguard Worker *
4*c9945492SAndroid Build Coastguard Worker * Copyright (c) 2012-2020, Arm Limited.
5*c9945492SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
6*c9945492SAndroid Build Coastguard Worker */
7*c9945492SAndroid Build Coastguard Worker
8*c9945492SAndroid Build Coastguard Worker/* Assumptions:
9*c9945492SAndroid Build Coastguard Worker *
10*c9945492SAndroid Build Coastguard Worker * ARMv8-a, AArch64, Advanced SIMD, unaligned accesses.
11*c9945492SAndroid Build Coastguard Worker *
12*c9945492SAndroid Build Coastguard Worker */
13*c9945492SAndroid Build Coastguard Worker
14*c9945492SAndroid Build Coastguard Worker#define dstin   x0
15*c9945492SAndroid Build Coastguard Worker#define val     x1
16*c9945492SAndroid Build Coastguard Worker#define valw    w1
17*c9945492SAndroid Build Coastguard Worker#define count   x2
18*c9945492SAndroid Build Coastguard Worker#define dst     x3
19*c9945492SAndroid Build Coastguard Worker#define dstend  x4
20*c9945492SAndroid Build Coastguard Worker#define zva_val x5
21*c9945492SAndroid Build Coastguard Worker
22*c9945492SAndroid Build Coastguard Worker.global memset
23*c9945492SAndroid Build Coastguard Worker.type memset,%function
24*c9945492SAndroid Build Coastguard Workermemset:
25*c9945492SAndroid Build Coastguard Worker
26*c9945492SAndroid Build Coastguard Worker	dup     v0.16B, valw
27*c9945492SAndroid Build Coastguard Worker	add     dstend, dstin, count
28*c9945492SAndroid Build Coastguard Worker
29*c9945492SAndroid Build Coastguard Worker	cmp     count, 96
30*c9945492SAndroid Build Coastguard Worker	b.hi    .Lset_long
31*c9945492SAndroid Build Coastguard Worker	cmp     count, 16
32*c9945492SAndroid Build Coastguard Worker	b.hs    .Lset_medium
33*c9945492SAndroid Build Coastguard Worker	mov     val, v0.D[0]
34*c9945492SAndroid Build Coastguard Worker
35*c9945492SAndroid Build Coastguard Worker	/* Set 0..15 bytes.  */
36*c9945492SAndroid Build Coastguard Worker	tbz     count, 3, 1f
37*c9945492SAndroid Build Coastguard Worker	str     val, [dstin]
38*c9945492SAndroid Build Coastguard Worker	str     val, [dstend, -8]
39*c9945492SAndroid Build Coastguard Worker	ret
40*c9945492SAndroid Build Coastguard Worker	nop
41*c9945492SAndroid Build Coastguard Worker1:      tbz     count, 2, 2f
42*c9945492SAndroid Build Coastguard Worker	str     valw, [dstin]
43*c9945492SAndroid Build Coastguard Worker	str     valw, [dstend, -4]
44*c9945492SAndroid Build Coastguard Worker	ret
45*c9945492SAndroid Build Coastguard Worker2:      cbz     count, 3f
46*c9945492SAndroid Build Coastguard Worker	strb    valw, [dstin]
47*c9945492SAndroid Build Coastguard Worker	tbz     count, 1, 3f
48*c9945492SAndroid Build Coastguard Worker	strh    valw, [dstend, -2]
49*c9945492SAndroid Build Coastguard Worker3:      ret
50*c9945492SAndroid Build Coastguard Worker
51*c9945492SAndroid Build Coastguard Worker	/* Set 17..96 bytes.  */
52*c9945492SAndroid Build Coastguard Worker.Lset_medium:
53*c9945492SAndroid Build Coastguard Worker	str     q0, [dstin]
54*c9945492SAndroid Build Coastguard Worker	tbnz    count, 6, .Lset96
55*c9945492SAndroid Build Coastguard Worker	str     q0, [dstend, -16]
56*c9945492SAndroid Build Coastguard Worker	tbz     count, 5, 1f
57*c9945492SAndroid Build Coastguard Worker	str     q0, [dstin, 16]
58*c9945492SAndroid Build Coastguard Worker	str     q0, [dstend, -32]
59*c9945492SAndroid Build Coastguard Worker1:      ret
60*c9945492SAndroid Build Coastguard Worker
61*c9945492SAndroid Build Coastguard Worker	.p2align 4
62*c9945492SAndroid Build Coastguard Worker	/* Set 64..96 bytes.  Write 64 bytes from the start and
63*c9945492SAndroid Build Coastguard Worker	   32 bytes from the end.  */
64*c9945492SAndroid Build Coastguard Worker.Lset96:
65*c9945492SAndroid Build Coastguard Worker	str     q0, [dstin, 16]
66*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstin, 32]
67*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstend, -32]
68*c9945492SAndroid Build Coastguard Worker	ret
69*c9945492SAndroid Build Coastguard Worker
70*c9945492SAndroid Build Coastguard Worker	.p2align 4
71*c9945492SAndroid Build Coastguard Worker.Lset_long:
72*c9945492SAndroid Build Coastguard Worker	and     valw, valw, 255
73*c9945492SAndroid Build Coastguard Worker	bic     dst, dstin, 15
74*c9945492SAndroid Build Coastguard Worker	str     q0, [dstin]
75*c9945492SAndroid Build Coastguard Worker	cmp     count, 160
76*c9945492SAndroid Build Coastguard Worker	ccmp    valw, 0, 0, hs
77*c9945492SAndroid Build Coastguard Worker	b.ne    .Lno_zva
78*c9945492SAndroid Build Coastguard Worker
79*c9945492SAndroid Build Coastguard Worker#ifndef SKIP_ZVA_CHECK
80*c9945492SAndroid Build Coastguard Worker	mrs     zva_val, dczid_el0
81*c9945492SAndroid Build Coastguard Worker	and     zva_val, zva_val, 31
82*c9945492SAndroid Build Coastguard Worker	cmp     zva_val, 4              /* ZVA size is 64 bytes.  */
83*c9945492SAndroid Build Coastguard Worker	b.ne    .Lno_zva
84*c9945492SAndroid Build Coastguard Worker#endif
85*c9945492SAndroid Build Coastguard Worker	str     q0, [dst, 16]
86*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dst, 32]
87*c9945492SAndroid Build Coastguard Worker	bic     dst, dst, 63
88*c9945492SAndroid Build Coastguard Worker	sub     count, dstend, dst      /* Count is now 64 too large.  */
89*c9945492SAndroid Build Coastguard Worker	sub     count, count, 128       /* Adjust count and bias for loop.  */
90*c9945492SAndroid Build Coastguard Worker
91*c9945492SAndroid Build Coastguard Worker	.p2align 4
92*c9945492SAndroid Build Coastguard Worker.Lzva_loop:
93*c9945492SAndroid Build Coastguard Worker	add     dst, dst, 64
94*c9945492SAndroid Build Coastguard Worker	dc      zva, dst
95*c9945492SAndroid Build Coastguard Worker	subs    count, count, 64
96*c9945492SAndroid Build Coastguard Worker	b.hi    .Lzva_loop
97*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstend, -64]
98*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstend, -32]
99*c9945492SAndroid Build Coastguard Worker	ret
100*c9945492SAndroid Build Coastguard Worker
101*c9945492SAndroid Build Coastguard Worker.Lno_zva:
102*c9945492SAndroid Build Coastguard Worker	sub     count, dstend, dst      /* Count is 16 too large.  */
103*c9945492SAndroid Build Coastguard Worker	sub     dst, dst, 16            /* Dst is biased by -32.  */
104*c9945492SAndroid Build Coastguard Worker	sub     count, count, 64 + 16   /* Adjust count and bias for loop.  */
105*c9945492SAndroid Build Coastguard Worker.Lno_zva_loop:
106*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dst, 32]
107*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dst, 64]!
108*c9945492SAndroid Build Coastguard Worker	subs    count, count, 64
109*c9945492SAndroid Build Coastguard Worker	b.hi    .Lno_zva_loop
110*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstend, -64]
111*c9945492SAndroid Build Coastguard Worker	stp     q0, q0, [dstend, -32]
112*c9945492SAndroid Build Coastguard Worker	ret
113*c9945492SAndroid Build Coastguard Worker
114*c9945492SAndroid Build Coastguard Worker.size memset,.-memset
115*c9945492SAndroid Build Coastguard Worker
116