https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90181

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Actually it is not as bad if you use preprocessor tricks.

Like this code from glibc for aarch64:

# undef INTERNAL_SYSCALL_RAW
# define INTERNAL_SYSCALL_RAW(name, err, nr, args...)           \
  ({ long _sys_result;                                          \
     {                                                          \
       LOAD_ARGS_##nr (args)                                    \
       register long _x8 asm ("x8") = (name);                   \
       asm volatile ("svc       0       // syscall " # name     \
                     : "=r" (_x0) : "r"(_x8) ASM_ARGS_##nr : "memory"); \
       _sys_result = _x0;                                       \
     }                                                          \
     _sys_result; })

# define LOAD_ARGS_0()                          \
  register long _x0 asm ("x0");
# define LOAD_ARGS_1(x0)                        \
  long _x0tmp = (long) (x0);                    \
  LOAD_ARGS_0 ()                                \
  _x0 = _x0tmp;
# define LOAD_ARGS_2(x0, x1)                    \
  long _x1tmp = (long) (x1);                    \
  LOAD_ARGS_1 (x0)                              \
  register long _x1 asm ("x1") = _x1tmp;
# define LOAD_ARGS_3(x0, x1, x2)                \
  long _x2tmp = (long) (x2);                    \
  LOAD_ARGS_2 (x0, x1)                          \
  register long _x2 asm ("x2") = _x2tmp;
# define LOAD_ARGS_4(x0, x1, x2, x3)            \
  long _x3tmp = (long) (x3);                    \
  LOAD_ARGS_3 (x0, x1, x2)                      \
  register long _x3 asm ("x3") = _x3tmp;
# define LOAD_ARGS_5(x0, x1, x2, x3, x4)        \
  long _x4tmp = (long) (x4);                    \
  LOAD_ARGS_4 (x0, x1, x2, x3)                  \
  register long _x4 asm ("x4") = _x4tmp;
# define LOAD_ARGS_6(x0, x1, x2, x3, x4, x5)    \
  long _x5tmp = (long) (x5);                    \
  LOAD_ARGS_5 (x0, x1, x2, x3, x4)              \
  register long _x5 asm ("x5") = _x5tmp;
# define LOAD_ARGS_7(x0, x1, x2, x3, x4, x5, x6)\
  long _x6tmp = (long) (x6);                    \
  LOAD_ARGS_6 (x0, x1, x2, x3, x4, x5)          \
  register long _x6 asm ("x6") = _x6tmp;

# define ASM_ARGS_0
# define ASM_ARGS_1     , "r" (_x0)
# define ASM_ARGS_2     ASM_ARGS_1, "r" (_x1)
# define ASM_ARGS_3     ASM_ARGS_2, "r" (_x2)
# define ASM_ARGS_4     ASM_ARGS_3, "r" (_x3)
# define ASM_ARGS_5     ASM_ARGS_4, "r" (_x4)
# define ASM_ARGS_6     ASM_ARGS_5, "r" (_x5)
# define ASM_ARGS_7     ASM_ARGS_6, "r" (_x6)

Reply via email to