SmallInteger.st
changeset 24006 5eedbb97db6a
parent 24004 7a3254568d7f
child 24100 9949ffc76053
equal deleted inserted replaced
24005:813a3a6e3af4 24006:5eedbb97db6a
  1470 	    RETURN (__MKUINT(val) );
  1470 	    RETURN (__MKUINT(val) );
  1471 	}
  1471 	}
  1472     }
  1472     }
  1473 # else
  1473 # else
  1474 #  if __POINTER_SIZE__ == 8
  1474 #  if __POINTER_SIZE__ == 8
  1475 #   define HALF_INT_MAX     0xFFFFFFFFFFFFFFFF
  1475 #   define HALF_INT_MAX     0xFFFFFFFFFFFFFFFFLL
  1476 #   define M55555555        0x5555555555555555
  1476 #   define M55555555        0x5555555555555555LL
  1477 #   define M33333333        0x3333333333333333
  1477 #   define M33333333        0x3333333333333333LL
  1478 #   define M0F0F0F0F        0x0F0F0F0F0F0F0F0F
  1478 #   define M0F0F0F0F        0x0F0F0F0F0F0F0F0FLL
  1479 #   define M00FF00FF        0x00FF00FF00FF00FF
  1479 #   define M00FF00FF        0x00FF00FF00FF00FFLL
  1480 #   define M0000FFFF        0x0000FFFF0000FFFF
  1480 #   define M0000FFFF        0x0000FFFF0000FFFFLL
  1481 #  else
  1481 #  else
  1482 #   define HALF_INT_MAX     0xFFFFFFFF
  1482 #   define HALF_INT_MAX     0xFFFFFFFFL
  1483 #   define M55555555        0x55555555
  1483 #   define M55555555        0x55555555L
  1484 #   define M33333333        0x33333333
  1484 #   define M33333333        0x33333333L
  1485 #   define M0F0F0F0F        0x0F0F0F0F
  1485 #   define M0F0F0F0F        0x0F0F0F0FL
  1486 #   define M00FF00FF        0x00FF00FF
  1486 #   define M00FF00FF        0x00FF00FFL
  1487 #   define M0000FFFF        0
  1487 #   define M0000FFFF        0
  1488 #  endif
  1488 #  endif
  1489 
  1489 
  1490     if (__isSmallInteger(anInteger)) {
  1490     if (__isSmallInteger(anInteger)) {
  1491 	INT _a = __intVal(self);
  1491 	INT _a = __intVal(self);
  1492 	INT _b = __intVal(anInteger);
  1492 	INT _b = __intVal(anInteger);
  1493 
  1493 
  1494 	if ( (((unsigned)_a)<=HALF_INT_MAX) && (((unsigned)_b)<=HALF_INT_MAX) )  {
  1494 	if ( (((unsigned INT)_a)<=HALF_INT_MAX) && (((unsigned INT)_b)<=HALF_INT_MAX) )  {
  1495 	    unsigned INT val;
  1495 	    unsigned INT val;
  1496 
  1496 
       
  1497 	    // spread the bits (...xxx -> ...0x0x0x)
  1497 	    _a = (_a | (_a << 16)) & M0000FFFF;
  1498 	    _a = (_a | (_a << 16)) & M0000FFFF;
  1498 	    _a = (_a | (_a << 8))  & M00FF00FF;
  1499 	    _a = (_a | (_a << 8))  & M00FF00FF;
  1499 	    _a = (_a | (_a << 4))  & M0F0F0F0F;
  1500 	    _a = (_a | (_a << 4))  & M0F0F0F0F;
  1500 	    _a = (_a | (_a << 2))  & M33333333;
  1501 	    _a = (_a | (_a << 2))  & M33333333;
  1501 	    _a = (_a | (_a << 1))  & M55555555;
  1502 	    _a = (_a | (_a << 1))  & M55555555;
  1504 	    _b = (_b | (_b << 8))  & M00FF00FF;
  1505 	    _b = (_b | (_b << 8))  & M00FF00FF;
  1505 	    _b = (_b | (_b << 4))  & M0F0F0F0F;
  1506 	    _b = (_b | (_b << 4))  & M0F0F0F0F;
  1506 	    _b = (_b | (_b << 2))  & M33333333;
  1507 	    _b = (_b | (_b << 2))  & M33333333;
  1507 	    _b = (_b | (_b << 1))  & M55555555;
  1508 	    _b = (_b | (_b << 1))  & M55555555;
  1508 
  1509 
       
  1510 	    // merge the bits (...0a0a0a and ...0b0b0b => ...bababa)
  1509 	    val = _a | (_b << 1);
  1511 	    val = _a | (_b << 1);
  1510 	    RETURN (__MKUINT(val) );
  1512 	    RETURN (__MKUINT(val) );
  1511 	}
  1513 	}
  1512     }
  1514     }
  1513 
  1515 
  1757 
  1759 
  1758     if (v <= _MAX_INT) {
  1760     if (v <= _MAX_INT) {
  1759         RETURN ( __mkSmallInteger(v) );
  1761         RETURN ( __mkSmallInteger(v) );
  1760     }
  1762     }
  1761     RETURN (__MKUINT(v));
  1763     RETURN (__MKUINT(v));
  1762 # elseif 0 
  1764 # else
  1763     // DISABLED, BECAUSE THIS CODE DOES NOT WORK!
       
  1764     // It ignores the high 64 bits!
       
  1765     // See RegressionTests::IntegerTest >> #testBitReversed 
       
  1766 
       
  1767     // swap odd and even bits
  1765     // swap odd and even bits
  1768     v = ((v >> 1) & 0x55555555UL) | ((v & 0x55555555UL) << 1);
  1766     v = ((v >> 1) & 0x55555555UL) | ((v & 0x55555555UL) << 1);
  1769     // swap consecutive pairs
  1767     // swap consecutive pairs
  1770     v = ((v >> 2) & 0x33333333UL) | ((v & 0x33333333UL) << 2);
  1768     v = ((v >> 2) & 0x33333333UL) | ((v & 0x33333333UL) << 2);
  1771     // swap nibbles ...
  1769     // swap nibbles ...
  1773     // swap bytes
  1771     // swap bytes
  1774     v = ((v >> 8) & 0x00FF00FFUL) | ((v & 0x00FF00FFUL) << 8);
  1772     v = ((v >> 8) & 0x00FF00FFUL) | ((v & 0x00FF00FFUL) << 8);
  1775     // swap 16bit words
  1773     // swap 16bit words
  1776     v = ((v >> 16) & 0x0000FFFFUL) | ((v & 0x0000FFFFUL) << 16);
  1774     v = ((v >> 16) & 0x0000FFFFUL) | ((v & 0x0000FFFFUL) << 16);
  1777     // swap 32bit words
  1775     // swap 32bit words
  1778     
  1776     RETURN (__MKLARGEINT64(1, (INT)0, (INT)v));
  1779     RETURN (__MKLARGEINT64(1, (INT)v, (INT)0));
       
  1780 # endif
  1777 # endif
  1781 #endif /* not __SCHTEAM__ */
  1778 #endif /* not __SCHTEAM__ */
  1782 %}.
  1779 %}.
  1783     ^ super bitReversed64
  1780     ^ super bitReversed64
  1784 
  1781