【问题标题】:Fast 1bit transparency blit on ARM cortex m4 DSP codeARM cortex m4 DSP 代码上的快速 1 位透明度 blit
【发布时间】:2012-09-07 08:10:39
【问题描述】:

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

我想做的示意图:

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)只会检查结果是 >= 还是

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

【问题讨论】:

  • 了解什么是VALUE可能会很好?只是一个位设置值? src 或 dst 是否可以包含该 VALUE 位集?有了这些信息,人们还可以开发出一个带有逻辑表达式的副本,从而摆脱 if 语句。
  • VALUE 是一个字节,例如 0x1c(可能是另一个字节)。 src 肯定会包含 0x1c 值(比如说“透明”); dst 也可以包含它,如果它在粘贴之前有它。 (想想透明的颜色,例如在 GIF 中)。
  • 你可能知道我想说什么,如果你查看 wiki 的链接,你会发现可以使用 AND/OR 来执行这种 blitting,当然如果在你的抵达。 en.wikipedia.org/wiki/Bit_blit#Technique

标签: assembly arm signal-processing cortex-m3 blit


【解决方案1】:

现在我不知道确切的语法,但是像这样的东西怎么样:

  • 将现有图像中的四个字节加载到 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)

【讨论】:

    【解决方案2】:

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

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

    使用 USUB8 严格比较(GE 表示 ">= 0" 而不是 GE 表示 "

    • 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)以及循环管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2018-12-04
      • 2017-06-23
      • 1970-01-01
      • 2018-09-29
      • 2017-12-03
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多