@@ -2730,6 +2730,9 @@ emitter::insFormat emitter::emitMapFmtAtoM(insFormat fmt)
2730
2730
case IF_ARW_CNS:
2731
2731
return IF_MRW_CNS;
2732
2732
2733
+ case IF_AWR_RRD_CNS:
2734
+ return IF_MWR_RRD_CNS;
2735
+
2733
2736
case IF_ARW_SHF:
2734
2737
return IF_MRW_SHF;
2735
2738
@@ -5067,6 +5070,32 @@ void emitter::emitIns_AR_R(instruction ins, emitAttr attr, regNumber ireg, regNu
5067
5070
emitAdjustStackDepthPushPop(ins);
5068
5071
}
5069
5072
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
+
5070
5099
void emitter::emitIns_AI_R(instruction ins, emitAttr attr, regNumber ireg, ssize_t disp)
5071
5100
{
5072
5101
UNATIVE_OFFSET sz;
@@ -7790,6 +7819,32 @@ void emitter::emitDispIns(
7790
7819
break;
7791
7820
}
7792
7821
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
+
7793
7848
case IF_RWR_RRD_ARD:
7794
7849
printf("%s, %s, %s", emitRegName(id->idReg1(), attr), emitRegName(id->idReg2(), attr), sstr);
7795
7850
emitDispAddrMode(id);
@@ -8166,6 +8221,32 @@ void emitter::emitDispIns(
8166
8221
break;
8167
8222
}
8168
8223
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
+
8169
8250
case IF_RWR_RRD_MRD:
8170
8251
printf("%s, %s, %s", emitRegName(id->idReg1(), attr), emitRegName(id->idReg2(), attr), sstr);
8171
8252
offs = emitGetInsDsp(id);
@@ -12218,6 +12299,15 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
12218
12299
sz = emitSizeOfInsDsc(id);
12219
12300
break;
12220
12301
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
+
12221
12311
case IF_RRD_ARD:
12222
12312
case IF_RWR_ARD:
12223
12313
case IF_RRW_ARD:
@@ -12530,6 +12620,17 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
12530
12620
sz = emitSizeOfInsDsc(id);
12531
12621
break;
12532
12622
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
+
12533
12634
case IF_RRD_MRD:
12534
12635
case IF_RWR_MRD:
12535
12636
case IF_RRW_MRD:
0 commit comments