[llvm] Xtensa] Implement windowed call ABI. (PR #130001)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 6 00:33:39 PST 2025
================
@@ -51,6 +58,83 @@ void XtensaFrameLowering::emitPrologue(MachineFunction &MF,
// Round up StackSize to 16*N
StackSize += (16 - StackSize) & 0xf;
+ if (STI.isWinABI()) {
+ StackSize += 32;
+ uint64_t MaxAlignment = MFI.getMaxAlign().value();
+ if(MaxAlignment > 32)
+ StackSize += MaxAlignment;
+
+ if (StackSize <= 32760) {
+ BuildMI(MBB, MBBI, DL, TII.get(Xtensa::ENTRY))
+ .addReg(SP)
+ .addImm(StackSize);
+ } else {
+ /* Use a8 as a temporary since a0-a7 may be live. */
+ unsigned TmpReg = Xtensa::A8;
+
+ const XtensaInstrInfo &TII = *static_cast<const XtensaInstrInfo *>(
+ MBB.getParent()->getSubtarget().getInstrInfo());
+ BuildMI(MBB, MBBI, DL, TII.get(Xtensa::ENTRY))
+ .addReg(SP)
+ .addImm(MIN_FRAME_SIZE);
+ TII.loadImmediate(MBB, MBBI, &TmpReg, StackSize - MIN_FRAME_SIZE);
+ BuildMI(MBB, MBBI, DL, TII.get(Xtensa::SUB), TmpReg)
+ .addReg(SP)
+ .addReg(TmpReg);
+ BuildMI(MBB, MBBI, DL, TII.get(Xtensa::MOVSP), SP).addReg(TmpReg);
+ }
+
+ // Calculate how much is needed to have the correct alignment.
+ // Change offset to: alignment + difference.
+ // For example, in case of alignment of 128:
+ // diff_to_128_aligned_address = (128 - (SP & 127))
+ // new_offset = SP + diff_to_128_aligned_address
+ // This is safe to do because we increased the stack size by MaxAlignment.
+ unsigned Reg, RegMisAlign;
----------------
arsenm wrote:
Use MCRegister type
https://github.com/llvm/llvm-project/pull/130001
More information about the llvm-commits
mailing list