@@ -530,6 +530,10 @@ class MCCFIInstruction {
530530 OpGnuArgsSize,
531531 OpLabel,
532532 OpValOffset,
533+ OpLLVMRegisterPair,
534+ OpLLVMVectorRegisters,
535+ OpLLVMVectorOffset,
536+ OpLLVMVectorRegisterMask,
533537 };
534538
535539 // Held in ExtraFields for most common OpTypes, exceptions follow.
@@ -548,10 +552,45 @@ class MCCFIInstruction {
548552 struct LabelFields {
549553 MCSymbol *CfiLabel = nullptr ;
550554 };
555+ // / Held in ExtraFields when OpLLVMRegisterPair.
556+ struct RegisterPairFields {
557+ unsigned Register;
558+ unsigned Reg1, Reg2;
559+ unsigned Reg1SizeInBits, Reg2SizeInBits;
560+ };
561+ struct VectorRegisterWithLane {
562+ unsigned Register;
563+ unsigned Lane;
564+ unsigned SizeInBits;
565+ };
566+ // / Held in ExtraFields when OpLLVMVectorRegisters.
567+ struct VectorRegistersFields {
568+ unsigned Register;
569+ std::vector<VectorRegisterWithLane> VectorRegisters;
570+ };
571+ // / Held in ExtraFields when OpLLVMVectorOffset.
572+ struct VectorOffsetFields {
573+ unsigned Register;
574+ unsigned RegisterSizeInBits;
575+ int64_t Offset;
576+ unsigned MaskRegister;
577+ unsigned MaskRegisterSizeInBits;
578+ };
579+ // / Held in ExtraFields when OpLLVMVectorRegisterMask.
580+ struct VectorRegisterMaskFields {
581+ unsigned Register;
582+ unsigned SpillRegister;
583+ unsigned SpillRegisterLaneSizeInBits;
584+ unsigned MaskRegister;
585+ unsigned MaskRegisterSizeInBits;
586+ };
551587
552588private:
553589 MCSymbol *Label;
554- std::variant<CommonFields, EscapeFields, LabelFields> ExtraFields;
590+ std::variant<CommonFields, EscapeFields, LabelFields, RegisterPairFields,
591+ VectorRegistersFields, VectorOffsetFields,
592+ VectorRegisterMaskFields>
593+ ExtraFields;
555594 OpType Operation;
556595 SMLoc Loc;
557596
@@ -694,6 +733,57 @@ class MCCFIInstruction {
694733 return {OpLabel, L, LabelFields{CfiLabel}, Loc};
695734 }
696735
736+ // / .cfi_llvm_register_pair Previous value of Register is saved in R1:R2.
737+ static MCCFIInstruction
738+ createLLVMRegisterPair (MCSymbol *L, unsigned Register, unsigned R1,
739+ unsigned R1SizeInBits, unsigned R2,
740+ unsigned R2SizeInBits, SMLoc Loc = {}) {
741+ RegisterPairFields Extra{Register, R1, R2, R1SizeInBits, R2SizeInBits};
742+ return {OpLLVMRegisterPair, L, Extra, Loc};
743+ }
744+
745+ // / .cfi_llvm_vector_registers Previous value of Register is saved in lanes of
746+ // / vector registers.
747+ static MCCFIInstruction
748+ createLLVMVectorRegisters (MCSymbol *L, unsigned Register,
749+ std::vector<VectorRegisterWithLane> VectorRegisters,
750+ SMLoc Loc = {}) {
751+ VectorRegistersFields Extra{Register, std::move (VectorRegisters)};
752+ return {OpLLVMVectorRegisters, L, std::move (Extra), Loc};
753+ }
754+
755+ // / .cfi_llvm_vector_offset Previous value of Register is saved at Offset from
756+ // / CFA. MaskRegister specifies the active lanes of register.
757+ static MCCFIInstruction
758+ createLLVMVectorOffset (MCSymbol *L, unsigned Register,
759+ unsigned RegisterSizeInBits, unsigned MaskRegister,
760+ unsigned MaskRegisterSizeInBits, int64_t Offset,
761+ SMLoc Loc = {}) {
762+ VectorOffsetFields Extra{Register, RegisterSizeInBits, Offset, MaskRegister,
763+ MaskRegisterSizeInBits};
764+ return MCCFIInstruction (OpLLVMVectorOffset, L, Extra, Loc);
765+ }
766+
767+ // / .cfi_llvm_vector_register_mask Previous value of Register is saved in
768+ // / SpillRegister, predicated on the value of MaskRegister.
769+ static MCCFIInstruction createLLVMVectorRegisterMask (
770+ MCSymbol *L, unsigned Register, unsigned SpillRegister,
771+ unsigned SpillRegisterLaneSizeInBits, unsigned MaskRegister,
772+ unsigned MaskRegisterSizeInBits, SMLoc Loc = {}) {
773+ VectorRegisterMaskFields Extra{
774+ Register, SpillRegister, SpillRegisterLaneSizeInBits,
775+ MaskRegister, MaskRegisterSizeInBits,
776+ };
777+ return MCCFIInstruction (OpLLVMVectorRegisterMask, L, Extra, Loc);
778+ }
779+
780+ template <class ExtraFieldsTy > ExtraFieldsTy &getExtraFields () {
781+ return std::get<ExtraFieldsTy>(ExtraFields);
782+ }
783+
784+ template <class ExtraFieldsTy > const ExtraFieldsTy &getExtraFields () const {
785+ return std::get<ExtraFieldsTy>(ExtraFields);
786+ }
697787 // / .cfi_val_offset Previous value of Register is offset Offset from the
698788 // / current CFA register.
699789 static MCCFIInstruction createValOffset (MCSymbol *L, unsigned Register,
0 commit comments