@ -423,7 +423,7 @@ STATIC const format_vfp_op_t format_vfp_op_table[] = {
# endif
# endif
// shorthand alias for whether we allow ARMv7-M instructions
// shorthand alias for whether we allow ARMv7-M instructions
# define ARMV7M MICROPY_EMIT_INLINE_THUMB_ARMV7M
# define ARMV7M asm_thumb_allow_armv7m(&emit->as)
STATIC void emit_inline_thumb_op ( emit_inline_asm_t * emit , qstr op , mp_uint_t n_args , mp_parse_node_t * pn_args ) {
STATIC void emit_inline_thumb_op ( emit_inline_asm_t * emit , qstr op , mp_uint_t n_args , mp_parse_node_t * pn_args ) {
// TODO perhaps make two tables:
// TODO perhaps make two tables:
@ -715,24 +715,23 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
} else if ( op = = MP_QSTR_sub ) {
} else if ( op = = MP_QSTR_sub ) {
op_code = ASM_THUMB_FORMAT_3_SUB ;
op_code = ASM_THUMB_FORMAT_3_SUB ;
goto op_format_3 ;
goto op_format_3 ;
# if ARMV7M
} else if ( ARMV7M & & op = = MP_QSTR_movw ) {
} else if ( op = = MP_QSTR_movw ) {
op_code = ASM_THUMB_OP_MOVW ;
op_code = ASM_THUMB_OP_MOVW ;
mp_uint_t reg_dest ;
mp_uint_t reg_dest ;
op_movw_movt :
op_movw_movt :
reg_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
reg_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
int i_src = get_arg_i ( emit , op_str , pn_args [ 1 ] , 0xffff ) ;
int i_src = get_arg_i ( emit , op_str , pn_args [ 1 ] , 0xffff ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , op_code , reg_dest , i_src ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , op_code , reg_dest , i_src ) ;
} else if ( op = = MP_QSTR_movt ) {
} else if ( ARMV7M & & op = = MP_QSTR_movt ) {
op_code = ASM_THUMB_OP_MOVT ;
op_code = ASM_THUMB_OP_MOVT ;
goto op_movw_movt ;
goto op_movw_movt ;
} else if ( op = = MP_QSTR_movwt ) {
} else if ( ARMV7M & & op = = MP_QSTR_movwt ) {
// this is a convenience instruction
// this is a convenience instruction
mp_uint_t reg_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
mp_uint_t reg_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
uint32_t i_src = get_arg_i ( emit , op_str , pn_args [ 1 ] , 0xffffffff ) ;
uint32_t i_src = get_arg_i ( emit , op_str , pn_args [ 1 ] , 0xffffffff ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , ASM_THUMB_OP_MOVW , reg_dest , i_src & 0xffff ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , ASM_THUMB_OP_MOVW , reg_dest , i_src & 0xffff ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , ASM_THUMB_OP_MOVT , reg_dest , ( i_src > > 16 ) & 0xffff ) ;
asm_thumb_mov_reg_i16 ( & emit - > as , ASM_THUMB_OP_MOVT , reg_dest , ( i_src > > 16 ) & 0xffff ) ;
} else if ( op = = MP_QSTR_ldrex ) {
} else if ( ARMV7M & & op = = MP_QSTR_ldrex ) {
mp_uint_t r_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
mp_uint_t r_dest = get_arg_reg ( emit , op_str , pn_args [ 0 ] , 15 ) ;
mp_parse_node_t pn_base , pn_offset ;
mp_parse_node_t pn_base , pn_offset ;
if ( get_arg_addr ( emit , op_str , pn_args [ 1 ] , & pn_base , & pn_offset ) ) {
if ( get_arg_addr ( emit , op_str , pn_args [ 1 ] , & pn_base , & pn_offset ) ) {
@ -740,7 +739,6 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
mp_uint_t i8 = get_arg_i ( emit , op_str , pn_offset , 0xff ) > > 2 ;
mp_uint_t i8 = get_arg_i ( emit , op_str , pn_offset , 0xff ) > > 2 ;
asm_thumb_op32 ( & emit - > as , 0xe850 | r_base , 0x0f00 | ( r_dest < < 12 ) | i8 ) ;
asm_thumb_op32 ( & emit - > as , 0xe850 | r_base , 0x0f00 | ( r_dest < < 12 ) | i8 ) ;
}
}
# endif
} else {
} else {
// search table for ldr/str instructions
// search table for ldr/str instructions
for ( mp_uint_t i = 0 ; i < MP_ARRAY_SIZE ( format_9_10_op_table ) ; i + + ) {
for ( mp_uint_t i = 0 ; i < MP_ARRAY_SIZE ( format_9_10_op_table ) ; i + + ) {