summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-12-07 11:17:17 +1100
committerDamien George <damien.p.george@gmail.com>2016-12-07 11:17:17 +1100
commit080a78b15edc465010864002d1c83a5730a85dd0 (patch)
treef2e824a1fa83e9824183cce4c3e3537fc9629527 /py
parent4c7d799b8244bcffc94cb33eea3d627f51d0ce41 (diff)
downloadmicropython-080a78b15edc465010864002d1c83a5730a85dd0.tar.gz
micropython-080a78b15edc465010864002d1c83a5730a85dd0.zip
py/compile: Simplify configuration of native emitter.
Diffstat (limited to 'py')
-rw-r--r--py/compile.c46
1 files changed, 18 insertions, 28 deletions
diff --git a/py/compile.c b/py/compile.c
index bc8d8d16d7..418c1100bf 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -69,6 +69,21 @@ typedef enum {
#endif
+#if MICROPY_EMIT_NATIVE
+// define a macro to access external native emitter
+#if MICROPY_EMIT_X64
+#define NATIVE_EMITTER(f) emit_native_x64_##f
+#elif MICROPY_EMIT_X86
+#define NATIVE_EMITTER(f) emit_native_x86_##f
+#elif MICROPY_EMIT_THUMB
+#define NATIVE_EMITTER(f) emit_native_thumb_##f
+#elif MICROPY_EMIT_ARM
+#define NATIVE_EMITTER(f) emit_native_arm_##f
+#else
+#error "unknown native emitter"
+#endif
+#endif
+
#define EMIT_INLINE_ASM(fun) (comp->emit_inline_asm_method_table->fun(comp->emit_inline_asm))
#define EMIT_INLINE_ASM_ARG(fun, ...) (comp->emit_inline_asm_method_table->fun(comp->emit_inline_asm, __VA_ARGS__))
@@ -3397,27 +3412,10 @@ mp_raw_code_t *mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr source_f
#if MICROPY_EMIT_NATIVE
case MP_EMIT_OPT_NATIVE_PYTHON:
case MP_EMIT_OPT_VIPER:
-#if MICROPY_EMIT_X64
- if (emit_native == NULL) {
- emit_native = emit_native_x64_new(&comp->compile_error, max_num_labels);
- }
- comp->emit_method_table = &emit_native_x64_method_table;
-#elif MICROPY_EMIT_X86
if (emit_native == NULL) {
- emit_native = emit_native_x86_new(&comp->compile_error, max_num_labels);
+ emit_native = NATIVE_EMITTER(new)(&comp->compile_error, max_num_labels);
}
- comp->emit_method_table = &emit_native_x86_method_table;
-#elif MICROPY_EMIT_THUMB
- if (emit_native == NULL) {
- emit_native = emit_native_thumb_new(&comp->compile_error, max_num_labels);
- }
- comp->emit_method_table = &emit_native_thumb_method_table;
-#elif MICROPY_EMIT_ARM
- if (emit_native == NULL) {
- emit_native = emit_native_arm_new(&comp->compile_error, max_num_labels);
- }
- comp->emit_method_table = &emit_native_arm_method_table;
-#endif
+ comp->emit_method_table = &NATIVE_EMITTER(method_table);
comp->emit = emit_native;
EMIT_ARG(set_native_type, MP_EMIT_NATIVE_TYPE_ENABLE, s->emit_options == MP_EMIT_OPT_VIPER, 0);
break;
@@ -3460,15 +3458,7 @@ mp_raw_code_t *mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr source_f
emit_bc_free(emit_bc);
#if MICROPY_EMIT_NATIVE
if (emit_native != NULL) {
-#if MICROPY_EMIT_X64
- emit_native_x64_free(emit_native);
-#elif MICROPY_EMIT_X86
- emit_native_x86_free(emit_native);
-#elif MICROPY_EMIT_THUMB
- emit_native_thumb_free(emit_native);
-#elif MICROPY_EMIT_ARM
- emit_native_arm_free(emit_native);
-#endif
+ NATIVE_EMITTER(free)(emit_native);
}
#endif
#if MICROPY_EMIT_INLINE_THUMB