Home | History | Annotate | Download | only in MCTargetDesc
      1 //===- MipsMCCodeEmitter.h - Convert Mips Code to Machine Code --*- 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 // This file defines the MipsMCCodeEmitter class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
     15 #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
     16 
     17 #include "llvm/MC/MCCodeEmitter.h"
     18 #include <cstdint>
     19 
     20 namespace llvm {
     21 
     22 class MCContext;
     23 class MCExpr;
     24 class MCFixup;
     25 class MCInst;
     26 class MCInstrInfo;
     27 class MCOperand;
     28 class MCSubtargetInfo;
     29 class raw_ostream;
     30 
     31 class MipsMCCodeEmitter : public MCCodeEmitter {
     32   const MCInstrInfo &MCII;
     33   MCContext &Ctx;
     34   bool IsLittleEndian;
     35 
     36   bool isMicroMips(const MCSubtargetInfo &STI) const;
     37   bool isMips32r6(const MCSubtargetInfo &STI) const;
     38 
     39 public:
     40   MipsMCCodeEmitter(const MCInstrInfo &mcii, MCContext &Ctx_, bool IsLittle)
     41       : MCII(mcii), Ctx(Ctx_), IsLittleEndian(IsLittle) {}
     42   MipsMCCodeEmitter(const MipsMCCodeEmitter &) = delete;
     43   MipsMCCodeEmitter &operator=(const MipsMCCodeEmitter &) = delete;
     44   ~MipsMCCodeEmitter() override = default;
     45 
     46   void EmitByte(unsigned char C, raw_ostream &OS) const;
     47 
     48   void EmitInstruction(uint64_t Val, unsigned Size, const MCSubtargetInfo &STI,
     49                        raw_ostream &OS) const;
     50 
     51   void encodeInstruction(const MCInst &MI, raw_ostream &OS,
     52                          SmallVectorImpl<MCFixup> &Fixups,
     53                          const MCSubtargetInfo &STI) const override;
     54 
     55   // getBinaryCodeForInstr - TableGen'erated function for getting the
     56   // binary encoding for an instruction.
     57   uint64_t getBinaryCodeForInstr(const MCInst &MI,
     58                                  SmallVectorImpl<MCFixup> &Fixups,
     59                                  const MCSubtargetInfo &STI) const;
     60 
     61   // getJumpTargetOpValue - Return binary encoding of the jump
     62   // target operand. If the machine operand requires relocation,
     63   // record the relocation and return zero.
     64   unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo,
     65                                 SmallVectorImpl<MCFixup> &Fixups,
     66                                 const MCSubtargetInfo &STI) const;
     67 
     68   // getBranchJumpOpValueMM - Return binary encoding of the microMIPS jump
     69   // target operand. If the machine operand requires relocation,
     70   // record the relocation and return zero.
     71   unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo,
     72                                   SmallVectorImpl<MCFixup> &Fixups,
     73                                   const MCSubtargetInfo &STI) const;
     74 
     75   // getUImm5Lsl2Encoding - Return binary encoding of the microMIPS jump
     76   // target operand.
     77   unsigned getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo,
     78                                 SmallVectorImpl<MCFixup> &Fixups,
     79                                 const MCSubtargetInfo &STI) const;
     80 
     81   unsigned getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo,
     82                              SmallVectorImpl<MCFixup> &Fixups,
     83                              const MCSubtargetInfo &STI) const;
     84 
     85   unsigned getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo,
     86                                 SmallVectorImpl<MCFixup> &Fixups,
     87                                 const MCSubtargetInfo &STI) const;
     88 
     89   // getSImm9AddiuspValue - Return binary encoding of the microMIPS addiusp
     90   // instruction immediate operand.
     91   unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo,
     92                                 SmallVectorImpl<MCFixup> &Fixups,
     93                                 const MCSubtargetInfo &STI) const;
     94 
     95   // getBranchTargetOpValue - Return binary encoding of the branch
     96   // target operand. If the machine operand requires relocation,
     97   // record the relocation and return zero.
     98   unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
     99                                   SmallVectorImpl<MCFixup> &Fixups,
    100                                   const MCSubtargetInfo &STI) const;
    101 
    102   // getBranchTargetOpValue1SImm16 - Return binary encoding of the branch
    103   // target operand. If the machine operand requires relocation,
    104   // record the relocation and return zero.
    105   unsigned getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo,
    106                                          SmallVectorImpl<MCFixup> &Fixups,
    107                                          const MCSubtargetInfo &STI) const;
    108 
    109   // getBranchTargetOpValueMMR6 - Return binary encoding of the branch
    110   // target operand. If the machine operand requires relocation,
    111   // record the relocation and return zero.
    112   unsigned getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo,
    113                                       SmallVectorImpl<MCFixup> &Fixups,
    114                                       const MCSubtargetInfo &STI) const;
    115 
    116   // getBranchTargetOpValueLsl2MMR6 - Return binary encoding of the branch
    117   // target operand. If the machine operand requires relocation,
    118   // record the relocation and return zero.
    119   unsigned getBranchTargetOpValueLsl2MMR6(const MCInst &MI, unsigned OpNo,
    120                                           SmallVectorImpl<MCFixup> &Fixups,
    121                                           const MCSubtargetInfo &STI) const;
    122 
    123   // getBranchTarget7OpValue - Return binary encoding of the microMIPS branch
    124   // target operand. If the machine operand requires relocation,
    125   // record the relocation and return zero.
    126   unsigned getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo,
    127                                      SmallVectorImpl<MCFixup> &Fixups,
    128                                      const MCSubtargetInfo &STI) const;
    129 
    130   // getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS
    131   // 10-bit branch target operand. If the machine operand requires relocation,
    132   // record the relocation and return zero.
    133   unsigned getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo,
    134                                         SmallVectorImpl<MCFixup> &Fixups,
    135                                         const MCSubtargetInfo &STI) const;
    136 
    137   // getBranchTargetOpValue - Return binary encoding of the microMIPS branch
    138   // target operand. If the machine operand requires relocation,
    139   // record the relocation and return zero.
    140   unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo,
    141                                     SmallVectorImpl<MCFixup> &Fixups,
    142                                     const MCSubtargetInfo &STI) const;
    143 
    144   // getBranchTarget21OpValue - Return binary encoding of the branch
    145   // offset operand. If the machine operand requires relocation,
    146   // record the relocation and return zero.
    147   unsigned getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo,
    148                                    SmallVectorImpl<MCFixup> &Fixups,
    149                                    const MCSubtargetInfo &STI) const;
    150 
    151   // getBranchTarget21OpValueMM - Return binary encoding of the branch
    152   // offset operand for microMIPS. If the machine operand requires
    153   // relocation,record the relocation and return zero.
    154   unsigned getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo,
    155                                       SmallVectorImpl<MCFixup> &Fixups,
    156                                       const MCSubtargetInfo &STI) const;
    157 
    158   // getBranchTarget26OpValue - Return binary encoding of the branch
    159   // offset operand. If the machine operand requires relocation,
    160   // record the relocation and return zero.
    161   unsigned getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo,
    162                                     SmallVectorImpl<MCFixup> &Fixups,
    163                                     const MCSubtargetInfo &STI) const;
    164 
    165   // getBranchTarget26OpValueMM - Return binary encoding of the branch
    166   // offset operand. If the machine operand requires relocation,
    167   // record the relocation and return zero.
    168   unsigned getBranchTarget26OpValueMM(const MCInst &MI, unsigned OpNo,
    169                                       SmallVectorImpl<MCFixup> &Fixups,
    170                                       const MCSubtargetInfo &STI) const;
    171 
    172   // getJumpOffset16OpValue - Return binary encoding of the jump
    173   // offset operand. If the machine operand requires relocation,
    174   // record the relocation and return zero.
    175   unsigned getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo,
    176                                   SmallVectorImpl<MCFixup> &Fixups,
    177                                   const MCSubtargetInfo &STI) const;
    178 
    179   // getMachineOpValue - Return binary encoding of operand. If the machin
    180   // operand requires relocation, record the relocation and return zero.
    181   unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO,
    182                              SmallVectorImpl<MCFixup> &Fixups,
    183                              const MCSubtargetInfo &STI) const;
    184 
    185   unsigned getMSAMemEncoding(const MCInst &MI, unsigned OpNo,
    186                              SmallVectorImpl<MCFixup> &Fixups,
    187                              const MCSubtargetInfo &STI) const;
    188 
    189   template <unsigned ShiftAmount = 0>
    190   unsigned getMemEncoding(const MCInst &MI, unsigned OpNo,
    191                           SmallVectorImpl<MCFixup> &Fixups,
    192                           const MCSubtargetInfo &STI) const;
    193   unsigned getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo,
    194                                 SmallVectorImpl<MCFixup> &Fixups,
    195                                 const MCSubtargetInfo &STI) const;
    196   unsigned getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo,
    197                                     SmallVectorImpl<MCFixup> &Fixups,
    198                                     const MCSubtargetInfo &STI) const;
    199   unsigned getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo,
    200                                     SmallVectorImpl<MCFixup> &Fixups,
    201                                     const MCSubtargetInfo &STI) const;
    202   unsigned getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo,
    203                                       SmallVectorImpl<MCFixup> &Fixups,
    204                                       const MCSubtargetInfo &STI) const;
    205   unsigned getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo,
    206                                       SmallVectorImpl<MCFixup> &Fixups,
    207                                       const MCSubtargetInfo &STI) const;
    208   unsigned getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo,
    209                                 SmallVectorImpl<MCFixup> &Fixups,
    210                                 const MCSubtargetInfo &STI) const;
    211   unsigned getMemEncodingMMImm11(const MCInst &MI, unsigned OpNo,
    212                                  SmallVectorImpl<MCFixup> &Fixups,
    213                                  const MCSubtargetInfo &STI) const;
    214   unsigned getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo,
    215                                  SmallVectorImpl<MCFixup> &Fixups,
    216                                  const MCSubtargetInfo &STI) const;
    217   unsigned getMemEncodingMMImm16(const MCInst &MI, unsigned OpNo,
    218                                  SmallVectorImpl<MCFixup> &Fixups,
    219                                  const MCSubtargetInfo &STI) const;
    220   unsigned getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo,
    221                                   SmallVectorImpl<MCFixup> &Fixups,
    222                                   const MCSubtargetInfo &STI) const;
    223   unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo,
    224                               SmallVectorImpl<MCFixup> &Fixups,
    225                               const MCSubtargetInfo &STI) const;
    226 
    227   /// Subtract Offset then encode as a N-bit unsigned integer.
    228   template <unsigned Bits, int Offset>
    229   unsigned getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo,
    230                                      SmallVectorImpl<MCFixup> &Fixups,
    231                                      const MCSubtargetInfo &STI) const;
    232 
    233   unsigned getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo,
    234                                  SmallVectorImpl<MCFixup> &Fixups,
    235                                  const MCSubtargetInfo &STI) const;
    236 
    237   unsigned getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo,
    238                                  SmallVectorImpl<MCFixup> &Fixups,
    239                                  const MCSubtargetInfo &STI) const;
    240 
    241   unsigned getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo,
    242                                 SmallVectorImpl<MCFixup> &Fixups,
    243                                 const MCSubtargetInfo &STI) const;
    244   unsigned getUImm4AndValue(const MCInst &MI, unsigned OpNo,
    245                             SmallVectorImpl<MCFixup> &Fixups,
    246                             const MCSubtargetInfo &STI) const;
    247 
    248   unsigned getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo,
    249                                   SmallVectorImpl<MCFixup> &Fixups,
    250                                   const MCSubtargetInfo &STI) const;
    251   unsigned getMovePRegSingleOpValue(const MCInst &MI, unsigned OpNo,
    252                                     SmallVectorImpl<MCFixup> &Fixups,
    253                                     const MCSubtargetInfo &STI) const;
    254 
    255   unsigned getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo,
    256                                  SmallVectorImpl<MCFixup> &Fixups,
    257                                  const MCSubtargetInfo &STI) const;
    258 
    259   unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups,
    260                           const MCSubtargetInfo &STI) const;
    261 
    262   unsigned getRegisterListOpValue(const MCInst &MI, unsigned OpNo,
    263                                   SmallVectorImpl<MCFixup> &Fixups,
    264                                   const MCSubtargetInfo &STI) const;
    265 
    266   unsigned getRegisterListOpValue16(const MCInst &MI, unsigned OpNo,
    267                                     SmallVectorImpl<MCFixup> &Fixups,
    268                                     const MCSubtargetInfo &STI) const;
    269 
    270 private:
    271   void LowerCompactBranch(MCInst& Inst) const;
    272 };
    273 
    274 } // end namespace llvm
    275 
    276 #endif // LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCCODEEMITTER_H
    277