- 6 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 17:50:12 ]
- vec_short8 log2_2(vec_short8 v) {
static const vec_uchar16 vPack = (vec_uchar16) { 2, 3, 18, 19, 6, 7, 22, 23, 10, 11, 26, 27, 14, 15, 30, 31}; vec_ushort8 v1 = spu_splats((uint16_t)1); vec_ushort8 vIsPos = spu_cmpgt(v, 0); vec_ushort8 vAbs = (vec_ushort8)spu_sel(-v, v, vIsPos); vec_ushort8 vRound = (vAbs & ~spu_rlmask(vAbs, -2)) + spu_rlmask(vAbs, -1); vec_uint4 vEven = spu_mule(vRound, v1); vec_uint4 vOdd = spu_mulo(vRound, 1); vec_uint4 vExpE = spu_sub(32, spu_cntlz(vEven)); vec_uint4 vExpO = spu_sub(32, spu_cntlz(vOdd)); vec_short8 vExp = (vec_short8)spu_shuffle(vExpE, vExpO, vPack); vExp += (vec_short8)spu_and(vIsPos, 16); // sign return vExp; }
|

|