Qing Zhao <qing.z...@oracle.com> 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

Reply via email to