motion_est_mvi_asm.S
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:6k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Alpha optimized DSP utils
  3.  * Copyright (c) 2002 Falk Hueffner <falk@debian.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. #include "regdef.h"
  20. /* Some nicer register names.  */
  21. #define ta t10
  22. #define tb t11
  23. #define tc t12
  24. #define td AT
  25. /* Danger: these overlap with the argument list and the return value */
  26. #define te a5
  27. #define tf a4
  28. #define tg a3
  29. #define th v0
  30.         
  31.         .set noat
  32.         .set noreorder
  33.         .arch pca56
  34.         .text
  35. /*****************************************************************************
  36.  * int pix_abs16x16_mvi_asm(uint8_t *pix1, uint8_t *pix2, int line_size)
  37.  *
  38.  * This code is written with a pca56 in mind. For ev6, one should
  39.  * really take the increased latency of 3 cycles for MVI instructions
  40.  * into account.
  41.  *
  42.  * It is important to keep the loading and first use of a register as
  43.  * far apart as possible, because if a register is accessed before it
  44.  * has been fetched from memory, the CPU will stall.
  45.  */
  46.         .align 4
  47.         .globl pix_abs16x16_mvi_asm
  48.         .ent pix_abs16x16_mvi_asm
  49. pix_abs16x16_mvi_asm:
  50.         .frame sp, 0, ra, 0
  51.         .prologue 0
  52. #ifdef HAVE_GPROF
  53.         lda     AT, _mcount
  54.         jsr     AT, (AT), _mcount
  55. #endif
  56.         and     a1, 7, t0
  57.         clr     v0
  58.         lda     a3, 16
  59.         beq     t0, $aligned
  60.         .align 4
  61. $unaligned:
  62.         /* Registers:
  63.            line 0:
  64.            t0:  left_u -> left lo -> left
  65.            t1:  mid
  66.            t2:  right_u -> right hi -> right
  67.            t3:  ref left
  68.            t4:  ref right
  69.            line 1:
  70.            t5:  left_u -> left lo -> left
  71.            t6:  mid
  72.            t7:  right_u -> right hi -> right
  73.            t8:  ref left
  74.            t9:  ref right
  75.            temp:
  76.            ta:  left hi
  77.            tb:  right lo
  78.            tc:  error left
  79.            td:  error right  */
  80.         /* load line 0 */
  81.         ldq_u   t0, 0(a1)       # left_u
  82.         ldq_u   t1, 8(a1)       # mid
  83.         ldq_u   t2, 16(a1)      # right_u
  84.         ldq     t3, 0(a0)       # ref left
  85.         ldq     t4, 8(a0)       # ref right
  86.         addq    a0, a2, a0      # pix1
  87.         addq    a1, a2, a1      # pix2
  88.         /* load line 1 */        
  89.         ldq_u   t5, 0(a1)       # left_u
  90.         ldq_u   t6, 8(a1)       # mid
  91.         ldq_u   t7, 16(a1)      # right_u
  92.         ldq     t8, 0(a0)       # ref left
  93.         ldq     t9, 8(a0)       # ref right
  94.         addq    a0, a2, a0      # pix1
  95.         addq    a1, a2, a1      # pix2
  96.         /* calc line 0 */
  97.         extql   t0, a1, t0      # left lo
  98.         extqh   t1, a1, ta      # left hi
  99.         extql   t1, a1, tb      # right lo
  100.         or      t0, ta, t0      # left
  101.         extqh   t2, a1, t2      # right hi
  102.         perr    t3, t0, tc      # error left
  103.         or      t2, tb, t2      # right
  104.         perr    t4, t2, td      # error right
  105.         addq    v0, tc, v0      # add error left
  106.         addq    v0, td, v0      # add error left
  107.         /* calc line 1 */
  108.         extql   t5, a1, t5      # left lo
  109.         extqh   t6, a1, ta      # left hi
  110.         extql   t6, a1, tb      # right lo
  111.         or      t5, ta, t5      # left
  112.         extqh   t7, a1, t7      # right hi
  113.         perr    t8, t5, tc      # error left
  114.         or      t7, tb, t7      # right
  115.         perr    t9, t7, td      # error right
  116.         addq    v0, tc, v0      # add error left
  117.         addq    v0, td, v0      # add error left
  118.         /* loop */
  119.         subq    a3,  2, a3      # h -= 2
  120.         bne     a3, $unaligned
  121.         ret
  122.         .align 4
  123. $aligned:
  124.         /* load line 0 */
  125.         ldq     t0, 0(a1)       # left
  126.         ldq     t1, 8(a1)       # right
  127.         addq    a1, a2, a1      # pix2
  128.         ldq     t2, 0(a0)       # ref left
  129.         ldq     t3, 8(a0)       # ref right
  130.         addq    a0, a2, a0      # pix1
  131.         /* load line 1 */
  132.         ldq     t4, 0(a1)       # left
  133.         ldq     t5, 8(a1)       # right
  134.         addq    a1, a2, a1      # pix2
  135.         ldq     t6, 0(a0)       # ref left
  136.         ldq     t7, 8(a0)       # ref right
  137.         addq    a0, a2, a0      # pix1
  138.         /* load line 2 */
  139.         ldq     t8, 0(a1)       # left
  140.         ldq     t9, 8(a1)       # right
  141.         addq    a1, a2, a1      # pix2
  142.         ldq     ta, 0(a0)       # ref left
  143.         ldq     tb, 8(a0)       # ref right
  144.         addq    a0, a2, a0      # pix1
  145.         /* load line 3 */
  146.         ldq     tc, 0(a1)       # left
  147.         ldq     td, 8(a1)       # right
  148.         addq    a1, a2, a1      # pix2
  149.         ldq     te, 0(a0)       # ref left
  150.         ldq     tf, 8(a0)       # ref right
  151.         /* calc line 0 */
  152.         perr    t0, t2, t0      # error left
  153.         addq    a0, a2, a0      # pix1
  154.         perr    t1, t3, t1      # error right
  155.         addq    v0, t0, v0      # add error left
  156.         /* calc line 1 */
  157.         perr    t4, t6, t0      # error left
  158.         addq    v0, t1, v0      # add error right
  159.         perr    t5, t7, t1      # error right
  160.         addq    v0, t0, v0      # add error left
  161.         /* calc line 2 */
  162.         perr    t8, ta, t0      # error left
  163.         addq    v0, t1, v0      # add error right
  164.         perr    t9, tb, t1      # error right
  165.         addq    v0, t0, v0      # add error left
  166.         /* calc line 3 */
  167.         perr    tc, te, t0      # error left
  168.         addq    v0, t1, v0      # add error right
  169.         perr    td, tf, t1      # error right
  170.         addq    v0, t0, v0      # add error left
  171.         addq    v0, t1, v0      # add error right
  172.         /* loop */
  173.         subq    a3,  4, a3      # h -= 4
  174.         bne     a3, $aligned
  175.         ret
  176.         .end pix_abs16x16_mvi_asm