1*c0909341SAndroid Build Coastguard Worker/* 2*c0909341SAndroid Build Coastguard Worker * Copyright © 2021, VideoLAN and dav1d authors 3*c0909341SAndroid Build Coastguard Worker * Copyright © 2021, Martin Storsjo 4*c0909341SAndroid Build Coastguard Worker * All rights reserved. 5*c0909341SAndroid Build Coastguard Worker * 6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 8*c0909341SAndroid Build Coastguard Worker * 9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this 10*c0909341SAndroid Build Coastguard Worker * list of conditions and the following disclaimer. 11*c0909341SAndroid Build Coastguard Worker * 12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice, 13*c0909341SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 14*c0909341SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 15*c0909341SAndroid Build Coastguard Worker * 16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*c0909341SAndroid Build Coastguard Worker */ 27*c0909341SAndroid Build Coastguard Worker 28*c0909341SAndroid Build Coastguard Worker#include "src/arm/asm.S" 29*c0909341SAndroid Build Coastguard Worker#include "util.S" 30*c0909341SAndroid Build Coastguard Worker 31*c0909341SAndroid Build Coastguard Worker// void dav1d_splat_mv_neon(refmvs_block **rr, const refmvs_block *rmv, 32*c0909341SAndroid Build Coastguard Worker// int bx4, int bw4, int bh4) 33*c0909341SAndroid Build Coastguard Worker 34*c0909341SAndroid Build Coastguard Workerfunction splat_mv_neon, export=1 35*c0909341SAndroid Build Coastguard Worker push {r4, lr} 36*c0909341SAndroid Build Coastguard Worker vld1.8 {q3}, [r1] 37*c0909341SAndroid Build Coastguard Worker ldr r4, [sp, #8] 38*c0909341SAndroid Build Coastguard Worker clz r3, r3 39*c0909341SAndroid Build Coastguard Worker adr lr, L(splat_tbl) 40*c0909341SAndroid Build Coastguard Worker sub r3, r3, #26 41*c0909341SAndroid Build Coastguard Worker vext.8 q2, q3, q3, #12 42*c0909341SAndroid Build Coastguard Worker ldr r3, [lr, r3, lsl #2] 43*c0909341SAndroid Build Coastguard Worker add r2, r2, r2, lsl #1 44*c0909341SAndroid Build Coastguard Worker vext.8 q0, q2, q3, #4 45*c0909341SAndroid Build Coastguard Worker add r3, lr, r3 46*c0909341SAndroid Build Coastguard Worker vext.8 q1, q2, q3, #8 47*c0909341SAndroid Build Coastguard Worker lsl r2, r2, #2 48*c0909341SAndroid Build Coastguard Worker vext.8 q2, q2, q3, #12 49*c0909341SAndroid Build Coastguard Worker vmov q3, q0 50*c0909341SAndroid Build Coastguard Worker1: 51*c0909341SAndroid Build Coastguard Worker ldr r1, [r0], #4 52*c0909341SAndroid Build Coastguard Worker subs r4, r4, #1 53*c0909341SAndroid Build Coastguard Worker add r1, r1, r2 54*c0909341SAndroid Build Coastguard Worker bx r3 55*c0909341SAndroid Build Coastguard Worker 56*c0909341SAndroid Build Coastguard Worker .align 2 57*c0909341SAndroid Build Coastguard WorkerL(splat_tbl): 58*c0909341SAndroid Build Coastguard Worker .word 320f - L(splat_tbl) + CONFIG_THUMB 59*c0909341SAndroid Build Coastguard Worker .word 160f - L(splat_tbl) + CONFIG_THUMB 60*c0909341SAndroid Build Coastguard Worker .word 80f - L(splat_tbl) + CONFIG_THUMB 61*c0909341SAndroid Build Coastguard Worker .word 40f - L(splat_tbl) + CONFIG_THUMB 62*c0909341SAndroid Build Coastguard Worker .word 20f - L(splat_tbl) + CONFIG_THUMB 63*c0909341SAndroid Build Coastguard Worker .word 10f - L(splat_tbl) + CONFIG_THUMB 64*c0909341SAndroid Build Coastguard Worker 65*c0909341SAndroid Build Coastguard Worker10: 66*c0909341SAndroid Build Coastguard Worker vst1.8 {d0}, [r1] 67*c0909341SAndroid Build Coastguard Worker vstr s2, [r1, #8] 68*c0909341SAndroid Build Coastguard Worker bgt 1b 69*c0909341SAndroid Build Coastguard Worker pop {r4, pc} 70*c0909341SAndroid Build Coastguard Worker20: 71*c0909341SAndroid Build Coastguard Worker vst1.8 {q0}, [r1] 72*c0909341SAndroid Build Coastguard Worker vstr d2, [r1, #16] 73*c0909341SAndroid Build Coastguard Worker bgt 1b 74*c0909341SAndroid Build Coastguard Worker pop {r4, pc} 75*c0909341SAndroid Build Coastguard Worker40: 76*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r1]! 77*c0909341SAndroid Build Coastguard Worker vst1.8 {q2}, [r1] 78*c0909341SAndroid Build Coastguard Worker bgt 1b 79*c0909341SAndroid Build Coastguard Worker pop {r4, pc} 80*c0909341SAndroid Build Coastguard Worker320: 81*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r1]! 82*c0909341SAndroid Build Coastguard Worker vst1.8 {q2, q3}, [r1]! 83*c0909341SAndroid Build Coastguard Worker vst1.8 {q1, q2}, [r1]! 84*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r1]! 85*c0909341SAndroid Build Coastguard Worker vst1.8 {q2, q3}, [r1]! 86*c0909341SAndroid Build Coastguard Worker vst1.8 {q1, q2}, [r1]! 87*c0909341SAndroid Build Coastguard Worker160: 88*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r1]! 89*c0909341SAndroid Build Coastguard Worker vst1.8 {q2, q3}, [r1]! 90*c0909341SAndroid Build Coastguard Worker vst1.8 {q1, q2}, [r1]! 91*c0909341SAndroid Build Coastguard Worker80: 92*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r1]! 93*c0909341SAndroid Build Coastguard Worker vst1.8 {q2, q3}, [r1]! 94*c0909341SAndroid Build Coastguard Worker vst1.8 {q1, q2}, [r1] 95*c0909341SAndroid Build Coastguard Worker bgt 1b 96*c0909341SAndroid Build Coastguard Worker pop {r4, pc} 97*c0909341SAndroid Build Coastguard Workerendfunc 98*c0909341SAndroid Build Coastguard Worker 99*c0909341SAndroid Build Coastguard Workerconst mv_tbls, align=4 100*c0909341SAndroid Build Coastguard Worker .byte 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 101*c0909341SAndroid Build Coastguard Worker .byte 0, 1, 2, 3, 8, 0, 1, 2, 3, 8, 0, 1, 2, 3, 8, 0 102*c0909341SAndroid Build Coastguard Worker .byte 4, 5, 6, 7, 9, 4, 5, 6, 7, 9, 4, 5, 6, 7, 9, 4 103*c0909341SAndroid Build Coastguard Worker .byte 4, 5, 6, 7, 9, 4, 5, 6, 7, 9, 4, 5, 6, 7, 9, 4 104*c0909341SAndroid Build Coastguard Workerendconst 105*c0909341SAndroid Build Coastguard Worker 106*c0909341SAndroid Build Coastguard Workerconst mask_mult, align=4 107*c0909341SAndroid Build Coastguard Worker .byte 1, 2, 1, 2, 0, 0, 0, 0 108*c0909341SAndroid Build Coastguard Workerendconst 109*c0909341SAndroid Build Coastguard Worker 110*c0909341SAndroid Build Coastguard Worker// void dav1d_save_tmvs_neon(refmvs_temporal_block *rp, ptrdiff_t stride, 111*c0909341SAndroid Build Coastguard Worker// refmvs_block **rr, const uint8_t *ref_sign, 112*c0909341SAndroid Build Coastguard Worker// int col_end8, int row_end8, 113*c0909341SAndroid Build Coastguard Worker// int col_start8, int row_start8) 114*c0909341SAndroid Build Coastguard Workerfunction save_tmvs_neon, export=1 115*c0909341SAndroid Build Coastguard Worker push {r4-r11,lr} 116*c0909341SAndroid Build Coastguard Worker ldrd r4, r5, [sp, #36] 117*c0909341SAndroid Build Coastguard Worker ldrd r6, r7, [sp, #44] 118*c0909341SAndroid Build Coastguard Worker 119*c0909341SAndroid Build Coastguard Worker vmov.i8 d30, #0 120*c0909341SAndroid Build Coastguard Worker vld1.8 {d31}, [r3] 121*c0909341SAndroid Build Coastguard Worker adr r8, L(save_tmvs_tbl) 122*c0909341SAndroid Build Coastguard Worker movrel_local lr, mask_mult 123*c0909341SAndroid Build Coastguard Worker movrel_local r12, mv_tbls 124*c0909341SAndroid Build Coastguard Worker vld1.8 {d29}, [lr] 125*c0909341SAndroid Build Coastguard Worker vext.8 d31, d30, d31, #7 // [0, ref_sign] 126*c0909341SAndroid Build Coastguard Worker mov r3, #5 127*c0909341SAndroid Build Coastguard Worker mul r1, r1, r3 // stride *= 5 128*c0909341SAndroid Build Coastguard Worker sub r5, r5, r7 // h = row_end8 - row_start8 129*c0909341SAndroid Build Coastguard Worker lsl r7, r7, #1 // row_start8 <<= 1 130*c0909341SAndroid Build Coastguard Worker1: 131*c0909341SAndroid Build Coastguard Worker mov r3, #5 132*c0909341SAndroid Build Coastguard Worker mov r11, #12*2 133*c0909341SAndroid Build Coastguard Worker and r9, r7, #30 // (y & 15) * 2 134*c0909341SAndroid Build Coastguard Worker ldr r9, [r2, r9, lsl #2] // b = rr[(y & 15) * 2] 135*c0909341SAndroid Build Coastguard Worker add r9, r9, #12 // &b[... + 1] 136*c0909341SAndroid Build Coastguard Worker mla r10, r4, r11, r9 // end_cand_b = &b[col_end8*2 + 1] 137*c0909341SAndroid Build Coastguard Worker mla r9, r6, r11, r9 // cand_b = &b[x*2 + 1] 138*c0909341SAndroid Build Coastguard Worker 139*c0909341SAndroid Build Coastguard Worker mla r3, r6, r3, r0 // &rp[x] 140*c0909341SAndroid Build Coastguard Worker 141*c0909341SAndroid Build Coastguard Worker push {r2,r4,r6} 142*c0909341SAndroid Build Coastguard Worker 143*c0909341SAndroid Build Coastguard Worker2: 144*c0909341SAndroid Build Coastguard Worker ldrb r11, [r9, #10] // cand_b->bs 145*c0909341SAndroid Build Coastguard Worker add lr, r9, #8 146*c0909341SAndroid Build Coastguard Worker vld1.8 {d0, d1}, [r9] // cand_b->mv 147*c0909341SAndroid Build Coastguard Worker add r11, r8, r11, lsl #3 148*c0909341SAndroid Build Coastguard Worker vld1.16 {d2[]}, [lr] // cand_b->ref 149*c0909341SAndroid Build Coastguard Worker ldrh lr, [r11] // bw8 150*c0909341SAndroid Build Coastguard Worker mov r2, r8 151*c0909341SAndroid Build Coastguard Worker add r9, r9, lr, lsl #1 // cand_b += bw8*2 152*c0909341SAndroid Build Coastguard Worker cmp r9, r10 153*c0909341SAndroid Build Coastguard Worker vmov d4, d0 154*c0909341SAndroid Build Coastguard Worker bge 3f 155*c0909341SAndroid Build Coastguard Worker 156*c0909341SAndroid Build Coastguard Worker ldrb r2, [r9, #10] // cand_b->bs 157*c0909341SAndroid Build Coastguard Worker add lr, r9, #8 158*c0909341SAndroid Build Coastguard Worker vld1.8 {d6, d7}, [r9] // cand_b->mv 159*c0909341SAndroid Build Coastguard Worker add r2, r8, r2, lsl #3 160*c0909341SAndroid Build Coastguard Worker vld1.16 {d2[1]}, [lr] // cand_b->ref 161*c0909341SAndroid Build Coastguard Worker ldrh lr, [r2] // bw8 162*c0909341SAndroid Build Coastguard Worker add r9, r9, lr, lsl #1 // cand_b += bw8*2 163*c0909341SAndroid Build Coastguard Worker vmov d5, d6 164*c0909341SAndroid Build Coastguard Worker 165*c0909341SAndroid Build Coastguard Worker3: 166*c0909341SAndroid Build Coastguard Worker vabs.s16 q2, q2 // abs(mv[].xy) 167*c0909341SAndroid Build Coastguard Worker vtbl.8 d2, {d31}, d2 // ref_sign[ref] 168*c0909341SAndroid Build Coastguard Worker vshr.u16 q2, q2, #12 // abs(mv[].xy) >> 12 169*c0909341SAndroid Build Coastguard Worker vmull.u8 q1, d2, d29 // ref_sign[ref] * {1, 2} 170*c0909341SAndroid Build Coastguard Worker vceq.i32 q2, q2, #0 // abs(mv[].xy) <= 4096 171*c0909341SAndroid Build Coastguard Worker vmovn.i32 d4, q2 // abs() condition to 16 bit 172*c0909341SAndroid Build Coastguard Worker vand d2, d2, d4 // h[0-3] contains conditions for mv[0-1] 173*c0909341SAndroid Build Coastguard Worker vpadd.i16 d2, d2, d2 // Combine condition for [1] and [0] 174*c0909341SAndroid Build Coastguard Worker vmov.u16 r4, d2[0] // Extract case for first block 175*c0909341SAndroid Build Coastguard Worker vmov.u16 r6, d2[1] 176*c0909341SAndroid Build Coastguard Worker ldr r11, [r11, #4] // Fetch jump table entry 177*c0909341SAndroid Build Coastguard Worker ldr r2, [r2, #4] 178*c0909341SAndroid Build Coastguard Worker add r4, r12, r4, lsl #4 179*c0909341SAndroid Build Coastguard Worker add r6, r12, r6, lsl #4 180*c0909341SAndroid Build Coastguard Worker vld1.8 {d2, d3}, [r4] // Load permutation table base on case 181*c0909341SAndroid Build Coastguard Worker vld1.8 {d4, d5}, [r6] 182*c0909341SAndroid Build Coastguard Worker add r11, r8, r11 // Find jump table target 183*c0909341SAndroid Build Coastguard Worker add r2, r8, r2 184*c0909341SAndroid Build Coastguard Worker vtbl.8 d16, {d0, d1}, d2 // Permute cand_b to output refmvs_temporal_block 185*c0909341SAndroid Build Coastguard Worker vtbl.8 d17, {d0, d1}, d3 186*c0909341SAndroid Build Coastguard Worker vtbl.8 d18, {d6, d7}, d4 187*c0909341SAndroid Build Coastguard Worker vtbl.8 d19, {d6, d7}, d5 188*c0909341SAndroid Build Coastguard Worker vmov q0, q8 189*c0909341SAndroid Build Coastguard Worker 190*c0909341SAndroid Build Coastguard Worker // q1 follows on q0 (q8), with another 3 full repetitions of the pattern. 191*c0909341SAndroid Build Coastguard Worker vext.8 q1, q8, q8, #1 192*c0909341SAndroid Build Coastguard Worker vext.8 q10, q9, q9, #1 193*c0909341SAndroid Build Coastguard Worker // q2 ends with 3 complete repetitions of the pattern. 194*c0909341SAndroid Build Coastguard Worker vext.8 q2, q8, q1, #4 195*c0909341SAndroid Build Coastguard Worker vext.8 q11, q9, q10, #4 196*c0909341SAndroid Build Coastguard Worker 197*c0909341SAndroid Build Coastguard Worker blx r11 198*c0909341SAndroid Build Coastguard Worker bge 4f // if (cand_b >= end) 199*c0909341SAndroid Build Coastguard Worker vmov q0, q9 200*c0909341SAndroid Build Coastguard Worker vmov q1, q10 201*c0909341SAndroid Build Coastguard Worker vmov q2, q11 202*c0909341SAndroid Build Coastguard Worker cmp r9, r10 203*c0909341SAndroid Build Coastguard Worker blx r2 204*c0909341SAndroid Build Coastguard Worker blt 2b // if (cand_b < end) 205*c0909341SAndroid Build Coastguard Worker 206*c0909341SAndroid Build Coastguard Worker4: 207*c0909341SAndroid Build Coastguard Worker pop {r2,r4,r6} 208*c0909341SAndroid Build Coastguard Worker 209*c0909341SAndroid Build Coastguard Worker subs r5, r5, #1 // h-- 210*c0909341SAndroid Build Coastguard Worker add r7, r7, #2 // y += 2 211*c0909341SAndroid Build Coastguard Worker add r0, r0, r1 // rp += stride 212*c0909341SAndroid Build Coastguard Worker bgt 1b 213*c0909341SAndroid Build Coastguard Worker 214*c0909341SAndroid Build Coastguard Worker pop {r4-r11,pc} 215*c0909341SAndroid Build Coastguard Worker 216*c0909341SAndroid Build Coastguard Worker .align 2 217*c0909341SAndroid Build Coastguard WorkerL(save_tmvs_tbl): 218*c0909341SAndroid Build Coastguard Worker .word 16 * 12 219*c0909341SAndroid Build Coastguard Worker .word 160f - L(save_tmvs_tbl) + CONFIG_THUMB 220*c0909341SAndroid Build Coastguard Worker .word 16 * 12 221*c0909341SAndroid Build Coastguard Worker .word 160f - L(save_tmvs_tbl) + CONFIG_THUMB 222*c0909341SAndroid Build Coastguard Worker .word 8 * 12 223*c0909341SAndroid Build Coastguard Worker .word 80f - L(save_tmvs_tbl) + CONFIG_THUMB 224*c0909341SAndroid Build Coastguard Worker .word 8 * 12 225*c0909341SAndroid Build Coastguard Worker .word 80f - L(save_tmvs_tbl) + CONFIG_THUMB 226*c0909341SAndroid Build Coastguard Worker .word 8 * 12 227*c0909341SAndroid Build Coastguard Worker .word 80f - L(save_tmvs_tbl) + CONFIG_THUMB 228*c0909341SAndroid Build Coastguard Worker .word 8 * 12 229*c0909341SAndroid Build Coastguard Worker .word 80f - L(save_tmvs_tbl) + CONFIG_THUMB 230*c0909341SAndroid Build Coastguard Worker .word 4 * 12 231*c0909341SAndroid Build Coastguard Worker .word 40f - L(save_tmvs_tbl) + CONFIG_THUMB 232*c0909341SAndroid Build Coastguard Worker .word 4 * 12 233*c0909341SAndroid Build Coastguard Worker .word 40f - L(save_tmvs_tbl) + CONFIG_THUMB 234*c0909341SAndroid Build Coastguard Worker .word 4 * 12 235*c0909341SAndroid Build Coastguard Worker .word 40f - L(save_tmvs_tbl) + CONFIG_THUMB 236*c0909341SAndroid Build Coastguard Worker .word 4 * 12 237*c0909341SAndroid Build Coastguard Worker .word 40f - L(save_tmvs_tbl) + CONFIG_THUMB 238*c0909341SAndroid Build Coastguard Worker .word 2 * 12 239*c0909341SAndroid Build Coastguard Worker .word 20f - L(save_tmvs_tbl) + CONFIG_THUMB 240*c0909341SAndroid Build Coastguard Worker .word 2 * 12 241*c0909341SAndroid Build Coastguard Worker .word 20f - L(save_tmvs_tbl) + CONFIG_THUMB 242*c0909341SAndroid Build Coastguard Worker .word 2 * 12 243*c0909341SAndroid Build Coastguard Worker .word 20f - L(save_tmvs_tbl) + CONFIG_THUMB 244*c0909341SAndroid Build Coastguard Worker .word 2 * 12 245*c0909341SAndroid Build Coastguard Worker .word 20f - L(save_tmvs_tbl) + CONFIG_THUMB 246*c0909341SAndroid Build Coastguard Worker .word 2 * 12 247*c0909341SAndroid Build Coastguard Worker .word 20f - L(save_tmvs_tbl) + CONFIG_THUMB 248*c0909341SAndroid Build Coastguard Worker .word 1 * 12 249*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 250*c0909341SAndroid Build Coastguard Worker .word 1 * 12 251*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 252*c0909341SAndroid Build Coastguard Worker .word 1 * 12 253*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 254*c0909341SAndroid Build Coastguard Worker .word 1 * 12 255*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 256*c0909341SAndroid Build Coastguard Worker .word 1 * 12 257*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 258*c0909341SAndroid Build Coastguard Worker .word 1 * 12 259*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 260*c0909341SAndroid Build Coastguard Worker .word 1 * 12 261*c0909341SAndroid Build Coastguard Worker .word 10f - L(save_tmvs_tbl) + CONFIG_THUMB 262*c0909341SAndroid Build Coastguard Worker 263*c0909341SAndroid Build Coastguard Worker10: 264*c0909341SAndroid Build Coastguard Worker add r4, r3, #4 265*c0909341SAndroid Build Coastguard Worker vst1.32 {d0[0]}, [r3] 266*c0909341SAndroid Build Coastguard Worker vst1.8 {d0[4]}, [r4] 267*c0909341SAndroid Build Coastguard Worker add r3, r3, #5 268*c0909341SAndroid Build Coastguard Worker bx lr 269*c0909341SAndroid Build Coastguard Worker20: 270*c0909341SAndroid Build Coastguard Worker add r4, r3, #8 271*c0909341SAndroid Build Coastguard Worker vst1.8 {d0}, [r3] 272*c0909341SAndroid Build Coastguard Worker vst1.16 {d1[0]}, [r4] 273*c0909341SAndroid Build Coastguard Worker add r3, r3, #2*5 274*c0909341SAndroid Build Coastguard Worker bx lr 275*c0909341SAndroid Build Coastguard Worker40: 276*c0909341SAndroid Build Coastguard Worker add r4, r3, #16 277*c0909341SAndroid Build Coastguard Worker vst1.8 {q0}, [r3] 278*c0909341SAndroid Build Coastguard Worker vst1.32 {d2[0]}, [r4] 279*c0909341SAndroid Build Coastguard Worker add r3, r3, #4*5 280*c0909341SAndroid Build Coastguard Worker bx lr 281*c0909341SAndroid Build Coastguard Worker80: 282*c0909341SAndroid Build Coastguard Worker add r4, r3, #(8*5-16) 283*c0909341SAndroid Build Coastguard Worker // This writes 6 full entries plus 2 extra bytes 284*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r3] 285*c0909341SAndroid Build Coastguard Worker // Write the last few, overlapping with the first write. 286*c0909341SAndroid Build Coastguard Worker vst1.8 {q2}, [r4] 287*c0909341SAndroid Build Coastguard Worker add r3, r3, #8*5 288*c0909341SAndroid Build Coastguard Worker bx lr 289*c0909341SAndroid Build Coastguard Worker160: 290*c0909341SAndroid Build Coastguard Worker add r4, r3, #6*5 291*c0909341SAndroid Build Coastguard Worker add r6, r3, #12*5 292*c0909341SAndroid Build Coastguard Worker // This writes 6 full entries plus 2 extra bytes 293*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r3] 294*c0909341SAndroid Build Coastguard Worker // Write another 6 full entries, slightly overlapping with the first set 295*c0909341SAndroid Build Coastguard Worker vst1.8 {q0, q1}, [r4] 296*c0909341SAndroid Build Coastguard Worker add r4, r3, #(16*5-16) 297*c0909341SAndroid Build Coastguard Worker // Write 8 bytes (one full entry) after the first 12 298*c0909341SAndroid Build Coastguard Worker vst1.8 {d0}, [r6] 299*c0909341SAndroid Build Coastguard Worker // Write the last 3 entries 300*c0909341SAndroid Build Coastguard Worker vst1.8 {q2}, [r4] 301*c0909341SAndroid Build Coastguard Worker add r3, r3, #16*5 302*c0909341SAndroid Build Coastguard Worker bx lr 303*c0909341SAndroid Build Coastguard Workerendfunc 304