On Mon, Mar 3, 2025 at 3:40 PM Vineet Gupta <vine...@rivosinc.com> wrote: > > On 3/3/25 15:18, Andrew Waterman wrote: > >> So in some convoluted way both the above scenarios have callee-saved > >> semantics > >> for FRM, except for the leaf function which unconditionally sets FRM where > >> this > >> save/restore is not done. > > I don't follow the last part about leaf functions. Unless the leaf > > function intends to change FRM globally (e.g. the leaf function in > > question is fesetround), then, if it changes FRM, it must restore FRM > > before returning. > > Yeah I didn't know how to articulate it (and perhaps this still requires > clarification) > > Say we have following > > // reduced version of gcc.target/riscv/rvv/base/float-point-frm-run-1.c > main > set_frm (4); // orig global FRM update > > test_float_point_frm_run_1 (op1, op2, vl) > set_frm (0); > result = __riscv_vfadd_vv_f32m1_rm (op1, result, 1, vl); > assert_equal (1, get_frm ()) > // restore global 4 before returning > > assert_equal (4, get_frm () <-- here call restores global > > vs. > > // reduced version of gcc.target/riscv/rvv/base/float-point-frm-run-5.c > main > set_frm (1); // orig global FRM update > > test_float_point_frm_run_1 (op1, op2, vl) > other_function() > set_frm (2); // also global update > > assert_equal (2, get_frm () <-- here call doesn't restore > > There's no explicit annotation or anything about the FRM, yet in 2nd example > other_function () we consider frm write a global event but not in > test_float_point_frm_run_1 () in 1st example: I'm missing words how to explain > that :-)
Looks like the assumption is that set_frm is locally scoped, as opposed to e.g. fesetround, which is global. This doesn't imply that leaf functions are treated differently than non-leaf ones (which is good, because they shouldn't be). > > Thx, > -Vineet