xref: /aosp_15_r20/external/libhevc/common/arm/ihevc_resi_trans_32x32_a9q.s (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1@/******************************************************************************
2@ *
3@ * Copyright (C) 2018 The Android Open Source Project
4@ *
5@ * Licensed under the Apache License, Version 2.0 (the "License");
6@ * you may not use this file except in compliance with the License.
7@ * You may obtain a copy of the License at:
8@ *
9@ * http://www.apache.org/licenses/LICENSE-2.0
10@ *
11@ * Unless required by applicable law or agreed to in writing, software
12@ * distributed under the License is distributed on an "AS IS" BASIS,
13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14@ * See the License for the specific language governing permissions and
15@ * limitations under the License.
16@ *
17@ *****************************************************************************
18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19@*/
20@/**
21@ *******************************************************************************
22@ * @file
23@ *  ihevc_resi_trans_32x32.s
24@ *
25@ * @brief
26@ *  Contains function definitions for forward transform 32x32
27@ *
28@ * @author
29@ * Mohit
30@ *
31@ * @par List of Functions:
32@ *  - ihevc_resi_trans_32x32()
33@ *
34@ * @remarks
35@ *  None
36@ *
37@ *******************************************************************************
38@*/
39@*/
40.text
41.p2align 2
42
43.extern g_ai2_ihevc_trans_32
44.extern g_ai4_ihevc_trans_32
45
46g_ai2_ihevc_trans_32_addr_1:
47.long g_ai2_ihevc_trans_32 - ulbl1 - 8
48
49g_ai2_ihevc_trans_32_addr_2:
50.long g_ai2_ihevc_trans_32 - ulbl2 - 8
51
52g_ai4_ihevc_trans_32_addr:
53.long g_ai4_ihevc_trans_32 - ulbl3 - 8
54
55@*/
56@*/
57@/**
58@*/ *******************************************************************************
59@*/
60@*/@brief
61@*/  This function performs residue calculation and forward  transform on
62@*/ input pixels
63@*/
64@*/@par Description:
65@*/ Performs residue calculation by subtracting source and  prediction and
66@*/ followed by forward transform
67@*/
68@*/ @param[in] pu1_src
69@*/  Input 32x32 pixels
70@*/
71@*/ @param[in] pu1_pred
72@*/  Prediction data
73@*/
74@*/ @param[in] pi2_tmp
75@*/  Temporary buffer of size 16x16
76@*/
77@*/ @param[out] pi2_dst
78@*/  Output 32x32 coefficients
79@*/
80@*/ @param[in] src_strd
81@*/  Input stride
82@*/
83@*/ @param[in] pred_strd
84@*/  Prediction Stride
85@*/
86@*/ @param[in] dst_strd
87@*/  Output Stride
88@*/
89@*/ @param[in] chroma plane (unused)
90@*/  Chroma plane
91@*/
92@*/ @returns  Void
93@*/
94@*/ @remarks
95@*/  None
96@*/
97@*/*******************************************************************************
98@*/
99  .global ihevc_resi_trans_32x32_a9q
100ihevc_resi_trans_32x32_a9q:
101
102.equ TMP_STRIDE_32      ,  128              @16*4, Stride of tmp register
103.equ SHIFT_32           ,  15               @shift = 15; // log2(iWidth) - 1 + g_uiBitIncrement
104
105.equ COFF_STD_2B_32     ,  64               @Stride for g_ai2_ihevc_trans_32 in bytes
106.equ COFF_STD_W_32      ,  64               @Stride for g_ai4_ihevc_trans_32 in bytes
107
108@LOAD the function
109    STMFD       SP!,{r4-r12,LR}     @stack store values of the arguments
110    vpush       {d8 - d15}
111    SUB         SP,SP,#32
112
113    LDR         R4,[SP,#136]            @get src_strd
114    LDR         R5,[SP,#140]            @get pred_strd
115    LDR         R6,[SP,#144]            @get dst_strd
116
117    MOV R8,#0                       @Set loop counter
118    LDR R9,g_ai2_ihevc_trans_32_addr_1    @get 16 bit transform matrix
119ulbl1:
120    ADD R9, R9, PC
121
122    @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1] values of g_ai2_ihevc_trans_32
123    @and write to stack
124    MOV R12,#COFF_STD_2B_32
125    LSL R12,#3
126
127    VLD1.S32 D30[0],[R9],R12
128    VLD1.S32 D30[1],[R9],R12        @ D30 - [0 0] [0 1] [8 0] [8 1]
129    VLD1.S32 D31[0],[R9],R12
130    VLD1.S32 D31[1],[R9],R12        @ D31 - [16 0] [16 1] [24 0] [24 1]
131
132    VTRN.S32 D30,D31                @ D30 - [0 0] [0 1] [16 0] [16 1]
133    VTRN.S16 D30,D31                @ D31 - [8 0] [8 1] [24 0] [24 1]
134    VST1.S16 {D30,D31},[SP]
135
136    LDR R9,g_ai2_ihevc_trans_32_addr_2    @get 16 bit transform matrix
137ulbl2:
138    ADD R9, R9, PC
139
140    MOV R7,#TMP_STRIDE_32
141
142    VMOV.S32 Q14,#0
143
144@R0     pu1_src
145@R1     pu1_pred
146@R2     pi4_tmp
147@R3     pi2_dst
148@R4     src_strd - 16
149@R5     pred_strd - 16
150@R6     dst_strd
151@R7     tmp_dst Nx4 block stride
152@R8     loop cntr
153@R9     g_ai2_ihevc_trans_32
154@R10    tmp_dst Nx4 block offset
155@R11    tmp register
156@R12    ------
157@R14    ------.
158@q14    shift 32 bit
159@q15    add 32 bit
160
161    SUB R4, R4, #16
162    SUB R5, R5, #16
163CORE_LOOP_32X32_HORIZ:
164
165    VLD1.U8 {D0,D1},[R0]!           @LOAD 1-16 src row 1
166
167    VLD1.U8 {D4,D5},[R1]!           @LOAD 1-16 pred row 1
168
169    VLD1.U8 {D2,D3},[R0],R4         @LOAD 17-32 src row 1
170    @ Residue calculation
171    VSUBL.U8 Q8,D0,D4           @ Get residue 1-8 row 1 -- dual issued with prev. instr. 2nd cycle
172
173    VLD1.U8 {D6,D7},[R1],R5         @LOAD 17-32 pred row 1
174    VSUBL.U8 Q9,D1,D5           @ Get residue 9-16 row 1 -- dual issue
175
176    VLD1.U8 {D8,D9},[R0]!           @ LOAD 1-16 src row 2
177    VSUBL.U8 Q10,D2,D6          @ Get residue 17-24 row 1 -- dual issue
178
179    VLD1.U8 {D12,D13},[R1]!         @ LOAD 1-16 pred row 2
180    VSUBL.U8 Q11,D3,D7          @ Get residue 25-32 row 1 -- dual issue
181
182    VLD1.U8 {D10,D11},[R0],R4           @ LOAD 17-32 src row 2
183    @ Residue - Row 2
184    VSUBL.U8 Q12,D8,D12         @ Get residue 1-8 row 2 -- dual issue
185
186    VLD1.U8 {D14,D15},[R1],R5           @ LOAD 17-32 pred row 2
187    VSUBL.U8 Q13,D9,D13         @ Get residue 9-16 row 2 -- dual issue
188    @ Get blk sads
189    VABDL.U8 Q15,D0,D4
190    VABAL.U8 Q15,D1,D5
191    VABAL.U8 Q15,D2,D6
192    VABAL.U8 Q15,D3,D7
193    VABAL.U8 Q15,D8,D12
194    VABAL.U8 Q15,D9,D13
195    VABAL.U8 Q15,D10,D14
196    VABAL.U8 Q15,D11,D15
197    VADDW.S16 Q14,Q14,D30
198    VADDW.S16 Q14,Q14,D31
199    @ SAD Ends
200
201    VREV64.S16 Q10,Q10          @ Rev 17-24 row 1 -- dual issue
202    VSUBL.U8 Q2,D10,D14         @ Get residue 17-24 row 2
203    VREV64.S16 Q11,Q11          @ Rev 25-32 row 1 -- dual issue
204    VSUBL.U8 Q3,D11,D15         @ Get residue 25-32 row 2
205
206    VSWP D20,D21                @ Q10: 24 23 22 21 20 19 18 17 row 1
207    VSWP D22,D23                @ Q11: 32 31 30 29 28 27 26 25 row 1
208
209    VREV64.S16 Q2,Q2            @ Rev 17-24 row 2
210    VADD.S16 Q5, Q9,Q10         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 1 -- dual issue
211    VREV64.S16 Q3,Q3            @ Rev 25-32 row 2
212    VADD.S16 Q4, Q8,Q11         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 1 -- dual issue
213    VSWP D4,D5                  @ Q2: 24 23 22 21 20 19 18 17 row 2
214    VSUB.S16 Q6, Q8,Q11         @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 1 -- dual issue
215    VSWP D6,D7                  @ Q3: 32 31 30 29 28 27 26 25 row 2
216    VSUB.S16 Q7, Q9,Q10         @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 1 -- dual issue
217
218    VREV64.16 Q5, Q5            @ Rev 9-16 of e[k], row 1
219    VADD.S16 Q9, Q13,Q2         @ e[k] = resi_tmp_1 + resi_tmp_2  k ->9-16 row 2 -- dual issue
220    VADD.S16 Q8, Q12,Q3         @ e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-8 row 2
221    VSWP D10, D11               @ Q5: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
222    VSUB.S16 Q10, Q12,Q3        @ o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-8 row 2 -- dual issue
223    VREV64.16 Q9, Q9            @ Rev 9-16 of e[k], row 2
224    VSUB.S16 Q11, Q13,Q2        @ o[k] = resi_tmp_1 - resi_tmp_2  k ->9-16 row 2 -- dual issue
225
226    VADD.S16 Q0, Q4, Q5         @ ee[k] = e[k] + e[16-k] k->1-8 row 1
227    VSWP D18, D19               @ Q9: e[16] e[15] e[14] e[13] e[12] e[11] e[10] e[9]
228    VSUB.S16 Q1, Q4, Q5         @ eo[k] = e[k] - e[16-k] k->1-8 row 1 -- dual issue
229
230    VREV64.S16  D8,D1           @ rev ee[k] k-> 4-7 row 1
231    VADD.S16 Q2, Q8, Q9         @ ee[k] = e[k] + e[16-k] k->1-8 row 2 -- dual issue
232    VSUB.S16 Q3, Q8, Q9         @ eo[k] = e[k] - e[16-k] k->1-8 row 2
233    VMOV.S16    D1,D4
234    VREV64.S16  D9,D5           @ rev ee[k] k-> 4-7 row 2
235
236    @ arrangement OF DATA
237    @ Q0    A1 A2 A3 A4 B1 B2 B3 B4
238    @ Q4    A8 A7 A6 A5 B8 B7 B6 B5
239    @---------------Process EEO starts--------------------
240    MOV R12,#COFF_STD_2B_32     @Get stride of coeffs
241
242    ADD R11,R9,R12,LSL #2       @Load address of g_ai2_ihevc_trans_32[4]
243    LSL R12,R12,#3
244
245    VADD.S16 Q13, Q0, Q4        @ eee[k] = ee[k] + ee[7 - k] row 1 & 2
246    VLD1.S16 D24,[R11],R12      @ LOAD g_ai2_ihevc_trans_32[4][0-4]
247    VSUB.S16 Q0, Q0 ,Q4         @ eeo[k] = ee[k] - ee[7 - k] row 1 & 2  -- dual issue
248
249    @ D26 R1eee[0] R1eee[1] R1eee[2] R1eee[3]
250    @ D27 R2eee[0] R2eee[1] R2eee[2] R2eee[3]
251    VTRN.S32 D26,D27
252    @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
253    @ D27 R1eee[2] R1eee[3] R2eee[2] R2eee[3]
254    VREV32.16 D4,D27
255    @ D26 R1eee[0] R1eee[1] R2eee[0] R2eee[1]
256    @ D4 R1eee[3] R1eee[2] R2eee[3] R2eee[2]
257    VMOV.S16 D27,D26
258    VNEG.S16 D5,D4
259
260    @ Q13 R1eee[0] R1eee[1] R2eee[0] R2eee[1]  R1eee[0]  R1eee[1]  R2eee[0]  R2eee[1]
261    @ Q2  R1eee[3] R1eee[2] R2eee[3] R2eee[2] -R1eee[3] -R1eee[2] -R2eee[3] -R2eee[2]
262    @ 1- cycle stall?
263    VADD.S16 Q2,Q13,Q2
264    @ Q2 R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1] R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]
265
266    @ Q2  R1eeee[0] R1eeee[1] R2eeee[0] R2eeee[1]
267    @    R1eeeo[0] R1eeeo[1] R2eeeo[0] R2eeeo[1]
268    VMULL.S16 Q15,D24,D0            @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R1 -- dual issue
269    VTRN.S16 D4,D5
270    @ Q2  R1eeee[0] R1eeeo[0] R2eeee[0] R2eeeo[0]
271    @    R1eeee[1] R1eeeo[1] R2eeee[1] R2eeeo[1]
272    @ 1-cycle stall?
273    VDUP.S32 D8,D4[0]               @ R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0]
274    VDUP.S32 D9,D4[1]               @ R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0]
275    VDUP.S32 D10,D5[0]              @ R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
276    VDUP.S32 D11,D5[1]              @ R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]
277
278    @D4 : [0 0] [8 0] [16 0] [24 0]
279    @D5 : [0 1] [8 1] [16 1] [24 1]
280    VLD1.S16 {D4,D5},[SP]               @   [0 0] [8 0] [16 0] [24 0] [0 1] [8 1] [16 1] [24 1]
281    VMULL.S16 Q8,D8,D4              @   g_ai2_ihevc_trans_32 * R1eeee[0] R1eeeo[0] R1eeee[0] R1eeeo[0] -- dual issue 2nd cycle
282    VMLAL.S16 Q8,D10,D5             @ + g_ai2_ihevc_trans_32 * R1eeee[1] R1eeeo[1] R1eeee[1] R1eeeo[1]
283    VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[12][0-4] -- 1st cycle dual issue with prev. MLAL
284    VMULL.S16 Q9,D9,D4              @   g_ai2_ihevc_trans_32 * R2eeee[0] R2eeeo[0] R2eeee[0] R2eeeo[0] -- dual issue 2nd cycle
285    VMLAL.S16 Q9,D11,D5             @ + g_ai2_ihevc_trans_32 * R2eeee[1] R2eeeo[1] R2eeee[1] R2eeeo[1]
286
287    VMULL.S16 Q4,D24,D1             @g_ai2_ihevc_trans_32[4][0-4] * eeo[0-4]    R2
288
289    VMULL.S16 Q5,D27,D0             @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R1
290    VZIP.S32 Q8,Q9                  @ 3-cycle instruction -- 1st cycle dual issued
291    @These values must go to 0 8 16 24 rows hence we need stride *8
292    LSL R10,R7,#3
293    VMULL.S16 Q12,D27,D1            @g_ai2_ihevc_trans_32[12][0-4] * eeo[0-4]   R2
294    VST1.32 D16,[R2],R10            @ -- dual issued
295
296    VST1.32 D17,[R2],R10
297
298    VLD1.S16 D26,[R11],R12          @LOAD g_ai2_ihevc_trans_32[20][0-4]
299
300    VMULL.S16 Q8,D26,D1             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R2
301    VST1.32 D18,[R2],R10            @ -- dual issued
302
303    VST1.32 D19,[R2],R10
304
305    SUB R2,R2,R10,LSL #2
306    @----------------------------Process EEEO ends----------------------------------------
307
308    VLD1.S16 D27,[R11],R12          @LOAD g_ai2_ihevc_trans_32[28][0-4]
309    VMULL.S16 Q9,D26,D0             @g_ai2_ihevc_trans_32[20][0-4] * eeo[0-4] R1
310
311    VMULL.S16 Q2,D27,D1             @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R2
312    @transpose the 4x4 matrix row1
313    VTRN.32 Q15, Q5                 @R1 transpose1  -- dual issue
314    VMULL.S16 Q13,D27,D0            @g_ai2_ihevc_trans_32[28][0-4] * eeo[0-4] R1
315
316    @transpose the 4x4 matrix row2
317    VTRN.32 Q4,Q12                  @R2 transpose1
318    VTRN.32 Q8,Q2                   @R2 transpose1
319
320    @-----------------------Processing EO ----------------------------
321    MOV R12,#COFF_STD_2B_32         @Get coeffs stride
322    ADD R11,R9,R12,LSL #1           @Load address of g_ai2_ihevc_trans_32[2]
323    LSL R12,R12,#2
324    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[2][0-7]
325
326    VSWP    D4,D25                  @R2 transpose2
327    VSWP    D16,D9                  @R2 transpose2
328
329    VADD.S32 Q4,Q4,Q12              @R2 add -- dual issue 1st cycle
330    VTRN.32 Q9, Q13                 @R1 transpose1
331    VADD.S32 Q8,Q8,Q2               @R2 add -- dual issue 2nd cycle
332
333    VSWP    D18,D31                 @R1 transpose2
334    VMULL.S16 Q2,D2,D0              @eo[0][0-3]*  R1 -- dual issue
335    VMLAL.S16 Q2,D3,D1              @eo[0][4-7]*  R1
336
337    VSWP    D26,D11                 @R1 transpose2
338    VADD.S32 Q8,Q4,Q8               @R2 add -- dual issue
339
340    VADD.S32 Q15,Q15,Q9             @R1 add
341    VADD.S32 Q5,Q5,Q13              @R1 add
342    VMULL.S16 Q4,D6,D0              @eo[0][0-3]*  R2
343    VMLAL.S16 Q4,D7,D1              @eo[0][4-7]*  R2
344    VADD.S32 Q15,Q15,Q5             @R1 add
345
346    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[6][0-7]
347
348    VMULL.S16 Q5,D2,D0              @eo[1][0-3]*  R1
349    VMLAL.S16 Q5,D3,D1              @eo[1][4-7]*  R1
350
351
352    VZIP.S32 Q15,Q8                 @ 3-cycle instruction
353    VMULL.S16 Q13,D6,D0             @eo[1][0-3]*  R2 -- dual issue
354    VMLAL.S16 Q13,D7,D1             @eo[1][4-7]*  R2
355
356    VLD1.S16 {D0,D1},[R11],R12          @g_ai2_ihevc_trans_32[10][0-7] -- dual issue with prev. MLAL
357
358    @write to memory
359    @this should go to 4 12 20 28
360    LSL R10,R7,#3
361    ADD R2,R2,R7,LSL #2             @move to fifth row
362    VST1.32 D30,[R2],R10
363    VMULL.S16 Q9,D2,D0              @eo[2][0-3]*  R1 -- dual issue
364    VMLAL.S16 Q9,D3,D1              @eo[2][4-7]*  R1
365    VST1.32 D31,[R2],R10            @ 1st cycle dual issued with MLAL
366
367    VST1.32 D16,[R2],R10
368    VMULL.S16 Q12,D6,D0             @eo[2][0-3]*  R2 -- dual issue
369    VMLAL.S16 Q12,D7,D1             @eo[2][4-7]*  R2
370    VST1.32 D17,[R2],R10            @ 1st cycle dual issued with MLAL
371
372    SUB R2,R2,R10,LSL #2
373    SUB R2,R2,R7,LSL #2
374    @--------------------Done procrssing EEO -------------------------
375
376    VLD1.S16 {D0,D1},[R11],R12  @g_ai2_ihevc_trans_32[14][0-7]
377
378    VMULL.S16 Q8,D2,D0      @eo[3][0-3]*  R1
379    VMLAL.S16 Q8,D3,D1      @eo[3][4-7]*  R1
380
381    @transpose the 4x4 matrix R1
382    VTRN.32 Q2, Q5          @
383    VMULL.S16 Q15,D6,D0     @eo[3][0-3]*  R2 -- dual issued with 2nd cycle of TRN
384    VMLAL.S16 Q15,D7,D1     @eo[3][4-7]*  R2
385    VTRN.32 Q9, Q8          @ 1st cycle dual issued
386    @transpose the 4x4 matrix R2
387    VTRN.32 Q4,Q13
388
389    VSWP    D18, D5         @ R1
390    VSWP    D16, D11        @ R1
391    VADD.S32 Q2, Q2, Q5     @ R1
392    VADD.S32 Q9, Q9, Q8     @ R1
393    VTRN.32 Q12,Q15         @ R2 -- dual issue
394    VADD.S32 Q9, Q2, Q9     @ R1
395
396    VSWP    D24,D9          @ R2
397    VSWP    D30,D27         @ R2
398
399    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[18][0-7]
400
401    VADD.S32 Q4, Q4, Q13    @ R2
402    VADD.S32 Q12, Q12, Q15  @ R2
403    VMULL.S16 Q0,D2,D4      @eo[4][0-3]*  R1
404    VMLAL.S16 Q0,D3,D5      @eo[4][4-7]*  R1
405    VADD.S32 Q12, Q4, Q12   @ R2
406
407    VZIP.S32 Q9,Q12         @ 3-cycle
408    VMULL.S16 Q4,D6,D4      @eo[0][0-3]*  R2  -- dual issue
409    VMLAL.S16 Q4,D7,D5      @eo[0][4-7]*  R2
410
411    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[22][0-7] -- 1st cycle dual issued with prev. instr
412
413    @write to memory
414    @this should go to 2 6 10 14
415    ADD R2,R2,R7, LSL #1
416    LSL R7,R7,#2
417    VST1.32 D18,[R2],R7
418    VMULL.S16 Q5,D2,D4      @eo[5][0-3]*  R1  -- dual issue
419    VMLAL.S16 Q5,D3,D5      @eo[5][4-7]*  R1
420    VST1.32 D19,[R2],R7     @ 1st cycle dual issued with prev. instr
421
422    VST1.32 D24,[R2],R7
423    VMULL.S16 Q8,D6,D4      @eo[0][0-3]*  R2  -- dual issue
424    VMLAL.S16 Q8,D7,D5      @eo[0][4-7]*  R2
425    VST1.32 D25,[R2],R7     @ 1st cycle dual issued with prev. instr
426
427
428    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[26][0-7]
429    VMULL.S16 Q9,D2,D4      @eo[6][0-3]*  R1
430    VMLAL.S16 Q9,D3,D5      @eo[6][4-7]*  R1
431    VMULL.S16 Q12,D6,D4     @eo[0][0-3]*  R2
432    VMLAL.S16 Q12,D7,D5     @eo[0][4-7]*  R2
433
434    VLD1.S16 {D4,D5},[R11],R12  @g_ai2_ihevc_trans_32[30][0-7]
435    VMULL.S16 Q13,D2,D4     @eo[7][0-3]*  R1
436    VMLAL.S16 Q13,D3,D5     @eo[7][4-7]*  R1
437    VMULL.S16 Q15,D6,D4     @eo[0][0-3]*  R2
438    VMLAL.S16 Q15,D7,D5     @eo[0][4-7]*  R2
439
440    @-----------------------Processing O ----------------------------
441    MOV R12,#COFF_STD_2B_32 @Get coeffs stride
442    LSL R12,R12,#1
443    ADD R11,R9,#COFF_STD_2B_32  @Get address of g_ai2_ihevc_trans_32[1]
444    SUB R12, R12, #16
445
446    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[1][0-7]
447
448    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[1][8-15]
449    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2 -- dual issue
450    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
451    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
452    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
453
454    @transpose the 4x4 matrix R1
455    VTRN.32 Q0, Q5          @ R1
456    VTRN.32 Q9,Q13          @ R1
457    @transpose the 4x4 matrix R2
458    VTRN.32 Q4,Q8           @ R2
459    VSWP    D18, D1         @ R1
460    VSWP    D26, D11        @ R1
461    VTRN.32 Q12,Q15         @ R2
462    VADD.S32 Q0, Q0, Q5     @ R1 -- dual issue
463    VADD.S32 Q9, Q9, Q13    @ R1
464
465    VSWP    D24,D9          @ R2
466    VSWP    D30,D17         @ R2
467    VADD.S32 Q9, Q0, Q9     @ R1 -- dual issue
468
469    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
470    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
471    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
472    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
473
474    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[3][0-7]
475    VADD.S32 Q4, Q4, Q8     @ R2 -- dual issue
476    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[3][8-15]
477    VADD.S32 Q12, Q12, Q15  @ R2 -- dual issue
478
479    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2
480    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
481    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
482    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
483    VADD.S32 Q12, Q4, Q12   @ R2
484
485    VZIP.S32 Q9,Q12
486    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
487    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
488    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
489    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
490
491    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[5][0-7] -- 1st cycle dual issued with prev. instr
492
493    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[5][8-15]
494    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue with 2nd cycle
495    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
496    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
497    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
498    @this should go to 18 22 26 30
499    VST1.32 D18,[R2],R7     @1st cycle dual issue
500
501    VST1.32 D19,[R2],R7
502
503    VST1.32 D24,[R2],R7
504    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
505    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
506    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
507    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
508
509    VST1.32 D25,[R2],R7     @ 1st cycle dual issue
510
511    SUB R2,R2,R7, LSL #3
512    LSR R7,R7,#2
513    SUB R2,R2,R7, LSL #1
514    @--------------------Done Processing EO--------------------------
515
516
517    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[7][0-7]
518
519    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[7][8-15]
520    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
521    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
522    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
523    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
524    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
525    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
526    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
527    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
528
529    @transpose the 4x4 matrix R1
530    VTRN.32 Q0, Q4          @ R1
531    VTRN.32 Q8, Q12         @ R1
532    @transpose the 4x4 matrix R2
533    VTRN.32 Q1, Q5          @ R2
534    VSWP    D16, D1         @ R1
535    VSWP    D24, D9         @ R1
536
537    VTRN.32 Q9, Q13         @ R2
538    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
539    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[9][0-7]
540    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
541
542    VSWP    D18, D3         @ R2
543    VSWP    D26, D11        @ R2
544    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[9][8-15]
545    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue
546
547    VADD.S32 Q1, Q1, Q5     @ R2
548    VADD.S32 Q9, Q9, Q13    @ R2
549
550    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
551    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
552    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
553    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
554    VADD.S32 Q9, Q1, Q9     @ R2
555
556    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
557    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
558    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
559    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
560
561    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[11][0-7] -- 1st cycle dual issue
562    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[11][8-15]
563
564    VZIP.S32 Q8, Q9
565
566    @write to memory
567    @this should go to 1 3 5 7
568    ADD R2,R2,R7
569    LSL R7,R7,#1
570    VST1.32 D16, [R2], R7
571
572    VST1.32 D17, [R2], R7
573    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
574    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
575    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
576    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
577
578    VST1.32 D18, [R2], R7   @ 1st cycle dual issued
579    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
580    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
581    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2
582    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
583
584    VST1.32 D19, [R2], R7   @ 1st cycle dual issued
585
586
587    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[13][0-7]
588
589    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[13][8-15]
590    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
591    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
592    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
593    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
594    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
595    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
596    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
597    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
598
599    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[15][0-7] - 1st cycle dual issue
600    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[15][8-15]
601    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
602    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1
603    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
604    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
605    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
606    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
607    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
608    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
609
610    @transpose the 4x4 matrix R1
611    VTRN.32 Q0, Q4          @ R1 1st cycle dual issue
612    VTRN.32 Q8, Q12         @ R1
613    @transpose the 4x4 matrix R2
614    VTRN.32 Q1, Q5          @ R2
615    VSWP    D16, D1         @ R1
616    VSWP    D24, D9         @ R1
617
618    VTRN.32 Q9, Q13         @ R2
619    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
620    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[17][0-7]
621    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
622
623    VSWP    D18, D3         @ R2
624    VSWP    D26, D11        @ R2
625    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue with 1st cycle
626    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[17][8-15]
627
628
629    VADD.S32 Q1, Q1, Q5     @ R2 -- dual issue with 2nd cycle
630    VADD.S32 Q9, Q9, Q13    @ R2
631
632    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
633    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
634    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
635    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
636    VADD.S32 Q9, Q1, Q9     @ R2
637
638    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
639    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
640    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[19][0-7]
641    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
642    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
643    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[19][8-15]
644
645    VZIP.S32 Q8, Q9
646
647    @write to memory
648    @this should go to 9 11 13 15
649    VST1.32 D16, [R2], R7
650    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1 -- dual issued with 2nd cycle
651    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
652    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
653    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
654
655    VST1.32 D17, [R2], R7   @ 1st cycle dual issued
656    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue with 2nd cycle
657    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2
658    VST1.32 D18, [R2], R7   @1st cycle dual issued
659    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issued with 2nd cycle
660    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2
661
662    VST1.32 D19, [R2], R7   @ 1st cycle dual issue
663
664
665    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[21][0-7]
666    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[21][8-15]
667    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
668    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1
669    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
670    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
671    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
672    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
673    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
674    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
675
676    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[23][0-7]
677    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[23][8-15]
678    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issue
679    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issue
680    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
681    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
682    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
683    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
684    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
685    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
686
687    @transpose the 4x4 matrix R1
688    VTRN.32 Q0, Q4          @ R1
689    VTRN.32 Q8, Q12         @ R1
690    @transpose the 4x4 matrix R2
691    VTRN.32 Q1, Q5          @ R2
692    VSWP    D16, D1         @ R1
693    VSWP    D24, D9         @ R1
694
695    VTRN.32 Q9, Q13         @ R2
696    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
697    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[25][0-7]
698    VADD.S32 Q8, Q8, Q12    @ R1 -- dual issue
699
700    VSWP    D18, D3         @ R2
701    VSWP    D26, D11        @ R2
702    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[25][8-15]
703    VADD.S32 Q8, Q0, Q8     @ R1 -- dual issue
704
705    VADD.S32 Q1, Q1, Q5     @ R2
706    VADD.S32 Q9, Q9, Q13    @ R2
707
708    VMULL.S16 Q0,D12,D4     @o[0][0-3]*  R1
709    VMLAL.S16 Q0,D13,D5     @o[0][4-7]*  R1
710    VMLAL.S16 Q0,D14,D6     @o[0][8-11]*  R1
711    VMLAL.S16 Q0,D15,D7     @o[0][12-15]*  R1
712    VADD.S32 Q9, Q1, Q9     @ R2
713
714    VMULL.S16 Q1,D20,D4     @o[0][0-3]*  R2
715    VMLAL.S16 Q1,D21,D5     @o[0][4-7]*  R2
716    VMLAL.S16 Q1,D22,D6     @o[0][8-11]*  R2
717    VMLAL.S16 Q1,D23,D7     @o[0][12-15]*  R2
718
719    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[27][0-7]
720    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[27][8-15]
721
722    VZIP.S32 Q8, Q9
723    VMULL.S16 Q4,D12,D4     @o[0][0-3]*  R1
724    VMLAL.S16 Q4,D13,D5     @o[0][4-7]*  R1
725    VMLAL.S16 Q4,D14,D6     @o[0][8-11]*  R1
726    VMLAL.S16 Q4,D15,D7     @o[0][12-15]*  R1
727    @write to memory
728    @this should go to 17 19 21 23
729    VST1.32 D16, [R2], R7
730    VMULL.S16 Q5,D20,D4     @o[0][0-3]*  R2 -- dual issue
731    VST1.32 D17, [R2], R7
732    VMLAL.S16 Q5,D21,D5     @o[0][4-7]*  R2 -- dual issue
733    VST1.32 D18, [R2], R7
734    VMLAL.S16 Q5,D22,D6     @o[0][8-11]*  R2 -- dual issue
735    VST1.32 D19, [R2], R7
736    VMLAL.S16 Q5,D23,D7     @o[0][12-15]*  R2 -- dual issue
737
738    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[29][0-7]
739    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[29][8-15]
740    VMULL.S16 Q8,D12,D4     @o[0][0-3]*  R1 -- dual issue
741    VMLAL.S16 Q8,D13,D5     @o[0][4-7]*  R1  -- dual issue
742    VMLAL.S16 Q8,D14,D6     @o[0][8-11]*  R1
743    VMLAL.S16 Q8,D15,D7     @o[0][12-15]*  R1
744    VMULL.S16 Q9,D20,D4     @o[0][0-3]*  R2
745    VMLAL.S16 Q9,D21,D5     @o[0][4-7]*  R2
746    VMLAL.S16 Q9,D22,D6     @o[0][8-11]*  R2
747    VMLAL.S16 Q9,D23,D7     @o[0][12-15]*  R2
748
749    VLD1.S16 {D4,D5},[R11]!     @g_ai2_ihevc_trans_32[31][0-7]
750    VLD1.S16 {D6,D7},[R11],R12  @g_ai2_ihevc_trans_32[31][8-15]
751    VMULL.S16 Q12,D12,D4    @o[0][0-3]*  R1 -- dual issued
752    VMLAL.S16 Q12,D13,D5    @o[0][4-7]*  R1 -- dual issued
753    VMLAL.S16 Q12,D14,D6    @o[0][8-11]*  R1
754    VMLAL.S16 Q12,D15,D7    @o[0][12-15]*  R1
755    VMULL.S16 Q13,D20,D4    @o[0][0-3]*  R2
756    VMLAL.S16 Q13,D21,D5    @o[0][4-7]*  R2
757    VMLAL.S16 Q13,D22,D6    @o[0][8-11]*  R2
758    VMLAL.S16 Q13,D23,D7    @o[0][12-15]*  R2
759
760    @transpose the 4x4 matrix R1
761    VTRN.32 Q0, Q4          @ R1
762    VTRN.32 Q8, Q12         @ R1
763    @transpose the 4x4 matrix R2
764    VTRN.32 Q1, Q5          @ R2
765    VSWP    D16, D1         @ R1
766    VSWP    D24, D9         @ R1
767
768    VTRN.32 Q9, Q13         @ R2
769    VADD.S32 Q0, Q0, Q4     @ R1 -- dual issue
770    VADD.S32 Q8, Q8, Q12    @ R1
771    @ 1-cycle stall?
772    VADD.S32 Q0, Q0, Q8     @ R1
773    VSWP    D18, D3         @ R2
774    VSWP    D26, D11        @ R2
775    VADD.S32 Q1, Q1, Q5     @ R2
776    VADD.S32 Q9, Q9, Q13    @ R2
777    @ 1-cycle stall?
778    VADD.S32 Q1, Q1, Q9     @ R2
779    @ 2-cycle stall?
780    VZIP.S32 Q0, Q1         @ 3-cycle instruction
781
782    @ 1-cycle stall?
783    @write to memory
784    @this should go to 25 27 29 31
785    VST1.32 D0, [R2], R7
786    VST1.32 D1, [R2], R7
787    VST1.32 D2, [R2], R7
788    VST1.32 D3, [R2], R7
789    @------------------Processing O ends-------------------------------
790
791    SUB R2,R2,R7,LSL #4
792    LSR R7,R7,#1
793    SUB R2,R2,R7
794
795    ADD R2,R2,#8                @MOVE TO NEXT to next COLUMN - pi4_tmp
796
797    ADD R8,R8,#2                @increment loop cntr
798    CMP R8,#32                  @check loop cntr
799    BNE CORE_LOOP_32X32_HORIZ   @jump acc
800
801
802@*****************Vertical transform************************************
803
804@Initialization for vert transform
805@pi4_tmp will be the new src
806@tmp stride will be new src stride
807@dst will be new pi4_tmp
808@dst stride will be new tmp stride
809@trans table will be of 32 bit
810
811    LDR R9,g_ai4_ihevc_trans_32_addr    @get 32 bit transform matrix
812ulbl3:
813    ADD R9, R9, PC
814
815    SUB R0,R2,#128                  @set tmp as src [-32 to move back to orgin]
816    MOV R2,R3                       @set dst as tmp
817    MOV R4,#TMP_STRIDE_32           @set tmp stride as src stride
818    SUB R4,#112                     @Adjust stride for 7 previous loads
819    LSL R7,R6,#1                    @Set dst stride as tmp stride
820
821
822    @Block SAD
823    VADD.S32 D28,D28,D29
824    VPADD.S32 D28,D28,D29
825    VMOV.S32 R3,D28[0]
826
827    @Read [0 0] [8 0] [16 0] [24 0],[0 1] [8 1] [16 1] [24 1]
828    @values of g_ai4_ihevc_trans_32 and write to stack
829    MOV R12,#COFF_STD_W_32
830    LSL R12,R12,#3
831    VLD1.S32 D28,[R9],R12           @ D28: [0 0] [0 1]
832    VLD1.S32 D29,[R9],R12           @ D29: [8 0] [8 1]
833    VLD1.S32 D30,[R9],R12           @ D30: [16 0] [16 1]
834    VLD1.S32 D31,[R9],R12           @ D31: [24 0] [24 1]
835    SUB R9,R9,R12,LSL #2
836
837    VREV64.32 Q15,Q15               @ Q15: [16 1] [16 0] [24 1] [24 0]
838    VTRN.S32 Q14,Q15                @ Q14: [0 0] [16 1] [8 0] [24 1]
839                                    @ Q15: [0 1] [16 0] [8 1] [24 0]
840    VST1.S32 {Q14-Q15},[SP]
841
842@   VMOV.U32 Q14,#RADD              ;get the round factor to q14
843@   VMOV.U32 Q15,#SHIFT             ;Get the shift to neon
844
845    MOV R8,#0                   @INIT LOOP
846
847CORE_LOOP_32X32_VERT:
848
849    VLD1.S32 {D0,D1},[R0]!          @LOAD 1-4 src R1
850    VLD1.S32 {D2,D3},[R0]!          @LOAD 5-8 src R1
851    VLD1.S32 {D4,D5},[R0]!          @LOAD 9-12 src R1
852    VLD1.S32 {D6,D7},[R0]!          @LOAD 13-16 src R1
853    VLD1.S32 {D8,D9},[R0]!          @LOAD 17-20 src R1
854    VREV64.S32 Q4,Q4            @Rev 17-20 R1
855    VLD1.S32 {D10,D11},[R0]!            @LOAD 21-24 src R1
856    VREV64.S32 Q5,Q5            @Rev 21-24 R1
857    VLD1.S32 {D12,D13},[R0]!            @LOAD 25-28 src R1
858    VREV64.S32 Q6,Q6            @Rev 25-28 R1
859    VLD1.S32 {D14,D15},[R0],R4          @LOAD 29-32 src R1
860    VREV64.S32 Q7,Q7            @Rev 29-32 R1
861
862    VSWP D8,D9                  @ Q4: 20 19 18 17
863    VADD.S32 Q11, Q3, Q4        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 13-16  R1-- dual issue
864    VSWP D10,D11                @ Q5: 24 23 22 21
865    VADD.S32 Q10, Q2, Q5        @e[k] = resi_tmp_1 + resi_tmp_2  k -> 9-12  R1-- dual issue
866    VSWP D12,D13                @ Q6: 28 27 26 25
867    VADD.S32 Q9, Q1, Q6         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 5-8  R1 -- dual issue
868    VSWP D14,D15                @ Q7: 32 31 30 29
869
870    VADD.S32 Q8, Q0, Q7         @e[k] = resi_tmp_1 + resi_tmp_2  k -> 1-4  R1 -- dual issue
871    VREV64.S32 Q11, Q11         @rev e[k] k-> 13-16 R1 -- dual issue
872    VSUB.S32 Q12, Q0, Q7        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 1-4  R1
873    VREV64.S32 Q10, Q10         @rev e[k] k-> 9-12 R1 -- dual issue
874    VSUB.S32 Q13, Q1, Q6        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 5-8  R1
875    VSWP D22, D23               @Q11: e[16] e[15] e[14] e[13] -- dual issue
876    VSUB.S32 Q14, Q2, Q5        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 9-12  R1
877    VSWP D20, D21               @Q10: e[12] e[11] e[10] e[9] -- dual issue
878    VSUB.S32 Q15, Q3, Q4        @o[k] = resi_tmp_1 - resi_tmp_2  k -> 13-16  R1
879
880    VADD.S32 Q1, Q9, Q10        @ee[k] = e[k] + e[15- k] row R1, k-> 4-7
881    VADD.S32 Q0, Q8, Q11        @ee[k] = e[k] + e[15- k] row R1, k-> 0-3
882
883    VSUB.S32 Q2, Q8, Q11        @eo[k] = e[k] - e[15 - k] row R1, k-> 0-3
884    VSUB.S32 Q3, Q9, Q10        @eo[k] = e[k] - e[15 - k] row R1, k-> 4-7
885    VREV64.S32 Q1, Q1           @Q1: ee[5] ee[4] ee[7] ee[6] -- dual issue
886
887    VSWP D2, D3                 @Q1: ee[7] ee[6] ee[5]  ee[4]
888
889    VADD.S32 Q4, Q0, Q1         @eee[k] = ee[k] + ee[7-k] row R1, k-> 0-3
890    VSUB.S32 Q5, Q0, Q1         @eeo[k] = ee[k] - ee[7-k] row R1, k-> 0-3
891
892    @D8: eee[0] eee[1]
893    VLD1.S32 {Q10,Q11},[SP]     @Load g_ai4_ihevc_trans_32[xx]->  Q10 : [0 0] [16 1] [8 0] [24 1]  Q11 : [0 1] [16 0] [8 1] [24 0]
894    VREV64.S32 D9, D9           @D9: eee[3] eee[2]
895
896    @-----------------------Processing EEO ----------------------------
897                                @Q5 :R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]
898    MOV R12,#COFF_STD_W_32
899    ADD R11,R9,R12,LSL #2       @Get to the 4th row of src
900    LSL R12,R12,#3
901
902    VADD.S32 D12, D8, D9        @eeee[0] eeee[1] -- dual issue in 1st cycle
903    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[4][0-4] -> 4G0 4G1 4G2 4G3
904    VSUB.S32 D13, D8, D9        @eeeo[0] eeeo[1] -- dual issue in 2nd cycle
905
906    VMUL.S32  Q0,Q5,Q7          @4G0 4G1 4G2 4G3 * R1eeo[0] R1eeo[1] R1eeo[2] R1eeo[3]
907
908    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[12][0-4] -- 1st cycle dual issue
909    VREV64.S32 Q8,Q6            @Q6 : eeee[0] eeee[1] eeeo[0] eeeo[1] R1   ->   ;Q8 : eeee[1] eeee[0] eeeo[1] eeeo[0] R1
910
911    VMUL.S32 Q4,Q6,Q10          @g_ai4_ihevc_trans_32 * eeee[0] eeee[1] eeeo[0] eeeo[1] R1 -- dual issue
912    VMLA.S32 Q4,Q8,Q11          @g_ai4_ihevc_trans_32 * eeee[1] eeee[0] eeeo[1] eeeo[0] R1
913
914    VMUL.S32  Q9,Q5,Q7          @g_ai4_ihevc_trans_32[6][0-4] * eeo[0-4]
915
916    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[20][0-4] - 1st cycle dual issue
917    VRSHRN.S32 D8,Q4,#SHIFT_32  @ROUND NARROW R1 -- dual issued in 2nd cycle
918                                @ D8: 0 16 8 24
919    @WRITE INTO MEM the values or wait to be shuffled
920    @These values must go to 0 8 16 24 colums
921    LSL R10,R7,#3
922    VST1.S16 D8[0],[R2],R10
923    VMUL.S32  Q10,Q5,Q7         @g_ai4_ihevc_trans_32[10][0-4] * eeo[0-4] -- dual issued
924
925    VLD1.S32  {D14,D15},[R11],R12       @LOAD g_ai4_ihevc_trans_32[28][0-4]
926
927    VST1.S16 D8[2],[R2],R10
928    VMUL.S32  Q11,Q5,Q7         @g_ai4_ihevc_trans_32[14][0-4] * eeo[0-4] -- dual issue
929    @transpose the 4x4 matrix R1
930    VTRN.32 Q0, Q9
931    @-----------------------Processing EO ----------------------------
932    MOV R12,#COFF_STD_W_32
933    ADD R11,R9,R12,LSL #1       @Get 1ST row
934    LSL R12,R12,#2
935
936    VLD1.S32 {Q6,Q7},[R11],R12  @g_ai4_ihevc_trans_16[2][0-7]
937
938    VMUL.S32 Q8,Q6,Q2           @g_ai4_ihevc_trans_16[2][0-3]*eo[0][0-3] R1
939    VTRN.32 Q10, Q11            @ dual issue
940    VMLA.S32 Q8,Q7,Q3           @g_ai4_ihevc_trans_16[2][4-7]*eo[0][4-7] R1
941
942
943    VSWP    D20, D1
944    VSWP    D22, D19
945
946    VST1.S16 D8[1],[R2],R10
947    VADD.S32 Q0, Q0, Q9         @ dual issue
948    VST1.S16 D8[3],[R2],R10
949    VADD.S32 Q10, Q10, Q11      @ dual issue
950    SUB R2,R2,R10, LSL #2
951    @-----------------------Processing EEEO complete-------------------
952
953    VLD1.S32 {Q4,Q5},[R11],R12  @g_ai4_ihevc_trans_16[6][0-7]
954    VADD.S32 Q0, Q0, Q10        @ dual issue
955
956    VMUL.S32 Q7,Q4,Q2           @eo[0][0-3]
957    VMLA.S32 Q7,Q5,Q3           @eo[0][4-7]
958    VRSHRN.S32 D0,Q0,#SHIFT_32  @ Shift by SHIFT and Round the result
959
960    VLD1.S32 {Q9,Q10},[R11],R12 @g_ai4_ihevc_trans_16[10][0-7]
961    VADD.S32 D12,D16,D17        @g_ai4_ihevc_trans_16[2][k]*eo[0][k]+g_ai4_ihevc_trans_16[2][7-k]*eo[0][7-k] R1 -- dual issue
962
963
964    VMUL.S32 Q8,Q9,Q2           @eo[0][0-3]
965    VMLA.S32 Q8,Q10,Q3          @eo[0][4-7]
966
967    @this should go to 4  12  20  28
968    LSL R10,R7,#3
969    ADD R2,R2,R7,LSL #2         @move to fifth row
970    VST1.S16 D0[0], [R2], R10
971    VADD.S32 D13,D14,D15        @ -- dual issue--
972    VST1.S16 D0[1], [R2], R10
973    VADD.S32 D10,D16,D17        @ -- dual issue --
974
975    VLD1.S32 {Q7,Q8},[R11],R12  @g_ai4_ihevc_trans_16[14][0-7]
976
977    VST1.S16 D0[2], [R2], R10
978    VMUL.S32 Q9,Q7,Q2           @eo[0][0-3] -- dual issue
979    VST1.S16 D0[3], [R2], R10
980    VMLA.S32 Q9,Q8,Q3           @eo[0][4-7] -- dual issue
981    SUB R2,R2,R10,LSL #2        @go back to orgin
982    SUB R2,R2,R7,LSL #2
983    @----------------------Processing EEO  complete-------------------
984
985    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[18][0-7]
986
987    VMUL.S32 Q4,Q0,Q2           @g_ai4_ihevc_trans_16[18][0-3]*eo[0][0-3] R1
988    VMLA.S32 Q4,Q1,Q3           @g_ai4_ihevc_trans_16[18][4-7]*eo[0][4-7] R1
989
990    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[22][0-7]
991    VADD.S32 D11,D18,D19        @ dual issue
992
993    @Q5 Q6
994    VMUL.S32 Q7,Q0,Q2           @eo[0][0-3]
995    VMLA.S32 Q7,Q1,Q3           @eo[0][4-7]
996
997    VPADD.S32 D16,D12,D13
998    VPADD.S32 D17,D10,D11
999
1000    VADD.S32 D12,D8,D9          @g_ai4_ihevc_trans_16[18][k]*eo[0][k]+g_ai4_ihevc_trans_16[18][7-k]*eo[0][7-k] R1
1001    VADD.S32 D13,D14,D15
1002
1003    VRSHRN.S32 D14,Q8,#SHIFT_32
1004    VLD1.S32 {Q0,Q1},[R11],R12  @g_ai4_ihevc_trans_16[26][0-7]
1005    VLD1.S32 {Q10,Q11},[R11],R12    @g_ai4_ihevc_trans_16[30][0-7]
1006    @write to memory this should go to 2 6 10 14
1007    ADD R2,R2,R7,LSL #1
1008    LSL R7,R7,#2
1009    VST1.S16 D14[0],[R2],R7
1010    VMUL.S32 Q8,Q0,Q2           @eo[0][0-3] -- dual issue
1011    VST1.S16 D14[1],[R2],R7
1012    VMLA.S32 Q8,Q1,Q3           @eo[0][4-7] -- dual issue
1013    VST1.S16 D14[2],[R2],R7
1014    VMUL.S32 Q9,Q10,Q2          @eo[0][0-3] -- dual issue
1015    VST1.S16 D14[3],[R2],R7
1016    VMLA.S32 Q9,Q11,Q3          @eo[0][4-7] -- dual issue
1017
1018    VADD.S32 D10,D16,D17
1019    @---------------Processing O Row 1-----------------------------------------------
1020    MOV R12,#COFF_STD_W_32
1021    ADD R11,R9,R12              @Get 1ST row
1022    LSL R12,R12,#1
1023    SUB R12, R12, #32
1024    VLD1.S32 {Q0,Q1},[R11]!
1025
1026    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[1][0-15]
1027    VADD.S32 D11,D18,D19        @ dual issue in 2nd cycle
1028
1029    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[1][0-3]*o[0][0-3] R1
1030    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[1][4-7]*o[0][4-7] R1
1031    VLD1.S32 {Q0,Q1},[R11]!
1032    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[1][8-11]*o[0][8-11] R1
1033    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[1][12-15]*o[0][12-15] R1
1034
1035    @Q5 Q6
1036    VPADD.S32 D16,D12,D13
1037    VPADD.S32 D17,D10,D11
1038
1039
1040    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[3][0-15]
1041    VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue
1042
1043    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[3][0-3]*o[0][0-3] R1
1044    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[3][4-7]*o[0][4-7] R1
1045    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[3][8-11]*o[0][8-11] R1
1046    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[3][12-15]*o[0][12-15] R1
1047
1048    @write to memory this should go to 2 6 10 14
1049    VST1.S16 D16[0],[R2],R7
1050    VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[1][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[1][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[1][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[1][12-15]*o[0][12-15]
1051    VLD1.S32 {Q0,Q1},[R11]!
1052    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[5][0-15]
1053    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[5][0-3]*o[0][0-3] R1 -- dual issue
1054    VST1.S16 D16[1],[R2],R7
1055    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[5][4-7]*o[0][4-7] R1 -- dual issue
1056    VST1.S16 D16[2],[R2],R7
1057    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[5][8-11]*o[0][8-11] R1 -- dual issue
1058    VST1.S16 D16[3],[R2],R7
1059    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[5][12-15]*o[0][12-15] R1
1060    SUB R2,R2,R7, LSL #3
1061    LSR R7,R7,#2
1062    SUB R2,R2,R7, LSL #1
1063
1064    @--------------------Done Processing EO--------------------------
1065
1066    VLD1.S32 {Q0,Q1},[R11]!
1067    VADD.S32 D11,D14,D15        @ dual issued
1068    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[7][0-15]
1069    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[7][0-3]*o[0][0-3] R1
1070    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[7][4-7]*o[0][4-7] R1
1071    VLD1.S32 {Q0,Q1},[R11]!
1072    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[7][8-11]*o[0][8-11] R1
1073    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[7][12-15]*o[0][12-15] R1
1074
1075
1076    VADD.S32 D12,D8,D9          @ dual issued
1077    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[9][0-15]
1078    @Q5 Q6
1079    VPADD.S32 D16,D10,D11
1080    VADD.S32 D13,D14,D15
1081
1082    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[9][0-3]*o[0][0-3] R1
1083    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[9][4-7]*o[0][4-7] R1
1084    VLD1.S32 {Q0,Q1},[R11]!
1085    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[9][8-11]*o[0][8-11] R1
1086    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[9][12-15]*o[0][12-15] R1
1087    VPADD.S32 D17,D12,D13
1088
1089
1090    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[11][0-15]
1091    VRSHRN.S32 D16,Q8,#SHIFT_32 @ duall issue
1092
1093    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[11][0-3]*o[0][0-3] R1
1094    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[11][4-7]*o[0][4-7] R1
1095    VLD1.S32 {Q0,Q1},[R11]!
1096    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[11][8-11]*o[0][8-11] R1
1097    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[11][12-15]*o[0][12-15] R1
1098    VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[9][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[9][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[9][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[9][12-15]*o[0][12-15]
1099    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[13][0-15]
1100    @write to memory this should go to 1 3 5 7
1101    ADD R2,R2,R7
1102    LSL R7,R7,#1
1103    VST1.S16 D16[0],[R2],R7
1104    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[13][0-3]*o[0][0-3] R1
1105    VST1.S16 D16[1],[R2],R7
1106    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[13][4-7]*o[0][4-7] R1
1107    VST1.S16 D16[2],[R2],R7
1108    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[13][8-11]*o[0][8-11] R1
1109    VST1.S16 D16[3],[R2],R7
1110    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[13][12-15]*o[0][12-15] R1
1111
1112    VLD1.S32 {Q0,Q1},[R11]!
1113    VADD.S32 D11,D14,D15        @ dual issue
1114    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[15][0-15]
1115    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[15][0-3]*o[0][0-3] R1 -- dual issue--
1116    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[15][4-7]*o[0][4-7] R1
1117    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[15][8-11]*o[0][8-11] R1
1118    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[15][12-15]*o[0][12-15] R1
1119
1120    VLD1.S32 {Q0,Q1},[R11]!
1121    VADD.S32 D12,D8,D9          @ dual issued
1122
1123    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[17][0-15]
1124    @Q5 Q6
1125    VPADD.S32 D16,D10,D11
1126    VADD.S32 D13,D14,D15
1127
1128    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[17][0-3]*o[0][0-3] R1
1129    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[17][4-7]*o[0][4-7] R1
1130    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[17][8-11]*o[0][8-11] R1
1131    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[17][12-15]*o[0][12-15] R1
1132    VPADD.S32 D17,D12,D13
1133
1134    VLD1.S32 {Q0,Q1},[R11]!
1135    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[19][0-15]
1136    VRSHRN.S32 D16,Q8,#SHIFT_32 @ dual issue
1137
1138    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[19][0-3]*o[0][0-3] R1
1139    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[19][4-7]*o[0][4-7] R1
1140    VLD1.S32 {Q0,Q1},[R11]!
1141    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[19][8-11]*o[0][8-11] R1
1142    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[19][12-15]*o[0][12-15] R1
1143    VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[17][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[17][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[17][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[17][12-15]*o[0][12-15]
1144    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[21][0-15]
1145    @write to memory this should go to 9 11 13 15
1146    VST1.S16 D16[0],[R2],R7
1147    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[21][0-3]*o[0][0-3] R1
1148    VST1.S16 D16[1],[R2],R7
1149    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[21][4-7]*o[0][4-7] R1
1150    VST1.S16 D16[2],[R2],R7
1151    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[21][8-11]*o[0][8-11] R1
1152    VST1.S16 D16[3],[R2],R7
1153    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[21][12-15]*o[0][12-15] R1
1154
1155
1156    VLD1.S32 {Q0,Q1},[R11]!
1157    VADD.S32 D11,D14,D15        @ dual issue
1158    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[23][0-15]
1159    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[23][0-3]*o[0][0-3] R1
1160    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[23][4-7]*o[0][4-7] R1
1161    VLD1.S32 {Q0,Q1},[R11]!
1162    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[23][8-11]*o[0][8-11] R1
1163    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[23][12-15]*o[0][12-15] R1
1164    VADD.S32 D12,D8,D9          @ dual issued
1165    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[25][0-15]
1166
1167    @Q5 Q6
1168    VPADD.S32 D16,D10,D11
1169    VADD.S32 D13,D14,D15
1170
1171    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[25][0-3]*o[0][0-3] R1
1172    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[25][4-7]*o[0][4-7] R1
1173    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[25][8-11]*o[0][8-11] R1
1174    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[25][12-15]*o[0][12-15] R1
1175    VPADD.S32 D17,D12,D13
1176
1177    VLD1.S32 {Q0,Q1},[R11]!
1178    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[27][0-15]
1179    VRSHRN.S32 D16,Q8,#SHIFT_32
1180
1181    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[27][0-3]*o[0][0-3] R1
1182    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[27][4-7]*o[0][4-7] R1
1183    VLD1.S32 {Q0,Q1},[R11]!
1184    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[27][8-11]*o[0][8-11] R1
1185    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[27][12-15]*o[0][12-15] R1
1186    VADD.S32 D10,D8,D9          @g_ai4_ihevc_trans_32[25][0-3]*o[0][0-3]+g_ai4_ihevc_trans_32[25][4-7]*o[0][4-7]+g_ai4_ihevc_trans_32[25][8-11]*o[0][8-11]+g_ai4_ihevc_trans_32[25][12-15]*o[0][12-15]
1187    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[29][0-15]
1188    @write to memory this should go to 17 19 21 23
1189    VST1.S16 D16[0],[R2],R7
1190    VMUL.S32 Q4,Q0,Q12          @g_ai4_ihevc_trans_32[29][0-3]*o[0][0-3] R1
1191    VST1.S16 D16[1],[R2],R7
1192    VMLA.S32 Q4,Q1,Q13          @g_ai4_ihevc_trans_32[29][4-7]*o[0][4-7] R1
1193    VST1.S16 D16[2],[R2],R7
1194    VMLA.S32 Q4,Q2,Q14          @g_ai4_ihevc_trans_32[29][8-11]*o[0][8-11] R1
1195    VST1.S16 D16[3],[R2],R7
1196    VMLA.S32 Q4,Q3,Q15          @g_ai4_ihevc_trans_32[29][12-15]*o[0][12-15] R1
1197
1198    VADD.S32 D11,D14,D15        @ dual issue
1199    VLD1.S32 {Q0,Q1},[R11]!
1200
1201    VLD1.S32 {Q2,Q3},[R11],R12  @g_ai4_ihevc_trans_32[31][0-15]
1202    VMUL.S32 Q7,Q0,Q12          @g_ai4_ihevc_trans_32[31][0-3]*o[0][0-3] R1
1203    VMLA.S32 Q7,Q1,Q13          @g_ai4_ihevc_trans_32[31][4-7]*o[0][4-7] R1
1204    VMLA.S32 Q7,Q2,Q14          @g_ai4_ihevc_trans_32[31][8-11]*o[0][8-11] R1
1205    VMLA.S32 Q7,Q3,Q15          @g_ai4_ihevc_trans_32[31][12-15]*o[0][12-15] R1
1206
1207
1208    VADD.S32 D12,D8,D9
1209    @Q5 Q6
1210    VPADD.S32 D16,D10,D11
1211
1212    VADD.S32 D13,D14,D15
1213
1214
1215    VPADD.S32 D17,D12,D13
1216
1217    VRSHRN.S32 D16,Q8,#SHIFT_32
1218
1219    @write to memory this should go to 25 27 29 31
1220    VST1.S16 D16[0],[R2],R7
1221    VST1.S16 D16[1],[R2],R7
1222    VST1.S16 D16[2],[R2],R7
1223    VST1.S16 D16[3],[R2],R7
1224
1225    SUB R2,R2,R7,LSL #4
1226    LSR R7,R7,#1
1227    SUB R2,R2,R7
1228
1229    ADD R2,R2,#2                @MOVE TO NEXT to next COLUMN
1230
1231    ADD R8,R8,#1                @increment loop cntr by 2 since we process loop as 2 cols
1232    CMP R8,#32                  @check loop cntr
1233    BNE CORE_LOOP_32X32_VERT    @jump acc
1234
1235    MOV R0,R3
1236
1237    ADD SP,SP,#32
1238    vpop {d8 - d15}
1239    LDMFD       sp!,{r4-r12,PC}     @stack store values of the arguments
1240
1241
1242    .section    .note.GNU-stack,"",%progbits
1243