diff options
Diffstat (limited to 'arch/m32r/lib')
-rw-r--r-- | arch/m32r/lib/Makefile | 7 | ||||
-rw-r--r-- | arch/m32r/lib/ashxdi3.S | 294 | ||||
-rw-r--r-- | arch/m32r/lib/checksum.S | 320 | ||||
-rw-r--r-- | arch/m32r/lib/csum_partial_copy.c | 59 | ||||
-rw-r--r-- | arch/m32r/lib/delay.c | 130 | ||||
-rw-r--r-- | arch/m32r/lib/libgcc.h | 24 | ||||
-rw-r--r-- | arch/m32r/lib/memcpy.S | 93 | ||||
-rw-r--r-- | arch/m32r/lib/memset.S | 179 | ||||
-rw-r--r-- | arch/m32r/lib/strlen.S | 118 | ||||
-rw-r--r-- | arch/m32r/lib/ucmpdi2.c | 18 | ||||
-rw-r--r-- | arch/m32r/lib/usercopy.c | 362 |
11 files changed, 0 insertions, 1604 deletions
diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile deleted file mode 100644 index 5889eb9610b5..000000000000 --- a/arch/m32r/lib/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# Makefile for M32R-specific library files.. -# - -lib-y := checksum.o ashxdi3.o memset.o memcpy.o \ - delay.o strlen.o usercopy.o csum_partial_copy.o \ - ucmpdi2.o diff --git a/arch/m32r/lib/ashxdi3.S b/arch/m32r/lib/ashxdi3.S deleted file mode 100644 index cd1acca53911..000000000000 --- a/arch/m32r/lib/ashxdi3.S +++ /dev/null @@ -1,294 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/arch/m32r/lib/ashxdi3.S - * - * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata - * - */ - -; -; input (r0,r1) src -; input r2 shift val -; r3 scratch -; output (r0,r1) -; - -#ifdef CONFIG_ISA_DUAL_ISSUE - -#ifndef __LITTLE_ENDIAN__ - - .text - .align 4 - .globl __ashrdi3 -__ashrdi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r1, r0 || srai r0, #31 - addi r2, #-32 - sra r1, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 || srl r1, r2 - sra r0, r2 || neg r2, r2 - sll r3, r2 - or r1, r3 || jmp r14 - - .align 4 - .globl __ashldi3 - .globl __lshldi3 -__ashldi3: -__lshldi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r0, r1 || addi r2, #-32 - sll r0, r2 || ldi r1, #0 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 || sll r0, r2 - sll r1, r2 || neg r2, r2 - srl r3, r2 - or r0, r3 || jmp r14 - - .align 4 - .globl __lshrdi3 -__lshrdi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r1, r0 || addi r2, #-32 - ldi r0, #0 || srl r1, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 || srl r1, r2 - srl r0, r2 || neg r2, r2 - sll r3, r2 - or r1, r3 || jmp r14 - -#else /* LITTLE_ENDIAN */ - - .text - .align 4 - .globl __ashrdi3 -__ashrdi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r0, r1 || srai r1, #31 - addi r2, #-32 - sra r0, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 || srl r0, r2 - sra r1, r2 || neg r2, r2 - sll r3, r2 - or r0, r3 || jmp r14 - - .align 4 - .globl __ashldi3 - .globl __lshldi3 -__ashldi3: -__lshldi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r1, r0 || addi r2, #-32 - sll r1, r2 || ldi r0, #0 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 || sll r1, r2 - sll r0, r2 || neg r2, r2 - srl r3, r2 - or r1, r3 || jmp r14 - - .align 4 - .globl __lshrdi3 -__lshrdi3: - cmpz r2 || ldi r3, #32 - jc r14 || cmpu r2, r3 - bc 1f - ; case 32 =< shift - mv r0, r1 || addi r2, #-32 - ldi r1, #0 || srl r0, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 || srl r0, r2 - srl r1, r2 || neg r2, r2 - sll r3, r2 - or r0, r3 || jmp r14 - -#endif - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - -#ifndef __LITTLE_ENDIAN__ - - .text - .align 4 - .globl __ashrdi3 -__ashrdi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r1, r0 - srai r0, #31 - addi r2, #-32 - sra r1, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 - srl r1, r2 - sra r0, r2 - neg r2, r2 - sll r3, r2 - or r1, r3 - .fillinsn -2: - jmp r14 - - .align 4 - .globl __ashldi3 - .globl __lshldi3 -__ashldi3: -__lshldi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r0, r1 - addi r2, #-32 - sll r0, r2 - ldi r1, #0 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 - sll r0, r2 - sll r1, r2 - neg r2, r2 - srl r3, r2 - or r0, r3 - .fillinsn -2: - jmp r14 - - .align 4 - .globl __lshrdi3 -__lshrdi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r1, r0 - ldi r0, #0 - addi r2, #-32 - srl r1, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 - srl r1, r2 - srl r0, r2 - neg r2, r2 - sll r3, r2 - or r1, r3 - .fillinsn -2: - jmp r14 - -#else - - .text - .align 4 - .globl __ashrdi3 -__ashrdi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r0, r1 - srai r1, #31 - addi r2, #-32 - sra r0, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 - srl r0, r2 - sra r1, r2 - neg r2, r2 - sll r3, r2 - or r0, r3 - .fillinsn -2: - jmp r14 - - .align 4 - .globl __ashldi3 - .globl __lshldi3 -__ashldi3: -__lshldi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r1, r0 - addi r2, #-32 - sll r1, r2 - ldi r0, #0 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r0 - sll r1, r2 - sll r0, r2 - neg r2, r2 - srl r3, r2 - or r1, r3 - .fillinsn -2: - jmp r14 - - .align 4 - .globl __lshrdi3 -__lshrdi3: - beqz r2, 2f - cmpui r2, #32 - bc 1f - ; case 32 =< shift - mv r0, r1 - ldi r1, #0 - addi r2, #-32 - srl r0, r2 - jmp r14 - .fillinsn -1: ; case shift <32 - mv r3, r1 - srl r0, r2 - srl r1, r2 - neg r2, r2 - sll r3, r2 - or r0, r3 - .fillinsn -2: - jmp r14 - -#endif - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - - .end diff --git a/arch/m32r/lib/checksum.S b/arch/m32r/lib/checksum.S deleted file mode 100644 index 0af0360c76d9..000000000000 --- a/arch/m32r/lib/checksum.S +++ /dev/null @@ -1,320 +0,0 @@ -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * IP/TCP/UDP checksumming routines - * - * Authors: Jorge Cwik, <jorge@laser.satlink.net> - * Arnt Gulbrandsen, <agulbra@nvg.unit.no> - * Tom May, <ftom@netcom.com> - * Pentium Pro/II routines: - * Alexander Kjeldaas <astor@guardian.no> - * Finn Arne Gangstad <finnag@guardian.no> - * Lots of code moved from tcp.c and ip.c; see those files - * for more names. - * - * Changes: Ingo Molnar, converted csum_partial_copy() to 2.1 exception - * handling. - * Andi Kleen, add zeroing on error - * converted to pure assembler - * Hirokazu Takata,Hiroyuki Kondo rewrite for the m32r architecture. - * - * This program 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 of the License, or (at your option) any later version. - */ - -#include <linux/linkage.h> -#include <asm/assembler.h> -#include <asm/errno.h> - -/* - * computes a partial checksum, e.g. for TCP/UDP fragments - */ - -/* -unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) - */ - - -#ifdef CONFIG_ISA_DUAL_ISSUE - - /* - * Experiments with Ethernet and SLIP connections show that buff - * is aligned on either a 2-byte or 4-byte boundary. We get at - * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. - * Fortunately, it is easy to convert 2-byte alignment to 4-byte - * alignment for the unrolled loop. - */ - - .text -ENTRY(csum_partial) - ; Function args - ; r0: unsigned char *buff - ; r1: int len - ; r2: unsigned int sum - - push r2 || ldi r2, #0 - and3 r7, r0, #1 ; Check alignment. - beqz r7, 1f ; Jump if alignment is ok. - ; 1-byte mis aligned - ldub r4, @r0 || addi r0, #1 - ; clear c-bit || Alignment uses up bytes. - cmp r0, r0 || addi r1, #-1 - ldi r3, #0 || addx r2, r4 - addx r2, r3 - .fillinsn -1: - and3 r4, r0, #2 ; Check alignment. - beqz r4, 2f ; Jump if alignment is ok. - ; clear c-bit || Alignment uses up two bytes. - cmp r0, r0 || addi r1, #-2 - bgtz r1, 1f ; Jump if we had at least two bytes. - bra 4f || addi r1, #2 - .fillinsn ; len(r1) was < 2. Deal with it. -1: - ; 2-byte aligned - lduh r4, @r0 || ldi r3, #0 - addx r2, r4 || addi r0, #2 - addx r2, r3 - .fillinsn -2: - ; 4-byte aligned - cmp r0, r0 ; clear c-bit - srl3 r6, r1, #5 - beqz r6, 2f - .fillinsn - -1: ld r3, @r0+ - ld r4, @r0+ ; +4 - ld r5, @r0+ ; +8 - ld r3, @r0+ || addx r2, r3 ; +12 - ld r4, @r0+ || addx r2, r4 ; +16 - ld r5, @r0+ || addx r2, r5 ; +20 - ld r3, @r0+ || addx r2, r3 ; +24 - ld r4, @r0+ || addx r2, r4 ; +28 - addx r2, r5 || addi r6, #-1 - addx r2, r3 - addx r2, r4 - bnez r6, 1b - - addx r2, r6 ; r6=0 - cmp r0, r0 ; This clears c-bit - .fillinsn -2: and3 r6, r1, #0x1c ; withdraw len - beqz r6, 4f - srli r6, #2 - .fillinsn - -3: ld r4, @r0+ || addi r6, #-1 - addx r2, r4 - bnez r6, 3b - - addx r2, r6 ; r6=0 - cmp r0, r0 ; This clears c-bit - .fillinsn -4: and3 r1, r1, #3 - beqz r1, 7f ; if len == 0 goto end - and3 r6, r1, #2 - beqz r6, 5f ; if len < 2 goto 5f(1byte) - lduh r4, @r0 || addi r0, #2 - addi r1, #-2 || slli r4, #16 - addx r2, r4 - beqz r1, 6f - .fillinsn -5: ldub r4, @r0 || ldi r1, #0 -#ifndef __LITTLE_ENDIAN__ - slli r4, #8 -#endif - addx r2, r4 - .fillinsn -6: addx r2, r1 - .fillinsn -7: - and3 r0, r2, #0xffff - srli r2, #16 - add r0, r2 - srl3 r2, r0, #16 - beqz r2, 1f - addi r0, #1 - and3 r0, r0, #0xffff - .fillinsn -1: - beqz r7, 1f ; swap the upper byte for the lower - and3 r2, r0, #0xff - srl3 r0, r0, #8 - slli r2, #8 - or r0, r2 - .fillinsn -1: - pop r2 || cmp r0, r0 - addx r0, r2 || ldi r2, #0 - addx r0, r2 - jmp r14 - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - - /* - * Experiments with Ethernet and SLIP connections show that buff - * is aligned on either a 2-byte or 4-byte boundary. We get at - * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. - * Fortunately, it is easy to convert 2-byte alignment to 4-byte - * alignment for the unrolled loop. - */ - - .text -ENTRY(csum_partial) - ; Function args - ; r0: unsigned char *buff - ; r1: int len - ; r2: unsigned int sum - - push r2 - ldi r2, #0 - and3 r7, r0, #1 ; Check alignment. - beqz r7, 1f ; Jump if alignment is ok. - ; 1-byte mis aligned - ldub r4, @r0 - addi r0, #1 - addi r1, #-1 ; Alignment uses up bytes. - cmp r0, r0 ; clear c-bit - ldi r3, #0 - addx r2, r4 - addx r2, r3 - .fillinsn -1: - and3 r4, r0, #2 ; Check alignment. - beqz r4, 2f ; Jump if alignment is ok. - addi r1, #-2 ; Alignment uses up two bytes. - cmp r0, r0 ; clear c-bit - bgtz r1, 1f ; Jump if we had at least two bytes. - addi r1, #2 ; len(r1) was < 2. Deal with it. - bra 4f - .fillinsn -1: - ; 2-byte aligned - lduh r4, @r0 - addi r0, #2 - ldi r3, #0 - addx r2, r4 - addx r2, r3 - .fillinsn -2: - ; 4-byte aligned - cmp r0, r0 ; clear c-bit - srl3 r6, r1, #5 - beqz r6, 2f - .fillinsn - -1: ld r3, @r0+ - ld r4, @r0+ ; +4 - ld r5, @r0+ ; +8 - addx r2, r3 - addx r2, r4 - addx r2, r5 - ld r3, @r0+ ; +12 - ld r4, @r0+ ; +16 - ld r5, @r0+ ; +20 - addx r2, r3 - addx r2, r4 - addx r2, r5 - ld r3, @r0+ ; +24 - ld r4, @r0+ ; +28 - addi r6, #-1 - addx r2, r3 - addx r2, r4 - bnez r6, 1b - addx r2, r6 ; r6=0 - cmp r0, r0 ; This clears c-bit - .fillinsn - -2: and3 r6, r1, #0x1c ; withdraw len - beqz r6, 4f - srli r6, #2 - .fillinsn - -3: ld r4, @r0+ - addi r6, #-1 - addx r2, r4 - bnez r6, 3b - addx r2, r6 ; r6=0 - cmp r0, r0 ; This clears c-bit - .fillinsn - -4: and3 r1, r1, #3 - beqz r1, 7f ; if len == 0 goto end - and3 r6, r1, #2 - beqz r6, 5f ; if len < 2 goto 5f(1byte) - - lduh r4, @r0 - addi r0, #2 - addi r1, #-2 - slli r4, #16 - addx r2, r4 - beqz r1, 6f - .fillinsn -5: ldub r4, @r0 -#ifndef __LITTLE_ENDIAN__ - slli r4, #8 -#endif - addx r2, r4 - .fillinsn -6: ldi r5, #0 - addx r2, r5 - .fillinsn -7: - and3 r0, r2, #0xffff - srli r2, #16 - add r0, r2 - srl3 r2, r0, #16 - beqz r2, 1f - addi r0, #1 - and3 r0, r0, #0xffff - .fillinsn -1: - beqz r7, 1f - mv r2, r0 - srl3 r0, r2, #8 - and3 r2, r2, #0xff - slli r2, #8 - or r0, r2 - .fillinsn -1: - pop r2 - cmp r0, r0 - addx r0, r2 - ldi r2, #0 - addx r0, r2 - jmp r14 - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - -/* -unsigned int csum_partial_copy_generic (const char *src, char *dst, - int len, int sum, int *src_err_ptr, int *dst_err_ptr) - */ - -/* - * Copy from ds while checksumming, otherwise like csum_partial - * - * The macros SRC and DST specify the type of access for the instruction. - * thus we can call a custom exception handler for all access types. - * - * FIXME: could someone double-check whether I haven't mixed up some SRC and - * DST definitions? It's damn hard to trigger all cases. I hope I got - * them all but there's no guarantee. - */ - -ENTRY(csum_partial_copy_generic) - nop - nop - nop - nop - jmp r14 - nop - nop - nop - - .end diff --git a/arch/m32r/lib/csum_partial_copy.c b/arch/m32r/lib/csum_partial_copy.c deleted file mode 100644 index b3cd59c12b8e..000000000000 --- a/arch/m32r/lib/csum_partial_copy.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * M32R specific IP/TCP/UDP checksumming routines - * (Some code taken from MIPS architecture) - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1994, 1995 Waldorf Electronics GmbH - * Copyright (C) 1998, 1999 Ralf Baechle - * Copyright (C) 2001-2005 Hiroyuki Kondo, Hirokazu Takata - * - */ - -#include <linux/module.h> -#include <linux/types.h> -#include <linux/string.h> - -#include <net/checksum.h> -#include <asm/byteorder.h> -#include <linux/uaccess.h> - -/* - * Copy while checksumming, otherwise like csum_partial - */ -__wsum -csum_partial_copy_nocheck (const void *src, void *dst, int len, __wsum sum) -{ - sum = csum_partial(src, len, sum); - memcpy(dst, src, len); - - return sum; -} -EXPORT_SYMBOL(csum_partial_copy_nocheck); - -/* - * Copy from userspace and compute checksum. If we catch an exception - * then zero the rest of the buffer. - */ -__wsum -csum_partial_copy_from_user (const void __user *src, void *dst, - int len, __wsum sum, int *err_ptr) -{ - int missing; - - missing = copy_from_user(dst, src, len); - if (missing) { - memset(dst + len - missing, 0, missing); - *err_ptr = -EFAULT; - } - - return csum_partial(dst, len-missing, sum); -} -EXPORT_SYMBOL(csum_partial_copy_from_user); -EXPORT_SYMBOL(csum_partial); diff --git a/arch/m32r/lib/delay.c b/arch/m32r/lib/delay.c deleted file mode 100644 index ae1fe90892f9..000000000000 --- a/arch/m32r/lib/delay.c +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * linux/arch/m32r/lib/delay.c - * - * Copyright (c) 2002 Hitoshi Yamamoto, Hirokazu Takata - * Copyright (c) 2004 Hirokazu Takata - */ - -#include <linux/param.h> -#include <linux/module.h> -#ifdef CONFIG_SMP -#include <linux/sched.h> -#include <asm/current.h> -#include <asm/smp.h> -#endif /* CONFIG_SMP */ -#include <asm/processor.h> - -void __delay(unsigned long loops) -{ -#ifdef CONFIG_ISA_DUAL_ISSUE - __asm__ __volatile__ ( - "beqz %0, 2f \n\t" - "addi %0, #-1 \n\t" - - " .fillinsn \n\t" - "1: \n\t" - "cmpz %0 || addi %0, #-1 \n\t" - "bc 2f || cmpz %0 \n\t" - "bc 2f || addi %0, #-1 \n\t" - "cmpz %0 || addi %0, #-1 \n\t" - "bc 2f || cmpz %0 \n\t" - "bnc 1b || addi %0, #-1 \n\t" - " .fillinsn \n\t" - "2: \n\t" - : "+r" (loops) - : "r" (0) - : "cbit" - ); -#else - __asm__ __volatile__ ( - "beqz %0, 2f \n\t" - " .fillinsn \n\t" - "1: \n\t" - "addi %0, #-1 \n\t" - "blez %0, 2f \n\t" - "addi %0, #-1 \n\t" - "blez %0, 2f \n\t" - "addi %0, #-1 \n\t" - "blez %0, 2f \n\t" - "addi %0, #-1 \n\t" - "bgtz %0, 1b \n\t" - " .fillinsn \n\t" - "2: \n\t" - : "+r" (loops) - : "r" (0) - ); -#endif -} - -void __const_udelay(unsigned long xloops) -{ -#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) - /* - * loops [1] = (xloops >> 32) [sec] * loops_per_jiffy [1/jiffy] - * * HZ [jiffy/sec] - * = (xloops >> 32) [sec] * (loops_per_jiffy * HZ) [1/sec] - * = (((xloops * loops_per_jiffy) >> 32) * HZ) [1] - * - * NOTE: - * - '[]' depicts variable's dimension in the above equation. - * - "rac" instruction rounds the accumulator in word size. - */ - __asm__ __volatile__ ( - "srli %0, #1 \n\t" - "mulwhi %0, %1 ; a0 \n\t" - "mulwu1 %0, %1 ; a1 \n\t" - "sadd ; a0 += (a1 >> 16) \n\t" - "rac a0, a0, #1 \n\t" - "mvfacmi %0, a0 \n\t" - : "+r" (xloops) - : "r" (current_cpu_data.loops_per_jiffy) - : "a0", "a1" - ); -#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) - /* - * u64 ull; - * ull = (u64)xloops * (u64)current_cpu_data.loops_per_jiffy; - * xloops = (ull >> 32); - */ - __asm__ __volatile__ ( - "and3 r4, %0, #0xffff \n\t" - "and3 r5, %1, #0xffff \n\t" - "mul r4, r5 \n\t" - "srl3 r6, %0, #16 \n\t" - "srli r4, #16 \n\t" - "mul r5, r6 \n\t" - "add r4, r5 \n\t" - "and3 r5, %0, #0xffff \n\t" - "srl3 r6, %1, #16 \n\t" - "mul r5, r6 \n\t" - "add r4, r5 \n\t" - "srl3 r5, %0, #16 \n\t" - "srli r4, #16 \n\t" - "mul r5, r6 \n\t" - "add r4, r5 \n\t" - "mv %0, r4 \n\t" - : "+r" (xloops) - : "r" (current_cpu_data.loops_per_jiffy) - : "r4", "r5", "r6" - ); -#else -#error unknown isa configuration -#endif - __delay(xloops * HZ); -} - -void __udelay(unsigned long usecs) -{ - __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */ -} - -void __ndelay(unsigned long nsecs) -{ - __const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */ -} - -EXPORT_SYMBOL(__delay); -EXPORT_SYMBOL(__const_udelay); -EXPORT_SYMBOL(__udelay); -EXPORT_SYMBOL(__ndelay); diff --git a/arch/m32r/lib/libgcc.h b/arch/m32r/lib/libgcc.h deleted file mode 100644 index 4854690d944a..000000000000 --- a/arch/m32r/lib/libgcc.h +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __ASM_LIBGCC_H -#define __ASM_LIBGCC_H - -#include <asm/byteorder.h> - -#ifdef __BIG_ENDIAN -struct DWstruct { - int high, low; -}; -#elif defined(__LITTLE_ENDIAN) -struct DWstruct { - int low, high; -}; -#else -#error I feel sick. -#endif - -typedef union { - struct DWstruct s; - long long ll; -} DWunion; - -#endif /* __ASM_LIBGCC_H */ diff --git a/arch/m32r/lib/memcpy.S b/arch/m32r/lib/memcpy.S deleted file mode 100644 index 249da3e3358d..000000000000 --- a/arch/m32r/lib/memcpy.S +++ /dev/null @@ -1,93 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/arch/m32r/lib/memcpy.S - * - * Copyright (C) 2001 Hiroyuki Kondo, and Hirokazu Takata - * Copyright (C) 2004 Hirokazu Takata - * - * void *memcopy(void *dst, const void *src, int n); - * - * dst: r0 - * src: r1 - * n : r2 - */ - - .text -#include <linux/linkage.h> -#include <asm/assembler.h> - -#ifdef CONFIG_ISA_DUAL_ISSUE - - .text -ENTRY(memcpy) -memcopy: - mv r4, r0 || mv r7, r0 - or r7, r1 || cmpz r2 - jc r14 || cmpeq r0, r1 ; return if r2=0 - jc r14 ; return if r0=r1 - - and3 r7, r7, #3 - bnez r7, byte_copy - srl3 r3, r2, #2 - and3 r2, r2, #3 - beqz r3, byte_copy - addi r4, #-4 -word_copy: - ld r7, @r1+ || addi r3, #-1 - st r7, @+r4 || cmpz r2 - bnez r3, word_copy - addi r4, #4 || jc r14 ; return if r2=0 -#if defined(CONFIG_ISA_M32R2) -byte_copy: - ldb r7, @r1 || addi r1, #1 - addi r2, #-1 || stb r7, @r4+ - bnez r2, byte_copy -#elif defined(CONFIG_ISA_M32R) -byte_copy: - ldb r7, @r1 || addi r1, #1 - addi r2, #-1 || stb r7, @r4 - addi r4, #1 - bnez r2, byte_copy -#else -#error unknown isa configuration -#endif -end_memcopy: - jmp r14 - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - - .text -ENTRY(memcpy) -memcopy: - mv r4, r0 - mv r7, r0 - or r7, r1 - beq r0, r1, end_memcopy - beqz r2, end_memcopy - - and3 r7, r7, #3 - bnez r7, byte_copy - srl3 r3, r2, #2 - and3 r2, r2, #3 - beqz r3, byte_copy - addi r4, #-4 -word_copy: - ld r7, @r1+ - addi r3, #-1 - st r7, @+r4 - bnez r3, word_copy - beqz r2, end_memcopy - addi r4, #4 -byte_copy: - ldb r7, @r1 - addi r1, #1 - addi r2, #-1 - stb r7, @r4 - addi r4, #1 - bnez r2, byte_copy -end_memcopy: - jmp r14 - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - - .end diff --git a/arch/m32r/lib/memset.S b/arch/m32r/lib/memset.S deleted file mode 100644 index e7f45e6c73f5..000000000000 --- a/arch/m32r/lib/memset.S +++ /dev/null @@ -1,179 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/arch/m32r/lib/memset.S - * - * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata - * Copyright (C) 2004 Hirokazu Takata - * - * void *memset(void *dst, int val, int len); - * - * dst: r0 - * val: r1 - * len: r2 - * ret: r0 - * - */ - - .text - .global memset - -#ifdef CONFIG_ISA_DUAL_ISSUE - - .align 4 -memset: - mv r4, r0 || cmpz r2 - jc r14 - cmpui r2, #16 - bnc qword_align_check - cmpui r2, #4 - bc byte_set -word_align_check: /* len >= 4 */ - and3 r3, r4, #3 - beqz r3, word_set - addi r3, #-4 - neg r3, r3 /* r3 = -(r3 - 4) */ -align_word: - stb r1, @r4 || addi r4, #1 - addi r2, #-1 || addi r3, #-1 - bnez r3, align_word - cmpui r2, #4 - bc byte_set -word_set: - and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ - sll3 r3, r1, #8 - or r1, r3 || addi r4, #-4 - sll3 r3, r1, #16 - or r1, r3 || addi r2, #-4 -word_set_loop: - st r1, @+r4 || addi r2, #-4 - bgtz r2, word_set_loop - bnez r2, byte_set_wrap - st r1, @+r4 - jmp r14 - -qword_align_check: /* len >= 16 */ - and3 r3, r4, #15 - bnez r3, word_align_check -qword_set: - and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ - sll3 r3, r1, #8 - or r1, r3 || addi r4, #-4 - sll3 r3, r1, #16 - or r1, r3 || ldi r5, #16 -qword_set_loop: - ld r3, @(4,r4) /* cache line allocate */ - st r1, @+r4 || addi r2, #-16 - st r1, @+r4 || cmpu r2, r5 - st r1, @+r4 - st r1, @+r4 - bnc qword_set_loop || cmpz r2 - jc r14 -set_remainder: - cmpui r2, #4 - bc byte_set_wrap1 - addi r2, #-4 - bra word_set_loop - -byte_set_wrap: - addi r2, #4 - cmpz r2 - jc r14 -byte_set_wrap1: - addi r4, #4 -#if defined(CONFIG_ISA_M32R2) -byte_set: - addi r2, #-1 || stb r1, @r4+ - bnez r2, byte_set -#elif defined(CONFIG_ISA_M32R) -byte_set: - addi r2, #-1 || stb r1, @r4 - addi r4, #1 - bnez r2, byte_set -#else -#error unknown isa configuration -#endif -end_memset: - jmp r14 - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - - .align 4 -memset: - mv r4, r0 - beqz r2, end_memset - cmpui r2, #16 - bnc qword_align_check - cmpui r2, #4 - bc byte_set -word_align_check: /* len >= 4 */ - and3 r3, r4, #3 - beqz r3, word_set - addi r3, #-4 - neg r3, r3 /* r3 = -(r3 - 4) */ -align_word: - stb r1, @r4 - addi r4, #1 - addi r2, #-1 - addi r3, #-1 - bnez r3, align_word - cmpui r2, #4 - bc byte_set -word_set: - and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ - sll3 r3, r1, #8 - or r1, r3 - sll3 r3, r1, #16 - or r1, r3 - addi r2, #-4 - addi r4, #-4 -word_set_loop: - st r1, @+r4 - addi r2, #-4 - bgtz r2, word_set_loop - bnez r2, byte_set_wrap - st r1, @+r4 - jmp r14 - -qword_align_check: /* len >= 16 */ - and3 r3, r4, #15 - bnez r3, word_align_check -qword_set: - and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ - sll3 r3, r1, #8 - or r1, r3 - sll3 r3, r1, #16 - or r1, r3 - addi r4, #-4 -qword_set_loop: - ld r3, @(4,r4) /* cache line allocate */ - addi r2, #-16 - st r1, @+r4 - st r1, @+r4 - cmpui r2, #16 - st r1, @+r4 - st r1, @+r4 - bnc qword_set_loop - bnez r2, set_remainder - jmp r14 -set_remainder: - cmpui r2, #4 - bc byte_set_wrap1 - addi r2, #-4 - bra word_set_loop - -byte_set_wrap: - addi r2, #4 - beqz r2, end_memset -byte_set_wrap1: - addi r4, #4 -byte_set: - addi r2, #-1 - stb r1, @r4 - addi r4, #1 - bnez r2, byte_set -end_memset: - jmp r14 - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - - .end diff --git a/arch/m32r/lib/strlen.S b/arch/m32r/lib/strlen.S deleted file mode 100644 index 41c77e387593..000000000000 --- a/arch/m32r/lib/strlen.S +++ /dev/null @@ -1,118 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/arch/m32r/strlen.S -- strlen code. - * - * Copyright (C) 2001 Hirokazu Takata - * - * size_t strlen(const char *s); - * - */ - -#include <linux/linkage.h> -#include <asm/assembler.h> - -#ifdef CONFIG_ISA_DUAL_ISSUE - - .text -ENTRY(strlen) - mv r6, r0 || ldi r2, #0 - and3 r0, r0, #3 - bnez r0, strlen_byte -; -strlen_word: - ld r0, @r6+ -; - seth r5, #high(0x01010101) - or3 r5, r5, #low(0x01010101) - sll3 r7, r5, #7 -strlen_word_loop: - ld r1, @r6+ || not r4, r0 - sub r0, r5 || and r4, r7 - and r4, r0 - bnez r4, strlen_last_bytes - ld r0, @r6+ || not r4, r1 - sub r1, r5 || and r4, r7 - and r4, r1 || addi r2, #4 - bnez r4, strlen_last_bytes - addi r2, #4 || bra.s strlen_word_loop - - ; NOTE: If a null char. exists, return 0. - ; if ((x - 0x01010101) & ~x & 0x80808080) - ; return 0; -; -strlen_byte: - ldb r1, @r6 || addi r6, #1 - beqz r1, strlen_exit - addi r2, #1 || bra.s strlen_byte -; -strlen_last_bytes: - ldi r0, #4 || addi r6, #-8 -; -strlen_byte_loop: - ldb r1, @r6 || addi r6, #1 - addi r0, #-1 || cmpz r1 - bc.s strlen_exit || cmpz r0 - addi r2, #1 || bnc.s strlen_byte_loop -; -strlen_exit: - mv r0, r2 || jmp r14 - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - - .text -ENTRY(strlen) - mv r6, r0 - ldi r2, #0 - and3 r0, r0, #3 - bnez r0, strlen_byte -; -strlen_word: - ld r0, @r6+ -; - seth r5, #high(0x01010101) - or3 r5, r5, #low(0x01010101) - sll3 r7, r5, #7 -strlen_word_loop: - ld r1, @r6+ - not r4, r0 ; NOTE: If a null char. exists, return 0. - sub r0, r5 ; if ((x - 0x01010101) & ~x & 0x80808080) - and r4, r7 ; return 0; - and r4, r0 - bnez r4, strlen_last_bytes - addi r2, #4 -; - ld r0, @r6+ - not r4, r1 ; NOTE: If a null char. exists, return 0. - sub r1, r5 ; if ((x - 0x01010101) & ~x & 0x80808080) - and r4, r7 ; return 0; - and r4, r1 - bnez r4, strlen_last_bytes - addi r2, #4 - bra strlen_word_loop -; -strlen_byte: - ldb r1, @r6 - addi r6, #1 - beqz r1, strlen_exit - addi r2, #1 - bra strlen_byte -; -strlen_last_bytes: - ldi r0, #4 - addi r6, #-8 -; -strlen_byte_loop: - ldb r1, @r6 - addi r6, #1 - addi r0, #-1 - beqz r1, strlen_exit - addi r2, #1 - bnez r0, strlen_byte_loop -; -strlen_exit: - mv r0, r2 - jmp r14 - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - - .end diff --git a/arch/m32r/lib/ucmpdi2.c b/arch/m32r/lib/ucmpdi2.c deleted file mode 100644 index e20fa3484fd8..000000000000 --- a/arch/m32r/lib/ucmpdi2.c +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include "libgcc.h" - -int __ucmpdi2(unsigned long long a, unsigned long long b) -{ - const DWunion au = {.ll = a}; - const DWunion bu = {.ll = b}; - - if ((unsigned int)au.s.high < (unsigned int)bu.s.high) - return 0; - else if ((unsigned int)au.s.high > (unsigned int)bu.s.high) - return 2; - if ((unsigned int)au.s.low < (unsigned int)bu.s.low) - return 0; - else if ((unsigned int)au.s.low > (unsigned int)bu.s.low) - return 2; - return 1; -} diff --git a/arch/m32r/lib/usercopy.c b/arch/m32r/lib/usercopy.c deleted file mode 100644 index 0892a4341b3a..000000000000 --- a/arch/m32r/lib/usercopy.c +++ /dev/null @@ -1,362 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * User address space access functions. - * The non inlined parts of asm-m32r/uaccess.h are here. - * - * Copyright 1997 Andi Kleen <ak@muc.de> - * Copyright 1997 Linus Torvalds - * Copyright 2001, 2002, 2004 Hirokazu Takata - */ -#include <linux/prefetch.h> -#include <linux/string.h> -#include <linux/thread_info.h> -#include <linux/uaccess.h> - -/* - * Copy a null terminated string from userspace. - */ - -#ifdef CONFIG_ISA_DUAL_ISSUE - -#define __do_strncpy_from_user(dst,src,count,res) \ -do { \ - int __d0, __d1, __d2; \ - __asm__ __volatile__( \ - " beqz %1, 2f\n" \ - " .fillinsn\n" \ - "0: ldb r14, @%3 || addi %3, #1\n" \ - " stb r14, @%4 || addi %4, #1\n" \ - " beqz r14, 1f\n" \ - " addi %1, #-1\n" \ - " bnez %1, 0b\n" \ - " .fillinsn\n" \ - "1: sub %0, %1\n" \ - " .fillinsn\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - " .balign 4\n" \ - "3: seth r14, #high(2b)\n" \ - " or3 r14, r14, #low(2b)\n" \ - " jmp r14 || ldi %0, #%5\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - ".previous" \ - : "=&r"(res), "=&r"(count), "=&r" (__d0), "=&r" (__d1), \ - "=&r" (__d2) \ - : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ - "4"(dst) \ - : "r14", "cbit", "memory"); \ -} while (0) - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - -#define __do_strncpy_from_user(dst,src,count,res) \ -do { \ - int __d0, __d1, __d2; \ - __asm__ __volatile__( \ - " beqz %1, 2f\n" \ - " .fillinsn\n" \ - "0: ldb r14, @%3\n" \ - " stb r14, @%4\n" \ - " addi %3, #1\n" \ - " addi %4, #1\n" \ - " beqz r14, 1f\n" \ - " addi %1, #-1\n" \ - " bnez %1, 0b\n" \ - " .fillinsn\n" \ - "1: sub %0, %1\n" \ - " .fillinsn\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - " .balign 4\n" \ - "3: ldi %0, #%5\n" \ - " seth r14, #high(2b)\n" \ - " or3 r14, r14, #low(2b)\n" \ - " jmp r14\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - ".previous" \ - : "=&r"(res), "=&r"(count), "=&r" (__d0), "=&r" (__d1), \ - "=&r" (__d2) \ - : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ - "4"(dst) \ - : "r14", "cbit", "memory"); \ -} while (0) - -#endif /* CONFIG_ISA_DUAL_ISSUE */ - -long -strncpy_from_user(char *dst, const char __user *src, long count) -{ - long res = -EFAULT; - if (access_ok(VERIFY_READ, src, 1)) - __do_strncpy_from_user(dst, src, count, res); - return res; -} - - -/* - * Zero Userspace - */ - -#ifdef CONFIG_ISA_DUAL_ISSUE - -#define __do_clear_user(addr,size) \ -do { \ - int __dst, __c; \ - __asm__ __volatile__( \ - " beqz %1, 9f\n" \ - " and3 r14, %0, #3\n" \ - " bnez r14, 2f\n" \ - " and3 r14, %1, #3\n" \ - " bnez r14, 2f\n" \ - " and3 %1, %1, #3\n" \ - " beqz %2, 2f\n" \ - " addi %0, #-4\n" \ - " .fillinsn\n" \ - "0: ; word clear \n" \ - " st %6, @+%0 || addi %2, #-1\n" \ - " bnez %2, 0b\n" \ - " beqz %1, 9f\n" \ - " .fillinsn\n" \ - "2: ; byte clear \n" \ - " stb %6, @%0 || addi %1, #-1\n" \ - " addi %0, #1\n" \ - " bnez %1, 2b\n" \ - " .fillinsn\n" \ - "9:\n" \ - ".section .fixup,\"ax\"\n" \ - " .balign 4\n" \ - "4: slli %2, #2\n" \ - " seth r14, #high(9b)\n" \ - " or3 r14, r14, #low(9b)\n" \ - " jmp r14 || add %1, %2\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,4b\n" \ - " .long 2b,9b\n" \ - ".previous\n" \ - : "=&r"(__dst), "=&r"(size), "=&r"(__c) \ - : "0"(addr), "1"(size), "2"(size / 4), "r"(0) \ - : "r14", "cbit", "memory"); \ -} while (0) - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - -#define __do_clear_user(addr,size) \ -do { \ - int __dst, __c; \ - __asm__ __volatile__( \ - " beqz %1, 9f\n" \ - " and3 r14, %0, #3\n" \ - " bnez r14, 2f\n" \ - " and3 r14, %1, #3\n" \ - " bnez r14, 2f\n" \ - " and3 %1, %1, #3\n" \ - " beqz %2, 2f\n" \ - " addi %0, #-4\n" \ - " .fillinsn\n" \ - "0: st %6, @+%0 ; word clear \n" \ - " addi %2, #-1\n" \ - " bnez %2, 0b\n" \ - " beqz %1, 9f\n" \ - " .fillinsn\n" \ - "2: stb %6, @%0 ; byte clear \n" \ - " addi %1, #-1\n" \ - " addi %0, #1\n" \ - " bnez %1, 2b\n" \ - " .fillinsn\n" \ - "9:\n" \ - ".section .fixup,\"ax\"\n" \ - " .balign 4\n" \ - "4: slli %2, #2\n" \ - " add %1, %2\n" \ - " seth r14, #high(9b)\n" \ - " or3 r14, r14, #low(9b)\n" \ - " jmp r14\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,4b\n" \ - " .long 2b,9b\n" \ - ".previous\n" \ - : "=&r"(__dst), "=&r"(size), "=&r"(__c) \ - : "0"(addr), "1"(size), "2"(size / 4), "r"(0) \ - : "r14", "cbit", "memory"); \ -} while (0) - -#endif /* not CONFIG_ISA_DUAL_ISSUE */ - -unsigned long -clear_user(void __user *to, unsigned long n) -{ - if (access_ok(VERIFY_WRITE, to, n)) - __do_clear_user(to, n); - return n; -} - -unsigned long -__clear_user(void __user *to, unsigned long n) -{ - __do_clear_user(to, n); - return n; -} - -/* - * Return the size of a string (including the ending 0) - * - * Return 0 on exception, a value greater than N if too long - */ - -#ifdef CONFIG_ISA_DUAL_ISSUE - -long strnlen_user(const char __user *s, long n) -{ - unsigned long mask = -__addr_ok(s); - unsigned long res; - - __asm__ __volatile__( - " and %0, %5 || mv r1, %1\n" - " beqz %0, strnlen_exit\n" - " and3 r0, %1, #3\n" - " bnez r0, strnlen_byte_loop\n" - " cmpui %0, #4\n" - " bc strnlen_byte_loop\n" - "strnlen_word_loop:\n" - "0: ld r0, @%1+\n" - " pcmpbz r0\n" - " bc strnlen_last_bytes_fixup\n" - " addi %0, #-4\n" - " beqz %0, strnlen_exit\n" - " bgtz %0, strnlen_word_loop\n" - "strnlen_last_bytes:\n" - " mv %0, %4\n" - "strnlen_last_bytes_fixup:\n" - " addi %1, #-4\n" - "strnlen_byte_loop:\n" - "1: ldb r0, @%1 || addi %0, #-1\n" - " beqz r0, strnlen_exit\n" - " addi %1, #1\n" - " bnez %0, strnlen_byte_loop\n" - "strnlen_exit:\n" - " sub %1, r1\n" - " add3 %0, %1, #1\n" - " .fillinsn\n" - "9:\n" - ".section .fixup,\"ax\"\n" - " .balign 4\n" - "4: addi %1, #-4\n" - " .fillinsn\n" - "5: seth r1, #high(9b)\n" - " or3 r1, r1, #low(9b)\n" - " jmp r1 || ldi %0, #0\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .balign 4\n" - " .long 0b,4b\n" - " .long 1b,5b\n" - ".previous" - : "=&r" (res), "=r" (s) - : "0" (n), "1" (s), "r" (n & 3), "r" (mask), "r"(0x01010101) - : "r0", "r1", "cbit"); - - /* NOTE: strnlen_user() algorithm: - * { - * char *p; - * for (p = s; n-- && *p != '\0'; ++p) - * ; - * return p - s + 1; - * } - */ - - /* NOTE: If a null char. exists, return 0. - * if ((x - 0x01010101) & ~x & 0x80808080)\n" - * return 0;\n" - */ - - return res & mask; -} - -#else /* not CONFIG_ISA_DUAL_ISSUE */ - -long strnlen_user(const char __user *s, long n) -{ - unsigned long mask = -__addr_ok(s); - unsigned long res; - - __asm__ __volatile__( - " and %0, %5\n" - " mv r1, %1\n" - " beqz %0, strnlen_exit\n" - " and3 r0, %1, #3\n" - " bnez r0, strnlen_byte_loop\n" - " cmpui %0, #4\n" - " bc strnlen_byte_loop\n" - " sll3 r3, %6, #7\n" - "strnlen_word_loop:\n" - "0: ld r0, @%1+\n" - " not r2, r0\n" - " sub r0, %6\n" - " and r2, r3\n" - " and r2, r0\n" - " bnez r2, strnlen_last_bytes_fixup\n" - " addi %0, #-4\n" - " beqz %0, strnlen_exit\n" - " bgtz %0, strnlen_word_loop\n" - "strnlen_last_bytes:\n" - " mv %0, %4\n" - "strnlen_last_bytes_fixup:\n" - " addi %1, #-4\n" - "strnlen_byte_loop:\n" - "1: ldb r0, @%1\n" - " addi %0, #-1\n" - " beqz r0, strnlen_exit\n" - " addi %1, #1\n" - " bnez %0, strnlen_byte_loop\n" - "strnlen_exit:\n" - " sub %1, r1\n" - " add3 %0, %1, #1\n" - " .fillinsn\n" - "9:\n" - ".section .fixup,\"ax\"\n" - " .balign 4\n" - "4: addi %1, #-4\n" - " .fillinsn\n" - "5: ldi %0, #0\n" - " seth r1, #high(9b)\n" - " or3 r1, r1, #low(9b)\n" - " jmp r1\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .balign 4\n" - " .long 0b,4b\n" - " .long 1b,5b\n" - ".previous" - : "=&r" (res), "=r" (s) - : "0" (n), "1" (s), "r" (n & 3), "r" (mask), "r"(0x01010101) - : "r0", "r1", "r2", "r3", "cbit"); - - /* NOTE: strnlen_user() algorithm: - * { - * char *p; - * for (p = s; n-- && *p != '\0'; ++p) - * ; - * return p - s + 1; - * } - */ - - /* NOTE: If a null char. exists, return 0. - * if ((x - 0x01010101) & ~x & 0x80808080)\n" - * return 0;\n" - */ - - return res & mask; -} - -#endif /* CONFIG_ISA_DUAL_ISSUE */ - |