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

Side by Side Diff: src/IceTargetLoweringX8664.cpp

Issue 1585843007: Subzero. RAII NaCl Bundling. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 11 months 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
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTargetLoweringX86Base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===//
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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 // add Adjustment, %esp 158 // add Adjustment, %esp
159 // %rsp = fake-def %esp 159 // %rsp = fake-def %esp
160 // add %r15, %rsp 160 // add %r15, %rsp
161 // .bundle_end 161 // .bundle_end
162 // 162 //
163 // The fake-defs ensure that the 163 // The fake-defs ensure that the
164 // 164 //
165 // add Adjustment, %esp 165 // add Adjustment, %esp
166 // 166 //
167 // instruction is not DCE'd. 167 // instruction is not DCE'd.
168 _bundle_lock(); 168 AutoBundle _(this);
169 _redefined(Context.insert<InstFakeDef>(esp, rsp)); 169 _redefined(Context.insert<InstFakeDef>(esp, rsp));
170 _add(esp, Adjustment); 170 _add(esp, Adjustment);
171 _redefined(Context.insert<InstFakeDef>(rsp, esp)); 171 _redefined(Context.insert<InstFakeDef>(rsp, esp));
172 _add(rsp, r15); 172 _add(rsp, r15);
173 _bundle_unlock();
174 } 173 }
175 174
176 void TargetX8664::_mov_sp(Operand *NewValue) { 175 void TargetX8664::_mov_sp(Operand *NewValue) {
177 assert(NewValue->getType() == IceType_i32); 176 assert(NewValue->getType() == IceType_i32);
178 177
179 Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_esp); 178 Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_esp);
180 Variable *rsp = 179 Variable *rsp =
181 getPhysicalRegister(Traits::RegisterSet::Reg_rsp, IceType_i64); 180 getPhysicalRegister(Traits::RegisterSet::Reg_rsp, IceType_i64);
182 181
183 if (NeedSandboxing) { 182 AutoBundle _(this);
184 _bundle_lock();
185 }
186 183
187 _redefined(Context.insert<InstFakeDef>(esp, rsp)); 184 _redefined(Context.insert<InstFakeDef>(esp, rsp));
188 _redefined(_mov(esp, NewValue)); 185 _redefined(_mov(esp, NewValue));
189 _redefined(Context.insert<InstFakeDef>(rsp, esp)); 186 _redefined(Context.insert<InstFakeDef>(rsp, esp));
190 187
191 if (!NeedSandboxing) { 188 if (!NeedSandboxing) {
192 return; 189 return;
193 } 190 }
194 191
195 Variable *r15 = 192 Variable *r15 =
196 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 193 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
197 _add(rsp, r15); 194 _add(rsp, r15);
198 _bundle_unlock();
199 } 195 }
200 196
201 void TargetX8664::_push_rbp() { 197 void TargetX8664::_push_rbp() {
202 assert(NeedSandboxing); 198 assert(NeedSandboxing);
203 199
204 Constant *_0 = Ctx->getConstantZero(IceType_i32); 200 Constant *_0 = Ctx->getConstantZero(IceType_i32);
205 Variable *ebp = 201 Variable *ebp =
206 getPhysicalRegister(Traits::RegisterSet::Reg_ebp, IceType_i32); 202 getPhysicalRegister(Traits::RegisterSet::Reg_ebp, IceType_i32);
207 Variable *rsp = 203 Variable *rsp =
208 getPhysicalRegister(Traits::RegisterSet::Reg_rsp, IceType_i64); 204 getPhysicalRegister(Traits::RegisterSet::Reg_rsp, IceType_i64);
209 auto *TopOfStack = llvm::cast<X86OperandMem>( 205 auto *TopOfStack = llvm::cast<X86OperandMem>(
210 legalize(X86OperandMem::create(Func, IceType_i32, rsp, _0), 206 legalize(X86OperandMem::create(Func, IceType_i32, rsp, _0),
211 Legal_Reg | Legal_Mem)); 207 Legal_Reg | Legal_Mem));
212 208
213 // Emits a sequence: 209 // Emits a sequence:
214 // 210 //
215 // .bundle_start 211 // .bundle_start
216 // push 0 212 // push 0
217 // mov %ebp, %(rsp) 213 // mov %ebp, %(rsp)
218 // .bundle_end 214 // .bundle_end
219 // 215 //
220 // to avoid leaking the upper 32-bits (i.e., the sandbox address.) 216 // to avoid leaking the upper 32-bits (i.e., the sandbox address.)
221 _bundle_lock(); 217 AutoBundle _(this);
222 _push(_0); 218 _push(_0);
223 Context.insert<typename Traits::Insts::Store>(ebp, TopOfStack); 219 Context.insert<typename Traits::Insts::Store>(ebp, TopOfStack);
224 _bundle_unlock();
225 } 220 }
226 221
227 Traits::X86OperandMem *TargetX8664::_sandbox_mem_reference(X86OperandMem *Mem) { 222 Traits::X86OperandMem *TargetX8664::_sandbox_mem_reference(X86OperandMem *Mem) {
228 // In x86_64-nacl, all memory references are relative to %r15 (i.e., %rzp.) 223 // In x86_64-nacl, all memory references are relative to %r15 (i.e., %rzp.)
229 // NaCl sandboxing also requires that any registers that are not %rsp and 224 // NaCl sandboxing also requires that any registers that are not %rsp and
230 // %rbp to be 'truncated' to 32-bit before memory access. 225 // %rbp to be 'truncated' to 32-bit before memory access.
231 assert(NeedSandboxing); 226 assert(NeedSandboxing);
232 Variable *Base = Mem->getBase(); 227 Variable *Base = Mem->getBase();
233 Variable *Index = Mem->getIndex(); 228 Variable *Index = Mem->getIndex();
234 uint16_t Shift = 0; 229 uint16_t Shift = 0;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 338
344 Variable *esp = 339 Variable *esp =
345 getPhysicalRegister(Traits::RegisterSet::Reg_esp, IceType_i32); 340 getPhysicalRegister(Traits::RegisterSet::Reg_esp, IceType_i32);
346 Variable *r15 = 341 Variable *r15 =
347 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 342 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
348 343
349 // .bundle_start 344 // .bundle_start
350 // sub Adjustment, %esp 345 // sub Adjustment, %esp
351 // add %r15, %rsp 346 // add %r15, %rsp
352 // .bundle_end 347 // .bundle_end
353 _bundle_lock(); 348 AutoBundle _(this);
354 _redefined(Context.insert<InstFakeDef>(esp, rsp)); 349 _redefined(Context.insert<InstFakeDef>(esp, rsp));
355 _sub(esp, Adjustment); 350 _sub(esp, Adjustment);
356 _redefined(Context.insert<InstFakeDef>(rsp, esp)); 351 _redefined(Context.insert<InstFakeDef>(rsp, esp));
357 _add(rsp, r15); 352 _add(rsp, r15);
358 _bundle_unlock();
359 } 353 }
360 354
361 void TargetX8664::initSandbox() { 355 void TargetX8664::initSandbox() {
362 assert(NeedSandboxing); 356 assert(NeedSandboxing);
363 Context.init(Func->getEntryNode()); 357 Context.init(Func->getEntryNode());
364 Context.setInsertPoint(Context.getCur()); 358 Context.setInsertPoint(Context.getCur());
365 Variable *r15 = 359 Variable *r15 =
366 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 360 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
367 Context.insert<InstFakeDef>(r15); 361 Context.insert<InstFakeDef>(r15);
368 Context.insert<InstFakeUse>(r15); 362 Context.insert<InstFakeUse>(r15);
369 } 363 }
370 364
371 void TargetX8664::lowerIndirectJump(Variable *JumpTarget) { 365 void TargetX8664::lowerIndirectJump(Variable *JumpTarget) {
366 std::unique_ptr<AutoBundle> Bundler;
367
372 if (!NeedSandboxing) { 368 if (!NeedSandboxing) {
373 Variable *T = makeReg(IceType_i64); 369 Variable *T = makeReg(IceType_i64);
374 _movzx(T, JumpTarget); 370 _movzx(T, JumpTarget);
375 JumpTarget = T; 371 JumpTarget = T;
376 } else { 372 } else {
377 Variable *T = makeReg(IceType_i32); 373 Variable *T = makeReg(IceType_i32);
378 Variable *T64 = makeReg(IceType_i64); 374 Variable *T64 = makeReg(IceType_i64);
379 Variable *r15 = 375 Variable *r15 =
380 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 376 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
381 377
382 _mov(T, JumpTarget); 378 _mov(T, JumpTarget);
383 _bundle_lock(); 379 Bundler = makeUnique<AutoBundle>(this);
384 const SizeT BundleSize = 380 const SizeT BundleSize =
385 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes(); 381 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
386 _and(T, Ctx->getConstantInt32(~(BundleSize - 1))); 382 _and(T, Ctx->getConstantInt32(~(BundleSize - 1)));
387 _movzx(T64, T); 383 _movzx(T64, T);
388 _add(T64, r15); 384 _add(T64, r15);
389 JumpTarget = T64; 385 JumpTarget = T64;
390 } 386 }
391 387
392 _jmp(JumpTarget); 388 _jmp(JumpTarget);
393 if (NeedSandboxing)
394 _bundle_unlock();
395 } 389 }
396 390
397 namespace { 391 namespace {
398 static inline TargetX8664::Traits::RegisterSet::AllRegisters 392 static inline TargetX8664::Traits::RegisterSet::AllRegisters
399 getRegisterForXmmArgNum(uint32_t ArgNum) { 393 getRegisterForXmmArgNum(uint32_t ArgNum) {
400 assert(ArgNum < TargetX8664::Traits::X86_MAX_XMM_ARGS); 394 assert(ArgNum < TargetX8664::Traits::X86_MAX_XMM_ARGS);
401 return static_cast<TargetX8664::Traits::RegisterSet::AllRegisters>( 395 return static_cast<TargetX8664::Traits::RegisterSet::AllRegisters>(
402 TargetX8664::Traits::RegisterSet::Reg_xmm0 + ArgNum); 396 TargetX8664::Traits::RegisterSet::Reg_xmm0 + ArgNum);
403 } 397 }
404 398
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 // emitted call needs a i64 register (for textual asm.) 586 // emitted call needs a i64 register (for textual asm.)
593 Variable *T = makeReg(IceType_i64); 587 Variable *T = makeReg(IceType_i64);
594 _movzx(T, CallTargetR); 588 _movzx(T, CallTargetR);
595 CallTarget = T; 589 CallTarget = T;
596 } 590 }
597 NewCall = Context.insert<Traits::Insts::Call>(ReturnReg, CallTarget); 591 NewCall = Context.insert<Traits::Insts::Call>(ReturnReg, CallTarget);
598 } else { 592 } else {
599 ReturnAddress = InstX86Label::create(Func, this); 593 ReturnAddress = InstX86Label::create(Func, this);
600 ReturnAddress->setIsReturnLocation(true); 594 ReturnAddress->setIsReturnLocation(true);
601 constexpr bool SuppressMangling = true; 595 constexpr bool SuppressMangling = true;
602 if (CallTargetR == nullptr) { 596 /* AutoBundle scoping */ {
603 _bundle_lock(InstBundleLock::Opt_PadToEnd); 597 std::unique_ptr<AutoBundle> Bundler;
604 _push(Ctx->getConstantSym(0, ReturnAddress->getName(Func), 598 if (CallTargetR == nullptr) {
605 SuppressMangling)); 599 Bundler = makeUnique<AutoBundle>(this, InstBundleLock::Opt_PadToEnd);
606 } else { 600 _push(Ctx->getConstantSym(0, ReturnAddress->getName(Func),
607 Variable *T = makeReg(IceType_i32); 601 SuppressMangling));
608 Variable *T64 = makeReg(IceType_i64); 602 } else {
609 Variable *r15 = 603 Variable *T = makeReg(IceType_i32);
610 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 604 Variable *T64 = makeReg(IceType_i64);
605 Variable *r15 =
606 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
611 607
612 _mov(T, CallTargetR); 608 _mov(T, CallTargetR);
613 _bundle_lock(InstBundleLock::Opt_PadToEnd); 609 Bundler = makeUnique<AutoBundle>(this, InstBundleLock::Opt_PadToEnd);
614 _push(Ctx->getConstantSym(0, ReturnAddress->getName(Func), 610 _push(Ctx->getConstantSym(0, ReturnAddress->getName(Func),
615 SuppressMangling)); 611 SuppressMangling));
616 const SizeT BundleSize = 612 const SizeT BundleSize =
617 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes(); 613 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
618 _and(T, Ctx->getConstantInt32(~(BundleSize - 1))); 614 _and(T, Ctx->getConstantInt32(~(BundleSize - 1)));
619 _movzx(T64, T); 615 _movzx(T64, T);
620 _add(T64, r15); 616 _add(T64, r15);
621 CallTarget = T64; 617 CallTarget = T64;
618 }
619
620 NewCall = Context.insert<Traits::Insts::Jmp>(CallTarget);
622 } 621 }
623
624 NewCall = Context.insert<Traits::Insts::Jmp>(CallTarget);
625 _bundle_unlock();
626 if (ReturnReg != nullptr) { 622 if (ReturnReg != nullptr) {
627 Context.insert<InstFakeDef>(ReturnReg); 623 Context.insert<InstFakeDef>(ReturnReg);
628 } 624 }
629 625
630 Context.insert(ReturnAddress); 626 Context.insert(ReturnAddress);
631 } 627 }
632 628
633 // Insert a register-kill pseudo instruction. 629 // Insert a register-kill pseudo instruction.
634 Context.insert<InstFakeKill>(NewCall); 630 Context.insert<InstFakeKill>(NewCall);
635 631
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 getPhysicalRegister(Traits::RegisterSet::Reg_esp, IceType_i32); 847 getPhysicalRegister(Traits::RegisterSet::Reg_esp, IceType_i32);
852 Variable *r15 = 848 Variable *r15 =
853 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 849 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
854 850
855 if (!NeedSandboxing) { 851 if (!NeedSandboxing) {
856 _push(rbp); 852 _push(rbp);
857 _mov(rbp, rsp); 853 _mov(rbp, rsp);
858 } else { 854 } else {
859 _push_rbp(); 855 _push_rbp();
860 856
861 _bundle_lock(); 857 AutoBundle _(this);
862 _redefined(Context.insert<InstFakeDef>(ebp, rbp)); 858 _redefined(Context.insert<InstFakeDef>(ebp, rbp));
863 _redefined(Context.insert<InstFakeDef>(esp, rsp)); 859 _redefined(Context.insert<InstFakeDef>(esp, rsp));
864 _mov(ebp, esp); 860 _mov(ebp, esp);
865 _redefined(Context.insert<InstFakeDef>(rsp, esp)); 861 _redefined(Context.insert<InstFakeDef>(rsp, esp));
866 _add(rbp, r15); 862 _add(rbp, r15);
867 _bundle_unlock();
868 } 863 }
869 // Keep ebp live for late-stage liveness analysis (e.g. asm-verbose mode). 864 // Keep ebp live for late-stage liveness analysis (e.g. asm-verbose mode).
870 Context.insert<InstFakeUse>(rbp); 865 Context.insert<InstFakeUse>(rbp);
871 } 866 }
872 867
873 // Align the variables area. SpillAreaPaddingBytes is the size of the region 868 // Align the variables area. SpillAreaPaddingBytes is the size of the region
874 // after the preserved registers and before the spill areas. 869 // after the preserved registers and before the spill areas.
875 // LocalsSlotsPaddingBytes is the amount of padding between the globals and 870 // LocalsSlotsPaddingBytes is the amount of padding between the globals and
876 // locals area if they are separate. 871 // locals area if they are separate.
877 assert(SpillAreaAlignmentBytes <= Traits::X86_STACK_ALIGNMENT_BYTES); 872 assert(SpillAreaAlignmentBytes <= Traits::X86_STACK_ALIGNMENT_BYTES);
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 1045
1051 Variable *r15 = 1046 Variable *r15 =
1052 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 1047 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
1053 Variable *rcx = 1048 Variable *rcx =
1054 getPhysicalRegister(Traits::RegisterSet::Reg_rcx, IceType_i64); 1049 getPhysicalRegister(Traits::RegisterSet::Reg_rcx, IceType_i64);
1055 Variable *ecx = 1050 Variable *ecx =
1056 getPhysicalRegister(Traits::RegisterSet::Reg_ecx, IceType_i32); 1051 getPhysicalRegister(Traits::RegisterSet::Reg_ecx, IceType_i32);
1057 1052
1058 _pop(rcx); 1053 _pop(rcx);
1059 Context.insert<InstFakeDef>(ecx, rcx); 1054 Context.insert<InstFakeDef>(ecx, rcx);
1060 _bundle_lock(); 1055 AutoBundle _(this);
1061 _mov(ebp, ecx); 1056 _mov(ebp, ecx);
1062 1057
1063 _redefined(Context.insert<InstFakeDef>(rbp, ebp)); 1058 _redefined(Context.insert<InstFakeDef>(rbp, ebp));
1064 _add(rbp, r15); 1059 _add(rbp, r15);
1065 _bundle_unlock();
1066 } 1060 }
1067 } 1061 }
1068 1062
1069 // Add pop instructions for preserved registers. 1063 // Add pop instructions for preserved registers.
1070 llvm::SmallBitVector CalleeSaves = 1064 llvm::SmallBitVector CalleeSaves =
1071 getRegisterSet(RegSet_CalleeSave, RegSet_None); 1065 getRegisterSet(RegSet_CalleeSave, RegSet_None);
1072 llvm::SmallBitVector Popped(CalleeSaves.size()); 1066 llvm::SmallBitVector Popped(CalleeSaves.size());
1073 for (int32_t i = CalleeSaves.size() - 1; i >= 0; --i) { 1067 for (int32_t i = CalleeSaves.size() - 1; i >= 0; --i) {
1074 if (i == Traits::RegisterSet::Reg_rbp && IsEbpBasedFrame) 1068 if (i == Traits::RegisterSet::Reg_rbp && IsEbpBasedFrame)
1075 continue; 1069 continue;
(...skipping 14 matching lines...) Expand all
1090 1084
1091 Variable *T_rcx = makeReg(IceType_i64, Traits::RegisterSet::Reg_rcx); 1085 Variable *T_rcx = makeReg(IceType_i64, Traits::RegisterSet::Reg_rcx);
1092 Variable *T_ecx = makeReg(IceType_i32, Traits::RegisterSet::Reg_ecx); 1086 Variable *T_ecx = makeReg(IceType_i32, Traits::RegisterSet::Reg_ecx);
1093 _pop(T_rcx); 1087 _pop(T_rcx);
1094 _mov(T_ecx, T_rcx); 1088 _mov(T_ecx, T_rcx);
1095 1089
1096 // lowerIndirectJump(T_ecx); 1090 // lowerIndirectJump(T_ecx);
1097 Variable *r15 = 1091 Variable *r15 =
1098 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64); 1092 getPhysicalRegister(Traits::RegisterSet::Reg_r15, IceType_i64);
1099 1093
1100 _bundle_lock(); 1094 /* AutoBundle scoping */ {
1101 const SizeT BundleSize = 1 1095 AutoBundle _(this);
1102 << Func->getAssembler<>()->getBundleAlignLog2Bytes(); 1096 const SizeT BundleSize =
1103 _and(T_ecx, Ctx->getConstantInt32(~(BundleSize - 1))); 1097 1 << Func->getAssembler<>()->getBundleAlignLog2Bytes();
1104 Context.insert<InstFakeDef>(T_rcx, T_ecx); 1098 _and(T_ecx, Ctx->getConstantInt32(~(BundleSize - 1)));
1105 _add(T_rcx, r15); 1099 Context.insert<InstFakeDef>(T_rcx, T_ecx);
1100 _add(T_rcx, r15);
1106 1101
1107 _jmp(T_rcx); 1102 _jmp(T_rcx);
1108 _bundle_unlock(); 1103 }
1109 1104
1110 if (RI->getSrcSize()) { 1105 if (RI->getSrcSize()) {
1111 auto *RetValue = llvm::cast<Variable>(RI->getSrc(0)); 1106 auto *RetValue = llvm::cast<Variable>(RI->getSrc(0));
1112 Context.insert<InstFakeUse>(RetValue); 1107 Context.insert<InstFakeUse>(RetValue);
1113 } 1108 }
1114 RI->setDeleted(); 1109 RI->setDeleted();
1115 } 1110 }
1116 1111
1117 void TargetX8664::emitJumpTable(const Cfg *Func, 1112 void TargetX8664::emitJumpTable(const Cfg *Func,
1118 const InstJumpTable *JumpTable) const { 1113 const InstJumpTable *JumpTable) const {
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
1425 #define X(tag, sizeLog2, align, elts, elty, str) \ 1420 #define X(tag, sizeLog2, align, elts, elty, str) \
1426 static_assert(_table1_##tag == _table2_##tag, \ 1421 static_assert(_table1_##tag == _table2_##tag, \
1427 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); 1422 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE");
1428 ICETYPE_TABLE 1423 ICETYPE_TABLE
1429 #undef X 1424 #undef X
1430 } // end of namespace dummy3 1425 } // end of namespace dummy3
1431 } // end of anonymous namespace 1426 } // end of anonymous namespace
1432 1427
1433 } // end of namespace X8664 1428 } // end of namespace X8664
1434 } // end of namespace Ice 1429 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTargetLoweringX86Base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698