SmallInteger.st
changeset 23996 0e2c9990b86f
parent 23995 978c5a1b5b78
child 24004 7a3254568d7f
equal deleted inserted replaced
23995:978c5a1b5b78 23996:0e2c9990b86f
  1739      the high bits are ignored and clear in the result
  1739      the high bits are ignored and clear in the result
  1740      i.e. xxx.a.b.c.d....x.y.z -> 000.z.y.x...b.a.d.c."
  1740      i.e. xxx.a.b.c.d....x.y.z -> 000.z.y.x...b.a.d.c."
  1741 
  1741 
  1742 %{  /* NOCONTEXT */
  1742 %{  /* NOCONTEXT */
  1743 #ifndef __SCHTEAM__
  1743 #ifndef __SCHTEAM__
  1744     __uint64__ v = __intVal(self);
  1744     unsigned INT v = __intVal(self);
  1745 
  1745 # if __POINTER_SIZE__ == 8
  1746     // swap odd and even bits
  1746     // swap odd and even bits
  1747     v = ((v >> 1) & 0x5555555555555555ULL) | ((v & 0x5555555555555555ULL) << 1);
  1747     v = ((v >> 1) & 0x5555555555555555ULL) | ((v & 0x5555555555555555ULL) << 1);
  1748     // swap consecutive pairs
  1748     // swap consecutive pairs
  1749     v = ((v >> 2) & 0x3333333333333333ULL) | ((v & 0x3333333333333333ULL) << 2);
  1749     v = ((v >> 2) & 0x3333333333333333ULL) | ((v & 0x3333333333333333ULL) << 2);
  1750     // swap nibbles ...
  1750     // swap nibbles ...
  1754     // swap 16bit words
  1754     // swap 16bit words
  1755     v = ((v >> 16) & 0x0000FFFF0000FFFFULL) | ((v & 0x0000FFFF0000FFFFULL) << 16);
  1755     v = ((v >> 16) & 0x0000FFFF0000FFFFULL) | ((v & 0x0000FFFF0000FFFFULL) << 16);
  1756     // swap 32bit words
  1756     // swap 32bit words
  1757     v = ((v >> 32) & 0x00000000FFFFFFFFULL) | ((v & 0x00000000FFFFFFFFULL) << 32);
  1757     v = ((v >> 32) & 0x00000000FFFFFFFFULL) | ((v & 0x00000000FFFFFFFFULL) << 32);
  1758 
  1758 
  1759 # if __POINTER_SIZE__ == 8
       
  1760     if (v <= _MAX_INT) {
  1759     if (v <= _MAX_INT) {
  1761         RETURN ( __mkSmallInteger(v) );
  1760         RETURN ( __mkSmallInteger(v) );
  1762     }
  1761     }
  1763     RETURN (__MKUINT(v));
  1762     RETURN (__MKUINT(v));
  1764 # else
  1763 # else
  1765     RETURN (__MKLARGEINT64(1, (INT)(v >> 32), (INT)(v & 0xFFFFFFFF)));
  1764     // swap odd and even bits
       
  1765     v = ((v >> 1) & 0x55555555UL) | ((v & 0x55555555UL) << 1);
       
  1766     // swap consecutive pairs
       
  1767     v = ((v >> 2) & 0x33333333UL) | ((v & 0x33333333UL) << 2);
       
  1768     // swap nibbles ...
       
  1769     v = ((v >> 4) & 0x0F0F0F0FUL) | ((v & 0x0F0F0F0FUL) << 4);
       
  1770     // swap bytes
       
  1771     v = ((v >> 8) & 0x00FF00FFUL) | ((v & 0x00FF00FFUL) << 8);
       
  1772     // swap 16bit words
       
  1773     v = ((v >> 16) & 0x0000FFFFUL) | ((v & 0x0000FFFFUL) << 16);
       
  1774     // swap 32bit words
       
  1775     
       
  1776     RETURN (__MKLARGEINT64(1, (INT)v, (INT)0));
  1766 # endif
  1777 # endif
  1767 #endif /* not __SCHTEAM__ */
  1778 #endif /* not __SCHTEAM__ */
  1768 %}.
  1779 %}.
  1769     ^ super bitReversed64
  1780     ^ super bitReversed64
  1770 
  1781