Commit 70da0762f7

Andrew Kelley <andrew@ziglang.org>
2019-07-19 00:15:50
better riscv syscalls
1 parent 03a3b1c
Changed files (1)
std
os
std/os/linux/riscv64.zig
@@ -1,95 +1,62 @@
 pub fn syscall0(number: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number)
         : "memory"
     );
 }
 
 pub fn syscall1(number: usize, arg1: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1)
         : "memory"
     );
 }
 
 pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ mv a1, %[arg2]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1),
-          [arg2] "r" (arg2)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1),
+          [arg2] "{x11}" (arg2)
         : "memory"
     );
 }
 
 pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ mv a1, %[arg2]
-        \\ mv a2, %[arg3]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1),
-          [arg2] "r" (arg2),
-          [arg3] "r" (arg3)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1),
+          [arg2] "{x11}" (arg2),
+          [arg3] "{x12}" (arg3)
         : "memory"
     );
 }
 
 pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ mv a1, %[arg2]
-        \\ mv a2, %[arg3]
-        \\ mv a3, %[arg4]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1),
-          [arg2] "r" (arg2),
-          [arg3] "r" (arg3),
-          [arg4] "r" (arg4)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1),
+          [arg2] "{x11}" (arg2),
+          [arg3] "{x12}" (arg3),
+          [arg4] "{x13}" (arg4)
         : "memory"
     );
 }
 
 pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ mv a1, %[arg2]
-        \\ mv a2, %[arg3]
-        \\ mv a3, %[arg4]
-        \\ mv a4, %[arg5]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1),
-          [arg2] "r" (arg2),
-          [arg3] "r" (arg3),
-          [arg4] "r" (arg4),
-          [arg5] "r" (arg5)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1),
+          [arg2] "{x11}" (arg2),
+          [arg3] "{x12}" (arg3),
+          [arg4] "{x13}" (arg4),
+          [arg5] "{x14}" (arg5)
         : "memory"
     );
 }
@@ -103,24 +70,15 @@ pub fn syscall6(
     arg5: usize,
     arg6: usize,
 ) usize {
-    return asm volatile (
-        \\ mv a7, %[number]
-        \\ mv a0, %[arg1]
-        \\ mv a1, %[arg2]
-        \\ mv a2, %[arg3]
-        \\ mv a3, %[arg4]
-        \\ mv a4, %[arg5]
-        \\ mv a5, %[arg6]
-        \\ ecall
-        \\ mv %[ret], a0
-        : [ret] "=r" (-> usize)
-        : [number] "r" (number),
-          [arg1] "r" (arg1),
-          [arg2] "r" (arg2),
-          [arg3] "r" (arg3),
-          [arg4] "r" (arg4),
-          [arg5] "r" (arg5),
-          [arg6] "r" (arg6)
+    return asm volatile ("ecall"
+        : [ret] "={x10}" (-> usize)
+        : [number] "{x17}" (number),
+          [arg1] "{x10}" (arg1),
+          [arg2] "{x11}" (arg2),
+          [arg3] "{x12}" (arg3),
+          [arg4] "{x13}" (arg4),
+          [arg5] "{x14}" (arg5),
+          [arg6] "{x15}" (arg6)
         : "memory"
     );
 }