--- a/SmallInteger.st Fri Jan 31 02:04:30 2014 +0000
+++ b/SmallInteger.st Sun Feb 02 14:16:24 2014 +0000
@@ -1724,43 +1724,148 @@
!SmallInteger methodsFor:'byte access'!
-byteSwapped
+byteSwapped
"lsb -> msb;
i.e. a.b.c.d -> d.c.b.a"
+ SmallInteger maxBytes == 8 ifTrue:[
+ ^ self byteSwapped64
+ ] ifFalse:[
+ ^ self byteSwapped32
+ ].
+
+ "
+ 16r11223344 byteSwapped hexPrintString
+ 16r44332211 byteSwapped hexPrintString
+ "
+
+ "Created: / 09-01-2012 / 23:01:33 / cg"
+!
+
+byteSwapped16
+ "for 16bit values only:
+ lsb -> msb;
+ i.e. a.b -> b.a"
+
+%{ /* NOCONTEXT */
+ unsigned INT v = __intVal(self);
+ unsigned INT swapped;
+
+ swapped = ((v>>8)&0xFF) | ((v & 0xFF)<<8);
+ RETURN (__mkSmallInteger(swapped));
+%}.
+
+ "
+ 16r1122 byteSwapped16 hexPrintString
+ 16r2211 byteSwapped16 hexPrintString
+ 16r332211 byteSwapped16 hexPrintString
+ "
+!
+
+byteSwapped32
+ "for 32bit values only:
+ lsb -> msb;
+ i.e. a.b.c.d -> d.c.b.a"
+
%{ /* NOCONTEXT */
+ unsigned INT v = __intVal(self);
+ unsigned INT swapped;
+
+#undef HAVE_BSWAP
+#if __POINTER_SIZE__ == 4
+
+# if defined(USE_BSWAP) && defined(__BORLANDC__)
+# define HAVE_BSWAP
+
+ _asm {
+ mov eax, v
+ bswap eax
+ mov swapped, eax
+ };
+# endif
+# if defined(USE_BSWAP) && defined(__VISUALC__)
+# define HAVE_BSWAP
+
+ _asm {
+ mov eax, v
+ xchg al, ah
+ rol eax, 16
+ xchg al, ah
+ mov swapped, eax
+ };
+# endif
+# if defined(USE_BSWAP) && defined(__GNUC__)
+# define HAVE_BSWAP
+
+ asm("movl %0, %%eax \n\
+ bswap %%eax \n\
+ movl %%eax, %1 \n\
+ "
+ : "=rm" (swapped)
+ : "rm" (v));
+# endif
+#endif /* __POINTER_SIZE__ == 4 */
+
+#if __POINTER_SIZE__ == 8
+ v &= 0xFFFFFFFF;
+
+# if defined(__x86_64__) && defined(__GNUC__)
+# define HAVE_BSWAP
+
+ asm("movq %0, %%rax \n\
+ bswap %%eax \n\
+ movq %%rax, %1 \n\
+ "
+ : "=rm" (swapped)
+ : "rm" (v));
+# endif
+#endif
+
+#ifndef HAVE_BSWAP
+ swapped = ((v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24));
+#endif
+
+ RETURN (__MKUINT(swapped));
+%}.
+
+ "
+ 16r11223344 byteSwapped32 hexPrintString
+ 16r44332211 byteSwapped32 hexPrintString
+ "
+
+ "Created: / 09-01-2012 / 23:01:33 / cg"
+!
+
+byteSwapped64
+ "for 64bit values only:
+ lsb -> msb;
+ i.e. a.b.c.d.e.f.g.h -> h.g.f.e.d.c.b.a"
+
+%{ /* NOCONTEXT */
+ unsigned INT v = __intVal(self);
+ unsigned INT swapped;
#if __POINTER_SIZE__ == 4
- unsigned int v = __intVal(self);
- unsigned int swapped;
-
-# ifdef __BORLANDC__
-# ifdef USE_BSWAP
- _asm {
- mov eax, v
- bswap eax
- mov swapped, eax
- };
-# else
- _asm {
- mov eax, v
- xchg al, ah
- rol eax, 16
- xchg al, ah
- mov swapped, eax
- };
-# endif
-# else
- swapped = ((v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24));
-# endif
- RETURN (__MKUINT(swapped));
-#endif /* __POINTER_SIZE__ */
+ // xxxxxxxx 00000000 00000000 00000000 -> 00000000 00000000 00000000 xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ swapped = (v>>24) | ((v>>8)&0xFF00) | ((v & 0xFF00)<<8) | ((v & 0xFF)<<24);
+#else
+ // xxxxxxxx 00000000 00000000 00000000 -> 00000000 00000000 00000000 xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ // xxxxxxxx xxxxxxxx
+ swapped = (v>>56) | ((v>>40)&0xFF00) | ((v>>24) & 0xFF0000) | ((v>>8) & 0xFF000000)
+ | ((v & 0xFF000000)<<8) | ((v & 0x00FF0000)<<24) | ((v & 0x0000FF00)<<40)
+ | ((v & 0xFF)<<56);
+#endif
+ return __MKUINT( swapped );
%}.
- ^ super byteSwapped
"
- 16r11223344 byteSwapped hexPrintString
- 16r44332211 byteSwapped hexPrintString
+ 16r11223344 byteSwapped64 hexPrintString
+ 16r44332211 byteSwapped64 hexPrintString
"
"Created: / 09-01-2012 / 23:01:33 / cg"
@@ -4298,11 +4403,11 @@
!SmallInteger class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.212 2013-08-04 10:02:36 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.213 2014-01-25 21:34:10 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.212 2013-08-04 10:02:36 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/SmallInteger.st,v 1.213 2014-01-25 21:34:10 cg Exp $'
! !