@@ -95,18 +95,21 @@ STATIC void emit_inline_thumb_end_pass(emit_inline_asm_t *emit, mp_uint_t type_s
95
95
}
96
96
}
97
97
98
- STATIC mp_uint_t emit_inline_thumb_count_params (emit_inline_asm_t * emit , mp_uint_t n_params , mp_parse_node_t * pn_params ) {
99
- if (n_params > 4 ) {
100
- emit_inline_thumb_error_msg (emit , "can only have up to 4 parameters to Thumb assembly" );
101
- return 0 ;
102
- }
103
- for (mp_uint_t i = 0 ; i < n_params ; i ++ ) {
104
- if (!MP_PARSE_NODE_IS_ID (pn_params [i ])) {
98
+ STATIC mp_uint_t emit_inline_thumb_count_params (emit_inline_asm_t * emit , const byte * p , const byte * ptop ) {
99
+ mp_uint_t n_params = 0 ;
100
+ while (p != ptop ) {
101
+ if (++ n_params > 4 ) {
102
+ emit_inline_thumb_error_msg (emit , "can only have up to 4 parameters to Thumb assembly" );
103
+ return 0 ;
104
+ }
105
+ if (!pt_is_any_id (p )) {
105
106
emit_inline_thumb_error_msg (emit , "parameters must be registers in sequence r0 to r3" );
106
107
return 0 ;
107
108
}
108
- const char * p = qstr_str (MP_PARSE_NODE_LEAF_ARG (pn_params [i ]));
109
- if (!(strlen (p ) == 2 && p [0 ] == 'r' && p [1 ] == '0' + i )) {
109
+ qstr qst ;
110
+ p = pt_extract_id (p , & qst );
111
+ const char * param = qstr_str (qst );
112
+ if (!(strlen (param ) == 2 && param [0 ] == 'r' && param [1 ] == '0' + n_params - 1 )) {
110
113
emit_inline_thumb_error_msg (emit , "parameters must be registers in sequence r0 to r3" );
111
114
return 0 ;
112
115
}
@@ -171,16 +174,17 @@ STATIC const special_reg_name_t special_reg_name_table[] = {
171
174
172
175
// return empty string in case of error, so we can attempt to parse the string
173
176
// without a special check if it was in fact a string
174
- STATIC const char * get_arg_str (mp_parse_node_t pn ) {
175
- if (MP_PARSE_NODE_IS_ID (pn )) {
176
- qstr qst = MP_PARSE_NODE_LEAF_ARG (pn );
177
+ STATIC const char * get_arg_str (const byte * pn ) {
178
+ if (pt_is_any_id (pn )) {
179
+ qstr qst ;
180
+ pt_extract_id (pn , & qst );
177
181
return qstr_str (qst );
178
182
} else {
179
183
return "" ;
180
184
}
181
185
}
182
186
183
- STATIC mp_uint_t get_arg_reg (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn , mp_uint_t max_reg ) {
187
+ STATIC mp_uint_t get_arg_reg (emit_inline_asm_t * emit , const char * op , const byte * pn , mp_uint_t max_reg ) {
184
188
const char * reg_str = get_arg_str (pn );
185
189
for (mp_uint_t i = 0 ; i < MP_ARRAY_SIZE (reg_name_table ); i ++ ) {
186
190
const reg_name_t * r = & reg_name_table [i ];
@@ -204,7 +208,7 @@ STATIC mp_uint_t get_arg_reg(emit_inline_asm_t *emit, const char *op, mp_parse_n
204
208
return 0 ;
205
209
}
206
210
207
- STATIC mp_uint_t get_arg_special_reg (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn ) {
211
+ STATIC mp_uint_t get_arg_special_reg (emit_inline_asm_t * emit , const char * op , const byte * pn ) {
208
212
const char * reg_str = get_arg_str (pn );
209
213
for (mp_uint_t i = 0 ; i < MP_ARRAY_SIZE (special_reg_name_table ); i ++ ) {
210
214
const special_reg_name_t * r = & special_reg_name_table [i ];
@@ -219,7 +223,7 @@ STATIC mp_uint_t get_arg_special_reg(emit_inline_asm_t *emit, const char *op, mp
219
223
}
220
224
221
225
#if MICROPY_EMIT_INLINE_THUMB_FLOAT
222
- STATIC mp_uint_t get_arg_vfpreg (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn ) {
226
+ STATIC mp_uint_t get_arg_vfpreg (emit_inline_asm_t * emit , const char * op , const byte * pn ) {
223
227
const char * reg_str = get_arg_str (pn );
224
228
if (reg_str [0 ] == 's' && reg_str [1 ] != '\0' ) {
225
229
mp_uint_t regno = 0 ;
@@ -247,43 +251,42 @@ STATIC mp_uint_t get_arg_vfpreg(emit_inline_asm_t *emit, const char *op, mp_pars
247
251
}
248
252
#endif
249
253
250
- STATIC mp_uint_t get_arg_reglist (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn ) {
254
+ STATIC mp_uint_t get_arg_reglist (emit_inline_asm_t * emit , const char * op , const byte * p ) {
251
255
// a register list looks like {r0, r1, r2} and is parsed as a Python set
252
256
253
- if (!MP_PARSE_NODE_IS_STRUCT_KIND ( pn , PN_atom_brace )) {
257
+ if (!pt_is_rule ( p , PN_atom_brace )) {
254
258
goto bad_arg ;
255
259
}
256
260
257
- mp_parse_node_struct_t * pns = (mp_parse_node_struct_t * )pn ;
258
- assert (MP_PARSE_NODE_STRUCT_NUM_NODES (pns ) == 1 ); // should always be
259
- pn = pns -> nodes [0 ];
261
+ const byte * ptop ;
262
+ p = pt_rule_extract_top (p , & ptop );
260
263
261
264
mp_uint_t reglist = 0 ;
262
265
263
- if (MP_PARSE_NODE_IS_ID (pn )) {
266
+ if (p == ptop ) {
267
+ goto bad_arg ;
268
+ } else if (pt_is_any_id (p )) {
264
269
// set with one element
265
- reglist |= 1 << get_arg_reg (emit , op , pn , 15 );
266
- } else if (MP_PARSE_NODE_IS_STRUCT (pn )) {
267
- pns = (mp_parse_node_struct_t * )pn ;
268
- if (MP_PARSE_NODE_STRUCT_KIND (pns ) == PN_dictorsetmaker ) {
269
- assert (MP_PARSE_NODE_IS_STRUCT (pns -> nodes [1 ])); // should succeed
270
- mp_parse_node_struct_t * pns1 = (mp_parse_node_struct_t * )pns -> nodes [1 ];
271
- if (MP_PARSE_NODE_STRUCT_KIND (pns1 ) == PN_dictorsetmaker_list ) {
272
- // set with multiple elements
273
-
274
- // get first element of set (we rely on get_arg_reg to catch syntax errors)
275
- reglist |= 1 << get_arg_reg (emit , op , pns -> nodes [0 ], 15 );
276
-
277
- // get tail elements (2nd, 3rd, ...)
278
- mp_parse_node_t * nodes ;
279
- int n = mp_parse_node_extract_list (& pns1 -> nodes [0 ], PN_dictorsetmaker_list2 , & nodes );
280
-
281
- // process rest of elements
282
- for (int i = 0 ; i < n ; i ++ ) {
283
- reglist |= 1 << get_arg_reg (emit , op , nodes [i ], 15 );
284
- }
285
- } else {
286
- goto bad_arg ;
270
+ reglist |= 1 << get_arg_reg (emit , op , p , 15 );
271
+ } else if (pt_is_rule (p , PN_dictorsetmaker )) {
272
+ p = pt_rule_first (p );
273
+ const byte * p1 = pt_next (p );
274
+ if (pt_is_rule (p1 , PN_dictorsetmaker_list )) {
275
+ // set with multiple elements
276
+
277
+ // get first element of set (we rely on get_arg_reg to catch syntax errors)
278
+ reglist |= 1 << get_arg_reg (emit , op , p , 15 );
279
+
280
+ // get tail elements (2nd, 3rd, ...)
281
+ const byte * p1_top ;
282
+ p1 = pt_rule_extract_top (p1 , & p1_top );
283
+ if (p1 != p1_top ) {
284
+ mp_parse_node_extract_list (& p1 , PN_dictorsetmaker_list2 );
285
+ }
286
+
287
+ // process rest of elements
288
+ for (; p1 != p1_top ; p1 = pt_next (p1 )) {
289
+ reglist |= 1 << get_arg_reg (emit , op , p1 , 15 );
287
290
}
288
291
} else {
289
292
goto bad_arg ;
@@ -299,7 +302,7 @@ STATIC mp_uint_t get_arg_reglist(emit_inline_asm_t *emit, const char *op, mp_par
299
302
return 0 ;
300
303
}
301
304
302
- STATIC uint32_t get_arg_i (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn , uint32_t fit_mask ) {
305
+ STATIC uint32_t get_arg_i (emit_inline_asm_t * emit , const char * op , const byte * pn , uint32_t fit_mask ) {
303
306
mp_obj_t o ;
304
307
if (!mp_parse_node_get_int_maybe (pn , & o )) {
305
308
emit_inline_thumb_error_exc (emit , mp_obj_new_exception_msg_varg (& mp_type_SyntaxError , "'%s' expects an integer" , op ));
@@ -313,34 +316,39 @@ STATIC uint32_t get_arg_i(emit_inline_asm_t *emit, const char *op, mp_parse_node
313
316
return i ;
314
317
}
315
318
316
- STATIC bool get_arg_addr (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn , mp_parse_node_t * pn_base , mp_parse_node_t * pn_offset ) {
317
- if (!MP_PARSE_NODE_IS_STRUCT_KIND (pn , PN_atom_bracket )) {
319
+ STATIC bool get_arg_addr (emit_inline_asm_t * emit , const char * op , const byte * p , const byte * * p_base , const byte * * p_offset ) {
320
+ if (!pt_is_rule (p , PN_atom_bracket )) {
321
+ goto bad_arg ;
322
+ }
323
+ if (pt_is_rule_empty (p )) {
318
324
goto bad_arg ;
319
325
}
320
- mp_parse_node_struct_t * pns = ( mp_parse_node_struct_t * ) pn ;
321
- if (!MP_PARSE_NODE_IS_STRUCT_KIND ( pns -> nodes [ 0 ] , PN_testlist_comp )) {
326
+ p = pt_rule_first ( p ) ;
327
+ if (!pt_is_rule ( p , PN_testlist_comp )) {
322
328
goto bad_arg ;
323
329
}
324
- pns = (mp_parse_node_struct_t * )pns -> nodes [0 ];
325
- if (MP_PARSE_NODE_STRUCT_NUM_NODES (pns ) != 2 ) {
330
+ const byte * ptop ;
331
+ p = pt_rule_extract_top (p , & ptop );
332
+ if (pt_num_nodes (p , ptop ) != 2 ) {
326
333
goto bad_arg ;
327
334
}
328
335
329
- * pn_base = pns -> nodes [ 0 ] ;
330
- * pn_offset = pns -> nodes [ 1 ] ;
336
+ * p_base = p ;
337
+ * p_offset = pt_next ( p ) ;
331
338
return true;
332
339
333
340
bad_arg :
334
341
emit_inline_thumb_error_exc (emit , mp_obj_new_exception_msg_varg (& mp_type_SyntaxError , "'%s' expects an address of the form [a, b]" , op ));
335
342
return false;
336
343
}
337
344
338
- STATIC int get_arg_label (emit_inline_asm_t * emit , const char * op , mp_parse_node_t pn ) {
339
- if (!MP_PARSE_NODE_IS_ID ( pn )) {
345
+ STATIC int get_arg_label (emit_inline_asm_t * emit , const char * op , const byte * p ) {
346
+ if (!pt_is_any_id ( p )) {
340
347
emit_inline_thumb_error_exc (emit , mp_obj_new_exception_msg_varg (& mp_type_SyntaxError , "'%s' expects a label" , op ));
341
348
return 0 ;
342
349
}
343
- qstr label_qstr = MP_PARSE_NODE_LEAF_ARG (pn );
350
+ qstr label_qstr ;
351
+ pt_extract_id (p , & label_qstr );
344
352
for (uint i = 0 ; i < emit -> max_num_labels ; i ++ ) {
345
353
if (emit -> label_lookup [i ] == label_qstr ) {
346
354
return i ;
@@ -419,7 +427,7 @@ STATIC const format_vfp_op_t format_vfp_op_table[] = {
419
427
// shorthand alias for whether we allow ARMv7-M instructions
420
428
#define ARMV7M MICROPY_EMIT_INLINE_THUMB_ARMV7M
421
429
422
- STATIC void emit_inline_thumb_op (emit_inline_asm_t * emit , qstr op , mp_uint_t n_args , mp_parse_node_t * pn_args ) {
430
+ STATIC void emit_inline_thumb_op (emit_inline_asm_t * emit , qstr op , mp_uint_t n_args , const byte * * pn_args ) {
423
431
// TODO perhaps make two tables:
424
432
// one_args =
425
433
// "b", LAB, asm_thumb_b_n,
@@ -493,7 +501,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
493
501
op_code_hi = 0xed90 ;
494
502
op_vldr_vstr :;
495
503
mp_uint_t vd = get_arg_vfpreg (emit , op_str , pn_args [0 ]);
496
- mp_parse_node_t pn_base , pn_offset ;
504
+ const byte * pn_base , * pn_offset ;
497
505
if (get_arg_addr (emit , op_str , pn_args [1 ], & pn_base , & pn_offset )) {
498
506
mp_uint_t rlo_base = get_arg_reg (emit , op_str , pn_base , 7 );
499
507
mp_uint_t i8 ;
@@ -632,7 +640,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
632
640
}
633
641
634
642
} else if (n_args == 2 ) {
635
- if (MP_PARSE_NODE_IS_ID (pn_args [1 ])) {
643
+ if (pt_is_any_id (pn_args [1 ])) {
636
644
// second arg is a register (or should be)
637
645
mp_uint_t op_code , op_code_hi ;
638
646
if (op == MP_QSTR_mov ) {
@@ -711,7 +719,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
711
719
asm_thumb_mov_reg_i16 (emit -> as , ASM_THUMB_OP_MOVT , reg_dest , (i_src >> 16 ) & 0xffff );
712
720
} else if (ARMV7M && op == MP_QSTR_ldrex ) {
713
721
mp_uint_t r_dest = get_arg_reg (emit , op_str , pn_args [0 ], 15 );
714
- mp_parse_node_t pn_base , pn_offset ;
722
+ const byte * pn_base , * pn_offset ;
715
723
if (get_arg_addr (emit , op_str , pn_args [1 ], & pn_base , & pn_offset )) {
716
724
mp_uint_t r_base = get_arg_reg (emit , op_str , pn_base , 15 );
717
725
mp_uint_t i8 = get_arg_i (emit , op_str , pn_offset , 0xff ) >> 2 ;
@@ -722,7 +730,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
722
730
for (mp_uint_t i = 0 ; i < MP_ARRAY_SIZE (format_9_10_op_table ); i ++ ) {
723
731
if (op == format_9_10_op_table [i ].name ) {
724
732
op_code = format_9_10_op_table [i ].op ;
725
- mp_parse_node_t pn_base , pn_offset ;
733
+ const byte * pn_base , * pn_offset ;
726
734
mp_uint_t rlo_dest = get_arg_reg (emit , op_str , pn_args [0 ], 7 );
727
735
if (get_arg_addr (emit , op_str , pn_args [1 ], & pn_base , & pn_offset )) {
728
736
mp_uint_t rlo_base = get_arg_reg (emit , op_str , pn_base , 7 );
@@ -767,7 +775,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
767
775
rlo_dest = get_arg_reg (emit , op_str , pn_args [0 ], 7 );
768
776
rlo_src = get_arg_reg (emit , op_str , pn_args [1 ], 7 );
769
777
int src_b ;
770
- if (MP_PARSE_NODE_IS_ID (pn_args [2 ])) {
778
+ if (pt_is_any_id (pn_args [2 ])) {
771
779
op_code |= ASM_THUMB_FORMAT_2_REG_OPERAND ;
772
780
src_b = get_arg_reg (emit , op_str , pn_args [2 ], 7 );
773
781
} else {
@@ -792,7 +800,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
792
800
} else if (ARMV7M && op == MP_QSTR_strex ) {
793
801
mp_uint_t r_dest = get_arg_reg (emit , op_str , pn_args [0 ], 15 );
794
802
mp_uint_t r_src = get_arg_reg (emit , op_str , pn_args [1 ], 15 );
795
- mp_parse_node_t pn_base , pn_offset ;
803
+ const byte * pn_base , * pn_offset ;
796
804
if (get_arg_addr (emit , op_str , pn_args [2 ], & pn_base , & pn_offset )) {
797
805
mp_uint_t r_base = get_arg_reg (emit , op_str , pn_base , 15 );
798
806
mp_uint_t i8 = get_arg_i (emit , op_str , pn_offset , 0xff ) >> 2 ;
0 commit comments