Files
sx/examples/platform/1656-platform-asm-symbol-operand.sx
agra 66bdc70bf1 test: group examples into per-category folders
Move examples/*.sx and their expected/ snapshots into per-category
subfolders (examples/<category>/...). Folder = leading filename token,
with ffi-objc/ffi-jni kept whole; filenames are unchanged. The corpus
runner and LSP sweep now discover each category's expected/ dir, while
issues/ stays flat. Example 1058's repo-root-relative companion import
is made file-relative. Path strings embedded in 164 snapshots were
regenerated (path-only changes). Test-layout docs in CLAUDE.md updated.
2026-06-21 14:41:34 +03:00

26 lines
1.0 KiB
Plaintext

// ASM stream — symbol operand (`"s"`): feed a function/global SYMBOL into the
// template so a DIRECT `bl %[fn]` (PC-relative — one fewer indirection than a
// register-indirect `blr`: no pointer load, a relative reloc, a predictable
// branch) goes straight to it. The backend emits the platform-mangled name
// (`_cb` on macOS, `cb` on Linux), so the template stays portable — no hardcoded
// underscore. Round trip: sx → asm → `bl _cb` → sx → 42. aarch64-macos-pinned;
// runs under the JIT here, ir-only elsewhere (the `.ir` locks `"s"`/`ptr @cb`).
cb :: (n: i64) -> i64 export "cb" { return n + 1; }
tramp :: (n: i64) -> i64 {
return asm volatile {
#string ASM
stp x29, x30, [sp, #-16]!
mov x0, %[arg]
bl %[fn]
mov %[res], x0
ldp x29, x30, [sp], #16
ASM,
[res] "=r" -> i64,
[arg] "r" = n,
[fn] "s" = cb, // symbol operand → direct `bl _cb`
clobbers(.x0, .x30, .memory),
};
}
main :: () -> i64 { return tramp(41); }