loongson / la-abi-specs

25 stars 6 forks source link

which instruction can do logical operations for simd? #7

Open trcrsired opened 10 months ago

trcrsired commented 10 months ago

How to know a register is all zero and generate a mask to compare?

jiegec commented 10 months ago

If you meant to check if the whole SIMD Register is all-zero, you can use vseteqz.v and read the result from fcc. If you meant to check the zero elements of SIMD Register, you can use vmsknz.b/h/w/d and invert the result with vnor.v.

trcrsired commented 10 months ago

Any documentations on functionalities of all the simd instruction and its intrinsics?

What i am doing here is that i have a simd_vector<char,16> v; if(is_all_zero(v)) { blah blah blah }

https://github.com/trcrsired/fast_io/blob/master/include/fast_io_core_impl/simd/is_all_zeros.h#L81

Btw, does it provide instruction for creating mask like __builtin_ia32_pmovmskb128?

jiegec commented 10 months ago

Any documentations on functionalities of all the simd instruction and its intrinsics?

The official manual is not yet released, but there is an unofficial one by me: http://jia.je/unofficial-loongarch-intrinsics-guide/

jiegec commented 10 months ago

simd_vector<char,16> v; if(is_all_zero(v)) { blah blah blah }

You can use __lsx_bz_v for this.

jiegec commented 10 months ago

Btw, does it provide instruction for creating mask like __builtin_ia32_pmovmskb128?

I think you can use __lsx_vmskltz_b + __lsx_vpickve2gr_h to achieve the same effect.