* Optimize syscalls for arm-linux.

git-svn-id: trunk@8191 -
This commit is contained in:
yury 2007-07-29 15:57:15 +00:00
parent 27db4ec55a
commit 4b8777eb5a

View File

@ -22,272 +22,79 @@
--- Main:The System Call Self ---
*****************************************************************************}
function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
Perform syscall and set errno variable if needed.
}
var
_r4 : dword;
asm
str r4,_r4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
end ['r4'];
swi #0x900071
cmn r0,#126
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
var
_r4 : dword;
asm
str r4,_r4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
end ['r4'];
b FPC_SYSCALL
end;
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
var
_r4 : dword;
asm
str r4,_r4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
end ['r4'];
b FPC_SYSCALL
end;
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
var
_r4 : dword;
asm
str r4,_r4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
end ['r4'];
b FPC_SYSCALL
end;
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
var
_r4 : dword;
asm
str r4,_r4
ldr r4,param4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
bl FPC_SYSCALL
end ['r4'];
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
var
_r4,_r5 : dword;
asm
str r4,_r4
str r5,_r5
ldr r5,param5
ldr r4,param4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
ldr r5,_r5
ldr r5,param5
bl FPC_SYSCALL
end ['r4','r5'];
function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
var
_r4,_r5,_r6 : dword;
asm
str r4,_r4
str r5,_r5
str r6,_r6
ldr r6,param6
ldr r5,param5
ldr r4,param4
swi #0x900071
cmn r0,#126
bls .LDone
rsb r4,r0,#0
ldr r2,.Lthread_var
ldr r2,[r2]
ldr r0,.LErrno
cmp r2,#0
bne .LThread
str r4,[r0,#4]
mvn r0,#0
b .LDone
.LThread:
ldr r0,[r0]
mov lr,pc
mov pc,r2
str r4,[r0]
mvn r0,#0
b .LDone
.LErrno:
.word Errno
.Lthread_var:
.word fpc_threadvar_relocate_proc
.LDone:
ldr r4,_r4
ldr r5,_r5
ldr r6,_r6
ldr r5,param5
ldr r6,param6
bl FPC_SYSCALL
end ['r4','r5','r6'];