Jeff Law <[email protected]> writes:
> On 2/11/25 9:08 AM, Richard Sandiford wrote:
>> Jeff Law <[email protected]> writes:
>>> On 2/7/25 5:59 AM, Andrew Waterman wrote:
>>>> This patch runs counter to the ABI spec, which states that vxrm is not
>>>> preserved across calls and is volatile upon function entry [1]. vxrm
>>>> does not play the same role as frm plays in the calling convention.
>>>> (I won't get into the rationale in this email, but the rationale isn't
>>>> especially important: we should follow the ABI.)
>>>>
>>>> [1]
>>>> https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/3a79e936eec5491078b1133ac943f91ef5fd75fd/riscv-cc.adoc?plain=1#L119-L120
>>> Pan's patch doesn't change the basic property that VXRM has no known
>>> state at function entry or upon return from a function call.
>>
>> I think it will. global_regs[X] means that X is defined on entry,
>> defined on exit, and can be changed by calls. If the register is
>> call-clobbered/volatile/caller-saved, then I agree with Andrew that
>> this doesn't look like the right fix.
> But the LCM code we use to manage vxrm assignments makes no assumption
> about incoming state and assumes no state is preserved across calls.
In that case, I wonder what the patch is fixing. Like you say,
the initial mode seems to be VXRM_MODE_NONE, and it looks like
riscv_vxrm_mode_after correctly models calls as clobbering the mode.
In the FRM case, the problem was that we had:
entry:
call initialize
X := FRM
...
FRM := X
Since FRM was not previously defined on entry, and since the call in any
case was assumed to clobber FRM, the X := FRM seemed to be reading an
uninitialised value, and so the FRM := X could be folded away.
But from your description, and from an admittedly cursory look at
the code, it sounds like that couldn't happen for VXRM.
Richard