Commit 8bc6666f authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by John Paul Adrian Glaubitz
Browse files

sh: Use generic GCC library routines



The C implementations of __ashldi3(), __ashrdi3__(), and __lshrdi3() in
arch/sh/lib/ are identical to the generic C implementations in lib/.
Reduce duplication by switching SH to the generic versions.

Update the include path in arch/sh/boot/compressed accordingly.

Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Acked-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
Reviewed-by: default avatarJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Link: https://lore.kernel.org/r/74dbe68dc8e2ffb6180092f73723fe21ab692c7a.1679566500.git.geert+renesas@glider.be


Signed-off-by: default avatarJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
parent 2d60eca5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@ config SUPERH
	select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST
	select GENERIC_IDLE_POLL_SETUP
	select GENERIC_IRQ_SHOW
	select GENERIC_LIB_ASHLDI3
	select GENERIC_LIB_ASHRDI3
	select GENERIC_LIB_LSHRDI3
	select GENERIC_PCI_IOMAP if PCI
	select GENERIC_SCHED_CLOCK
	select GENERIC_SMP_IDLE_THREAD
+2 −2
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
#include "../../lib/ashldi3.c"
// SPDX-License-Identifier: GPL-2.0-or-later
#include "../../../../lib/ashldi3.c"
+1 −3
Original line number Diff line number Diff line
@@ -7,9 +7,7 @@ lib-y = delay.o memmove.o memchr.o \
	 checksum.o strlen.o div64.o div64-generic.o

# Extracted from libgcc
obj-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \
	 ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \
	 udiv_qrnnd.o
obj-y += movmem.o ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o udiv_qrnnd.o

udivsi3-y			:= udivsi3_i4i-Os.o

arch/sh/lib/ashldi3.c

deleted100644 → 0
+0 −30
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#include <linux/module.h>

#include "libgcc.h"

long long __ashldi3(long long u, word_type b)
{
	DWunion uu, w;
	word_type bm;

	if (b == 0)
		return u;

	uu.ll = u;
	bm = 32 - b;

	if (bm <= 0) {
		w.s.low = 0;
		w.s.high = (unsigned int) uu.s.low << -bm;
	} else {
		const unsigned int carries = (unsigned int) uu.s.low >> bm;

		w.s.low = (unsigned int) uu.s.low << b;
		w.s.high = ((unsigned int) uu.s.high << b) | carries;
	}

	return w.ll;
}

EXPORT_SYMBOL(__ashldi3);

arch/sh/lib/ashrdi3.c

deleted100644 → 0
+0 −32
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#include <linux/module.h>

#include "libgcc.h"

long long __ashrdi3(long long u, word_type b)
{
	DWunion uu, w;
	word_type bm;

	if (b == 0)
		return u;

	uu.ll = u;
	bm = 32 - b;

	if (bm <= 0) {
		/* w.s.high = 1..1 or 0..0 */
		w.s.high =
		    uu.s.high >> 31;
		w.s.low = uu.s.high >> -bm;
	} else {
		const unsigned int carries = (unsigned int) uu.s.high << bm;

		w.s.high = uu.s.high >> b;
		w.s.low = ((unsigned int) uu.s.low >> b) | carries;
	}

	return w.ll;
}

EXPORT_SYMBOL(__ashrdi3);
Loading