2

__vector bool long long 内のすべての要素を単一の int にマージしたいのですが、各ビットは入力ベクトルの最上位ビットに設定されます

例:

__vector bool long long vcmp = vec_cmplt(a, b);
int packedmask = /*SOME FUNCTION GOES HERE*/ (vcmp);

packedmask = x|y|0000000000000000....

x は、vcmd[0] = 0XFFFFF の場合は 1、または vcmp[0] = 0 の場合は 0 です。y も同様。

intel では、_mm_movemask 命令 ( intel の組み込み)を使用してこれを実現できます。

PowerPC で同じことを行う方法はありますか?

助けてくれてありがとう

4

2 に答える 2

3

次のようなことを試すことができます:

typedef __vector uint8_t v128_u8;
typedef __vector uint32_t v128_u32;

const v128_u8 KS = {1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128};
const v128_u8 K0 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
const v128_u8 K1 = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
//const v128_u8 KP = {0, 8, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//little endian
const v128_u8 KP = {3, 11, 7, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//big-endian

unit Tmp
{
     uint32_t u32;
     uint16_t u16[2];
};

uint16_t vec_movemask(v128_u8 value)
{
    Tmp tmp
    tmp.u32 = vec_extract(vec_perm(vec_msum(vec_and(value, KS), K1, K0), KP), 0);
    return tmp.u16[0] + tmp.u16[2];
}

詳細:

value:
{0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff , 0x00, 0xff, 0x00, 0xff};
vec_and(value, KS):
{0x00, 0x02, 0x00, 0x00, 0x10, 0x20, 0x00, 0x80, 0x00, 0x00, 0x04, 0x08 , 0x00, 0x20, 0x00, 0x80};
vec_msum(vec_and(value, KS), K1, K0):
{0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x0C , 0x00, 0x00, 0x00, 0xA0};
vec_perm(vec_msum(vec_and(value, KS), K1, K0):
{0x02, 0x0C, 0xB0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00};
vec_extract(vec_perm(vec_msum(vec_and(value, KS), K1, K0):
{0x02, 0x0C, 0xB0, 0xA0}
tmp.u16[0] + tmp.u16[2]:
{0xB2, 0xAC}
于 2015-11-26T12:48:33.037 に答える