Chromium Code Reviews| Index: runtime/vm/assembler_ia32.cc |
| =================================================================== |
| --- runtime/vm/assembler_ia32.cc (revision 2148) |
| +++ runtime/vm/assembler_ia32.cc (working copy) |
| @@ -1096,10 +1096,66 @@ |
| } |
| - |
| -void Assembler::nop() { |
| +void Assembler::nop(int size) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x90); |
| + // There are nops up to size 15, but for now just provide up to size 8. |
| + ASSERT(0 < size && size <= MAX_NOP_SIZE); |
|
srdjan
2011/12/08 22:18:12
I would document this limitation in header file.
turnidge
2011/12/08 23:04:57
Done.
|
| + switch (size) { |
| + case 1: |
| + EmitUint8(0x90); |
| + break; |
| + case 2: |
| + EmitUint8(0x66); |
| + EmitUint8(0x90); |
| + break; |
| + case 3: |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x00); |
| + break; |
| + case 4: |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x40); |
| + EmitUint8(0x00); |
| + break; |
| + case 5: |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x44); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + break; |
| + case 6: |
| + EmitUint8(0x66); |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x44); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + break; |
| + case 7: |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x80); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + break; |
| + case 8: |
| + EmitUint8(0x0F); |
| + EmitUint8(0x1F); |
| + EmitUint8(0x84); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + EmitUint8(0x00); |
| + break; |
| + default: |
| + UNIMPLEMENTED(); |
| + } |
| } |
| @@ -1333,10 +1389,20 @@ |
| void Assembler::Align(int alignment, int offset) { |
| ASSERT(Utils::IsPowerOfTwo(alignment)); |
| - // Emit nop instruction until the real position is aligned. |
| - while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { |
| - nop(); |
| + int pos = offset + buffer_.GetPosition(); |
| + int mod = pos & (alignment - 1); |
| + if (mod == 0) { |
| + return; |
| } |
| + int bytes_needed = alignment - mod; |
| + while (bytes_needed > MAX_NOP_SIZE) { |
| + nop(MAX_NOP_SIZE); |
| + bytes_needed -= MAX_NOP_SIZE; |
| + } |
| + if (bytes_needed) { |
| + nop(bytes_needed); |
| + } |
| + ASSERT(((offset + buffer_.GetPosition()) & (alignment-1)) == 0); |
| } |