[PATCH] Support APX PUSHP/POPP

Cui, Lili lili.cui@intel.com
Tue Nov 28 02:32:15 GMT 2023


> >>> --- a/opcodes/i386-dis.c
> >>> +++ b/opcodes/i386-dis.c
> >>> @@ -1931,23 +1931,23 @@ static const struct dis386 dis386[] = {
> >>>    { "dec{S|}",		{ RMeSI }, 0 },
> >>>    { "dec{S|}",		{ RMeDI }, 0 },
> >>>    /* 50 */
> >>> -  { "push{!P|}",		{ RMrAX }, 0 },
> >>> -  { "push{!P|}",		{ RMrCX }, 0 },
> >>> -  { "push{!P|}",		{ RMrDX }, 0 },
> >>> -  { "push{!P|}",		{ RMrBX }, 0 },
> >>> -  { "push{!P|}",		{ RMrSP }, 0 },
> >>> -  { "push{!P|}",		{ RMrBP }, 0 },
> >>> -  { "push{!P|}",		{ RMrSI }, 0 },
> >>> -  { "push{!P|}",		{ RMrDI }, 0 },
> >>> +  { "push!P",		{ RMrAX }, 0 },
> >>> +  { "push!P",		{ RMrCX }, 0 },
> >>> +  { "push!P",		{ RMrDX }, 0 },
> >>> +  { "push!P",		{ RMrBX }, 0 },
> >>> +  { "push!P",		{ RMrSP }, 0 },
> >>> +  { "push!P",		{ RMrBP }, 0 },
> >>> +  { "push!P",		{ RMrSI }, 0 },
> >>> +  { "push!P",		{ RMrDI }, 0 },
> >>>    /* 58 */
> >>> -  { "pop{!P|}",		{ RMrAX }, 0 },
> >>> -  { "pop{!P|}",		{ RMrCX }, 0 },
> >>> -  { "pop{!P|}",		{ RMrDX }, 0 },
> >>> -  { "pop{!P|}",		{ RMrBX }, 0 },
> >>> -  { "pop{!P|}",		{ RMrSP }, 0 },
> >>> -  { "pop{!P|}",		{ RMrBP }, 0 },
> >>> -  { "pop{!P|}",		{ RMrSI }, 0 },
> >>> -  { "pop{!P|}",		{ RMrDI }, 0 },
> >>> +  { "pop!P",		{ RMrAX }, 0 },
> >>> +  { "pop!P",		{ RMrCX }, 0 },
> >>> +  { "pop!P",		{ RMrDX }, 0 },
> >>> +  { "pop!P",		{ RMrBX }, 0 },
> >>> +  { "pop!P",		{ RMrSP }, 0 },
> >>> +  { "pop!P",		{ RMrBP }, 0 },
> >>> +  { "pop!P",		{ RMrSI }, 0 },
> >>> +  { "pop!P",		{ RMrDI }, 0 },
> >>>    /* 60 */
> >>>    { X86_64_TABLE (X86_64_60) },
> >>>    { X86_64_TABLE (X86_64_61) },
> >>> @@ -10621,6 +10621,19 @@ putop (instr_info *ins, const char
> >> *in_template, int sizeflag)
> >>>  	case 'P':
> >>>  	  if (l == 0)
> >>>  	    {
> >>> +	      /* For pushp and popp, do not print {rex2} for them.  */
> >>> +	      if (ins->address_mode == mode_64bit && !cond
> >>
> >> I don't think the mode_64bit check is needed here, as without that
> >> REX.W cannot possibly be set (nor can a REX2 prefix be present).
> >
> > Done.
> >
> >>
> >>> +		  && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
> >>> +		{
> >>> +		  *ins->obufp++ = 'p';
> >>> +		  ins->rex2 |= 16;
> >>
> >> Please no new use of magic constants. Have a #define with a suitable
> >> name, and use that here. Also I think the comment you have ahead of
> >> the if() actually belongs here?
> >>
> >
> > How about " #define IMPLICIT_REX2 16",  PUSHP/POPP can share it with
> JMPABS.
> 
> But what's implicit about the REX2 prefix here?
> 

PUSHP/POPP requires rex2.w ==1 and we don't want to print {rex2} for it. JMPABS has the same need, so I want to define a common macro for them, or NO_NEED_PRINT_REX2?

> >>> +		  break;
> >>> +		}
> >>> +
> >>> +	      /* If "!p" printis nothing in intel_syntax.  */
> >>> +	      if (!cond && ins->intel_syntax)
> >>> +		break;
> >>
> >> The comment isn't quite right ('p' is printed). Also (nit) "prints".
> >>
> >
> > Added "!cond"  here, since just removed {} for !p,  I think P has its way of
> handling intel_syntax.
> 
> All fine. Yet still the comment should reflect reality.
> 

Changed.

> >>> --- a/opcodes/i386-opc.tbl
> >>> +++ b/opcodes/i386-opc.tbl
> >>> @@ -225,6 +225,7 @@ push, 0x68, i186&No64,
> >>> DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16|Imm32 }  push, 0x6,
> >> No64,
> >>> DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg }  // In 64bit mode, the
> >> operand size is implicitly 64bit.
> >>>  push, 0x50, x64, No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 }
> >>> +pushp, 0x50, APX_F, No_bSuf|No_lSuf|No_sSuf|Rex2, {Reg64 }
> >>
> >> Since Reg16 isn't allowed, you also want No_wSuf here (and below).
> >> Note also the missing blank after the opening figure brace.
> >>
> >
> > Done.
> >
> >> The new Rex2 attribute is not only wasteful (it can easily be a new
> >> enumerator used with OperandConstraint), but also misleading. We
> >> don't just need REX2 here, but we need it with REX2.W set. Even if
> >> from the tc-i386.c changes it looks as if that was happening
> >> implicitly (presumably due to the absence of NoRex64), naming still needs
> to properly reflect the purpose.
> >>
> >
> > You are right, rex2.w is set in process_suffix, since there is no NoRex64.
> >
> > How about Rex2W?
> > if (i.tm.opcode_modifier.rex2w)
> > {
> >     i.rex2_encoding = true;
> >     i.rex |= REX_W;   // add NoRex64 back, and set REX_W here.
> > }
> >
> >
> > Or just add a special judgment?
> >
> > if (t->mnem_off == MN_pushp || t->mnem_off == MN_popp) {
> >     i.rex2_encoding = true;
> >     i.rex |= REX_W;   // add NoRex64 back, and set REX_W here.
> > }
> 
> I'd prefer the latter over a new attribute (albeit once again with the comment
> actually matching code), and perhaps I view the latter equal to my earlier
> suggestion.
> 

Ok, put them in process_operands, there's already a special handler here to change the prefix.

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 0dde2a9ad44..2f2b1b04d10 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -8715,6 +8715,13 @@ process_operands (void)
       i.tm.operands++;
     }

+  /* PUSHP/POPP requires rex2.w == 1.  */
+  if (i.tm.mnem_off == MN_pushp || i.tm.mnem_off == MN_popp)
+    {
+      i.rex2_encoding = true;
+      i.rex |= REX_W;
+    }
+
   if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
     {

> > By the way, Is our APX patches (V3)  review still in progress? Since we have to
> commit them into the trunk before the next release, time is a bit tight ( many
> people may have vacation plans at the end of the year).
> 
> Hmm, not exactly sure what to say. You posted v3 only on Friday. Plus I have
> spent an enormous amount of time reviewing v1 and v2. Please be patient, I
> have this queued for another round of review. And no, there is no "we have
> to ... before the next release". You (Intel) may want to, but with a large new
> feature like this it had to be clear that getting all pieces in will take time.
> 

Maybe what I said is inappropriate and makes you uncomfortable, so just follow your own pace. It's not easy to review the code of such a large function, and I really know it will take up a lot of your time, at least I can't do such a detailed inspection as you do.

Thanks,
Lili.


More information about the Binutils mailing list