@@ -1638,59 +1638,36 @@ static void emit_native_load_subscr(emit_t *emit) {
16381638 switch (vtype_base ) {
16391639 case VTYPE_PTR8 : {
16401640 // pointer to 8-bit memory
1641- #if N_ARM
1642- asm_arm_ldrb_reg_reg_reg (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1643- break ;
1644- #elif N_THUMB
1645- asm_thumb_ldrb_rlo_rlo_rlo (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1646- break ;
1647- #endif
1648- // TODO optimise to use thumb ldrb r1, [r2, r3]
1641+ #ifdef ASM_LOAD8_REG_REG_REG
1642+ ASM_LOAD8_REG_REG_REG (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1643+ #else
16491644 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16501645 ASM_LOAD8_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // store value to (base+index)
1646+ #endif
16511647 break ;
16521648 }
16531649 case VTYPE_PTR16 : {
16541650 // pointer to 16-bit memory
1655- #if N_ARM
1656- asm_arm_ldrh_reg_reg_reg (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1657- break ;
1658- #elif N_THUMB
1659- asm_thumb_ldrh_reg_reg_reg (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1660- break ;
1661- #elif N_XTENSA || N_XTENSAWIN
1662- asm_xtensa_op_addx2 (emit -> as , REG_ARG_1 , reg_index , REG_ARG_1 );
1663- asm_xtensa_op_l16ui (emit -> as , REG_RET , REG_ARG_1 , 0 );
1664- break ;
1665- #endif
1651+ #ifdef ASM_LOAD16_REG_REG_REG
1652+ ASM_LOAD16_REG_REG_REG (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1653+ #else
16661654 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16671655 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16681656 ASM_LOAD16_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // load from (base+2*index)
1657+ #endif
16691658 break ;
16701659 }
16711660 case VTYPE_PTR32 : {
16721661 // pointer to word-size memory
1673- #if N_ARM
1674- asm_arm_ldr_reg_reg_reg (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1675- break ;
1676- #elif N_THUMB
1677- asm_thumb_ldr_reg_reg_reg (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1678- break ;
1679- #elif N_RV32
1680- asm_rv32_opcode_slli (emit -> as , REG_TEMP2 , reg_index , 2 );
1681- asm_rv32_opcode_cadd (emit -> as , REG_ARG_1 , REG_TEMP2 );
1682- asm_rv32_opcode_lw (emit -> as , REG_RET , REG_ARG_1 , 0 );
1683- break ;
1684- #elif N_XTENSA || N_XTENSAWIN
1685- asm_xtensa_op_addx4 (emit -> as , REG_ARG_1 , reg_index , REG_ARG_1 );
1686- asm_xtensa_op_l32i_n (emit -> as , REG_RET , REG_ARG_1 , 0 );
1687- break ;
1688- #endif
1662+ #ifdef ASM_LOAD32_REG_REG_REG
1663+ ASM_LOAD32_REG_REG_REG (emit -> as , REG_RET , REG_ARG_1 , reg_index );
1664+ #else
16891665 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16901666 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16911667 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16921668 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
16931669 ASM_LOAD32_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // load from (base+4*index)
1670+ #endif
16941671 break ;
16951672 }
16961673 default :
@@ -1949,59 +1926,36 @@ static void emit_native_store_subscr(emit_t *emit) {
19491926 switch (vtype_base ) {
19501927 case VTYPE_PTR8 : {
19511928 // pointer to 8-bit memory
1952- // TODO optimise to use thumb strb r1, [r2, r3]
1953- #if N_ARM
1954- asm_arm_strb_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1955- break ;
1956- #elif N_THUMB
1957- asm_thumb_strb_rlo_rlo_rlo (emit -> as , reg_value , REG_ARG_1 , reg_index );
1958- break ;
1959- #endif
1929+ #ifdef ASM_STORE8_REG_REG_REG
1930+ ASM_STORE8_REG_REG_REG (emit -> as , reg_value , REG_ARG_1 , reg_index );
1931+ #else
19601932 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
19611933 ASM_STORE8_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+index)
1934+ #endif
19621935 break ;
19631936 }
19641937 case VTYPE_PTR16 : {
19651938 // pointer to 16-bit memory
1966- #if N_ARM
1967- asm_arm_strh_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1968- break ;
1969- #elif N_THUMB
1970- asm_thumb_strh_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1971- break ;
1972- #elif N_XTENSA || N_XTENSAWIN
1973- asm_xtensa_op_addx2 (emit -> as , REG_ARG_1 , reg_index , REG_ARG_1 );
1974- asm_xtensa_op_s16i (emit -> as , reg_value , REG_ARG_1 , 0 );
1975- break ;
1976- #endif
1939+ #ifdef ASM_STORE16_REG_REG_REG
1940+ ASM_STORE16_REG_REG_REG (emit -> as , reg_value , REG_ARG_1 , reg_index );
1941+ #else
19771942 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
19781943 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
19791944 ASM_STORE16_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+2*index)
1945+ #endif
19801946 break ;
19811947 }
19821948 case VTYPE_PTR32 : {
19831949 // pointer to 32-bit memory
1984- #if N_ARM
1985- asm_arm_str_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1986- break ;
1987- #elif N_THUMB
1988- asm_thumb_str_reg_reg_reg (emit -> as , reg_value , REG_ARG_1 , reg_index );
1989- break ;
1990- #elif N_RV32
1991- asm_rv32_opcode_slli (emit -> as , REG_TEMP2 , reg_index , 2 );
1992- asm_rv32_opcode_cadd (emit -> as , REG_ARG_1 , REG_TEMP2 );
1993- asm_rv32_opcode_sw (emit -> as , reg_value , REG_ARG_1 , 0 );
1994- break ;
1995- #elif N_XTENSA || N_XTENSAWIN
1996- asm_xtensa_op_addx4 (emit -> as , REG_ARG_1 , reg_index , REG_ARG_1 );
1997- asm_xtensa_op_s32i_n (emit -> as , reg_value , REG_ARG_1 , 0 );
1998- break ;
1999- #endif
1950+ #ifdef ASM_STORE32_REG_REG_REG
1951+ ASM_STORE32_REG_REG_REG (emit -> as , reg_value , REG_ARG_1 , reg_index );
1952+ #else
20001953 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
20011954 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
20021955 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
20031956 ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
20041957 ASM_STORE32_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+4*index)
1958+ #endif
20051959 break ;
20061960 }
20071961 default :
0 commit comments