2

我想将字节从位图设置到内存,设置值不等于给定透明度字节值的字节。

示意图我想做:

for (char *src=start;src<end;src++,dst++) 
{
    if (*src!=VALUE) {
       *dst=*src;
    }
}

即仅在 C 或程序集中设置与值不同的字节(或从程序集反向翻译的 C)

为了更快,我考虑过使用 32 位加载、src 和 dst 之间的 SEL 操作以及 32 位存储。但是,我需要设置掩码,它位于 APSR.GE 中。

如果我没记错的话,用 VALUE 进行 SIMD 比较(使用 USUB8)只会检查结果是 >= 还是 < 到 VALUE,无法检查它们是否相等。(当然,您可以将 VALUE 限制为 0 或 255 并收工...)

另一种可能性是在 src 上使用预先计算的掩码,然后手动设置 APSR.GE(可能吗?)但是 1)它使用内存,2)在 3)之前获取数据并不总是可行的)不确定它是否真的会比逐字节访问要快。

4

2 回答 2

4

确切的语法现在让我无法理解,但是像这样的东西怎么样:

  • 将现有图像中的四个字节加载到 Ra (LDR)
  • 将源图像中的四个字节加载到 Rb (LDR)
  • XOR Ra 与适当的掩码 (~VALUE) 将 VALUE 更改为 0 (EOR)
  • 具有与上述相同掩码的 XOR Rb (EOR)
  • 使用带有 0 的寄存器执行 USUB8 以设置 GE 标志 (USUB8)
  • 使用 SEL 在现有图像字节和源图像字节之间进行选择,写入 Rc (SEL)
  • 再次使用掩码 XOR Rc 以恢复原始字节 (EOR)
  • 将 Rc 写回现有映像 (STR)
于 2012-09-07T21:59:31.463 回答
2

您可能不再需要这个,但对于可能需要类似算法的新手,我建议如下:

  • VALUE_4 : 4 byte VALUE(在所有 4 个字节上复制的字节)
  • SRC:4 个图像字节
  • DST:4 个目标字节

使用 USUB8 严格比较(GE 表示 ">= 0" 所以不是 GE 表示 "< 0" ):

  • USUB8(SRC, VALUE_4) => 设置 GE 位
  • DST = SEL(DST, SRC) => 从 Src 中选择值严格低于 VALUE 的字节
  • USUB8(VALUE_4,SRC)
  • DST = SEL(DST, SRC) => 从 Src 中选择值严格高于 VALUE 的字节

您的循环将包含 7 个操作(2 个加载、1 个存储、2 个 USUB8、2 个 SEL)以及循环管理。

于 2014-12-22T07:42:08.560 回答