* various fixes, mostly changing the names of the modifies registers to

upper case since that seems to be required by the compiler
This commit is contained in:
Jonas Maebe 2002-08-10 17:14:36 +00:00
parent 18b102ce95
commit 3a23eefecc
9 changed files with 136 additions and 85 deletions

View File

@ -93,9 +93,9 @@
asm asm
fctiwz fr1,fr1 fctiwz fr1,fr1
stfd fr1,temp.d stfd fr1,temp.d
lwz r3,temp.l2 lwz r3,temp.l1
// !!!! fix int64 result lwz r4,temp.l2
end ['r3','f1']; end ['R3','F1'];
{$define FPC_SYSTEM_HAS_ROUND} {$define FPC_SYSTEM_HAS_ROUND}
@ -113,8 +113,9 @@
asm asm
fctiw fr1,fr1 fctiw fr1,fr1
stfd fr1,temp.d stfd fr1,temp.d
lwz r3,temp.l2 lwz r3,temp.l1
end ['r3','f1']; lwz r4,temp.l2
end ['R3','F1'];
{$define FPC_SYSTEM_HAS_POWER} {$define FPC_SYSTEM_HAS_POWER}
@ -207,8 +208,8 @@
****************************************************************************} ****************************************************************************}
const const
longint_to_real_helper: int64 = 0x4330000080000000; longint_to_real_helper: int64 = $4330000080000000;
cardinal_to_real_helper: int64 = 0x430000000000000; cardinal_to_real_helper: int64 = $430000000000000;
int_to_real_factor: double = double(high(cardinal))+1.0; int_to_real_factor: double = double(high(cardinal))+1.0;
function fpc_int64_to_double(i: int64): double; compilerproc; function fpc_int64_to_double(i: int64): double; compilerproc;
@ -239,7 +240,7 @@ asm
lfd fr2,int_to_real_factor@l(r3) lfd fr2,int_to_real_factor@l(r3)
fsub fr3,fr3,fr1 fsub fr3,fr3,fr1
fmadd fr1,fr0,fr2,fr3 fmadd fr1,fr0,fr2,fr3
end ['r0','r3','r4','f0','f1','f2','f3']; end ['R0','R3','R4','F0','F1','F2','F3'];
function fpc_qword_to_double(q: qword): double; compilerproc; function fpc_qword_to_double(q: qword): double; compilerproc;
@ -267,13 +268,17 @@ asm
lfd fr2,int_to_real_factor@l(r3) lfd fr2,int_to_real_factor@l(r3)
fsub fr3,fr3,fr1 fsub fr3,fr3,fr1
fmadd fr1,fr0,fr2,fr3 fmadd fr1,fr0,fr2,fr3
end ['r0','r3','f0','f1','f2','f3']; end ['R0','R3','F0','F1','F2','F3'];
{ {
$Log$ $Log$
Revision 1.7 2002-07-31 16:58:12 jonas Revision 1.8 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
Revision 1.7 2002/07/31 16:58:12 jonas
* fixed conversion from int64/qword to double errors * fixed conversion from int64/qword to double errors
Revision 1.6 2002/07/29 21:28:17 florian Revision 1.6 2002/07/29 21:28:17 florian

View File

@ -123,14 +123,14 @@ L8BytesAligned:
sub r4,r4,r10 sub r4,r4,r10
LMove32ByteLoop: LMove32ByteLoop:
lfdux f13,r3,r10
lfdux f12,r3,r10
lfdux f11,r3,r10
lfdux f0,r3,r10 lfdux f0,r3,r10
stfdux f13,r4,r10 lfdux f1,r3,r10
stfdux f12,r4,r10 lfdux f2,r3,r10
stfdux f11,r4,r10 lfdux f3,r3,r10
stfdux f0,r4,r10 stfdux f0,r4,r10
stfdux f1,r4,r10
stfdux f2,r4,r10
stfdux f3,r4,r10
bdnz LMove32ByteLoop bdnz LMove32ByteLoop
{ cr0*4+eq is true if "count and 31" = 0 } { cr0*4+eq is true if "count and 31" = 0 }
@ -310,9 +310,10 @@ LFillCharDone:
end; end;
{$define FPC_SYSTEM_HAS_FILLWORD} {$define FPC_SYSTEM_HAS_FILLDWORD}
procedure fillword(var x;count : longint;value : word); procedure filldword(var x;count : longint;value : dword);
begin assembler;
asm
{ registers: { registers:
r3 x r3 x
r4 count r4 count
@ -327,17 +328,14 @@ begin
} }
asm asm
cmpwi cr0,r3,0 cmpwi cr0,r3,0
andi r17,r4,$3 mtctr r4
srwi r18,r4,1 //r18:=count div 2 subi r3,r3,4
mr r13,r3 ble .FillWordEnd //if count<=0 Then Exit
li r14,4
ble .FillWordEnd //if count<=0 Then Exit
.FillWordLoop: .FillWordLoop:
stwux r5,r13,r14 stwu r5,4(r3)
bdnz .FillWordLoop bdnz .FillWordLoop
.FillWordEnd: .FillWordEnd:
end ['r13','r14','ctr'] end ['R3','R4','R5','CTR'];
end;
{$define FPC_SYSTEM_HAS_INDEXBYTE} {$define FPC_SYSTEM_HAS_INDEXBYTE}
@ -362,7 +360,7 @@ LIndexByteLoop:
bne LIndexByteDone bne LIndexByteDone
sub r3,r10,r0 sub r3,r10,r0
LIndexByteDone: LIndexByteDone:
end ['r0','r3','r9','r10','cr0','ctr']; end ['R0','R3','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_INDEXWORD} {$define FPC_SYSTEM_HAS_INDEXWORD}
@ -387,7 +385,7 @@ LIndexWordLoop:
bne LIndexWordDone bne LIndexWordDone
sub r3,r10,r0 sub r3,r10,r0
LIndexWordDone: LIndexWordDone:
end ['r0','r3','r9','r10','cr0','ctr']; end ['R0','R3','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_INDEXDWORD} {$define FPC_SYSTEM_HAS_INDEXDWORD}
@ -412,7 +410,7 @@ LIndexDWordLoop:
bne LIndexDWordDone bne LIndexDWordDone
sub r3,r10,r0 sub r3,r10,r0
LIndexDWordDone: LIndexDWordDone:
end ['r0','r3','r9','r10','cr0','ctr']; end ['R0','R3','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_COMPAREBYTE} {$define FPC_SYSTEM_HAS_COMPAREBYTE}
function CompareByte(var buf1,buf2;len:longint):longint; assembler; function CompareByte(var buf1,buf2;len:longint):longint; assembler;
@ -438,7 +436,7 @@ LCompByteLoop:
{ if chars not equal or at the end, we're ready } { if chars not equal or at the end, we're ready }
bdnzt cr0*4+eq, LCompByteLoop bdnzt cr0*4+eq, LCompByteLoop
LCompByteDone: LCompByteDone:
end ['r0','r3','r4','r9','r10','cr0','ctr']; end ['R0','R3','R4','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_COMPAREWORD} {$define FPC_SYSTEM_HAS_COMPAREWORD}
function CompareWord(var buf1,buf2;len:longint):longint; assembler; function CompareWord(var buf1,buf2;len:longint):longint; assembler;
@ -464,7 +462,7 @@ LCompWordLoop:
{ if chars not equal or at the end, we're ready } { if chars not equal or at the end, we're ready }
bdnzt cr0*4+eq, LCompWordLoop bdnzt cr0*4+eq, LCompWordLoop
LCompWordDone: LCompWordDone:
end ['r0','r3','r4','r9','r10','cr0','ctr']; end ['R0','R3','R4','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_COMPAREDWORD} {$define FPC_SYSTEM_HAS_COMPAREDWORD}
@ -491,7 +489,7 @@ LCompDWordLoop:
{ if chars not equal or at the end, we're ready } { if chars not equal or at the end, we're ready }
bdnzt cr0*4+eq, LCompDWordLoop bdnzt cr0*4+eq, LCompDWordLoop
LCompDWordDone: LCompDWordDone:
end ['r0','r3','r4','r9','r10','cr0','ctr']; end ['R0','R3','R4','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_INDEXCHAR0} {$define FPC_SYSTEM_HAS_INDEXCHAR0}
function IndexChar0(var buf;len:longint;b:Char):longint; assembler; function IndexChar0(var buf;len:longint;b:Char):longint; assembler;
@ -519,7 +517,7 @@ LIndexChar0Loop:
bne LIndexChar0Done bne LIndexChar0Done
sub r3,r9,r0 sub r3,r9,r0
LIndexChar0Done: LIndexChar0Done:
end ['r0','r3','r4','r9','r10','cr0','ctr']; end ['R0','R3','R4','R9','R10','CR0','CTR'];
{**************************************************************************** {****************************************************************************
@ -627,7 +625,7 @@ LShortStrCopyLoop:
lbzu r0,1(r5) lbzu r0,1(r5)
stbu r0,1(r3) stbu r0,1(r3)
bdnz LShortStrCopyLoop bdnz LShortStrCopyLoop
end ['r0','r3','r4','r5','r10','cr0','ctr']; end ['R0','R3','R4','R5','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SHORTSTR_COPY} {$define FPC_SYSTEM_HAS_FPC_SHORTSTR_COPY}
@ -655,7 +653,7 @@ LShortStrCopyLoop:
lbzu r0,1(r4) lbzu r0,1(r4)
stbu r0,1(r5) stbu r0,1(r5)
bdnz LShortStrCopyLoop bdnz LShortStrCopyLoop
end ['r0','r3','r4','r5','r10','cr0','ctr']; end ['R0','R3','R4','R5','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SHORTSTR_CONCAT} {$define FPC_SYSTEM_HAS_FPC_SHORTSTR_CONCAT}
function fpc_shortstr_concat(const s1,s2: shortstring): shortstring; compilerproc; function fpc_shortstr_concat(const s1,s2: shortstring): shortstring; compilerproc;
@ -683,7 +681,7 @@ LShortStrConcatLoop:
lbzu r10,1(r4) lbzu r10,1(r4)
stbu r10,1(r3) stbu r10,1(r3)
bdnz LShortStrConcatLoop bdnz LShortStrConcatLoop
end ['r3','r4','r8','r9','r10','ctr']; end ['R3','R4','R8','R9','R10','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SHORTSTR_COMPARE} {$define FPC_SYSTEM_HAS_FPC_SHORTSTR_COMPARE}
@ -738,7 +736,7 @@ LShortStrCompareLen:
{ also return result in flags, maybe we can use this in the CG } { also return result in flags, maybe we can use this in the CG }
mr. r3,r0 mr. r3,r0
LShortStrCompareDone: LShortStrCompareDone:
end ['r0','r3','r4','r8','r9','r10','cr0','cr1','ctr']; end ['R0','R3','R4','R8','R9','R10','CR0','CR1','CTR'];
{$define FPC_SYSTEM_HAS_FPC_PCHAR_TO_SHORTSTR} {$define FPC_SYSTEM_HAS_FPC_PCHAR_TO_SHORTSTR}
@ -757,7 +755,7 @@ function get_frame:longint;assembler;
asm asm
{$warning FIX ME!} {$warning FIX ME!}
// !!!!!!! depends on ABI !!!!!!!! // !!!!!!! depends on ABI !!!!!!!!
end ['r3']; end ['R3'];
{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR} {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
@ -765,7 +763,7 @@ function get_caller_addr(framebp:longint):longint;assembler;
asm asm
{$warning FIX ME!} {$warning FIX ME!}
// !!!!!!! depends on ABI !!!!!!!! // !!!!!!! depends on ABI !!!!!!!!
end ['r3']; end ['R3'];
{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME} {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
@ -773,7 +771,7 @@ function get_caller_frame(framebp:longint):longint;assembler;
asm asm
{$warning FIX ME!} {$warning FIX ME!}
// !!!!!!! depends on ABI !!!!!!!! // !!!!!!! depends on ABI !!!!!!!!
end ['r3']; end ['R3'];
{$define FPC_SYSTEM_HAS_ABS_LONGINT} {$define FPC_SYSTEM_HAS_ABS_LONGINT}
function abs(l:longint):longint; assembler;[internconst:in_const_abs]; function abs(l:longint):longint; assembler;[internconst:in_const_abs];
@ -781,7 +779,7 @@ asm
srawi r0,r3,31 srawi r0,r3,31
add r3,r0,r3 add r3,r0,r3
xor r3,r3,r0 xor r3,r3,r0
end ['r0','r3']; end ['R0','R3'];
{**************************************************************************** {****************************************************************************
@ -792,21 +790,21 @@ end ['r0','r3'];
function odd(l:longint):boolean;assembler;[internconst:in_const_odd]; function odd(l:longint):boolean;assembler;[internconst:in_const_odd];
asm asm
rlwinm r3,r3,0,31,31 rlwinm r3,r3,0,31,31
end ['r3']; end ['R3'];
{$define FPC_SYSTEM_HAS_SQR_LONGINT} {$define FPC_SYSTEM_HAS_SQR_LONGINT}
function sqr(l:longint):longint;assembler;[internconst:in_const_sqr]; function sqr(l:longint):longint;assembler;[internconst:in_const_sqr];
asm asm
mullw r3,r3,r3 mullw r3,r3,r3
end ['r3']; end ['R3'];
{$define FPC_SYSTEM_HAS_SPTR} {$define FPC_SYSTEM_HAS_SPTR}
Function Sptr : Longint;assembler; Function Sptr : Longint;assembler;
asm asm
mr r3,sp mr r3,sp
end ['r3']; end ['R3'];
{**************************************************************************** {****************************************************************************
@ -838,7 +836,7 @@ LDecLockedLoop:
stw r10,0,r3 stw r10,0,r3
{$endif MT} {$endif MT}
mr. r3,r10 mr. r3,r10
end ['r3','r10']; end ['R3','R10'];
procedure inclocked(var l : longint);assembler; procedure inclocked(var l : longint);assembler;
asm asm
@ -853,12 +851,16 @@ LIncLockedLoop:
addi r10,r10,1 addi r10,r10,1
stw r10,0,r3 stw r10,0,r3
{$endif MT} {$endif MT}
end ['r3','r10']; end ['R3','R10'];
{ {
$Log$ $Log$
Revision 1.11 2002-07-30 17:29:53 florian Revision 1.12 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
Revision 1.11 2002/07/30 17:29:53 florian
+ dummy setjmp and longjmp added + dummy setjmp and longjmp added
+ dummy implemtation of the destructor helper + dummy implemtation of the destructor helper

View File

@ -15,6 +15,7 @@
**********************************************************************} **********************************************************************}
{$define FPC_SYSTEM_HAS_FPC_SET_LOAD_SMALL}
function fpc_set_load_small(l: fpc_small_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_LOAD_SMALL']; compilerproc; function fpc_set_load_small(l: fpc_small_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_LOAD_SMALL']; compilerproc;
{ {
load a normal set p from a smallset l load a normal set p from a smallset l
@ -31,9 +32,10 @@ asm
stw r0,20(r3) stw r0,20(r3)
stw r0,24(r3) stw r0,24(r3)
stw r0,28(r3) stw r0,28(r3)
end ['r0']; end ['R0'];
{$define FPC_SYSTEM_HAS_FPC_SET_CREATE_ELEMENT}
{ checked 2001/09/28 (JM) } { checked 2001/09/28 (JM) }
function fpc_set_create_element(b : byte): fpc_normal_set;assembler;[public,alias:'FPC_SET_CREATE_ELEMENT']; compilerproc; function fpc_set_create_element(b : byte): fpc_normal_set;assembler;[public,alias:'FPC_SET_CREATE_ELEMENT']; compilerproc;
{ {
@ -64,8 +66,10 @@ asm
// store the result // store the result
stwx r0,r3,r4 stwx r0,r3,r4
end ['r0','r4','r10']; end ['R0','R4','R10'];
{$define FPC_SYSTEM_HAS_FPC_SET_SET_BYTE}
function fpc_set_set_byte(const source: fpc_normal_set; b : byte): fpc_normal_set;assembler; compilerproc; function fpc_set_set_byte(const source: fpc_normal_set; b : byte): fpc_normal_set;assembler; compilerproc;
{ {
add the element b to the set pointed by p add the element b to the set pointed by p
@ -91,14 +95,15 @@ Lset_set_byte_copy:
li r0,1 li r0,1
// generate bit which has to be inserted // generate bit which has to be inserted
// (can't use rlwimi, since that one only works for constants) // (can't use rlwimi, since that one only works for constants)
rlwnm r5,r0,r5 slw r5,r0,r5
// insert it // insert it
or r5,r4,r5 or r5,r4,r5
// store result // store result
stw r5,(r3) stw r5,(r3)
end ['r0','r3','r4','r5','ctr']; end ['R0','R3','R4','R5','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_UNSET_BYTE}
function fpc_set_unset_byte(const source: fpc_normal_set; b : byte): fpc_normal_set;assembler; compilerproc; function fpc_set_unset_byte(const source: fpc_normal_set; b : byte): fpc_normal_set;assembler; compilerproc;
{ {
suppresses the element b to the set pointed by p suppresses the element b to the set pointed by p
@ -129,9 +134,10 @@ Lset_unset_byte_copy:
andc r5,r4,r5 andc r5,r4,r5
// store result // store result
stw r4,(r3) stw r4,(r3)
end ['r0','r3','r4','r5','ctr']; end ['R0','R3','R4','R5','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_SET_RANGE}
function fpc_set_set_range(const orgset: fpc_normal_set; l,h : byte): fpc_normal_set;assembler; compilerproc; function fpc_set_set_range(const orgset: fpc_normal_set; l,h : byte): fpc_normal_set;assembler; compilerproc;
{ {
on entry: result in r3, l in r4, h in r5 on entry: result in r3, l in r4, h in r5
@ -182,7 +188,7 @@ Lset_range_loop:
Lset_range_hi: // in all cases, r3 here contains the address of Lset_range_hi: // in all cases, r3 here contains the address of
// the longint which contains the hi bit and r4 // the longint which contains the hi bit and r4
// contains this longint // contains this longint
slw r9,r10,r6 // r7 := bitmask shl (31 - (hi mod 32)) = slw r9,r10,r6 // r9 := bitmask shl (31 - (hi mod 32)) =
// bitmask with bits higher than hi cleared // bitmask with bits higher than hi cleared
// (r8 = $0xffffffff unless the first beq was // (r8 = $0xffffffff unless the first beq was
// taken) // taken)
@ -190,7 +196,7 @@ Lset_range_hi: // in all cases, r3 here contains the address of
or r5,r5,r10 // and combine with existing set or r5,r5,r10 // and combine with existing set
stw r5,(r3) // store to set stw r5,(r3) // store to set
Lset_range_exit: Lset_range_exit:
end ['r0','r3','r4','r5','r6','r9','r10','cr0','ctr']; end ['R0','R3','R4','R5','R6','R9','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_IN_BYTE} {$define FPC_SYSTEM_HAS_FPC_SET_IN_BYTE}
@ -206,15 +212,17 @@ asm
rlwinm r0,r4,31-3+1,3,31-2 rlwinm r0,r4,31-3+1,3,31-2
// load dword in which the bit has to be tested // load dword in which the bit has to be tested
lwzx r3,r3,r0 lwzx r3,r3,r0
li r0,1 li r0,1
// generate bit which has to be tested // generate bit which has to be tested
rwlwnm r4,r0,r4,0,31 rwlwnm r4,r0,r4,0,31
// test it // test it
and. r3,r3,r4 and. r3,r3,r4
end ['r0','r3','r4','cr0']; end ['R0','R3','R4','CR0'];
{$define FPC_SYSTEM_HAS_FPC_SET_ADD_SETS}
function fpc_set_add_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_ADD_SETS']; compilerproc; function fpc_set_add_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_ADD_SETS']; compilerproc;
{ {
adds set1 and set2 into set dest adds set1 and set2 into set dest
@ -234,10 +242,10 @@ asm
or r0,r0,r10 or r0,r0,r10
stwu r0,4(r3) stwu r0,4(r3)
bdnz LMADDSETS1 bdnz LMADDSETS1
end ['r0','r3','r4','r5','r10','ctr']; end ['R0','R3','R4','R5','R10','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_MUL_SETS}
function fpc_set_mul_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_MUL_SETS']; compilerproc; function fpc_set_mul_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_MUL_SETS']; compilerproc;
{ {
multiplies (takes common elements of) set1 and set2 result put in dest multiplies (takes common elements of) set1 and set2 result put in dest
@ -257,9 +265,10 @@ asm
and r0,r0,r10 and r0,r0,r10
stwu r0,4(r3) stwu r0,4(r3)
bdnz LMMULSETS1 bdnz LMMULSETS1
end ['r0','r3','r4','r5','r10','ctr']; end ['R0','R3','R4','R5','R10','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_SUB_SETS}
function fpc_set_sub_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SUB_SETS']; compilerproc; function fpc_set_sub_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SUB_SETS']; compilerproc;
{ {
computes the diff from set1 to set2 result in dest computes the diff from set1 to set2 result in dest
@ -279,9 +288,10 @@ asm
andc r0,r0,r10 andc r0,r0,r10
stwu r0,4(r3) stwu r0,4(r3)
bdnz LMSUBSETS1 bdnz LMSUBSETS1
end ['r0','r3','r4','r5','r10','ctr']; end ['R0','R3','R4','R5','R10','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_SYMDIF_SETS}
function fpc_set_symdif_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SYMDIF_SETS']; compilerproc; function fpc_set_symdif_sets(const set1,set2: fpc_normal_set): fpc_normal_set;assembler;[public,alias:'FPC_SET_SYMDIF_SETS']; compilerproc;
{ {
computes the symetric diff from set1 to set2 result in dest computes the symetric diff from set1 to set2 result in dest
@ -301,9 +311,10 @@ asm
xor r0,r0,r10 xor r0,r0,r10
stwu r0,4(r3) stwu r0,4(r3)
bdnz LMSYMDIFSETS1 bdnz LMSYMDIFSETS1
end ['r0','r3','r4','r5','r10','ctr']; end ['R0','R3','R4','R5','R10','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_COMP_SETS}
function fpc_set_comp_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_COMP_SETS']; compilerproc; function fpc_set_comp_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_COMP_SETS']; compilerproc;
{ {
compares set1 and set2 zeroflag is set if they are equal compares set1 and set2 zeroflag is set if they are equal
@ -321,8 +332,10 @@ asm
bdnzt cr0*4+eq,LMCOMPSETS1 bdnzt cr0*4+eq,LMCOMPSETS1
cntlzw r3,r0 cntlzw r3,r0
srwi. r3,r3,31 srwi. r3,r3,31
end ['r0','r3','r4','r10','cr0','ctr']; end ['R0','R3','R4','R10','CR0','CTR'];
{$define FPC_SYSTEM_HAS_FPC_SET_CONTAINS_SET}
function fpc_set_contains_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_CONTAINS_SETS']; compilerproc; function fpc_set_contains_sets(const set1,set2: fpc_normal_set): boolean;assembler;[public,alias:'FPC_SET_CONTAINS_SETS']; compilerproc;
{ {
on exit, zero flag is set if set1 <= set2 (set2 contains set1) on exit, zero flag is set if set1 <= set2 (set2 contains set1)
@ -341,7 +354,7 @@ asm
bdnzt cr0*4+eq,LMCONTAINSSETS1 bdnzt cr0*4+eq,LMCONTAINSSETS1
cntlzw r3,r0 cntlzw r3,r0
srwi. r3,r3,31 srwi. r3,r3,31
end ['r0','r3','r4','r10','cr0','ctr']; end ['R0','R3','R4','R10','CR0','CTR'];
@ -510,7 +523,11 @@ end;
{ {
$Log$ $Log$
Revision 1.11 2002-07-28 20:43:49 florian Revision 1.12 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
Revision 1.11 2002/07/28 20:43:49 florian
* several fixes for linux/powerpc * several fixes for linux/powerpc
* several fixes to MT * several fixes to MT

View File

@ -18,15 +18,21 @@
{ the necessary code can be copied from the linux kernel sources } { the necessary code can be copied from the linux kernel sources }
function setjmp(var S : jmp_buf) : longint;assembler; function setjmp(var S : jmp_buf) : longint;assembler;
asm asm
{$warning FIXME!!!!}
end; end;
procedure longjmp(var S : jmp_buf;value : longint);assembler; procedure longjmp(var S : jmp_buf;value : longint);assembler;
asm asm
{$warning FIXME!!!!}
end; end;
{ {
$Log$ $Log$
Revision 1.2 2002-07-30 17:29:53 florian Revision 1.3 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
Revision 1.2 2002/07/30 17:29:53 florian
+ dummy setjmp and longjmp added + dummy setjmp and longjmp added
+ dummy implemtation of the destructor helper + dummy implemtation of the destructor helper

View File

@ -17,6 +17,7 @@
type type
jmp_buf = record jmp_buf = record
{$warning FIXME!!!!}
end; end;
pjmp_buf = ^jmp_buf; pjmp_buf = ^jmp_buf;
@ -25,7 +26,11 @@ procedure longjmp(var S : jmp_buf;value : longint);
{ {
$Log$ $Log$
Revision 1.3 2002-07-26 22:46:17 florian Revision 1.4 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
Revision 1.3 2002/07/26 22:46:17 florian
* interface of system unit for Linux/PowerPC compiles * interface of system unit for Linux/PowerPC compiles
Revision 1.2 2002/07/26 22:08:38 florian Revision 1.2 2002/07/26 22:08:38 florian

View File

@ -79,7 +79,7 @@ LStrCopyWrapUpLoop:
bge LStrCopyWrapUpLoop bge LStrCopyWrapUpLoop
LStrCopyDone: LStrCopyDone:
{ r3 still contains dest here } { r3 still contains dest here }
end ['r4','r7','r8','r0','r9','r10','cr0','ctr']; end ['R4','R7','R8','R0','R9','R10','CR0','CTR'];
function strecopy(dest,source : pchar) : pchar;assembler; function strecopy(dest,source : pchar) : pchar;assembler;
@ -136,7 +136,7 @@ LStrCopyWrapUpLoop:
bge LStrCopyWrapUpLoop bge LStrCopyWrapUpLoop
LStrCopyDone: LStrCopyDone:
{ r3 contains new dest here } { r3 contains new dest here }
end ['r3','r4','r8','r0','r3','r10','cr0','ctr']; end ['R3','R4','R8','R0','R3','R10','CR0','CTR'];
function strlcopy(dest,source : pchar;maxlen : longint) : pchar;assembler; function strlcopy(dest,source : pchar;maxlen : longint) : pchar;assembler;
@ -159,7 +159,7 @@ LStrlCopyLoop:
li r10,0 li r10,0
stb r10,1(r0) stb r10,1(r0)
LStrlCopyDone: LStrlCopyDone:
end ['r0','r4','r30','cr0']; end ['R0','R4','R10','CR0'];
function strlen(p : pchar) : longint;assembler; function strlen(p : pchar) : longint;assembler;
@ -181,7 +181,7 @@ LStrEndLoop:
cmpli r0,0 cmpli r0,0
bne LStrEndLoop bne LStrEndLoop
LStrEndDone: LStrEndDone:
end ['r0','r3','r4','cr0']; end ['R0','R3','R4','CR0'];
function strcomp(str1,str2 : pchar) : longint;assembler; function strcomp(str1,str2 : pchar) : longint;assembler;
@ -207,7 +207,7 @@ LStrCompLoop:
{ otherwise loop } { otherwise loop }
bne cr1,LStrCompLoop bne cr1,LStrCompLoop
LStrCompDone: LStrCompDone:
end ['r0','r3','r4','r9','r10','cr0','cr1']; end ['R0','R3','R4','R9','R10','CR0','CR1'];
function strlcomp(str1,str2 : pchar;l : longint) : longint;assembler; function strlcomp(str1,str2 : pchar;l : longint) : longint;assembler;
@ -240,7 +240,7 @@ LStrlCompLoop:
{ otherwise loop (if ctr <> 0) } { otherwise loop (if ctr <> 0) }
bdnzf cr1*4+eq,LStrlCompLoop bdnzf cr1*4+eq,LStrlCompLoop
LStrlCompDone: LStrlCompDone:
end ['r0','r3','r4','r9','r10','cr0','cr1','ctr']; end ['R0','R3','R4','R9','R10','CR0','CR1','CTR'];
function stricomp(str1,str2 : pchar) : longint;assembler; function stricomp(str1,str2 : pchar) : longint;assembler;
@ -303,7 +303,7 @@ LStriCompEqual:
{ otherwise loop } { otherwise loop }
bne cr1,LStriCompLoop bne cr1,LStriCompLoop
LStriCompDone: LStriCompDone:
end ['r3','r4','r26','r27','r28','r29','r30','cr0','cr1']; end ['R3','R4','R26','R27','R28','R29','R30','CR0','CR1'];
function strlicomp(str1,str2 : pchar;l : longint) : longint;assembler; function strlicomp(str1,str2 : pchar;l : longint) : longint;assembler;
@ -361,7 +361,7 @@ LStriCompEqual:
{ otherwise loop (if ctr <> 0) } { otherwise loop (if ctr <> 0) }
bdnzf cr1*4+eq,LStriCompLoop bdnzf cr1*4+eq,LStriCompLoop
LStriCompDone: LStriCompDone:
end ['r0','r3','r4','r5','r7','r8','r9','r10','cr0','cr1','ctr']; end ['R0','R3','R4','R5','R7','R8','R9','R10','CR0','CR1','CTR'];
function strscan(p : pchar;c : char) : pchar;assembler; function strscan(p : pchar;c : char) : pchar;assembler;
@ -378,7 +378,7 @@ LStrScanLoop:
beq cr1,LStrScanDone beq cr1,LStrScanDone
bne LStrScanLoop bne LStrScanLoop
LStrScanDone: LStrScanDone:
end ['r0','r3','r4','cr0','cr1']; end ['R0','R3','R4','CR0','CR1'];
function strrscan(p : pchar;c : char) : pchar;assembler; function strrscan(p : pchar;c : char) : pchar;assembler;
@ -408,7 +408,7 @@ LStrrScanNotFound:
and r10,r10,r0 { r10 = (r0 >= r3) ? 0 : r0 - r3 } and r10,r10,r0 { r10 = (r0 >= r3) ? 0 : r0 - r3 }
add r3,r10,r3 { r3 = (r0 >= r3) ? r3 : r0 } add r3,r10,r3 { r3 = (r0 >= r3) ? r3 : r0 }
LStrrScanDone: LStrrScanDone:
end ['r0','r3','r4','r10','cr0','cr1']; end ['R0','R3','R4','R10','CR0','CR1'];
function strupper(p : pchar) : pchar;assembler; function strupper(p : pchar) : pchar;assembler;
@ -428,7 +428,7 @@ LStrUpperLoop:
LStrUpper1: LStrUpper1:
bne cr1,LStrUpperLoop bne cr1,LStrUpperLoop
LStrUpperNil: LStrUpperNil:
end ['r0','r9','r10','cr0','cr1']; end ['R0','R9','R10','CR0','CR1'];
function strlower(p : pchar) : pchar;assembler; function strlower(p : pchar) : pchar;assembler;
@ -448,12 +448,16 @@ LStrLowerLoop:
LStrLower1: LStrLower1:
bne cr1,LStrLowerLoop bne cr1,LStrLowerLoop
LStrLowerNil: LStrLowerNil:
end ['r0','r9','r10','cr0','cr1']; end ['R0','R9','R10','CR0','CR1'];
{ {
$Log$ $Log$
Revision 1.10 2001-09-28 13:25:04 jonas 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
Revision 1.10 2001/09/28 13:25:04 jonas
* fixed wrong alignment code (sometimes we aligned to multiple of 8 * fixed wrong alignment code (sometimes we aligned to multiple of 8
instead of the desired multiple of 4) instead of the desired multiple of 4)

View File

@ -37,11 +37,15 @@ LStrPCopyLoop:
li r10,0 li r10,0
LStrPCopyEmpty: LStrPCopyEmpty:
stb r10,1(r0) stb r10,1(r0)
end ['r0','r4','r10','cr0','ctr']; end ['R0','R4','R10','CR0','CTR'];
{ {
$Log$ $Log$
Revision 1.4 2001-09-27 15:30:29 jonas 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
Revision 1.4 2001/09/27 15:30:29 jonas
* conversion to compilerproc and to structure used by i386 rtl * conversion to compilerproc and to structure used by i386 rtl
* some bugfixes * some bugfixes
* powerpc.inc is almost complete (only fillchar/word/dword, get_frame etc * powerpc.inc is almost complete (only fillchar/word/dword, get_frame etc

View File

@ -30,11 +30,15 @@ LStrLenLoop:
bne LStrLenLoop bne LStrLenLoop
sub r3,r29,r3 sub r3,r29,r3
LStrLenDone: LStrLenDone:
end ['r3','r4','r29','r30','cr0']; end ['R3','R4','R29','R30','CR0'];
{ {
$Log$ $Log$
Revision 1.1 2001-09-27 15:30:29 jonas Revision 1.2 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
Revision 1.1 2001/09/27 15:30:29 jonas
* conversion to compilerproc and to structure used by i386 rtl * conversion to compilerproc and to structure used by i386 rtl
* some bugfixes * some bugfixes
* powerpc.inc is almost complete (only fillchar/word/dword, get_frame etc * powerpc.inc is almost complete (only fillchar/word/dword, get_frame etc

View File

@ -46,11 +46,15 @@ LStrPasLoop:
{ store length } { store length }
stb r10,0(r3) stb r10,0(r3)
end ['r0','r3','r4','r10','cr0','ctr']; end ['R0','R3','R4','R10','CR0','CTR'];
{ {
$Log$ $Log$
Revision 1.2 2001-09-28 13:23:44 jonas Revision 1.3 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
Revision 1.2 2001/09/28 13:23:44 jonas
* small optimization * small optimization
Revision 1.1 2001/09/27 15:30:29 jonas Revision 1.1 2001/09/27 15:30:29 jonas