zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 70da0762f7aa2d800da4a238499fc3f31dc4d31f (tree)
parent 03a3b1ca39e73c7edf615d26bb7647d7565a09f7
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 18 Jul 2019 18:15:50 -0400

better riscv syscalls

Diffstat:
Mstd/os/linux/riscv64.zig | 126+++++++++++++++++++++++++++-----------------------------------------------------
1 file changed, 42 insertions(+), 84 deletions(-)

diff --git a/std/os/linux/riscv64.zig b/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" ); }