diff options
Diffstat (limited to 'llvm/lib/Target/Sparc/MCTargetDesc')
| -rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp | 20 | 
3 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp index f6c58165497..d0621c1c795 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp @@ -39,6 +39,12 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {    case Sparc::fixup_sparc_br19:      return (Value >> 2) & 0x7ffff; +  case Sparc::fixup_sparc_br16_2: +    return (Value >> 2) & 0xc000; + +  case Sparc::fixup_sparc_br16_14: +    return (Value >> 2) & 0x3fff; +    case Sparc::fixup_sparc_pc22:    case Sparc::fixup_sparc_got22:    case Sparc::fixup_sparc_tls_gd_hi22: @@ -106,6 +112,8 @@ namespace {          { "fixup_sparc_call30",     2,     30,  MCFixupKindInfo::FKF_IsPCRel },          { "fixup_sparc_br22",      10,     22,  MCFixupKindInfo::FKF_IsPCRel },          { "fixup_sparc_br19",      13,     19,  MCFixupKindInfo::FKF_IsPCRel }, +        { "fixup_sparc_br16_2",    10,      2,  MCFixupKindInfo::FKF_IsPCRel }, +        { "fixup_sparc_br16_14",   18,     14,  MCFixupKindInfo::FKF_IsPCRel },          { "fixup_sparc_hi22",      10,     22,  0 },          { "fixup_sparc_lo10",      22,     10,  0 },          { "fixup_sparc_h44",       10,     22,  0 }, diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h index 005a0242dc9..d42bcee6b3c 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h @@ -26,6 +26,10 @@ namespace llvm {        /// branches on icc/xcc        fixup_sparc_br19, +      /// fixup_sparc_bpr  - 16-bit fixup for bpr +      fixup_sparc_br16_2, +      fixup_sparc_br16_14, +        /// fixup_sparc_hi22  - 22-bit fixup corresponding to %hi(foo)        /// for sethi        fixup_sparc_hi22, diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp index 96665ef2454..310fbd913c7 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp @@ -64,6 +64,10 @@ public:    unsigned getBranchPredTargetOpValue(const MCInst &MI, unsigned OpNo,                                        SmallVectorImpl<MCFixup> &Fixups,                                        const MCSubtargetInfo &STI) const; +  unsigned getBranchOnRegTargetOpValue(const MCInst &MI, unsigned OpNo, +                                       SmallVectorImpl<MCFixup> &Fixups, +                                       const MCSubtargetInfo &STI) const; +  };  } // end anonymous namespace @@ -192,6 +196,22 @@ getBranchPredTargetOpValue(const MCInst &MI, unsigned OpNo,                                     (MCFixupKind)Sparc::fixup_sparc_br19));    return 0;  } +unsigned SparcMCCodeEmitter:: +getBranchOnRegTargetOpValue(const MCInst &MI, unsigned OpNo, +                           SmallVectorImpl<MCFixup> &Fixups, +                           const MCSubtargetInfo &STI) const { +  const MCOperand &MO = MI.getOperand(OpNo); +  if (MO.isReg() || MO.isImm()) +    return getMachineOpValue(MI, MO, Fixups, STI); + +  Fixups.push_back(MCFixup::Create(0, MO.getExpr(), +                                   (MCFixupKind)Sparc::fixup_sparc_br16_2)); +  Fixups.push_back(MCFixup::Create(0, MO.getExpr(), +                                   (MCFixupKind)Sparc::fixup_sparc_br16_14)); + +  return 0; +} +  #include "SparcGenMCCodeEmitter.inc"  | 

