[svn] / branches / release-1_2-branch / xvidcore / src / motion / ia64_asm / halfpel8_refine_ia64.s Repository:
ViewVC logotype

Annotation of /branches/release-1_2-branch/xvidcore/src/motion/ia64_asm/halfpel8_refine_ia64.s

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1820 - (view) (download)

1 : ia64p 300 // ------------------------------------------------------------------------------
2 :     // * Programmed by
3 :     // * Johannes Singler (email@jsingler.de), Daniel Winkler (infostudent@uni.de)
4 :     // *
5 :     // * Programmed for the IA64 laboratory held at University Karlsruhe 2002
6 :     // * http://www.info.uni-karlsruhe.de/~rubino/ia64p/
7 :     // *
8 :     // ------------------------------------------------------------------------------
9 :     // *
10 :     // * This is the optimized assembler version of Halfpel8_Refine. This function
11 :     // * is worth it to be optimized for the IA-64 architecture because of the huge
12 :     // * register set. We can hold all necessary data in general use registers
13 :     // * and reuse it.
14 :     // *
15 :     // * Our approach uses:
16 :     // * - The Itanium command psad1, which solves the problem in hardware.
17 :     // * - Alignment resolving to avoid memory faults
18 :     // * - Massive lopp unrolling
19 :     // *
20 :     // ------------------------------------------------------------------------------
21 :     // *
22 :     // * ------- Half-pixel steps around the center (*) and corresponding
23 :     // * |0|1|0| register set parts.
24 :     // * -------
25 :     // * |2|*|2|
26 :     // * -------
27 :     // * |0|1|0|
28 :     // * -------
29 :     // *
30 :     // ------------------------------------------------------------------------------
31 :     // * calc_delta is split up in three parts wich are included from
32 :     // *
33 :     // * calc_delta_1.s
34 :     // * calc_delta_2.s
35 :     // * calc_delta_3.s
36 :     // *
37 :     // ------------------------------------------------------------------------------
38 :     // * We assume min_dx <= currX <= max_dx && min_dy <= currY <= max_dy
39 :    
40 :    
41 :     .sdata
42 :     .align 4
43 :     .type lambda_vec8#,@object
44 :     .size lambda_vec8#,128
45 :     lambda_vec8:
46 :     data4 0
47 :     data4 1
48 :     data4 1
49 :     data4 1
50 :     data4 1
51 :     data4 2
52 :     data4 2
53 :     data4 2
54 :     data4 2
55 :     data4 3
56 :     data4 3
57 :     data4 3
58 :     data4 4
59 :     data4 4
60 :     data4 4
61 :     data4 5
62 :     data4 5
63 :     data4 6
64 :     data4 7
65 :     data4 7
66 :     data4 8
67 :     data4 9
68 :     data4 10
69 :     data4 11
70 :     data4 13
71 :     data4 14
72 :     data4 16
73 :     data4 18
74 :     data4 21
75 :     data4 25
76 :     data4 30
77 :     data4 36
78 :    
79 :    
80 :     .type mvtab#,@object
81 :     .size mvtab#,132
82 :     mvtab:
83 :     data4 1
84 :     data4 2
85 :     data4 3
86 :     data4 4
87 :     data4 6
88 :     data4 7
89 :     data4 7
90 :     data4 7
91 :     data4 9
92 :     data4 9
93 :     data4 9
94 :     data4 10
95 :     data4 10
96 :     data4 10
97 :     data4 10
98 :     data4 10
99 :     data4 10
100 :     data4 10
101 :     data4 10
102 :     data4 10
103 :     data4 10
104 :     data4 10
105 :     data4 10
106 :     data4 10
107 :     data4 10
108 :     data4 11
109 :     data4 11
110 :     data4 11
111 :     data4 11
112 :     data4 11
113 :     data4 11
114 :     data4 12
115 :     data4 12
116 :     .text
117 :     .align 16
118 :     .global Halfpel8_Refine_ia64#
119 :     .proc Halfpel8_Refine_ia64#
120 :    
121 :     Halfpel8_Refine_ia64:
122 :    
123 :     pfs = r14
124 :     prsave = r15
125 :    
126 :     // Save important registers
127 :    
128 : ia64p 372 alloc pfs = ar.pfs, 18, 74, 4, 96
129 : ia64p 300 mov prsave = pr
130 :    
131 :     // Naming registers for better readability
132 :    
133 :     pRef = in0
134 :     pRefH = in1
135 :     pRefV = in2
136 :     pRefHV = in3
137 :     cura = in4
138 :     x = in5
139 :     y = in6
140 :     currMV = in7
141 :     iMinSAD = in8
142 : ia64p 372 dx = in9
143 :     dy = in10
144 :     min_dx = in11
145 :     max_dx = in12
146 :     min_dy = in13
147 :     max_dy = in14
148 :     iFcode = in15
149 :     iQuant = in16
150 :     iEdgedWidth = in17
151 : ia64p 300
152 :     iSAD = r17
153 :     backupX = r18
154 :     backupY = r19
155 :     currX = r20
156 :     currY = r21
157 :     currYAddress = r22
158 :     bitX0 = r23
159 :     bitY0 = r24
160 :     dxd2 = r25
161 :     dyd2 = r26
162 :     offset = r27
163 :     block = r28
164 :     nob02 = r29
165 :     nob1 = r30
166 :     nob64m02 = r31
167 :     nob64m1 = r127
168 :     const7 = r126
169 :     nob56m02 = r125
170 : ia64p 372 oldX = r124
171 :     oldY = r123
172 : ia64p 300
173 : ia64p 372 .rotr inregisters[18], refaa[3], refab[3], cur[8], ref0a[9], ref0b[9], ref1a[9], mpr[9], ref2a[8], ref2b[8], component[2], sc[2], tabaddress[2]
174 : ia64p 300
175 :     fx = f8
176 :     fy = f9
177 :     fblock = f10
178 :     fiEdgedWidth = f11
179 :     fdxd2 = f12
180 :     fdyd2 = f13
181 :     foffset = f14
182 :     fydiEdgedWidth = f15
183 : ia64p 303 fQuant = f32
184 :     fmv = f33
185 : ia64p 300
186 :     n = p16
187 :     h = p17
188 :     v = p18
189 :     hv = p19
190 :     l = p20
191 :     r = p21
192 :     t = p22
193 :     b = p23
194 :     lt = p24
195 :     lb = p25
196 :     rt = p26
197 :     rb = p27
198 :     fb = p28
199 :     non0_0 = p30
200 :     non0_1 = p31
201 :     non0_2 = p32
202 :     non0_3 = p33
203 :     neg_0 = p34
204 :     neg_1 = p35
205 :     neg_2 = p36
206 :     neg_3 = p37
207 :     cg32_0 = p29
208 :     cg32_1 = p38
209 :    
210 :     // Initialize input variables
211 :    
212 :     add sp = 16, sp
213 :     ;;
214 :     ld4 iMinSAD = [sp], 8
215 :     ;;
216 :     sxt4 iMinSAD = iMinSAD
217 : ia64p 372
218 :    
219 :     ld4 dx = [sp], 8
220 : ia64p 300 ;;
221 : ia64p 372 sxt4 dx = dx
222 :    
223 :     ld4 dy = [sp], 8
224 :     ;;
225 :     sxt4 dy = dy
226 :    
227 : ia64p 300 ld4 min_dx = [sp], 8
228 :     ;;
229 :     sxt4 min_dx = min_dx
230 :    
231 :     ld4 max_dx = [sp], 8
232 :     ;;
233 :     sxt4 max_dx = max_dx
234 :    
235 :     ld4 min_dy = [sp], 8
236 :     ;;
237 :     sxt4 min_dy = min_dy
238 :    
239 :     ld4 max_dy = [sp], 8
240 :     ;;
241 :     sxt4 max_dy = max_dy
242 :    
243 :     ld4 iFcode = [sp], 8
244 :     ;;
245 :     sxt4 iFcode = iFcode
246 :    
247 :     ld4 iQuant = [sp], 8
248 :    
249 :     add tabaddress[0] = @gprel(lambda_vec8#), gp
250 :     ;;
251 :     shladd tabaddress[0] = iQuant, 2, tabaddress[0]
252 :     ;;
253 :     ld4 iQuant = [tabaddress[0]]
254 :     ;;
255 :     sxt4 iQuant = iQuant
256 :     ;;
257 :     add iFcode = -1, iFcode //only used in decreased version
258 :     shl iQuant = iQuant, 1
259 :     ;;
260 :     setf.sig fQuant = iQuant
261 :    
262 :     ld4 iEdgedWidth = [sp]
263 : ia64p 372 add sp = -88, sp
264 : ia64p 300
265 :    
266 :    
267 :    
268 :     // Initialize local variables
269 :    
270 :    
271 :     ld4 currX = [currMV]
272 :     add currYAddress = 4, currMV
273 :     ;;
274 :     sxt4 currX = currX
275 :     ld4 currY = [currYAddress]
276 :     ;;
277 :     sxt4 currY = currY
278 :     ;;
279 :     // Calculate references
280 :    
281 :     cmp.gt l, p0 = currX, min_dx
282 :     cmp.lt r, p0 = currX, max_dx
283 :     cmp.gt t, p0 = currY, min_dy
284 :     cmp.lt b, p0 = currY, max_dy
285 :     add backupX = -1, currX //move to left upper corner of quadrate
286 :     add backupY = -1, currY
287 :    
288 :     ;;
289 :     (b) cmp.gt.unc lb, p0 = currX, min_dx
290 :     (t) cmp.lt.unc rt, p0 = currX, max_dx
291 :     (l) cmp.gt.unc lt, p0 = currY, min_dy
292 :     (r) cmp.lt.unc rb, p0 = currY, max_dy
293 :    
294 :     and bitX0 = 1, backupX
295 :     and bitY0 = 1, backupY
296 :     ;;
297 :     cmp.eq n, p0 = 0, bitX0
298 :     cmp.eq h, p0 = 1, bitX0
299 :     cmp.eq v, p0 = 0, bitX0
300 :     cmp.eq hv, p0 = 1, bitX0
301 :     ;;
302 :     cmp.eq.and n, p0 = 0, bitY0
303 :     cmp.eq.and h, p0 = 0, bitY0
304 :     cmp.eq.and v, p0 = 1, bitY0
305 :     cmp.eq.and hv, p0 = 1, bitY0
306 :     ;;
307 :    
308 :     .pred.rel "mutex", p16, p17, p18, p19 //n, h, v, hv
309 :     (n) mov refaa[0] = pRef
310 :     (h) mov refaa[0] = pRefH
311 :     (v) mov refaa[0] = pRefV
312 :     (hv) mov refaa[0] = pRefHV
313 :    
314 :     (n) mov refaa[1] = pRefH
315 :     (h) mov refaa[1] = pRef
316 :     (v) mov refaa[1] = pRefHV
317 :     (hv) mov refaa[1] = pRefV
318 :    
319 :     (n) mov refaa[2] = pRefV
320 :     (h) mov refaa[2] = pRefHV
321 :     (v) mov refaa[2] = pRef
322 :     (hv) mov refaa[2] = pRefH
323 :    
324 :    
325 :     // Calculate offset (integer multiplication on IA-64 sucks!)
326 :    
327 :     mov block = 8
328 :    
329 :     shr dxd2 = backupX, 1
330 :     shr dyd2 = backupY, 1
331 :    
332 :     setf.sig fx = x
333 :     setf.sig fy = y
334 :     ;;
335 :     setf.sig fblock = block
336 :     setf.sig fiEdgedWidth = iEdgedWidth
337 :     ;;
338 :     setf.sig fdxd2 = dxd2
339 :     setf.sig fdyd2 = dyd2
340 :     ;;
341 :     xma.l foffset = fx, fblock, fdxd2
342 :     xma.l fydiEdgedWidth = fy, fblock, fdyd2
343 :     ;;
344 :     xma.l foffset = fydiEdgedWidth, fiEdgedWidth, foffset
345 :     ;;
346 :     getf.sig offset = foffset
347 :     ;;
348 :     add refaa[0] = refaa[0], offset
349 :     add refaa[1] = refaa[1], offset
350 :     add refaa[2] = refaa[2], offset
351 :     ;;
352 :     (h) add refaa[1] = 1, refaa[1]
353 :     (hv) add refaa[1] = 1, refaa[1]
354 :     (v) add refaa[2] = iEdgedWidth, refaa[2]
355 :     (hv) add refaa[2] = iEdgedWidth, refaa[2]
356 :    
357 :     // Load respecting misalignment of refx...
358 :    
359 :     mov const7 = 7
360 :     ;;
361 :     dep.z nob02 = refaa[0], 3, 3
362 :     dep.z nob1 = refaa[1], 3, 3
363 :     ;;
364 :     andcm refaa[0] = refaa[0], const7 // set last 3 bits = 0
365 :     andcm refaa[1] = refaa[1], const7
366 :     andcm refaa[2] = refaa[2], const7
367 :     ;;
368 :     add refab[0] = 8, refaa[0]
369 :     add refab[1] = 8, refaa[1]
370 :     add refab[2] = 8, refaa[2]
371 :     ;;
372 :     ld8 cur[0] = [cura], iEdgedWidth
373 :     ld8 ref0a[0] = [refaa[0]], iEdgedWidth
374 :     sub nob64m02 = 64, nob02 // 64 - nob
375 :    
376 :     ld8 ref0b[0] = [refab[0]], iEdgedWidth
377 :     ld8 ref1a[0] = [refaa[1]], iEdgedWidth
378 :     sub nob56m02 = 56, nob02 // 56 - nob
379 :    
380 :     ld8 mpr[0] = [refab[1]], iEdgedWidth
381 :     ld8 ref2a[0] = [refaa[2]], iEdgedWidth
382 :     sub nob64m1 = 64, nob1
383 :    
384 :     ld8 ref2b[0] = [refab[2]], iEdgedWidth
385 :     ;;
386 :     ld8 cur[1] = [cura], iEdgedWidth
387 :     ld8 ref0a[1] = [refaa[0]], iEdgedWidth
388 :     ld8 ref0b[1] = [refab[0]], iEdgedWidth
389 :     ld8 ref1a[1] = [refaa[1]], iEdgedWidth
390 :     ld8 mpr[1] = [refab[1]], iEdgedWidth
391 :     ld8 ref2a[1] = [refaa[2]], iEdgedWidth
392 :     ld8 ref2b[1] = [refab[2]], iEdgedWidth
393 :     ;;
394 :     ld8 cur[2] = [cura], iEdgedWidth
395 :     ld8 ref0a[2] = [refaa[0]], iEdgedWidth
396 :     ld8 ref0b[2] = [refab[0]], iEdgedWidth
397 :     ld8 ref1a[2] = [refaa[1]], iEdgedWidth
398 :     ld8 mpr[2] = [refab[1]], iEdgedWidth
399 :     ld8 ref2a[2] = [refaa[2]], iEdgedWidth
400 :     ld8 ref2b[2] = [refab[2]], iEdgedWidth
401 :     ;;
402 :     ld8 cur[3] = [cura], iEdgedWidth
403 :     ld8 ref0a[3] = [refaa[0]], iEdgedWidth
404 :     ld8 ref0b[3] = [refab[0]], iEdgedWidth
405 :     ld8 ref1a[3] = [refaa[1]], iEdgedWidth
406 :     ld8 mpr[3] = [refab[1]], iEdgedWidth
407 :     ld8 ref2a[3] = [refaa[2]], iEdgedWidth
408 :     ld8 ref2b[3] = [refab[2]], iEdgedWidth
409 :     ;;
410 :     ld8 cur[4] = [cura], iEdgedWidth
411 :     ld8 ref0a[4] = [refaa[0]], iEdgedWidth
412 :     ld8 ref0b[4] = [refab[0]], iEdgedWidth
413 :     ld8 ref1a[4] = [refaa[1]], iEdgedWidth
414 :     ld8 mpr[4] = [refab[1]], iEdgedWidth
415 :     ld8 ref2a[4] = [refaa[2]], iEdgedWidth
416 :     ld8 ref2b[4] = [refab[2]], iEdgedWidth
417 :     ;;
418 :     ld8 cur[5] = [cura], iEdgedWidth
419 :     ld8 ref0a[5] = [refaa[0]], iEdgedWidth
420 :     ld8 ref0b[5] = [refab[0]], iEdgedWidth
421 :     ld8 ref1a[5] = [refaa[1]], iEdgedWidth
422 :     ld8 mpr[5] = [refab[1]], iEdgedWidth
423 :     ld8 ref2a[5] = [refaa[2]], iEdgedWidth
424 :     ld8 ref2b[5] = [refab[2]], iEdgedWidth
425 :     ;;
426 :     ld8 cur[6] = [cura], iEdgedWidth
427 :     ld8 ref0a[6] = [refaa[0]], iEdgedWidth
428 :     ld8 ref0b[6] = [refab[0]], iEdgedWidth
429 :     ld8 ref1a[6] = [refaa[1]], iEdgedWidth
430 :     ld8 mpr[6] = [refab[1]], iEdgedWidth
431 :     ld8 ref2a[6] = [refaa[2]], iEdgedWidth
432 :     ld8 ref2b[6] = [refab[2]], iEdgedWidth
433 :     ;;
434 :     ld8 cur[7] = [cura]
435 :     ld8 ref0a[7] = [refaa[0]], iEdgedWidth
436 :     ld8 ref0b[7] = [refab[0]], iEdgedWidth
437 :     ld8 ref1a[7] = [refaa[1]], iEdgedWidth
438 :     ld8 mpr[7] = [refab[1]], iEdgedWidth
439 :     ld8 ref2a[7] = [refaa[2]]
440 :     ld8 ref2b[7] = [refab[2]]
441 :     ;;
442 :     ld8 ref0a[8] = [refaa[0]]
443 :     ld8 ref0b[8] = [refab[0]]
444 :     ld8 ref1a[8] = [refaa[1]]
445 :     ld8 mpr[8] = [refab[1]]
446 :     ;;
447 :    
448 :    
449 :     // Align ref1
450 :    
451 :     shr.u ref1a[0] = ref1a[0], nob1
452 :     shr.u ref1a[1] = ref1a[1], nob1
453 :     shr.u ref1a[2] = ref1a[2], nob1
454 :     shr.u ref1a[3] = ref1a[3], nob1
455 :     shr.u ref1a[4] = ref1a[4], nob1
456 :     shr.u ref1a[5] = ref1a[5], nob1
457 :     shr.u ref1a[6] = ref1a[6], nob1
458 :     shr.u ref1a[7] = ref1a[7], nob1
459 :     shr.u ref1a[8] = ref1a[8], nob1
460 :    
461 :     shl mpr[0] = mpr[0], nob64m1
462 :     shl mpr[1] = mpr[1], nob64m1
463 :     shl mpr[2] = mpr[2], nob64m1
464 :     shl mpr[3] = mpr[3], nob64m1
465 :     shl mpr[4] = mpr[4], nob64m1
466 :     shl mpr[5] = mpr[5], nob64m1
467 :     shl mpr[6] = mpr[6], nob64m1
468 :     shl mpr[7] = mpr[7], nob64m1
469 :     shl mpr[8] = mpr[8], nob64m1
470 :     ;;
471 :     .explicit
472 :     {.mii
473 :     or ref1a[0] = ref1a[0], mpr[0]
474 :     shr.u ref0a[0] = ref0a[0], nob02
475 :     shr.u ref0a[1] = ref0a[1], nob02
476 :     }
477 :     {.mmi
478 :     or ref1a[1] = ref1a[1], mpr[1]
479 :     or ref1a[2] = ref1a[2], mpr[2]
480 :     shr.u ref0a[2] = ref0a[2], nob02
481 :     }
482 :     {.mii
483 :     or ref1a[3] = ref1a[3], mpr[3]
484 :     shr.u ref0a[3] = ref0a[3], nob02
485 :     shr.u ref0a[4] = ref0a[4], nob02
486 :     }
487 :     {.mmi
488 :     or ref1a[4] = ref1a[4], mpr[4]
489 :     or ref1a[5] = ref1a[5], mpr[5]
490 :     shr.u ref0a[5] = ref0a[5], nob02
491 :     }
492 :     {.mii
493 :     or ref1a[6] = ref1a[6], mpr[6]
494 :     shr.u ref0a[6] = ref0a[6], nob02
495 :     shr.u ref0a[7] = ref0a[7], nob02
496 :     }
497 :     {.mii
498 :     or ref1a[7] = ref1a[7], mpr[7]
499 :     or ref1a[8] = ref1a[8], mpr[8]
500 :     shr.u ref0a[8] = ref0a[8], nob02
501 :     }
502 :     .default
503 :     // ref1a[] now contains center position values
504 :     // mpr[] not used any more
505 :    
506 :     // Align ref0 left
507 :    
508 :     ;;
509 :     shl mpr[0] = ref0b[0], nob56m02
510 :     shl mpr[1] = ref0b[1], nob56m02
511 :     shl mpr[2] = ref0b[2], nob56m02
512 :     shl mpr[3] = ref0b[3], nob56m02
513 :     shl mpr[4] = ref0b[4], nob56m02
514 :     shl mpr[5] = ref0b[5], nob56m02
515 :     shl mpr[6] = ref0b[6], nob56m02
516 :     shl mpr[7] = ref0b[7], nob56m02
517 :     shl mpr[8] = ref0b[8], nob56m02
518 :    
519 :     shl ref0b[0] = ref0b[0], nob64m02
520 :     shl ref0b[1] = ref0b[1], nob64m02
521 :     shl ref0b[2] = ref0b[2], nob64m02
522 :     shl ref0b[3] = ref0b[3], nob64m02
523 :     shl ref0b[4] = ref0b[4], nob64m02
524 :     shl ref0b[5] = ref0b[5], nob64m02
525 :     shl ref0b[6] = ref0b[6], nob64m02
526 :     shl ref0b[7] = ref0b[7], nob64m02
527 :     shl ref0b[8] = ref0b[8], nob64m02
528 :     ;;
529 :     or ref0a[0] = ref0a[0], ref0b[0]
530 :     or ref0a[1] = ref0a[1], ref0b[1]
531 :     or ref0a[2] = ref0a[2], ref0b[2]
532 :     or ref0a[3] = ref0a[3], ref0b[3]
533 :     or ref0a[4] = ref0a[4], ref0b[4]
534 :     or ref0a[5] = ref0a[5], ref0b[5]
535 :     or ref0a[6] = ref0a[6], ref0b[6]
536 :     or ref0a[7] = ref0a[7], ref0b[7]
537 :     or ref0a[8] = ref0a[8], ref0b[8]
538 :     ;;
539 :    
540 :     // ref0a[] now contains left position values
541 :     // mpr[] contains intermediate result for right position values (former ref0a << 56 - nob02)
542 :    
543 :     // Align ref0 right
544 :    
545 :     // Shift one byte more to the right (seen als big-endian)
546 :     shr.u ref0b[0] = ref0a[0], 8
547 :     shr.u ref0b[1] = ref0a[1], 8
548 :     shr.u ref0b[2] = ref0a[2], 8
549 :     shr.u ref0b[3] = ref0a[3], 8
550 :     shr.u ref0b[4] = ref0a[4], 8
551 :     shr.u ref0b[5] = ref0a[5], 8
552 :     shr.u ref0b[6] = ref0a[6], 8
553 :     shr.u ref0b[7] = ref0a[7], 8
554 :     shr.u ref0b[8] = ref0a[8], 8
555 :     ;;
556 :     .explicit
557 :     {.mii
558 :     or ref0b[0] = ref0b[0], mpr[0]
559 :     shr.u ref2a[0] = ref2a[0], nob02
560 :     shr.u ref2a[1] = ref2a[1], nob02
561 :     }
562 :     {.mmi
563 :     or ref0b[1] = ref0b[1], mpr[1]
564 :     or ref0b[2] = ref0b[2], mpr[2]
565 :     shr.u ref2a[2] = ref2a[2], nob02
566 :     }
567 :     {.mii
568 :     or ref0b[3] = ref0b[3], mpr[3]
569 :     shr.u ref2a[3] = ref2a[3], nob02
570 :     shr.u ref2a[4] = ref2a[4], nob02
571 :     }
572 :     {.mmi
573 :     or ref0b[4] = ref0b[4], mpr[4]
574 :     or ref0b[5] = ref0b[5], mpr[5]
575 :     shr.u ref2a[5] = ref2a[5], nob02
576 :     }
577 :     {.mii
578 :     or ref0b[6] = ref0b[6], mpr[6]
579 :     shr.u ref2a[6] = ref2a[6], nob02
580 :     shr.u ref2a[7] = ref2a[7], nob02
581 :     }
582 :     .default
583 :     or ref0b[7] = ref0b[7], mpr[7]
584 :     or ref0b[8] = ref0b[8], mpr[8]
585 :    
586 :     // ref0b[] now contains right position values
587 :     // mpr[] not needed any more
588 :    
589 :    
590 :     // Align ref2 left
591 :    
592 :     ;;
593 :     shl mpr[0] = ref2b[0], nob56m02
594 :     shl mpr[1] = ref2b[1], nob56m02
595 :     shl mpr[2] = ref2b[2], nob56m02
596 :     shl mpr[3] = ref2b[3], nob56m02
597 :     shl mpr[4] = ref2b[4], nob56m02
598 :     shl mpr[5] = ref2b[5], nob56m02
599 :     shl mpr[6] = ref2b[6], nob56m02
600 :     shl mpr[7] = ref2b[7], nob56m02
601 :    
602 :     shl ref2b[0] = ref2b[0], nob64m02
603 :     shl ref2b[1] = ref2b[1], nob64m02
604 :     shl ref2b[2] = ref2b[2], nob64m02
605 :     shl ref2b[3] = ref2b[3], nob64m02
606 :     shl ref2b[4] = ref2b[4], nob64m02
607 :     shl ref2b[5] = ref2b[5], nob64m02
608 :     shl ref2b[6] = ref2b[6], nob64m02
609 :     shl ref2b[7] = ref2b[7], nob64m02
610 :     ;;
611 :     or ref2a[0] = ref2a[0], ref2b[0]
612 :     or ref2a[1] = ref2a[1], ref2b[1]
613 :     or ref2a[2] = ref2a[2], ref2b[2]
614 :     or ref2a[3] = ref2a[3], ref2b[3]
615 :     or ref2a[4] = ref2a[4], ref2b[4]
616 :     or ref2a[5] = ref2a[5], ref2b[5]
617 :     or ref2a[6] = ref2a[6], ref2b[6]
618 :     or ref2a[7] = ref2a[7], ref2b[7]
619 :     ;;
620 :    
621 :     // ref2a[] now contains left position values
622 :     // mpr[] contains intermediate result for right position values (former ref2a << 56 - nob02)
623 :    
624 :     // Align ref2 right
625 :    
626 :     // Shift one byte more to the right (seen als big-endian)
627 :     shr.u ref2b[0] = ref2a[0], 8
628 :     shr.u ref2b[1] = ref2a[1], 8
629 :     shr.u ref2b[2] = ref2a[2], 8
630 :     shr.u ref2b[3] = ref2a[3], 8
631 :     shr.u ref2b[4] = ref2a[4], 8
632 :     shr.u ref2b[5] = ref2a[5], 8
633 :     shr.u ref2b[6] = ref2a[6], 8
634 :     shr.u ref2b[7] = ref2a[7], 8
635 :     ;;
636 :     or ref2b[0] = ref2b[0], mpr[0]
637 :     or ref2b[1] = ref2b[1], mpr[1]
638 :     or ref2b[2] = ref2b[2], mpr[2]
639 :     or ref2b[3] = ref2b[3], mpr[3]
640 :     or ref2b[4] = ref2b[4], mpr[4]
641 :     or ref2b[5] = ref2b[5], mpr[5]
642 :     or ref2b[6] = ref2b[6], mpr[6]
643 :     or ref2b[7] = ref2b[7], mpr[7]
644 :    
645 :    
646 :     // ref2b[] now contains right position values
647 :     // mpr[] not needed any more
648 :    
649 :    
650 :    
651 :     // Let's SAD
652 :    
653 :     // Left top corner
654 :    
655 :    
656 :     sub dx = backupX, dx
657 :     psad1 mpr[0] = cur[0], ref0a[0]
658 :     psad1 mpr[1] = cur[1], ref0a[1]
659 :    
660 :     sub dy = backupY, dy
661 :     psad1 mpr[2] = cur[2], ref0a[2]
662 :     psad1 mpr[3] = cur[3], ref0a[3]
663 :     psad1 mpr[4] = cur[4], ref0a[4]
664 :     psad1 mpr[5] = cur[5], ref0a[5]
665 :     psad1 mpr[6] = cur[6], ref0a[6]
666 :     psad1 mpr[7] = cur[7], ref0a[7]
667 :     ;;
668 :     .include "../../src/motion/ia64_asm/calc_delta_1.s"
669 :    
670 :     // Top edge
671 :    
672 :     psad1 mpr[0] = cur[0], ref1a[0]
673 :     psad1 mpr[1] = cur[1], ref1a[1]
674 :     psad1 mpr[2] = cur[2], ref1a[2]
675 :     psad1 mpr[3] = cur[3], ref1a[3]
676 :     psad1 mpr[4] = cur[4], ref1a[4]
677 :    
678 :     add dx = 1, dx
679 :     psad1 mpr[5] = cur[5], ref1a[5]
680 :     psad1 mpr[6] = cur[6], ref1a[6]
681 :    
682 :     psad1 mpr[7] = cur[7], ref1a[7]
683 :     ;;
684 :    
685 :     .include "../../src/motion/ia64_asm/calc_delta_2.s"
686 :     (lt) cmp.lt.unc fb, p0 = mpr[8], iMinSAD
687 :     .include "../../src/motion/ia64_asm/calc_delta_3.s"
688 :    
689 :     // Right top corner
690 :    
691 :    
692 :     psad1 mpr[0] = cur[0], ref0b[0]
693 :     psad1 mpr[1] = cur[1], ref0b[1]
694 :     psad1 mpr[2] = cur[2], ref0b[2]
695 :     psad1 mpr[3] = cur[3], ref0b[3]
696 :     psad1 mpr[4] = cur[4], ref0b[4]
697 :    
698 :     add backupX = 1, backupX
699 :     psad1 mpr[5] = cur[5], ref0b[5]
700 :     psad1 mpr[6] = cur[6], ref0b[6]
701 :    
702 :     add dx = 1, dx
703 :     psad1 mpr[7] = cur[7], ref0b[7]
704 :     ;;
705 :    
706 :     .include "../../src/motion/ia64_asm/calc_delta_1.s"
707 :     (t) cmp.lt.unc fb, p0 = iSAD, iMinSAD
708 :     ;;
709 :    
710 :     // Left edge
711 :    
712 :     (fb) mov iMinSAD = iSAD
713 :     psad1 mpr[0] = cur[0], ref2a[0]
714 :    
715 :     (fb) mov currX = backupX
716 :     psad1 mpr[1] = cur[1], ref2a[1]
717 :     psad1 mpr[2] = cur[2], ref2a[2]
718 :    
719 :     (fb) mov currY = backupY
720 :     psad1 mpr[3] = cur[3], ref2a[3]
721 :     psad1 mpr[4] = cur[4], ref2a[4]
722 :    
723 :     add backupX = 1, backupX
724 :     psad1 mpr[5] = cur[5], ref2a[5]
725 :     psad1 mpr[6] = cur[6], ref2a[6]
726 :    
727 :     psad1 mpr[7] = cur[7], ref2a[7]
728 :    
729 :     add dx = -2, dx
730 :     add dy = 1, dy
731 :     ;;
732 :    
733 :     .include "../../src/motion/ia64_asm/calc_delta_2.s"
734 :     (rt) cmp.lt.unc fb, p0 = mpr[8], iMinSAD
735 :     .include "../../src/motion/ia64_asm/calc_delta_3.s"
736 :    
737 :     // Right edge
738 :    
739 :    
740 :     psad1 mpr[0] = cur[0], ref2b[0]
741 :     psad1 mpr[1] = cur[1], ref2b[1]
742 :     psad1 mpr[2] = cur[2], ref2b[2]
743 :     psad1 mpr[3] = cur[3], ref2b[3]
744 :     psad1 mpr[4] = cur[4], ref2b[4]
745 :    
746 :     add backupX = -2, backupX
747 :     psad1 mpr[5] = cur[5], ref2b[5]
748 :     psad1 mpr[6] = cur[6], ref2b[6]
749 :    
750 :     add backupY = 1, backupY
751 :     add dx = 2, dx
752 :     psad1 mpr[7] = cur[7], ref2b[7]
753 :     ;;
754 :    
755 :     .include "../../src/motion/ia64_asm/calc_delta_1.s"
756 :     (l) cmp.lt.unc fb, p0 = iSAD, iMinSAD
757 :     ;;
758 :    
759 :     // Left bottom corner
760 :    
761 :     (fb) mov iMinSAD = iSAD
762 :     psad1 mpr[0] = cur[0], ref0a[1]
763 :    
764 :     (fb) mov currX = backupX
765 :     psad1 mpr[1] = cur[1], ref0a[2]
766 :     psad1 mpr[2] = cur[2], ref0a[3]
767 :    
768 :     (fb) mov currY = backupY
769 :     psad1 mpr[3] = cur[3], ref0a[4]
770 :     psad1 mpr[4] = cur[4], ref0a[5]
771 :    
772 :     add backupX = 2, backupX
773 :     psad1 mpr[5] = cur[5], ref0a[6]
774 :     psad1 mpr[6] = cur[6], ref0a[7]
775 :    
776 :     psad1 mpr[7] = cur[7], ref0a[8]
777 :    
778 :     add dx = -2, dx
779 :     add dy = 1, dy
780 :     ;;
781 :    
782 :     .include "../../src/motion/ia64_asm/calc_delta_2.s"
783 :     (r) cmp.lt.unc fb, p0 = mpr[8], iMinSAD
784 :     .include "../../src/motion/ia64_asm/calc_delta_3.s"
785 :    
786 :     // Bottom edge
787 :    
788 :     psad1 mpr[0] = cur[0], ref1a[1]
789 :     psad1 mpr[1] = cur[1], ref1a[2]
790 :     psad1 mpr[2] = cur[2], ref1a[3]
791 :     psad1 mpr[3] = cur[3], ref1a[4]
792 :     psad1 mpr[4] = cur[4], ref1a[5]
793 :    
794 :     add backupX = -2, backupX
795 :     psad1 mpr[5] = cur[5], ref1a[6]
796 :     psad1 mpr[6] = cur[6], ref1a[7]
797 :    
798 :     add backupY = 1, backupY
799 :     add dx = 1, dx
800 :     psad1 mpr[7] = cur[7], ref1a[8]
801 :     ;;
802 :    
803 :     .include "../../src/motion/ia64_asm/calc_delta_1.s"
804 :     (lb) cmp.lt.unc fb, p0 = iSAD, iMinSAD
805 :     ;;
806 :     // Right bottom corner
807 :    
808 :    
809 :     (fb) mov iMinSAD = iSAD
810 :     psad1 mpr[0] = cur[0], ref0b[1]
811 :    
812 :     (fb) mov currX = backupX
813 :     psad1 mpr[1] = cur[1], ref0b[2]
814 :     psad1 mpr[2] = cur[2], ref0b[3]
815 :    
816 :     (fb) mov currY = backupY
817 :     psad1 mpr[3] = cur[3], ref0b[4]
818 :     psad1 mpr[4] = cur[4], ref0b[5]
819 :    
820 :     add backupX = 1, backupX
821 :     psad1 mpr[5] = cur[5], ref0b[6]
822 :     psad1 mpr[6] = cur[6], ref0b[7]
823 :    
824 :     add dx = 1, dx
825 :     psad1 mpr[7] = cur[7], ref0b[8]
826 :     ;;
827 :    
828 :     .include "../../src/motion/ia64_asm/calc_delta_2.s"
829 :     (b) cmp.lt.unc fb, p0 = mpr[8], iMinSAD
830 :     .include "../../src/motion/ia64_asm/calc_delta_3.s"
831 :    
832 :     (rb) getf.sig ret0 = fmv
833 :     add backupX = 1, backupX
834 :     ;;
835 :     (rb) add iSAD = iSAD, ret0
836 :     ;;
837 :     (rb) cmp.lt.unc fb, p0 = iSAD, iMinSAD
838 :     ;;
839 :     (fb) mov iMinSAD = iSAD
840 :     (fb) mov currX = backupX
841 :     (fb) mov currY = backupY
842 :     ;;
843 :    
844 :     // Write back result
845 :    
846 :     st4 [currMV] = currX
847 :     st4 [currYAddress] = currY
848 :     mov ret0 = iMinSAD
849 :    
850 :     // Restore important registers
851 :    
852 :     ;;
853 :     mov pr = prsave, -1
854 :     mov ar.pfs = pfs
855 :     br.ret.sptk.many b0
856 :    
857 :     .endp Halfpel8_Refine_ia64#

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4