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.
26 lines
1.0 KiB
Plaintext
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); }
|