@@ -237,4 +237,85 @@ void asm_thumb_b_label(asm_thumb_t *as, uint label); // convenience: picks narro
237237void asm_thumb_bcc_label (asm_thumb_t * as , int cc , uint label ); // convenience: picks narrow or wide branch
238238void asm_thumb_bl_ind (asm_thumb_t * as , void * fun_ptr , uint fun_id , uint reg_temp ); // convenience
239239
240+ #if GENERIC_ASM_API
241+
242+ // The following macros provide a (mostly) arch-independent API to
243+ // generate native code, and are used by the native emitter.
244+
245+ #define ASM_WORD_SIZE (4)
246+
247+ #define REG_RET ASM_THUMB_REG_R0
248+ #define REG_ARG_1 ASM_THUMB_REG_R0
249+ #define REG_ARG_2 ASM_THUMB_REG_R1
250+ #define REG_ARG_3 ASM_THUMB_REG_R2
251+ #define REG_ARG_4 ASM_THUMB_REG_R3
252+ // rest of args go on stack
253+
254+ #define REG_TEMP0 ASM_THUMB_REG_R0
255+ #define REG_TEMP1 ASM_THUMB_REG_R1
256+ #define REG_TEMP2 ASM_THUMB_REG_R2
257+
258+ #define REG_LOCAL_1 ASM_THUMB_REG_R4
259+ #define REG_LOCAL_2 ASM_THUMB_REG_R5
260+ #define REG_LOCAL_3 ASM_THUMB_REG_R6
261+ #define REG_LOCAL_NUM (3)
262+
263+ #define ASM_T asm_thumb_t
264+ #define ASM_END_PASS asm_thumb_end_pass
265+ #define ASM_ENTRY asm_thumb_entry
266+ #define ASM_EXIT asm_thumb_exit
267+
268+ #define ASM_JUMP asm_thumb_b_label
269+ #define ASM_JUMP_IF_REG_ZERO (as , reg , label ) \
270+ do { \
271+ asm_thumb_cmp_rlo_i8(as, reg, 0); \
272+ asm_thumb_bcc_label(as, ASM_THUMB_CC_EQ, label); \
273+ } while (0)
274+ #define ASM_JUMP_IF_REG_NONZERO (as , reg , label ) \
275+ do { \
276+ asm_thumb_cmp_rlo_i8(as, reg, 0); \
277+ asm_thumb_bcc_label(as, ASM_THUMB_CC_NE, label); \
278+ } while (0)
279+ #define ASM_JUMP_IF_REG_EQ (as , reg1 , reg2 , label ) \
280+ do { \
281+ asm_thumb_cmp_rlo_rlo(as, reg1, reg2); \
282+ asm_thumb_bcc_label(as, ASM_THUMB_CC_EQ, label); \
283+ } while (0)
284+ #define ASM_CALL_IND (as , ptr , idx ) asm_thumb_bl_ind(as, ptr, idx, ASM_THUMB_REG_R3)
285+
286+ #define ASM_MOV_REG_TO_LOCAL (as , reg , local_num ) asm_thumb_mov_local_reg(as, (local_num), (reg))
287+ #define ASM_MOV_IMM_TO_REG (as , imm , reg ) asm_thumb_mov_reg_i32_optimised(as, (reg), (imm))
288+ #define ASM_MOV_ALIGNED_IMM_TO_REG (as , imm , reg ) asm_thumb_mov_reg_i32_aligned(as, (reg), (imm))
289+ #define ASM_MOV_IMM_TO_LOCAL_USING (as , imm , local_num , reg_temp ) \
290+ do { \
291+ asm_thumb_mov_reg_i32_optimised(as, (reg_temp), (imm)); \
292+ asm_thumb_mov_local_reg(as, (local_num), (reg_temp)); \
293+ } while (false)
294+ #define ASM_MOV_LOCAL_TO_REG (as , local_num , reg ) asm_thumb_mov_reg_local(as, (reg), (local_num))
295+ #define ASM_MOV_REG_REG (as , reg_dest , reg_src ) asm_thumb_mov_reg_reg((as), (reg_dest), (reg_src))
296+ #define ASM_MOV_LOCAL_ADDR_TO_REG (as , local_num , reg ) asm_thumb_mov_reg_local_addr(as, (reg), (local_num))
297+
298+ #define ASM_LSL_REG_REG (as , reg_dest , reg_shift ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_LSL, (reg_dest), (reg_shift))
299+ #define ASM_ASR_REG_REG (as , reg_dest , reg_shift ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_ASR, (reg_dest), (reg_shift))
300+ #define ASM_OR_REG_REG (as , reg_dest , reg_src ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_ORR, (reg_dest), (reg_src))
301+ #define ASM_XOR_REG_REG (as , reg_dest , reg_src ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_EOR, (reg_dest), (reg_src))
302+ #define ASM_AND_REG_REG (as , reg_dest , reg_src ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_AND, (reg_dest), (reg_src))
303+ #define ASM_ADD_REG_REG (as , reg_dest , reg_src ) asm_thumb_add_rlo_rlo_rlo((as), (reg_dest), (reg_dest), (reg_src))
304+ #define ASM_SUB_REG_REG (as , reg_dest , reg_src ) asm_thumb_sub_rlo_rlo_rlo((as), (reg_dest), (reg_dest), (reg_src))
305+ #define ASM_MUL_REG_REG (as , reg_dest , reg_src ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_MUL, (reg_dest), (reg_src))
306+
307+ #define ASM_LOAD_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldr_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
308+ #define ASM_LOAD_REG_REG_OFFSET (as , reg_dest , reg_base , word_offset ) asm_thumb_ldr_rlo_rlo_i5((as), (reg_dest), (reg_base), (word_offset))
309+ #define ASM_LOAD8_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldrb_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
310+ #define ASM_LOAD16_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldrh_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
311+ #define ASM_LOAD32_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldr_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
312+
313+ #define ASM_STORE_REG_REG (as , reg_src , reg_base ) asm_thumb_str_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
314+ #define ASM_STORE_REG_REG_OFFSET (as , reg_src , reg_base , word_offset ) asm_thumb_str_rlo_rlo_i5((as), (reg_src), (reg_base), (word_offset))
315+ #define ASM_STORE8_REG_REG (as , reg_src , reg_base ) asm_thumb_strb_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
316+ #define ASM_STORE16_REG_REG (as , reg_src , reg_base ) asm_thumb_strh_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
317+ #define ASM_STORE32_REG_REG (as , reg_src , reg_base ) asm_thumb_str_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
318+
319+ #endif // GENERIC_ASM_API
320+
240321#endif // __MICROPY_INCLUDED_PY_ASMTHUMB_H__
0 commit comments