On Mon, 24 Feb 2020 15:03:21 +0300 (MSK) Alexander Monakov <amona...@ispras.ru> wrote:
> On Mon, 24 Feb 2020, Andreas Schwab wrote: > > > On Feb 24 2020, Petr Tesarik wrote: > > > > > On Mon, 24 Feb 2020 12:29:40 +0100 > > > Andreas Schwab <sch...@suse.de> wrote: > > > > > >> On Feb 24 2020, Petr Tesarik wrote: > > >> > > >> > This works great ... until there's some inline asm() > > >> > statement, for which gcc cannot keep track of the length > > >> > attribute, so it is probably taken as zero. > > >> > > >> GCC computes it by counting the number of asm insns. You can use > > >> ADJUST_INSN_LENGTH to adjust this as needed. > > > > > > Hmm, that's interesting, but does it work for inline asm() > > > statements? > > > > Yes, for a suitable definition of work. > > > > > The argument is essentially a free-form string (with some > > > substitution), and the compiler cannot know how many bytes they > > > occupy. > > > > That's why ADJUST_INSN_LENGTH can adjust it. > > I think Petr might be unaware of the fact that GCC counts the > **number of instructions in an inline asm statement** by counting > separators in the asm string. This may overcount when a separator > appears in a string literal for example, but triggering > under-counting is trickier. > > Petr, please see > https://gcc.gnu.org/onlinedocs/gcc/Size-of-an-asm.html for some more > discussion. VC4 instructions vary between 16 & 80 bits in length -- I guess you need to arrange things so that the maximum is used for inline asms (per instruction, counting by separators). That's not 100% ideal since most instructions will be much shorter, but at least it should give working code. Julian