SmallInteger.st
branchjv
changeset 18117 eb433f2c42b2
parent 18080 9ae1db7ef04a
parent 15910 33ea5acc0934
child 18120 e3a375d5f6a8
equal deleted inserted replaced
18116:bf7f37b63ea2 18117:eb433f2c42b2
  1722     "
  1722     "
  1723 ! !
  1723 ! !
  1724 
  1724 
  1725 !SmallInteger methodsFor:'byte access'!
  1725 !SmallInteger methodsFor:'byte access'!
  1726 
  1726 
  1727 byteSwapped
  1727 byteSwapped 
  1728     "lsb -> msb;
  1728     "lsb -> msb;
  1729      i.e. a.b.c.d -> d.c.b.a"
  1729      i.e. a.b.c.d -> d.c.b.a"
  1730 
  1730 
  1731 %{  /* NOCONTEXT */
  1731     SmallInteger maxBytes == 8 ifTrue:[
  1732 
  1732         ^ self byteSwapped64
       
  1733     ] ifFalse:[
       
  1734         ^ self byteSwapped32
       
  1735     ].
       
  1736 
       
  1737     "
       
  1738      16r11223344 byteSwapped hexPrintString  
       
  1739      16r44332211 byteSwapped hexPrintString   
       
  1740     "
       
  1741 
       
  1742     "Created: / 09-01-2012 / 23:01:33 / cg"
       
  1743 !
       
  1744 
       
  1745 byteSwapped16
       
  1746     "for 16bit values only:
       
  1747      lsb -> msb;
       
  1748      i.e. a.b -> b.a"
       
  1749 
       
  1750 %{  /* NOCONTEXT */
       
  1751     unsigned INT v = __intVal(self);
       
  1752     unsigned INT swapped;
       
  1753 
       
  1754     swapped = ((v>>8)&0xFF) | ((v & 0xFF)<<8);
       
  1755     RETURN (__mkSmallInteger(swapped));
       
  1756 %}.
       
  1757 
       
  1758     "
       
  1759      16r1122 byteSwapped16 hexPrintString   
       
  1760      16r2211 byteSwapped16 hexPrintString   
       
  1761      16r332211 byteSwapped16 hexPrintString   
       
  1762     "
       
  1763 !
       
  1764 
       
  1765 byteSwapped32
       
  1766     "for 32bit values only:
       
  1767      lsb -> msb;
       
  1768      i.e. a.b.c.d -> d.c.b.a"
       
  1769 
       
  1770 %{  /* NOCONTEXT */
       
  1771     unsigned INT v = __intVal(self);
       
  1772     unsigned INT swapped;
       
  1773 
       
  1774 #undef HAVE_BSWAP
  1733 #if __POINTER_SIZE__ == 4
  1775 #if __POINTER_SIZE__ == 4
  1734     unsigned int v = __intVal(self);
  1776 
  1735     unsigned int swapped;
  1777 # if defined(USE_BSWAP) && defined(__BORLANDC__)
  1736 
  1778 #   define HAVE_BSWAP
  1737 # ifdef __BORLANDC__
  1779 
  1738 #  ifdef USE_BSWAP
       
  1739     _asm {
  1780     _asm {
  1740 	mov eax, v
  1781         mov eax, v
  1741 	bswap eax
  1782         bswap eax
  1742 	mov swapped, eax
  1783         mov swapped, eax
  1743     };
  1784     };
  1744 #  else
  1785 # endif
       
  1786 # if defined(USE_BSWAP) && defined(__VISUALC__)
       
  1787 #   define HAVE_BSWAP
       
  1788 
  1745     _asm {
  1789     _asm {
  1746 	mov eax, v
  1790         mov eax, v
  1747 	xchg al, ah
  1791         xchg al, ah
  1748 	rol eax, 16
  1792         rol eax, 16
  1749 	xchg al, ah
  1793         xchg al, ah
  1750 	mov swapped, eax
  1794         mov swapped, eax
  1751     };
  1795     };
  1752 #  endif
  1796 # endif
  1753 # else
  1797 # if defined(USE_BSWAP) && defined(__GNUC__)
       
  1798 #   define HAVE_BSWAP
       
  1799 
       
  1800     asm("movl %0, %%eax \n\
       
  1801          bswap %%eax    \n\
       
  1802          movl %%eax, %1 \n\
       
  1803         "
       
  1804         : "=rm"  (swapped)
       
  1805         : "rm"   (v));
       
  1806 # endif
       
  1807 #endif /* __POINTER_SIZE__ == 4 */
       
  1808 
       
  1809 #if __POINTER_SIZE__ == 8
       
  1810     v &= 0xFFFFFFFF;
       
  1811 
       
  1812 # if defined(__x86_64__) && defined(__GNUC__)
       
  1813 #   define HAVE_BSWAP
       
  1814 
       
  1815     asm("movq %0, %%rax \n\
       
  1816          bswap %%eax    \n\
       
  1817          movq %%rax, %1 \n\
       
  1818         "
       
  1819         : "=rm"  (swapped)
       
  1820         : "rm"   (v));
       
  1821 # endif
       
  1822 #endif
       
  1823 
       
  1824 #ifndef HAVE_BSWAP
  1754     swapped = ((v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24));
  1825     swapped = ((v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24));
  1755 # endif
  1826 #endif
       
  1827 
  1756     RETURN (__MKUINT(swapped));
  1828     RETURN (__MKUINT(swapped));
  1757 #endif /* __POINTER_SIZE__ */
  1829 %}.
  1758 %}.
  1830 
  1759     ^ super byteSwapped
  1831     "
  1760 
  1832      16r11223344 byteSwapped32 hexPrintString  
  1761     "
  1833      16r44332211 byteSwapped32 hexPrintString   
  1762      16r11223344 byteSwapped hexPrintString
  1834     "
  1763      16r44332211 byteSwapped hexPrintString
  1835 
       
  1836     "Created: / 09-01-2012 / 23:01:33 / cg"
       
  1837 !
       
  1838 
       
  1839 byteSwapped64
       
  1840     "for 64bit values only:
       
  1841      lsb -> msb;
       
  1842      i.e. a.b.c.d.e.f.g.h -> h.g.f.e.d.c.b.a"
       
  1843 
       
  1844 %{  /* NOCONTEXT */
       
  1845     unsigned INT v = __intVal(self);
       
  1846     unsigned INT swapped;
       
  1847 
       
  1848 #if __POINTER_SIZE__ == 4
       
  1849     //   xxxxxxxx 00000000 00000000 00000000 -> 00000000 00000000 00000000 xxxxxxxx  
       
  1850     //            xxxxxxxx                                        xxxxxxxx
       
  1851     //                     xxxxxxxx                      xxxxxxxx
       
  1852     //                              xxxxxxxx    xxxxxxxx
       
  1853     swapped = (v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24);
       
  1854 #else
       
  1855     //   xxxxxxxx 00000000 00000000 00000000 -> 00000000 00000000 00000000 xxxxxxxx  
       
  1856     //            xxxxxxxx                                        xxxxxxxx
       
  1857     //                     xxxxxxxx                      xxxxxxxx
       
  1858     //                              xxxxxxxx    xxxxxxxx
       
  1859     swapped =  (v>>56) | ((v>>40)&0xFF00) | ((v>>24) & 0xFF0000) | ((v>>8) & 0xFF000000)
       
  1860                 | ((v & 0xFF000000)<<8) | ((v & 0x00FF0000)<<24) | ((v & 0x0000FF00)<<40)
       
  1861                 | ((v & 0xFF)<<56);
       
  1862 #endif
       
  1863     return __MKUINT( swapped );
       
  1864 %}.
       
  1865 
       
  1866     "
       
  1867      16r11223344 byteSwapped64 hexPrintString  
       
  1868      16r44332211 byteSwapped64 hexPrintString   
  1764     "
  1869     "
  1765 
  1870 
  1766     "Created: / 09-01-2012 / 23:01:33 / cg"
  1871     "Created: / 09-01-2012 / 23:01:33 / cg"
  1767 !
  1872 !
  1768 
  1873 
  4296 ! !
  4401 ! !
  4297 
  4402 
  4298 !SmallInteger class methodsFor:'documentation'!
  4403 !SmallInteger class methodsFor:'documentation'!
  4299 
  4404 
  4300 version
  4405 version
  4301     ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.212 2013-08-04 10:02:36 cg Exp $'
  4406     ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.213 2014-01-25 21:34:10 cg Exp $'
  4302 !
  4407 !
  4303 
  4408 
  4304 version_CVS
  4409 version_CVS
  4305     ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.212 2013-08-04 10:02:36 cg Exp $'
  4410     ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.213 2014-01-25 21:34:10 cg Exp $'
  4306 ! !
  4411 ! !
  4307 
  4412 
  4308 
  4413 
  4309 SmallInteger initialize!
  4414 SmallInteger initialize!