ARM cortex m4 DSP代码上的快速1位透明度blit

时间:2012-09-07 08:10:39

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

我想将位图中的字节设置为内存,设置字节,该值不等于给定的透明字节值。

示意我想做:

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)只会检查结果是否为> =或&lt;到VALUE,不可能检查它们是否相等。 (当然你可以将VALUE限制为0或255并将其称为一天......)

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

2 个答案:

答案 0 :(得分:4)

现在确切的语法让我感到惊讶,但是这样的事情怎么样:

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

答案 1 :(得分:2)

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

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

使用USUB8严格比较(GE表示“&gt; = 0”,因此GE不表示“&lt; 0”):

  • USUB8(SRC,VALUE_4)=&gt;设置GE位
  • DST = SEL(DST,SRC)=&gt;从Src中选择字节,其值严格低于VALUE
  • USUB8(VALUE_4,SRC)
  • DST = SEL(DST,SRC)=&gt;从Src中选择字节,其值严格优于VALUE

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