On Tue, Feb 9, 2010 at 5:02 PM, Richard Sandiford <rdsandif...@googlemail.com> wrote: > Daniel Jacobowitz <d...@codesourcery.com> writes: >> On Wed, Feb 03, 2010 at 06:23:19AM -0800, Ian Lance Taylor wrote: >>> fanqifei <fanqi...@gmail.com> writes: >>> >>> > According to the internal manual, insn length attribute can be used to >>> > to calculate the length of emitted code chunks when verifying branch >>> > distances. Can it be used in code size optimization? >>> >>> I suppose it could, but it isn't. Instead of asking the backend for >>> the length of instructions, the compiler asks the backend for the cost >>> of instructions. The backend is free to determine that cost however >>> it likes. When using -Os, using the size of the instruction is a good >>> measure of cost. >> >> It seems to me that there's a hard ordering problem here: we can't >> determine insn lengths, using the current framework, until very late. >> We need at least (A) whole instructions, not just RTL expressions; (B) >> register allocation to select alternatives; (C) branch shortening to >> determine branch alternatives. >> >> I'm curious if anyone thinks there's a generic solution to this (that >> doesn't involve a complete instruction selection rewrite :-). > > Yeah, it's something I've often wanted too, since at the moment you end > up duplicating a lot of the instruction selection in C code. E.g. the > MIPS port has stuff like: > > [ snip ] > > Ugh! > > But I could never see a cure that was better than the disease without > (as you say) a rewrite. I think (A) is the main problem: we already > have code to estimate constraints selection before reload, so we could > at least guess at (B) and (C). (Which is what the costs have to do > anyway really.) > > Richard
GAS knows this information for each insn. Perhaps binutils should export a library with a facility to encode a single insn in a buffer? That seems imprudent, making GCC dependent on binutils. Maybe the encoding/decoding tables should be broken out into a separate project? But you still need the chunk of logic (md_assemble, in the i386 code) to render the instruction to get the insn lengths. -- Quentin