https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124804
--- Comment #23 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
In any case, (subreg:V16QI (reg:OO N) 0) folds to (reg:V16QI N) on little
endian and
(subreg:V16QI (reg:OO N) 16) folds to (reg:V16QI N+1), and
(subreg:V16QI (mem:OO X) 0) it folds to (mem:V16QI X) and
(subreg:V16QI (mem:OO X) 16) it folds to (mem:V16QI (plus X (const_int 16)).
And the behavior of lxvpx insn on little endian is clearly that it swaps the
doubleword order in the quadword:
(gdb) disas $pc,$pc+4
Dump of assembler code from 0x100008fc to 0x10000900:
=> 0x00000000100008fc <BF16GEMV_T_MMA_8+268>: lxvpx vs44,r30,r2
End of assembler dump.
(gdb) stepi
0x0000000010000900 in BF16GEMV_T_MMA_8 ()
(gdb) x/32bx $r2+$r30
0x10020120 <a.2+160>: 0xa9 0x3f 0xb7 0x3f 0xa7 0x3f 0x94
0x3f
0x10020128 <a.2+168>: 0x1a 0x3f 0x7a 0x3f 0x9e 0x3f 0x93
0x3f
0x10020130 <a.2+176>: 0xad 0x3f 0x6a 0x3f 0x49 0x3f 0x81
0x3f
0x10020138 <a.2+184>: 0x41 0x3f 0xba 0x3f 0x66 0x3f 0xb0
0x3f
(gdb) p/x $vs44.v16_int8
$37 = {0xad, 0x3f, 0x6a, 0x3f, 0x49, 0x3f, 0x81, 0x3f, 0x41, 0x3f, 0xba, 0x3f,
0x66, 0x3f, 0xb0, 0x3f}
(gdb) p/x $vs45.v16_int8
$38 = {0xa9, 0x3f, 0xb7, 0x3f, 0xa7, 0x3f, 0x94, 0x3f, 0x1a, 0x3f, 0x7a, 0x3f,
0x9e, 0x3f, 0x93, 0x3f}