When storing structs with a memcpy call in vstore(), so far a needless entry remaining on the vstack sometimes resulted in an useless store generated by save_regs() in gfunc_call() for the memcpy routine.
Unified · Split
| @@ -2019,6 +2019,12 @@ void vstore(void) · 2018 unmodified lines | ||
| 2019 | 2019 | if (!nocode_wanted) { |
| 2020 | 2020 | size = type_size(&vtop->type, &align); |
| 2021 | 2021 | |
| 2022 | + /* destination */ | |
| 2023 | + vswap(); | |
| 2024 | + vtop->type.t = VT_PTR; | |
| 2025 | + gaddrof(); | |
| 2026 | + | |
| 2027 | + /* address of memcpy() */ | |
| 2022 | 2028 | #ifdef TCC_ARM_EABI |
| 2023 | 2029 | if(!(align & 7)) |
| 2024 | 2030 | vpush_global_sym(&func_old_type, TOK_memcpy8); |
| @@ -2028,10 +2034,7 @@ void vstore(void) · 3 unmodified lines | ||
| 2028 | 2034 | #endif |
| 2029 | 2035 | vpush_global_sym(&func_old_type, TOK_memcpy); |
| 2030 | 2036 | |
| 2031 | − /* destination */ | |
| 2032 | − vpushv(vtop - 2); | |
| 2033 | − vtop->type.t = VT_PTR; | |
| 2034 | − gaddrof(); | |
| 2037 | + vswap(); | |
| 2035 | 2038 | /* source */ |
| 2036 | 2039 | vpushv(vtop - 2); |
| 2037 | 2040 | vtop->type.t = VT_PTR; |
| @@ -2039,9 +2042,6 @@ void vstore(void) · 1 unmodified line | ||
| 2039 | 2042 | /* type size */ |
| 2040 | 2043 | vpushi(size); |
| 2041 | 2044 | gfunc_call(3); |
| 2042 | − | |
| 2043 | − vswap(); | |
| 2044 | − vpop(); | |
| 2045 | 2045 | } else { |
| 2046 | 2046 | vswap(); |
| 2047 | 2047 | vpop(); |