i386: We can change 'lea 0(%ebp),r' to 'mov %ebp,r'
Because that mov is 1 byte shorter, look:
int *func()
{
return __builtin_frame_address(0);
}
before patch:
00000000 <func>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 81 ec 00 00 00 00 sub $0x0,%esp
9: 8d 45 00 lea 0x0(%ebp),%eax // <- here
c: e9 00 00 00 00 jmp 11 <func+0x11>
11: c9 leave
12: c3 ret
after patch:
00000000 <func>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 81 ec 00 00 00 00 sub $0x0,%esp
9: 89 e8 mov %ebp,%eax // <- here
b: e9 00 00 00 00 jmp 10 <func+0x10>
10: c9 leave
11: c3 ret
This commit is contained in:
parent
b2a02961b4
commit
ab24aaeca3
1 changed files with 7 additions and 2 deletions
|
|
@ -260,8 +260,13 @@ ST_FUNC void load(int r, SValue *sv)
|
||||||
o(0xb8 + r); /* mov $xx, r */
|
o(0xb8 + r); /* mov $xx, r */
|
||||||
gen_addr32(fr, sv->sym, fc);
|
gen_addr32(fr, sv->sym, fc);
|
||||||
} else if (v == VT_LOCAL) {
|
} else if (v == VT_LOCAL) {
|
||||||
o(0x8d); /* lea xxx(%ebp), r */
|
if (fc) {
|
||||||
gen_modrm(r, VT_LOCAL, sv->sym, fc);
|
o(0x8d); /* lea xxx(%ebp), r */
|
||||||
|
gen_modrm(r, VT_LOCAL, sv->sym, fc);
|
||||||
|
} else {
|
||||||
|
o(0x89);
|
||||||
|
o(0xe8 + r); /* mov %ebp, r */
|
||||||
|
}
|
||||||
} else if (v == VT_CMP) {
|
} else if (v == VT_CMP) {
|
||||||
oad(0xb8 + r, 0); /* mov $0, r */
|
oad(0xb8 + r, 0); /* mov $0, r */
|
||||||
o(0x0f); /* setxx %br */
|
o(0x0f); /* setxx %br */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue