aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-08-22 11:20:03 +0100
committerGitHub <noreply@github.com>2024-08-22 11:20:03 +0100
commit70932dc47882b17344d466776ad988ffb3c7bc98 (patch)
tree2e854e0f3f6f3c5494a172211af834c9a1db0822 /src/llvm_backend_proc.cpp
parenta8bc6f08a9b4dea769b4aea40aa33e72c0b7806a (diff)
parentc0125f3192a453195cad108bf8155c64be78f197 (diff)
Merge pull request #4089 from laytan/riscv64
add support for linux_riscv64 and freestanding_riscv64
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 3326b4041..e850d3364 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -2877,6 +2877,31 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
LLVMValueRef inline_asm = nullptr;
switch (build_context.metrics.arch) {
+ case TargetArch_riscv64:
+ {
+ GB_ASSERT(arg_count <= 7);
+
+ char asm_string[] = "ecall";
+ gbString constraints = gb_string_make(heap_allocator(), "={a0}");
+ for (unsigned i = 0; i < arg_count; i++) {
+ constraints = gb_string_appendc(constraints, ",{");
+ static char const *regs[] = {
+ "a7",
+ "a0",
+ "a1",
+ "a2",
+ "a3",
+ "a4",
+ "a5",
+ "a6"
+ };
+ constraints = gb_string_appendc(constraints, regs[i]);
+ constraints = gb_string_appendc(constraints, "}");
+ }
+
+ inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints));
+ }
+ break;
case TargetArch_amd64:
{
GB_ASSERT(arg_count <= 7);