A `"s"` input operand feeds a function/global symbol; the template's %[name] emits the platform-mangled name, so `bl %[fn]` / `call %[fn]` branches DIRECTLY to it (PC-relative, no register load — one fewer indirection than register-indirect `blr`). Lowering: an `"s"` input lowers its RHS normally (a function name → `ptr @fn`); the rejection added last commit is removed. Emit: a symbol operand is passed with its OWN llvm type (LLVMTypeOf) and no coercion — the function value is a `ptr`, and the old coerce-to-register-int path mistyped it and failed the verifier. New asmIsSymbol helper. Verified on aarch64: examples/1656 (sx → asm → bl _cb → sx → 42); the emitted asm is a direct `bl <_cb>` (objdump-confirmed), IR constraint `...,s,...`(ptr @cb). Flipped 1656 from the rejection lock to a runnable aarch64 example. zig build test green (665 corpus, 446 unit).
2 lines
3 B
Plaintext
2 lines
3 B
Plaintext
42
|