[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220324073039.140946-5-ammarfaizi2@gnuweeb.org>
Date: Thu, 24 Mar 2022 14:30:32 +0700
From: Ammar Faizi <ammarfaizi2@...weeb.org>
To: Willy Tarreau <w@....eu>
Cc: "Paul E. McKenney" <paulmck@...nel.org>,
Alviro Iskandar Setiawan <alviro.iskandar@...weeb.org>,
Nugraha <richiisei@...il.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
GNU/Weeb Mailing List <gwml@...r.gnuweeb.org>,
Ammar Faizi <ammarfaizi2@...weeb.org>,
David Laight <David.Laight@...LAB.COM>
Subject: [PATCH v1 04/11] tools/nolibc: x86-64: Use appropriate register constraints if exist
Use appropriate register constraints if exist. Don't use register
variables for all inputs.
Register variables with "r" constraint should be used when we need to
pass data through a specific register to extended inline assembly that
doesn't have a specific register constraint associated with it (anything
outside %rax, %rbx, %rcx, %rdx, %rsi, %rdi).
It also simplifies the macro definition.
Link: https://lore.kernel.org/lkml/3d2cfdeecddc45dc8e4beada305b5948@AcuMS.aculab.com
Suggested-by: David Laight <David.Laight@...LAB.COM>
Signed-off-by: Ammar Faizi <ammarfaizi2@...weeb.org>
---
tools/include/nolibc/arch-x86_64.h | 202 +++++++++++++----------------
1 file changed, 91 insertions(+), 111 deletions(-)
diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch-x86_64.h
index afc50f84a036..3067f553c03c 100644
--- a/tools/include/nolibc/arch-x86_64.h
+++ b/tools/include/nolibc/arch-x86_64.h
@@ -65,129 +65,109 @@ struct sys_stat_struct {
*
*/
-#define my_syscall0(num) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall0(num) \
+({ \
+ long _ret = (num); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall1(num, arg1) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), \
- "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall1(num, arg1) \
+({ \
+ long _ret = (num); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1) /* %rdi */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall2(num, arg1, arg2) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- register long _arg2 __asm__("rsi") = (long)(arg2); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), "r"(_arg2), \
- "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall2(num, arg1, arg2) \
+({ \
+ long _ret = (num); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1), /* %rdi */ \
+ "S"(arg2) /* %rsi */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall3(num, arg1, arg2, arg3) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- register long _arg2 __asm__("rsi") = (long)(arg2); \
- register long _arg3 __asm__("rdx") = (long)(arg3); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), "r"(_arg2), "r"(_arg3), \
- "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall3(num, arg1, arg2, arg3) \
+({ \
+ long _ret = (num); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1), /* %rdi */ \
+ "S"(arg2), /* %rsi */ \
+ "d"(arg3) /* %rdx */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall4(num, arg1, arg2, arg3, arg4) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- register long _arg2 __asm__("rsi") = (long)(arg2); \
- register long _arg3 __asm__("rdx") = (long)(arg3); \
- register long _arg4 __asm__("r10") = (long)(arg4); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \
- "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall4(num, arg1, arg2, arg3, arg4) \
+({ \
+ long _ret = (num); \
+ register long _arg4 __asm__("r10") = (long)(arg4); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1), /* %rdi */ \
+ "S"(arg2), /* %rsi */ \
+ "d"(arg3), /* %rdx */ \
+ "r"(_arg4) /* %r10 */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- register long _arg2 __asm__("rsi") = (long)(arg2); \
- register long _arg3 __asm__("rdx") = (long)(arg3); \
- register long _arg4 __asm__("r10") = (long)(arg4); \
- register long _arg5 __asm__("r8") = (long)(arg5); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \
- "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \
+({ \
+ long _ret = (num); \
+ register long _arg4 __asm__("r10") = (long)(arg4); \
+ register long _arg5 __asm__("r8") = (long)(arg5); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1), /* %rdi */ \
+ "S"(arg2), /* %rsi */ \
+ "d"(arg3), /* %rdx */ \
+ "r"(_arg4), /* %r10 */ \
+ "r"(_arg5) /* %r8 */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
-#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \
-({ \
- long _ret; \
- register long _num __asm__("rax") = (num); \
- register long _arg1 __asm__("rdi") = (long)(arg1); \
- register long _arg2 __asm__("rsi") = (long)(arg2); \
- register long _arg3 __asm__("rdx") = (long)(arg3); \
- register long _arg4 __asm__("r10") = (long)(arg4); \
- register long _arg5 __asm__("r8") = (long)(arg5); \
- register long _arg6 __asm__("r9") = (long)(arg6); \
- \
- __asm__ volatile ( \
- "syscall\n" \
- : "=a"(_ret) \
- : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \
- "r"(_arg6), "0"(_num) \
- : "rcx", "r11", "memory", "cc" \
- ); \
- _ret; \
+#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \
+({ \
+ long _ret = (num); \
+ register long _arg4 __asm__("r10") = (long)(arg4); \
+ register long _arg5 __asm__("r8") = (long)(arg5); \
+ register long _arg6 __asm__("r9") = (long)(arg6); \
+ __asm__ volatile ( \
+ "syscall\n" \
+ : "+a"(_ret) /* %rax */ \
+ : "D"(arg1), /* %rdi */ \
+ "S"(arg2), /* %rsi */ \
+ "d"(arg3), /* %rdx */ \
+ "r"(_arg4), /* %r10 */ \
+ "r"(_arg5), /* %r8 */ \
+ "r"(_arg6) /* %r9 */ \
+ : "rcx", "r11", "memory", "cc" \
+ ); \
+ _ret; \
})
/* startup code */
--
Ammar Faizi
Powered by blists - more mailing lists