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