Crate asm_unroll

source ·
Expand description

Provides a macro with extra functionality compared to asm!(). asm_ext!() allows inline for-loops whose bodies are unrolled into asm lines with literal values. See the macro for more info.

§Example

use asm_unroll::asm_ext;
 
pub fn sum_array(array: &[i64; 8]) -> i64 {
    let output: i64;
 
    unsafe {
        asm_ext!(
            // quickly zero a register
            "xor {output:e}, {output:e}",
            // This loop is unrolled and `{i}` is replaced with a literal.
            for i in 0..8 {
                "add {output}, [{array} + 8*{i}]",
            }
            // inputs:
            array = in(reg) array,
            // outputs:
            output = out(reg) output,
            options(nostack),
        );
    }
 
    output
}

Compiles to this assembly:

push rax
 
xor eax, eax
add rax, qword ptr [rdi]
add rax, qword ptr [rdi + 8]
add rax, qword ptr [rdi + 16]
add rax, qword ptr [rdi + 24]
add rax, qword ptr [rdi + 32]
add rax, qword ptr [rdi + 40]
add rax, qword ptr [rdi + 48]
add rax, qword ptr [rdi + 56]
 
pop rcx
ret

Macros§

  • Works like asm!() but allows for-loops of Ranges or arrays whose bodies are unrolled and loop variables are replaced with literals. Nested for-loops are currently not supported.