py: Clean up unary and binary enum list to keep groups together.

2 non-bytecode binary ops (NOT_IN and IN_NOT) are moved out of the
bytecode group, so this change will change the bytecode format.
diff --git a/py/bc0.h b/py/bc0.h
index 38e23c0..70acfb0 100644
--- a/py/bc0.h
+++ b/py/bc0.h
@@ -113,7 +113,7 @@
 #define MP_BC_LOAD_CONST_SMALL_INT_MULTI (0x70) // + N(64)
 #define MP_BC_LOAD_FAST_MULTI            (0xb0) // + N(16)
 #define MP_BC_STORE_FAST_MULTI           (0xc0) // + N(16)
-#define MP_BC_UNARY_OP_MULTI             (0xd0) // + op(<MP_UNARY_OP_NON_BYTECODE)
-#define MP_BC_BINARY_OP_MULTI            (0xd7) // + op(36)
+#define MP_BC_UNARY_OP_MULTI             (0xd0) // + op(<MP_UNARY_OP_NUM_BYTECODE)
+#define MP_BC_BINARY_OP_MULTI            (0xd7) // + op(<MP_BINARY_OP_NUM_BYTECODE)
 
 #endif // MICROPY_INCLUDED_PY_BC0_H
diff --git a/py/runtime0.h b/py/runtime0.h
index f54f62d..3edd891 100644
--- a/py/runtime0.h
+++ b/py/runtime0.h
@@ -51,41 +51,38 @@
     MP_UNARY_OP_NOT,
 
     // Following ops cannot appear in the bytecode
-    MP_UNARY_OP_NON_BYTECODE,
+    MP_UNARY_OP_NUM_BYTECODE,
 
-    MP_UNARY_OP_BOOL = MP_UNARY_OP_NON_BYTECODE, // __bool__
+    MP_UNARY_OP_BOOL = MP_UNARY_OP_NUM_BYTECODE, // __bool__
     MP_UNARY_OP_LEN, // __len__
     MP_UNARY_OP_HASH, // __hash__; must return a small int
     MP_UNARY_OP_ABS, // __abs__
     MP_UNARY_OP_SIZEOF, // for sys.getsizeof()
+
+    MP_UNARY_OP_NUM_RUNTIME,
 } mp_unary_op_t;
 
-// Note: the first 35 of these are used in bytecode and changing
+// Note: the first 9+12+12 of these are used in bytecode and changing
 // them requires changing the bytecode version.
 typedef enum {
-    // Relational operations, should return a bool
+    // 9 relational operations, should return a bool
     MP_BINARY_OP_LESS,
     MP_BINARY_OP_MORE,
     MP_BINARY_OP_EQUAL,
     MP_BINARY_OP_LESS_EQUAL,
     MP_BINARY_OP_MORE_EQUAL,
     MP_BINARY_OP_NOT_EQUAL,
-
     MP_BINARY_OP_IN,
     MP_BINARY_OP_IS,
     MP_BINARY_OP_EXCEPTION_MATCH,
-    // these are not supported by the runtime and must be synthesised by the emitter
-    MP_BINARY_OP_NOT_IN,
-    MP_BINARY_OP_IS_NOT,
 
-    // Arithmetic operations
+    // 12 inplace arithmetic operations
     MP_BINARY_OP_INPLACE_OR,
     MP_BINARY_OP_INPLACE_XOR,
     MP_BINARY_OP_INPLACE_AND,
     MP_BINARY_OP_INPLACE_LSHIFT,
     MP_BINARY_OP_INPLACE_RSHIFT,
     MP_BINARY_OP_INPLACE_ADD,
-
     MP_BINARY_OP_INPLACE_SUBTRACT,
     MP_BINARY_OP_INPLACE_MULTIPLY,
     MP_BINARY_OP_INPLACE_FLOOR_DIVIDE,
@@ -93,13 +90,13 @@
     MP_BINARY_OP_INPLACE_MODULO,
     MP_BINARY_OP_INPLACE_POWER,
 
+    // 12 normal arithmetic operations
     MP_BINARY_OP_OR,
     MP_BINARY_OP_XOR,
     MP_BINARY_OP_AND,
     MP_BINARY_OP_LSHIFT,
     MP_BINARY_OP_RSHIFT,
     MP_BINARY_OP_ADD,
-
     MP_BINARY_OP_SUBTRACT,
     MP_BINARY_OP_MULTIPLY,
     MP_BINARY_OP_FLOOR_DIVIDE,
@@ -109,16 +106,16 @@
 
     // Operations below this line don't appear in bytecode, they
     // just identify special methods.
+    MP_BINARY_OP_NUM_BYTECODE,
 
     // MP_BINARY_OP_REVERSE_* must follow immediately after MP_BINARY_OP_*
 #if MICROPY_PY_REVERSE_SPECIAL_METHODS
-    MP_BINARY_OP_REVERSE_OR,
+    MP_BINARY_OP_REVERSE_OR = MP_BINARY_OP_NUM_BYTECODE,
     MP_BINARY_OP_REVERSE_XOR,
     MP_BINARY_OP_REVERSE_AND,
     MP_BINARY_OP_REVERSE_LSHIFT,
     MP_BINARY_OP_REVERSE_RSHIFT,
     MP_BINARY_OP_REVERSE_ADD,
-
     MP_BINARY_OP_REVERSE_SUBTRACT,
     MP_BINARY_OP_REVERSE_MULTIPLY,
     MP_BINARY_OP_REVERSE_FLOOR_DIVIDE,
@@ -127,9 +124,18 @@
     MP_BINARY_OP_REVERSE_POWER,
 #endif
 
-    MP_BINARY_OP_DIVMOD, // not emitted by the compiler but supported by the runtime
+    // This is not emitted by the compiler but is supported by the runtime
+    MP_BINARY_OP_DIVMOD
+        #if !MICROPY_PY_REVERSE_SPECIAL_METHODS
+        = MP_BINARY_OP_NUM_BYTECODE
+        #endif
+    ,
 
-    MP_BINARY_OP_LAST,
+    MP_BINARY_OP_NUM_RUNTIME,
+
+    // These 2 are not supported by the runtime and must be synthesised by the emitter
+    MP_BINARY_OP_NOT_IN,
+    MP_BINARY_OP_IS_NOT,
 } mp_binary_op_t;
 
 typedef enum {
diff --git a/py/showbc.c b/py/showbc.c
index 728d8d9..3deb18c 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -539,9 +539,9 @@
                 printf("LOAD_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_LOAD_FAST_MULTI);
             } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) {
                 printf("STORE_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_STORE_FAST_MULTI);
-            } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + MP_UNARY_OP_NON_BYTECODE) {
+            } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + MP_UNARY_OP_NUM_BYTECODE) {
                 printf("UNARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_UNARY_OP_MULTI);
-            } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + 36) {
+            } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + MP_BINARY_OP_NUM_BYTECODE) {
                 mp_uint_t op = ip[-1] - MP_BC_BINARY_OP_MULTI;
                 printf("BINARY_OP " UINT_FMT " %s", op, qstr_str(mp_binary_op_method_name[op]));
             } else {
diff --git a/py/vmentrytable.h b/py/vmentrytable.h
index e634e2b..615f4e2 100644
--- a/py/vmentrytable.h
+++ b/py/vmentrytable.h
@@ -109,8 +109,8 @@
     [MP_BC_LOAD_CONST_SMALL_INT_MULTI ... MP_BC_LOAD_CONST_SMALL_INT_MULTI + 63] = &&entry_MP_BC_LOAD_CONST_SMALL_INT_MULTI,
     [MP_BC_LOAD_FAST_MULTI ... MP_BC_LOAD_FAST_MULTI + 15] = &&entry_MP_BC_LOAD_FAST_MULTI,
     [MP_BC_STORE_FAST_MULTI ... MP_BC_STORE_FAST_MULTI + 15] = &&entry_MP_BC_STORE_FAST_MULTI,
-    [MP_BC_UNARY_OP_MULTI ... MP_BC_UNARY_OP_MULTI + MP_UNARY_OP_NON_BYTECODE - 1] = &&entry_MP_BC_UNARY_OP_MULTI,
-    [MP_BC_BINARY_OP_MULTI ... MP_BC_BINARY_OP_MULTI + 35] = &&entry_MP_BC_BINARY_OP_MULTI,
+    [MP_BC_UNARY_OP_MULTI ... MP_BC_UNARY_OP_MULTI + MP_UNARY_OP_NUM_BYTECODE - 1] = &&entry_MP_BC_UNARY_OP_MULTI,
+    [MP_BC_BINARY_OP_MULTI ... MP_BC_BINARY_OP_MULTI + MP_BINARY_OP_NUM_BYTECODE - 1] = &&entry_MP_BC_BINARY_OP_MULTI,
 };
 
 #if __clang__
diff --git a/tests/cmdline/cmd_showbc.py.exp b/tests/cmdline/cmd_showbc.py.exp
index 09fbff6..1274cda 100644
--- a/tests/cmdline/cmd_showbc.py.exp
+++ b/tests/cmdline/cmd_showbc.py.exp
@@ -43,9 +43,9 @@
   bc=\\d\+ line=126
 00 LOAD_CONST_NONE
 01 LOAD_CONST_FALSE
-02 BINARY_OP 28 __add__
+02 BINARY_OP 26 __add__
 03 LOAD_CONST_TRUE
-04 BINARY_OP 28 __add__
+04 BINARY_OP 26 __add__
 05 STORE_FAST 0
 06 LOAD_CONST_SMALL_INT 0
 07 STORE_FAST 0
@@ -84,7 +84,7 @@
 \\d\+ STORE_FAST 7
 \\d\+ LOAD_FAST 0
 \\d\+ LOAD_DEREF 14
-\\d\+ BINARY_OP 28 __add__
+\\d\+ BINARY_OP 26 __add__
 \\d\+ STORE_FAST 8
 \\d\+ LOAD_FAST 0
 \\d\+ UNARY_OP 1
@@ -132,7 +132,7 @@
 \\d\+ DUP_TOP_TWO
 \\d\+ LOAD_SUBSCR
 \\d\+ LOAD_FAST 12
-\\d\+ BINARY_OP 16 __iadd__
+\\d\+ BINARY_OP 14 __iadd__
 \\d\+ ROT_THREE
 \\d\+ STORE_SUBSCR
 \\d\+ LOAD_DEREF 14
@@ -369,7 +369,7 @@
 42 STORE_FAST_N 19
 44 LOAD_FAST 9
 45 LOAD_FAST_N 19
-47 BINARY_OP 28 __add__
+47 BINARY_OP 26 __add__
 48 POP_TOP
 49 LOAD_CONST_NONE
 50 RETURN_VALUE
@@ -521,7 +521,7 @@
   bc=\\d\+ line=113
 00 LOAD_DEREF 0
 02 LOAD_CONST_SMALL_INT 1
-03 BINARY_OP 28 __add__
+03 BINARY_OP 26 __add__
 04 STORE_FAST 1
 05 LOAD_CONST_SMALL_INT 1
 06 STORE_DEREF 0
@@ -540,7 +540,7 @@
   bc=\\d\+ line=139
 00 LOAD_FAST 1
 01 LOAD_DEREF 0
-03 BINARY_OP 28 __add__
+03 BINARY_OP 26 __add__
 04 RETURN_VALUE
 mem: total=\\d\+, current=\\d\+, peak=\\d\+
 stack: \\d\+ out of \\d\+