bug-mes
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/2] riscv64: simplify assembly constructs not supported by tcc.


From: andrius
Subject: [PATCH 1/2] riscv64: simplify assembly constructs not supported by tcc.
Date: Fri, 6 Oct 2023 22:51:12 +0100

From: Andrius Štikonas <andrius@stikonas.eu>

At the moment tcc does not support assembler instructions
with C expression operands. As a workaround read values
directly from stack.

* lib/linux/riscv64-mes-tcc/_exit.c
* lib/linux/riscv64-mes-tcc/_write.c
* lib/linux/riscv64-mes-tcc/syscall.c
---
 lib/linux/riscv64-mes-tcc/_exit.c   |  6 +--
 lib/linux/riscv64-mes-tcc/_write.c  | 11 ++---
 lib/linux/riscv64-mes-tcc/syscall.c | 63 ++++++++++-------------------
 3 files changed, 28 insertions(+), 52 deletions(-)

diff --git a/lib/linux/riscv64-mes-tcc/_exit.c 
b/lib/linux/riscv64-mes-tcc/_exit.c
index 21c697f8..bad49694 100644
--- a/lib/linux/riscv64-mes-tcc/_exit.c
+++ b/lib/linux/riscv64-mes-tcc/_exit.c
@@ -28,12 +28,10 @@
 void
 _exit (int code)
 {
-  register long __a7 asm ("a7") = SYS_exit;
-  register long __a0 asm ("a0") = code;
   asm volatile (
+       "addi a7, zero, 93\n\t"
+       "ld a0, s0, -24\n\t"
        "ecall\n\t"
-       : // no outputs
-       : "r" (__a0), "r" (__a7)
        );
   // not reached
   _exit (0);
diff --git a/lib/linux/riscv64-mes-tcc/_write.c 
b/lib/linux/riscv64-mes-tcc/_write.c
index 7fed0915..07d9ded3 100644
--- a/lib/linux/riscv64-mes-tcc/_write.c
+++ b/lib/linux/riscv64-mes-tcc/_write.c
@@ -28,14 +28,11 @@
 ssize_t
 _write (int filedes, void const *buffer, size_t size)
 {
-  register long __a7 asm ("a7") = (long) SYS_write;
-  register long __a0 asm ("a0") = (long) filedes;
-  register long __a1 asm ("a1") = (long) buffer;
-  register long __a2 asm ("a2") = (long) size;
   asm volatile (
+       "addi a7, zero, 64\n\t"
+       "ld a0, s0, -24\n\t"
+       "ld a1, s0, -32\n\t"
+       "ld a2, s0, -40\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7), "r" (__a1), "r" (__a2)
        );
-  return (ssize_t)__a0;
 }
diff --git a/lib/linux/riscv64-mes-tcc/syscall.c 
b/lib/linux/riscv64-mes-tcc/syscall.c
index e0579914..59ec8d7d 100644
--- a/lib/linux/riscv64-mes-tcc/syscall.c
+++ b/lib/linux/riscv64-mes-tcc/syscall.c
@@ -27,89 +27,70 @@
 long
 __sys_call (long sys_call)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0");
-  asm volatile (
+    asm volatile (
+       "ld a7, s0, -24\n\t"
        "ecall\n\t"
-       : "=r" (__a0)
-       : "r" (__a7)
        );
-  return __a0;
 }
 
 long
 __sys_call1 (long sys_call, long one)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0") = one;
   asm volatile (
+       "ld a7, s0, -24\n\t"
+       "ld a0, s0, -32\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7)
        );
-  return __a0;
 }
 
 long
 __sys_call2 (long sys_call, long one, long two)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0") = one;
-  register long __a1 asm ("a1") = two;
   asm volatile (
+       "ld a7, s0, -24\n\t"
+       "ld a0, s0, -32\n\t"
+       "ld a1, s0, -40\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7), "r" (__a1)
        );
-  return __a0;
 }
 
 long
 __sys_call3 (long sys_call, long one, long two, long three)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0") = one;
-  register long __a1 asm ("a1") = two;
-  register long __a2 asm ("a2") = three;
   asm volatile (
+       "ld a7, s0, -24\n\t"
+       "ld a0, s0, -32\n\t"
+       "ld a1, s0, -40\n\t"
+       "ld a2, s0, -48\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7), "r" (__a1), "r" (__a2)
        );
-  return __a0;
 }
 
 long
 __sys_call4 (long sys_call, long one, long two, long three, long four)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0") = one;
-  register long __a1 asm ("a1") = two;
-  register long __a2 asm ("a2") = three;
-  register long __a3 asm ("a3") = four;
   asm volatile (
+       "ld a7, s0, -24\n\t"
+       "ld a0, s0, -32\n\t"
+       "ld a1, s0, -40\n\t"
+       "ld a2, s0, -48\n\t"
+       "ld a3, s0, -56\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7), "r" (__a1), "r" (__a2), "r" (__a3)
        );
-  return __a0;
 }
 
 long
 __sys_call5 (long sys_call, long one, long two, long three, long four, long 
five)
 {
-  register long __a7 asm ("a7") = sys_call;
-  register long __a0 asm ("a0") = one;
-  register long __a1 asm ("a1") = two;
-  register long __a2 asm ("a2") = three;
-  register long __a3 asm ("a3") = four;
-  register long __a4 asm ("a4") = five;
   asm volatile (
+       "ld a7, s0, -24\n\t"
+       "ld a0, s0, -32\n\t"
+       "ld a1, s0, -40\n\t"
+       "ld a2, s0, -48\n\t"
+       "ld a3, s0, -56\n\t"
+       "ld a4, s0, -64\n\t"
        "ecall\n\t"
-       : "+r" (__a0)
-       : "r" (__a7), "r" (__a1), "r" (__a2), "r" (__a3), "r" (__a4)
        );
-  return __a0;
 }
 // *INDENT-ON*
 
-- 
2.41.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]