SmallInteger.st
branchjv
changeset 18117 eb433f2c42b2
parent 18080 9ae1db7ef04a
parent 15910 33ea5acc0934
child 18120 e3a375d5f6a8
--- 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 $'
 ! !