1;//
2;//
3;// File Name:  omxVCM4P2_FindMVpred_s.s
4;// OpenMAX DL: v1.0.2
5;// Revision:   12290
6;// Date:       Wednesday, April 9, 2008
7;//
8;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9;//
10;//
11;//
12
13;// Function:
14;//     omxVCM4P2_FindMVpred
15;//
16        ;// Include headers
17        INCLUDE omxtypes_s.h
18        INCLUDE armCOMM_s.h
19        INCLUDE armVCCOMM_s.h
20
21        ;// Define cpu variants
22        M_VARIANTS CortexA8
23
24
25        IF CortexA8
26
27        M_TABLE armVCM4P2_pBlkIndexTable
28        DCD  OMXVCBlk0, OMXVCBlk1
29        DCD  OMXVCBlk2, OMXVCBlk3
30
31;//--------------------------------------------
32;// Declare input registers
33;//--------------------------------------------
34
35pSrcMVCurMB            RN 0
36pSrcCandMV1            RN 1
37pSrcCandMV2            RN 2
38pSrcCandMV3            RN 3
39pDstMVPred             RN 4
40pDstMVPredME           RN 5
41iBlk                   RN 6
42
43pTable                 RN 4
44CandMV                 RN 12
45
46pCandMV1               RN 7
47pCandMV2               RN 8
48pCandMV3               RN 9
49
50CandMV1dx              RN 0
51CandMV1dy              RN 1
52CandMV2dx              RN 2
53CandMV2dy              RN 3
54CandMV3dx              RN 10
55CandMV3dy              RN 11
56
57temp                   RN 14
58
59zero                   RN 14
60return                 RN 0
61
62; ----------------------------------------------
63; Main routine
64; ----------------------------------------------
65
66        M_ALLOC4 MV, 4
67
68        ;// Function header
69        M_START omxVCM4P2_FindMVpred, r11
70
71        ;// Define stack arguments
72        M_ARG   ppDstMVPred,  4
73        M_ARG   ppDstMVPredME, 4
74        M_ARG   Blk, 4
75
76        M_ADR CandMV, MV
77        MOV   zero, #0
78        M_LDR iBlk, Blk
79
80        ;// Set the default value for these
81        ;// to be used if pSrcCandMV[1|2|3] == NULL
82        MOV   pCandMV1, CandMV
83        MOV   pCandMV2, CandMV
84        MOV   pCandMV3, CandMV
85
86        STR   zero, [CandMV]
87
88        ;// Branch to the case based on blk number
89        M_SWITCH iBlk
90        M_CASE   OMXVCBlk0      ;// iBlk=0
91        M_CASE   OMXVCBlk1      ;// iBlk=0
92        M_CASE   OMXVCBlk2      ;// iBlk=0
93        M_CASE   OMXVCBlk3      ;// iBlk=0
94        M_ENDSWITCH
95
96OMXVCBlk0
97        CMP   pSrcCandMV1, #0
98        ADDNE pCandMV1, pSrcCandMV1, #4
99
100        CMP   pSrcCandMV2, #0
101        ADDNE pCandMV2, pSrcCandMV2, #8
102
103        CMP   pSrcCandMV3, #0
104        ADDNE pCandMV3, pSrcCandMV3, #8
105        CMPEQ pSrcCandMV1, #0
106
107        MOVEQ pCandMV3, pCandMV2
108        MOVEQ pCandMV1, pCandMV2
109
110        CMP   pSrcCandMV1, #0
111        CMPEQ pSrcCandMV2, #0
112
113        MOVEQ pCandMV1, pCandMV3
114        MOVEQ pCandMV2, pCandMV3
115
116        CMP   pSrcCandMV2, #0
117        CMPEQ pSrcCandMV3, #0
118
119        MOVEQ pCandMV2, pCandMV1
120        MOVEQ pCandMV3, pCandMV1
121
122        B     BlkEnd
123
124OMXVCBlk1
125        MOV   pCandMV1, pSrcMVCurMB
126        CMP   pSrcCandMV3, #0
127        ADDNE pCandMV3, pSrcCandMV3, #8
128
129        CMP   pSrcCandMV2, #0
130        ADDNE pCandMV2, pSrcCandMV2, #12
131
132        CMPEQ pSrcCandMV3, #0
133
134        MOVEQ pCandMV2, pCandMV1
135        MOVEQ pCandMV3, pCandMV1
136
137        B     BlkEnd
138
139OMXVCBlk2
140        CMP   pSrcCandMV1, #0
141        MOV   pCandMV2, pSrcMVCurMB
142        ADD   pCandMV3, pSrcMVCurMB, #4
143        ADDNE pCandMV1, pSrcCandMV1, #12
144        B     BlkEnd
145
146OMXVCBlk3
147        ADD   pCandMV1, pSrcMVCurMB, #8
148        MOV   pCandMV2, pSrcMVCurMB
149        ADD   pCandMV3, pSrcMVCurMB, #4
150
151BlkEnd
152
153        ;// Using the transperancy info, zero
154        ;// out the candidate MV if neccesary
155        LDRSH CandMV1dx, [pCandMV1], #2
156        LDRSH CandMV2dx, [pCandMV2], #2
157        LDRSH CandMV3dx, [pCandMV3], #2
158
159        ;// Load argument from the stack
160        M_LDR pDstMVPredME, ppDstMVPredME
161
162        LDRSH CandMV1dy, [pCandMV1]
163        LDRSH CandMV2dy, [pCandMV2]
164        LDRSH CandMV3dy, [pCandMV3]
165
166        CMP pDstMVPredME, #0
167
168        ;// Store the candidate MV's into the pDstMVPredME,
169        ;// these can be used in the fast algorithm if implemented
170
171        STRHNE CandMV1dx, [pDstMVPredME], #2
172        STRHNE CandMV1dy, [pDstMVPredME], #2
173        STRHNE CandMV2dx, [pDstMVPredME], #2
174        STRHNE CandMV2dy, [pDstMVPredME], #2
175        STRHNE CandMV3dx, [pDstMVPredME], #2
176        STRHNE CandMV3dy, [pDstMVPredME]
177
178        ; Find the median of the 3 candidate MV's
179        M_MEDIAN3 CandMV1dx, CandMV2dx, CandMV3dx, temp
180
181        ;// Load argument from the stack
182        M_LDR pDstMVPred, ppDstMVPred
183
184        M_MEDIAN3 CandMV1dy, CandMV2dy, CandMV3dy, temp
185
186        STRH CandMV3dx, [pDstMVPred], #2
187        STRH CandMV3dy, [pDstMVPred]
188
189        MOV return, #OMX_Sts_NoErr
190
191        M_END
192    ENDIF ;// ARM1136JS :LOR: CortexA8
193
194    END