authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:20:58-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:20:58-04:00
log03a3b1ca39e73c7edf615d26bb7647d7565a09f7
tree7a06ca0960e8fb2827aa34662a6fccd99a5ff2bf
parenta3854d042e0d05a87ae9f0b71d12474c8d0e57ec
signaturelock-open Commit is signed but in an unrecognized format.

riscv workarounds for llvm not having good asm integration


4 files changed, 99 insertions(+), 44 deletions(-)

src/codegen.cpp+4
......@@ -8148,6 +8148,10 @@ static void init(CodeGen *g) {
81488148 target_specific_cpu_args = ZigLLVMGetHostCPUName();
81498149 target_specific_features = ZigLLVMGetNativeFeatures();
81508150 }
8151 } else if (target_is_riscv(g->zig_target)) {
8152 // TODO https://github.com/ziglang/zig/issues/2883
8153 target_specific_cpu_args = "";
8154 target_specific_features = "+a";
81518155 } else {
81528156 target_specific_cpu_args = "";
81538157 target_specific_features = "";
std/os/linux/riscv64.zig+90-42
......@@ -1,58 +1,96 @@
11pub fn syscall0(number: usize) usize {
2 return asm volatile ("ecall"
3 : [ret] "={a0}" (-> usize)
4 : [number] "{a7}" (number)
2 return asm volatile (
3 \\ mv a7, %[number]
4 \\ ecall
5 \\ mv %[ret], a0
6 : [ret] "=r" (-> usize)
7 : [number] "r" (number)
58 : "memory"
69 );
710}
811
912pub fn syscall1(number: usize, arg1: usize) usize {
10 return asm volatile ("ecall"
11 : [ret] "={a0}" (-> usize)
12 : [number] "{a7}" (number),
13 [arg1] "{a0}" (arg1)
13 return asm volatile (
14 \\ mv a7, %[number]
15 \\ mv a0, %[arg1]
16 \\ ecall
17 \\ mv %[ret], a0
18 : [ret] "=r" (-> usize)
19 : [number] "r" (number),
20 [arg1] "r" (arg1)
21 : "memory"
1422 );
1523}
1624
1725pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
18 return asm volatile ("ecall"
19 : [ret] "={a0}" (-> usize)
20 : [number] "{a7}" (number),
21 [arg1] "{a0}" (arg1),
22 [arg2] "{a1}" (arg2)
26 return asm volatile (
27 \\ mv a7, %[number]
28 \\ mv a0, %[arg1]
29 \\ mv a1, %[arg2]
30 \\ ecall
31 \\ mv %[ret], a0
32 : [ret] "=r" (-> usize)
33 : [number] "r" (number),
34 [arg1] "r" (arg1),
35 [arg2] "r" (arg2)
36 : "memory"
2337 );
2438}
2539
2640pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
27 return asm volatile ("ecall"
28 : [ret] "={a0}" (-> usize)
29 : [number] "{a7}" (number),
30 [arg1] "{a0}" (arg1),
31 [arg2] "{a1}" (arg2),
32 [arg3] "{a2}" (arg3)
41 return asm volatile (
42 \\ mv a7, %[number]
43 \\ mv a0, %[arg1]
44 \\ mv a1, %[arg2]
45 \\ mv a2, %[arg3]
46 \\ ecall
47 \\ mv %[ret], a0
48 : [ret] "=r" (-> usize)
49 : [number] "r" (number),
50 [arg1] "r" (arg1),
51 [arg2] "r" (arg2),
52 [arg3] "r" (arg3)
53 : "memory"
3354 );
3455}
3556
3657pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
37 return asm volatile ("ecall"
38 : [ret] "={a0}" (-> usize)
39 : [number] "{a7}" (number),
40 [arg1] "{a0}" (arg1),
41 [arg2] "{a1}" (arg2),
42 [arg3] "{a2}" (arg3),
43 [arg4] "{a3}" (arg4)
58 return asm volatile (
59 \\ mv a7, %[number]
60 \\ mv a0, %[arg1]
61 \\ mv a1, %[arg2]
62 \\ mv a2, %[arg3]
63 \\ mv a3, %[arg4]
64 \\ ecall
65 \\ mv %[ret], a0
66 : [ret] "=r" (-> usize)
67 : [number] "r" (number),
68 [arg1] "r" (arg1),
69 [arg2] "r" (arg2),
70 [arg3] "r" (arg3),
71 [arg4] "r" (arg4)
72 : "memory"
4473 );
4574}
4675
4776pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
48 return asm volatile ("ecall"
49 : [ret] "={a0}" (-> usize)
50 : [number] "{a7}" (number),
51 [arg1] "{a0}" (arg1),
52 [arg2] "{a1}" (arg2),
53 [arg3] "{a2}" (arg3),
54 [arg4] "{a3}" (arg4),
55 [arg5] "{a4}" (arg5)
77 return asm volatile (
78 \\ mv a7, %[number]
79 \\ mv a0, %[arg1]
80 \\ mv a1, %[arg2]
81 \\ mv a2, %[arg3]
82 \\ mv a3, %[arg4]
83 \\ mv a4, %[arg5]
84 \\ ecall
85 \\ mv %[ret], a0
86 : [ret] "=r" (-> usize)
87 : [number] "r" (number),
88 [arg1] "r" (arg1),
89 [arg2] "r" (arg2),
90 [arg3] "r" (arg3),
91 [arg4] "r" (arg4),
92 [arg5] "r" (arg5)
93 : "memory"
5694 );
5795}
5896
......@@ -65,14 +103,24 @@ pub fn syscall6(
65103 arg5: usize,
66104 arg6: usize,
67105) usize {
68 return asm volatile ("ecall"
69 : [ret] "={a0}" (-> usize)
70 : [number] "{a7}" (number),
71 [arg1] "{a0}" (arg1),
72 [arg2] "{a1}" (arg2),
73 [arg3] "{a2}" (arg3),
74 [arg4] "{a3}" (arg4),
75 [arg5] "{a4}" (arg5),
76 [arg6] "{a5}" (arg6)
106 return asm volatile (
107 \\ mv a7, %[number]
108 \\ mv a0, %[arg1]
109 \\ mv a1, %[arg2]
110 \\ mv a2, %[arg3]
111 \\ mv a3, %[arg4]
112 \\ mv a4, %[arg5]
113 \\ mv a5, %[arg6]
114 \\ ecall
115 \\ mv %[ret], a0
116 : [ret] "=r" (-> usize)
117 : [number] "r" (number),
118 [arg1] "r" (arg1),
119 [arg2] "r" (arg2),
120 [arg3] "r" (arg3),
121 [arg4] "r" (arg4),
122 [arg5] "r" (arg5),
123 [arg6] "r" (arg6)
124 : "memory"
77125 );
78126}
std/special/c.zig+4-1
......@@ -180,7 +180,10 @@ comptime {
180180 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);
181181 }
182182 if (builtin.os == builtin.Os.linux) {
183 @export("clone", clone, builtin.GlobalLinkage.Strong);
183 // TODO implement clone for riscv64
184 if (builtin.arch != .riscv64) {
185 @export("clone", clone, builtin.GlobalLinkage.Strong);
186 }
184187 }
185188}
186189extern fn __stack_chk_fail() noreturn {
std/special/start.zig+1-1
......@@ -60,7 +60,7 @@ nakedcc fn _start() noreturn {
6060 );
6161 },
6262 .riscv64 => {
63 argc_ptr = asm ("mov %[argc], sp"
63 argc_ptr = asm ("mv %[argc], sp"
6464 : [argc] "=r" (-> [*]usize)
6565 );
6666 },