assembly 基于ARM Cortex m4 DSP的快速1位透明位传输代码

t40tm48m  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(99)

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

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)不确定它是否真的比逐字节访问更快之前获得数据并不总是可行的。

1hdlvixo

1hdlvixo1#

我现在还不知 prop 体的语法,但是像这样的东西怎么样:

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

6gpjuf902#

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

  • VALUE_4:4字节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)和循环管理组成。

相关问题