_mm_srli_si128 等效于 altivec

Posted

技术标签:

【中文标题】_mm_srli_si128 等效于 altivec【英文标题】:_mm_srli_si128 equivalent on altivec 【发布时间】:2013-07-18 09:40:32 【问题描述】:

我正在将一个用 SSE 4.2 编写的程序移植到 Altivec。我在寻找内在 _mm_srli_si128 的等价物时遇到问题。

当我用谷歌搜索时,我发现 vec_slo 是等效的。

这是我将内容左移 1 个字节的示例程序:

void test(void *buf, void *buf1)

    vector unsigned int x;
    vector unsigned int a;

    x = vec_ld(0, (vector unsigned int *)buf);
    a = vec_ld(0, (vector unsigned int *)buf1);

    vec_slo(x, a);


int main()

    char buf[17]="1111111111111111";
    char buf1[17]="0000000000000001";

    test(buf, buf1);

编译时出现以下错误:

line 20.1: 1506-930 (S) The function "vec_slo" is not a type-generic macro.

【问题讨论】:

【参考方案1】:

vec_slo 的第二个参数必须是 vector signed charvector unsigned char。所以改变:

vector unsigned int a;

到:

vector unsigned char a;

并改变:

a = vec_ld(0, (vector unsigned int *)buf1);

到:

a = vec_ld(0, (vector unsigned char *)buf1);

您的代码还有一些其他问题,您会在编译和运行代码时看到这些问题:

bufbuf1 需要 16 字节对齐 buf1 中的移位值需要是一个 4 位字面整数,左移 3 位,而不是一个字符

这是您的示例代码的简化/更正版本 - 它是为 gcc 编写的,因此可能需要对您使用的任何编译器进行细微更改(xlc ?):

int main(void)

    vector unsigned char v =  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ;
    vector unsigned char vshift = vec_splat_u8(1 << 3);   // shift left by 1 byte
    vector unsigned char vshifted = vec_slo(v, vshift);

    printf("v        = %vu\n", v);
    printf("vshift   = %vu\n", vshift);
    printf("vshifted = %vu\n", vshifted);

    return 0;

【讨论】:

buf1的值应该是多少? 嗨,Paul,有什么文件可以帮助我更深入地了解 altivec 的内在成分。 @sunmoon:是的,你想要Motorola "AltiVec Programming Interface Manual" ALTIVECPIM/D。 嗨,Paul,您有示例程序的教程吗? @sunmoon:您可以从 IBM 开发人员页面开始,例如ibm.com/developerworks/power/library/pa-unrollav2

以上是关于_mm_srli_si128 等效于 altivec的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 等效于 ' __asm int 3 / DebugBreak() / Halt?

__call 等效于公共方法

等效于 Visual C++ 中 gcc 的 __attribute__ 格式

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

属性警告未使用的结果等效于视觉 c

SSE 比较内在 - 如何从比较中获得 1 或 0?