loongson / la-abi-specs

22 stars 6 forks source link

which instruction can do logical operations for simd? #7

Open trcrsired opened 7 months ago

trcrsired commented 7 months ago

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

jiegec commented 7 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 7 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 7 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 7 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 7 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.