From e67ed5d285bb2ae7b83eb8be3ee488ab08fa4db1 Mon Sep 17 00:00:00 2001 From: Damien George <damien.p.george@gmail.com> Date: Sat, 4 Jan 2014 13:55:24 +0000 Subject: [PATCH] Improve configurability for native x64/thumb emitter. With MICROPY_EMIT_X64 and MICROPY_EMIT_THUMB disabled, the respective emitters and assemblers will not be included in the code. This can significantly reduce binary size for unix version. --- py/asmthumb.c | 5 +++++ py/asmx64.c | 6 ++++++ py/compile.c | 7 ++++++- py/emitcpy.c | 1 + py/emitnative.c | 4 ++-- unix/Makefile | 4 ++-- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/py/asmthumb.c b/py/asmthumb.c index ee8041ac9..ba95d80c6 100644 --- a/py/asmthumb.c +++ b/py/asmthumb.c @@ -7,6 +7,9 @@ #include "mpconfig.h" #include "asmthumb.h" +// wrapper around everything in this file +#if MICROPY_EMIT_THUMB || MICROPY_EMIT_INLINE_THUMB + #define UNSIGNED_FIT8(x) (((x) & 0xffffff00) == 0) #define UNSIGNED_FIT16(x) (((x) & 0xffff0000) == 0) #define SIGNED_FIT8(x) (((x) & 0xffffff80) == 0) || (((x) & 0xffffff80) == 0xffffff80) @@ -447,3 +450,5 @@ void asm_thumb_bl_ind(asm_thumb_t *as, void *fun_ptr, uint fun_id, uint reg_temp asm_thumb_write_op16(as, OP_SVC(fun_id)); } } + +#endif // MICROPY_EMIT_THUMB || MICROPY_EMIT_INLINE_THUMB diff --git a/py/asmx64.c b/py/asmx64.c index c425034ba..ed9ca80f5 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -6,6 +6,10 @@ #include "misc.h" #include "asmx64.h" +#include "mpconfig.h" + +// wrapper around everything in this file +#if MICROPY_EMIT_X64 #if defined(__OpenBSD__) || defined(__MACH__) #define MAP_ANONYMOUS MAP_ANON @@ -620,3 +624,5 @@ void asm_x64_call_ind(asm_x64_t* as, void *ptr, int temp_r64) { asm_x64_write_word32(as, ptr - (void*)(as->code_base + as->code_offset + 4)); */ } + +#endif // MICROPY_EMIT_X64 diff --git a/py/compile.c b/py/compile.c index 68ac20804..8db7c6d94 100644 --- a/py/compile.c +++ b/py/compile.c @@ -3083,11 +3083,13 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { // compile pass 2 and 3 #if !MICROPY_EMIT_CPYTHON emit_t *emit_bc = NULL; +#if MICROPY_EMIT_NATIVE emit_t *emit_native = NULL; #endif #if MICROPY_EMIT_INLINE_THUMB emit_inline_asm_t *emit_inline_thumb = NULL; #endif +#endif // !MICROPY_EMIT_CPYTHON for (scope_t *s = comp->scope_head; s != NULL && !comp->had_error; s = s->next) { if (false) { // dummy @@ -3115,6 +3117,8 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { comp->emit_method_table = &emit_cpython_method_table; #else switch (s->emit_options) { + +#if MICROPY_EMIT_NATIVE case EMIT_OPT_NATIVE_PYTHON: case EMIT_OPT_VIPER: #if MICROPY_EMIT_X64 @@ -3131,6 +3135,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { comp->emit = emit_native; comp->emit_method_table->set_native_types(comp->emit, s->emit_options == EMIT_OPT_VIPER); break; +#endif // MICROPY_EMIT_NATIVE default: if (emit_bc == NULL) { @@ -3140,7 +3145,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { comp->emit_method_table = &emit_bc_method_table; break; } -#endif +#endif // !MICROPY_EMIT_CPYTHON // compile pass 2 and pass 3 compile_scope(comp, s, PASS_2); diff --git a/py/emitcpy.c b/py/emitcpy.c index 652617cc8..7b2d50fb7 100644 --- a/py/emitcpy.c +++ b/py/emitcpy.c @@ -13,6 +13,7 @@ #include "runtime0.h" #include "emit.h" +// wrapper around everything in this file #if MICROPY_EMIT_CPYTHON struct _emit_t { diff --git a/py/emitnative.c b/py/emitnative.c index a29922d96..cc00c5731 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -34,7 +34,7 @@ #include "runtime.h" // wrapper around everything in this file -#if N_X64 || N_THUMB +#if (MICROPY_EMIT_X64 && N_X64) || (MICROPY_EMIT_THUMB && N_THUMB) #if N_X64 @@ -1319,4 +1319,4 @@ const emit_method_table_t EXPORT_FUN(method_table) = { emit_native_yield_from, }; -#endif // N_X64 || N_THUMB +#endif // (MICROPY_EMIT_X64 && N_X64) || (MICROPY_EMIT_THUMB && N_THUMB) diff --git a/unix/Makefile b/unix/Makefile index 38d6ba8e1..a5c6ddcc0 100644 --- a/unix/Makefile +++ b/unix/Makefile @@ -83,10 +83,10 @@ $(BUILD)/%.o: $(PYSRC)/%.S $(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h +$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h +$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< # optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -- GitLab