OLD | NEW |
1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// | 1 //===- subzero/src/IceInstX8632.cpp - X86-32 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 // This file implements the InstX8632 and OperandX8632 classes, | 10 // This file implements the InstX8632 and OperandX8632 classes, |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 | 342 |
343 // ======================== Dump routines ======================== // | 343 // ======================== Dump routines ======================== // |
344 | 344 |
345 namespace { | 345 namespace { |
346 | 346 |
347 void emitIASBytes(const Cfg *Func, const x86::AssemblerX86 *Asm, | 347 void emitIASBytes(const Cfg *Func, const x86::AssemblerX86 *Asm, |
348 intptr_t StartPosition) { | 348 intptr_t StartPosition) { |
349 GlobalContext *Ctx = Func->getContext(); | 349 GlobalContext *Ctx = Func->getContext(); |
350 Ostream &Str = Ctx->getStrEmit(); | 350 Ostream &Str = Ctx->getStrEmit(); |
351 intptr_t EndPosition = Asm->GetPosition(); | 351 intptr_t EndPosition = Asm->GetPosition(); |
352 intptr_t LastFixupLoc = -1; | 352 AssemblerFixup *LastFixup = Asm->GetLatestFixup(StartPosition); |
353 AssemblerFixup *LastFixup = NULL; | 353 if (LastFixup == NULL) { |
354 if (Asm->GetLatestFixup()) { | |
355 LastFixup = Asm->GetLatestFixup(); | |
356 LastFixupLoc = LastFixup->position(); | |
357 } | |
358 if (LastFixupLoc < StartPosition) { | |
359 // The fixup doesn't apply to this current block. | 354 // The fixup doesn't apply to this current block. |
360 for (intptr_t i = StartPosition; i < EndPosition; ++i) { | 355 for (intptr_t i = StartPosition; i < EndPosition; ++i) { |
361 Str << "\t.byte 0x"; | 356 Str << "\t.byte 0x"; |
362 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); | 357 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
363 Str << "\n"; | 358 Str << "\n"; |
364 } | 359 } |
365 return; | 360 return; |
366 } | 361 } |
| 362 intptr_t LastFixupLoc = LastFixup->position(); |
367 const intptr_t FixupSize = 4; | 363 const intptr_t FixupSize = 4; |
368 assert(LastFixupLoc + FixupSize <= EndPosition); | |
369 // The fixup does apply to this current block. | 364 // The fixup does apply to this current block. |
370 for (intptr_t i = StartPosition; i < LastFixupLoc; ++i) { | 365 for (intptr_t i = StartPosition; i < LastFixupLoc; ++i) { |
371 Str << "\t.byte 0x"; | 366 Str << "\t.byte 0x"; |
372 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); | 367 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
373 Str << "\n"; | 368 Str << "\n"; |
374 } | 369 } |
375 Str << "\t.long "; | 370 while (LastFixup) { |
376 const ConstantRelocatable *Reloc = LastFixup->value(); | 371 Str << "\t.long "; |
377 if (Reloc->getSuppressMangling()) | 372 const ConstantRelocatable *Reloc = LastFixup->value(); |
378 Str << Reloc->getName(); | 373 if (Reloc->getSuppressMangling()) |
379 else | 374 Str << Reloc->getName(); |
380 Str << Ctx->mangleName(Reloc->getName()); | 375 else |
381 if (LastFixup->value()->getOffset()) { | 376 Str << Ctx->mangleName(Reloc->getName()); |
382 Str << " + " << LastFixup->value()->getOffset(); | 377 if (LastFixup->value()->getOffset()) { |
| 378 Str << " + " << LastFixup->value()->getOffset(); |
| 379 } |
| 380 Str << "\n"; |
| 381 LastFixupLoc += FixupSize; |
| 382 assert(LastFixupLoc <= EndPosition); |
| 383 LastFixup = Asm->GetLatestFixup(LastFixupLoc); |
| 384 // Assume multi-fixups are adjacent in the instruction encoding. |
| 385 assert(LastFixup == NULL || LastFixup->position() == LastFixupLoc); |
383 } | 386 } |
384 Str << "\n"; | 387 for (intptr_t i = LastFixupLoc; i < EndPosition; ++i) { |
385 for (intptr_t i = LastFixupLoc + FixupSize; i < EndPosition; ++i) { | |
386 Str << "\t.byte 0x"; | 388 Str << "\t.byte 0x"; |
387 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); | 389 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
388 Str << "\n"; | 390 Str << "\n"; |
389 } | 391 } |
390 } | 392 } |
391 | 393 |
392 void emitIASBytesBranch(const Cfg *Func, const x86::AssemblerX86 *Asm, | 394 void emitIASBytesBranch(const Cfg *Func, const x86::AssemblerX86 *Asm, |
393 intptr_t StartPosition, const x86::Label *Label, | 395 intptr_t StartPosition, const x86::Label *Label, |
394 const IceString &LabelName, bool Near) { | 396 const IceString &LabelName, bool Near) { |
395 // If this is a backward branch (label is bound), we're good and know | 397 // If this is a backward branch (label is bound), we're good and know |
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2908 } | 2910 } |
2909 Str << "("; | 2911 Str << "("; |
2910 if (Func) | 2912 if (Func) |
2911 Var->dump(Func); | 2913 Var->dump(Func); |
2912 else | 2914 else |
2913 Var->dump(Str); | 2915 Var->dump(Str); |
2914 Str << ")"; | 2916 Str << ")"; |
2915 } | 2917 } |
2916 | 2918 |
2917 } // end of namespace Ice | 2919 } // end of namespace Ice |
OLD | NEW |