mpv_sparc.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:9k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is a SPARC/VIS optimized multiply and add function
  13.  *
  14.  * The Initial Developer of the Original Code is Sun Microsystems Inc.
  15.  * Portions created by Sun Microsystems Inc. are 
  16.  * Copyright (C) 1999-2000 Sun Microsystems Inc.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s):
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL"), in which case the provisions of the GPL are applicable 
  23.  * instead of those above. If you wish to allow use of your 
  24.  * version of this file only under the terms of the GPL and not to
  25.  * allow others to use your version of this file under the MPL,
  26.  * indicate your decision by deleting the provisions above and
  27.  * replace them with the notice and other provisions required by
  28.  * the GPL.  If you do not delete the provisions above, a recipient
  29.  * may use your version of this file under either the MPL or the
  30.  * GPL.
  31.  *  $Id: mpv_sparc.c,v 1.1 2000/09/29 23:38:01 nelsonb%netscape.com Exp $
  32.  */
  33. #include "vis_proto.h"
  34. /***************************************************************/
  35. typedef  int                t_s32;
  36. typedef  unsigned int       t_u32;
  37. #if defined(__sparcv9)
  38. typedef  long               t_s64;
  39. typedef  unsigned long      t_u64;
  40. #else
  41. typedef  long long          t_s64;
  42. typedef  unsigned long long t_u64;
  43. #endif
  44. typedef  double             t_d64;
  45. /***************************************************************/
  46. typedef union {
  47.   t_d64 d64;
  48.   struct {
  49.     t_s32 i0;
  50.     t_s32 i1;
  51.   } i32s;
  52. } d64_2_i32;
  53. /***************************************************************/
  54. #define BUFF_SIZE  256
  55. #define A_BITS  21
  56. #define A_MASK  ((1 << A_BITS) - 1)
  57. /***************************************************************/
  58. static t_u64 mask_cnst[] = {
  59.   0x8000000080000000ull
  60. };
  61. /***************************************************************/
  62. #define DEF_VARS(N)                     
  63.   t_d64 *py = (t_d64*)y;                
  64.   t_d64 mask = *((t_d64*)mask_cnst);    
  65.   t_d64 ca = (1u << 31) - 1;            
  66.   t_d64 da = (t_d64)a;                  
  67.   t_s64 buff[N], s;                     
  68.   d64_2_i32 dy
  69. /***************************************************************/
  70. #define MUL_U32_S64_1(i)                                        
  71.   dy.f32s.i0 = vis_fxnors(vis_read_hi(mask), ((t_f32*)y)[0]);   
  72.   buff[0] = (ca - (t_d64)dy.i32s.i0) * da
  73. #define MUL_U32_S64_1_D()                                       
  74.   dy.f32s.i0 = vis_fxnors(vis_read_hi(mask), ((t_f32*)y)[0]);   
  75.   d0 = ca - (t_d64)dy.i32s.i0;                                  
  76.   buff[0] = (t_s64)(d0 * da);                                   
  77.   buff[1] = (t_s64)(d0 * db);                                   
  78. #define MUL_U32_S64_1_E(i)                                      
  79.   dy.f32s.i0 = vis_fxnors(vis_read_hi(mask), ((t_f32*)y)[0]);   
  80.   d0 = ca - (t_d64)dy.i32s.i0;                                  
  81.   buff[0] = (t_s64)(d0 * da);                                   
  82.   buff[1] = (t_s64)(d0 * db - (1ULL << 63))
  83. /************ ***************************************************/
  84. #define MUL_U32_S64_2(i)                                
  85.   dy.d64 = vis_fxnor(mask, py[i]);                      
  86.   buff[2*(i)  ] = (ca - (t_d64)dy.i32s.i0) * da;        
  87.   buff[2*(i)+1] = (ca - (t_d64)dy.i32s.i1) * da
  88. #define MUL_U32_S64_2_D(i)              
  89.   dy.d64 = vis_fxnor(mask, py[i]);      
  90.   d0 = ca - (t_d64)dy.i32s.i0;          
  91.   d1 = ca - (t_d64)dy.i32s.i1;          
  92.   buff[4*(i)  ] = (t_s64)(d0 * da);     
  93.   buff[4*(i)+1] = (t_s64)(d0 * db);     
  94.   buff[4*(i)+2] = (t_s64)(d1 * da);     
  95.   buff[4*(i)+3] = (t_s64)(d1 * db)
  96. #define MUL_U32_S64_2_E(i)                              
  97.   dy.d64 = vis_fxnor(mask, py[i]);                      
  98.   d0 = ca - (t_d64)dy.i32s.i0;                          
  99.   d1 = ca - (t_d64)dy.i32s.i1;                          
  100.   buff[4*(i)  ] = (t_s64)(d0 * da);                     
  101.   buff[4*(i)+1] = (t_s64)(d0 * db - (1ULL << 63));      
  102.   buff[4*(i)+2] = (t_s64)(d1 * da);                     
  103.   buff[4*(i)+3] = (t_s64)(d1 * db - (1ULL << 63))
  104. /***************************************************************/
  105. #define ADD_S64_U32(i)          
  106.   s = buff[i] + x[i] + c;       
  107.   z[i] = s;                     
  108.   c = (s >> 32)
  109. #define ADD_S64_U32_D(i)                        
  110.   s = buff[2*(i)] + buff[2*(i)+1] + x[i] + c;   
  111.   z[i] = s;                                     
  112.   c = (s >> 32)
  113. #define ADD_S64_U32_E(i)                                        
  114.   s =  buff[2*(i)] + buff[2*(i)+1] + x[i] + uc + (1ULL << 63);  
  115.   z[i] = s;                                                     
  116.   uc = ((t_u64)s >> 32)
  117. /***************************************************************/
  118. #define MUL_U32_S64_8(i)        
  119.   MUL_U32_S64_2(i);             
  120.   MUL_U32_S64_2(i+1);           
  121.   MUL_U32_S64_2(i+2);           
  122.   MUL_U32_S64_2(i+3)
  123. #define MUL_U32_S64_D_8(i)      
  124.   MUL_U32_S64_2_D(i);           
  125.   MUL_U32_S64_2_D(i+1);         
  126.   MUL_U32_S64_2_D(i+2);         
  127.   MUL_U32_S64_2_D(i+3)
  128. #define MUL_U32_S64_E_8(i)      
  129.   MUL_U32_S64_2_E(i);           
  130.   MUL_U32_S64_2_E(i+1);         
  131.   MUL_U32_S64_2_E(i+2);         
  132.   MUL_U32_S64_2_E(i+3)
  133. /***************************************************************/
  134. #define ADD_S64_U32_8(i)        
  135.   ADD_S64_U32(i);               
  136.   ADD_S64_U32(i+1);             
  137.   ADD_S64_U32(i+2);             
  138.   ADD_S64_U32(i+3);             
  139.   ADD_S64_U32(i+4);             
  140.   ADD_S64_U32(i+5);             
  141.   ADD_S64_U32(i+6);             
  142.   ADD_S64_U32(i+7)
  143. #define ADD_S64_U32_D_8(i)      
  144.   ADD_S64_U32_D(i);             
  145.   ADD_S64_U32_D(i+1);           
  146.   ADD_S64_U32_D(i+2);           
  147.   ADD_S64_U32_D(i+3);           
  148.   ADD_S64_U32_D(i+4);           
  149.   ADD_S64_U32_D(i+5);           
  150.   ADD_S64_U32_D(i+6);           
  151.   ADD_S64_U32_D(i+7)
  152. #define ADD_S64_U32_E_8(i)      
  153.   ADD_S64_U32_E(i);             
  154.   ADD_S64_U32_E(i+1);           
  155.   ADD_S64_U32_E(i+2);           
  156.   ADD_S64_U32_E(i+3);           
  157.   ADD_S64_U32_E(i+4);           
  158.   ADD_S64_U32_E(i+5);           
  159.   ADD_S64_U32_E(i+6);           
  160.   ADD_S64_U32_E(i+7)
  161. /***************************************************************/
  162. t_u32 mul_add(t_u32 *z, t_u32 *x, t_u32 *y, int n, t_u32 a)
  163. {
  164.   if (a < (1 << A_BITS)) {
  165.     if (n == 8) {
  166.       DEF_VARS(8);
  167.       t_s32 c = 0;
  168.       MUL_U32_S64_8(0);
  169.       ADD_S64_U32_8(0);
  170.       return c;
  171.     } else if (n == 16) {
  172.       DEF_VARS(16);
  173.       t_s32 c = 0;
  174.       MUL_U32_S64_8(0);
  175.       MUL_U32_S64_8(4);
  176.       ADD_S64_U32_8(0);
  177.       ADD_S64_U32_8(8);
  178.       return c;
  179.     } else {
  180.       DEF_VARS(BUFF_SIZE);
  181.       t_s32 i, c = 0;
  182. #pragma pipeloop(0)
  183.       for (i = 0; i < (n+1)/2; i ++) {
  184.         MUL_U32_S64_2(i);
  185.       }
  186. #pragma pipeloop(0)
  187.       for (i = 0; i < n; i ++) {
  188.         ADD_S64_U32(i);
  189.       }
  190.       return c;
  191.     }
  192.   } else if (a < (1u << 31)) {
  193.     if (n == 8) {
  194.       DEF_VARS(2*8);
  195.       t_d64 d0, d1, db;
  196.       t_s32 c = 0;
  197.       da = (t_d64)(a &  A_MASK);
  198.       db = (t_d64)(a &~ A_MASK);
  199.       MUL_U32_S64_D_8(0);
  200.       ADD_S64_U32_D_8(0);
  201.       return c;
  202.     } else if (n == 16) {
  203.       DEF_VARS(2*16);
  204.       t_d64 d0, d1, db;
  205.       t_s32 c = 0;
  206.       da = (t_d64)(a &  A_MASK);
  207.       db = (t_d64)(a &~ A_MASK);
  208.       MUL_U32_S64_D_8(0);
  209.       MUL_U32_S64_D_8(4);
  210.       ADD_S64_U32_D_8(0);
  211.       ADD_S64_U32_D_8(8);
  212.       return c;
  213.     } else {
  214.       DEF_VARS(2*BUFF_SIZE);
  215.       t_d64 d0, d1, db;
  216.       t_s32 i, c = 0;
  217.       da = (t_d64)(a &  A_MASK);
  218.       db = (t_d64)(a &~ A_MASK);
  219. #pragma pipeloop(0)
  220.       for (i = 0; i < (n+1)/2; i ++) {
  221.         MUL_U32_S64_2_D(i);
  222.       }
  223. #pragma pipeloop(0)
  224.       for (i = 0; i < n; i ++) {
  225.         ADD_S64_U32_D(i);
  226.       }
  227.       return c;
  228.     }
  229.   } else {
  230.     if (n == 8) {
  231.       DEF_VARS(2*8);
  232.       t_d64 d0, d1, db;
  233.       t_u32 uc = 0;
  234.       da = (t_d64)(a &  A_MASK);
  235.       db = (t_d64)(a &~ A_MASK);
  236.       MUL_U32_S64_E_8(0);
  237.       ADD_S64_U32_E_8(0);
  238.       return uc;
  239.     } else if (n == 16) {
  240.       DEF_VARS(2*16);
  241.       t_d64 d0, d1, db;
  242.       t_u32 uc = 0;
  243.       da = (t_d64)(a &  A_MASK);
  244.       db = (t_d64)(a &~ A_MASK);
  245.       MUL_U32_S64_E_8(0);
  246.       MUL_U32_S64_E_8(4);
  247.       ADD_S64_U32_E_8(0);
  248.       ADD_S64_U32_E_8(8);
  249.       return uc;
  250.     } else {
  251.       DEF_VARS(2*BUFF_SIZE);
  252.       t_d64 d0, d1, db;
  253.       t_u32 uc = 0;
  254.       t_s32 i;
  255.       da = (t_d64)(a &  A_MASK);
  256.       db = (t_d64)(a &~ A_MASK);
  257. #pragma pipeloop(0)
  258.       for (i = 0; i < (n+1)/2; i ++) {
  259.         MUL_U32_S64_2_E(i);
  260.       }
  261. #pragma pipeloop(0)
  262.       for (i = 0; i < n; i ++) {
  263.         ADD_S64_U32_E(i);
  264.       }
  265.       return uc;
  266.     }
  267.   }
  268. }
  269. /***************************************************************/
  270. t_u32 mul_add_inp(t_u32 *x, t_u32 *y, int n, t_u32 a)
  271. {
  272.   return mul_add(x, x, y, n, a);
  273. }
  274. /***************************************************************/