@@ -1638,59 +1638,36 @@ static void emit_native_load_subscr(emit_t *emit) {
1638
1638
switch (vtype_base ) {
1639
1639
case VTYPE_PTR8 : {
1640
1640
// 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
1649
1644
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1650
1645
ASM_LOAD8_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // store value to (base+index)
1646
+ #endif
1651
1647
break ;
1652
1648
}
1653
1649
case VTYPE_PTR16 : {
1654
1650
// 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
1666
1654
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1667
1655
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1668
1656
ASM_LOAD16_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // load from (base+2*index)
1657
+ #endif
1669
1658
break ;
1670
1659
}
1671
1660
case VTYPE_PTR32 : {
1672
1661
// 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
1689
1665
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1690
1666
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1691
1667
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1692
1668
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1693
1669
ASM_LOAD32_REG_REG (emit -> as , REG_RET , REG_ARG_1 ); // load from (base+4*index)
1670
+ #endif
1694
1671
break ;
1695
1672
}
1696
1673
default :
@@ -1949,59 +1926,36 @@ static void emit_native_store_subscr(emit_t *emit) {
1949
1926
switch (vtype_base ) {
1950
1927
case VTYPE_PTR8 : {
1951
1928
// 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
1960
1932
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1961
1933
ASM_STORE8_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+index)
1934
+ #endif
1962
1935
break ;
1963
1936
}
1964
1937
case VTYPE_PTR16 : {
1965
1938
// 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
1977
1942
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1978
1943
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
1979
1944
ASM_STORE16_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // store value to (base+2*index)
1945
+ #endif
1980
1946
break ;
1981
1947
}
1982
1948
case VTYPE_PTR32 : {
1983
1949
// 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
2000
1953
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
2001
1954
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
2002
1955
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
2003
1956
ASM_ADD_REG_REG (emit -> as , REG_ARG_1 , reg_index ); // add index to base
2004
1957
ASM_STORE32_REG_REG (emit -> as , reg_value , REG_ARG_1 ); // s
4D62
tore value to (base+4*index)
1958
+ #endif
2005
1959
break ;
2006
1960
}
2007
1961
default :
0 commit comments