On 6/4/25 15:06, Jeff Law wrote:
>> static int
>> get_frm ()
>> {
>> int frm = -1;
>> __asm__ volatile ( "frrm %0" :"=r"(frm) : :);
>> return frm;
>> }
>>
>> int
>> test_float_point_frm_static (float *out, vfloat32m1_t op1, vfloat32m1_t
>> op2,
>> size_t vl)
>> {
>> vfloat32m1_t result = __riscv_vfadd_vv_f32m1_rm (op1, op2, 2, vl);
>> *(vfloat32m1_t *)out = result;
>> return get_frm();
>> }
>>
>>
>> This generates
>>
>> frrm a5
>> fsrmi 2
>> vsetvli zero,a1,e32,m1,ta,ma
>> vfadd.vv v8,v8,v9
>> fsrm a5 <-- restore already happened
>> vs1r.v v8,0(a0)
>> frrm a0 <-- this is the read
> So I must be misunderstanding something.
>
> What precisely do you need to observe and where?
So there is "global" FRM state (fesetround style) which needs to prevail -
before function entry and after return, thus "local" updates (intrinsics)
require the save/restore.
The tests create various scenarios of combinations of two. They ensure that when
a RM mode is set locally, it is actually emitted (by reading it back) and after
return verify that orig global mode is also reinstated.
Above we can't observe/verify the local RM was set correctly.
> And what precisely
> triggered the restore? The asm itself?
The intrinsic, whose static RM needs to be undone to restore the prior global
RM.
> I wouldn't want testsuite observability to get in the way of cleaning
> this mess up.
Right that's the goal, but as I said the new implementation is pretty clean now.
Thx,
-Vineet