|
61 | 61 | #if (MICROPY_EMIT_X64 && N_X64) \ |
62 | 62 | || (MICROPY_EMIT_X86 && N_X86) \ |
63 | 63 | || (MICROPY_EMIT_THUMB && N_THUMB) \ |
64 | | - || (MICROPY_EMIT_ARM && N_ARM) |
| 64 | + || (MICROPY_EMIT_ARM && N_ARM) \ |
| 65 | + || (MICROPY_EMIT_XTENSA && N_XTENSA) \ |
65 | 66 |
|
66 | 67 | // this is defined so that the assembler exports generic assembler API macros |
67 | 68 | #define GENERIC_ASM_API (1) |
@@ -139,6 +140,12 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = { |
139 | 140 | #include "py/asmarm.h" |
140 | 141 | #define EXPORT_FUN(name) emit_native_arm_##name |
141 | 142 |
|
| 143 | +#elif N_XTENSA |
| 144 | + |
| 145 | +// Xtensa specific stuff |
| 146 | +#include "py/asmxtensa.h" |
| 147 | +#define EXPORT_FUN(name) emit_native_xtensa_##name |
| 148 | + |
142 | 149 | #else |
143 | 150 |
|
144 | 151 | #error unknown native emitter |
@@ -1965,6 +1972,21 @@ STATIC void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { |
1965 | 1972 | ASM_ARM_CC_NE, |
1966 | 1973 | }; |
1967 | 1974 | asm_arm_setcc_reg(emit->as, REG_RET, ccs[op - MP_BINARY_OP_LESS]); |
| 1975 | + #elif N_XTENSA |
| 1976 | + static uint8_t ccs[6] = { |
| 1977 | + ASM_XTENSA_CC_LT, |
| 1978 | + 0x80 | ASM_XTENSA_CC_LT, // for GT we'll swap args |
| 1979 | + ASM_XTENSA_CC_EQ, |
| 1980 | + 0x80 | ASM_XTENSA_CC_GE, // for LE we'll swap args |
| 1981 | + ASM_XTENSA_CC_GE, |
| 1982 | + ASM_XTENSA_CC_NE, |
| 1983 | + }; |
| 1984 | + uint8_t cc = ccs[op - MP_BINARY_OP_LESS]; |
| 1985 | + if ((cc & 0x80) == 0) { |
| 1986 | + asm_xtensa_setcc_reg_reg_reg(emit->as, cc, REG_RET, REG_ARG_2, reg_rhs); |
| 1987 | + } else { |
| 1988 | + asm_xtensa_setcc_reg_reg_reg(emit->as, cc & ~0x80, REG_RET, reg_rhs, REG_ARG_2); |
| 1989 | + } |
1968 | 1990 | #else |
1969 | 1991 | #error not implemented |
1970 | 1992 | #endif |
|
0 commit comments