On Thu, Oct 03, 2019 at 10:35:15AM +0100, Richard Earnshaw (lists) wrote: > On 03/10/2019 00:01, Segher Boessenkool wrote: > >The documentation says > > > >@findex ALL_REGS > >@findex NO_REGS > >In general, each register will belong to several classes. In fact, one > >class must be named @code{ALL_REGS} and contain all the registers. Another > >class must be named @code{NO_REGS} and contain no registers. Often the > >union of two classes will be another class; however, this is not required. > > > >so is the arm port wrong, or is the documentation wrong? I think the arm > >port simply forgets to include CC_REG, VFPCC_REG, SFP_REG, AFP_REG: > > > >#define REG_CLASS_CONTENTS \ > >... > > { 0x00000000, 0x00000000, 0x00000000, 0x00000010 }, /* CC_REG */ \ > > { 0x00000000, 0x00000000, 0x00000000, 0x00000020 }, /* VFPCC_REG */ \ > > { 0x00000000, 0x00000000, 0x00000000, 0x00000040 }, /* SFP_REG */ \ > > { 0x00000000, 0x00000000, 0x00000000, 0x00000080 }, /* AFP_REG */ \ > > { 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F } /* ALL_REGS */ \ > > > >and that last number should be 0x000000ff instead? > > Well CC_REG is completely fixed and can't be used for anything other > than condition flags. The register allocator should never be > considering it for allocation. So at that level, it really shouldn't > matter and adding it would just make more useless work for the register > allocator. > > The omission of SFP_REG and AFP_REG is probably also deliberate. These > are essentially special pseudo regs that MUST be eliminated during frame > layout. They should certainly never be considered for general allocation.
But ALL_REGS should contain *all* registers. The union of any two register classes has to be contained in some register class, so every register class has to be contained in ALL_REGS. Segher