Commit a71a29de authored by Yoshinori Sato's avatar Yoshinori Sato
Browse files

h8300: library functions

parent bbeb79ac
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
#
# Makefile for H8/300-specific library files..
#

lib-y  = memcpy.o memset.o abs.o strncpy.o \
	 mulsi3.o udivsi3.o muldi3.o moddivsi3.o \
	 ashldi3.o lshrdi3.o ashrdi3.o ucmpdi2.o \
	 delay.o

arch/h8300/lib/abs.S

0 → 100644
+20 −0
Original line number Diff line number Diff line
;;; abs.S

#include <asm/linkage.h>

#if defined(CONFIG_CPU_H8300H)
	.h8300h
#endif
#if defined(CONFIG_CPU_H8S)
	.h8300s
#endif
	.text
.global _abs

;;; int abs(int n)
_abs:
	mov.l	er0,er0
	bpl	1f
	neg.l	er0
1:
	rts
+24 −0
Original line number Diff line number Diff line
#include "libgcc.h"

DWtype
__ashldi3(DWtype u, word_type b)
{
	const DWunion uu = {.ll = u};
	const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
	DWunion w;

	if (b == 0)
		return u;

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

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

	return w.ll;
}
+24 −0
Original line number Diff line number Diff line
#include "libgcc.h"

DWtype __ashrdi3(DWtype u, word_type b)
{
	const DWunion uu = {.ll = u};
	const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
	DWunion w;

	if (b == 0)
		return u;

	if (bm <= 0) {
		/* w.s.high = 1..1 or 0..0 */
		w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
		w.s.low = uu.s.high >> -bm;
	} else {
		const UWtype carries = (UWtype) uu.s.high << bm;

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

	return w.ll;
}

arch/h8300/lib/delay.c

0 → 100644
+40 −0
Original line number Diff line number Diff line
/*
 * delay loops
 *
 * Copyright (C) 2015 Yoshinori Sato
 */

#include <linux/module.h>
#include <linux/delay.h>
#include <asm/param.h>
#include <asm/processor.h>
#include <asm/timex.h>

void __delay(unsigned long cycles)
{
	__asm__ volatile ("1: dec.l #1,%0\n\t"
			  "bne 1b":"=r"(cycles):"0"(cycles));
}
EXPORT_SYMBOL(__delay);

void __const_udelay(unsigned long xloops)
{
	u64 loops;

	loops = (u64)xloops * loops_per_jiffy * HZ;

	__delay(loops >> 32);
}
EXPORT_SYMBOL(__const_udelay);

void __udelay(unsigned long usecs)
{
	__const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */
}
EXPORT_SYMBOL(__udelay);

void __ndelay(unsigned long nsecs)
{
	__const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */
}
EXPORT_SYMBOL(__ndelay);
Loading