From dc83382903675c017f449285bf42a51d0e936e4e Mon Sep 17 00:00:00 2001 From: Damien Date: Sun, 6 Oct 2013 01:01:01 +0100 Subject: [PATCH] Make runtime able to call inline asm with 1 argument. --- py/compile.c | 8 ++++---- py/emitinlinethumb.c | 7 +++++-- py/runtime.c | 11 +++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/py/compile.c b/py/compile.c index 1fd92c947..924938e02 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 a17d39cc8..ae226b74e 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 4ac680562..b133b31e0 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);