> On Oct 22, 2020, at 10:34 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>
> On Thu, Oct 22, 2020 at 4:47 PM Qing Zhao <qing.z...@oracle.com
> <mailto:qing.z...@oracle.com>> wrote:
>>
>> Hi, Uros,
>>
>>> On Oct 21, 2020, at 9:45 AM, Qing Zhao via Gcc-patches
>>> <gcc-patches@gcc.gnu.org> wrote:
>>>>>>
>>>>
>>>> Something like this:
>>>>
>>>> --cut here--
>>>> long double
>>>> __attribute__ ((noinline))
>>>> test (long double a, long double b)
>>>> {
>>>> long double r = a + b;
>>>>
>>>> asm volatile ("fldz; \
>>>> fldz; \
>>>> fldz; \
>>>> fldz; \
>>>> fldz; \
>>>> fldz; \
>>>> fldz; \
>>>> fstp %%st(0); \
>>>> fstp %%st(0); \
>>>> fstp %%st(0); \
>>>> fstp %%st(0); \
>>>> fstp %%st(0); \
>>>> fstp %%st(0); \
>>>> fstp %%st(0)" : : "X"(r));
>>>> return r;
>>>> }
>>>>
>>>> int
>>>> main ()
>>>> {
>>>> long double a = 1.1, b = 1.2;
>>>>
>>>> long double c = test (a, b);
>>>>
>>>> printf ("%Lf\n", c);
>>>>
>>>> return 0;
>>>> }
>>>> --cut here—
>>>
>>>
>>> Okay, so,
>>>
>>> 1. First compute how many st registers need to be zeroed, num_of_zeroed_st
>>> 2. Then issue (8 - num_of_zeroed_st) fldz to push 0 to the stack to clear
>>> all the dead stack slots;
>>> 3. Then issue (8 - num_of_zeroed_st) fstp %st(0) to pop the stack and empty
>>> the stack.
>>>
>>
>> How to generate such asm volatile insn at i386 backend? Is there any code in
>> i386 backend I can refer for this ?
>
> fldz is plain move of zero to XF register, fstp is generated from an
> XF move of FIRST_STACK_REG to itself with REG_DEAD note added:
>
> #(insn 366 128 129 9 (set (reg:XF 8 st)
> # (reg:XF 8 st)) "test.c":711:14 110 {*movxf_internal}
> # (expr_list:REG_DEAD (reg:XF 8 st)
> # (nil)))
What’s the reason to add the “REG_DEAD” note?
Qing
>
> Uros.