* libc/machine/sh/Makefile.am (lib_a_SOURCES):
Make strcmp.S unconditional. * libc/machine/sh/Makefile.in: Regenerate. * libc/machine/sh/asm.h (DELAYED_BRANCHES, SL): Also for __SH5__ . * strcmp.S (strcmp): Add SHmedia variant. Use different registers for SHcompact.
This commit is contained in:
		| @@ -1,3 +1,12 @@ | |||||||
|  | Sun Jul  7 01:23:45 2002  J"orn Rennecke <joern.rennecke@superh.com> | ||||||
|  |  | ||||||
|  | 	* libc/machine/sh/Makefile.am (lib_a_SOURCES): | ||||||
|  | 	Make strcmp.S unconditional. | ||||||
|  | 	* libc/machine/sh/Makefile.in: Regenerate. | ||||||
|  | 	* libc/machine/sh/asm.h (DELAYED_BRANCHES, SL): Also for __SH5__ . | ||||||
|  | 	* strcmp.S (strcmp): Add SHmedia variant.  Use different registers | ||||||
|  | 	for SHcompact. | ||||||
|  |  | ||||||
| 2002-07-04  Jeff Johnston  <jjohnstn@redhat.com> | 2002-07-04  Jeff Johnston  <jjohnstn@redhat.com> | ||||||
|  |  | ||||||
| 	* libc/sys/linux/inode.c: Fix utime prototype and add _LIBC | 	* libc/sys/linux/inode.c: Fix utime prototype and add _LIBC | ||||||
|   | |||||||
| @@ -6,11 +6,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) | |||||||
|  |  | ||||||
| noinst_LIBRARIES = lib.a | noinst_LIBRARIES = lib.a | ||||||
|  |  | ||||||
| if SH64 |  | ||||||
| lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S |  | ||||||
| else |  | ||||||
| lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S | lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S | ||||||
| endif |  | ||||||
|  |  | ||||||
| memcpy.o: asm.h | memcpy.o: asm.h | ||||||
| memset.o: asm.h | memset.o: asm.h | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # Makefile.in generated automatically by automake 1.4 from Makefile.am | # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am | ||||||
|  |  | ||||||
| # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. | # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. | ||||||
| # This Makefile.in is free software; the Free Software Foundation | # This Makefile.in is free software; the Free Software Foundation | ||||||
| # gives unlimited permission to copy and/or distribute it, | # gives unlimited permission to copy and/or distribute it, | ||||||
| # with or without modifications, as long as this notice is preserved. | # with or without modifications, as long as this notice is preserved. | ||||||
| @@ -88,8 +88,8 @@ AUTOMAKE_OPTIONS = cygnus | |||||||
| INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) | INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) | ||||||
|  |  | ||||||
| noinst_LIBRARIES = lib.a | noinst_LIBRARIES = lib.a | ||||||
| @SH64_TRUE@lib_a_SOURCES = @SH64_TRUE@memcpy.S memset.S setjmp.S strcpy.S strlen.S |  | ||||||
| @SH64_FALSE@lib_a_SOURCES = @SH64_FALSE@memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S | lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S | ||||||
|  |  | ||||||
| ACLOCAL_AMFLAGS = -I ../../.. | ACLOCAL_AMFLAGS = -I ../../.. | ||||||
| CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host | CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host | ||||||
| @@ -103,9 +103,7 @@ DEFS = @DEFS@ -I. -I$(srcdir) | |||||||
| CPPFLAGS = @CPPFLAGS@ | CPPFLAGS = @CPPFLAGS@ | ||||||
| LIBS = @LIBS@ | LIBS = @LIBS@ | ||||||
| lib_a_LIBADD =  | lib_a_LIBADD =  | ||||||
| @SH64_TRUE@lib_a_OBJECTS =  memcpy.o memset.o setjmp.o strcpy.o strlen.o | lib_a_OBJECTS =  memcpy.o memset.o setjmp.o strcpy.o strlen.o strcmp.o | ||||||
| @SH64_FALSE@lib_a_OBJECTS =  memcpy.o memset.o setjmp.o strcpy.o \ |  | ||||||
| @SH64_FALSE@strlen.o strcmp.o |  | ||||||
| CFLAGS = @CFLAGS@ | CFLAGS = @CFLAGS@ | ||||||
| COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) | COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) | ||||||
| CCLD = $(CC) | CCLD = $(CC) | ||||||
|   | |||||||
| @@ -23,7 +23,8 @@ | |||||||
| 	_ENTRY(_C_LABEL(name)) | 	_ENTRY(_C_LABEL(name)) | ||||||
|  |  | ||||||
| #if (defined (__sh2__) || defined (__sh3__) || defined (__SH3E__) \ | #if (defined (__sh2__) || defined (__sh3__) || defined (__SH3E__) \ | ||||||
|      || defined (__SH4_SINGLE__) || defined (__SH4__)) || defined(__SH4_SINGLE_ONLY__) |      || defined (__SH4_SINGLE__) || defined (__SH4__)) \ | ||||||
|  |      || defined (__SH4_SINGLE_ONLY__) || defined (__SH5__) | ||||||
| #define DELAYED_BRANCHES | #define DELAYED_BRANCHES | ||||||
| #define SL(branch, dest, in_slot, in_slot_arg2) \ | #define SL(branch, dest, in_slot, in_slot_arg2) \ | ||||||
| 	branch##.s dest; in_slot, in_slot_arg2 | 	branch##.s dest; in_slot, in_slot_arg2 | ||||||
|   | |||||||
| @@ -1,42 +1,198 @@ | |||||||
| ! Entry: r4: destination | ! SH5 code Copyright 2002 SuperH Ltd. | ||||||
| !        r5: source |  | ||||||
| ! Exit:  r0: result |  | ||||||
| !        r1-r2,r4-r5: clobbered |  | ||||||
|  |  | ||||||
| #include "asm.h" | #include "asm.h" | ||||||
|  |  | ||||||
| ENTRY(strcmp) | ENTRY(strcmp) | ||||||
| 	mov     r4,r0 |  | ||||||
| 	or      r5,r0 | #if __SHMEDIA__ | ||||||
|  | 	ld.ub	r2,0,r4 | ||||||
|  | 	pt/l	quickret0,tr0 | ||||||
|  | 	ld.ub	r3,0,r5 | ||||||
|  | 	ptabs	r18,tr2 | ||||||
|  | 	beqi/u	r4,0,tr0 | ||||||
|  | 	ld.ub	r2,1,r6 | ||||||
|  | 	bne/u	r4,r5,tr0 | ||||||
|  | 	pt/l	quickret1,tr1 | ||||||
|  | 	ld.ub	r3,1,r7 | ||||||
|  | 	beqi/u	r6,0,tr1 | ||||||
|  | 	ld.ub	r2,2,r4 | ||||||
|  | 	bne/u	r6,r7,tr1 | ||||||
|  | 	ld.ub	r3,2,r5 | ||||||
|  | 	beqi/u	r4,0,tr0 | ||||||
|  | 	ld.ub	r2,3,r6 | ||||||
|  | 	bne/u	r4,r5,tr0 | ||||||
|  | 	ld.ub	r3,3,r7 | ||||||
|  | 	beqi/u	r6,0,tr1 | ||||||
|  | 	ld.ub	r2,4,r4 | ||||||
|  | 	bne/u	r6,r7,tr1 | ||||||
|  | 	ld.ub	r3,4,r5 | ||||||
|  | 	beqi/u	r4,0,tr0 | ||||||
|  | 	ld.ub	r2,5,r6 | ||||||
|  | 	bne/u	r4,r5,tr0 | ||||||
|  | 	ld.ub	r3,5,r7 | ||||||
|  | 	beqi/u	r6,0,tr1 | ||||||
|  | 	ld.ub	r2,6,r4 | ||||||
|  | 	bne/u	r6,r7,tr1 | ||||||
|  | 	ld.ub	r3,6,r5 | ||||||
|  | 	beqi/u	r4,0,tr0 | ||||||
|  | 	ld.ub	r2,7,r6 | ||||||
|  | 	bne/u	r4,r5,tr0 | ||||||
|  | 	ld.ub	r3,7,r7 | ||||||
|  | 	beqi/u	r6,0,tr1 | ||||||
|  | 	sub	r3,r2,r3 | ||||||
|  | 	bne/u	r6,r7,tr1 | ||||||
|  |  | ||||||
|  | 	andi	r2,-8,r2 | ||||||
|  | 	add	r3,r2,r3 | ||||||
|  | 	ldlo.q	r3,8,r23 | ||||||
|  | 	pt	r23_zero,tr0 | ||||||
|  | 	shlli	r3,3,r22 | ||||||
|  | 	sub	r63,r22,r20 | ||||||
|  | 	movi	0x101,r6 | ||||||
|  | 	mperm.w	r6,r63,r6 | ||||||
|  | 	SHLO	r6,r22,r7 | ||||||
|  | 	msubs.ub r7,r23,r8 | ||||||
|  | 	pt	loop,tr1 | ||||||
|  | 	bnei/u	r8,0,tr0 // r23_zero | ||||||
|  | 	pt	found_zero,tr0 | ||||||
|  | 	ori	r3,7,r3 | ||||||
|  | 	addi	r3,9,r3 | ||||||
|  | 	sub	r3,r2,r3 | ||||||
|  | 	bne/l	r7,r6,tr1 // loop | ||||||
|  | 	/* The strings are aligned to each other.  */ | ||||||
|  | 	pt	al_loop,tr1 | ||||||
|  | 	pt	al_found_zero,tr0 | ||||||
|  | 	addi	r3,-8,r3 | ||||||
|  | al_loop: | ||||||
|  | 	ld.q	r2,8,r4 | ||||||
|  | 	ldx.q	r2,r3,r5 | ||||||
|  | 	addi	r2,8,r2 | ||||||
|  | 	mcmpeq.b r63,r4,r8 | ||||||
|  | 	pt	cmp_quad,tr3 | ||||||
|  | 	bnei/u	r8,0,tr0  // al_found_zero | ||||||
|  | 	beq/l	r4,r5,tr1 // al_loop | ||||||
|  | 	blink	tr3,r63   // cmp_quad | ||||||
|  |  | ||||||
|  | 	.balign 8 | ||||||
|  | quickret0: | ||||||
|  | 	sub	r4,r5,r2 | ||||||
|  | 	blink	tr2,r63 | ||||||
|  | quickret1: | ||||||
|  | 	sub	r6,r7,r2 | ||||||
|  | 	blink	tr2,r63 | ||||||
|  |  | ||||||
|  | loop: | ||||||
|  | 	ld.q	r2,8,r4 | ||||||
|  | 	ldx.q	r2,r3,r19 | ||||||
|  | 	addi	r2,8,r2 | ||||||
|  | 	msubs.ub r6,r4,r8 | ||||||
|  | 	mcmpeq.b r63,r19,r9 | ||||||
|  | 	SHHI	r19,r20,r21 | ||||||
|  | 	or	r21,r23,r5 | ||||||
|  | 	SHLO	r19,r22,r23 | ||||||
|  | 	bne/u	r8,r9,tr0 // found_zero | ||||||
|  | 	beq/l	r4,r5,tr1 // loop | ||||||
|  | cmp_quad: | ||||||
|  | #ifdef __LITTLE_ENDIAN__ | ||||||
|  | 	byterev r4,r4 | ||||||
|  | 	byterev r5,r5 | ||||||
|  | #endif | ||||||
|  | 	cmpgtu	r4,r5,r6 | ||||||
|  | 	cmpgtu	r5,r4,r7 | ||||||
|  | 	sub	r6,r7,r2 | ||||||
|  | 	blink tr2,r63 | ||||||
|  | found_zero: | ||||||
|  | 	pt	zero_now,tr0 | ||||||
|  | 	mcmpeq.b r63,r5,r7 | ||||||
|  | 	pt	cmp_quad,tr1 | ||||||
|  | 	bne/u	r8,r7,tr0 // zero_now | ||||||
|  | 	bne/u	r4,r5,tr1 // cmp_quad | ||||||
|  | 	SHLO	r9,r22,r8 | ||||||
|  | r23_zero: | ||||||
|  | 	ld.q	r2,8,r4 | ||||||
|  | 	add	r23,r63,r5 | ||||||
|  | zero_now: | ||||||
|  | al_found_zero: | ||||||
|  | /* We konw that one of the values has at lest one zero, and r8 holds | ||||||
|  |    an 0x01 or 0xff mask for every zero found in one of the operands. | ||||||
|  |    If both operands have the first zero in the same place, this mask | ||||||
|  |    allows us to truncate the comparison to the valid bytes in the | ||||||
|  |    strings.  If the first zero is in different places, it doesn't | ||||||
|  |    matter if some invalid bytes are included, since the comparison | ||||||
|  |    of the zero with the non-zero will determine the outcome.  */ | ||||||
|  | #ifdef __LITTLE_ENDIAN__ | ||||||
|  | 	shlli	r8,8,r8 | ||||||
|  | 	addi	r8,-1,r9 | ||||||
|  | 	andc	r9,r8,r8 | ||||||
|  | 	and	r8,r4,r4 | ||||||
|  | 	and	r8,r5,r5 | ||||||
|  | #else | ||||||
|  | 	shlri r8,1,r8 | ||||||
|  | 	nsb	r8,r8 | ||||||
|  | 	addi	r8,8,r8 | ||||||
|  | 	andi	r8,56,r8 | ||||||
|  | 	sub	r63,r8,r8 | ||||||
|  | 	shlrd	r4,r8,r4 | ||||||
|  | 	shlrd	r5,r8,r5 | ||||||
|  | #endif | ||||||
|  | #ifdef __LITTLE_ENDIAN__ | ||||||
|  | 	byterev r4,r4 | ||||||
|  | 	byterev r5,r5 | ||||||
|  | #endif | ||||||
|  | 	cmpgtu	r4,r5,r6 | ||||||
|  | 	cmpgtu	r5,r4,r7 | ||||||
|  | 	sub	r6,r7,r2 | ||||||
|  | 	blink tr2,r63 | ||||||
|  |  | ||||||
|  | #else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ | ||||||
|  |  | ||||||
|  | #ifdef __SH5__ | ||||||
|  | #define STR1 r2 | ||||||
|  | #define STR2 r3 | ||||||
|  | #define RESULT r2 | ||||||
|  | #define TMP r4 | ||||||
|  | #else | ||||||
|  | ! Entry: r4: string1 | ||||||
|  | !        r5: string2 | ||||||
|  | ! Exit:  r0: result | ||||||
|  | !        r1-r2,r4-r5: clobbered | ||||||
|  | #define STR1 r4 | ||||||
|  | #define STR2 r5 | ||||||
|  | #define RESULT r0 | ||||||
|  | #define TMP r2 | ||||||
|  | #endif /* __SH5__ */ | ||||||
|  |  | ||||||
|  | 	mov     STR1,r0 | ||||||
|  | 	or      STR2,r0 | ||||||
| 	tst	#3,r0 | 	tst	#3,r0 | ||||||
| 	bf	L_setup_char_loop | 	bf	L_setup_char_loop | ||||||
| 	mov	#0,r0 | 	mov	#0,r0 | ||||||
| #ifdef DELAYED_BRANCHES | #ifdef DELAYED_BRANCHES | ||||||
| 	mov.l	@r4+,r1 | 	mov.l	@STR1+,r1 | ||||||
| 	.align  2 | 	.align  2 | ||||||
| Longword_loop: | Longword_loop: | ||||||
| 	mov.l	@r5+,r2 | 	mov.l	@STR2+,TMP | ||||||
| 	cmp/str	r0,r1 | 	cmp/str	r0,r1 | ||||||
| 	bt	Longword_loop_end | 	bt	Longword_loop_end | ||||||
| 	cmp/eq	r1,r2 | 	cmp/eq	r1,TMP | ||||||
| 	bt.s	Longword_loop | 	bt.s	Longword_loop | ||||||
| 	mov.l	@r4+,r1 | 	mov.l	@STR1+,r1 | ||||||
| 	add #-4, r4 | 	add #-4, STR1 | ||||||
| Longword_loop_end: | Longword_loop_end: | ||||||
| 	add #-4, r4 | 	add #-4, STR1 | ||||||
| 	add #-4, r5 | 	add #-4, STR2 | ||||||
| L_setup_char_loop: | L_setup_char_loop: | ||||||
| 	mov.b	@r4+,r0 | 	mov.b	@STR1+,r0 | ||||||
| 	.align  2 | 	.align  2 | ||||||
| L_char_loop: | L_char_loop: | ||||||
| 	mov.b	@r5+,r1 | 	mov.b	@STR2+,r1 | ||||||
| 	tst	r0,r0 | 	tst	r0,r0 | ||||||
| 	bt	L_return | 	bt	L_return | ||||||
| 	cmp/eq	r0,r1 | 	cmp/eq	r0,r1 | ||||||
| 	bt.s L_char_loop | 	bt.s L_char_loop | ||||||
| 	mov.b	@r4+,r0 | 	mov.b	@STR1+,r0 | ||||||
| 	add	#-2,r4 | 	add	#-2,STR1 | ||||||
| 	mov.b	@r4,r0 | 	mov.b	@STR1,r0 | ||||||
| #else /* ! DELAYED_BRANCHES */ | #else /* ! DELAYED_BRANCHES */ | ||||||
| 	.align  2 | 	.align  2 | ||||||
| Longword_loop: | Longword_loop: | ||||||
| @@ -60,7 +216,8 @@ L_char_loop: | |||||||
| 	bt L_char_loop | 	bt L_char_loop | ||||||
| #endif | #endif | ||||||
| L_return: | L_return: | ||||||
| 	extu.b	r0,r0 | 	extu.b	r0,RESULT | ||||||
| 	extu.b	r1,r1 | 	extu.b	r1,r1 | ||||||
| 	rts | 	rts | ||||||
| 	sub	r1,r0 | 	sub	r1,RESULT | ||||||
|  | #endif /* ! __SHMEDIA__ */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user