Hi Linus, On Sun, Jan 5, 2025 at 10:51 PM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > On Fri, 3 Jan 2025 at 01:22, Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote: > > Perhaps this is an issue with sparse? > > No, this is just m68k doing disgusting things that happen to work with > gcc, because gcc considers casts to be lvalues (which in turn is comes > from some horrid C++ thing, since in C++ casting is a whole magical > extra complexity). > > IOW, this m68k pattern is horrendous, and sparse quite reasonably > complains about it: > > #define umul_ppmm(w1, w0, u, v) \ > __asm__ ("mulu%.l %3,%1:%0" \ > : "=d" ((USItype)(w0)), \ > "=d" ((USItype)(w1)) \ > : "%0" ((USItype)(u)), \ > "dmi" ((USItype)(v))) > > notice how it has two register outputs (the "=d"), and the destination > of said output is not a proper lvalue, but a cast expression. > > I think you could just remove the cast. Afaik the w0/w1 arguments come from > > #define __umulsidi3(u, v) \ > ({DIunion __w; \ > umul_ppmm (__w.s.high, __w.s.low, u, v); \ > __w.ll; }) > > and __w.s.high and __w.s.low are from struct DIstruct, which uses > "SItype". So all the cast does is to change the signedness of the > variable, but that has no *meaning* when you assign to it and the > sizes match. > > Alternatively, you could just use the right types explicitly and write > the umul_ppmm() macro something like > > #define umul_ppmm(w1, w0, u, v) do { \ > USItype __w0, __w1; \ > __asm__ ("mulu%.l %3,%1:%0" \ > : "=d" (__w0) \ > "=d" (__w1) \ > : "%0" ((USItype)(u)), \ > "dmi" ((USItype)(v))); \ > w0 = __w0; w1 = __w1; } while (0) > > NOTE! UNTESTED! Treat the above as a "something like this, perhaps". Thank you, using intermediate variables instead of casts for the output operands gets rid of the lvalue-related sparse warnings. That leaves us with the "not addressable" sparse error. Apparently that goes away by dropping the cast on the last input operand, so I will introduce intermediate variables for all input operands, too. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds