Index: src/assembler-ia32.cc |
=================================================================== |
--- src/assembler-ia32.cc (revision 360) |
+++ src/assembler-ia32.cc (working copy) |
@@ -469,7 +469,48 @@ |
} |
return; |
} |
+ } else if (instr == 0x6a && dst.is(eax)) { // push of immediate 8 bit |
+ byte imm8 = last_pc_[1]; |
+ if (imm8 == 0) { |
+ // 6a00 push 0x0 |
+ // 58 pop eax |
+ last_pc_[0] = 0x31; |
+ last_pc_[1] = 0xc0; |
+ // change to |
+ // 31c0 xor eax,eax |
+ last_pc_ = NULL; |
+ return; |
+ } else { |
+ // 6a00 push 0xXX |
+ // 58 pop eax |
+ last_pc_[0] = 0xb8; |
+ EnsureSpace ensure_space(this); |
+ if ((imm8 & 0x80) != 0) { |
+ EMIT(0xff); |
+ EMIT(0xff); |
+ EMIT(0xff); |
+ // change to |
+ // b8XXffffff mov eax,0xffffffXX |
+ } else { |
+ EMIT(0x00); |
+ EMIT(0x00); |
+ EMIT(0x00); |
+ // change to |
+ // b8XX000000 mov eax,0x000000XX |
+ } |
+ last_pc_ = NULL; |
+ return; |
+ } |
+ } else if (instr == 0x68 && dst.is(eax)) { // push of immediate 32 bit |
+ // 68XXXXXXXX push 0xXXXXXXXX |
+ // 58 pop eax |
+ last_pc_[0] = 0xb8; |
+ last_pc_ = NULL; |
+ // change to |
+ // b8XXXXXXXX mov eax,0xXXXXXXXX |
+ return; |
} |
+ |
// Other potential patterns for peephole: |
// 0x712716 102 890424 mov [esp], eax |
// 0x712719 105 8b1424 mov edx, [esp] |