arm.inc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. asm
  17. rfs r0
  18. orr r0,r0,#0x1f0000
  19. wfs r0
  20. end;
  21. end;
  22. {****************************************************************************
  23. stack frame related stuff
  24. ****************************************************************************}
  25. {$define FPC_SYSTEM_HAS_GET_FRAME}
  26. function get_frame:pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  27. asm
  28. mov r0,r11
  29. end ['R0'];
  30. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  31. function get_caller_addr(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  32. asm
  33. movs r0,r0
  34. beq .Lg_a_null
  35. ldr r0,[r0,#-4]
  36. .Lg_a_null:
  37. end ['R0'];
  38. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  39. function get_caller_frame(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  40. asm
  41. movs r0,r0
  42. beq .Lgnf_null
  43. ldr r0,[r0,#-12]
  44. .Lgnf_null:
  45. end ['R0'];
  46. {$define FPC_SYSTEM_HAS_SPTR}
  47. Function Sptr : pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
  48. asm
  49. mov r0,sp
  50. end ['R0'];
  51. {
  52. {$define FPC_SYSTEM_HAS_FILLCHAR}
  53. Procedure FillChar(var x;count:longint;value:byte);assembler;
  54. * void *memset (dstpp, c, len) */
  55. asm
  56. mov a4, a1
  57. cmp a2, $8 // at least 8 bytes to do?
  58. blt .Fillchar2
  59. orr a3, a3, a3, lsl $8
  60. orr a3, a3, a3, lsl $16
  61. .Fillchar0:
  62. tst a4, $3 // aligned yet?
  63. strneb a3, [a4], $1
  64. subne a2, a2, $1
  65. bne .Fillchar0
  66. mov ip, a3
  67. .Fillchar1:
  68. cmp a2, $8 // 8 bytes still to do?
  69. blt .Fillchar2
  70. stmia a4!, {a3, ip}
  71. sub a2, a2, $8
  72. cmp a2, $8 // 8 bytes still to do?
  73. blt .Fillchar2
  74. stmia a4!, {a3, ip}
  75. sub a2, a2, $8
  76. cmp a2, $8 // 8 bytes still to do?
  77. blt .Fillchar2
  78. stmia a4!, {a3, ip}
  79. sub a2, a2, $8
  80. cmp a2, $8 // 8 bytes still to do?
  81. stmgeia a4!, {a3, ip}
  82. subge a2, a2, $8
  83. bge .Fillchar1
  84. .Fillchar2:
  85. movs a2, a2 // anything left?
  86. RETINSTR(moveq,pc,lr) // nope
  87. rsb a2, a2, $7
  88. add pc, pc, a2, lsl $2
  89. mov r0, r0
  90. strb a3, [a4], $1
  91. strb a3, [a4], $1
  92. strb a3, [a4], $1
  93. strb a3, [a4], $1
  94. strb a3, [a4], $1
  95. strb a3, [a4], $1
  96. strb a3, [a4], $1
  97. RETINSTR(mov,pc,lr)
  98. end;
  99. }
  100. {
  101. $Log$
  102. Revision 1.7 2004-03-23 21:03:10 florian
  103. + assembler implementation of fpc_mul_qword
  104. * fpu exceptions are now generated
  105. Revision 1.6 2004/03/14 21:45:11 florian
  106. * draft for qword mul
  107. Revision 1.5 2004/01/21 23:12:07 florian
  108. + get_caller_addr/frame implemented
  109. Revision 1.4 2004/01/20 21:01:57 florian
  110. * fixed setjump
  111. * fixed syscalls
  112. Revision 1.3 2003/11/21 00:40:06 florian
  113. * some arm issues fixed
  114. Revision 1.2 2003/09/03 14:09:37 florian
  115. * arm fixes to the common rtl code
  116. * some generic math code fixed
  117. * ...
  118. Revision 1.1 2003/08/21 16:41:54 florian
  119. * empty dummy files
  120. + [long|set]jmp implemented
  121. }