summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2009-08-08 20:18:38 -0700
committerKhem Raj <raj.khem@gmail.com>2009-08-08 20:18:38 -0700
commitcf58571e78182f7cc07c9619ca4ae0dc2e6b5153 (patch)
tree41f47975f825b83f68719a3a86d82549fbf16715
parent9f6ae8707682ecb1afd1cad1370204f74742aa31 (diff)
linux-titan-sh4-2.6.21: Provide sidivsi3_i4i and udivsi3_i4i
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r--recipes/linux/linux-titan-sh4-2.6.21/linux-sh-__sdivsi3_i4i.patch684
-rw-r--r--recipes/linux/linux-titan-sh4_2.6.21.bb3
2 files changed, 686 insertions, 1 deletions
diff --git a/recipes/linux/linux-titan-sh4-2.6.21/linux-sh-__sdivsi3_i4i.patch b/recipes/linux/linux-titan-sh4-2.6.21/linux-sh-__sdivsi3_i4i.patch
new file mode 100644
index 0000000000..057bfc196d
--- /dev/null
+++ b/recipes/linux/linux-titan-sh4-2.6.21/linux-sh-__sdivsi3_i4i.patch
@@ -0,0 +1,684 @@
+Index: linux-2.6.21/arch/sh/kernel/sh_ksyms.c
+===================================================================
+--- linux-2.6.21.orig/arch/sh/kernel/sh_ksyms.c 2009-08-08 16:52:36.627208225 -0700
++++ linux-2.6.21/arch/sh/kernel/sh_ksyms.c 2009-08-08 16:55:12.488253830 -0700
+@@ -82,6 +82,8 @@
+ DECLARE_EXPORT(__movmem_i4_even);
+ DECLARE_EXPORT(__movmem_i4_odd);
+ DECLARE_EXPORT(__movmemSI12_i4);
++DECLARE_EXPORT(__sdivsi3_i4i);
++DECLARE_EXPORT(__udivsi3_i4i);
+ #else /* GCC 3.x */
+ DECLARE_EXPORT(__movstr_i4_even);
+ DECLARE_EXPORT(__movstr_i4_odd);
+Index: linux-2.6.21/arch/sh/lib/udivsi3_i4i.S
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.21/arch/sh/lib/udivsi3_i4i.S 2009-08-08 16:56:38.980208882 -0700
+@@ -0,0 +1,666 @@
++/* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
++ 2004, 2005, 2006
++ Free Software Foundation, Inc.
++
++This file is free software; you can redistribute it and/or modify it
++under the terms of the GNU General Public License as published by the
++Free Software Foundation; either version 2, or (at your option) any
++later version.
++
++In addition to the permissions in the GNU General Public License, the
++Free Software Foundation gives you unlimited permission to link the
++compiled version of this file into combinations with other programs,
++and to distribute those combinations without any restriction coming
++from the use of this file. (The General Public License restrictions
++do apply in other respects; for example, they cover modification of
++the file, and distribution when not linked into a combine
++executable.)
++
++This file is distributed in the hope that it will be useful, but
++WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program; see the file COPYING. If not, write to
++the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++Boston, MA 02110-1301, USA. */
++
++!! libgcc routines for the Renesas / SuperH SH CPUs.
++!! Contributed by Steve Chamberlain.
++!! sac@cygnus.com
++
++!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
++!! recoded in assembly by Toshiyasu Morita
++!! tm@netcom.com
++
++/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
++ ELF local label prefixes by J"orn Rennecke
++ amylaar@cygnus.com */
++
++/* This code used shld, thus is not suitable for SH1 / SH2. */
++
++/* Signed / unsigned division without use of FPU, optimized for SH4.
++ Uses a lookup table for divisors in the range -128 .. +128, and
++ div1 with case distinction for larger divisors in three more ranges.
++ The code is lumped together with the table to allow the use of mova. */
++#ifdef CONFIG_CPU_LITTLE_ENDIAN
++#define L_LSB 0
++#define L_LSWMSB 1
++#define L_MSWLSB 2
++#else
++#define L_LSB 3
++#define L_LSWMSB 2
++#define L_MSWLSB 1
++#endif
++
++ .balign 4
++ .global __udivsi3_i4i
++ .global __udivsi3_i4
++ .set __udivsi3_i4, __udivsi3_i4i
++ .type __udivsi3_i4i, @function
++__udivsi3_i4i:
++ mov.w c128_w, r1
++ div0u
++ mov r4,r0
++ shlr8 r0
++ cmp/hi r1,r5
++ extu.w r5,r1
++ bf udiv_le128
++ cmp/eq r5,r1
++ bf udiv_ge64k
++ shlr r0
++ mov r5,r1
++ shll16 r5
++ mov.l r4,@-r15
++ div1 r5,r0
++ mov.l r1,@-r15
++ div1 r5,r0
++ div1 r5,r0
++ bra udiv_25
++ div1 r5,r0
++
++div_le128:
++ mova div_table_ix,r0
++ bra div_le128_2
++ mov.b @(r0,r5),r1
++udiv_le128:
++ mov.l r4,@-r15
++ mova div_table_ix,r0
++ mov.b @(r0,r5),r1
++ mov.l r5,@-r15
++div_le128_2:
++ mova div_table_inv,r0
++ mov.l @(r0,r1),r1
++ mov r5,r0
++ tst #0xfe,r0
++ mova div_table_clz,r0
++ dmulu.l r1,r4
++ mov.b @(r0,r5),r1
++ bt/s div_by_1
++ mov r4,r0
++ mov.l @r15+,r5
++ sts mach,r0
++ /* clrt */
++ addc r4,r0
++ mov.l @r15+,r4
++ rotcr r0
++ rts
++ shld r1,r0
++
++div_by_1_neg:
++ neg r4,r0
++div_by_1:
++ mov.l @r15+,r5
++ rts
++ mov.l @r15+,r4
++
++div_ge64k:
++ bt/s div_r8
++ div0u
++ shll8 r5
++ bra div_ge64k_2
++ div1 r5,r0
++udiv_ge64k:
++ cmp/hi r0,r5
++ mov r5,r1
++ bt udiv_r8
++ shll8 r5
++ mov.l r4,@-r15
++ div1 r5,r0
++ mov.l r1,@-r15
++div_ge64k_2:
++ div1 r5,r0
++ mov.l zero_l,r1
++ .rept 4
++ div1 r5,r0
++ .endr
++ mov.l r1,@-r15
++ div1 r5,r0
++ mov.w m256_w,r1
++ div1 r5,r0
++ mov.b r0,@(L_LSWMSB,r15)
++ xor r4,r0
++ and r1,r0
++ bra div_ge64k_end
++ xor r4,r0
++
++div_r8:
++ shll16 r4
++ bra div_r8_2
++ shll8 r4
++udiv_r8:
++ mov.l r4,@-r15
++ shll16 r4
++ clrt
++ shll8 r4
++ mov.l r5,@-r15
++div_r8_2:
++ rotcl r4
++ mov r0,r1
++ div1 r5,r1
++ mov r4,r0
++ rotcl r0
++ mov r5,r4
++ div1 r5,r1
++ .rept 5
++ rotcl r0; div1 r5,r1
++ .endr
++ rotcl r0
++ mov.l @r15+,r5
++ div1 r4,r1
++ mov.l @r15+,r4
++ rts
++ rotcl r0
++
++ .global __sdivsi3_i4i
++ .global __sdivsi3_i4
++ .global __sdivsi3
++ .set __sdivsi3_i4, __sdivsi3_i4i
++ .set __sdivsi3, __sdivsi3_i4i
++ .type __sdivsi3_i4i, @function
++ /* This is link-compatible with a __sdivsi3 call,
++ but we effectively clobber only r1. */
++__sdivsi3_i4i:
++ mov.l r4,@-r15
++ cmp/pz r5
++ mov.w c128_w, r1
++ bt/s pos_divisor
++ cmp/pz r4
++ mov.l r5,@-r15
++ neg r5,r5
++ bt/s neg_result
++ cmp/hi r1,r5
++ neg r4,r4
++pos_result:
++ extu.w r5,r0
++ bf div_le128
++ cmp/eq r5,r0
++ mov r4,r0
++ shlr8 r0
++ bf/s div_ge64k
++ cmp/hi r0,r5
++ div0u
++ shll16 r5
++ div1 r5,r0
++ div1 r5,r0
++ div1 r5,r0
++udiv_25:
++ mov.l zero_l,r1
++ div1 r5,r0
++ div1 r5,r0
++ mov.l r1,@-r15
++ .rept 3
++ div1 r5,r0
++ .endr
++ mov.b r0,@(L_MSWLSB,r15)
++ xtrct r4,r0
++ swap.w r0,r0
++ .rept 8
++ div1 r5,r0
++ .endr
++ mov.b r0,@(L_LSWMSB,r15)
++div_ge64k_end:
++ .rept 8
++ div1 r5,r0
++ .endr
++ mov.l @r15+,r4 ! zero-extension and swap using LS unit.
++ extu.b r0,r0
++ mov.l @r15+,r5
++ or r4,r0
++ mov.l @r15+,r4
++ rts
++ rotcl r0
++
++div_le128_neg:
++ tst #0xfe,r0
++ mova div_table_ix,r0
++ mov.b @(r0,r5),r1
++ mova div_table_inv,r0
++ bt/s div_by_1_neg
++ mov.l @(r0,r1),r1
++ mova div_table_clz,r0
++ dmulu.l r1,r4
++ mov.b @(r0,r5),r1
++ mov.l @r15+,r5
++ sts mach,r0
++ /* clrt */
++ addc r4,r0
++ mov.l @r15+,r4
++ rotcr r0
++ shld r1,r0
++ rts
++ neg r0,r0
++
++pos_divisor:
++ mov.l r5,@-r15
++ bt/s pos_result
++ cmp/hi r1,r5
++ neg r4,r4
++neg_result:
++ extu.w r5,r0
++ bf div_le128_neg
++ cmp/eq r5,r0
++ mov r4,r0
++ shlr8 r0
++ bf/s div_ge64k_neg
++ cmp/hi r0,r5
++ div0u
++ mov.l zero_l,r1
++ shll16 r5
++ div1 r5,r0
++ mov.l r1,@-r15
++ .rept 7
++ div1 r5,r0
++ .endr
++ mov.b r0,@(L_MSWLSB,r15)
++ xtrct r4,r0
++ swap.w r0,r0
++ .rept 8
++ div1 r5,r0
++ .endr
++ mov.b r0,@(L_LSWMSB,r15)
++div_ge64k_neg_end:
++ .rept 8
++ div1 r5,r0
++ .endr
++ mov.l @r15+,r4 ! zero-extension and swap using LS unit.
++ extu.b r0,r1
++ mov.l @r15+,r5
++ or r4,r1
++div_r8_neg_end:
++ mov.l @r15+,r4
++ rotcl r1
++ rts
++ neg r1,r0
++
++div_ge64k_neg:
++ bt/s div_r8_neg
++ div0u
++ shll8 r5
++ mov.l zero_l,r1
++ .rept 6
++ div1 r5,r0
++ .endr
++ mov.l r1,@-r15
++ div1 r5,r0
++ mov.w m256_w,r1
++ div1 r5,r0
++ mov.b r0,@(L_LSWMSB,r15)
++ xor r4,r0
++ and r1,r0
++ bra div_ge64k_neg_end
++ xor r4,r0
++
++c128_w:
++ .word 128
++
++div_r8_neg:
++ clrt
++ shll16 r4
++ mov r4,r1
++ shll8 r1
++ mov r5,r4
++ .rept 7
++ rotcl r1; div1 r5,r0
++ .endr
++ mov.l @r15+,r5
++ rotcl r1
++ bra div_r8_neg_end
++ div1 r4,r0
++
++m256_w:
++ .word 0xff00
++/* This table has been generated by divtab-sh4.c. */
++ .balign 4
++div_table_clz:
++ .byte 0
++ .byte 1
++ .byte 0
++ .byte -1
++ .byte -1
++ .byte -2
++ .byte -2
++ .byte -2
++ .byte -2
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -3
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -4
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -5
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++ .byte -6
++/* Lookup table translating positive divisor to index into table of
++ normalized inverse. N.B. the '0' entry is also the last entry of the
++ previous table, and causes an unaligned access for division by zero. */
++div_table_ix:
++ .byte -6
++ .byte -128
++ .byte -128
++ .byte 0
++ .byte -128
++ .byte -64
++ .byte 0
++ .byte 64
++ .byte -128
++ .byte -96
++ .byte -64
++ .byte -32
++ .byte 0
++ .byte 32
++ .byte 64
++ .byte 96
++ .byte -128
++ .byte -112
++ .byte -96
++ .byte -80
++ .byte -64
++ .byte -48
++ .byte -32
++ .byte -16
++ .byte 0
++ .byte 16
++ .byte 32
++ .byte 48
++ .byte 64
++ .byte 80
++ .byte 96
++ .byte 112
++ .byte -128
++ .byte -120
++ .byte -112
++ .byte -104
++ .byte -96
++ .byte -88
++ .byte -80
++ .byte -72
++ .byte -64
++ .byte -56
++ .byte -48
++ .byte -40
++ .byte -32
++ .byte -24
++ .byte -16
++ .byte -8
++ .byte 0
++ .byte 8
++ .byte 16
++ .byte 24
++ .byte 32
++ .byte 40
++ .byte 48
++ .byte 56
++ .byte 64
++ .byte 72
++ .byte 80
++ .byte 88
++ .byte 96
++ .byte 104
++ .byte 112
++ .byte 120
++ .byte -128
++ .byte -124
++ .byte -120
++ .byte -116
++ .byte -112
++ .byte -108
++ .byte -104
++ .byte -100
++ .byte -96
++ .byte -92
++ .byte -88
++ .byte -84
++ .byte -80
++ .byte -76
++ .byte -72
++ .byte -68
++ .byte -64
++ .byte -60
++ .byte -56
++ .byte -52
++ .byte -48
++ .byte -44
++ .byte -40
++ .byte -36
++ .byte -32
++ .byte -28
++ .byte -24
++ .byte -20
++ .byte -16
++ .byte -12
++ .byte -8
++ .byte -4
++ .byte 0
++ .byte 4
++ .byte 8
++ .byte 12
++ .byte 16
++ .byte 20
++ .byte 24
++ .byte 28
++ .byte 32
++ .byte 36
++ .byte 40
++ .byte 44
++ .byte 48
++ .byte 52
++ .byte 56
++ .byte 60
++ .byte 64
++ .byte 68
++ .byte 72
++ .byte 76
++ .byte 80
++ .byte 84
++ .byte 88
++ .byte 92
++ .byte 96
++ .byte 100
++ .byte 104
++ .byte 108
++ .byte 112
++ .byte 116
++ .byte 120
++ .byte 124
++ .byte -128
++/* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */
++ .balign 4
++zero_l:
++ .long 0x0
++ .long 0xF81F81F9
++ .long 0xF07C1F08
++ .long 0xE9131AC0
++ .long 0xE1E1E1E2
++ .long 0xDAE6076C
++ .long 0xD41D41D5
++ .long 0xCD856891
++ .long 0xC71C71C8
++ .long 0xC0E07039
++ .long 0xBACF914D
++ .long 0xB4E81B4F
++ .long 0xAF286BCB
++ .long 0xA98EF607
++ .long 0xA41A41A5
++ .long 0x9EC8E952
++ .long 0x9999999A
++ .long 0x948B0FCE
++ .long 0x8F9C18FA
++ .long 0x8ACB90F7
++ .long 0x86186187
++ .long 0x81818182
++ .long 0x7D05F418
++ .long 0x78A4C818
++ .long 0x745D1746
++ .long 0x702E05C1
++ .long 0x6C16C16D
++ .long 0x68168169
++ .long 0x642C8591
++ .long 0x60581606
++ .long 0x5C9882BA
++ .long 0x58ED2309
++div_table_inv:
++ .long 0x55555556
++ .long 0x51D07EAF
++ .long 0x4E5E0A73
++ .long 0x4AFD6A06
++ .long 0x47AE147B
++ .long 0x446F8657
++ .long 0x41414142
++ .long 0x3E22CBCF
++ .long 0x3B13B13C
++ .long 0x38138139
++ .long 0x3521CFB3
++ .long 0x323E34A3
++ .long 0x2F684BDB
++ .long 0x2C9FB4D9
++ .long 0x29E4129F
++ .long 0x27350B89
++ .long 0x24924925
++ .long 0x21FB7813
++ .long 0x1F7047DD
++ .long 0x1CF06ADB
++ .long 0x1A7B9612
++ .long 0x18118119
++ .long 0x15B1E5F8
++ .long 0x135C8114
++ .long 0x11111112
++ .long 0xECF56BF
++ .long 0xC9714FC
++ .long 0xA6810A7
++ .long 0x8421085
++ .long 0x624DD30
++ .long 0x4104105
++ .long 0x2040811
++ /* maximum error: 0.987342 scaled: 0.921875*/
diff --git a/recipes/linux/linux-titan-sh4_2.6.21.bb b/recipes/linux/linux-titan-sh4_2.6.21.bb
index e40a79b4c8..ef5ffad0db 100644
--- a/recipes/linux/linux-titan-sh4_2.6.21.bb
+++ b/recipes/linux/linux-titan-sh4_2.6.21.bb
@@ -1,13 +1,14 @@
SECTION = "kernel"
DESCRIPTION = "Linux kernel for SH4 based TITAN (NP51R/LinkGear Series 100) router appliance"
LICENSE = "GPL"
-PR = "r1"
+PR = "r2"
SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \
file://titan-flash.patch;patch=1 \
file://titan-pcibios-scan-update.patch;patch=1 \
file://no-mm-mutex.patch;patch=1 \
file://linux-2.6-limits.patch;patch=1 \
+ file://linux-sh-__sdivsi3_i4i.patch;patch=1 \
file://titan-config"
S = "${WORKDIR}/linux-${PV}"