67 lines
987 B
ArmAsm
67 lines
987 B
ArmAsm
! Entry: r4: destination
|
|
! r5: source
|
|
! Exit: r0: result
|
|
! r1-r2,r4-r5: clobbered
|
|
|
|
#include "asm.h"
|
|
|
|
ENTRY(strcmp)
|
|
mov r4,r0
|
|
or r5,r0
|
|
tst #3,r0
|
|
bf L_setup_char_loop
|
|
mov #0,r0
|
|
#ifdef DELAYED_BRANCHES
|
|
mov.l @r4+,r1
|
|
.align 2
|
|
Longword_loop:
|
|
mov.l @r5+,r2
|
|
cmp/str r0,r1
|
|
bt Longword_loop_end
|
|
cmp/eq r1,r2
|
|
bt.s Longword_loop
|
|
mov.l @r4+,r1
|
|
add #-4, r4
|
|
Longword_loop_end:
|
|
add #-4, r4
|
|
add #-4, r5
|
|
L_setup_char_loop:
|
|
mov.b @r4+,r0
|
|
.align 2
|
|
L_char_loop:
|
|
mov.b @r5+,r1
|
|
tst r0,r0
|
|
bt L_return
|
|
cmp/eq r0,r1
|
|
bt.s L_char_loop
|
|
mov.b @r4+,r0
|
|
add #-2,r4
|
|
mov.b @r4,r0
|
|
#else /* ! DELAYED_BRANCHES */
|
|
.align 2
|
|
Longword_loop:
|
|
mov.l @r4+,r1
|
|
mov.l @r5+,r2
|
|
cmp/str r0,r1
|
|
bt Longword_loop_end
|
|
cmp/eq r1,r2
|
|
bt Longword_loop
|
|
Longword_loop_end:
|
|
add #-4, r4
|
|
add #-4, r5
|
|
.align 2
|
|
L_setup_char_loop:
|
|
L_char_loop:
|
|
mov.b @r4+,r0
|
|
mov.b @r5+,r1
|
|
tst r0,r0
|
|
bt L_return
|
|
cmp/eq r0,r1
|
|
bt L_char_loop
|
|
#endif
|
|
L_return:
|
|
extu.b r0,r0
|
|
extu.b r1,r1
|
|
rts
|
|
sub r1,r0
|