@@ -4355,26 +4355,37 @@ void TagStoreEdit::emitLoop(MachineBasicBlock::iterator InsertI) {
43554355
43564356 int64_t ExtraBaseRegUpdate =
43574357 FrameRegUpdate ? (*FrameRegUpdate - FrameRegOffset.getFixed () - Size) : 0 ;
4358+ LLVM_DEBUG (dbgs () << " TagStoreEdit::emitLoop: LoopSize=" << LoopSize
4359+ << " , Size=" << Size
4360+ << " , ExtraBaseRegUpdate=" << ExtraBaseRegUpdate
4361+ << " , FrameRegUpdate=" << FrameRegUpdate
4362+ << " , FrameRegOffset.getFixed()="
4363+ << FrameRegOffset.getFixed () << " \n " );
43584364 if (LoopSize < Size) {
43594365 assert (FrameRegUpdate);
43604366 assert (Size - LoopSize == 16 );
43614367 // Tag 16 more bytes at BaseReg and update BaseReg.
4368+ int64_t STGOffset = ExtraBaseRegUpdate + 16 ;
4369+ assert (STGOffset % 16 == 0 && STGOffset >= -4096 && STGOffset <= 4080 &&
4370+ " STG immediate out of range" );
43624371 BuildMI (*MBB, InsertI, DL,
43634372 TII->get (ZeroData ? AArch64::STZGPostIndex : AArch64::STGPostIndex))
43644373 .addDef (BaseReg)
43654374 .addReg (BaseReg)
43664375 .addReg (BaseReg)
4367- .addImm (1 + ExtraBaseRegUpdate / 16 )
4376+ .addImm (STGOffset / 16 )
43684377 .setMemRefs (CombinedMemRefs)
43694378 .setMIFlags (FrameRegUpdateFlags);
43704379 } else if (ExtraBaseRegUpdate) {
43714380 // Update BaseReg.
4381+ int64_t AddSubOffset = std::abs (ExtraBaseRegUpdate);
4382+ assert (AddSubOffset <= 4095 && " ADD/SUB immediate out of range" );
43724383 BuildMI (
43734384 *MBB, InsertI, DL,
43744385 TII->get (ExtraBaseRegUpdate > 0 ? AArch64::ADDXri : AArch64::SUBXri))
43754386 .addDef (BaseReg)
43764387 .addReg (BaseReg)
4377- .addImm (std::abs (ExtraBaseRegUpdate) )
4388+ .addImm (AddSubOffset )
43784389 .addImm (0 )
43794390 .setMIFlags (FrameRegUpdateFlags);
43804391 }
0 commit comments