mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-30 23:33:44 +02:00
* fixed wrong references (used r0 as base register)
This commit is contained in:
parent
6c202898f6
commit
128c4a9a4b
@ -147,17 +147,17 @@ asm
|
||||
dcbt 0,r4
|
||||
mtctr r5
|
||||
subi r4,r4,1
|
||||
subi r0,r3,1
|
||||
subi r10,r3,1
|
||||
LStrlCopyLoop:
|
||||
lbzu r10,1(r4)
|
||||
cmpli r10,0
|
||||
stbu r10,1(r0)
|
||||
lbzu r0,1(r4)
|
||||
cmpli r0,0
|
||||
stbu r0,1(r10)
|
||||
bdnzf cr0*4+eq, LStrlCopyLoop
|
||||
{ if we stopped because we copied a #0, we're done }
|
||||
beq LStrlCopyDone
|
||||
{ otherwise add the #0 }
|
||||
li r10,0
|
||||
stb r10,1(r0)
|
||||
li r0,0
|
||||
stb r0,1(r10)
|
||||
LStrlCopyDone:
|
||||
end ['R0','R4','R10','CR0'];
|
||||
|
||||
@ -190,16 +190,16 @@ function strcomp(str1,str2 : pchar) : longint;assembler;
|
||||
{ in r3 }
|
||||
asm
|
||||
{ use r0 instead of r3 for str1 since r3 contains result }
|
||||
subi r0,r3,1
|
||||
subi r9,r3,1
|
||||
subi r4,r4,1
|
||||
LStrCompLoop:
|
||||
{ load next chars }
|
||||
lbzu r9,1(r0)
|
||||
lbzu r0,1(r9)
|
||||
{ check if one is zero }
|
||||
cmpli cr1,r9,0
|
||||
cmpli cr1,r0,0
|
||||
lbzu r10,1(r4)
|
||||
{ calculate difference }
|
||||
sub. r3,r9,r10
|
||||
sub. r3,r0,r10
|
||||
{ if chars not equal, we're ready }
|
||||
bne LStrCompDone
|
||||
{ if they are equal and one is zero, then the other one is zero too }
|
||||
@ -220,19 +220,19 @@ asm
|
||||
dcbt 0,r3
|
||||
{ use r0 instead of r3 for str1 since r3 contains result }
|
||||
cmpl r5,0
|
||||
subi r0,r3,1
|
||||
subi r9,r3,1
|
||||
li r3,0
|
||||
beq LStrlCompDone
|
||||
mtctr r5
|
||||
subi r4,r4,1
|
||||
LStrlCompLoop:
|
||||
{ load next chars }
|
||||
lbzu r9,1(r0)
|
||||
lbzu r0,1(r9)
|
||||
{ check if one is zero }
|
||||
cmpli cr1,r9,0
|
||||
cmpli cr1,r0,0
|
||||
lbzu r10,1(r4)
|
||||
{ calculate difference }
|
||||
sub. r3,r9,r10
|
||||
sub. r3,r0,r10
|
||||
{ if chars not equal, we're ready }
|
||||
bne LStrlCompDone
|
||||
{ if they are equal and one is zero, then the other one is zero too }
|
||||
@ -315,32 +315,32 @@ asm
|
||||
dcbt 0,r3
|
||||
{ use r0 instead of r3 for str1 since r3 contains result }
|
||||
cmpl r5,0
|
||||
subi r0,r3,1
|
||||
subi r9,r3,1
|
||||
li r3,0
|
||||
beq- LStrlCompDone
|
||||
mtctr r5
|
||||
subi r4,r4,1
|
||||
LStriCompLoop:
|
||||
{ load next chars }
|
||||
lbzu r9,1(r0)
|
||||
lbzu r0,1(r9)
|
||||
{ check if one is zero }
|
||||
cmpli cr1,r9,0
|
||||
cmpli cr1,r0,0
|
||||
lbzu r10,1(r4)
|
||||
{ calculate difference }
|
||||
sub. r3,r9,r10
|
||||
sub. r3,r0,r10
|
||||
{ if chars are equal, no further test is necessary }
|
||||
beq+ LStriCompEqual
|
||||
beq LStriCompEqual
|
||||
|
||||
{ see stricomp for explanation }
|
||||
li r8,0
|
||||
li r5,0
|
||||
|
||||
subic r3,r9,'A'
|
||||
subic r3,r0,'A'
|
||||
addme r8,r8
|
||||
subic r3,r10,'A'
|
||||
addme r5,r5
|
||||
|
||||
subfic r3,r9,'Z'
|
||||
subfic r3,r0,'Z'
|
||||
andi r8,r8,0x020
|
||||
subfe r7,r7,r7
|
||||
subfic r3,r10,'Z'
|
||||
@ -349,11 +349,11 @@ LStriCompLoop:
|
||||
|
||||
and r8,r8,r7
|
||||
and r5,r5,r24
|
||||
add r9,r9,r8
|
||||
add r0,r0,r8
|
||||
add r10,r10,r5
|
||||
|
||||
{ compare again }
|
||||
sub. r3,r9,r10
|
||||
sub. r3,r0,r10
|
||||
bne LStrCompDone
|
||||
LStriCompEqual:
|
||||
{ if they are equal and one is zero, then the other one is zero too }
|
||||
@ -453,7 +453,10 @@ end ['R0','R9','R10','CR0','CR1'];
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.11 2002-08-10 17:14:36 jonas
|
||||
Revision 1.12 2002-09-06 16:58:43 jonas
|
||||
* fixed wrong references (used r0 as base register)
|
||||
|
||||
Revision 1.11 2002/08/10 17:14:36 jonas
|
||||
* various fixes, mostly changing the names of the modifies registers to
|
||||
upper case since that seems to be required by the compiler
|
||||
|
||||
|
@ -22,26 +22,29 @@ function strpas(p : pchar) : string; assembler;
|
||||
function strpcopy(d : pchar;const s : string) : pchar;assembler;
|
||||
asm
|
||||
{ get length }
|
||||
lbz r10,0(r4)
|
||||
lbz r0,0(r4)
|
||||
{ put in counter }
|
||||
cmpli r10,0
|
||||
mtctr r10
|
||||
subi r0,r3,1
|
||||
cmpli r0,0
|
||||
mtctr r0
|
||||
subi r10,r3,1
|
||||
beq LStrPCopyEmpty
|
||||
LStrPCopyLoop:
|
||||
{ copy everything }
|
||||
lbzu r10,1(r4)
|
||||
stbu r10,1(r0)
|
||||
lbzu r0,1(r4)
|
||||
stbu r0,1(r10)
|
||||
bdnz LStrPCopyLoop
|
||||
{ add terminating #0 }
|
||||
li r10,0
|
||||
li r0,0
|
||||
LStrPCopyEmpty:
|
||||
stb r10,1(r0)
|
||||
stb r0,1(r10)
|
||||
end ['R0','R4','R10','CR0','CTR'];
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.5 2002-08-10 17:14:36 jonas
|
||||
Revision 1.6 2002-09-06 16:58:43 jonas
|
||||
* fixed wrong references (used r0 as base register)
|
||||
|
||||
Revision 1.5 2002/08/10 17:14:36 jonas
|
||||
* various fixes, mostly changing the names of the modifies registers to
|
||||
upper case since that seems to be required by the compiler
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user