[PATCH] Support Intel AVX10.2 media instructions
Jiang, Haochen
haochen.jiang@intel.com
Mon Sep 2 07:12:19 GMT 2024
> From: Jan Beulich <jbeulich@suse.com>
> Sent: Friday, August 30, 2024 8:53 PM
>
> On 29.08.2024 09:16, Haochen Jiang wrote:
> > --- /dev/null
> > +++ b/gas/testsuite/gas/i386/avx10_2-256-1.s
> > @@ -0,0 +1,140 @@
> > +# Check 32bit AVX10.2/256 instructions
> > +
> > + .arch generic32
> > + .arch .avx10.2/256
> > + .text
> > +_start:
> > + .irp m, ss, su, uu
> > + vpdpb\m\()d %ymm4, %ymm5, %ymm6{%k7}
> > + vpdpb\m\()d %xmm4, %xmm5, %xmm6{%k7}
> > + vpdpb\m\()d 0x10000000(%esp, %esi, 8), %ymm5, %ymm6{%k7}
> > + vpdpb\m\()d (%ecx){1to8}, %ymm5, %ymm6
> > + vpdpb\m\()d 4064(%ecx), %ymm5, %ymm6{%k7}
> > + vpdpb\m\()d -512(%edx){1to8}, %ymm5, %ymm6{%k7}{z}
> > + vpdpb\m\()d 0x10000000(%esp, %esi, 8), %xmm5, %xmm6{%k7}
> > + vpdpb\m\()d (%ecx){1to4}, %xmm5, %xmm6
> > + vpdpb\m\()d 2032(%ecx), %xmm5, %xmm6{%k7}
> > + vpdpb\m\()d -512(%edx){1to4}, %xmm5, %xmm6{%k7}{z}
> > + vpdpb\m\()ds %ymm4, %ymm5, %ymm6{%k7}
> > + vpdpb\m\()ds %xmm4, %xmm5, %xmm6{%k7}
> > + vpdpb\m\()ds 0x10000000(%esp, %esi, 8), %ymm5, %ymm6{%k7}
> > + vpdpb\m\()ds (%ecx){1to8}, %ymm5, %ymm6
> > + vpdpb\m\()ds 4064(%ecx), %ymm5, %ymm6{%k7}
> > + vpdpb\m\()ds -512(%edx){1to8}, %ymm5, %ymm6{%k7}{z}
> > + vpdpb\m\()ds 0x10000000(%esp, %esi, 8), %xmm5, %xmm6{%k7}
> > + vpdpb\m\()ds (%ecx){1to4}, %xmm5, %xmm6
> > + vpdpb\m\()ds 2032(%ecx), %xmm5, %xmm6{%k7}
> > + vpdpb\m\()ds -512(%edx){1to4}, %xmm5, %xmm6{%k7}{z}
> > + .endr
>
> The 2nd half is fully redundant with the 1st, except for the trailing s.
> Use a 2nd, nested .irp?
I am not sure if it could be done with .irp, n, ,s or something similar.
I will have a try.
>
> > + .irp m, su, us, uu
> > + vpdpw\m\()d %ymm4, %ymm5, %ymm6{%k7}
> > + vpdpw\m\()d %xmm4, %xmm5, %xmm6{%k7}
> > + vpdpw\m\()d 0x10000000(%esp, %esi, 8), %ymm5, %ymm6{%k7}
> > + vpdpw\m\()d (%ecx){1to8}, %ymm5, %ymm6
> > + vpdpw\m\()d 4064(%ecx), %ymm5, %ymm6{%k7}
> > + vpdpw\m\()d -512(%edx){1to8}, %ymm5, %ymm6{%k7}{z}
> > + vpdpw\m\()d 0x10000000(%esp, %esi, 8), %xmm5, %xmm6{%k7}
> > + vpdpw\m\()d (%ecx){1to4}, %xmm5, %xmm6
> > + vpdpw\m\()d 2032(%ecx), %xmm5, %xmm6{%k7}
> > + vpdpw\m\()d -512(%edx){1to4}, %xmm5, %xmm6{%k7}{z}
> > + vpdpw\m\()ds %ymm4, %ymm5, %ymm6{%k7}
> > + vpdpw\m\()ds %xmm4, %xmm5, %xmm6{%k7}
> > + vpdpw\m\()ds 0x10000000(%esp, %esi, 8), %ymm5, %ymm6{%k7}
> > + vpdpw\m\()ds (%ecx){1to8}, %ymm5, %ymm6
> > + vpdpw\m\()ds 4064(%ecx), %ymm5, %ymm6{%k7}
> > + vpdpw\m\()ds -512(%edx){1to8}, %ymm5, %ymm6{%k7}{z}
> > + vpdpw\m\()ds 0x10000000(%esp, %esi, 8), %xmm5, %xmm6{%k7}
> > + vpdpw\m\()ds (%ecx){1to4}, %xmm5, %xmm6
> > + vpdpw\m\()ds 2032(%ecx), %xmm5, %xmm6{%k7}
> > + vpdpw\m\()ds -512(%edx){1to4}, %xmm5, %xmm6{%k7}{z}
> > + .endr
> > +
> > + vdpphps %ymm4, %ymm5, %ymm6{%k7}
> > + vdpphps %xmm4, %xmm5, %xmm6{%k7}
> > + vdpphps 0x10000000(%esp, %esi, 8), %ymm5, %ymm6{%k7}
> > + vdpphps (%ecx){1to8}, %ymm5, %ymm6
> > + vdpphps 4064(%ecx), %ymm5, %ymm6{%k7}
>
> Blank line between the blocks?
I intentionally do that to make it clearer. We could remove that.
>
> > --- a/opcodes/i386-dis-evex-prefix.h
> > +++ b/opcodes/i386-dis-evex-prefix.h
> > @@ -231,8 +231,8 @@
> > },
> > /* PREFIX_EVEX_0F3852 */
> > {
> > - { Bad_Opcode },
> > - { "vdpbf16p%XS", { XM, Vex, EXx }, 0 },
> > + { "vdpphp%XS", { XM, Vex, EXx, EXxEVexR }, 0 },
>
> In the description you validly say no rounding is involved here. Why the
> EXxEVexR?
Ah... It is definitely a misstep when moving everything around or the ISA
evolves, should be removed.
>
> > --- a/opcodes/i386-opc.tbl
> > +++ b/opcodes/i386-opc.tbl
> > @@ -3103,6 +3103,25 @@ vpdpwsuds, 0xf3d3, AVX_VNNI_INT16,
> Modrm|Vex|Space0F38|Src1VVVV|VexW0|CheckOpera
> >
> > // AVX-VNNI-INT16 instructions end.
> >
> > +// AVX10.2 media instructions.
> > +
> > +vdpphps, 0x52, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vmpsadbw, 0xf342, AVX10_2,
> Modrm|Masking|Space0F3A|Src1VVVV|VexW0|Disp8ShiftVL|CheckOperan
> dSize|NoSuf, { Imm8, RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbuud, 0x50, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbuuds, 0x51, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbssd, 0xf250, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbssds, 0xf251, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbsud, 0xf350, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpbsuds, 0xf351, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwuud, 0xd2, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwuuds, 0xd3, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwusd, 0x66d2, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwusds, 0x66d3, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwsud, 0xf3d2, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +vpdpwsuds, 0xf3d3, AVX10_2,
> Modrm|Space0F38|Src1VVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|Ch
> eckOperandSize|NoSuf,
> { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex,
> RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM }
> > +
> > +// AVX10.2 media instructions end.
>
> This will want re-basing over the templatization patch I sent earlier in
> the day. The resulting diff for this file will be quite a bit smaller then.
Sure. I will wait for your patch check-in. Thank for that refactor.
>
> Jan
More information about the Binutils
mailing list