Last active
December 28, 2016 10:07
-
-
Save murano500k/1a97747b595194b416503b355f89d4f5 to your computer and use it in GitHub Desktop.
u-boot mem compare function diff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.Lquad_loop_s: | |
NOP; | |
R0 = [P0++]; | |
R1 = [I0++]; | |
CC = R0 == R1; | |
IF !CC JUMP .Lquad_different; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.Lquad_loop_s: | |
#if ANOMALY_05000202 | |
R0 = [P0++]; | |
R1 = [I0++]; | |
#else | |
MNOP || R0 = [P0++] || R1 = [I0++]; | |
#endif | |
CC = R0 == R1; | |
IF !CC JUMP .Lquad_different; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.align 2 | |
.globl _memcmp; | |
.type _memcmp, STT_FUNC; | |
_memcmp: | |
I1 = P3; | |
P0 = R0; /* P0 = s1 address */ | |
P3 = R1; /* P3 = s2 Address */ | |
P2 = R2 ; /* P2 = count */ | |
CC = R2 <= 7(IU); | |
IF CC JUMP .Ltoo_small; | |
I0 = R1; /* s2 */ | |
R1 = R1 | R0; /* OR addresses together */ | |
R1 <<= 30; /* check bottom two bits */ | |
CC = AZ; /* AZ set if zero. */ | |
IF !CC JUMP .Lbytes ; /* Jump if addrs not aligned. */ | |
P1 = P2 >> 2; /* count = n/4 */ | |
R3 = 3; | |
R2 = R2 & R3; /* remainder */ | |
P2 = R2; /* set remainder */ | |
LSETUP (.Lquad_loop_s, .Lquad_loop_e) LC0=P1; | |
.Lquad_loop_s: | |
NOP; | |
R0 = [P0++]; | |
R1 = [I0++]; | |
CC = R0 == R1; | |
IF !CC JUMP .Lquad_different; | |
.Lquad_loop_e: | |
NOP; | |
P3 = I0; /* s2 */ | |
.Ltoo_small: | |
CC = P2 == 0; /* Check zero count*/ | |
IF CC JUMP .Lfinished; /* very unlikely*/ | |
.Lbytes: | |
LSETUP (.Lbyte_loop_s, .Lbyte_loop_e) LC0=P2; | |
.Lbyte_loop_s: | |
R1 = B[P3++](Z); /* *s2 */ | |
R0 = B[P0++](Z); /* *s1 */ | |
CC = R0 == R1; | |
IF !CC JUMP .Ldifferent; | |
.Lbyte_loop_e: | |
NOP; | |
.Ldifferent: | |
R0 = R0 - R1; | |
P3 = I1; | |
RTS; | |
.Lquad_different: | |
P0 += -4; /* back up to the start of the */ | |
P3 = I0; /* quads, and increase the*/ | |
P2 += 4; /* remainder count*/ | |
P3 += -4; | |
JUMP .Lbytes; | |
.Lfinished: | |
R0 = 0; | |
P3 = I1; | |
RTS; | |
.size _memcmp, .-_memcmp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <linux/linkage.h> | |
.text | |
.align 2 | |
ENTRY(_memcmp) | |
I1 = P3; | |
P0 = R0; /* P0 = s1 address */ | |
P3 = R1; /* P3 = s2 Address */ | |
P2 = R2 ; /* P2 = count */ | |
CC = R2 <= 7(IU); | |
IF CC JUMP .Ltoo_small; | |
I0 = R1; /* s2 */ | |
R1 = R1 | R0; /* OR addresses together */ | |
R1 <<= 30; /* check bottom two bits */ | |
CC = AZ; /* AZ set if zero. */ | |
IF !CC JUMP .Lbytes ; /* Jump if addrs not aligned. */ | |
P1 = P2 >> 2; /* count = n/4 */ | |
R3 = 3; | |
R2 = R2 & R3; /* remainder */ | |
P2 = R2; /* set remainder */ | |
LSETUP (.Lquad_loop_s, .Lquad_loop_e) LC0=P1; | |
.Lquad_loop_s: | |
#if ANOMALY_05000202 | |
R0 = [P0++]; | |
R1 = [I0++]; | |
#else | |
MNOP || R0 = [P0++] || R1 = [I0++]; | |
#endif | |
CC = R0 == R1; | |
IF !CC JUMP .Lquad_different; | |
.Lquad_loop_e: | |
NOP; | |
P3 = I0; /* s2 */ | |
.Ltoo_small: | |
CC = P2 == 0; /* Check zero count*/ | |
IF CC JUMP .Lfinished; /* very unlikely*/ | |
.Lbytes: | |
LSETUP (.Lbyte_loop_s, .Lbyte_loop_e) LC0=P2; | |
.Lbyte_loop_s: | |
R1 = B[P3++](Z); /* *s2 */ | |
R0 = B[P0++](Z); /* *s1 */ | |
CC = R0 == R1; | |
IF !CC JUMP .Ldifferent; | |
.Lbyte_loop_e: | |
NOP; | |
.Ldifferent: | |
R0 = R0 - R1; | |
P3 = I1; | |
RTS; | |
.Lquad_different: | |
P0 += -4; /* back up to the start of the */ | |
P3 = I0; /* quads, and increase the*/ | |
P2 += 4; /* remainder count*/ | |
P3 += -4; | |
JUMP .Lbytes; | |
.Lfinished: | |
R0 = 0; | |
P3 = I1; | |
RTS; | |
ENDPROC(_memcmp) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment