Index: /trunk/src/VBox/VMM/VMMAll/APICAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/APICAll.cpp	(revision 60740)
+++ /trunk/src/VBox/VMM/VMMAll/APICAll.cpp	(revision 60741)
@@ -414,8 +414,9 @@
  * @param   rcNotFound      What to return when no bit is set.
  */
-static int apicGetLastSetBit(volatile const XAPIC256BITREG *pReg, int rcNotFound)
-{
-    unsigned const cBitsPerFragment = sizeof(pReg->u[0].u32Reg) * 8;
-    ssize_t const  cFragments       = RT_ELEMENTS(pReg->u);
+static int apicGetHighestSetBit(volatile const XAPIC256BITREG *pReg, int rcNotFound)
+{
+    ssize_t const  cFragments     = RT_ELEMENTS(pReg->u);
+    unsigned const uFragmentShift = 5;
+    AssertCompile(1 << uFragmentShift == sizeof(pReg->u[0].u32Reg) * 8);
     for (ssize_t i = cFragments - 1; i >= 0; i--)
     {
@@ -425,5 +426,5 @@
             unsigned idxSetBit = ASMBitLastSetU32(uFragment);
             --idxSetBit;
-            idxSetBit += (i * cBitsPerFragment);
+            idxSetBit |= i << uFragmentShift;
             return idxSetBit;
         }
@@ -504,5 +505,5 @@
     if (pXApicPage->svr.u.fApicSoftwareEnable)
     {
-        int const irrv = apicGetLastSetBit(&pXApicPage->irr, -1 /* rcNotFound */);
+        int const irrv = apicGetHighestSetBit(&pXApicPage->irr, -1 /* rcNotFound */);
         if (irrv >= 0)
         {
@@ -1081,5 +1082,5 @@
     /* See Intel spec 10.8.3.1 "Task and Processor Priorities". */
     PXAPICPAGE    pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
-    uint8_t const uIsrv      = apicGetLastSetBit(&pXApicPage->isr, 0 /* rcNotFound */);
+    uint8_t const uIsrv      = apicGetHighestSetBit(&pXApicPage->isr, 0 /* rcNotFound */);
     uint8_t       uPpr;
     if (XAPIC_TPR_GET_TP(pXApicPage->tpr.u8Tpr) >= XAPIC_PPR_GET_PP(uIsrv))
@@ -1157,5 +1158,5 @@
 
     PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
-    int isrv = apicGetLastSetBit(&pXApicPage->isr, -1 /* rcNotFound */);
+    int isrv = apicGetHighestSetBit(&pXApicPage->isr, -1 /* rcNotFound */);
     if (isrv >= 0)
     {
@@ -2107,5 +2108,5 @@
 {
     PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu);
-    int const irrv = apicGetLastSetBit(&pXApicPage->irr, -1);
+    int const irrv = apicGetHighestSetBit(&pXApicPage->irr, -1);
     if (irrv >= 0)
     {
@@ -2315,5 +2316,5 @@
         && pXApicPage->svr.u.fApicSoftwareEnable)
     {
-        int const irrv = apicGetLastSetBit(&pXApicPage->irr, -1);
+        int const irrv = apicGetHighestSetBit(&pXApicPage->irr, -1);
         if (RT_LIKELY(irrv >= 0))
         {
