]> git.ipfire.org Git - thirdparty/gcc.git/commit
LoongArch: Avoid unnecessary zero-initialization using LSX for scalar popcount
authorXi Ruoyao <xry111@xry111.site>
Sat, 22 Feb 2025 07:34:54 +0000 (15:34 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Wed, 5 Nov 2025 01:52:18 +0000 (09:52 +0800)
commitd7434f3babc5a954fa68dd0c8ce6d4e917a017c1
treee57c262d8949bbc3f1ec0cdf17f76926eb443bd2
parent84974b9e663cab1e1ed19939e953d6369a84ac05
LoongArch: Avoid unnecessary zero-initialization using LSX for scalar popcount

Now for __builtin_popcountl we are getting things like

vrepli.b $vr0,0
vinsgr2vr.d $vr0,$r4,0
vpcnt.d $vr0,$vr0
vpickve2gr.du $r4,$vr0,0
slli.w $r4,$r4,0
jr  $r1

The "vrepli.b" instruction is introduced by the init-regs pass (see
PR61810 and all the issues it references).  To work it around, we can
use post-reload instead of define_expand: the "f" constraint will make
the compiler automatically move the scalar between GPR and FPR, and
reload is much later than init-regs so init-regs won't get in our way.

Now the code looks like:

movgr2fr.d $f0,$r4
vpcnt.d $vr0,$vr0
movfr2gr.d $r4,$f0
jr  $r1

gcc/ChangeLog:

* config/loongarch/loongarch.md (cntmap): Change to uppercase.
(popcount<GPR:mode>2): Modify to a post reload split.
gcc/config/loongarch/loongarch.md