@@ -2730,6 +2730,9 @@ emitter::insFormat emitter::emitMapFmtAtoM(insFormat fmt)
27302730 case IF_ARW_CNS:
27312731 return IF_MRW_CNS;
27322732
2733+ case IF_AWR_RRD_CNS:
2734+ return IF_MWR_RRD_CNS;
2735+
27332736 case IF_ARW_SHF:
27342737 return IF_MRW_SHF;
27352738
@@ -5067,6 +5070,32 @@ void emitter::emitIns_AR_R(instruction ins, emitAttr attr, regNumber ireg, regNu
50675070 emitAdjustStackDepthPushPop (ins);
50685071}
50695072
5073+ #ifndef LEGACY_BACKEND
5074+ void emitter::emitIns_AR_R_I (instruction ins, emitAttr attr, regNumber base, int disp, regNumber ireg, int ival)
5075+ {
5076+ assert (ins == INS_vextracti128 || ins == INS_vextractf128);
5077+ assert (base != REG_NA);
5078+ assert (ireg != REG_NA);
5079+ UNATIVE_OFFSET sz;
5080+ instrDesc* id = emitNewInstrAmdCns (attr, disp, ival);
5081+
5082+ id->idIns (ins);
5083+ id->idInsFmt (IF_AWR_RRD_CNS);
5084+ id->idAddr ()->iiaAddrMode .amBaseReg = base;
5085+ id->idAddr ()->iiaAddrMode .amIndxReg = REG_NA;
5086+ id->idReg1 (ireg);
5087+
5088+ assert (emitGetInsAmdAny (id) == disp); // make sure "disp" is stored properly
5089+
5090+ // the code size of "vextracti/f128 [mem], ymm, imm8" is 6 byte
5091+ sz = 6 ;
5092+ id->idCodeSize (sz);
5093+
5094+ dispIns (id);
5095+ emitCurIGsize += sz;
5096+ }
5097+ #endif
5098+
50705099void emitter::emitIns_AI_R (instruction ins, emitAttr attr, regNumber ireg, ssize_t disp)
50715100{
50725101 UNATIVE_OFFSET sz;
@@ -7790,6 +7819,32 @@ void emitter::emitDispIns(
77907819 break ;
77917820 }
77927821
7822+ case IF_AWR_RRD_CNS:
7823+ {
7824+ assert (ins == INS_vextracti128 || ins == INS_vextractf128);
7825+ // vextracti/f128 extracts 128-bit data, so we fix sstr as "xmm ptr"
7826+ sstr = codeGen->genSizeStr (EA_ATTR (16 ));
7827+ printf (sstr);
7828+ emitDispAddrMode (id);
7829+ printf (" , %s" , emitRegName (id->idReg1 (), attr));
7830+
7831+ emitGetInsAmdCns (id, &cnsVal);
7832+
7833+ val = cnsVal.cnsVal ;
7834+ printf (" , " );
7835+
7836+ if (cnsVal.cnsReloc )
7837+ {
7838+ emitDispReloc (val);
7839+ }
7840+ else
7841+ {
7842+ goto PRINT_CONSTANT;
7843+ }
7844+
7845+ break ;
7846+ }
7847+
77937848 case IF_RWR_RRD_ARD:
77947849 printf (" %s, %s, %s" , emitRegName (id->idReg1 (), attr), emitRegName (id->idReg2 (), attr), sstr);
77957850 emitDispAddrMode (id);
@@ -8166,6 +8221,32 @@ void emitter::emitDispIns(
81668221 break ;
81678222 }
81688223
8224+ case IF_MWR_RRD_CNS:
8225+ {
8226+ assert (ins == INS_vextracti128 || ins == INS_vextractf128);
8227+ // vextracti/f128 extracts 128-bit data, so we fix sstr as "xmm ptr"
8228+ sstr = codeGen->genSizeStr (EA_ATTR (16 ));
8229+ printf (sstr);
8230+ offs = emitGetInsDsp (id);
8231+ emitDispClsVar (id->idAddr ()->iiaFieldHnd , offs, ID_INFO_DSP_RELOC);
8232+ printf (" , %s" , emitRegName (id->idReg1 (), attr));
8233+ emitGetInsDcmCns (id, &cnsVal);
8234+
8235+ val = cnsVal.cnsVal ;
8236+ printf (" , " );
8237+
8238+ if (cnsVal.cnsReloc )
8239+ {
8240+ emitDispReloc (val);
8241+ }
8242+ else
8243+ {
8244+ goto PRINT_CONSTANT;
8245+ }
8246+
8247+ break ;
8248+ }
8249+
81698250 case IF_RWR_RRD_MRD:
81708251 printf (" %s, %s, %s" , emitRegName (id->idReg1 (), attr), emitRegName (id->idReg2 (), attr), sstr);
81718252 offs = emitGetInsDsp (id);
@@ -12218,6 +12299,15 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1221812299 sz = emitSizeOfInsDsc (id);
1221912300 break ;
1222012301
12302+ case IF_AWR_RRD_CNS:
12303+ assert (ins == INS_vextracti128 || ins == INS_vextractf128);
12304+ assert (UseVEXEncoding ());
12305+ emitGetInsAmdCns (id, &cnsVal);
12306+ code = insCodeMR (ins);
12307+ dst = emitOutputAM (dst, id, code, &cnsVal);
12308+ sz = emitSizeOfInsDsc (id);
12309+ break ;
12310+
1222112311 case IF_RRD_ARD:
1222212312 case IF_RWR_ARD:
1222312313 case IF_RRW_ARD:
@@ -12530,6 +12620,17 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1253012620 sz = emitSizeOfInsDsc (id);
1253112621 break ;
1253212622
12623+ case IF_MWR_RRD_CNS:
12624+ assert (ins == INS_vextracti128 || ins == INS_vextractf128);
12625+ assert (UseVEXEncoding ());
12626+ emitGetInsDcmCns (id, &cnsVal);
12627+ code = insCodeMR (ins);
12628+ // only AVX2 vextracti128 and AVX vextractf128 can reach this path,
12629+ // they do not need VEX.vvvv to encode the register operand
12630+ dst = emitOutputCV (dst, id, code, &cnsVal);
12631+ sz = emitSizeOfInsDsc (id);
12632+ break ;
12633+
1253312634 case IF_RRD_MRD:
1253412635 case IF_RWR_MRD:
1253512636 case IF_RRW_MRD:
0 commit comments