如何在Xcode LLVM中编写有关LOOP的内联汇编代码?

2024-02-09

我正在研究内联汇编。我想在 Xcode 4 LLVM 3.0 编译器下的 iPhone 中编写一个简单的例程。我成功编写了基本的内联汇编代码。

例子 :

int sub(int a, int b)
{
    int c;
    asm ("sub %0, %1, %2" : "=r" (c) : "r" (a), "r" (b));
    return c;
}

我在 stackoverflow.com 上找到了它,效果非常好。但是,我不知道如何编写有关 LOOP 的代码。

我需要汇编代码,例如

void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity)
{
    for(int i=0; i<numPixels; i++)
    {
        dst[i] = src[i] + intensity;
    }
}

看看这里的循环部分 -http://en.wikipedia.org/wiki/ARM_architecture http://en.wikipedia.org/wiki/ARM_architecture

基本上你会想要这样的东西:

void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
    asm volatile (
                  "\t mov r3, #0\n"
                  "Lloop:\n"
                  "\t cmp r3, %2\n"
                  "\t bge Lend\n"
                  "\t ldrb r4, [%0, r3]\n"
                  "\t add r4, r4, %3\n"
                  "\t strb r4, [%1, r3]\n"
                  "\t add r3, r3, #1\n"
                  "\t b Lloop\n"
                  "Lend:\n"
                 : "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
                 : "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
                 : "cc", "r3", "r4");
}

Update:

这是 NEON 版本:

void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
    asm volatile (
                  "\t mov r4, #0\n"
                  "\t vdup.8 d1, %3\n"
                  "Lloop2:\n"
                  "\t cmp r4, %2\n"
                  "\t bge Lend2\n"
                  "\t vld1.8 d0, [%0]!\n"
                  "\t vqadd.s8 d0, d0, d1\n"
                  "\t vst1.8 d0, [%1]!\n"
                  "\t add r4, r4, #8\n"
                  "\t b Lloop2\n"
                  "Lend2:\n"
                  : "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
                  : "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
                  : "cc", "r4", "d1", "d0");
}

所以这个 NEON 版本一次可以做 8 个。但它并没有检查numPixels可以被 8 整除,所以你一定要这样做,否则事情就会出错!不管怎样,这只是向您展示可以做什么的开始。注意相同数量的指令,但操作eight一次数据的像素。哦,它也有饱和度,我想你会想要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Xcode LLVM中编写有关LOOP的内联汇编代码? 的相关文章