Denys Vlasenko
133fd9f5cd
vsprintf: further optimize decimal conversion
...
Previous code was using optimizations which were developed to work well
even on narrow-word CPUs (by today's standards). But Linux runs only on
32-bit and wider CPUs. We can use that.
First: using 32x32->64 multiply and trivial 32-bit shift, we can correctly
divide by 10 much larger numbers, and thus we can print groups of 9 digits
instead of groups of 5 digits.
Next: there are two algorithms to print larger numbers. One is generic:
divide by 1000000000 and repeatedly print groups of (up to) 9 digits.
It's conceptually simple, but requires an (unsigned long long) /
1000000000 division.
Second algorithm splits 64-bit unsigned long long into 16-bit chunks,
manipulates them cleverly and generates groups of 4 decimal digits. It so
happens that it does NOT require long long division.
If long is > 32 bits, division of 64-bit values is relatively easy, and we
will use the first algorithm. If long long is > 64 bits (strange
architecture with VERY large long long), second algorithm can't be used,
and we again use the first one.
Else (if long is 32 bits and long long is 64 bits) we use second one.
And third: there is a simple optimization which takes fast path not only
for zero as was done before, but for all one-digit numbers.
In all tested cases new code is faster than old one, in many cases by 30%,
in few cases by more than 50% (for example, on x86-32, conversion of
12345678). Code growth is ~0 in 32-bit case and ~130 bytes in 64-bit
case.
This patch is based upon an original from Michal Nazarewicz.
[akpm@linux-foundation.org: checkpatch fixes]
Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Cc: Douglas W Jones <jones@cs.uiowa.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2012-05-31 17:49:27 -07:00
..
bitops
Add #includes needed to permit the removal of asm/system.h
2012-03-28 18:30:03 +01:00
4level-fixup.h
atomic-long.h
atomic.h
Remove all #inclusions of asm/system.h
2012-03-28 18:30:03 +01:00
atomic64.h
audit_change_attr.h
audit: support the "standard" <asm-generic/unistd.h>
2011-05-04 14:41:28 -04:00
audit_dir_write.h
audit: support the "standard" <asm-generic/unistd.h>
2011-05-04 14:41:28 -04:00
audit_read.h
audit: support the "standard" <asm-generic/unistd.h>
2011-05-04 14:41:28 -04:00
audit_signal.h
audit_write.h
audit: support the "standard" <asm-generic/unistd.h>
2011-05-04 14:41:28 -04:00
auxvec.h
barrier.h
Create asm-generic/barrier.h
2012-03-28 18:30:03 +01:00
bitops.h
bitops: remove minix bitops from asm/bitops.h
2011-03-23 19:46:22 -07:00
bitsperlong.h
vsprintf: further optimize decimal conversion
2012-05-31 17:49:27 -07:00
bug.h
consolidate WARN_...ONCE() static variables
2012-03-23 16:58:31 -07:00
bugs.h
cache.h
cacheflush.h
asm-generic/cacheflush.h: flush icache when copying to user pages
2011-05-25 08:39:37 -07:00
checksum.h
Add extra arch overrides to asm-generic/checksum.h
2011-11-01 07:34:21 -07:00
cmpxchg-local.h
Fix IRQ flag handling naming
2010-10-07 14:08:55 +01:00
cmpxchg.h
asm-generic: add linux/types.h to cmpxchg.h
2012-04-02 14:41:27 -07:00
cputime.h
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2012-01-06 08:44:54 -08:00
current.h
delay.h
asm-generic: delay.h fix udelay and ndelay for 8 bit args
2011-07-22 18:45:33 +02:00
device.h
div64.h
dma-coherent.h
common: add dma_mmap_from_coherent() function
2012-05-21 15:06:09 +02:00
dma-contiguous.h
drivers: add Contiguous Memory Allocator
2012-05-21 15:09:37 +02:00
dma-mapping-broken.h
dma-mapping: remove dma_is_consistent API
2010-08-11 08:59:21 -07:00
dma-mapping-common.h
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
2012-03-04 17:54:34 -05:00
dma.h
emergency-restart.h
errno-base.h
errno.h
mm: make __get_user_pages return -EHWPOISON for HWPOISON page optionally
2011-03-17 13:08:27 -03:00
exec.h
Split arch_align_stack() out from asm-generic/system.h
2012-03-28 18:30:03 +01:00
fb.h
fcntl.h
locks: move F_INPROGRESS from fl_type to fl_flags field
2011-08-19 13:25:34 -04:00
ftrace.h
asm-generic headers: add ftrace.h
2011-03-17 09:19:04 +08:00
futex.h
futex: Sanitize futex ops argument types
2011-03-11 12:23:31 +01:00
getorder.h
bitops: Add missing parentheses to new get_order macro
2012-02-24 10:39:27 -08:00
gpio.h
gpiolib: Remove 'const' from data argument of gpiochip_find()
2012-05-18 23:01:05 -06:00
hardirq.h
Fix IRQ flag handling naming
2010-10-07 14:08:55 +01:00
hw_irq.h
ide_iops.h
int-l64.h
int-ll64.h
io-64-nonatomic-hi-lo.h
asm-generic: architecture independent readq/writeq for 32bit environment
2012-02-21 16:47:28 -08:00
io-64-nonatomic-lo-hi.h
asm-generic: architecture independent readq/writeq for 32bit environment
2012-02-21 16:47:28 -08:00
io.h
lib: use generic pci_iomap on all architectures
2012-01-10 18:04:27 -08:00
ioctl.h
ioctls.h
tty: add TIOCVHANGUP to allow clean tty shutdown of all ttys
2011-02-17 14:16:30 -08:00
iomap.h
[PARISC] fix compile break caused by iomap: make IOPORT/PCI mapping functions conditional
2012-02-27 09:43:30 -06:00
ipcbuf.h
irq.h
irq_regs.h
core: Replace __get_cpu_var with __this_cpu_read if not used for an address.
2010-12-17 15:07:19 +01:00
irqflags.h
Fix IRQ flag handling naming
2010-10-07 14:08:55 +01:00
Kbuild
include: replace unifdef-y with header-y
2010-08-14 22:26:51 +02:00
Kbuild.asm
include: replace unifdef-y with header-y
2010-08-14 22:26:51 +02:00
kdebug.h
asm-generic: kdebug.h: Checkpatch cleanup
2010-10-09 21:51:44 +02:00
kmap_types.h
kvm_para.h
KVM: make asm-generic/kvm_para.h have an ifdef __KERNEL__ block
2012-05-21 17:47:52 +03:00
libata-portmap.h
linkage.h
local.h
atomic: use <linux/atomic.h>
2011-07-26 16:49:47 -07:00
local64.h
atomic: use <linux/atomic.h>
2011-07-26 16:49:47 -07:00
memory_model.h
mm: fix __page_to_pfn for a const struct page argument
2011-08-17 13:00:20 -07:00
mm_hooks.h
mman-common.h
coredump: add VM_NODUMP, MADV_NODUMP, MADV_CLEAR_NODUMP
2012-03-23 16:58:42 -07:00
mman.h
mmu.h
mmu_context.h
module.h
msgbuf.h
mutex-dec.h
mutex-null.h
mutex-xchg.h
mutex.h
page.h
The following changes since commit 3ee72ca992
2012-01-10 17:39:40 -08:00
param.h
UAPI: Rearrange definition of HZ in asm-generic/param.h
2011-12-13 09:26:45 +00:00
parport.h
pci-bridge.h
PCI: work around Stratus ftServer broken PCIe hierarchy
2012-04-30 15:21:02 -06:00
pci-dma-compat.h
pci.h
PCI: collapse pcibios_resource_to_bus
2012-02-23 20:19:04 -07:00
pci_iomap.h
[PARISC] fix compile break caused by iomap: make IOPORT/PCI mapping functions conditional
2012-02-27 09:43:30 -06:00
percpu.h
percpu: Optimize __get_cpu_var()
2010-09-10 10:56:51 +02:00
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h
mm: pmd_read_atomic: fix 32bit PAE pmd walk vs pmd_populate SMP race condition
2012-05-29 16:22:24 -07:00
poll.h
epoll: introduce POLLFREE to flush ->signalfd_wqh before kfree()
2012-02-24 11:42:50 -08:00
posix_types.h
posix_types: Introduce __kernel_[u]long_t
2012-02-20 12:48:47 -08:00
ptrace.h
asm-generic/ptrace.h: start a common low level ptrace helper
2011-05-26 17:12:36 -07:00
resource.h
ulimit: raise default hard ulimit on number of files to 4096
2011-05-25 08:39:43 -07:00
rtc.h
rwsem.h
Hexagon: Add locking types and functions
2011-11-01 07:34:20 -07:00
scatterlist.h
sections.h
x86: Separate out entry text section
2011-03-08 17:22:11 +01:00
segment.h
sembuf.h
serial.h
setup.h
shmbuf.h
shmparam.h
siginfo.h
Linux 3.4-rc5
2012-05-04 12:46:40 +10:00
signal-defs.h
signal.h
sizes.h
asm-generic headers: add sizes.h
2011-03-17 09:19:04 +08:00
socket.h
net: Add framework to allow sending packets with customized CRC.
2012-02-24 01:37:35 -08:00
sockios.h
spinlock.h
stat.h
asm-generic/stat.h: support 64-bit file time_t for stat()
2010-11-01 15:31:29 -04:00
statfs.h
asm-generic: Use __BITS_PER_LONG in statfs.h
2012-04-30 12:55:15 -07:00
string.h
swab.h
switch_to.h
Split the switch_to() wrapper out of asm-generic/system.h
2012-03-28 18:30:03 +01:00
syscall.h
asm/syscall.h: add syscall_get_arch
2012-04-14 11:13:19 +10:00
syscalls.h
Fix the declaration of sys_execve() in asm-generic/syscalls.h
2010-08-18 12:12:38 -07:00
termbits.h
tty: Add EXTPROC support for LINEMODE
2010-08-10 13:47:39 -07:00
termios-base.h
termios.h
timex.h
tlb.h
thp: add tlb_remove_pmd_tlb_entry
2012-01-12 20:13:08 -08:00
tlbflush.h
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
2012-03-04 17:54:34 -05:00
topology.h
topology: alternate fix for ia64 tiger_defconfig build breakage
2010-08-09 20:44:57 -07:00
types.h
consolidate umode_t declarations
2012-01-03 22:55:17 -05:00
uaccess-unaligned.h
uaccess.h
fix default __strnlen_user macro
2011-10-06 19:47:12 -04:00
ucontext.h
unaligned.h
unistd.h
compat: use sys_sendfile64() implementation for sendfile syscall
2012-03-27 13:36:57 -04:00
user.h
asm-generic/user.h: Fix spelling in comment
2011-03-01 15:49:39 +01:00
vga.h
vmlinux.lds.h
ftrace: Sort all function addresses, not just per page
2012-05-16 19:58:44 -04:00
word-at-a-time.h
word-at-a-time: make the interfaces truly generic
2012-05-26 11:33:40 -07:00
xor.h
sanitize <linux/prefetch.h> usage
2011-05-20 12:50:29 -07:00