_sgnu_sub.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _sgnu_sub.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #define MAX_WORD     0xFFFFFFFF
  12. typedef unsigned long  word;
  13. typedef unsigned int sz_t;
  14. extern sz_t School_Sub(word *a, sz_t a_used, word *b, sz_t b_used, word* diff)
  15. {
  16.   /* compute diff = a - b    (a > b) */
  17.   word* d_stop = diff + a_used;
  18.   int n = b_used / 16;
  19.   int r = b_used % 16; 
  20.   word  aa;
  21.   word  bb;
  22. #define SUB_LOOP_BODY {
  23. aa = *a++;
  24. bb = *b++;
  25. asm volatile ("subxcc  %2,%1,%0" : "=r"(aa) : "r"(bb), "0"(aa) );
  26. *diff++ = aa; }
  27.   asm volatile ("addcc  %%g0,%%g0,%0" : "=r"(bb) : );
  28.   switch (r) 
  29.    { case 15: SUB_LOOP_BODY;
  30.      case 14: SUB_LOOP_BODY;
  31.      case 13: SUB_LOOP_BODY;
  32.      case 12: SUB_LOOP_BODY;
  33.      case 11: SUB_LOOP_BODY;
  34.      case 10: SUB_LOOP_BODY;
  35.      case  9: SUB_LOOP_BODY;
  36.      case  8: SUB_LOOP_BODY;
  37.      case  7: SUB_LOOP_BODY;
  38.      case  6: SUB_LOOP_BODY;
  39.      case  5: SUB_LOOP_BODY;
  40.      case  4: SUB_LOOP_BODY;
  41.      case  3: SUB_LOOP_BODY;
  42.      case  2: SUB_LOOP_BODY;
  43.      case  1: SUB_LOOP_BODY;
  44.      case  0: asm volatile ("addx  %%g0,%%g0,%0" : "=r"(bb) : );
  45.     }
  46.   while (n--)
  47.   { asm volatile ("addcc 0xffffffff,%1,%0" : "=r"(bb) : "0"(bb) );
  48.     SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; 
  49.     SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; 
  50.     SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; 
  51.     SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY; SUB_LOOP_BODY;
  52.     asm volatile ("addx  %%g0,%%g0,%0" : "=r"(bb) : );
  53.    }
  54.   if (diff != a) /* Copy_Vector(diff,a,a_used-b_used); */
  55.       for(b=diff; b != d_stop; b++) *b = *a++;
  56.   if (bb)
  57.     while (--*diff == MAX_WORD) diff++;
  58.   while (*--d_stop == 0) a_used--;
  59.   return a_used;
  60. }