summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHunter Kvalevog <hunter@kvog.sh>2026-09-28 20:50:17 -0500
committerHunter Kvalevog <hunter@kvog.sh>2026-09-28 20:53:56 -0500
commitcc780927e6ca5ddefc7b03bafab171d67089b2c3 (patch)
treec8c4e0a8a40952e46eadd4643b047742b28ec73a
parent45f518dfbcd421e76bfd043b905cd6d7436906e5 (diff)
rust-asm: rust -> assembly interop demo
-rw-r--r--README2
-rw-r--r--rust-asm/Cargo.lock32
-rw-r--r--rust-asm/Cargo.toml9
-rw-r--r--rust-asm/build.rs4
-rw-r--r--rust-asm/src/main.rs46
-rw-r--r--rust-asm/src/main_aarch64.S36
6 files changed, 129 insertions, 0 deletions
diff --git a/README b/README
index f238ba1..f956a3e 100644
--- a/README
+++ b/README
@@ -10,6 +10,8 @@ aarch64 AArch64 assembly experiments
ffmpeg-shadertoy Basic offline Shadertoy renderer
qoidec Quite OK Image Format decoder
riffprobe Basic RIFF/WAVE file traversal
+rust-asm Rust -> assembly interop demo
+rustlings rustlings
vk-cube Spinning cube Vulkan demo
win-resize-mt Drawing while resizing on Windows (multi threaded)
win-resize-st Drawing while resizing on Windows (single threaded)
diff --git a/rust-asm/Cargo.lock b/rust-asm/Cargo.lock
new file mode 100644
index 0000000..92ce097
--- /dev/null
+++ b/rust-asm/Cargo.lock
@@ -0,0 +1,32 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "cc"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f360145194ee8e21db5ee7f3fcd4fe52210864c75c985dae33218202c8bbe040"
+dependencies = [
+ "find-msvc-tools",
+ "shlex",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484"
+
+[[package]]
+name = "rust-asm"
+version = "0.1.0"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
diff --git a/rust-asm/Cargo.toml b/rust-asm/Cargo.toml
new file mode 100644
index 0000000..87c91e7
--- /dev/null
+++ b/rust-asm/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "rust-asm"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+
+[build-dependencies]
+cc = "*"
diff --git a/rust-asm/build.rs b/rust-asm/build.rs
new file mode 100644
index 0000000..e6aa442
--- /dev/null
+++ b/rust-asm/build.rs
@@ -0,0 +1,4 @@
+fn main() {
+ println!("cargo:rerun-if-changed=src/add.S");
+ cc::Build::new().file("src/main_aarch64.S").compile("add");
+}
diff --git a/rust-asm/src/main.rs b/rust-asm/src/main.rs
new file mode 100644
index 0000000..33adc16
--- /dev/null
+++ b/rust-asm/src/main.rs
@@ -0,0 +1,46 @@
+// ================================================================================================
+// Rust->assembly interop demo
+//
+// License:
+// SPDX-License-Identifier: 0BSD
+// Copyright (c) 2026 Hunter Kvalevog
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE.
+// ================================================================================================
+
+#[repr(C)]
+struct Vec3 {
+ x: f32,
+ y: f32,
+ z: f32,
+}
+
+impl Vec3 {
+ pub fn new(x: f32, y: f32, z: f32) -> Self {
+ Self { x, y, z }
+ }
+}
+
+unsafe extern "C" {
+ fn add_u32(a: u32, b: u32) -> u32;
+ fn dot_f32v3(a: *const Vec3, b: *const Vec3) -> f32;
+}
+
+fn test_add(a: u32, b: u32) {
+ let r = unsafe { add_u32(a, b) };
+ println!("{a} + {b} = {r}");
+}
+
+fn test_dot(a: &Vec3, b: &Vec3) {
+ let r = unsafe { dot_f32v3(a, b) };
+ println!("[{}, {}, {}] ⋅ [{}, {}, {}] = {}", a.x, a.y, a.z, b.x, b.y, b.z, r);
+}
+
+fn main() {
+ test_add(1, 2);
+ test_dot(&Vec3::new(1.0, 2.0, 3.0), &Vec3::new(4.0, 5.0, 6.0));
+}
diff --git a/rust-asm/src/main_aarch64.S b/rust-asm/src/main_aarch64.S
new file mode 100644
index 0000000..424a72f
--- /dev/null
+++ b/rust-asm/src/main_aarch64.S
@@ -0,0 +1,36 @@
+// ================================================================================================
+// Rust->assembly interop demo
+//
+// License:
+// SPDX-License-Identifier: 0BSD
+// Copyright (c) 2026 Hunter Kvalevog
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE.
+// ================================================================================================
+
+#include "../../_common/aarch64/common.S"
+
+TEXT_SEGMENT
+
+.global SYM(add_u32)
+.global SYM(dot_f32v3)
+
+SYM(add_u32):
+ add w0, w0, w1
+ ret
+
+SYM(dot_f32v3):
+ ldp s1, s2, [x0] // a.x, a.y
+ ldp s3, s4, [x1] // b.x, b.y
+ ldr s5, [x0, #8] // a.z
+ ldr s6, [x1, #8] // b.z
+
+ fmul s0, s1, s3 // a.x * b.x
+ fmadd s0, s2, s4, s0 // + a.y * b.y
+ fmadd s0, s5, s6, s0 // + a.z * b.z
+
+ ret