On Sat, 2023-09-30 at 07:48 -0700, Alexei Starovoitov wrote: > On Fri, Sep 29, 2023 at 2:03 PM Dave Thaler > <dthaler=40microsoft.com@xxxxxxxxxxxxxx> wrote: > > > > Perhaps text like the proposed snippet quoted in the exchange above should be > > added around the new text that now appears in the doc, i.e. the ambiguous text > > is currently: > > > For signed operations (``BPF_SDIV`` and ``BPF_SMOD``), for ``BPF_ALU``, > > > 'imm' is interpreted as a 32-bit signed value. For ``BPF_ALU64``, 'imm' > > > is first :term:`sign extended<Sign Extend>` from 32 to 64 bits, and then > > > interpreted as a 64-bit signed value. > > That's what we have in the doc and it's a correct description. > Which part is ambiguous? > As far as I understand Dave suggests to add exact specification for the SMOD instruction as "signed modulo" might have different definitions [1]. I double checked and current clang implementation generates SMOD for LLVM's 'srem' operation [2], which follows C semantics and defines remainder as: remainder = a - n * trunc(divident / divisor) > This instruction returns the remainder of a division (where the > result is either zero or has the same sign as the dividend, op1) And this is consistent with interpreter logic in core.c, e.g.: ALU64_MOD_K: switch (OFF) { case 0: ... break; case 1: AX = div64_s64(DST, IMM); /* implemented as '/' */ DST = DST - AX * IMM; break; } CONT; [1] https://en.wikipedia.org/wiki/Modulo [2] https://llvm.org/docs/LangRef.html#srem-instruction