1

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.
4

1 に答える 1

1

の 2 番目の引数はまたはで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);

コードをコンパイルして実行すると、コードには他にもいくつかの問題があります。

  • bufbuf116 バイト アラインする必要があります
  • シフトインの値はbuf1、文字ではなく、左に 3 ビット シフトされた 4 ビットのリテラル整数である必要があります。

これは、サンプルコードの簡略化/修正されたバージョンです-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;
}
于 2013-07-18T09:50:56.907 に答える