Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Side by Side Diff: src/IceInstX8664.cpp

Issue 1428443002: Enhance address mode recovery (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Streamline absolute addressing support (rip-relative on x64) Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceInstX8664.cpp - X86-64 instruction implementation ---===// 1 //===- subzero/src/IceInstX8664.cpp - X86-64 instruction implementation ---===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 } else if (const auto CI = llvm::dyn_cast<ConstantInteger32>(Offset)) { 99 } else if (const auto CI = llvm::dyn_cast<ConstantInteger32>(Offset)) {
100 if (Base == nullptr || CI->getValue()) 100 if (Base == nullptr || CI->getValue())
101 // Emit a non-zero offset without a leading '$'. 101 // Emit a non-zero offset without a leading '$'.
102 Str << CI->getValue(); 102 Str << CI->getValue();
103 } else if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) { 103 } else if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) {
104 CR->emitWithoutPrefix(Func->getTarget()); 104 CR->emitWithoutPrefix(Func->getTarget());
105 } else { 105 } else {
106 llvm_unreachable("Invalid offset type for x86 mem operand"); 106 llvm_unreachable("Invalid offset type for x86 mem operand");
107 } 107 }
108 108
109 if (Base) { 109 if (Base || Index) {
110 Str << "("; 110 Str << "(";
111 Base->emit(Func); 111 if (Base)
112 Base->emit(Func);
112 if (Index) { 113 if (Index) {
113 Str << ","; 114 Str << ",";
114 Index->emit(Func); 115 Index->emit(Func);
115 if (Shift) 116 if (Shift)
116 Str << "," << (1u << Shift); 117 Str << "," << (1u << Shift);
117 } 118 }
118 Str << ")"; 119 Str << ")";
119 } 120 }
120 } 121 }
121 122
122 void MachineTraits<TargetX8664>::X86OperandMem::dump(const Cfg *Func, 123 void MachineTraits<TargetX8664>::X86OperandMem::dump(const Cfg *Func,
123 Ostream &Str) const { 124 Ostream &Str) const {
124 if (!BuildDefs::dump()) 125 if (!BuildDefs::dump())
125 return; 126 return;
126 bool Dumped = false; 127 bool Dumped = false;
127 Str << "["; 128 Str << "[";
128 if (Base) { 129 if (Base) {
129 if (Func) 130 if (Func)
130 Base->dump(Func); 131 Base->dump(Func);
131 else 132 else
132 Base->dump(Str); 133 Base->dump(Str);
133 Dumped = true; 134 Dumped = true;
134 } 135 }
135 if (Index) { 136 if (Index) {
136 assert(Base); 137 if (Base)
137 Str << "+"; 138 Str << "+";
138 if (Shift > 0) 139 if (Shift > 0)
139 Str << (1u << Shift) << "*"; 140 Str << (1u << Shift) << "*";
140 if (Func) 141 if (Func)
141 Index->dump(Func); 142 Index->dump(Func);
142 else 143 else
143 Index->dump(Str); 144 Index->dump(Str);
144 Dumped = true; 145 Dumped = true;
145 } 146 }
146 // Pretty-print the Offset. 147 // Pretty-print the Offset.
147 bool OffsetIsZero = false; 148 bool OffsetIsZero = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } else { 184 } else {
184 llvm_unreachable("Unexpected offset type"); 185 llvm_unreachable("Unexpected offset type");
185 } 186 }
186 } 187 }
187 188
188 // Now convert to the various possible forms. 189 // Now convert to the various possible forms.
189 if (getBase() && getIndex()) { 190 if (getBase() && getIndex()) {
190 return X8664::Traits::Address( 191 return X8664::Traits::Address(
191 RegX8664::getEncodedGPR(getBase()->getRegNum()), 192 RegX8664::getEncodedGPR(getBase()->getRegNum()),
192 RegX8664::getEncodedGPR(getIndex()->getRegNum()), 193 RegX8664::getEncodedGPR(getIndex()->getRegNum()),
193 X8664::Traits::ScaleFactor(getShift()), Disp); 194 X8664::Traits::ScaleFactor(getShift()), Disp, Fixup);
194 } else if (getBase()) { 195 } else if (getBase()) {
195 return X8664::Traits::Address( 196 return X8664::Traits::Address(
196 RegX8664::getEncodedGPR(getBase()->getRegNum()), Disp); 197 RegX8664::getEncodedGPR(getBase()->getRegNum()), Disp, Fixup);
197 } else if (getIndex()) { 198 } else if (getIndex()) {
198 return X8664::Traits::Address( 199 return X8664::Traits::Address(
199 RegX8664::getEncodedGPR(getIndex()->getRegNum()), 200 RegX8664::getEncodedGPR(getIndex()->getRegNum()),
200 X8664::Traits::ScaleFactor(getShift()), Disp); 201 X8664::Traits::ScaleFactor(getShift()), Disp, Fixup);
201 } else if (Fixup) {
202 return X8664::Traits::Address::Absolute(Disp, Fixup);
203 } else { 202 } else {
204 return X8664::Traits::Address::Absolute(Disp); 203 return X8664::Traits::Address(Disp, Fixup);
205 } 204 }
206 } 205 }
207 206
208 MachineTraits<TargetX8664>::Address 207 MachineTraits<TargetX8664>::Address
209 MachineTraits<TargetX8664>::VariableSplit::toAsmAddress(const Cfg *Func) const { 208 MachineTraits<TargetX8664>::VariableSplit::toAsmAddress(const Cfg *Func) const {
210 assert(!Var->hasReg()); 209 assert(!Var->hasReg());
211 const ::Ice::TargetLowering *Target = Func->getTarget(); 210 const ::Ice::TargetLowering *Target = Func->getTarget();
212 int32_t Offset = 211 int32_t Offset =
213 Var->getStackOffset() + Target->getStackAdjustment() + getOffset(); 212 Var->getStackOffset() + Target->getStackAdjustment() + getOffset();
213 static constexpr AssemblerFixup *Fixup = nullptr;
214 return X8664::Traits::Address( 214 return X8664::Traits::Address(
215 RegX8664::getEncodedGPR(Target->getFrameOrStackReg()), Offset); 215 RegX8664::getEncodedGPR(Target->getFrameOrStackReg()), Offset, Fixup);
216 } 216 }
217 217
218 void MachineTraits<TargetX8664>::VariableSplit::emit(const Cfg *Func) const { 218 void MachineTraits<TargetX8664>::VariableSplit::emit(const Cfg *Func) const {
219 if (!BuildDefs::dump()) 219 if (!BuildDefs::dump())
220 return; 220 return;
221 Ostream &Str = Func->getContext()->getStrEmit(); 221 Ostream &Str = Func->getContext()->getStrEmit();
222 assert(!Var->hasReg()); 222 assert(!Var->hasReg());
223 // The following is copied/adapted from TargetX8664::emitVariable(). 223 // The following is copied/adapted from TargetX8664::emitVariable().
224 const ::Ice::TargetLowering *Target = Func->getTarget(); 224 const ::Ice::TargetLowering *Target = Func->getTarget();
225 const Type Ty = IceType_i32; 225 const Type Ty = IceType_i32;
(...skipping 21 matching lines...) Expand all
247 Var->dump(Func); 247 Var->dump(Func);
248 else 248 else
249 Var->dump(Str); 249 Var->dump(Str);
250 Str << ")"; 250 Str << ")";
251 } 251 }
252 252
253 } // namespace X86Internal 253 } // namespace X86Internal
254 } // end of namespace Ice 254 } // end of namespace Ice
255 255
256 X86INSTS_DEFINE_STATIC_DATA(TargetX8664) 256 X86INSTS_DEFINE_STATIC_DATA(TargetX8664)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698