xref: /aosp_15_r20/external/libdav1d/src/arm/32/refmvs.S (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
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