mirror of
https://github.com/ziglang/zig.git
synced 2026-01-04 12:33:19 +00:00
riscv workarounds for llvm not having good asm integration
This commit is contained in:
parent
a3854d042e
commit
03a3b1ca39
@ -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 = "";
|
||||
|
||||
@ -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"
|
||||
);
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -60,7 +60,7 @@ nakedcc fn _start() noreturn {
|
||||
);
|
||||
},
|
||||
.riscv64 => {
|
||||
argc_ptr = asm ("mov %[argc], sp"
|
||||
argc_ptr = asm ("mv %[argc], sp"
|
||||
: [argc] "=r" (-> [*]usize)
|
||||
);
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user