@@ -3184,7 +3184,7 @@ void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind_t pass
31843184 int n_args = list_get (& pns2 -> nodes [0 ], PN_arglist , & pn_arg );
31853185
31863186 // emit instructions
3187- if (strcmp ( qstr_str ( op ), "label" ) == 0 ) {
3187+ if (op == MP_QSTR_label ) {
31883188 if (!(n_args == 1 && MP_PARSE_NODE_IS_ID (pn_arg [0 ]))) {
31893189 compile_syntax_error (comp , nodes [i ], "inline assembler 'label' requires 1 argument" );
31903190 return ;
@@ -3193,6 +3193,29 @@ void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind_t pass
31933193 if (pass > PASS_1 ) {
31943194 EMIT_INLINE_ASM_ARG (label , lab , MP_PARSE_NODE_LEAF_ARG (pn_arg [0 ]));
31953195 }
3196+ } else if (op == MP_QSTR_align ) {
3197+ if (!(n_args == 1 && MP_PARSE_NODE_IS_SMALL_INT (pn_arg [0 ]))) {
3198+ compile_syntax_error (comp , nodes [i ], "inline assembler 'align' requires 1 argument" );
3199+ return ;
3200+ }
3201+ if (pass > PASS_1 ) {
3202+ EMIT_INLINE_ASM_ARG (align , MP_PARSE_NODE_LEAF_SMALL_INT (pn_arg [0 ]));
3203+ }
3204+ } else if (op == MP_QSTR_data ) {
3205+ if (!(n_args >= 2 && MP_PARSE_NODE_IS_SMALL_INT (pn_arg [0 ]))) {
3206+ compile_syntax_error (comp , nodes [i ], "inline assembler 'data' requires at least 2 arguments" );
3207+ return ;
3208+ }
3209+ if (pass > PASS_1 ) {
3210+ machine_int_t bytesize = MP_PARSE_NODE_LEAF_SMALL_INT (pn_arg [0 ]);
3211+ for (uint i = 1 ; i < n_args ; i ++ ) {
3212+ if (!MP_PARSE_NODE_IS_SMALL_INT (pn_arg [i ])) {
3213+ compile_syntax_error (comp , nodes [i ], "inline assembler 'data' requires integer arguments" );
3214+ return ;
3215+ }
3216+ EMIT_INLINE_ASM_ARG (data , bytesize , MP_PARSE_NODE_LEAF_SMALL_INT (pn_arg [i ]));
3217+ }
3218+ }
31963219 } else {
31973220 if (pass > PASS_1 ) {
31983221 EMIT_INLINE_ASM_ARG (op , op , n_args , pn_arg );
0 commit comments