arm.inc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2003 by the Free Pascal development team.
  5. Processor dependent implementation for the system unit for
  6. ARM
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. {$asmmode gas}
  14. procedure fpc_cpuinit;
  15. begin
  16. end;
  17. {****************************************************************************
  18. stack frame related stuff
  19. ****************************************************************************}
  20. {$define FPC_SYSTEM_HAS_GET_FRAME}
  21. function get_frame:pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  22. asm
  23. mov r0,r11
  24. end ['R0'];
  25. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  26. function get_caller_addr(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  27. asm
  28. movs r0,r0
  29. beq .Lg_a_null
  30. ldr r0,[r0,#-4]
  31. .Lg_a_null:
  32. end ['R0'];
  33. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  34. function get_caller_frame(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  35. asm
  36. movs r0,r0
  37. beq .Lgnf_null
  38. ldr r0,[r0,#-12]
  39. .Lgnf_null:
  40. end ['R0'];
  41. {$define FPC_SYSTEM_HAS_SPTR}
  42. Function Sptr : pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  43. asm
  44. mov r0,sp
  45. end ['R0'];
  46. {
  47. {$define FPC_SYSTEM_HAS_FILLCHAR}
  48. Procedure FillChar(var x;count:longint;value:byte);assembler;
  49. * void *memset (dstpp, c, len) */
  50. asm
  51. mov a4, a1
  52. cmp a2, $8 // at least 8 bytes to do?
  53. blt .Fillchar2
  54. orr a3, a3, a3, lsl $8
  55. orr a3, a3, a3, lsl $16
  56. .Fillchar0:
  57. tst a4, $3 // aligned yet?
  58. strneb a3, [a4], $1
  59. subne a2, a2, $1
  60. bne .Fillchar0
  61. mov ip, a3
  62. .Fillchar1:
  63. cmp a2, $8 // 8 bytes still to do?
  64. blt .Fillchar2
  65. stmia a4!, {a3, ip}
  66. sub a2, a2, $8
  67. cmp a2, $8 // 8 bytes still to do?
  68. blt .Fillchar2
  69. stmia a4!, {a3, ip}
  70. sub a2, a2, $8
  71. cmp a2, $8 // 8 bytes still to do?
  72. blt .Fillchar2
  73. stmia a4!, {a3, ip}
  74. sub a2, a2, $8
  75. cmp a2, $8 // 8 bytes still to do?
  76. stmgeia a4!, {a3, ip}
  77. subge a2, a2, $8
  78. bge .Fillchar1
  79. .Fillchar2:
  80. movs a2, a2 // anything left?
  81. RETINSTR(moveq,pc,lr) // nope
  82. rsb a2, a2, $7
  83. add pc, pc, a2, lsl $2
  84. mov r0, r0
  85. strb a3, [a4], $1
  86. strb a3, [a4], $1
  87. strb a3, [a4], $1
  88. strb a3, [a4], $1
  89. strb a3, [a4], $1
  90. strb a3, [a4], $1
  91. strb a3, [a4], $1
  92. RETINSTR(mov,pc,lr)
  93. end;
  94. }
  95. {
  96. $Log$
  97. Revision 1.5 2004-01-21 23:12:07 florian
  98. + get_caller_addr/frame implemented
  99. Revision 1.4 2004/01/20 21:01:57 florian
  100. * fixed setjump
  101. * fixed syscalls
  102. Revision 1.3 2003/11/21 00:40:06 florian
  103. * some arm issues fixed
  104. Revision 1.2 2003/09/03 14:09:37 florian
  105. * arm fixes to the common rtl code
  106. * some generic math code fixed
  107. * ...
  108. Revision 1.1 2003/08/21 16:41:54 florian
  109. * empty dummy files
  110. + [long|set]jmp implemented
  111. }