#assembly #unroll #macro

asm_unroll

在行内汇编中提供展开的for循环

2 个版本

0.1.1 2024年5月24日
0.1.0 2024年5月24日

#339 in 过程宏

MIT/Apache

13KB
142

Asm Unroll

Crates.io docs.rs

提供比正常行内汇编更多的功能的宏。 asm_ext!() 允许将循环体展开为带有字面值的汇编行。

示例

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
}

编译成以下汇编代码

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

许可证

许可如下之一

任选其一。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义,你提交的任何有意包含在工作中的贡献,都将按照上述方式双许可,没有任何额外的条款或条件。

无运行时依赖