Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- AVRFixupKinds.h - AVR Specific Fixup Entries ------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_AVR_FIXUP_KINDS_H
     11 #define LLVM_AVR_FIXUP_KINDS_H
     12 
     13 #include "llvm/MC/MCFixup.h"
     14 
     15 namespace llvm {
     16 namespace AVR {
     17 
     18 /// The set of supported fixups.
     19 ///
     20 /// Although most of the current fixup types reflect a unique relocation
     21 /// one can have multiple fixup types for a given relocation and thus need
     22 /// to be uniquely named.
     23 ///
     24 /// \note This table *must* be in the same order of
     25 ///       MCFixupKindInfo Infos[AVR::NumTargetFixupKinds]
     26 ///       in `AVRAsmBackend.cpp`.
     27 enum Fixups {
     28   /// A 32-bit AVR fixup.
     29   fixup_32 = FirstTargetFixupKind,
     30 
     31   /// A 7-bit PC-relative fixup for the family of conditional
     32   /// branches which take 7-bit targets (BRNE,BRGT,etc).
     33   fixup_7_pcrel,
     34   /// A 12-bit PC-relative fixup for the family of branches
     35   /// which take 12-bit targets (RJMP,RCALL,etc).
     36   /// \note Although the fixup is labelled as 13 bits, it
     37   ///       is actually only encoded in 12. The reason for
     38   ///       The nonmenclature is that AVR branch targets are
     39   ///       rightshifted by 1, because instructions are always
     40   ///       aligned to 2 bytes, so the 0'th bit is always 0.
     41   ///       This way there is 13-bits of precision.
     42   fixup_13_pcrel,
     43 
     44   /// A 16-bit address.
     45   fixup_16,
     46   /// A 16-bit program memory address.
     47   fixup_16_pm,
     48 
     49   /// Replaces the 8-bit immediate with another value.
     50   fixup_ldi,
     51 
     52   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     53   /// with the lower 8 bits of a 16-bit value (bits 0-7).
     54   fixup_lo8_ldi,
     55   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     56   /// with the upper 8 bits of a 16-bit value (bits 8-15).
     57   fixup_hi8_ldi,
     58   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     59   /// with the upper 8 bits of a 24-bit value (bits 16-23).
     60   fixup_hh8_ldi,
     61   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     62   /// with the upper 8 bits of a 32-bit value (bits 24-31).
     63   fixup_ms8_ldi,
     64 
     65   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     66   /// with the lower 8 bits of a negated 16-bit value (bits 0-7).
     67   fixup_lo8_ldi_neg,
     68   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     69   /// with the upper 8 bits of a negated 16-bit value (bits 8-15).
     70   fixup_hi8_ldi_neg,
     71   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     72   /// with the upper 8 bits of a negated negated 24-bit value (bits 16-23).
     73   fixup_hh8_ldi_neg,
     74   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     75   /// with the upper 8 bits of a negated negated 32-bit value (bits 24-31).
     76   fixup_ms8_ldi_neg,
     77 
     78   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     79   /// with the lower 8 bits of a 16-bit program memory address value (bits 0-7).
     80   fixup_lo8_ldi_pm,
     81   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     82   /// with the upper 8 bits of a 16-bit program memory address value (bits
     83   /// 8-15).
     84   fixup_hi8_ldi_pm,
     85   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     86   /// with the upper 8 bits of a 24-bit program memory address value (bits
     87   /// 16-23).
     88   fixup_hh8_ldi_pm,
     89 
     90   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     91   /// with the lower 8 bits of a negated 16-bit program memory address value
     92   /// (bits 0-7).
     93   fixup_lo8_ldi_pm_neg,
     94   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     95   /// with the upper 8 bits of a negated 16-bit program memory address value
     96   /// (bits 8-15).
     97   fixup_hi8_ldi_pm_neg,
     98   /// Replaces the immediate operand of a 16-bit `Rd, K` instruction
     99   /// with the upper 8 bits of a negated 24-bit program memory address value
    100   /// (bits 16-23).
    101   fixup_hh8_ldi_pm_neg,
    102 
    103   /// A 22-bit fixup for the target of a `CALL k` or `JMP k` instruction.
    104   fixup_call,
    105 
    106   fixup_6,
    107   /// A symbol+addr fixup for the `LDD <x>+<n>, <r>" family of instructions.
    108   fixup_6_adiw,
    109 
    110   fixup_lo8_ldi_gs,
    111   fixup_hi8_ldi_gs,
    112 
    113   fixup_8,
    114   fixup_8_lo8,
    115   fixup_8_hi8,
    116   fixup_8_hlo8,
    117 
    118   fixup_diff8,
    119   fixup_diff16,
    120   fixup_diff32,
    121 
    122   fixup_lds_sts_16,
    123 
    124   /// A 6-bit port address.
    125   fixup_port6,
    126   /// A 5-bit port address.
    127   fixup_port5,
    128 
    129   // Marker
    130   LastTargetFixupKind,
    131   NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
    132 };
    133 
    134 namespace fixups {
    135 
    136 /// Adjusts the value of a branch target.
    137 /// All branch targets in AVR are rightshifted by 1 to take advantage
    138 /// of the fact that all instructions are aligned to addresses of size
    139 /// 2, so bit 0 of an address is always 0. This gives us another bit
    140 /// of precision.
    141 /// \param[in,out] The target to adjust.
    142 template <typename T> inline void adjustBranchTarget(T &val) { val >>= 1; }
    143 
    144 } // end of namespace fixups
    145 }
    146 } // end of namespace llvm::AVR
    147 
    148 #endif // LLVM_AVR_FIXUP_KINDS_H
    149