py: Add new Xtensa-Windowed arch for native emitter.
Enabled via the configuration MICROPY_EMIT_XTENSAWIN.
This commit is contained in:
parent
f7ddc94166
commit
9adedce42e
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
|
1
py/nlr.h
1
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
1
py/py.mk
1
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 \
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue