@@ -420,16 +420,14 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
420420#define ASM_MOV_REG_REG (as , reg_dest , reg_src ) asm_arm_mov_reg_reg((as), (reg_dest), (reg_src))
421421#define ASM_MOV_LOCAL_ADDR_TO_REG (as , local_num , reg ) asm_arm_mov_reg_local_addr(as, (reg), (local_num))
422422
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))
426425#define ASM_ADD_REG_REG (as , reg_dest , reg_src ) asm_arm_add_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))
427426#define ASM_SUB_REG_REG (as , reg_dest , reg_src ) asm_arm_sub_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))
428427
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))
433431
434432#else
435433
@@ -1424,6 +1422,10 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
14241422 }
14251423 #endif
14261424 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
14271429 ASM_ADD_REG_REG (emit -> as , reg_index , reg_base ); // add index to base
14281430 reg_base = reg_index ;
14291431 }
@@ -1441,6 +1443,10 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
14411443 }
14421444 #endif
14431445 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
14441450 ASM_ADD_REG_REG (emit -> as , reg_index , reg_base ); // add 2*index to base
14451451 reg_base = reg_index ;
14461452 }
@@ -1468,13 +1474,21 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
14681474 // pointer to 8-bit memory
14691475 // TODO optimise to use thumb strb r1, [r2, r3]
14701476 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
14711481 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
14721482 ASM_STORE8_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+index)
14731483 break ;
14741484 }
14751485 case VTYPE_PTR16 : {
14761486 // pointer to 16-bit memory
14771487 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
14781492 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
14791493 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
14801494 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) {
18081822 asm_thumb_mov_rlo_i8 (emit -> as , REG_RET , ret [op - MP_BINARY_OP_LESS ]);
18091823 asm_thumb_mov_rlo_i8 (emit -> as , REG_RET , ret [op - MP_BINARY_OP_LESS ] ^ 1 );
18101824 #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 ]);
18141835 #else
18151836 #error not implemented
18161837 #endif
0 commit comments