Index: /trunk/include/iprt/asm.h
===================================================================
--- /trunk/include/iprt/asm.h	(revision 57646)
+++ /trunk/include/iprt/asm.h	(revision 57647)
@@ -4363,5 +4363,5 @@
         int iEnd   = iBitEnd & ~31;
         if (iStart == iEnd)
-            *pu32 |= ((1 << (iBitEnd - iBitStart)) - 1) << iBitStart;
+            *pu32 |= ((1 << (iBitEnd - iBitStart)) - 1) << (iBitStart & 31);
         else
         {
Index: /trunk/src/VBox/Runtime/testcase/tstRTBitOperations.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstRTBitOperations.cpp	(revision 57646)
+++ /trunk/src/VBox/Runtime/testcase/tstRTBitOperations.cpp	(revision 57647)
@@ -164,5 +164,5 @@
     CHECK_GUARD(p);
 
-    /* set */
+    /* bit set */
     MAP_CLEAR(p);
     ASMBitSet(&p->au32[0], 0);
@@ -187,5 +187,5 @@
     CHECK(!ASMAtomicBitTestAndSet(&p->au32[0], 80) && p->au32[2] == 0x00010001U);
 
-    /* clear */
+    /* bit clear */
     MAP_SET(p);
     ASMBitClear(&p->au32[0], 0);
@@ -209,4 +209,13 @@
     CHECK(!ASMAtomicBitTestAndClear(&p->au32[0], 16)  && p->au32[0] == ~0x40010001U);
     CHECK(ASMAtomicBitTestAndClear(&p->au32[0], 80)   && p->au32[2] == ~0x00010001U);
+
+    /* range set */
+    MAP_CLEAR(p);
+    ASMBitSetRange(&p->au32[0], 0, 5);
+    ASMBitSetRange(&p->au32[0], 6, 44);
+    ASMBitSetRange(&p->au32[0], 64, 65);
+    CHECK(p->au32[0] == 0xFFFFFFDFU);
+    CHECK(p->au32[1] == 0x00000FFFU);
+    CHECK(p->au32[2] == 0x00000001U);
 
     /* toggle */
