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 |