summaryrefslogtreecommitdiff
path: root/arch/sh/lib/ashldi3.c
diff options
context:
space:
mode:
authorPhil Edworthy <PHIL.EDWORTHY@renesas.com>2011-06-02 22:15:27 +0000
committerNobuhiro Iwamatsu <iwamatsu@nigauri.org>2011-08-22 13:16:08 +0900
commiteeb84df6e43212a31e96402788ec9b3e39a399a6 (patch)
treedddfac8b8a475474d02f60e450653d3a1fa53577 /arch/sh/lib/ashldi3.c
parent7fbeb6422d9fb32063c8357fcdee99f0088a1a7f (diff)
sh: Add support for SH2A freestanding build
SH2A toolchains often only provide an fdpic version of libgcc. This can't be used with bare-metal software like U-Boot, so this patch provides the necessary functions extracted from libgcc. Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com> Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org> Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Diffstat (limited to 'arch/sh/lib/ashldi3.c')
-rw-r--r--arch/sh/lib/ashldi3.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/sh/lib/ashldi3.c b/arch/sh/lib/ashldi3.c
new file mode 100644
index 0000000000..9b50d866a0
--- /dev/null
+++ b/arch/sh/lib/ashldi3.c
@@ -0,0 +1,25 @@
+#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;
+}