Hi Suwa-san, On Thu, Jan 5, 2023 at 3:57 AM Takayuki 'January June' Suwa <jjsuwa_sys3...@yahoo.co.jp> wrote: > > This patch introduces a convenient helper function for integer immediate > addition with scratch register as needed, that splits and emits either > up to two ADDI/ADDMI machine instructions or an addition by register > following an immediate integer load (which may later be transformed by > constantsynth). > > By using the helper function, it makes stack frame adjustment logic > simplified and instruction count less in some cases. > > gcc/ChangeLog: > > * config/xtensa/xtensa.cc > (xtensa_split_imm_two_addends, xtensa_emit_add_imm): > New helper functions. > (xtensa_emit_adjust_stack_ptr, xtensa_set_return_address, > xtensa_output_mi_thunk): Change to use the helper function. > --- > gcc/config/xtensa/xtensa.cc | 139 +++++++++++++++++++++++------------- > 1 file changed, 88 insertions(+), 51 deletions(-)
This change introduces a bunch of failures in the g++ testsuite, but the culprit is apparently somewhere in the libstdc++.so, I'm still looking for it. I see the following pattern change in the generated epilogue code: - 4aaf: b0a192 movi a9, 0x1b0 - 4ab2: 1f9a add.n a1, a15, a9 ... - 4abe: 20c112 addi a1, a1, 32 - 4ac1: f00d ret.n + 4aaf: 02df12 addmi a1, a15, 0x200 + 4ab2: b0c112 addi a1, a1, -80 ... + 4abf: 20c112 addi a1, a1, 32 + 4ac2: f00d ret.n I.e. a1 is first moved into the parent stack frame, then back to the right spot. This does not look correct, especially for bare-metal targets. -- Thanks. -- Max