diff --git a/target-i386/op.c b/target-i386/op.c
index 34fc4c734a..46e75e192c 100644
--- a/target-i386/op.c
+++ b/target-i386/op.c
@@ -19,8 +19,12 @@
  */
 
 /* XXX: must use this define because the soft mmu macros have huge
-   register constraints so they cannot be used in any C code */
+   register constraints so they cannot be used in any C code. gcc 3.3
+   does not seem to be able to handle some constraints in rol
+   operations, so we disable it. */
+#if !(__GNUC__ == 3 && __GNUC_MINOR__ == 3)
 #define ASM_SOFTMMU
+#endif
 #include "exec.h"
 
 /* n must be a constant to be efficient */