首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >altivec上的_mm_srli_si128等效项

altivec上的_mm_srli_si128等效项
EN

Stack Overflow用户
提问于 2013-07-18 17:40:32
回答 1查看 466关注 0票数 1

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

当我在谷歌上搜索时,我发现vec_slo与之相当。

下面是我的示例程序,用于将内容左移1个字节:

代码语言:javascript
复制
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);
}

当我编译时,我得到以下错误:

代码语言:javascript
复制
line 20.1: 1506-930 (S) The function "vec_slo" is not a type-generic macro.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 17:50:57

vec_slo的第二个参数需要是vector signed charvector unsigned char。因此,改变:

代码语言:javascript
复制
vector unsigned int a;

至:

代码语言:javascript
复制
vector unsigned char a;

和改变:

代码语言:javascript
复制
a = vec_ld(0, (vector unsigned int *)buf1);

至:

代码语言:javascript
复制
a = vec_ld(0, (vector unsigned char *)buf1);

当你编译和运行你的代码时,你会看到一些其他的问题:

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

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

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17719851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档