@@ -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 [add], 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,15 @@ 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
+ dst = emitOutputCV (dst, id, code, &cnsVal);
12629
+ sz = emitSizeOfInsDsc (id);
12630
+ break ;
12631
+
12533
12632
case IF_RRD_MRD:
12534
12633
case IF_RWR_MRD:
12535
12634
case IF_RRW_MRD:
0 commit comments