Qing Zhao <[email protected]> writes:
> Hi, Richard,
>
> To answer the question, which registers should be included in “ALL”.
> I studied X86 hard register set in more details. And also consulted with
> H.J.Lu, And found:
>
> In the current x86 implementation, mask registers, MM0-MM7 registers, and
> ST0-ST7 registers are not zeroed.
>
> The reasons actually are:
> 1. Mask registers are marked as “FIXED_REGS” by middle end, (in the
> following place, reginfo.c, init_reg_sets_1)
>
> /* If a register is too limited to be treated as a register operand,
> then it should never be allocated to a pseudo. */
> if (!TEST_HARD_REG_BIT (operand_reg_set, i))
> fixed_regs[i] = 1;
But isn't that only true when AVX512F is disabled?
The question is more why the registers shouldn't be zeroed when
they're available.
> 2. MM0-MM7 registers and ST0-ST7 registers are aliased with each other, (i.e,
> the same set of registers have two different
> Names), so, zero individual mm or st register will be very impractical.
> However, we can zero them together with emms.
Ah, OK.
> So, my conclusion is,
>
> 1. For “ALL”, we should include all call_used_regs that are not fixed_regs.
> 2. For X86 implementation, I added more comments, and also add clearing all
> mm and st registers with emms.
>
> In general, “ALL” should include all call_used_regs that are not fixed_regs.
Right. I thought the original implementation already excluded fixed
registers, but perhaps I'm misremembering. I agree that that's the
sensible default behaviour.
Going back to the default hook, I guess one option is:
rtx zero = CONST0_RTX (reg_raw_mode[regno]);
rtx_insn *insn = emit_insn (gen_rtx_SET (regno_reg_rtx[regno], zero));
if (!valid_insn_p (insn))
sorry (…);
but with some mechanism to avoid spewing the user with messages
for the same problem.
Thanks,
Richard