diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-08 22:56:18 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-08 22:56:18 +0000 |
commit | efb545b9bdd3934dcdbf9bc0890a42081b330049 (patch) | |
tree | 4dc9212e49a5dae9890bd324bcc9bf4941e2321d /include | |
parent | d1a84a2880073f6cc5e2f9f4e5f236cd110f01a0 (diff) | |
download | busybox-efb545b9bdd3934dcdbf9bc0890a42081b330049.tar.gz |
optimize 16- and 32-bit moves
function old new delta
udhcpd_main 1239 1257 +18
udhcp_add_simple_option 93 92 -1
buffer_read_le_u32 19 18 -1
unpack_gz_stream_with_info 526 520 -6
dnsd_main 1470 1463 -7
udhcp_run_script 1208 1186 -22
send_ACK 255 229 -26
arping_main 1661 1623 -38
send_offer 470 428 -42
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 18/-143) Total: -125 bytes
Diffstat (limited to 'include')
-rw-r--r-- | include/platform.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/include/platform.h b/include/platform.h index b8c85dba0..5d6a18107 100644 --- a/include/platform.h +++ b/include/platform.h @@ -151,13 +151,19 @@ /* ---- Unaligned access ------------------------------------ */ -/* parameter is supposed to be an uint32_t* ptr */ +/* NB: unaligned parameter should be a pointer, aligned one - + * a lvalue. This makes it more likely to not swap them by mistake + */ #if defined(i386) || defined(__x86_64__) -#define get_unaligned_u32p(u32p) (*(u32p)) +#define move_from_unaligned16(v, u16p) ((v) = *(uint16_t*)(u16p)) +#define move_from_unaligned32(v, u32p) ((v) = *(uint32_t*)(u32p)) +#define move_to_unaligned32(u32p, v) (*(uint32_t*)(u32p) = (v)) /* #elif ... - add your favorite arch today! */ #else /* performs reasonably well (gcc usually inlines memcpy here) */ -#define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; }) +#define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2)) +#define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4)) +#define move_to_unaligned32(u32p, v) (memcpy((u32p), &(v), 4)) #endif /* ---- Networking ------------------------------------------ */ |