Skip to content

Commit

Permalink
m68k: handle presence of 64bit mul/div instructions cleanly
Browse files Browse the repository at this point in the history
The traditional 68000 processors and the newer reduced instruction set
ColdFire processors do not support the 32*32->64 multiply or the 64/32->32
divide instructions. This is not a difference based on the presence of
a hardware MMU or not.

Create a new config symbol to mark that a CPU type doesn't support the
longer multiply/divide instructions. Use this then as a basis for using
the fast 64bit based divide (in div64.h) and for linking in the extra
libgcc functions that may be required (mulsi3, divsi3, etc).

Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
  • Loading branch information
Greg Ungerer committed Dec 24, 2011
1 parent 7f73baf commit 84f3fb7
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 10 deletions.
3 changes: 3 additions & 0 deletions arch/m68k/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ config ZONE_DMA
config CPU_HAS_NO_BITFIELDS
bool

config CPU_HAS_NO_MULDIV64
bool

config HZ
int
default 1000 if CLEOPATRA
Expand Down
2 changes: 2 additions & 0 deletions arch/m68k/Kconfig.cpu
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ comment "Processor Type"
config M68000
bool
select CPU_HAS_NO_BITFIELDS
select CPU_HAS_NO_MULDIV64
select GENERIC_CSUM
help
The Freescale (was Motorola) 68000 CPU is the first generation of
Expand All @@ -24,6 +25,7 @@ config COLDFIRE
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
select CPU_HAS_NO_BITFIELDS
select CPU_HAS_NO_MULDIV64
select GENERIC_CSUM
help
The Freescale ColdFire family of processors is a modern derivitive
Expand Down
8 changes: 4 additions & 4 deletions arch/m68k/include/asm/div64.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#ifndef _M68K_DIV64_H
#define _M68K_DIV64_H

#ifdef CONFIG_MMU
#ifdef CONFIG_CPU_HAS_NO_MULDIV64
#include <asm-generic/div64.h>
#else

#include <linux/types.h>

Expand All @@ -27,8 +29,6 @@
__rem; \
})

#else
#include <asm-generic/div64.h>
#endif /* CONFIG_MMU */
#endif /* CONFIG_CPU_HAS_NO_MULDIV64 */

#endif /* _M68K_DIV64_H */
2 changes: 1 addition & 1 deletion arch/m68k/kernel/m68k_ksyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ EXPORT_SYMBOL(__ashrdi3);
EXPORT_SYMBOL(__lshrdi3);
EXPORT_SYMBOL(__muldi3);

#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
#if defined(CONFIG_CPU_HAS_NO_MULDIV64)
/*
* Simpler 68k and ColdFire parts also need a few other gcc functions.
*/
Expand Down
8 changes: 3 additions & 5 deletions arch/m68k/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
lib-y := ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
memcpy.o memset.o memmove.o

ifdef CONFIG_MMU
lib-y += string.o uaccess.o
else
lib-y += mulsi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o
endif
lib-$(CONFIG_MMU) += string.o uaccess.o
lib-$(CONFIG_CPU_HAS_NO_MULDIV64) += mulsi3.o divsi3.o udivsi3.o
lib-$(CONFIG_CPU_HAS_NO_MULDIV64) += modsi3.o umodsi3.o

ifndef CONFIG_GENERIC_CSUM
lib-y += checksum.o
Expand Down

0 comments on commit 84f3fb7

Please sign in to comment.