mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Use multiple 0x66 prefixes so that all nops up to 15 bytes are a single instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120147 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -211,10 +211,8 @@ void X86AsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
|
||||
/// WriteNopData - Write optimal nops to the output file for the \arg Count
|
||||
/// bytes. This returns the number of bytes written. It may return 0 if
|
||||
/// the \arg Count is more than the maximum optimal nops.
|
||||
///
|
||||
/// FIXME this is X86 32-bit specific and should move to a better place.
|
||||
bool X86AsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
||||
static const uint8_t Nops[16][16] = {
|
||||
static const uint8_t Nops[10][10] = {
|
||||
// nop
|
||||
{0x90},
|
||||
// xchg %ax,%ax
|
||||
@@ -235,30 +233,16 @@ bool X86AsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
||||
{0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
// nopw %cs:0L(%[re]ax,%[re]ax,1)
|
||||
{0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
// nopw %cs:0L(%[re]ax,%[re]ax,1)
|
||||
{0x66, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
// nopw 0(%[re]ax,%[re]ax,1)
|
||||
// nopw 0(%[re]ax,%[re]ax,1)
|
||||
{0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00,
|
||||
0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00},
|
||||
// nopw 0(%[re]ax,%[re]ax,1)
|
||||
// nopl 0L(%[re]ax) */
|
||||
{0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00,
|
||||
0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00},
|
||||
// nopl 0L(%[re]ax)
|
||||
// nopl 0L(%[re]ax)
|
||||
{0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00},
|
||||
// nopl 0L(%[re]ax)
|
||||
// nopl 0L(%[re]ax,%[re]ax,1)
|
||||
{0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}
|
||||
};
|
||||
|
||||
// Write an optimal sequence for the first 15 bytes.
|
||||
uint64_t OptimalCount = (Count < 16) ? Count : 15;
|
||||
for (uint64_t i = 0, e = OptimalCount; i != e; i++)
|
||||
OW->Write8(Nops[OptimalCount - 1][i]);
|
||||
const uint64_t OptimalCount = (Count < 16) ? Count : 15;
|
||||
const uint64_t Prefixes = OptimalCount <= 10 ? 0 : OptimalCount - 10;
|
||||
for (uint64_t i = 0, e = Prefixes; i != e; i++)
|
||||
OW->Write8(0x66);
|
||||
const uint64_t Rest = OptimalCount - Prefixes;
|
||||
for (uint64_t i = 0, e = Rest; i != e; i++)
|
||||
OW->Write8(Nops[Rest - 1][i]);
|
||||
|
||||
// Finish with single byte nops.
|
||||
for (uint64_t i = OptimalCount, e = Count; i != e; ++i)
|
||||
|
Reference in New Issue
Block a user