diff --git a/py/compile.c b/py/compile.c
index 1fd92c9477117338d7168bfbe4656f8ad1790b0c..924938e02eb4dae173b63aebe95fd86250cbaa10 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2683,7 +2683,7 @@ void py_compile(py_parse_node_t pn) {
 
     // compile pass 2 and 3
     emit_t *emit_bc = NULL;
-    emit_t *emit_x64 = NULL;
+    emit_t *emit_native = NULL;
     emit_inline_asm_t *emit_inline_thumb = NULL;
     for (scope_t *s = comp->scope_head; s != NULL; s = s->next) {
         if (s->emit_options == EMIT_OPT_ASM_THUMB) {
@@ -2699,10 +2699,10 @@ void py_compile(py_parse_node_t pn) {
         } else {
             switch (s->emit_options) {
                 case EMIT_OPT_NATIVE_PYTHON:
-                    if (emit_x64 == NULL) {
-                        emit_x64 = emit_x64_new(max_num_labels);
+                    if (emit_native == NULL) {
+                        emit_native = emit_x64_new(max_num_labels);
                     }
-                    comp->emit = emit_x64;
+                    comp->emit = emit_native;
                     comp->emit_method_table = &emit_x64_method_table;
                     break;
 
diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c
index a17d39cc8a489e7965512b2ada41a5ae565a6e89..ae226b74e74d59bea0c4e359cd6159de9a403aa9 100644
--- a/py/emitinlinethumb.c
+++ b/py/emitinlinethumb.c
@@ -57,7 +57,7 @@ static int emit_inline_thumb_count_params(emit_inline_asm_t *emit, int n_params,
     }
     for (int i = 0; i < n_params; i++) {
         if (!PY_PARSE_NODE_IS_ID(pn_params[i])) {
-            printf("SyntaxError: parameter to inline assembler must be an identifier %d\n", PY_PARSE_NODE_STRUCT_KIND((py_parse_node_struct_t*)pn_params[i]));
+            printf("SyntaxError: parameter to inline assembler must be an identifier\n");
             return 0;
         }
         const char *p = qstr_str(PY_PARSE_NODE_LEAF_ARG(pn_params[i]));
@@ -122,7 +122,10 @@ static int get_arg_label(emit_inline_asm_t *emit, qstr op, py_parse_node_t *pn_a
             return i;
         }
     }
-    printf("SyntaxError: label '%s' not defined\n", qstr_str(label_qstr));
+    // only need to have the labels on the last pass
+    if (emit->pass == PASS_3) {
+        printf("SyntaxError: label '%s' not defined\n", qstr_str(label_qstr));
+    }
     return 0;
 }
 
diff --git a/py/runtime.c b/py/runtime.c
index 4ac680562cc01d1b773da8924757659ba4413862..b133b31e06fbc3628d410b42ffc3825e9d73d266 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -772,6 +772,17 @@ py_obj_t rt_call_function_1(py_obj_t fun, py_obj_t arg) {
         assert(o->u_fun_bc.n_args == 1);
         DEBUG_OP_printf("calling byte code %p with 1 arg\n", o->u_fun_bc.code);
         return py_execute_byte_code(o->u_fun_bc.code, o->u_fun_bc.len, &arg, 1);
+    } else if (IS_O(fun, O_FUN_ASM)) {
+        py_obj_base_t *o = fun;
+        assert(o->u_fun_asm.n_args == 1);
+        DEBUG_OP_printf("calling inline asm %p with 1 arg\n", o->u_fun_asm.fun);
+        machine_int_t arg_val;
+        if (IS_SMALL_INT(arg)) {
+            arg_val = FROM_SMALL_INT(arg);
+        } else {
+            arg_val = arg;
+        }
+        return ((py_fun_1_t)o->u_fun_asm.fun)(arg_val);
     } else if (IS_O(fun, O_BOUND_METH)) {
         py_obj_base_t *o = fun;
         return rt_call_function_2(o->u_bound_meth.meth, o->u_bound_meth.self, arg);