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)