summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/asmxtensa.c4
-rw-r--r--py/compile.c4
-rw-r--r--py/emit.h3
-rw-r--r--py/emitnative.c4
-rw-r--r--py/emitnxtensawin.c23
-rw-r--r--py/mpconfig.h10
-rw-r--r--py/nlr.h1
-rw-r--r--py/persistentcode.c4
-rw-r--r--py/persistentcode.h1
-rw-r--r--py/py.mk1
-rwxr-xr-xtools/mpy-tool.py1
11 files changed, 50 insertions, 6 deletions
diff --git a/py/asmxtensa.c b/py/asmxtensa.c
index 22ea2300a..32e5e958a 100644
--- a/py/asmxtensa.c
+++ b/py/asmxtensa.c
@@ -30,7 +30,7 @@
#include "py/mpconfig.h"
// wrapper around everything in this file
-#if MICROPY_EMIT_XTENSA || MICROPY_EMIT_INLINE_XTENSA
+#if MICROPY_EMIT_XTENSA || MICROPY_EMIT_INLINE_XTENSA || MICROPY_EMIT_XTENSAWIN
#include "py/asmxtensa.h"
@@ -250,4 +250,4 @@ void asm_xtensa_call_ind_win(asm_xtensa_t *as, uint idx) {
asm_xtensa_op_callx8(as, ASM_XTENSA_REG_A8);
}
-#endif // MICROPY_EMIT_XTENSA || MICROPY_EMIT_INLINE_XTENSA
+#endif // MICROPY_EMIT_XTENSA || MICROPY_EMIT_INLINE_XTENSA || MICROPY_EMIT_XTENSAWIN
diff --git a/py/compile.c b/py/compile.c
index 62b0f3938..2c818a934 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -95,6 +95,7 @@ STATIC const emit_method_table_t *emit_native_table[] = {
&emit_native_thumb_method_table,
&emit_native_thumb_method_table,
&emit_native_xtensa_method_table,
+ &emit_native_xtensawin_method_table,
};
#elif MICROPY_EMIT_NATIVE
@@ -109,6 +110,8 @@ STATIC const emit_method_table_t *emit_native_table[] = {
#define NATIVE_EMITTER(f) emit_native_arm_##f
#elif MICROPY_EMIT_XTENSA
#define NATIVE_EMITTER(f) emit_native_xtensa_##f
+#elif MICROPY_EMIT_XTENSAWIN
+#define NATIVE_EMITTER(f) emit_native_xtensawin_##f
#else
#error "unknown native emitter"
#endif
@@ -131,6 +134,7 @@ STATIC const emit_inline_asm_method_table_t *emit_asm_table[] = {
&emit_inline_thumb_method_table,
&emit_inline_thumb_method_table,
&emit_inline_xtensa_method_table,
+ NULL,
};
#elif MICROPY_EMIT_INLINE_ASM
diff --git a/py/emit.h b/py/emit.h
index b3b6d755b..26d027a7a 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -174,6 +174,7 @@ extern const emit_method_table_t emit_native_x86_method_table;
extern const emit_method_table_t emit_native_thumb_method_table;
extern const emit_method_table_t emit_native_arm_method_table;
extern const emit_method_table_t emit_native_xtensa_method_table;
+extern const emit_method_table_t emit_native_xtensawin_method_table;
extern const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_load_id_ops;
extern const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_store_id_ops;
@@ -185,6 +186,7 @@ emit_t *emit_native_x86_new(mp_obj_t *error_slot, uint *label_slot, mp_uint_t ma
emit_t *emit_native_thumb_new(mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels);
emit_t *emit_native_arm_new(mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels);
emit_t *emit_native_xtensa_new(mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels);
+emit_t *emit_native_xtensawin_new(mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels);
void emit_bc_set_max_num_labels(emit_t* emit, mp_uint_t max_num_labels);
@@ -194,6 +196,7 @@ void emit_native_x86_free(emit_t *emit);
void emit_native_thumb_free(emit_t *emit);
void emit_native_arm_free(emit_t *emit);
void emit_native_xtensa_free(emit_t *emit);
+void emit_native_xtensawin_free(emit_t *emit);
void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope);
void mp_emit_bc_end_pass(emit_t *emit);
diff --git a/py/emitnative.c b/py/emitnative.c
index f3bc8a5c4..e038b8778 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -58,7 +58,7 @@
#endif
// wrapper around everything in this file
-#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA
+#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA || N_XTENSAWIN
// C stack layout for native functions:
// 0: nlr_buf_t [optional]
@@ -2404,7 +2404,7 @@ STATIC void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) {
ASM_ARM_CC_NE,
};
asm_arm_setcc_reg(emit->as, REG_RET, ccs[op - MP_BINARY_OP_LESS]);
- #elif N_XTENSA
+ #elif N_XTENSA || N_XTENSAWIN
static uint8_t ccs[6] = {
ASM_XTENSA_CC_LT,
0x80 | ASM_XTENSA_CC_LT, // for GT we'll swap args
diff --git a/py/emitnxtensawin.c b/py/emitnxtensawin.c
new file mode 100644
index 000000000..38d5db13e
--- /dev/null
+++ b/py/emitnxtensawin.c
@@ -0,0 +1,23 @@
+// Xtensa-Windowed specific stuff
+
+#include "py/mpconfig.h"
+
+#if MICROPY_EMIT_XTENSAWIN
+
+// this is defined so that the assembler exports generic assembler API macros
+#define GENERIC_ASM_API (1)
+#define GENERIC_ASM_API_WIN (1)
+#include "py/asmxtensa.h"
+
+// Word indices of REG_LOCAL_x in nlr_buf_t
+#define NLR_BUF_IDX_LOCAL_1 (2 + 4) // a4
+#define NLR_BUF_IDX_LOCAL_2 (2 + 5) // a5
+#define NLR_BUF_IDX_LOCAL_3 (2 + 6) // a6
+
+#define N_NLR_SETJMP (1)
+#define N_PRELUDE_AS_BYTES_OBJ (1)
+#define N_XTENSAWIN (1)
+#define EXPORT_FUN(name) emit_native_xtensawin_##name
+#include "py/emitnative.c"
+
+#endif
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 64dadde92..4172b5fcf 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -323,8 +323,16 @@
#define MICROPY_EMIT_INLINE_XTENSA (0)
#endif
+// Whether to emit Xtensa-Windowed native code
+#ifndef MICROPY_EMIT_XTENSAWIN
+#define MICROPY_EMIT_XTENSAWIN (0)
+#endif
+
// Convenience definition for whether any native emitter is enabled
-#define MICROPY_EMIT_NATIVE (MICROPY_EMIT_X64 || MICROPY_EMIT_X86 || MICROPY_EMIT_THUMB || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA)
+#define MICROPY_EMIT_NATIVE (MICROPY_EMIT_X64 || MICROPY_EMIT_X86 || MICROPY_EMIT_THUMB || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA || MICROPY_EMIT_XTENSAWIN)
+
+// Select prelude-as-bytes-object for certain emitters
+#define MICROPY_EMIT_NATIVE_PRELUDE_AS_BYTES_OBJ (MICROPY_EMIT_XTENSAWIN)
// Convenience definition for whether any inline assembler emitter is enabled
#define MICROPY_EMIT_INLINE_ASM (MICROPY_EMIT_INLINE_THUMB || MICROPY_EMIT_INLINE_XTENSA)
diff --git a/py/nlr.h b/py/nlr.h
index 3e4b31d92..f2453bc46 100644
--- a/py/nlr.h
+++ b/py/nlr.h
@@ -40,6 +40,7 @@
#define MICROPY_NLR_NUM_REGS_ARM_THUMB (10)
#define MICROPY_NLR_NUM_REGS_ARM_THUMB_FP (10 + 6)
#define MICROPY_NLR_NUM_REGS_XTENSA (10)
+#define MICROPY_NLR_NUM_REGS_XTENSAWIN (17)
// If MICROPY_NLR_SETJMP is not enabled then auto-detect the machine arch
#if !MICROPY_NLR_SETJMP
diff --git a/py/persistentcode.c b/py/persistentcode.c
index 2109d9379..6a8a866ac 100644
--- a/py/persistentcode.c
+++ b/py/persistentcode.c
@@ -71,6 +71,8 @@
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_ARMV6)
#elif MICROPY_EMIT_XTENSA
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSA)
+#elif MICROPY_EMIT_XTENSAWIN
+#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSAWIN)
#else
#define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_NONE)
#endif
@@ -196,7 +198,7 @@ STATIC void arch_link_qstr(uint8_t *pc, bool is_obj, qstr qst) {
if (is_obj) {
val = (mp_uint_t)MP_OBJ_NEW_QSTR(qst);
}
- #if MICROPY_EMIT_X86 || MICROPY_EMIT_X64 || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA
+ #if MICROPY_EMIT_X86 || MICROPY_EMIT_X64 || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA || MICROPY_EMIT_XTENSAWIN
pc[0] = val & 0xff;
pc[1] = (val >> 8) & 0xff;
pc[2] = (val >> 16) & 0xff;
diff --git a/py/persistentcode.h b/py/persistentcode.h
index 67c5f3463..aba44ea2d 100644
--- a/py/persistentcode.h
+++ b/py/persistentcode.h
@@ -44,6 +44,7 @@ enum {
MP_NATIVE_ARCH_ARMV7EMSP,
MP_NATIVE_ARCH_ARMV7EMDP,
MP_NATIVE_ARCH_XTENSA,
+ MP_NATIVE_ARCH_XTENSAWIN,
};
mp_raw_code_t *mp_raw_code_load(mp_reader_t *reader);
diff --git a/py/py.mk b/py/py.mk
index d97852dd4..5669e33fc 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -76,6 +76,7 @@ PY_CORE_O_BASENAME = $(addprefix py/,\
asmxtensa.o \
emitnxtensa.o \
emitinlinextensa.o \
+ emitnxtensawin.o \
formatfloat.o \
parsenumbase.o \
parsenum.o \
diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index 8c0f5db18..ab783f418 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -102,6 +102,7 @@ MP_NATIVE_ARCH_ARMV7EM = 6
MP_NATIVE_ARCH_ARMV7EMSP = 7
MP_NATIVE_ARCH_ARMV7EMDP = 8
MP_NATIVE_ARCH_XTENSA = 9
+MP_NATIVE_ARCH_XTENSAWIN = 10
MP_BC_MASK_EXTRA_BYTE = 0x9e