summaryrefslogtreecommitdiff
path: root/rust/asm/src
diff options
context:
space:
mode:
Diffstat (limited to 'rust/asm/src')
-rw-r--r--rust/asm/src/main.rs46
-rw-r--r--rust/asm/src/main_aarch64.S36
2 files changed, 82 insertions, 0 deletions
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..d8add76
--- /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