我想在执行位移后获取进位标志的值。
Rust 有稳定的函数来检查溢出,如下所示:
pub fn add_with_carry(foo : &mut u8, bar : u8, cf : &mut u8) {
let(result, overflow) = foo.overflowing_add(bar);
*foo = result;
*cf = overflow as u8;
}
生成这样的程序集:
example::add_with_carry:
add byte ptr [rdi], sil
setb byte ptr [rdx]
ret
然而overflowing_shr
,只有当值移动其大小或更多时才返回 true,我只关心将存储在 CF 中的最低有效位,目前我想出的最好的是:
pub fn shr(foo : &mut u8, cf : &mut u8) {
*cf = *foo & 1;
*foo >>=1
}
然而,这有点效率低下:
example::shr:
mov al, byte ptr [rdi]
and al, 1
mov byte ptr [rsi], al
shr byte ptr [rdi]
ret
我宁愿有类似的东西:
example::shr:
shr byte ptr [rdi]
setc byte ptr [rdx]
ret
似乎没有内在的获取 CF 并且内联汇编目前不稳定。