-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Add ARM64 encodings for groups IF_SVE_CE,CF #98409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
376b4d9
f2cfb1e
fc39e86
028d5c6
9f8fc26
e2299de
1e43376
8fd7a28
d1f8d6d
54b0b75
e88f014
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -1094,6 +1094,52 @@ void emitter::emitInsSanityCheck(instrDesc* id) | |||||
| assert(isValidUimm4From1(emitGetInsSC(id))); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2A: // ................ ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| assert(isPredicateRegister(id->idReg1())); // DDDD | ||||||
| assert(isVectorRegister(id->idReg2())); // nnnnn | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2B: // .........i...ii. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| assert(isPredicateRegister(id->idReg1())); // DDDD | ||||||
| assert(isVectorRegister(id->idReg2())); // nnnnn | ||||||
| assert(isValidUimm<3>(emitGetInsSC(id))); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2C: // ..............i. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| assert(isPredicateRegister(id->idReg1())); // DDDD | ||||||
| assert(isVectorRegister(id->idReg2())); // nnnnn | ||||||
| assert(isValidUimm<1>(emitGetInsSC(id))); // i | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2D: // .............ii. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| assert(isPredicateRegister(id->idReg1())); // DDDD | ||||||
| assert(isVectorRegister(id->idReg2())); // nnnnn | ||||||
| assert(isValidUimm<3>(emitGetInsSC(id))); // ii | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2A: // ................ .......NNNNddddd -- SVE move predicate into vector | ||||||
| assert(isVectorRegister(id->idReg1())); // ddddd | ||||||
| assert(isPredicateRegister(id->idReg2())); // NNNN | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2B: // .........i...ii. .......NNNNddddd -- SVE move predicate into vector | ||||||
| assert(isVectorRegister(id->idReg1())); // ddddd | ||||||
| assert(isPredicateRegister(id->idReg2())); // NNNN | ||||||
| assert(isValidUimm<3>(emitGetInsSC(id))); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2C: // ..............i. .......NNNNddddd -- SVE move predicate into vector | ||||||
| assert(isVectorRegister(id->idReg1())); // ddddd | ||||||
| assert(isPredicateRegister(id->idReg2())); // NNNN | ||||||
| assert(isValidUimm<1>(emitGetInsSC(id))); // i | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2D: // .............ii. .......NNNNddddd -- SVE move predicate into vector | ||||||
| assert(isVectorRegister(id->idReg1())); // ddddd | ||||||
| assert(isPredicateRegister(id->idReg2())); // NNNN | ||||||
| assert(isValidUimm<2>(emitGetInsSC(id))); // ii | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CI_3A: // ........xx..MMMM .......NNNN.DDDD -- SVE permute predicate elements | ||||||
| elemsize = id->idOpSize(); | ||||||
| assert(insOptsScalableStandard(id->idInsOpt())); | ||||||
|
|
@@ -8319,6 +8365,21 @@ void emitter::emitIns_R_R(instruction ins, | |||||
| } | ||||||
| break; | ||||||
|
|
||||||
| case INS_sve_pmov: | ||||||
| if (isPredicateRegister(reg1) && isVectorRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CE_2A; | ||||||
| } | ||||||
| else if (isVectorRegister(reg1) && isPredicateRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CF_2A; | ||||||
| } | ||||||
| else | ||||||
| { | ||||||
| assert(!"invalid instruction"); | ||||||
| } | ||||||
| break; | ||||||
|
|
||||||
| case INS_sve_movs: | ||||||
| { | ||||||
| assert(opt == INS_OPTS_SCALABLE_B); | ||||||
|
|
@@ -9203,6 +9264,48 @@ void emitter::emitIns_R_R_I(instruction ins, | |||||
| fmt = IF_SVE_AM_2A; | ||||||
| break; | ||||||
|
|
||||||
| case INS_sve_pmov: | ||||||
| switch (opt) | ||||||
| { | ||||||
| case INS_OPTS_SCALABLE_D: | ||||||
| assert(isValidUimm3(imm)); | ||||||
|
||||||
| if (isPredicateRegister(reg1) && isVectorRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CE_2B; | ||||||
| } | ||||||
| else if (isVectorRegister(reg1) && isPredicateRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CF_2B; | ||||||
| } | ||||||
| break; | ||||||
| case INS_OPTS_SCALABLE_S: | ||||||
| assert(isValidUimm2(imm)); | ||||||
| if (isPredicateRegister(reg1) && isVectorRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CE_2D; | ||||||
| } | ||||||
| else if (isVectorRegister(reg1) && isPredicateRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CF_2D; | ||||||
| } | ||||||
| break; | ||||||
| case INS_OPTS_SCALABLE_H: | ||||||
| assert(isValidImm1(imm)); | ||||||
| if (isPredicateRegister(reg1) && isVectorRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CE_2C; | ||||||
| } | ||||||
| else if (isVectorRegister(reg1) && isPredicateRegister(reg2)) | ||||||
| { | ||||||
| fmt = IF_SVE_CF_2C; | ||||||
| } | ||||||
| break; | ||||||
| default: | ||||||
| break; | ||||||
| } | ||||||
| assert(fmt != IF_NONE && "invalid combination of size and register type specified"); | ||||||
| break; | ||||||
|
|
||||||
| case INS_sve_sqrshrn: | ||||||
| case INS_sve_sqrshrun: | ||||||
| case INS_sve_uqrshrn: | ||||||
|
|
@@ -17432,6 +17535,10 @@ void emitter::emitIns_Call(EmitCallType callType, | |||||
|
|
||||||
| case IF_SVE_CZ_4A_A: | ||||||
| case IF_SVE_CZ_4A_L: | ||||||
| case IF_SVE_CE_2A: | ||||||
| case IF_SVE_CE_2B: | ||||||
| case IF_SVE_CE_2C: | ||||||
| case IF_SVE_CE_2D: | ||||||
| case IF_SVE_CF_2A: | ||||||
| case IF_SVE_CF_2B: | ||||||
| case IF_SVE_CF_2C: | ||||||
|
|
@@ -21260,6 +21367,68 @@ BYTE* emitter::emitOutput_InstrSve(BYTE* dst, instrDesc* id) | |||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2A: // ................ ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD | ||||||
| code |= insEncodeReg_V_9_to_5(id->idReg2()); // nnnnn | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2B: // .........i...ii. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD | ||||||
| code |= insEncodeReg_V_9_to_5(id->idReg2()); // nnnnn | ||||||
| code |= insEncodeSplitUimm<22, 22, 18, 17>(emitGetInsSC(id)); // i...ii | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2C: // ..............i. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD | ||||||
| code |= insEncodeReg_V_9_to_5(id->idReg2()); // nnnnn | ||||||
| code |= insEncodeUimm<17, 17>(emitGetInsSC(id)); // i | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CE_2D: // .............ii. ......nnnnn.DDDD -- SVE move predicate from vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD | ||||||
| code |= insEncodeReg_V_9_to_5(id->idReg2()); // nnnnn | ||||||
| code |= insEncodeUimm<18, 17>(emitGetInsSC(id)); // ii | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2A: // ................ .......NNNNddddd -- SVE move predicate into vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_V_4_to_0(id->idReg1()); // ddddd | ||||||
| code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2B: // .........i...ii. .......NNNNddddd -- SVE move predicate into vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_V_4_to_0(id->idReg1()); // ddddd | ||||||
| code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN | ||||||
| code |= insEncodeSplitUimm<22, 22, 18, 17>(emitGetInsSC(id)); // i...ii | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2C: // ..............i. .......NNNNddddd -- SVE move predicate into vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_V_4_to_0(id->idReg1()); // ddddd | ||||||
| code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN | ||||||
| code |= insEncodeUimm<17, 17>(emitGetInsSC(id)); // i | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CF_2D: // .............ii. .......NNNNddddd -- SVE move predicate into vector | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_V_4_to_0(id->idReg1()); // ddddd | ||||||
| code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN | ||||||
| code |= insEncodeUimm<18, 17>(emitGetInsSC(id)); // ii | ||||||
| dst += emitOutput_Instr(dst, code); | ||||||
| break; | ||||||
|
|
||||||
| case IF_SVE_CI_3A: // ........xx..MMMM .......NNNN.DDDD -- SVE permute predicate elements | ||||||
| code = emitInsCodeSve(ins, fmt); | ||||||
| code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD | ||||||
|
|
@@ -22725,6 +22894,18 @@ void emitter::emitDispReg(regNumber reg, emitAttr attr, bool addComma) | |||||
| emitDispComma(); | ||||||
| } | ||||||
|
|
||||||
| //------------------------------------------------------------------------ | ||||||
| // emitDispSveReg: Display a scalable vector register name | ||||||
| // | ||||||
| void emitter::emitDispSveReg(regNumber reg, bool addComma) | ||||||
| { | ||||||
| assert(isVectorRegister(reg)); | ||||||
| printf("%s", emitSveRegName(reg)); | ||||||
|
||||||
| printf("%s", emitSveRegName(reg)); | |
| printf(emitSveRegName(reg)); |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| printf("%s", emitSveRegName(reg)); | |
| printf(emitSveRegName(reg)); |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: we have emitDispElementIndex which will do this.
So something like this:
//------------------------------------------------------------------------
// emitDispSveRegIndex: Display a scalable vector register with indexed element
//
void emitter::emitDispSveRegIndex(regNumber reg, ssize_t index, bool addComma)
{
assert(isVectorRegister(reg));
printf("%s", emitSveRegName(reg));
emitDispElementIndex(index, addComma);
}
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| printf("[%d]", static_cast<int>(index)); | |
| printf("[%d]", (int)index); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
might be better to rewrite this switch/case something like this: