Commit 03a3b1ca39

Andrew Kelley <andrew@ziglang.org>
2019-07-18 21:20:58
riscv workarounds for llvm not having good asm integration
1 parent a3854d0
Changed files (4)
src
std
os
special
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 = "";
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"
     );
 }
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 {
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)
             );
         },