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