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 |