aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Smelkov <kirr@navytux.spb.ru>2012-11-16 00:04:56 +0400
committerKirill Smelkov <kirr@navytux.spb.ru>2012-11-16 10:22:45 +0400
commitab24aaeca303abadd987c2a4ab3a56efe755c37c (patch)
treee7b682064790846ebc4203a6d7c54bdf0a2f5428
parentb2a02961b4407ca76db5a66ca5ae855cbfba4e8e (diff)
downloadtinycc-ab24aaeca303abadd987c2a4ab3a56efe755c37c.tar.gz
tinycc-ab24aaeca303abadd987c2a4ab3a56efe755c37c.tar.bz2
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
-rw-r--r--i386-gen.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/i386-gen.c b/i386-gen.c
index 6635559..c3f03c7 100644
--- a/i386-gen.c
+++ b/i386-gen.c
@@ -260,8 +260,13 @@ ST_FUNC void load(int r, SValue *sv)
o(0xb8 + r); /* mov $xx, r */
gen_addr32(fr, sv->sym, fc);
} else if (v == VT_LOCAL) {
- o(0x8d); /* lea xxx(%ebp), r */
- gen_modrm(r, VT_LOCAL, sv->sym, fc);
+ if (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) {
oad(0xb8 + r, 0); /* mov $0, r */
o(0x0f); /* setxx %br */