| Index: src/x64/assembler-x64.cc
|
| ===================================================================
|
| --- src/x64/assembler-x64.cc (revision 10142)
|
| +++ src/x64/assembler-x64.cc (working copy)
|
| @@ -426,13 +426,7 @@
|
| void Assembler::Align(int m) {
|
| ASSERT(IsPowerOf2(m));
|
| int delta = (m - (pc_offset() & (m - 1))) & (m - 1);
|
| - while (delta >= 9) {
|
| - nop(9);
|
| - delta -= 9;
|
| - }
|
| - if (delta > 0) {
|
| - nop(delta);
|
| - }
|
| + Nop(delta);
|
| }
|
|
|
|
|
| @@ -441,6 +435,15 @@
|
| }
|
|
|
|
|
| +bool Assembler::IsNop(Address addr) {
|
| + Address a = addr;
|
| + while (*a == 0x66) a++;
|
| + if (*a == 0x90) return true;
|
| + if (a[0] == 0xf && a[1] == 0x1f) return true;
|
| + return false;
|
| +}
|
| +
|
| +
|
| void Assembler::bind_to(Label* L, int pos) {
|
| ASSERT(!L->is_bound()); // Label may only be bound once.
|
| ASSERT(0 <= pos && pos <= pc_offset()); // Position must be valid.
|
| @@ -1763,7 +1766,7 @@
|
| }
|
|
|
|
|
| -void Assembler::nop(int n) {
|
| +void Assembler::Nop(int n) {
|
| // The recommended muti-byte sequences of NOP instructions from the Intel 64
|
| // and IA-32 Architectures Software Developer's Manual.
|
| //
|
| @@ -1778,73 +1781,64 @@
|
| // 9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 66 0F 1F 84 00 00 00 00
|
| // 00000000H] 00H
|
|
|
| - ASSERT(1 <= n);
|
| - ASSERT(n <= 9);
|
| EnsureSpace ensure_space(this);
|
| - switch (n) {
|
| - case 1:
|
| - emit(0x90);
|
| - return;
|
| - case 2:
|
| - emit(0x66);
|
| - emit(0x90);
|
| - return;
|
| - case 3:
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x00);
|
| - return;
|
| - case 4:
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x40);
|
| - emit(0x00);
|
| - return;
|
| - case 5:
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x44);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - return;
|
| - case 6:
|
| - emit(0x66);
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x44);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - return;
|
| - case 7:
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x80);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - return;
|
| - case 8:
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x84);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - return;
|
| - case 9:
|
| - emit(0x66);
|
| - emit(0x0f);
|
| - emit(0x1f);
|
| - emit(0x84);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - emit(0x00);
|
| - return;
|
| + while (n > 0) {
|
| + switch (n) {
|
| + case 2:
|
| + emit(0x66);
|
| + case 1:
|
| + emit(0x90);
|
| + return;
|
| + case 3:
|
| + emit(0x0f);
|
| + emit(0x1f);
|
| + emit(0x00);
|
| + return;
|
| + case 4:
|
| + emit(0x0f);
|
| + emit(0x1f);
|
| + emit(0x40);
|
| + emit(0x00);
|
| + return;
|
| + case 6:
|
| + emit(0x66);
|
| + case 5:
|
| + emit(0x0f);
|
| + emit(0x1f);
|
| + emit(0x44);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + return;
|
| + case 7:
|
| + emit(0x0f);
|
| + emit(0x1f);
|
| + emit(0x80);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + return;
|
| + default:
|
| + case 11:
|
| + emit(0x66);
|
| + n--;
|
| + case 10:
|
| + emit(0x66);
|
| + n--;
|
| + case 9:
|
| + emit(0x66);
|
| + n--;
|
| + case 8:
|
| + emit(0x0f);
|
| + emit(0x1f);
|
| + emit(0x84);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + emit(0x00);
|
| + n -= 8;
|
| + }
|
| }
|
| }
|
|
|
|
|