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 (Value.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.