Index: /trunk/src/VBox/VMM/Makefile.kmk
===================================================================
--- /trunk/src/VBox/VMM/Makefile.kmk	(revision 61895)
+++ /trunk/src/VBox/VMM/Makefile.kmk	(revision 61896)
@@ -784,16 +784,16 @@
 # Always optimize the interpreter.
 #
-ifn1of ($(USERNAME),bird)
-if1of ($(KBUILD_TARGET), win)
- # -noover is recognized despite the statement saying otherwise. It silences these warnings:
- # cl : Command line warning D9025 : overriding '/Od' with '/O2'
- # cl : Command line warning D9025 : overriding '/Oy-' with '/Oy'
- VMMAll/IEMAll.cpp_CXXFLAGS += -noover -O2xy
-else
- VMMAll/IEMAll.cpp_CXXFLAGS += -O2
- #VMMAll/IEMAll.cpp_CXXFLAGS += -fno-align-functions -fno-align-jumps -fno-align-loops # Saves a few of percents, not worth it.
- #VMMAll/IEMAll.cpp_CXXFLAGS += -fno-reorder-blocks    # Saves one or two percent ... never mind.
- VMMAll/IEMAll.cpp_CXXFLAGS += -fomit-frame-pointer # Omitting the frame pointer results in larger code, but it might be worth it. (esp addressing vs ebp?)
-endif
+if $(USERNAME) != "bird" || "$(KBUILD_TYPE)" != "release" || "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.amd64"
+ if1of ($(KBUILD_TARGET), win)
+  # -noover is recognized despite the statement saying otherwise. It silences these warnings:
+  # cl : Command line warning D9025 : overriding '/Od' with '/O2'
+  # cl : Command line warning D9025 : overriding '/Oy-' with '/Oy'
+  VMMAll/IEMAll.cpp_CXXFLAGS += -noover -O2xy
+ else
+  VMMAll/IEMAll.cpp_CXXFLAGS += -O2
+  #VMMAll/IEMAll.cpp_CXXFLAGS += -fno-align-functions -fno-align-jumps -fno-align-loops # Saves a few of percents, not worth it.
+  #VMMAll/IEMAll.cpp_CXXFLAGS += -fno-reorder-blocks    # Saves one or two percent ... never mind.
+  VMMAll/IEMAll.cpp_CXXFLAGS += -fomit-frame-pointer # Omitting the frame pointer results in larger code, but it might be worth it. (esp addressing vs ebp?)
+ endif
 endif # bird wants good stacks
 
Index: /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 61895)
+++ /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 61896)
@@ -1309,9 +1309,9 @@
 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU8(PIEMCPU pIemCpu, uint8_t *pu8)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_LIKELY(offOpcode < pIemCpu->cbOpcode))
-    {
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode < pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 1;
         *pu8 = pIemCpu->abOpcode[offOpcode];
-        pIemCpu->offOpcode = offOpcode + 1;
         return VINF_SUCCESS;
     }
@@ -1322,9 +1322,8 @@
 
 /**
- * Deals with the problematic cases that iemOpcodeGetNextU8 doesn't like.
- *
- * @returns Strict VBox status code.
+ * Deals with the problematic cases that iemOpcodeGetNextU8Jmp doesn't like, longjmp on error.
+ *
+ * @returns The opcode byte.
  * @param   pIemCpu             The IEM state.
- * @param   pb                  Where to return the opcode byte.
  */
 DECL_NO_INLINE(IEM_STATIC, uint8_t) iemOpcodeGetNextU8SlowJmp(PIEMCPU pIemCpu)
@@ -1338,13 +1337,12 @@
 
 /**
- * Fetches the next opcode byte.
- *
- * @returns Strict VBox status code.
+ * Fetches the next opcode byte, longjmp on error.
+ *
+ * @returns The opcode byte.
  * @param   pIemCpu             The IEM state.
- * @param   pu8                 Where to return the opcode byte.
  */
 DECLINLINE(uint8_t) iemOpcodeGetNextU8Jmp(PIEMCPU pIemCpu)
 {
-    unsigned offOpcode = pIemCpu->offOpcode;
+    uintptr_t offOpcode = pIemCpu->offOpcode;
     if (RT_LIKELY((uint8_t)offOpcode < pIemCpu->cbOpcode))
     {
@@ -1625,11 +1623,12 @@
 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16(PIEMCPU pIemCpu, uint16_t *pu16)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 2 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU16Slow(pIemCpu, pu16);
-
-    *pu16 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
-    pIemCpu->offOpcode = offOpcode + 2;
-    return VINF_SUCCESS;
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 2 <= pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 2;
+        *pu16 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
+        return VINF_SUCCESS;
+    }
+    return iemOpcodeGetNextU16Slow(pIemCpu, pu16);
 }
 
@@ -1637,9 +1636,8 @@
 
 /**
- * Deals with the problematic cases that iemOpcodeGetNextU16 doesn't like.
- *
- * @returns Strict VBox status code.
+ * Deals with the problematic cases that iemOpcodeGetNextU16Jmp doesn't like, longjmp on error
+ *
+ * @returns The opcode word.
  * @param   pIemCpu             The IEM state.
- * @param   pu16                Where to return the opcode word.
  */
 DECL_NO_INLINE(IEM_STATIC, uint16_t) iemOpcodeGetNextU16SlowJmp(PIEMCPU pIemCpu)
@@ -1657,18 +1655,18 @@
 
 /**
- * Fetches the next opcode word.
- *
- * @returns Strict VBox status code.
+ * Fetches the next opcode word, longjmp on error.
+ *
+ * @returns The opcode word.
  * @param   pIemCpu             The IEM state.
- * @param   pu16                Where to return the opcode word.
  */
 DECLINLINE(uint16_t) iemOpcodeGetNextU16Jmp(PIEMCPU pIemCpu)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 2 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU16SlowJmp(pIemCpu);
-
-    pIemCpu->offOpcode = offOpcode + 2;
-    return RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 2 <= pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 2;
+        return RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
+    }
+    return iemOpcodeGetNextU16SlowJmp(pIemCpu);
 }
 
@@ -1892,14 +1890,15 @@
 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU32(PIEMCPU pIemCpu, uint32_t *pu32)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 4 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU32Slow(pIemCpu, pu32);
-
-    *pu32 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
-                                pIemCpu->abOpcode[offOpcode + 1],
-                                pIemCpu->abOpcode[offOpcode + 2],
-                                pIemCpu->abOpcode[offOpcode + 3]);
-    pIemCpu->offOpcode = offOpcode + 4;
-    return VINF_SUCCESS;
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 4 <= pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 4;
+        *pu32 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
+                                    pIemCpu->abOpcode[offOpcode + 1],
+                                    pIemCpu->abOpcode[offOpcode + 2],
+                                    pIemCpu->abOpcode[offOpcode + 3]);
+        return VINF_SUCCESS;
+    }
+    return iemOpcodeGetNextU32Slow(pIemCpu, pu32);
 }
 
@@ -1907,9 +1906,8 @@
 
 /**
- * Deals with the problematic cases that iemOpcodeGetNextU32 doesn't like.
- *
- * @returns Strict VBox status code.
+ * Deals with the problematic cases that iemOpcodeGetNextU32Jmp doesn't like, longjmp on error.
+ *
+ * @returns The opcode dword.
  * @param   pIemCpu             The IEM state.
- * @param   pu32                Where to return the opcode dword.
  */
 DECL_NO_INLINE(IEM_STATIC, uint32_t) iemOpcodeGetNextU32SlowJmp(PIEMCPU pIemCpu)
@@ -1930,21 +1928,21 @@
 
 /**
- * Fetches the next opcode dword.
- *
- * @returns Strict VBox status code.
+ * Fetches the next opcode dword, longjmp on error.
+ *
+ * @returns The opcode dword.
  * @param   pIemCpu             The IEM state.
- * @param   pu32                Where to return the opcode double word.
  */
 DECLINLINE(uint32_t) iemOpcodeGetNextU32Jmp(PIEMCPU pIemCpu)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 4 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU32SlowJmp(pIemCpu);
-
-    pIemCpu->offOpcode = offOpcode + 4;
-    return RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
-                               pIemCpu->abOpcode[offOpcode + 1],
-                               pIemCpu->abOpcode[offOpcode + 2],
-                               pIemCpu->abOpcode[offOpcode + 3]);
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 4 <= pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 4;
+        return RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
+                                   pIemCpu->abOpcode[offOpcode + 1],
+                                   pIemCpu->abOpcode[offOpcode + 2],
+                                   pIemCpu->abOpcode[offOpcode + 3]);
+    }
+    return iemOpcodeGetNextU32SlowJmp(pIemCpu);
 }
 
@@ -2185,18 +2183,19 @@
 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU64(PIEMCPU pIemCpu, uint64_t *pu64)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 8 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU64Slow(pIemCpu, pu64);
-
-    *pu64 = RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
-                                pIemCpu->abOpcode[offOpcode + 1],
-                                pIemCpu->abOpcode[offOpcode + 2],
-                                pIemCpu->abOpcode[offOpcode + 3],
-                                pIemCpu->abOpcode[offOpcode + 4],
-                                pIemCpu->abOpcode[offOpcode + 5],
-                                pIemCpu->abOpcode[offOpcode + 6],
-                                pIemCpu->abOpcode[offOpcode + 7]);
-    pIemCpu->offOpcode = offOpcode + 8;
-    return VINF_SUCCESS;
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pIemCpu->cbOpcode))
+    {
+        *pu64 = RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
+                                    pIemCpu->abOpcode[offOpcode + 1],
+                                    pIemCpu->abOpcode[offOpcode + 2],
+                                    pIemCpu->abOpcode[offOpcode + 3],
+                                    pIemCpu->abOpcode[offOpcode + 4],
+                                    pIemCpu->abOpcode[offOpcode + 5],
+                                    pIemCpu->abOpcode[offOpcode + 6],
+                                    pIemCpu->abOpcode[offOpcode + 7]);
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 8;
+        return VINF_SUCCESS;
+    }
+    return iemOpcodeGetNextU64Slow(pIemCpu, pu64);
 }
 
@@ -2204,9 +2203,8 @@
 
 /**
- * Deals with the problematic cases that iemOpcodeGetNextU64 doesn't like.
- *
- * @returns Strict VBox status code.
+ * Deals with the problematic cases that iemOpcodeGetNextU64Jmp doesn't like, longjmp on error.
+ *
+ * @returns The opcode qword.
  * @param   pIemCpu             The IEM state.
- * @param   pu64                Where to return the opcode qword.
  */
 DECL_NO_INLINE(IEM_STATIC, uint64_t) iemOpcodeGetNextU64SlowJmp(PIEMCPU pIemCpu)
@@ -2231,25 +2229,25 @@
 
 /**
- * Fetches the next opcode qword.
- *
- * @returns Strict VBox status code.
+ * Fetches the next opcode qword, longjmp on error.
+ *
+ * @returns The opcode qword.
  * @param   pIemCpu             The IEM state.
- * @param   pu64                Where to return the opcode qword.
  */
 DECLINLINE(uint64_t) iemOpcodeGetNextU64Jmp(PIEMCPU pIemCpu)
 {
-    uint8_t const offOpcode = pIemCpu->offOpcode;
-    if (RT_UNLIKELY(offOpcode + 8 > pIemCpu->cbOpcode))
-        return iemOpcodeGetNextU64SlowJmp(pIemCpu);
-
-    pIemCpu->offOpcode = offOpcode + 8;
-    return RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
-                               pIemCpu->abOpcode[offOpcode + 1],
-                               pIemCpu->abOpcode[offOpcode + 2],
-                               pIemCpu->abOpcode[offOpcode + 3],
-                               pIemCpu->abOpcode[offOpcode + 4],
-                               pIemCpu->abOpcode[offOpcode + 5],
-                               pIemCpu->abOpcode[offOpcode + 6],
-                               pIemCpu->abOpcode[offOpcode + 7]);
+    uintptr_t const offOpcode = pIemCpu->offOpcode;
+    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pIemCpu->cbOpcode))
+    {
+        pIemCpu->offOpcode = (uint8_t)offOpcode + 8;
+        return RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
+                                   pIemCpu->abOpcode[offOpcode + 1],
+                                   pIemCpu->abOpcode[offOpcode + 2],
+                                   pIemCpu->abOpcode[offOpcode + 3],
+                                   pIemCpu->abOpcode[offOpcode + 4],
+                                   pIemCpu->abOpcode[offOpcode + 5],
+                                   pIemCpu->abOpcode[offOpcode + 6],
+                                   pIemCpu->abOpcode[offOpcode + 7]);
+    }
+    return iemOpcodeGetNextU64SlowJmp(pIemCpu);
 }
 
