如何在Rust

时间:2019-05-02 03:41:30

标签: rust x86 bit-shift carryflag

我想在执行移位后获取进位标志的值。

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的内在条件,并且内联汇编目前还不稳定。

0 个答案:

没有答案