diff options
| -rw-r--r-- | README | 2 | ||||
| -rw-r--r-- | rust-asm/Cargo.lock | 32 | ||||
| -rw-r--r-- | rust-asm/Cargo.toml | 9 | ||||
| -rw-r--r-- | rust-asm/build.rs | 4 | ||||
| -rw-r--r-- | rust-asm/src/main.rs | 46 | ||||
| -rw-r--r-- | rust-asm/src/main_aarch64.S | 36 |
6 files changed, 129 insertions, 0 deletions
@@ -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 |