[llvm] [AArch64][PAC] Select auth+load into LDRAA/LDRAB/LDRA[pre]. (PR #123769)
Daniil Kovalev via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 27 04:03:33 PST 2025
================
@@ -2159,6 +2163,111 @@ void AArch64AsmPrinter::emitPtrauthBranch(const MachineInstr *MI) {
EmitToStreamer(*OutStreamer, BRInst);
}
+void AArch64AsmPrinter::LowerPtrauthAuthLoad(const MachineInstr &MI) {
+ const bool IsPreWB = MI.getOpcode() == AArch64::LDRApre;
+
+ const unsigned DstReg = MI.getOperand(0).getReg();
+ const int64_t Offset = MI.getOperand(1).getImm();
+ const auto Key = (AArch64PACKey::ID)MI.getOperand(2).getImm();
+ const uint64_t Disc = MI.getOperand(3).getImm();
+ const unsigned AddrDisc = MI.getOperand(4).getReg();
+
+ Register DiscReg = emitPtrauthDiscriminator(Disc, AddrDisc, AArch64::X17);
+
+ unsigned AUTOpc = getAUTOpcodeForKey(Key, DiscReg == AArch64::XZR);
+ auto MIB = MCInstBuilder(AUTOpc).addReg(AArch64::X16).addReg(AArch64::X16);
+ if (DiscReg != AArch64::XZR)
+ MIB.addReg(DiscReg);
+
+ EmitToStreamer(MIB);
+
+ // We have a few options for offset folding:
+ // - writeback, 0 offset (we already wrote the AUT result): LDRXui
+ // - no wb, uimm12s8 offset (including 0): LDRXui
+ if (!Offset || (!IsPreWB && isShiftedUInt<12, 3>(Offset))) {
+ EmitToStreamer(MCInstBuilder(AArch64::LDRXui)
+ .addReg(DstReg)
+ .addReg(AArch64::X16)
+ .addImm(Offset / 8));
+ return;
+ }
+
+ // - no wb, simm9 offset: LDURXi
+ if (!IsPreWB && isInt<9>(Offset)) {
+ EmitToStreamer(MCInstBuilder(AArch64::LDURXi)
+ .addReg(DstReg)
+ .addReg(AArch64::X16)
+ .addImm(Offset));
+ return;
+ }
+
+ // - pre-indexed wb, simm9 offset: LDRXpre
+ if (IsPreWB && isInt<9>(Offset)) {
+ EmitToStreamer(MCInstBuilder(AArch64::LDRXpre)
+ .addReg(AArch64::X16)
+ .addReg(DstReg)
+ .addReg(AArch64::X16)
+ .addImm(Offset));
+ return;
+ }
+
+ // Finally, in the general case, we need a MOVimm either way.
+ SmallVector<AArch64_IMM::ImmInsnModel, 4> ImmInsns;
+ AArch64_IMM::expandMOVImm(Offset, 64, ImmInsns);
+
+ // X17 is dead at this point, use it as the offset register
+ for (auto &ImmI : ImmInsns) {
----------------
kovdan01 wrote:
```suggestion
for (const auto &ImmI : ImmInsns) {
```
https://github.com/llvm/llvm-project/pull/123769
More information about the llvm-commits
mailing list