linux-hardened/include/asm-arm
Nicolas Pitre fa4adc6149 [ARM] 3611/4: optimize do_div() when divisor is constant
On ARM all divisions have to be performed "manually".  For 64-bit
divisions that may take more than a hundred cycles in many cases.

With 32-bit divisions gcc already use the recyprocal of constant
divisors to perform a multiplication, but not with 64-bit divisions.

Since the kernel is increasingly relying upon 64-bit divisions it is
worth optimizing at least those cases where the divisor is a constant.
This is what this patch does using plain C code that gets optimized away
at compile time.

For example, despite the amount of added C code, do_div(x, 10000) now
produces the following assembly code (where x is assigned to r0-r1):

	adr	r4, .L0
	ldmia	r4, {r4-r5}
	umull	r2, r3, r4, r0
	mov	r2, #0
	umlal	r3, r2, r5, r0
	umlal	r3, r2, r4, r1
	mov	r3, #0
	umlal	r2, r3, r5, r1
	mov	r0, r2, lsr #11
	orr	r0, r0, r3, lsl #21
	mov	r1, r3, lsr #11
	...
.L0:
	.word	948328779
	.word	879609302

which is the fastest that can be done for any value of x in that case,
many times faster than the __do_div64 code (except for the small x value
space for which the result ends up being zero or a single bit).

The fact that this code is generated inline produces a tiny increase in
.text size, but not significant compared to the needed code around each
__do_div64 call site this code is replacing.

The algorithm used has been validated on a 16-bit scale for all possible
values, and then recodified for 64-bit values.  Furthermore I've been
running it with the final BUG_ON() uncommented for over two months now
with no problem.

Note that this new code is compiled with gcc versions 4.0 or later.
Earlier gcc versions proved themselves too problematic and only the
original code is used with them.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2006-12-07 16:06:09 +00:00
..
arch-aaec2000 [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-at91rm9200 [PATCH] atmel_serial: Pass fixed register mappings through platform_data 2006-10-04 10:25:05 -07:00
arch-cl7500 Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
arch-clps711x Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
arch-ebsa110 [ARM] ebsa110: fix warnings generated by asm/arch/io.h 2006-11-20 15:59:10 +00:00
arch-ebsa285 fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-ep93xx [PATCH] Cirrus Logic ep93xx ethernet driver 2006-09-22 20:13:23 -04:00
arch-h720x fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-imx Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
arch-integrator [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-iop32x [ARM] 3851/1: iop3xx: add io-data glantank support 2006-09-25 10:34:02 +01:00
arch-iop33x [ARM] 3832/1: iop3xx: coding style cleanup 2006-09-25 10:25:53 +01:00
arch-ixp4xx fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-ixp23xx [ARM] 3662/1: ixp23xx: don't include asm/hardware.h in uncompress.h 2006-06-28 17:54:56 +01:00
arch-ixp2000 [ARM] Fix decompressor serial IO to give CRLF not LFCR 2006-03-28 10:24:33 +01:00
arch-l7200 Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
arch-lh7a40x Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
arch-netx [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-omap fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-pnx4008 Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
arch-pxa [ARM] 3943/1: share declaration of struct pxa2xx_udc_mach_info between multiple platforms 2006-11-29 20:23:07 +00:00
arch-realview [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-rpc [ARM] Move FLUSH_BASE macros to asm/arch/memory.h 2006-04-07 13:22:21 +01:00
arch-s3c2410 fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-sa1100 [ARM] 3890/1: [Jornada7xx] Addition of MCU commands into jornada720.h 2006-10-14 16:02:00 +01:00
arch-shark fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-versatile [PATCH] arm-versatile iomem annotations 2006-10-11 11:17:06 -07:00
hardware Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
mach [ARM] 3943/1: share declaration of struct pxa2xx_udc_mach_info between multiple platforms 2006-11-29 20:23:07 +00:00
a.out.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
apm.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
assembler.h [ARM] Remove MODE_(SVC|IRQ|FIQ|USR) and DEFAULT_FIQ 2006-06-25 12:01:48 +01:00
atomic.h [ARM] 3810/1: switch atomic helpers over to raw_local_irq_{save,restore} 2006-09-25 10:25:24 +01:00
auxvec.h [PATCH] auxiliary vector cleanups 2005-09-07 16:57:21 -07:00
bitops.h [ARM] 3852/1: convert atomic bitops and __xchg over to raw_local_irq_{save,restore} 2006-09-25 10:34:03 +01:00
bug.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
bugs.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
byteorder.h [ARM] Fix byte order macros for Thumb 2006-06-19 15:35:36 +01:00
cache.h [PATCH] Kill L1_CACHE_SHIFT_MAX 2006-01-08 20:13:39 -08:00
cacheflush.h [ARM] Use CPU_CACHE_* where possible in asm/cacheflush.h 2006-09-27 18:00:35 +01:00
checksum.h [ARM] 3292/1: Fix memory corruption in asm-arm/checksum.h: ip_fast_csum() 2006-02-01 19:26:00 +00:00
cpu-multi32.h [PATCH] qualifiers in return types - easy cases 2005-08-23 18:43:45 -07:00
cpu-single.h [PATCH] qualifiers in return types - easy cases 2005-08-23 18:43:45 -07:00
cpu.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
cputime.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
current.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
delay.h [ARM] 3346/1: Fix udelay() for HZ values different from 100 2006-03-21 22:06:07 +00:00
div64.h [ARM] 3611/4: optimize do_div() when divisor is constant 2006-12-07 16:06:09 +00:00
dma-mapping.h [ARM] 3942/1: ARM: comment: consistent_sync should not be called directly 2006-11-22 22:45:57 +00:00
dma.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
domain.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
dyntick.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
ecard.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
elf.h [HEADERS] Fix ARM 'make headers_check' 2006-09-21 08:34:39 +01:00
emergency-restart.h [PATCH] Add emergency_restart() 2005-07-26 14:35:41 -07:00
errno.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
fcntl.h [PATCH] Clean up struct flock64 definitions 2005-09-07 16:57:38 -07:00
fiq.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
flat.h [ARM] nommu: create flat.h to support uClinux flat binaries 2006-09-20 14:58:35 +01:00
floppy.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
fpstate.h [ARM] 3370/2: ep93xx: add crunch support 2006-06-28 17:55:01 +01:00
futex.h [PATCH] consolidate asm/futex.h 2006-01-08 20:13:39 -08:00
glue.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
hardirq.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
hardware.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
hw_irq.h [PATCH] misc arm pt_regs fixes 2006-10-08 12:32:36 -07:00
ide.h [PATCH] ARM: 2758/1: Fix comment in file header to read "ARM" instead i386 2005-06-27 15:58:39 +01:00
io.h [PATCH] Consolidate check_signature 2006-10-11 11:14:23 -07:00
ioctl.h [PATCH] Generic ioctl.h 2006-01-10 08:01:34 -08:00
ioctls.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ipc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ipcbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
irq.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
irq_regs.h Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
irqflags.h [ARM] Add ARM irqtrace support 2006-09-20 14:58:35 +01:00
Kbuild Add empty Kbuild files for 'make headers_install' in remaining arches. 2006-06-18 12:58:53 +01:00
kmap_types.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
leds.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
limits.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
linkage.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
local.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
locks.h [ARM] 3019/1: fix wrong comments 2005-10-18 07:51:34 +01:00
mc146818rtc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
memory.h [ARM] 3705/1: add supersection support to ioremap() 2006-07-01 19:58:20 +01:00
mman.h [PATCH] add asm-generic/mman.h 2006-02-15 15:32:22 -08:00
mmu.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmu_context.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmzone.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
module.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
msgbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mtd-xip.h [MTD] XIP cleanup 2005-07-07 16:50:16 +02:00
mutex.h [ARM] 3311/1: clean up include/asm-arm/mutex.h 2006-02-08 21:19:38 +00:00
namei.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
nwflash.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
page-nommu.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
page.h Merge master.kernel.org:/pub/scm/linux/kernel/git/tmlind/linux-omap-upstream into devel 2006-09-27 19:57:54 +01:00
param.h [ARM] Move HZ definition into Kconfig 2006-03-21 22:05:45 +00:00
parport.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
pci.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
percpu.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
pgalloc.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
pgtable-hwdef.h [ARM] Set bit 4 on section mappings correctly depending on CPU 2006-06-29 18:24:21 +01:00
pgtable-nommu.h Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
pgtable.h Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2006-09-28 14:40:39 -07:00
poll.h [PATCH] POLLRDHUP/EPOLLRDHUP handling for half-closed devices notifications 2006-03-25 08:22:56 -08:00
posix_types.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
proc-fns.h [ARM] nommu: add ARM946E-S core support 2006-09-27 17:39:19 +01:00
processor.h [ARM] start_thread fixup for nommu mode 2006-01-13 21:04:17 +00:00
procinfo.h [ARM] 3756/1: Assign value for HWCAP_IWMMXT 2006-08-18 15:32:17 +01:00
ptrace.h [ARM] 3665/1: crunch: add ptrace support 2006-06-28 17:55:00 +01:00
resource.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
rtc.h [PATCH] RTC subsystem: ARM cleanup 2006-03-27 08:44:50 -08:00
scatterlist.h [ARM] Remove '__address' from scatterlist and convert to DMA API 2006-01-04 15:08:30 +00:00
sections.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
segment.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
semaphore-helper.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
semaphore.h [ARM] sema_count() removal 2005-12-01 20:58:01 +00:00
sembuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
serial.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
setup.h [ARM] Separate page table manipulation code from bootmem initialisation 2006-09-27 10:10:58 +01:00
shmbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
shmparam.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
sigcontext.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
siginfo.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
signal.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
sizes.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
smp.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
socket.h [AF_UNIX]: Datagram getpeersec 2006-06-29 16:58:06 -07:00
sockios.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
spinlock.h [PATCH] Directed yield: cpu_relax variants for spinlocks and rw-locks 2006-10-01 00:39:21 -07:00
spinlock_types.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
stat.h [ARM] 3106/2: ARM EABI: some syscall adjustments 2006-01-14 16:32:12 +00:00
statfs.h [ARM] 3108/2: old ABI compat: statfs64 and fstatfs64 2006-01-14 16:35:03 +00:00
string.h [PATCH] ARM: 2653/1: Fix memset and memzero macro double-reference of parameters 2005-04-25 23:40:05 +01:00
suspend.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
system.h [ARM] nommu: manage the CP15 things 2006-09-27 17:34:30 +01:00
termbits.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
termios.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
therm.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
thread_info.h Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2006-07-02 15:04:12 -07:00
thread_notify.h [ARM] Add thread_notify infrastructure 2006-06-22 10:24:18 +01:00
timex.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
tlb.h [ARM] noMMU: removes TLB codes in nommu mode 2006-03-21 22:03:20 +00:00
tlbflush.h [ARM] 3759/2: Remove uses of %? 2006-09-20 14:58:35 +01:00
topology.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
traps.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
types.h [PATCH] sab: consolidate kmem_bufctl_t 2005-09-05 00:05:48 -07:00
uaccess.h [ARM] Add __must_check to uaccess functions 2006-10-28 10:15:31 +01:00
ucontext.h [ARM] 3664/1: crunch: add signal frame save/restore 2006-06-28 17:54:59 +01:00
unaligned.h [ARM] 3849/1: fix get_unaligned() for gcc >= 4.1 2006-09-25 10:34:00 +01:00
unistd.h [PATCH] rename the provided execve functions to kernel_execve 2006-10-02 07:57:23 -07:00
user.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
vfp.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
vfpmacros.h [ARM] 3472/1: Use the D variants of FLDMIA/FSTMIA on ARMv6 2006-04-10 21:32:42 +01:00
vga.h [PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use 2006-06-22 15:05:58 -07:00
xor.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00