LLVM: lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
15
16using namespace llvm;
17
18#define DEBUG_TYPE "ppcmcexpr"
19
22 return new (Ctx) PPCMCExpr(Kind, Expr);
23}
24
27
28 switch (Kind) {
29 default:
32 OS << "@l";
33 break;
35 OS << "@h";
36 break;
38 OS << "@ha";
39 break;
41 OS << "@high";
42 break;
44 OS << "@higha";
45 break;
47 OS << "@higher";
48 break;
50 OS << "@highera";
51 break;
53 OS << "@highest";
54 break;
56 OS << "@highesta";
57 break;
58 }
59}
60
61bool
64
66 return false;
67
68 if (.isAbsolute())
69 return false;
70
71 Res = evaluateAsInt64(Value.getConstant());
72 return true;
73}
74
75int64_t
76PPCMCExpr::evaluateAsInt64(int64_t Value) const {
77 switch (Kind) {
79 return Value & 0xffff;
81 return (Value >> 16) & 0xffff;
83 return ((Value + 0x8000) >> 16) & 0xffff;
85 return (Value >> 16) & 0xffff;
87 return ((Value + 0x8000) >> 16) & 0xffff;
89 return (Value >> 32) & 0xffff;
91 return ((Value + 0x8000) >> 32) & 0xffff;
93 return (Value >> 48) & 0xffff;
95 return ((Value + 0x8000) >> 48) & 0xffff;
97 break;
98 }
100}
101
105
107 return false;
108
109 if (Value.isAbsolute()) {
110 int64_t Result = evaluateAsInt64(Value.getConstant());
112 bool IsHalf16DS =
114 bool IsHalf16DQ =
116 bool IsHalf = IsHalf16 || IsHalf16DS || IsHalf16DQ;
117
118 if (!IsHalf && Result >= 0x8000)
119 return false;
120 if ((IsHalf16DS && (Result & 0x3)) || (IsHalf16DQ && (Result & 0xf)))
121 return false;
122
124 } else {
125 if (!Asm || !Asm->hasLayout())
126 return false;
127
128 MCContext &Context = Asm->getContext();
132 return false;
133 switch (Kind) {
134 default:
138 break;
141 break;
144 break;
147 break;
150 break;
153 break;
156 break;
159 break;
162 break;
163 }
166 }
167
168 return true;
169}
170
173}
PowerPC TLS Dynamic Call Fixup
This class is intended to be used as a base class for asm properties and features specific to the tar...
Context object for machine code objects.
Base class for the full range of assembler expressions which are needed for parsing.
bool evaluateAsRelocatable(MCValue &Res, const MCAssembler *Asm, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Streaming machine code generation interface.
void visitUsedExpr(const MCExpr &Expr)
Represent a reference to a symbol from inside an expression.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
This represents an "assembler immediate".
static MCValue get(const MCSymbolRefExpr *SymA, const MCSymbolRefExpr *SymB=nullptr, int64_t Val=0, uint32_t RefKind=0)
bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, const MCFixup *Fixup) const override
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override
static const PPCMCExpr * create(VariantKind Kind, const MCExpr *Expr, MCContext &Ctx)
const MCExpr * getSubExpr() const
getSubExpr - Get the child of this expression.
void visitUsedExpr(MCStreamer &Streamer) const override
bool evaluateAsConstant(int64_t &Res) const
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ fixup_ppc_half16
A 16-bit fixup corresponding to lo16(_foo) or ha16(_foo) for instrs like 'li' or 'addis'.
@ fixup_ppc_half16dq
A 16-bit fixup corresponding to lo16(_foo) with implied 3 zero bits for instrs like 'lxv'.
@ fixup_ppc_half16ds
A 14-bit fixup corresponding to lo16(_foo) with implied 2 zero bits for instrs like 'std'.
This is an optimization pass for GlobalISel generic memory operations.