On Sun, Mar 9, 2025 at 11:34 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > While working on a local x86 patch, which passed the GCC testsuite, I got > a compiler error: > > In function ‘paravirt_read_msr’, > inlined from ‘perf_ibs_handle_irq’ at arch/x86/events/amd/ibs.c:1055:2: > ./arch/x86/include/asm/paravirt_types.h:397:17: error: ‘asm’ operand has > impossible constraints or there are not enough registers > 397 | asm volatile(ALTERNATIVE(PARAVIRT_CALL, > ALT_CALL_INSTR, \ > | ^~~ > > when building x86-64 Linux kernel. RDI, RSI, RDX and RCX registers are > used to pass arguments in 64-bit mode. EAX, EDX and ECX registers are > used to pass arguments in 32-bit mode. But there is no coverage in the > GCC testsuite. Add tests to verify that argument registers are spilled > properly. > > PR target/119171 > * gcc.target/i386/pr119171-1.c: New test. > * gcc.target/i386/pr119171-2.c: Likewise.
OK. Thanks, Uros. > > Signed-off-by: H.J. Lu <hjl.to...@gmail.com> > --- > gcc/testsuite/gcc.target/i386/pr119171-1.c | 14 ++++++++++++++ > gcc/testsuite/gcc.target/i386/pr119171-2.c | 13 +++++++++++++ > 2 files changed, 27 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/i386/pr119171-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/pr119171-2.c > > diff --git a/gcc/testsuite/gcc.target/i386/pr119171-1.c > b/gcc/testsuite/gcc.target/i386/pr119171-1.c > new file mode 100644 > index 00000000000..a017e6e215f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr119171-1.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile { target { ! ia32 } } } */ > +/* { dg-options "-O2" } */ > + > +extern long a1, a2, a3, a4; > +extern void foo (void *, void *, void *, void *); > +void > +bar (void *rdi, void *rsi, void *rdx, void *rcx) > +{ > + asm ("" : "=D"(a1) : "D"(0)); > + asm ("" : "=S"(a2) : "S"(0)); > + asm ("" : "=d"(a3) : "d"(0)); > + asm ("" : "=c"(a4) : "c"(0)); > + foo (rdi, rsi, rdx, rcx); > +} > diff --git a/gcc/testsuite/gcc.target/i386/pr119171-2.c > b/gcc/testsuite/gcc.target/i386/pr119171-2.c > new file mode 100644 > index 00000000000..5c209f9aed0 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr119171-2.c > @@ -0,0 +1,13 @@ > +/* { dg-do compile { target ia32 } } */ > +/* { dg-options "-O2 -mregparm=3" } */ > + > +extern long a1, a2, a3; > +extern void foo (void *, void *, void *); > +void > +bar (void *eax, void *edx, void *ecx) > +{ > + asm ("" : "=a"(a1) : "a"(0)); > + asm ("" : "=d"(a2) : "d"(0)); > + asm ("" : "=c"(a3) : "c"(0)); > + foo (eax, edx, ecx); > +} > -- > 2.48.1 >