@@ -420,16 +420,14 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
420
420
#define ASM_MOV_REG_REG (as , reg_dest , reg_src ) asm_arm_mov_reg_reg((as), (reg_dest), (reg_src))
421
421
#define ASM_MOV_LOCAL_ADDR_TO_REG (as , local_num , reg ) asm_arm_mov_reg_local_addr(as, (reg), (local_num))
422
422
423
- // TODO someone please implement lsl and asr
424
- #define ASM_LSL_REG_REG (as , reg_dest , reg_shift ) asm_arm_lsl_((as), (reg_dest), (reg_shift))
425
- #define ASM_ASR_REG_REG (as , reg_dest , reg_shift ) asm_arm_asr_((as), (reg_dest), (reg_shift))
423
+ #define ASM_LSL_REG_REG (as , reg_dest , reg_shift ) asm_arm_lsl_reg_reg((as), (reg_dest), (reg_shift))
424
+ #define ASM_ASR_REG_REG (as , reg_dest , reg_shift ) asm_arm_asr_reg_reg((as), (reg_dest), (reg_shift))
426
425
#define ASM_ADD_REG_REG (as , reg_dest , reg_src ) asm_arm_add_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))
427
426
#define ASM_SUB_REG_REG (as , reg_dest , reg_src ) asm_arm_sub_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))
428
427
429
- // TODO someone please implement str
430
- #define ASM_STORE_REG_REG (as , reg_src , reg_base ) asm_arm_str_reg_reg_i5((as), (reg_src), (reg_base), 0)
431
- #define ASM_STORE8_REG_REG (as , reg_src , reg_base ) asm_arm_strb_reg_reg_i5((as), (reg_src), (reg_base), 0)
432
- #define ASM_STORE16_REG_REG (as , reg_src , reg_base ) asm_arm_strh_reg_reg_i5((as), (reg_src), (reg_base), 0)
428
+ #define ASM_STORE_REG_REG (as , reg_value , reg_base ) asm_arm_str_reg_reg((as), (reg_value), (reg_base))
429
+ #define ASM_STORE8_REG_REG (as , reg_value , reg_base ) asm_arm_strb_reg_reg((as), (reg_value), (reg_base))
430
+ #define ASM_STORE16_REG_REG (as , reg_value , reg_base ) asm_arm_strh_reg_reg((as), (reg_value), (reg_base))
433
431
434
432
#else
435
433
@@ -1424,6 +1422,10 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
1424
1422
}
1425
1423
#endif
1426
1424
ASM_MOV_IMM_TO_REG (emit -> as , index_value , reg_index );
1425
+ #if N_ARM
1426
+ asm_arm_strb_reg_reg_reg (emit -> as , reg_value , reg_base , reg_index );
1427
+ return ;
1428
+ #endif
1427
1429
ASM_ADD_REG_REG (emit -> as , reg_index , reg_base ); // add index to base
1428
1430
reg_base = reg_index ;
1429
1431
}
@@ -1441,6 +1443,10 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
1441
1443
}
1442
1444
#endif
1443
1445
ASM_MOV_IMM_TO_REG (emit -> as , index_value << 1 , reg_index );
1446
+ #if N_ARM
1447
+ asm_arm_strh_reg_reg_reg (emit -> as , reg_value , reg_base , reg_index );
1448
+ return ;
1449
+ #endif
1444
1450
ASM_ADD_REG_REG (emit -> as , reg_index , reg_base ); // add 2*index to base
1445
1451
reg_base = reg_index ;
1446
1452
}
@@ -1468,13 +1474,21 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
1468
1474
// pointer to 8-bit memory
1469
1475
// TODO optimise to use thumb strb r1, [r2, r3]
1470
1476
assert (vtype_index == VTYPE_INT );
1477
+ #if N_ARM
1478
+ asm_arm_strb_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1479
+ break ;
1480
+ #endif
1471
1481
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1472
1482
ASM_STORE8_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+index)
1473
1483
break ;
1474
1484
}
1475
1485
case VTYPE_PTR16 : {
1476
1486
// pointer to 16-bit memory
1477
1487
assert (vtype_index == VTYPE_INT );
1488
+ #if N_ARM
1489
+ asm_arm_strh_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1490
+ break ;
1491
+ #endif
1478
1492
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1479
1493
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1480
1494
ASM_STORE16_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+2*index)
@@ -1808,9 +1822,16 @@ STATIC void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) {
1808
1822
asm_thumb_mov_rlo_i8 (emit -> as , REG_RET , ret [op - MP_BINARY_OP_LESS ]);
1809
1823
asm_thumb_mov_rlo_i8 (emit -> as , REG_RET , ret [op - MP_BINARY_OP_LESS ] ^ 1 );
1810
1824
#elif N_ARM
1811
- #error generic comparisons for ARM needs implementing
1812
- //asm_arm_less_op(emit->as, REG_RET, REG_ARG_2, reg_rhs);
1813
- //asm_arm_more_op(emit->as, REG_RET, REG_ARG_2, reg_rhs);
1825
+ asm_arm_cmp_reg_reg (emit -> as , REG_ARG_2 , reg_rhs );
1826
+ static uint ccs [6 ] = {
1827
+ ASM_ARM_CC_LT ,
1828
+ ASM_ARM_CC_GT ,
1829
+ ASM_ARM_CC_EQ ,
1830
+ ASM_ARM_CC_LE ,
1831
+ ASM_ARM_CC_GE ,
1832
+ ASM_ARM_CC_NE ,
1833
+ };
1834
+ asm_arm_setcc_reg (emit -> as , REG_RET , ccs [op - MP_BINARY_OP_LESS ]);
1814
1835
#else
1815
1836
#error not implemented
1816
1837
#endif
0 commit comments