diff --git a/src/interpret.c b/src/interpret.c
index c529a3bdd315f400b6d3868a89f7802b48e34fe1..10e365bccffe268b676dad4ad0e80c39544b1295 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.212 2001/07/02 20:09:17 mast Exp $");
+RCSID("$Id: interpret.c,v 1.213 2001/07/06 22:56:56 grubba Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -618,59 +618,6 @@ void print_return_value(void)
 #endif
 
 struct callback_list evaluator_callbacks;
-#define CASE(X) case (X)-F_OFFSET:
-
-#define COMPARISMENT(ID,EXPR) \
-CASE(ID); \
-instr=EXPR; \
-pop_n_elems(2); \
-push_int(instr); \
-break
-
-#ifdef AUTO_BIGNUM
-#define AUTO_BIGNUM_LOOP_TEST(X,Y) INT_TYPE_ADD_OVERFLOW(X,Y)
-#else
-#define AUTO_BIGNUM_LOOP_TEST(X,Y) 0
-#endif
-
-#define LOOP(ID, INC, OP2, OP4)					\
-CASE(ID)							\
-{								\
-  union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT);	\
-  if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC))		\
-  {								\
-    i->integer += INC;						\
-    if(i->integer OP2 Pike_sp[-3].u.integer)			\
-    {								\
-      DOJUMP();							\
-    }else{							\
-      SKIPJUMP();						\
-    }								\
-  }else{							\
-    lvalue_to_svalue_no_free(Pike_sp,Pike_sp-2); Pike_sp++;	\
-    push_int(INC);						\
-    f_add(2);							\
-    assign_lvalue(Pike_sp-3,Pike_sp-1);				\
-    if(OP4 ( Pike_sp-1, Pike_sp-4 ))				\
-    {								\
-      DOJUMP();							\
-    }else{							\
-      SKIPJUMP();						\
-    }								\
-    pop_stack();						\
-  }								\
-  break;							\
-}
-
-#define CJUMP(X,Y) \
-CASE(X); \
-if(Y(Pike_sp-2,Pike_sp-1)) { \
-  DOJUMP(); \
-}else{ \
-  SKIPJUMP(); \
-} \
-pop_n_elems(2); \
-break
 
 
 /*
@@ -1669,8 +1616,14 @@ PMOD_EXPORT void safe_apply_handler(const char *fun,
 				    INT32 args)
 {
   int i;
+#if 0
+  fprintf(stderr, "safe_apply_handler(\"%s\", 0x%08p, 0x%08p, %d\n",
+	  fun, handler, compat, args);
+#endif /* 0 */
+
   free_svalue(&throw_value);
   throw_value.type = T_INT;
+
   if (handler && handler->prog &&
       (i = find_identifier(fun, handler->prog)) != -1) {
     safe_apply_low2(handler, i, args, 0);
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index c002a6bf56675d694c5ba5ed610f743a1430522e..9eef2ff25eeb1e58f9cc11b84bc80fed418d7533 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,11 +1,19 @@
 /*
- * $Id: interpret_functions.h,v 1.69 2001/07/06 17:17:49 grubba Exp $
+ * $Id: interpret_functions.h,v 1.70 2001/07/06 22:56:56 grubba Exp $
  *
  * Opcode definitions for the interpreter.
  */
 
 #include "global.h"
 
+#undef CJUMP
+#undef AUTO_BIGNUM_LOOP_TEST
+#undef LOOP
+#undef COMPARISON
+#undef MKAPPLY
+#undef DO_CALL_BUILTIN
+
+#undef DO_IF_BIGNUM
 #ifdef AUTO_BIGNUM
 #define DO_IF_BIGNUM(CODE)	CODE
 #else /* !AUTO_BIGNUM */
@@ -28,7 +36,7 @@
 #define OPCODE2_TAILJUMP(A, B, C)	OPCODE2_TAILJUMP(A, B) C
 #endif /* GEN_PROTOS */
 
-OPCODE0(F_UNDEFINED,"push UNDEFINED", {
+OPCODE0(F_UNDEFINED, "push UNDEFINED", {
   push_int(0);
   Pike_sp[-1].subtype=NUMBER_UNDEFINED;
 });
@@ -53,7 +61,7 @@ OPCODE1(F_NUMBER, "push int", {
   push_int(arg1);
 });
 
-OPCODE1(F_NEG_NUMBER,"push -int", {
+OPCODE1(F_NEG_NUMBER, "push -int", {
   push_int(-arg1);
 });
 
@@ -64,7 +72,7 @@ OPCODE1(F_CONSTANT, "constant", {
 
 /* The rest of the basic 'push value' instructions */	
 
-OPCODE1_TAIL(F_MARK_AND_STRING,"mark & string", {
+OPCODE1_TAIL(F_MARK_AND_STRING, "mark & string", {
   *(Pike_mark_sp++)=Pike_sp;
 
   OPCODE1(F_STRING, "string", {
@@ -898,12 +906,22 @@ OPCODE1_JUMP(F_BRANCH_IF_NOT_LOCAL, "branch if !local", {
   }
 });
 
-      CJUMP(F_BRANCH_WHEN_EQ, is_eq);
-      CJUMP(F_BRANCH_WHEN_NE,!is_eq);
-      CJUMP(F_BRANCH_WHEN_LT, is_lt);
-      CJUMP(F_BRANCH_WHEN_LE,!is_gt);
-      CJUMP(F_BRANCH_WHEN_GT, is_gt);
-      CJUMP(F_BRANCH_WHEN_GE,!is_lt);
+#define CJUMP(X, DESC, Y) \
+  OPCODE0_JUMP(X, DESC, { \
+    if(Y(Pike_sp-2,Pike_sp-1)) { \
+      DOJUMP(); \
+    }else{ \
+      SKIPJUMP(); \
+    } \
+    pop_n_elems(2); \
+  })
+
+CJUMP(F_BRANCH_WHEN_EQ, "branch if ==", is_eq);
+CJUMP(F_BRANCH_WHEN_NE, "branch if !=", !is_eq);
+CJUMP(F_BRANCH_WHEN_LT, "branch if <", is_lt);
+CJUMP(F_BRANCH_WHEN_LE, "branch if <=", !is_gt);
+CJUMP(F_BRANCH_WHEN_GT, "branch if >", is_gt);
+CJUMP(F_BRANCH_WHEN_GE, "branch if >=", !is_lt);
 
 OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_ZERO, "branch & pop if zero", {
   if(!IS_ZERO(Pike_sp-1))
@@ -1029,12 +1047,46 @@ OPCODE2(F_SWITCH_ON_LOCAL, "switch on local", {
 });
 
 
+#ifdef AUTO_BIGNUM
+#define AUTO_BIGNUM_LOOP_TEST(X,Y) INT_TYPE_ADD_OVERFLOW(X,Y)
+#else
+#define AUTO_BIGNUM_LOOP_TEST(X,Y) 0
+#endif
+
       /* FIXME: Does this need bignum tests? /Fixed - Hubbe */
       /* LOOP(OPCODE, INCREMENT, OPERATOR, IS_OPERATOR) */
-      LOOP(F_INC_LOOP, 1, <, is_lt);
-      LOOP(F_DEC_LOOP, -1, >, is_gt);
-      LOOP(F_INC_NEQ_LOOP, 1, !=, !is_eq);
-      LOOP(F_DEC_NEQ_LOOP, -1, !=, !is_eq);
+#define LOOP(ID, DESC, INC, OP2, OP4)					\
+  OPCODE0_JUMP(ID, DESC, {						\
+    union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT);	\
+    if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC))			\
+    {									\
+      i->integer += INC;						\
+      if(i->integer OP2 Pike_sp[-3].u.integer)				\
+      {									\
+  	DOJUMP();							\
+      }else{								\
+  	SKIPJUMP();							\
+      }									\
+    }else{								\
+      lvalue_to_svalue_no_free(Pike_sp,Pike_sp-2); Pike_sp++;		\
+      push_int(INC);							\
+      f_add(2);								\
+      assign_lvalue(Pike_sp-3,Pike_sp-1);				\
+      if(OP4 ( Pike_sp-1, Pike_sp-4 ))					\
+      {									\
+  	DOJUMP();							\
+      }else{								\
+  	SKIPJUMP();							\
+      }									\
+      pop_stack();							\
+    }									\
+    break;								\
+  })
+
+LOOP(F_INC_LOOP, "++Loop", 1, <, is_lt);
+LOOP(F_DEC_LOOP, "--Loop", -1, >, is_gt);
+LOOP(F_INC_NEQ_LOOP, "++Loop!=", 1, !=, !is_eq);
+LOOP(F_DEC_NEQ_LOOP, "--Loop!=", -1, !=, !is_eq);
 
 /* Use like:
  *
@@ -1226,12 +1278,19 @@ OPCODE0(F_RSH, ">>", {
   o_rsh();
 });
 
-      COMPARISMENT(F_EQ, is_eq(Pike_sp-2,Pike_sp-1));
-      COMPARISMENT(F_NE,!is_eq(Pike_sp-2,Pike_sp-1));
-      COMPARISMENT(F_GT, is_gt(Pike_sp-2,Pike_sp-1));
-      COMPARISMENT(F_GE,!is_lt(Pike_sp-2,Pike_sp-1));
-      COMPARISMENT(F_LT, is_lt(Pike_sp-2,Pike_sp-1));
-      COMPARISMENT(F_LE,!is_gt(Pike_sp-2,Pike_sp-1));
+#define COMPARISON(ID,DESC,EXPR)	\
+  OPCODE0(ID, DESC, {			\
+    instr = EXPR;			\
+    pop_n_elems(2);			\
+    push_int(instr);			\
+  })
+
+COMPARISON(F_EQ, "==", is_eq(Pike_sp-2,Pike_sp-1));
+COMPARISON(F_NE, "!=", !is_eq(Pike_sp-2,Pike_sp-1));
+COMPARISON(F_GT, ">", is_gt(Pike_sp-2,Pike_sp-1));
+COMPARISON(F_GE, ">=", !is_lt(Pike_sp-2,Pike_sp-1));
+COMPARISON(F_LT, "<", is_lt(Pike_sp-2,Pike_sp-1));
+COMPARISON(F_LE, "<=", !is_gt(Pike_sp-2,Pike_sp-1));
 
 OPCODE0(F_ADD, "+", {
   f_add(2);
diff --git a/src/interpreter.h b/src/interpreter.h
index 3a944180dd7d4ece3a4e778b6ff721990698b27b..998867d6de81f0b2b101ca9af90ce394c672d764 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -3,6 +3,8 @@
 #undef GET_ARG2
 #undef GET_JUMP
 #undef SKIPJUMP
+#undef CASE
+#undef DOJUMP
 
 #ifdef PIKE_DEBUG
 
@@ -35,6 +37,8 @@
 
 #endif
 
+#define CASE(X) case (X)-F_OFFSET:
+
 #define DOJUMP() \
  do { int tmp; tmp=GET_JUMP(); pc+=tmp; if(tmp < 0) fast_check_threads_etc(6); }while(0)
 
diff --git a/src/lex.c b/src/lex.c
index 29a9e00b666c5504c8ced636f16a6862f7da65bd..1a4b8aa3f623fd0440ec441ff0e55c9228a03a7b 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: lex.c,v 1.92 2001/07/06 14:07:55 grubba Exp $");
+RCSID("$Id: lex.c,v 1.93 2001/07/06 22:56:57 grubba Exp $");
 #include "language.h"
 #include "array.h"
 #include "lex.h"
@@ -166,7 +166,6 @@ struct keyword instr_names[]=
 #ifndef PIKE_PRECOMPILER
 #include "interpret_protos.h"
 #endif /* !PIKE_PRECOMPILER */
-{ "!=",			F_NE,0 },	
 { "%=",			F_MOD_EQ,0 },	
 { "&=",			F_AND_EQ,0 },	
 { "|=",			F_OR_EQ,0 },	
@@ -174,12 +173,7 @@ struct keyword instr_names[]=
 { "+=",			F_ADD_EQ,0 },	
 { "-=",			F_SUB_EQ,0 },	
 { "/=",			F_DIV_EQ,0 },	
-{ "<",			F_LT,0 },	
 { "<<=",		F_LSH_EQ,0 },	
-{ "<=",			F_LE,0 },	
-{ "==",			F_EQ,0 },	
-{ ">",			F_GT,0 },	
-{ ">=",			F_GE,0 },	
 { ">>=",		F_RSH_EQ,0 },	
 { "^=",			F_XOR_EQ,0 },	
 { "arg+=1024",		F_PREFIX_1024,0 },
@@ -207,16 +201,6 @@ struct keyword instr_names[]=
 { "for",		F_FOR,0 },
 { "index",              F_INDEX,0 },
 
-{ "branch if <",	F_BRANCH_WHEN_LT, I_ISJUMP },
-{ "branch if >",	F_BRANCH_WHEN_GT, I_ISJUMP },
-{ "branch if <=",	F_BRANCH_WHEN_LE, I_ISJUMP },
-{ "branch if >=",	F_BRANCH_WHEN_GE, I_ISJUMP },
-{ "branch if ==",	F_BRANCH_WHEN_EQ, I_ISJUMP },
-{ "branch if !=",	F_BRANCH_WHEN_NE, I_ISJUMP },
-{ "++Loop",		F_INC_LOOP, I_ISJUMP },	
-{ "++Loop!=",		F_INC_NEQ_LOOP, I_ISJUMP },
-{ "--Loop",		F_DEC_LOOP, I_ISJUMP },	
-{ "--Loop!=",		F_DEC_NEQ_LOOP, I_ISJUMP },
 { "foreach",		F_FOREACH, I_ISJUMP },
 { "foreach++",		F_NEW_FOREACH, I_ISJUMP },
 { "pointer",		F_POINTER, I_ISPOINTER },
diff --git a/src/opcodes.h b/src/opcodes.h
index b15d6af6a47f3e70d279e4951e79c51740e361c1..7eb1583609c97b293a5875f4d50c6ebc9e904f39 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: opcodes.h,v 1.18 2001/07/06 14:07:55 grubba Exp $
+ * $Id: opcodes.h,v 1.19 2001/07/06 22:56:57 grubba Exp $
  */
 #ifndef OPCODES_H
 #define OPCODES_H
@@ -47,17 +47,6 @@ enum Pike_opcodes
   F_PREFIX2_WORDX256,
   F_PREFIX2_24BITX256,
 
-  F_BRANCH_WHEN_LT,
-  F_BRANCH_WHEN_GT,
-  F_BRANCH_WHEN_LE,
-  F_BRANCH_WHEN_GE,
-  F_BRANCH_WHEN_EQ,
-  F_BRANCH_WHEN_NE,
-  F_INC_LOOP,
-  F_DEC_LOOP,
-  F_INC_NEQ_LOOP,
-  F_DEC_NEQ_LOOP,
-
   F_INDEX,
   F_POS_INT_INDEX,
   F_NEG_INT_INDEX,
@@ -72,13 +61,6 @@ enum Pike_opcodes
   F_RETURN_LOCAL,
   F_RETURN_IF_TRUE,
 
-  F_LT,
-  F_GT,
-  F_EQ,
-  F_GE,
-  F_LE,
-  F_NE,
-
   F_FOREACH,
   F_NEW_FOREACH,