annotate lib/Target/AVR/AVRInstrInfo.h @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===-- AVRInstrInfo.h - AVR Instruction Information ------------*- C++ -*-===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 // This file contains the AVR implementation of the TargetInstrInfo class.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 #ifndef LLVM_AVR_INSTR_INFO_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #define LLVM_AVR_INSTR_INFO_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
16 #include "llvm/CodeGen/TargetInstrInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 #include "AVRRegisterInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 #define GET_INSTRINFO_HEADER
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 #include "AVRGenInstrInfo.inc"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 #undef GET_INSTRINFO_HEADER
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 namespace AVRCC {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 /// AVR specific condition codes.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 /// These correspond to `AVR_*_COND` in `AVRInstrInfo.td`.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 /// They must be kept in synch.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 enum CondCodes {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 COND_EQ, //!< Equal
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 COND_NE, //!< Not equal
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 COND_GE, //!< Greater than or equal
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 COND_LT, //!< Less than
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 COND_SH, //!< Unsigned same or higher
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 COND_LO, //!< Unsigned lower
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 COND_MI, //!< Minus
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 COND_PL, //!< Plus
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 COND_INVALID
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 } // end of namespace AVRCC
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 namespace AVRII {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 /// Specifies a target operand flag.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 enum TOF {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 MO_NO_FLAG,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 /// On a symbol operand, this represents the lo part.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 MO_LO = (1 << 1),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 /// On a symbol operand, this represents the hi part.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 MO_HI = (1 << 2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 /// On a symbol operand, this represents it has to be negated.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 MO_NEG = (1 << 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 } // end of namespace AVRII
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 /// Utilities related to the AVR instruction set.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 class AVRInstrInfo : public AVRGenInstrInfo {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 public:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 explicit AVRInstrInfo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 const AVRRegisterInfo &getRegisterInfo() const { return RI; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 const MCInstrDesc &getBrCond(AVRCC::CondCodes CC) const;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 AVRCC::CondCodes getCondFromBranchOpc(unsigned Opc) const;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 AVRCC::CondCodes getOppositeCondition(AVRCC::CondCodes CC) const;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 bool KillSrc) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 void storeRegToStackSlot(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 MachineBasicBlock::iterator MI, unsigned SrcReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 bool isKill, int FrameIndex,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 const TargetRegisterClass *RC,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 const TargetRegisterInfo *TRI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 void loadRegFromStackSlot(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 MachineBasicBlock::iterator MI, unsigned DestReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 int FrameIndex, const TargetRegisterClass *RC,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 const TargetRegisterInfo *TRI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 unsigned isLoadFromStackSlot(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 int &FrameIndex) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 unsigned isStoreToStackSlot(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 int &FrameIndex) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 // Branch analysis.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 MachineBasicBlock *&FBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 SmallVectorImpl<MachineOperand> &Cond,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 bool AllowModify = false) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 const DebugLoc &DL,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 int *BytesAdded = nullptr) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 unsigned removeBranch(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 int *BytesRemoved = nullptr) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 bool
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105 MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
106
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
107 bool isBranchOffsetInRange(unsigned BranchOpc,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
108 int64_t BrOffset) const override;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
109
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
110 unsigned insertIndirectBranch(MachineBasicBlock &MBB,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
111 MachineBasicBlock &NewDestBB,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
112 const DebugLoc &DL,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
113 int64_t BrOffset,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114 RegScavenger *RS) const override;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 private:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 const AVRRegisterInfo RI;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 } // end namespace llvm
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 #endif // LLVM_AVR_INSTR_INFO_H