diff --git a/src/codegen.cpp b/src/codegen.cpp index 2c5f2c96e5..d664a21ecc 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8148,6 +8148,10 @@ static void init(CodeGen *g) { target_specific_cpu_args = ZigLLVMGetHostCPUName(); target_specific_features = ZigLLVMGetNativeFeatures(); } + } else if (target_is_riscv(g->zig_target)) { + // TODO https://github.com/ziglang/zig/issues/2883 + target_specific_cpu_args = ""; + target_specific_features = "+a"; } else { target_specific_cpu_args = ""; target_specific_features = ""; diff --git a/std/os/linux/riscv64.zig b/std/os/linux/riscv64.zig index b9264aa3db..5cda2afa0a 100644 --- a/std/os/linux/riscv64.zig +++ b/std/os/linux/riscv64.zig @@ -1,58 +1,96 @@ pub fn syscall0(number: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number) + return asm volatile ( + \\ mv a7, %[number] + \\ ecall + \\ mv %[ret], a0 + : [ret] "=r" (-> usize) + : [number] "r" (number) : "memory" ); } pub fn syscall1(number: usize, arg1: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1) + return asm volatile ( + \\ mv a7, %[number] + \\ mv a0, %[arg1] + \\ ecall + \\ mv %[ret], a0 + : [ret] "=r" (-> usize) + : [number] "r" (number), + [arg1] "r" (arg1) + : "memory" ); } pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1), - [arg2] "{a1}" (arg2) + 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) + : "memory" ); } pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1), - [arg2] "{a1}" (arg2), - [arg3] "{a2}" (arg3) + 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) + : "memory" ); } pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1), - [arg2] "{a1}" (arg2), - [arg3] "{a2}" (arg3), - [arg4] "{a3}" (arg4) + 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) + : "memory" ); } pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1), - [arg2] "{a1}" (arg2), - [arg3] "{a2}" (arg3), - [arg4] "{a3}" (arg4), - [arg5] "{a4}" (arg5) + 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) + : "memory" ); } @@ -65,14 +103,24 @@ pub fn syscall6( arg5: usize, arg6: usize, ) usize { - return asm volatile ("ecall" - : [ret] "={a0}" (-> usize) - : [number] "{a7}" (number), - [arg1] "{a0}" (arg1), - [arg2] "{a1}" (arg2), - [arg3] "{a2}" (arg3), - [arg4] "{a3}" (arg4), - [arg5] "{a4}" (arg5), - [arg6] "{a5}" (arg6) + 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) + : "memory" ); } diff --git a/std/special/c.zig b/std/special/c.zig index 150127196b..fa039b3604 100644 --- a/std/special/c.zig +++ b/std/special/c.zig @@ -180,7 +180,10 @@ comptime { @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong); } if (builtin.os == builtin.Os.linux) { - @export("clone", clone, builtin.GlobalLinkage.Strong); + // TODO implement clone for riscv64 + if (builtin.arch != .riscv64) { + @export("clone", clone, builtin.GlobalLinkage.Strong); + } } } extern fn __stack_chk_fail() noreturn { diff --git a/std/special/start.zig b/std/special/start.zig index 42dda53121..0366e088d9 100644 --- a/std/special/start.zig +++ b/std/special/start.zig @@ -60,7 +60,7 @@ nakedcc fn _start() noreturn { ); }, .riscv64 => { - argc_ptr = asm ("mov %[argc], sp" + argc_ptr = asm ("mv %[argc], sp" : [argc] "=r" (-> [*]usize) ); },